-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathsolanaBankTransfer.js
More file actions
90 lines (80 loc) · 2.59 KB
/
Copy pathsolanaBankTransfer.js
File metadata and controls
90 lines (80 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Signing a `SolanaBankTransferAuthorizationRequest`, the authorization request
// you get when paying in SOL.
//
// This example starts from a Solana private key you already hold. See
// solanaKeyPair.js for how to derive that key pair from the Sorare private key
// exported from your wallet.
const {
createKeyPairFromBytes,
createSignerFromKeyPair,
createSignableMessage,
getBase58Encoder,
getBase58Decoder,
} = require('@solana/kit');
const privateKey =
'4GRjpWvrbUcLRbhrBnTYdfcuJbkxoHprF1yTPhjyHWgMAo7H34pEuDeB1TYw1QdGHgQnKs8MRadRdfiU5GDNtELq';
const solanaBankTransferAuthorizationRequest = {
__typename: 'AuthorizationRequest',
fingerprint: '75c29086c8535042f74030ceef7be72d',
id: 'TokenService::Core::SolanaBankTransferAuthorization:d25f2cfc-bb1e-40ca-b72c-76d3d04c7135',
request: {
__typename: 'SolanaBankTransferAuthorizationRequest',
authority: 'C2C7r9XqyTUTQEgeEtuyxsjdTRQ88Hn5sFRdTzmhmPTz',
amount: '25000000',
programAddress: '8JbCYE7Zobe45cbbHZYKF87bbJQ54oCowuAbB9QzSUxh',
expirationTimestamp: 1763476014,
feeAmount: '0',
nonce: '2',
originator: 'Dv8A8XKBz5QARFKZ5Kewdk8myCDcne9wiD7ULTanHKU',
receiverAddress: '2kW2HNBKLtvexM8mTX4r5UqT1Hsn1k5XTvYxq9LfzD1g',
senderAddress: '8ixw6XQW2tuZhc1xgbhh6bq6YvL5K5nXLsN9LjrzMrxq',
},
};
const {
authority,
amount,
programAddress,
expirationTimestamp,
feeAmount,
nonce,
originator,
receiverAddress,
senderAddress,
} = solanaBankTransferAuthorizationRequest.request;
const message = [
'TRANSFER_SOL',
programAddress,
authority,
senderAddress,
receiverAddress,
amount,
feeAmount,
nonce,
expirationTimestamp,
'0x',
originator,
].join(':');
const textEncoder = new TextEncoder();
const messageBytes = textEncoder.encode(message);
async function signRequest() {
const secretKeyBytes = getBase58Encoder().encode(privateKey)
const keyPair = await createKeyPairFromBytes(secretKeyBytes)
const signer = await createSignerFromKeyPair(
keyPair
);
const messageHash = await crypto.subtle.digest('SHA-256', messageBytes);
const mess = createSignableMessage(new Uint8Array(messageHash));
const [ret] = await signer.signMessages([mess]);
const signature = getBase58Decoder().decode(ret['8ixw6XQW2tuZhc1xgbhh6bq6YvL5K5nXLsN9LjrzMrxq']);
const approval = {
fingerprint: solanaBankTransferAuthorizationRequest.fingerprint,
solanaBankTransferApproval: {
signature,
expirationTimestamp,
nonce,
},
};
console.log(approval);
}
// expected signature: 4dEdXR9D5Pp6QEdQX5uHRYPouWUqZPmRUoSsTjgxXt2FuzN4X5NsvTNAEDoofjgWshg4jisDaxhFEpy5Q97EsLxA
signRequest();