-
Notifications
You must be signed in to change notification settings - Fork 146
/
Copy pathtransfer.ts
79 lines (71 loc) · 2.57 KB
/
transfer.ts
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
import { PublicKey, sendAndConfirmRawTransaction, Transaction } from '@solana/web3.js';
import type { NextApiRequest, NextApiResponse } from 'next';
import base58 from 'bs58';
import { signWithTokenFee, core } from '@solana/octane-core';
import {
cache,
connection,
ENV_SECRET_KEYPAIR,
cors,
rateLimit,
isReturnedSignatureAllowed,
ReturnSignatureConfigField,
} from '../../src';
import config from '../../../../config.json';
// Endpoint to pay for transactions with an SPL token transfer
export default async function (request: NextApiRequest, response: NextApiResponse) {
await cors(request, response);
await rateLimit(request, response);
// Deserialize a base58 wire-encoded transaction from the request
const serialized = request.body?.transaction;
if (typeof serialized !== 'string') {
response.status(400).send({ status: 'error', message: 'request should contain transaction' });
return;
}
let transaction: Transaction;
try {
transaction = Transaction.from(base58.decode(serialized));
} catch (e) {
response.status(400).send({ status: 'error', message: "can't decode transaction" });
return;
}
try {
const { signature } = await signWithTokenFee(
connection,
transaction,
ENV_SECRET_KEYPAIR,
config.maxSignatures,
config.lamportsPerSignature,
config.endpoints.transfer.tokens.map((token) => core.TokenFee.fromSerializable(token)),
cache
);
if (config.returnSignature !== undefined) {
if (!await isReturnedSignatureAllowed(
request,
config.returnSignature as ReturnSignatureConfigField
)) {
response.status(400).send({ status: 'error', message: 'anti-spam check failed' });
return;
}
response.status(200).send({ status: 'ok', signature });
return;
}
transaction.addSignature(
ENV_SECRET_KEYPAIR.publicKey,
Buffer.from(base58.decode(signature))
);
await sendAndConfirmRawTransaction(
connection,
transaction.serialize(),
{commitment: 'confirmed'}
);
// Respond with the confirmed transaction signature
response.status(200).send({ status: 'ok', signature });
} catch (error) {
let message = '';
if (error instanceof Error) {
message = error.message;
}
response.status(400).send({ status: 'error', message });
}
}