/
actions.ts
160 lines (149 loc) · 5.62 KB
/
actions.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import type { ConfirmOptions, Connection, PublicKey, Signer, TransactionSignature } from '@solana/web3.js';
import { sendAndConfirmTransaction, Transaction } from '@solana/web3.js';
import { getSigners } from '../../actions/internal.js';
import { TOKEN_2022_PROGRAM_ID } from '../../constants.js';
import {
createHarvestWithheldTokensToMintInstruction,
createTransferCheckedWithFeeInstruction,
createWithdrawWithheldTokensFromAccountsInstruction,
createWithdrawWithheldTokensFromMintInstruction,
} from './instructions.js';
/**
* Transfer tokens from one account to another, asserting the transfer fee, token mint, and decimals
*
* @param connection Connection to use
* @param payer Payer of the transaction fees
* @param source Source account
* @param mint Mint for the account
* @param destination Destination account
* @param owner Owner of the source account
* @param amount Number of tokens to transfer
* @param decimals Number of decimals in transfer amount
* @param multiSigners Signing accounts if `owner` is a multisig
* @param confirmOptions Options for confirming the transaction
* @param programId SPL Token program account
*
* @return Signature of the confirmed transaction
*/
export async function transferCheckedWithFee(
connection: Connection,
payer: Signer,
source: PublicKey,
mint: PublicKey,
destination: PublicKey,
owner: Signer | PublicKey,
amount: bigint,
decimals: number,
fee: bigint,
multiSigners: Signer[] = [],
confirmOptions?: ConfirmOptions,
programId = TOKEN_2022_PROGRAM_ID
): Promise<TransactionSignature> {
const [ownerPublicKey, signers] = getSigners(owner, multiSigners);
const transaction = new Transaction().add(
createTransferCheckedWithFeeInstruction(
source,
mint,
destination,
ownerPublicKey,
amount,
decimals,
fee,
multiSigners,
programId
)
);
return await sendAndConfirmTransaction(connection, transaction, [payer, ...signers], confirmOptions);
}
/**
* Withdraw withheld tokens from mint
*
* @param connection Connection to use
* @param payer Payer of the transaction fees
* @param mint The token mint
* @param destination The destination account
* @param authority The mint's withdraw withheld tokens authority
* @param multiSigners Signing accounts if `owner` is a multisig
* @param confirmOptions Options for confirming the transaction
* @param programId SPL Token program account
*
* @return Signature of the confirmed transaction
*/
export async function withdrawWithheldTokensFromMint(
connection: Connection,
payer: Signer,
mint: PublicKey,
destination: PublicKey,
authority: Signer | PublicKey,
multiSigners: Signer[] = [],
confirmOptions?: ConfirmOptions,
programId = TOKEN_2022_PROGRAM_ID
): Promise<TransactionSignature> {
const [authorityPublicKey, signers] = getSigners(authority, multiSigners);
const transaction = new Transaction().add(
createWithdrawWithheldTokensFromMintInstruction(mint, destination, authorityPublicKey, signers, programId)
);
return await sendAndConfirmTransaction(connection, transaction, [payer, ...signers], confirmOptions);
}
/**
* Withdraw withheld tokens from accounts
*
* @param connection Connection to use
* @param payer Payer of the transaction fees
* @param mint The token mint
* @param destination The destination account
* @param authority The mint's withdraw withheld tokens authority
* @param multiSigners Signing accounts if `owner` is a multisig
* @param sources Source accounts from which to withdraw withheld fees
* @param confirmOptions Options for confirming the transaction
* @param programId SPL Token program account
*
* @return Signature of the confirmed transaction
*/
export async function withdrawWithheldTokensFromAccounts(
connection: Connection,
payer: Signer,
mint: PublicKey,
destination: PublicKey,
authority: Signer | PublicKey,
multiSigners: Signer[],
sources: PublicKey[],
confirmOptions?: ConfirmOptions,
programId = TOKEN_2022_PROGRAM_ID
): Promise<TransactionSignature> {
const [authorityPublicKey, signers] = getSigners(authority, multiSigners);
const transaction = new Transaction().add(
createWithdrawWithheldTokensFromAccountsInstruction(
mint,
destination,
authorityPublicKey,
signers,
sources,
programId
)
);
return await sendAndConfirmTransaction(connection, transaction, [payer, ...signers], confirmOptions);
}
/**
* Harvest withheld tokens from accounts to the mint
*
* @param connection Connection to use
* @param payer Payer of the transaction fees
* @param mint The token mint
* @param sources Source accounts from which to withdraw withheld fees
* @param confirmOptions Options for confirming the transaction
* @param programId SPL Token program account
*
* @return Signature of the confirmed transaction
*/
export async function harvestWithheldTokensToMint(
connection: Connection,
payer: Signer,
mint: PublicKey,
sources: PublicKey[],
confirmOptions?: ConfirmOptions,
programId = TOKEN_2022_PROGRAM_ID
): Promise<TransactionSignature> {
const transaction = new Transaction().add(createHarvestWithheldTokensToMintInstruction(mint, sources, programId));
return await sendAndConfirmTransaction(connection, transaction, [payer], confirmOptions);
}