@w3lib/solana-batch-call 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +132 -2
  3. package/dist/client.d.ts +4 -0
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +8 -0
  6. package/dist/client.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/layout.d.ts +5 -0
  12. package/dist/layout.d.ts.map +1 -1
  13. package/dist/layout.js +16 -0
  14. package/dist/layout.js.map +1 -1
  15. package/dist/lp.d.ts +123 -0
  16. package/dist/lp.d.ts.map +1 -0
  17. package/dist/lp.js +631 -0
  18. package/dist/lp.js.map +1 -0
  19. package/dist/lpMath.d.ts +37 -0
  20. package/dist/lpMath.d.ts.map +1 -0
  21. package/dist/lpMath.js +176 -0
  22. package/dist/lpMath.js.map +1 -0
  23. package/dist/shortcuts.d.ts +8 -0
  24. package/dist/shortcuts.d.ts.map +1 -1
  25. package/dist/shortcuts.js +1 -1
  26. package/dist/shortcuts.js.map +1 -1
  27. package/dist/subpaths/lp.d.ts +31 -0
  28. package/dist/subpaths/lp.d.ts.map +1 -0
  29. package/dist/subpaths/lp.js +33 -0
  30. package/dist/subpaths/lp.js.map +1 -0
  31. package/dist/subpaths/write.d.ts +22 -0
  32. package/dist/subpaths/write.d.ts.map +1 -0
  33. package/dist/subpaths/write.js +19 -0
  34. package/dist/subpaths/write.js.map +1 -0
  35. package/dist/write/batch.d.ts +41 -0
  36. package/dist/write/batch.d.ts.map +1 -0
  37. package/dist/write/batch.js +46 -0
  38. package/dist/write/batch.js.map +1 -0
  39. package/dist/write/collect.d.ts +50 -0
  40. package/dist/write/collect.d.ts.map +1 -0
  41. package/dist/write/collect.js +220 -0
  42. package/dist/write/collect.js.map +1 -0
  43. package/dist/write/instructions.d.ts +16 -0
  44. package/dist/write/instructions.d.ts.map +1 -0
  45. package/dist/write/instructions.js +89 -0
  46. package/dist/write/instructions.js.map +1 -0
  47. package/dist/write/send.d.ts +115 -0
  48. package/dist/write/send.d.ts.map +1 -0
  49. package/dist/write/send.js +720 -0
  50. package/dist/write/send.js.map +1 -0
  51. package/dist/write/signer.d.ts +94 -0
  52. package/dist/write/signer.d.ts.map +1 -0
  53. package/dist/write/signer.js +197 -0
  54. package/dist/write/signer.js.map +1 -0
  55. package/dist/write/transaction.d.ts +75 -0
  56. package/dist/write/transaction.d.ts.map +1 -0
  57. package/dist/write/transaction.js +133 -0
  58. package/dist/write/transaction.js.map +1 -0
  59. package/dist/write/transfer.d.ts +72 -0
  60. package/dist/write/transfer.d.ts.map +1 -0
  61. package/dist/write/transfer.js +127 -0
  62. package/dist/write/transfer.js.map +1 -0
  63. package/package.json +23 -12
  64. package/src/client.ts +10 -0
  65. package/src/index.ts +1 -0
  66. package/src/layout.ts +17 -0
  67. package/src/lp.ts +849 -0
  68. package/src/lpMath.ts +205 -0
  69. package/src/shortcuts.ts +1 -1
  70. package/src/subpaths/lp.ts +62 -0
  71. package/src/subpaths/write.ts +29 -0
  72. package/src/write/batch.ts +78 -0
  73. package/src/write/collect.ts +286 -0
  74. package/src/write/instructions.ts +98 -0
  75. package/src/write/send.ts +876 -0
  76. package/src/write/signer.ts +314 -0
  77. package/src/write/transaction.ts +181 -0
  78. package/src/write/transfer.ts +189 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/write/batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { SolanaClient } from '../client.js';
2
+ import { type SendOptions, type WriteResult } from './send.js';
3
+ import { type SignerInput } from './signer.js';
4
+ export interface BatchCollectOptions extends SendOptions {
5
+ /**
6
+ * 要归集的代币 mint。包含原生 SOL(NATIVE_MINT)时,在代币归集确认后把剩余 SOL 全部转走:
7
+ * 传了 feePayer 时整个余额转走(手续费由 feePayer 付),否则扣掉这笔的手续费后转走,钱包余额归零
8
+ */
9
+ tokens: readonly string[];
10
+ /**
11
+ * 代币转完后关闭钱包的代币账户(ATA),租金(约 0.00204 SOL / 个)退回钱包本身;同时扫 SOL 时一并转走。默认 false。
12
+ * Token-2022 账户里有未提取的转账手续费等情况关不掉,只影响 close 那一项
13
+ */
14
+ closeAccounts?: boolean;
15
+ /** 各代币的最小归集数量(最小单位),余额低于它的不归集:`{ [USDC]: 1_000_000n }`;对 SOL 同样有效 */
16
+ minAmount?: Readonly<Record<string, bigint | number | string>>;
17
+ /** 每笔交易最多几个调用,默认不限(按交易大小) */
18
+ batchSize?: number;
19
+ }
20
+ /** 单个钱包单个代币的归集结果;from 是钱包,to 是归集地址 */
21
+ export interface CollectItemResult extends WriteResult {
22
+ to: string;
23
+ token: string;
24
+ native: boolean;
25
+ /** 归集的数量(最小单位);SOL 扫尾在发送前为 '0' */
26
+ amount: string;
27
+ formatted: string | null;
28
+ /** closeAccounts 时关闭代币账户的结果;没有关闭(未开启、SOL、没有归集)时为 null */
29
+ close: WriteResult | null;
30
+ }
31
+ export interface CollectResult {
32
+ /** 按 wallets × tokens 顺序(第 i 个钱包第 j 个代币在 i × tokens.length + j) */
33
+ results: CollectItemResult[];
34
+ }
35
+ /**
36
+ * 归集:多个钱包的代币 / SOL 转到同一个地址。
37
+ *
38
+ * ```ts
39
+ * const { results } = await batchCollect(client, [key1, key2, key3], hotWallet, {
40
+ * tokens: [USDC, NATIVE_MINT], // 包含 SOL 表示代币归集完后扫空 SOL
41
+ * feePayer: gasKey, // 手续费都由 gasKey 付:子钱包不需要有 SOL,多个钱包的转账打包进同一笔交易
42
+ * })
43
+ * ```
44
+ *
45
+ * 流程:一次读出所有钱包的余额 → 归集地址没有该代币的 ATA 时随第一批转账创建 → 打包发送代币转账(可选关闭代币账户)
46
+ * →(包含 SOL 时)等代币归集确认,按最新余额扫空 SOL。
47
+ * 不传 feePayer 时每个钱包自己付手续费,没有 SOL 的钱包对应的项失败(Solana 上不需要先补 gas:传 feePayer 即可)
48
+ */
49
+ export declare function batchCollect(client: SolanaClient, wallets: readonly SignerInput[], to: string, options: BatchCollectOptions): Promise<CollectResult>;
50
+ //# sourceMappingURL=collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/write/collect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,OAAO,EAA0E,KAAK,WAAW,EAA6B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AACjK,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAMlF,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD;;;OAGG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,yDAAyD;IACzD,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqM1J"}
@@ -0,0 +1,220 @@
1
+ import { getAssociatedTokenAddress, isAddress } from '../address.js';
2
+ import { formatUnits } from '../layout.js';
3
+ import { closeAccount, createAssociatedTokenAccountIdempotent, systemTransfer } from './instructions.js';
4
+ import { emptyOutcome, priorityFeeFor, sendUnits, toWriteResult, transactionFee } from './send.js';
5
+ import { resolveSigner } from './signer.js';
6
+ import { transferInstructions } from './transfer.js';
7
+ /** 扫空 SOL 的交易(一条 System 转账 + 两条计算预算指令)用的计算单元上限 */
8
+ const SWEEP_COMPUTE_UNITS = 1_000;
9
+ /**
10
+ * 归集:多个钱包的代币 / SOL 转到同一个地址。
11
+ *
12
+ * ```ts
13
+ * const { results } = await batchCollect(client, [key1, key2, key3], hotWallet, {
14
+ * tokens: [USDC, NATIVE_MINT], // 包含 SOL 表示代币归集完后扫空 SOL
15
+ * feePayer: gasKey, // 手续费都由 gasKey 付:子钱包不需要有 SOL,多个钱包的转账打包进同一笔交易
16
+ * })
17
+ * ```
18
+ *
19
+ * 流程:一次读出所有钱包的余额 → 归集地址没有该代币的 ATA 时随第一批转账创建 → 打包发送代币转账(可选关闭代币账户)
20
+ * →(包含 SOL 时)等代币归集确认,按最新余额扫空 SOL。
21
+ * 不传 feePayer 时每个钱包自己付手续费,没有 SOL 的钱包对应的项失败(Solana 上不需要先补 gas:传 feePayer 即可)
22
+ */
23
+ export async function batchCollect(client, wallets, to, options) {
24
+ if (!isAddress(to)) {
25
+ throw new Error(`Invalid collect address: ${to}`);
26
+ }
27
+ const cache = new Map();
28
+ const signers = await Promise.all(wallets.map((w) => resolveSigner(w, cache)));
29
+ const feePayer = options.feePayer === undefined ? null : await resolveSigner(options.feePayer, cache);
30
+ const tokens = options.tokens;
31
+ const sweep = tokens.some((t) => client.isNativeMint(t));
32
+ const minAmount = new Map(Object.entries(options.minAmount ?? {}).map(([k, v]) => [k, BigInt(v)]));
33
+ const balances = await client.multiBalances(signers.map((s) => ({ owner: s.address, mints: tokens })), { signal: options.signal });
34
+ const items = [];
35
+ const seen = new Set();
36
+ signers.forEach((signer, w) => {
37
+ const duplicate = seen.has(signer.address);
38
+ seen.add(signer.address);
39
+ tokens.forEach((token, t) => {
40
+ const balance = balances[w]?.[t];
41
+ const native = client.isNativeMint(token);
42
+ const item = {
43
+ index: w * tokens.length + t,
44
+ signer,
45
+ token,
46
+ native,
47
+ amount: native || !balance.success ? 0n : BigInt(balance.balance),
48
+ decimals: balance.success ? balance.decimals : null,
49
+ tokenProgram: balance.tokenProgram,
50
+ result: null,
51
+ };
52
+ const skip = !balance.success
53
+ ? `cannot read balance: ${balance.error ?? 'unknown error'}`
54
+ : signer.address === to
55
+ ? 'skipped: wallet is the collect address'
56
+ : duplicate
57
+ ? 'skipped: duplicate wallet'
58
+ : native && feePayer?.address === signer.address
59
+ ? 'skipped: wallet is the fee payer'
60
+ : !native && item.amount === 0n
61
+ ? 'skipped: zero balance'
62
+ : !native && item.amount < (minAmount.get(token) ?? 0n)
63
+ ? 'skipped: below minAmount'
64
+ : null;
65
+ item.result = toCollectResult(item, to, emptyOutcome(skip ? (balance.success ? 'skipped' : 'failed') : 'skipped', skip), null);
66
+ items.push(item);
67
+ });
68
+ });
69
+ const results = items.map((i) => i.result);
70
+ const report = (item, outcome, close = item.result.close) => {
71
+ const hint = !feePayer && outcome.status === 'failed' && /transaction fee|fee payer/.test(outcome.error ?? '') && !outcome.error?.includes('feePayer')
72
+ ? ' (pass feePayer to pay fees from another wallet)'
73
+ : '';
74
+ item.result = toCollectResult(item, to, { ...outcome, error: outcome.error && outcome.error + hint }, close);
75
+ results[item.index] = item.result;
76
+ options.onUpdate?.(item.result);
77
+ };
78
+ const active = (item) => item.result.error === null;
79
+ // 归集地址的 ATA:没有的话随转账创建(创建指令是幂等的,同一代币的多笔转账都带上,只有第一笔真正创建)
80
+ const tokenItems = items.filter((i) => !i.native && active(i));
81
+ const targetAtas = new Map(tokenItems.map((i) => [i.token, getAssociatedTokenAddress(to, i.token, i.tokenProgram)]));
82
+ const missing = new Set();
83
+ if (targetAtas.size) {
84
+ const keys = [...targetAtas.values()];
85
+ const accounts = await client.accounts(keys, { signal: options.signal });
86
+ keys.forEach((k, i) => !accounts[i] && missing.add(k));
87
+ }
88
+ // 不传 feePayer 时每个钱包自己付费:如果每笔转账都带创建指令,模拟时每个钱包都要付得起租金(实际只创建一次)。
89
+ // 先由第一个有这种代币的钱包单独创建,确认后再归集;创建失败时退回到每笔都带创建指令
90
+ if (!feePayer && missing.size && !options.dryRun) {
91
+ const setup = [];
92
+ for (const [mint, ata] of targetAtas) {
93
+ if (!missing.has(ata))
94
+ continue;
95
+ const first = tokenItems.find((i) => i.token === mint);
96
+ setup.push({
97
+ instructions: [createAssociatedTokenAccountIdempotent(first.signer.address, ata, to, mint, first.tokenProgram)],
98
+ payer: first.signer,
99
+ signers: [],
100
+ continueOnError: true,
101
+ onUpdate: (outcome) => outcome.status === 'confirmed' && missing.delete(ata),
102
+ });
103
+ }
104
+ await sendUnits(client, setup, { ...options, wait: true }, { batchSize: 1 });
105
+ }
106
+ const units = [];
107
+ /** 每个钱包最后一笔上链交易的 slot(扫 SOL 时按不早于它的状态读余额) */
108
+ let minSlot;
109
+ const track = (outcome) => {
110
+ if (outcome.slot !== null)
111
+ minSlot = Math.max(minSlot ?? 0, outcome.slot);
112
+ };
113
+ for (const item of tokenItems) {
114
+ const payer = feePayer ?? item.signer;
115
+ const signerList = payer.address === item.signer.address ? [] : [item.signer];
116
+ const target = targetAtas.get(item.token);
117
+ units.push({
118
+ instructions: transferInstructions(item.signer, payer, { ...item, to }, target, missing.has(target)),
119
+ payer,
120
+ signers: signerList,
121
+ continueOnError: true,
122
+ onUpdate: (outcome) => {
123
+ track(outcome);
124
+ report(item, outcome);
125
+ },
126
+ });
127
+ if (options.closeAccounts) {
128
+ const program = item.tokenProgram;
129
+ const account = getAssociatedTokenAddress(item.signer.address, item.token, program);
130
+ units.push({
131
+ instructions: [closeAccount(account, item.signer.address, item.signer.address, program)],
132
+ payer,
133
+ signers: signerList,
134
+ continueOnError: true,
135
+ onUpdate: (outcome) => {
136
+ track(outcome);
137
+ report(item, outcomeOf(item.result), toWriteResult(item.index, item.signer.address, outcome));
138
+ },
139
+ });
140
+ }
141
+ }
142
+ // 要扫 SOL 时必须等代币归集确认(扫的是最新余额,关闭账户退回的租金也要算进去)
143
+ await sendUnits(client, units, sweep ? { ...options, wait: true } : options, { batchSize: options.batchSize });
144
+ if (!sweep) {
145
+ return { results };
146
+ }
147
+ // 代币没有全部归集成功的钱包不扫 SOL:留着付之后重新归集的手续费
148
+ items
149
+ .filter((i) => i.native && active(i))
150
+ .forEach((native) => {
151
+ // dryRun 时代币项是 simulated,也算成功
152
+ const done = (status) => status === 'confirmed' || status === 'skipped' || (options.dryRun && status === 'simulated');
153
+ const unfinished = items.find((i) => !i.native && i.signer.address === native.signer.address && !done(i.result.status));
154
+ if (unfinished) {
155
+ report(native, emptyOutcome('skipped', `skipped: collecting ${unfinished.token} did not succeed (${unfinished.result.status})`));
156
+ }
157
+ });
158
+ const sweepItems = items.filter((i) => i.native && active(i));
159
+ if (!sweepItems.length || options.signal?.aborted) {
160
+ return { results };
161
+ }
162
+ if (options.dryRun) {
163
+ // 代币归集没有真的执行,扫 SOL 的金额要等归集之后才知道:只标记 simulated,不做模拟
164
+ sweepItems.forEach((i) => report(i, emptyOutcome('simulated')));
165
+ return { results };
166
+ }
167
+ let lamports;
168
+ try {
169
+ lamports = await client.solBalances(sweepItems.map((i) => i.signer.address), { minContextSlot: minSlot, signal: options.signal });
170
+ }
171
+ catch (err) {
172
+ // 代币归集已经发出:不能整体抛错(调用方会拿不到这些结果),扫 SOL 的项标记失败
173
+ sweepItems.forEach((i) => report(i, emptyOutcome('failed', `cannot read SOL balance: ${err instanceof Error ? err.message : String(err)}`)));
174
+ return { results };
175
+ }
176
+ const prepared = await Promise.all(sweepItems.map(async (item, k) => {
177
+ const balance = BigInt(lamports[k]?.balance ?? '0');
178
+ let amount = balance;
179
+ let fixed;
180
+ if (!feePayer) {
181
+ // 自己付手续费:单独一笔、手续费事先算好,转走剩下的全部(余额归零,不受租金下限限制)
182
+ const price = await priorityFeeFor(client, options, [item.signer.address, to]);
183
+ fixed = { computeUnits: SWEEP_COMPUTE_UNITS, price };
184
+ amount = balance - transactionFee(1, SWEEP_COMPUTE_UNITS, price);
185
+ }
186
+ const min = minAmount.get(item.token) ?? 0n;
187
+ if (amount <= 0n || amount < min) {
188
+ report(item, emptyOutcome('skipped', amount <= 0n ? 'skipped: SOL balance does not cover the fee' : 'skipped: below minAmount'));
189
+ return null;
190
+ }
191
+ item.amount = amount;
192
+ const payer = feePayer ?? item.signer;
193
+ return {
194
+ instructions: [systemTransfer(item.signer.address, to, amount)],
195
+ payer,
196
+ signers: payer.address === item.signer.address ? [] : [item.signer],
197
+ fixed,
198
+ continueOnError: true,
199
+ onUpdate: (outcome) => report(item, outcome),
200
+ };
201
+ }));
202
+ await sendUnits(client, prepared.filter((u) => u !== null), options, { batchSize: options.batchSize });
203
+ return { results };
204
+ }
205
+ /** 结果转回交易结果(更新 close 字段时保留转账本身的状态) */
206
+ function outcomeOf(r) {
207
+ return { status: r.status, signature: r.signature, slot: r.slot, fee: r.fee === null ? null : BigInt(r.fee), computeUnits: r.computeUnits, error: r.error };
208
+ }
209
+ function toCollectResult(item, to, outcome, close) {
210
+ return {
211
+ ...toWriteResult(item.index, item.signer.address, outcome),
212
+ to,
213
+ token: item.token,
214
+ native: item.native,
215
+ amount: item.amount.toString(),
216
+ formatted: item.decimals === null ? null : formatUnits(item.amount, item.decimals),
217
+ close,
218
+ };
219
+ }
220
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/write/collect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Instruction } from './transaction.js';
2
+ export declare const COMPUTE_BUDGET_PROGRAM_ID = "ComputeBudget111111111111111111111111111111";
3
+ /** 单笔交易的计算单元上限 */
4
+ export declare const MAX_COMPUTE_UNITS = 1400000;
5
+ /** System Program Transfer:转 SOL */
6
+ export declare function systemTransfer(from: string, to: string, lamports: bigint): Instruction;
7
+ /** SPL Token / Token-2022 TransferChecked(校验 mint 和精度) */
8
+ export declare function transferChecked(source: string, mint: string, destination: string, owner: string, amount: bigint, decimals: number, tokenProgram: string): Instruction;
9
+ /** 创建关联代币账户(已存在时什么都不做),租金由 payer 付 */
10
+ export declare function createAssociatedTokenAccountIdempotent(payer: string, ata: string, owner: string, mint: string, tokenProgram: string): Instruction;
11
+ /** 关闭代币账户(余额必须为 0),租金退给 destination */
12
+ export declare function closeAccount(account: string, destination: string, owner: string, tokenProgram: string): Instruction;
13
+ export declare function setComputeUnitLimit(units: number): Instruction;
14
+ /** 优先费用:每个计算单元多付多少 micro-lamports */
15
+ export declare function setComputeUnitPrice(microLamports: bigint): Instruction;
16
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/write/instructions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,eAAO,MAAM,yBAAyB,gDAAgD,CAAA;AAEtF,kBAAkB;AAClB,eAAO,MAAM,iBAAiB,UAAY,CAAA;AAQ1C,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAYtF;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CAerK;AAED,sCAAsC;AACtC,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CAajJ;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CAUnH;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAS9D;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAStE"}
@@ -0,0 +1,89 @@
1
+ import { ASSOCIATED_TOKEN_PROGRAM_ID, SYSTEM_PROGRAM_ID } from '../constants.js';
2
+ export const COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111';
3
+ /** 单笔交易的计算单元上限 */
4
+ export const MAX_COMPUTE_UNITS = 1_400_000;
5
+ function bytes(size, write) {
6
+ const out = new Uint8Array(size);
7
+ write(new DataView(out.buffer));
8
+ return out;
9
+ }
10
+ /** System Program Transfer:转 SOL */
11
+ export function systemTransfer(from, to, lamports) {
12
+ return {
13
+ programId: SYSTEM_PROGRAM_ID,
14
+ keys: [
15
+ { pubkey: from, isSigner: true, isWritable: true },
16
+ { pubkey: to, isSigner: false, isWritable: true },
17
+ ],
18
+ data: bytes(12, (v) => {
19
+ v.setUint32(0, 2, true);
20
+ v.setBigUint64(4, lamports, true);
21
+ }),
22
+ };
23
+ }
24
+ /** SPL Token / Token-2022 TransferChecked(校验 mint 和精度) */
25
+ export function transferChecked(source, mint, destination, owner, amount, decimals, tokenProgram) {
26
+ return {
27
+ programId: tokenProgram,
28
+ keys: [
29
+ { pubkey: source, isSigner: false, isWritable: true },
30
+ { pubkey: mint, isSigner: false, isWritable: false },
31
+ { pubkey: destination, isSigner: false, isWritable: true },
32
+ { pubkey: owner, isSigner: true, isWritable: false },
33
+ ],
34
+ data: bytes(10, (v) => {
35
+ v.setUint8(0, 12);
36
+ v.setBigUint64(1, amount, true);
37
+ v.setUint8(9, decimals);
38
+ }),
39
+ };
40
+ }
41
+ /** 创建关联代币账户(已存在时什么都不做),租金由 payer 付 */
42
+ export function createAssociatedTokenAccountIdempotent(payer, ata, owner, mint, tokenProgram) {
43
+ return {
44
+ programId: ASSOCIATED_TOKEN_PROGRAM_ID,
45
+ keys: [
46
+ { pubkey: payer, isSigner: true, isWritable: true },
47
+ { pubkey: ata, isSigner: false, isWritable: true },
48
+ { pubkey: owner, isSigner: false, isWritable: false },
49
+ { pubkey: mint, isSigner: false, isWritable: false },
50
+ { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },
51
+ { pubkey: tokenProgram, isSigner: false, isWritable: false },
52
+ ],
53
+ data: new Uint8Array([1]),
54
+ };
55
+ }
56
+ /** 关闭代币账户(余额必须为 0),租金退给 destination */
57
+ export function closeAccount(account, destination, owner, tokenProgram) {
58
+ return {
59
+ programId: tokenProgram,
60
+ keys: [
61
+ { pubkey: account, isSigner: false, isWritable: true },
62
+ { pubkey: destination, isSigner: false, isWritable: true },
63
+ { pubkey: owner, isSigner: true, isWritable: false },
64
+ ],
65
+ data: new Uint8Array([9]),
66
+ };
67
+ }
68
+ export function setComputeUnitLimit(units) {
69
+ return {
70
+ programId: COMPUTE_BUDGET_PROGRAM_ID,
71
+ keys: [],
72
+ data: bytes(5, (v) => {
73
+ v.setUint8(0, 2);
74
+ v.setUint32(1, units, true);
75
+ }),
76
+ };
77
+ }
78
+ /** 优先费用:每个计算单元多付多少 micro-lamports */
79
+ export function setComputeUnitPrice(microLamports) {
80
+ return {
81
+ programId: COMPUTE_BUDGET_PROGRAM_ID,
82
+ keys: [],
83
+ data: bytes(9, (v) => {
84
+ v.setUint8(0, 3);
85
+ v.setBigUint64(1, microLamports, true);
86
+ }),
87
+ };
88
+ }
89
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/write/instructions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import type { SolanaClient } from '../client.js';
2
+ import type { ResolvedSigner, SignerInput } from './signer.js';
3
+ import { type Instruction } from './transaction.js';
4
+ /**
5
+ * 每个调用的状态:
6
+ * - confirmed:已上链且执行成功
7
+ * - reverted:已上链但执行失败(手续费已扣);同一笔交易里的其他调用也一起回滚,同样是 reverted
8
+ * - failed:没有发出去(模拟失败、SOL 不够付手续费、交易过期且重试次数用完等),不花手续费
9
+ * - sent:已广播,没等确认(wait: false,或等待中途取消)。广播时节点都连不上(交易可能已经发出)也算 sent,error 里有说明
10
+ * - pending:等到 timeout 还没确认,交易的 blockhash 过期前仍可能上链
11
+ * - skipped:没有执行:前面的调用失败(continueOnError 为 false 时)、已取消、余额为 0 等
12
+ * - simulated:dryRun 模拟通过
13
+ */
14
+ export type WriteStatus = 'confirmed' | 'reverted' | 'failed' | 'sent' | 'pending' | 'skipped' | 'simulated';
15
+ /** 发送参数(batchCall / batchTransfer / batchCollect 共用) */
16
+ export interface SendOptions {
17
+ /** 等待确认。默认 true;false 时广播后即返回,status 为 'sent'(不会在过期后重发) */
18
+ wait?: boolean;
19
+ /** 每笔交易等待确认的最长时间(毫秒),超时 status 为 'pending'。默认 120000 */
20
+ timeout?: number;
21
+ /** 查询确认状态的间隔(毫秒),默认 2000。等待期间每次都重发一次原交易(同一笔签名交易重复发送是安全的) */
22
+ pollInterval?: number;
23
+ /** 同时处理的手续费支付者数(同一支付者的交易按顺序发出,不等上一笔确认),默认 8 */
24
+ concurrency?: number;
25
+ /**
26
+ * 手续费支付者:所有交易的手续费(以及新建代币账户的租金)由它付,发送方的钱包不需要有 SOL。
27
+ * 不传时每个钱包自己付
28
+ */
29
+ feePayer?: SignerInput;
30
+ /**
31
+ * 优先费用(每个计算单元多少 micro-lamports),或 'auto'(默认):按 getRecentPrioritizationFees 里这笔交易可写账户的最近费用取 75 分位,
32
+ * 不超过 maxPriorityFee。计算单元上限按模拟结果设置(× 1.1 + 1000),优先费用 = 单价 × 上限
33
+ */
34
+ priorityFee?: number | bigint | 'auto';
35
+ /** 'auto' 时优先费用单价的上限(micro-lamports),默认 1000000 */
36
+ maxPriorityFee?: number | bigint;
37
+ /** 交易过期(blockhash 失效)仍未上链时,重新模拟、换新 blockhash 重发的次数。默认 2 */
38
+ retries?: number;
39
+ /** 等到什么确认级别,默认 'confirmed' */
40
+ commitment?: 'confirmed' | 'finalized';
41
+ /** 只模拟、不发送,status 为 'simulated' 或 'failed'。注意:依赖前一笔交易结果的调用模拟会失败 */
42
+ dryRun?: boolean;
43
+ /** 取消:不再发新交易,已发出的不再等待确认(status 为 'sent') */
44
+ signal?: AbortSignal;
45
+ /** 每个结果状态变化时回调,用于展示进度 */
46
+ onUpdate?: (result: WriteResult) => void;
47
+ }
48
+ /** 每个调用的结果,都是字符串 / 数字 / null,可以直接 JSON.stringify */
49
+ export interface WriteResult {
50
+ /** 在输入里的下标 */
51
+ index: number;
52
+ /** 发送的钱包地址 */
53
+ from: string;
54
+ status: WriteStatus;
55
+ /** 交易签名(同一笔交易里的多个调用相同) */
56
+ signature: string | null;
57
+ /** 上链的 slot */
58
+ slot: number | null;
59
+ /** 整笔交易的手续费(lamports):每个签名 5000 + 优先费用;同一笔交易里的多个调用相同,不含新建账户的租金 */
60
+ fee: string | null;
61
+ /** 模拟时整笔交易消耗的计算单元 */
62
+ computeUnits: number | null;
63
+ error: string | null;
64
+ }
65
+ /** 交易层面的结果 */
66
+ export interface TxOutcome {
67
+ status: WriteStatus;
68
+ signature: string | null;
69
+ slot: number | null;
70
+ fee: bigint | null;
71
+ computeUnits: number | null;
72
+ error: string | null;
73
+ }
74
+ /** 一个调用:要原子执行的一组指令(同一笔交易里的多个调用,任一失败整笔回滚) */
75
+ export interface Unit {
76
+ instructions: Instruction[];
77
+ /** 手续费支付者 */
78
+ payer: ResolvedSigner;
79
+ /** 指令需要的其他签名者 */
80
+ signers: ResolvedSigner[];
81
+ /** 单独成一笔交易,计算单元上限和优先费用固定(扫空 SOL 时手续费要事先算好) */
82
+ fixed?: {
83
+ computeUnits: number;
84
+ price: bigint;
85
+ };
86
+ /** 发送前失败时后面的调用是否继续,默认 false */
87
+ continueOnError?: boolean;
88
+ onUpdate(outcome: TxOutcome): void;
89
+ }
90
+ export declare function emptyOutcome(status: WriteStatus, error?: string | null): TxOutcome;
91
+ export declare function toWriteResult(index: number, from: string, outcome: TxOutcome): WriteResult;
92
+ /** 并发数为 limit 的 map,结果按输入顺序 */
93
+ export declare function mapPool<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
94
+ /** 每个签名的基础手续费(lamports) */
95
+ export declare const LAMPORTS_PER_SIGNATURE = 5000n;
96
+ /** 交易手续费:签名数 × 5000 + 优先费用(单价 × 计算单元上限,向上取整) */
97
+ export declare function transactionFee(signatures: number, computeUnits: number, price: bigint): bigint;
98
+ /**
99
+ * 交易错误的可读说明:优先取日志(见 logDetail),否则按错误类型;
100
+ * programs 是每条指令的程序(按下标),用来翻译常见程序的自定义错误码
101
+ */
102
+ export declare function transactionErrorText(err: unknown, logs?: readonly string[] | null, programs?: readonly string[]): string;
103
+ /** 按 SendOptions 取优先费用单价(micro-lamports / 计算单元);writable 是交易里的可写账户 */
104
+ export declare function priorityFeeFor(client: SolanaClient, options: SendOptions, writable: readonly string[]): Promise<bigint>;
105
+ export interface SendUnitsOptions {
106
+ /** 每笔交易最多打包几个调用,默认不限(按交易大小 1232 字节和 64 个账户的上限) */
107
+ batchSize?: number;
108
+ }
109
+ /**
110
+ * 发送一批调用:按手续费支付者分组,组内按顺序把相邻的调用打包成交易(不超过交易大小上限),
111
+ * 逐笔模拟(失败的调用剔除后重新模拟其余的)、签名、发送,不等上一笔确认;不同支付者并发。
112
+ * 模拟失败且同一支付者还有未确认的交易时,先等它们确认再模拟一次(后一笔依赖前一笔时自动正确处理)
113
+ */
114
+ export declare function sendUnits(client: SolanaClient, units: readonly Unit[], options: SendOptions, pack?: SendUnitsOptions): Promise<void>;
115
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/write/send.ts"],"names":[],"mappings":"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"}