@w3lib/solana-batch-call 0.5.0 → 0.6.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 (102) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +113 -1
  3. package/dist/batchPlan.d.ts +52 -0
  4. package/dist/batchPlan.d.ts.map +1 -0
  5. package/dist/batchPlan.js +85 -0
  6. package/dist/batchPlan.js.map +1 -0
  7. package/dist/claim.d.ts +161 -0
  8. package/dist/claim.d.ts.map +1 -0
  9. package/dist/claim.js +197 -0
  10. package/dist/claim.js.map +1 -0
  11. package/dist/decode.d.ts +22 -0
  12. package/dist/decode.d.ts.map +1 -0
  13. package/dist/decode.js +187 -0
  14. package/dist/decode.js.map +1 -0
  15. package/dist/describe.d.ts +26 -0
  16. package/dist/describe.d.ts.map +1 -0
  17. package/dist/describe.js +58 -0
  18. package/dist/describe.js.map +1 -0
  19. package/dist/history.d.ts +125 -0
  20. package/dist/history.d.ts.map +1 -0
  21. package/dist/history.js +231 -0
  22. package/dist/history.js.map +1 -0
  23. package/dist/historyHelius.d.ts +52 -0
  24. package/dist/historyHelius.d.ts.map +1 -0
  25. package/dist/historyHelius.js +125 -0
  26. package/dist/historyHelius.js.map +1 -0
  27. package/dist/liquidity/orca.d.ts +6 -0
  28. package/dist/liquidity/orca.d.ts.map +1 -1
  29. package/dist/liquidity/orca.js +14 -3
  30. package/dist/liquidity/orca.js.map +1 -1
  31. package/dist/liquidity/raydiumClmm.d.ts +6 -0
  32. package/dist/liquidity/raydiumClmm.d.ts.map +1 -1
  33. package/dist/liquidity/raydiumClmm.js +12 -5
  34. package/dist/liquidity/raydiumClmm.js.map +1 -1
  35. package/dist/lp.d.ts +47 -0
  36. package/dist/lp.d.ts.map +1 -1
  37. package/dist/lp.js +91 -15
  38. package/dist/lp.js.map +1 -1
  39. package/dist/lpMath.d.ts +22 -0
  40. package/dist/lpMath.d.ts.map +1 -1
  41. package/dist/lpMath.js +21 -0
  42. package/dist/lpMath.js.map +1 -1
  43. package/dist/programs.d.ts +19 -0
  44. package/dist/programs.d.ts.map +1 -0
  45. package/dist/programs.js +175 -0
  46. package/dist/programs.js.map +1 -0
  47. package/dist/reclaim.d.ts +190 -0
  48. package/dist/reclaim.d.ts.map +1 -0
  49. package/dist/reclaim.js +399 -0
  50. package/dist/reclaim.js.map +1 -0
  51. package/dist/rpc.d.ts.map +1 -1
  52. package/dist/rpc.js +4 -2
  53. package/dist/rpc.js.map +1 -1
  54. package/dist/simulate.d.ts +106 -0
  55. package/dist/simulate.d.ts.map +1 -0
  56. package/dist/simulate.js +418 -0
  57. package/dist/simulate.js.map +1 -0
  58. package/dist/subpaths/claim.d.ts +31 -0
  59. package/dist/subpaths/claim.d.ts.map +1 -0
  60. package/dist/subpaths/claim.js +31 -0
  61. package/dist/subpaths/claim.js.map +1 -0
  62. package/dist/subpaths/history.d.ts +21 -0
  63. package/dist/subpaths/history.d.ts.map +1 -0
  64. package/dist/subpaths/history.js +22 -0
  65. package/dist/subpaths/history.js.map +1 -0
  66. package/dist/subpaths/lp.d.ts +2 -2
  67. package/dist/subpaths/lp.d.ts.map +1 -1
  68. package/dist/subpaths/lp.js +2 -2
  69. package/dist/subpaths/lp.js.map +1 -1
  70. package/dist/subpaths/reclaim.d.ts +34 -0
  71. package/dist/subpaths/reclaim.d.ts.map +1 -0
  72. package/dist/subpaths/reclaim.js +34 -0
  73. package/dist/subpaths/reclaim.js.map +1 -0
  74. package/dist/subpaths/simulate.d.ts +22 -0
  75. package/dist/subpaths/simulate.d.ts.map +1 -0
  76. package/dist/subpaths/simulate.js +23 -0
  77. package/dist/subpaths/simulate.js.map +1 -0
  78. package/dist/write/instructions.d.ts +2 -0
  79. package/dist/write/instructions.d.ts.map +1 -1
  80. package/dist/write/instructions.js +16 -0
  81. package/dist/write/instructions.js.map +1 -1
  82. package/package.json +21 -1
  83. package/src/batchPlan.ts +137 -0
  84. package/src/claim.ts +323 -0
  85. package/src/decode.ts +202 -0
  86. package/src/describe.ts +77 -0
  87. package/src/history.ts +336 -0
  88. package/src/historyHelius.ts +136 -0
  89. package/src/liquidity/orca.ts +15 -5
  90. package/src/liquidity/raydiumClmm.ts +13 -5
  91. package/src/lp.ts +140 -15
  92. package/src/lpMath.ts +38 -0
  93. package/src/programs.ts +216 -0
  94. package/src/reclaim.ts +547 -0
  95. package/src/rpc.ts +4 -2
  96. package/src/simulate.ts +535 -0
  97. package/src/subpaths/claim.ts +53 -0
  98. package/src/subpaths/history.ts +38 -0
  99. package/src/subpaths/lp.ts +5 -1
  100. package/src/subpaths/reclaim.ts +57 -0
  101. package/src/subpaths/simulate.ts +37 -0
  102. package/src/write/instructions.ts +17 -0
@@ -12,7 +12,7 @@
12
12
  import { lpPositions } from '../lp.js';
13
13
  import { resolve } from '../shortcuts.js';
14
14
  export { ORCA_WHIRLPOOL_PROGRAM_ID, RAYDIUM_AMM_PROGRAM_ID, RAYDIUM_CLMM_PROGRAM_ID, RAYDIUM_CPMM_PROGRAM_ID, SOLANA_LP_PROTOCOLS, defillamaPrices, lpPositions, } from '../lp.js';
15
- export { MAX_TICK, MIN_TICK, getAmountsForLiquidity, getFeeGrowthInside, getFeesOwed, getLiquidityForAmounts, getMaxAmounts, getMinAmounts, getMintAmounts, nearestUsableTick, orcaSqrtPriceAtTick, priceToTick, raydiumSqrtPriceAtTick, sqrtPriceAtTick, sqrtPriceToPrice, tickAtSqrtPrice, tickToPrice, } from '../lpMath.js';
15
+ export { MAX_TICK, MIN_TICK, getAmountsForLiquidity, getFeeGrowthInside, getFeesOwed, getLiquidityForAmounts, getMaxAmounts, getMinAmounts, getMintAmounts, getRewardGrowthInside, nearestUsableTick, orcaSqrtPriceAtTick, priceToTick, raydiumSqrtPriceAtTick, rewardGrowthGlobal, sqrtPriceAtTick, sqrtPriceToPrice, tickAtSqrtPrice, tickToPrice, } from '../lpMath.js';
16
16
  /**
17
17
  * 查一个地址的 LP 仓位。
18
18
  *
@@ -27,7 +27,7 @@ export { MAX_TICK, MIN_TICK, getAmountsForLiquidity, getFeeGrowthInside, getFees
27
27
  */
28
28
  export function getLpPositions(owner, options = {}) {
29
29
  // fetch 同时给节点请求(客户端配置)和查价用,与其他快捷函数一致
30
- const { client, own } = resolve(options, ['protocols', 'mints', 'pools', 'includeClosed', 'prices', 'onPriceError', 'signal']);
30
+ const { client, own } = resolve(options, ['protocols', 'mints', 'pools', 'includeClosed', 'rewards', 'now', 'prices', 'onPriceError', 'signal']);
31
31
  return lpPositions(client, owner, { ...own, ...(options.fetch ? { fetch: options.fetch } : {}) });
32
32
  }
33
33
  //# sourceMappingURL=lp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lp.js","sourceRoot":"","sources":["../../src/subpaths/lp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAkD,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,WAAW,GAQZ,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,GAGZ,MAAM,cAAc,CAAA;AAIrB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,UAAiC,EAAE;IAC/E,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC9H,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AACnG,CAAC"}
1
+ {"version":3,"file":"lp.js","sourceRoot":"","sources":["../../src/subpaths/lp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAkD,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,WAAW,GASZ,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,GAIZ,MAAM,cAAc,CAAA;AAIrB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,UAAiC,EAAE;IAC/E,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;IAChJ,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AACnG,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 账户回收(子路径 `@w3lib/solana-batch-call/reclaim`):扫描钱包里关闭后能退回租金(SOL)的账户并批量关闭:空的代币账户、垃圾币(销毁后关闭)、
3
+ * Wrapped SOL(解包)、已清空的 Orca Whirlpool / Raydium CLMM 仓位。给出每项和合计能拿回多少 lamports,发送前用 /simulate 模拟。
4
+ * 不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
5
+ *
6
+ * ```ts
7
+ * import { getReclaimable, reclaim } from '@w3lib/solana-batch-call/reclaim'
8
+ *
9
+ * const r = await getReclaimable(owner, { provider: 'https://my-rpc…' })
10
+ * r.totalLamports // 全部能拿回的 lamports
11
+ * const { simulation, results } = await reclaim(client, key, r.items.filter((i) => i.selected))
12
+ * ```
13
+ */
14
+ import { type Reclaimable, type ReclaimQuery } from '../reclaim.js';
15
+ import { type ShortcutOptions } from '../shortcuts.js';
16
+ export { buildReclaim, reclaim, reclaimable, simulateReclaim, type BuildReclaimOptions, type JunkContext, type ReclaimBlocker, type ReclaimCall, type ReclaimCallResult, type ReclaimItem, type ReclaimKind, type ReclaimOptions, type ReclaimPlan, type ReclaimQuery, type ReclaimResult, type ReclaimSimulation, type ReclaimSimulationOptions, type Reclaimable, } from '../reclaim.js';
17
+ export type { PlanSimulation } from '../batchPlan.js';
18
+ export { burnChecked, closeAccount, harvestWithheldTokensToMint } from '../write/instructions.js';
19
+ export interface GetReclaimableOptions extends ReclaimQuery, ShortcutOptions {
20
+ }
21
+ /**
22
+ * 扫描钱包里能回收租金的账户,节点参数与 getBalances 相同。默认列出全部代币账户(需要支持 getTokenAccountsByOwner 的节点),
23
+ * 免费公共节点传 `mints` 只看指定代币的 ATA。
24
+ *
25
+ * ```ts
26
+ * const r = await getReclaimable(owner, { provider: 'https://my-rpc…' })
27
+ * // { totalLamports: '45862080', selectedLamports: '41302080',
28
+ * // items: [{ kind: 'empty-token', account, mint, lamports: '2039280', selected: true, reasons: ['empty'] },
29
+ * // { kind: 'junk-token', symbol: 'claim-rewards.xyz', lamports: '2039280', selected: true, reasons: ['no-price', 'spam-name'] }, …],
30
+ * // blocked: [{ kind: 'empty-token', blocker: 'frozen', … }] }
31
+ * ```
32
+ */
33
+ export declare function getReclaimable(owner: string, options?: GetReclaimableOptions): Promise<Reclaimable>;
34
+ //# sourceMappingURL=reclaim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reclaim.d.ts","sourceRoot":"","sources":["../../src/subpaths/reclaim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAChF,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,YAAY,EACZ,OAAO,EACP,WAAW,EACX,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,WAAW,GACjB,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AAEjG,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,eAAe;CAAG;AAE/E;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,WAAW,CAAC,CAGvG"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 账户回收(子路径 `@w3lib/solana-batch-call/reclaim`):扫描钱包里关闭后能退回租金(SOL)的账户并批量关闭:空的代币账户、垃圾币(销毁后关闭)、
3
+ * Wrapped SOL(解包)、已清空的 Orca Whirlpool / Raydium CLMM 仓位。给出每项和合计能拿回多少 lamports,发送前用 /simulate 模拟。
4
+ * 不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
5
+ *
6
+ * ```ts
7
+ * import { getReclaimable, reclaim } from '@w3lib/solana-batch-call/reclaim'
8
+ *
9
+ * const r = await getReclaimable(owner, { provider: 'https://my-rpc…' })
10
+ * r.totalLamports // 全部能拿回的 lamports
11
+ * const { simulation, results } = await reclaim(client, key, r.items.filter((i) => i.selected))
12
+ * ```
13
+ */
14
+ import { reclaimable } from '../reclaim.js';
15
+ import { resolve } from '../shortcuts.js';
16
+ export { buildReclaim, reclaim, reclaimable, simulateReclaim, } from '../reclaim.js';
17
+ export { burnChecked, closeAccount, harvestWithheldTokensToMint } from '../write/instructions.js';
18
+ /**
19
+ * 扫描钱包里能回收租金的账户,节点参数与 getBalances 相同。默认列出全部代币账户(需要支持 getTokenAccountsByOwner 的节点),
20
+ * 免费公共节点传 `mints` 只看指定代币的 ATA。
21
+ *
22
+ * ```ts
23
+ * const r = await getReclaimable(owner, { provider: 'https://my-rpc…' })
24
+ * // { totalLamports: '45862080', selectedLamports: '41302080',
25
+ * // items: [{ kind: 'empty-token', account, mint, lamports: '2039280', selected: true, reasons: ['empty'] },
26
+ * // { kind: 'junk-token', symbol: 'claim-rewards.xyz', lamports: '2039280', selected: true, reasons: ['no-price', 'spam-name'] }, …],
27
+ * // blocked: [{ kind: 'empty-token', blocker: 'frozen', … }] }
28
+ * ```
29
+ */
30
+ export function getReclaimable(owner, options = {}) {
31
+ const { client, own } = resolve(options, ['mints', 'junk', 'positions', 'prices', 'maxJunkUsd', 'risk', 'isJunk', 'signal']);
32
+ return reclaimable(client, owner, { ...own, ...(options.fetch ? { fetch: options.fetch } : {}) });
33
+ }
34
+ //# sourceMappingURL=reclaim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reclaim.js","sourceRoot":"","sources":["../../src/subpaths/reclaim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,WAAW,EAAuC,MAAM,eAAe,CAAA;AAChF,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,YAAY,EACZ,OAAO,EACP,WAAW,EACX,eAAe,GAehB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AAIjG;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,UAAiC,EAAE;IAC/E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC5H,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AACnG,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 交易模拟(子路径 `@w3lib/solana-batch-call/simulate`):不签名、不发送,在主网模拟一笔交易,给出余额变化、授权变化(delegate / SetAuthority / 关闭账户)、
3
+ * 指令说明、程序错误、手续费和警告。输入可以是 base64 的交易,也可以直接是本库构建器的输出。不放在主入口,不用时打包不会带上这部分代码;价格、风险检查按需加载。
4
+ *
5
+ * ```ts
6
+ * import { buildSwap } from '@w3lib/solana-batch-call/swap'
7
+ * import { getSimulation } from '@w3lib/solana-batch-call/simulate'
8
+ *
9
+ * const plan = await getSwapQuote(owner, { tokenIn: NATIVE_MINT, tokenOut: USDC, amountInFormatted: '0.5' })
10
+ * const sim = await getSimulation(plan) // 或 getSimulation(base64Tx, { owner })
11
+ * if (!sim.success || sim.warnings.some((w) => w.severity === 'danger')) throw new Error(sim.error ?? sim.warnings[0].message)
12
+ * ```
13
+ */
14
+ import { type ShortcutOptions } from '../shortcuts.js';
15
+ import { type SimulateInput, type SimulateOptions, type SimulationResult } from '../simulate.js';
16
+ export { failureText, simulate, type ApprovalChange, type ApprovalChangeKind, type SimulateInput, type SimulateOptions, type SimulatedBalanceChange, type SimulationResult, type SimulationWarning, type WarningSeverity, } from '../simulate.js';
17
+ export { decodeInstruction, type DecodedInstruction } from '../decode.js';
18
+ export interface GetSimulationOptions extends SimulateOptions, ShortcutOptions {
19
+ }
20
+ /** 模拟一笔交易,节点参数与 getBalances 相同 */
21
+ export declare function getSimulation(input: SimulateInput, options?: GetSimulationOptions): Promise<SimulationResult>;
22
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../src/subpaths/simulate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAY,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE1G,OAAO,EACL,WAAW,EACX,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEzE,MAAM,WAAW,oBAAqB,SAAQ,eAAe,EAAE,eAAe;CAAG;AAEjF,kCAAkC;AAClC,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGjH"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 交易模拟(子路径 `@w3lib/solana-batch-call/simulate`):不签名、不发送,在主网模拟一笔交易,给出余额变化、授权变化(delegate / SetAuthority / 关闭账户)、
3
+ * 指令说明、程序错误、手续费和警告。输入可以是 base64 的交易,也可以直接是本库构建器的输出。不放在主入口,不用时打包不会带上这部分代码;价格、风险检查按需加载。
4
+ *
5
+ * ```ts
6
+ * import { buildSwap } from '@w3lib/solana-batch-call/swap'
7
+ * import { getSimulation } from '@w3lib/solana-batch-call/simulate'
8
+ *
9
+ * const plan = await getSwapQuote(owner, { tokenIn: NATIVE_MINT, tokenOut: USDC, amountInFormatted: '0.5' })
10
+ * const sim = await getSimulation(plan) // 或 getSimulation(base64Tx, { owner })
11
+ * if (!sim.success || sim.warnings.some((w) => w.severity === 'danger')) throw new Error(sim.error ?? sim.warnings[0].message)
12
+ * ```
13
+ */
14
+ import { resolve } from '../shortcuts.js';
15
+ import { simulate } from '../simulate.js';
16
+ export { failureText, simulate, } from '../simulate.js';
17
+ export { decodeInstruction } from '../decode.js';
18
+ /** 模拟一笔交易,节点参数与 getBalances 相同 */
19
+ export function getSimulation(input, options = {}) {
20
+ const { client, own } = resolve(options, ['owner', 'signers', 'watch', 'step', 'prices', 'risk', 'fetch', 'signal']);
21
+ return simulate(client, input, own);
22
+ }
23
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../src/subpaths/simulate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAmE,MAAM,gBAAgB,CAAA;AAE1G,OAAO,EACL,WAAW,EACX,QAAQ,GAST,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAA2B,MAAM,cAAc,CAAA;AAIzE,kCAAkC;AAClC,MAAM,UAAU,aAAa,CAAC,KAAoB,EAAE,UAAgC,EAAE;IACpF,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpH,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AACrC,CAAC"}
@@ -10,6 +10,8 @@ export declare function transferChecked(source: string, mint: string, destinatio
10
10
  export declare function createAssociatedTokenAccountIdempotent(payer: string, ata: string, owner: string, mint: string, tokenProgram: string): Instruction;
11
11
  /** 关闭代币账户(余额必须为 0),租金退给 destination */
12
12
  export declare function closeAccount(account: string, destination: string, owner: string, tokenProgram: string): Instruction;
13
+ /** SPL Token / Token-2022 BurnChecked:销毁代币账户里的代币(校验 mint 和精度),owner 签名 */
14
+ export declare function burnChecked(account: string, mint: string, owner: string, amount: bigint, decimals: number, tokenProgram: string): Instruction;
13
15
  /** 撤销代币账户的授权(Approve 设置的 delegate),owner 签名 */
14
16
  export declare function revoke(account: string, owner: string, tokenProgram: string): Instruction;
15
17
  /**
@@ -1 +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,+CAA+C;AAC/C,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CASxF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAOlG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAS9D;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAStE"}
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,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CAc7I;AAED,+CAA+C;AAC/C,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CASxF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAOlG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAS9D;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAStE"}
@@ -65,6 +65,22 @@ export function closeAccount(account, destination, owner, tokenProgram) {
65
65
  data: new Uint8Array([9]),
66
66
  };
67
67
  }
68
+ /** SPL Token / Token-2022 BurnChecked:销毁代币账户里的代币(校验 mint 和精度),owner 签名 */
69
+ export function burnChecked(account, mint, owner, amount, decimals, tokenProgram) {
70
+ return {
71
+ programId: tokenProgram,
72
+ keys: [
73
+ { pubkey: account, isSigner: false, isWritable: true },
74
+ { pubkey: mint, isSigner: false, isWritable: true },
75
+ { pubkey: owner, isSigner: true, isWritable: false },
76
+ ],
77
+ data: bytes(10, (v) => {
78
+ v.setUint8(0, 15);
79
+ v.setBigUint64(1, amount, true);
80
+ v.setUint8(9, decimals);
81
+ }),
82
+ };
83
+ }
68
84
  /** 撤销代币账户的授权(Approve 设置的 delegate),owner 签名 */
69
85
  export function revoke(account, owner, tokenProgram) {
70
86
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/write/instructions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/write/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAGvG,MAAM,CAAC,MAAM,yBAAyB,GAAG,6CAA6C,CAAA;AAEtF,kBAAkB;AAClB,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAA;AAE1C,SAAS,KAAK,CAAC,IAAY,EAAE,KAA+B;IAC1D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,EAAU,EAAE,QAAgB;IACvE,OAAO;QACL,SAAS,EAAE,iBAAiB;QAC5B,IAAI,EAAE;YACJ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAClD,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;SAClD;QACD,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YACpB,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;YACvB,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;QACnC,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAY,EAAE,WAAmB,EAAE,KAAa,EAAE,MAAc,EAAE,QAAgB,EAAE,YAAoB;IACtJ,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,IAAI,EAAE;YACJ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACrD,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YACpD,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YAC1D,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;SACrD;QACD,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YACpB,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACjB,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACzB,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,sCAAsC,CAAC,KAAa,EAAE,GAAW,EAAE,KAAa,EAAE,IAAY,EAAE,YAAoB;IAClI,OAAO;QACL,SAAS,EAAE,2BAA2B;QACtC,IAAI,EAAE;YACJ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YACnD,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YAClD,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YACrD,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YACpD,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YACjE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;SAC7D;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAA;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,WAAmB,EAAE,KAAa,EAAE,YAAoB;IACpG,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,IAAI,EAAE;YACJ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACtD,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YAC1D,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;SACrD;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAA;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,IAAY,EAAE,KAAa,EAAE,MAAc,EAAE,QAAgB,EAAE,YAAoB;IAC9H,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,IAAI,EAAE;YACJ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACtD,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACnD,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;SACrD;QACD,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YACpB,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACjB,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACzB,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,KAAa,EAAE,YAAoB;IACzE,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,IAAI,EAAE;YACJ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACtD,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;SACrD;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAE,QAA2B;IACnF,OAAO;QACL,SAAS,EAAE,qBAAqB;QAChC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzI,2DAA2D;QAC3D,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KAC9B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO;QACL,SAAS,EAAE,yBAAyB;QACpC,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACnB,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAChB,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QAC7B,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,mBAAmB,CAAC,aAAqB;IACvD,OAAO;QACL,SAAS,EAAE,yBAAyB;QACpC,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACnB,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAChB,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;QACxC,CAAC,CAAC;KACH,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3lib/solana-batch-call",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Batched Solana reads: SOL / SPL / Token-2022 balances, token metadata, NFTs; batch transfer, collect and program calls (packed transactions, fee payer). Auto-batching JSON-RPC, getMultipleAccounts chunking, RPC failover. No Solana SDK dependency.",
5
5
  "keywords": [
6
6
  "solana",
@@ -60,6 +60,22 @@
60
60
  "./risk": {
61
61
  "types": "./dist/subpaths/risk.d.ts",
62
62
  "import": "./dist/subpaths/risk.js"
63
+ },
64
+ "./simulate": {
65
+ "types": "./dist/subpaths/simulate.d.ts",
66
+ "import": "./dist/subpaths/simulate.js"
67
+ },
68
+ "./history": {
69
+ "types": "./dist/subpaths/history.d.ts",
70
+ "import": "./dist/subpaths/history.js"
71
+ },
72
+ "./reclaim": {
73
+ "types": "./dist/subpaths/reclaim.d.ts",
74
+ "import": "./dist/subpaths/reclaim.js"
75
+ },
76
+ "./claim": {
77
+ "types": "./dist/subpaths/claim.d.ts",
78
+ "import": "./dist/subpaths/claim.js"
63
79
  }
64
80
  },
65
81
  "files": [
@@ -106,6 +122,10 @@
106
122
  "test:live:fees": "LIVE=1 vitest run test/fees-live.test.ts",
107
123
  "test:live:swap": "LIVE=1 vitest run test/swap-live.test.ts",
108
124
  "test:live:risk": "LIVE=1 vitest run test/risk-live.test.ts",
125
+ "test:live:simulate": "LIVE=1 vitest run test/simulate-live.test.ts",
126
+ "test:live:history": "LIVE=1 vitest run test/history-live.test.ts",
127
+ "test:live:reclaim": "LIVE=1 vitest run test/reclaim-live.test.ts",
128
+ "test:live:claim": "LIVE=1 vitest run test/claim-live.test.ts",
109
129
  "demo": "vite demo",
110
130
  "demo:build": "vite build demo"
111
131
  }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * 批量计划的公共部分(/reclaim、/claim 用):一组“调用”(每个调用的指令原子执行)按交易大小打包、先模拟再发送。
3
+ * 打包规则同 batchCall(相邻的调用放进同一笔交易,不超过 1232 字节和 64 个账户)
4
+ */
5
+ import type { SolanaClient } from './client.js'
6
+ import { isAddress } from './address.js'
7
+ import type { SimulationResult } from './simulate.js'
8
+ import type { BatchCallOptions } from './write/batch.js'
9
+ import { MAX_COMPUTE_UNITS, setComputeUnitLimit, setComputeUnitPrice } from './write/instructions.js'
10
+ import type { WriteResult } from './write/send.js'
11
+ import type { SignerInput } from './write/signer.js'
12
+ import { MAX_ACCOUNT_LOCKS, PACKET_DATA_SIZE, compileMessage, transactionSize, type Instruction } from './write/transaction.js'
13
+
14
+ /** 一个调用:要签名的地址(代币账户 / 仓位的 owner)和原子执行的指令 */
15
+ export interface PlannedCall {
16
+ owner: string
17
+ instructions: Instruction[]
18
+ }
19
+
20
+ /** 把调用按顺序打包成交易,返回每笔交易包含的调用下标。单个调用放不进一笔交易时自己成一笔(发送时会报“transaction too large”) */
21
+ export function packCalls(payer: string, calls: readonly PlannedCall[], batchSize = Number.POSITIVE_INFINITY): number[][] {
22
+ const packs: number[][] = []
23
+ let current: number[] = []
24
+ let instructions: Instruction[] = []
25
+ const fits = (list: readonly Instruction[]) => {
26
+ const probe = compileMessage(payer, [setComputeUnitLimit(MAX_COMPUTE_UNITS), setComputeUnitPrice(1n), ...list], '11111111111111111111111111111111')
27
+ return transactionSize(probe) <= PACKET_DATA_SIZE && probe.accountKeys.length <= MAX_ACCOUNT_LOCKS
28
+ }
29
+ calls.forEach((call, i) => {
30
+ const next = [...instructions, ...call.instructions]
31
+ if (current.length && (current.length >= batchSize || !fits(next))) {
32
+ packs.push(current)
33
+ current = []
34
+ instructions = []
35
+ }
36
+ current.push(i)
37
+ instructions.push(...call.instructions)
38
+ })
39
+ if (current.length) {
40
+ packs.push(current)
41
+ }
42
+ return packs
43
+ }
44
+
45
+ export interface PlanSimulationOptions {
46
+ /** 手续费支付者,默认第一个调用的 owner */
47
+ feePayer?: string
48
+ /** 每笔交易最多几个调用,默认不限(只受交易大小限制) */
49
+ batchSize?: number
50
+ /** 额外要看的地址(如收款地址) */
51
+ watch?: readonly string[]
52
+ signal?: AbortSignal
53
+ /** 算美元价值(/simulate 的 prices) */
54
+ prices?: boolean
55
+ fetch?: typeof fetch
56
+ }
57
+
58
+ export interface PlanSimulation {
59
+ /** 所有交易都模拟通过 */
60
+ success: boolean
61
+ /** 打包后的每笔交易:包含的调用下标和 /simulate 的结果 */
62
+ transactions: Array<{ calls: number[]; simulation: SimulationResult }>
63
+ /** 模拟失败的调用(整笔失败时逐个重新模拟找出来):下标和原因 */
64
+ failed: Array<{ index: number; error: string }>
65
+ /** 各笔交易手续费之和(lamports,十进制字符串) */
66
+ fee: string
67
+ /** 手续费支付者的 SOL 变化之和(lamports,带符号,不含手续费:/simulate 的 SOL 余额变化已经把手续费加回) */
68
+ payerNativeDelta: string
69
+ }
70
+
71
+ /** 打包后逐笔用 /simulate 模拟(不签名、不发送);失败的交易逐个调用重新模拟,找出是哪些调用失败 */
72
+ export async function simulatePlan(client: SolanaClient, calls: readonly PlannedCall[], options: PlanSimulationOptions = {}): Promise<PlanSimulation> {
73
+ const first = calls[0]
74
+ if (!first) {
75
+ return { success: true, transactions: [], failed: [], fee: '0', payerNativeDelta: '0' }
76
+ }
77
+ const payer = options.feePayer ?? first.owner
78
+ if (!isAddress(payer)) {
79
+ throw new Error(`Invalid fee payer: ${payer}`)
80
+ }
81
+ const { simulate } = await import('./simulate.js')
82
+ const run = (list: readonly PlannedCall[]) =>
83
+ simulate(
84
+ client,
85
+ { feePayer: payer, instructions: list.flatMap((c) => c.instructions) },
86
+ { signers: [...new Set(list.map((c) => c.owner))], watch: options.watch, signal: options.signal, prices: options.prices, fetch: options.fetch },
87
+ )
88
+ const packs = packCalls(payer, calls, options.batchSize)
89
+ const transactions: PlanSimulation['transactions'] = []
90
+ const failed: PlanSimulation['failed'] = []
91
+ for (const pack of packs) {
92
+ const simulation = await run(pack.map((i) => calls[i] as PlannedCall))
93
+ transactions.push({ calls: pack, simulation })
94
+ if (!simulation.success) {
95
+ if (pack.length === 1) {
96
+ failed.push({ index: pack[0] as number, error: simulation.error ?? 'simulation failed' })
97
+ continue
98
+ }
99
+ for (const i of pack) {
100
+ const single = await run([calls[i] as PlannedCall])
101
+ if (!single.success) {
102
+ failed.push({ index: i, error: single.error ?? 'simulation failed' })
103
+ }
104
+ }
105
+ }
106
+ }
107
+ let fee = 0n
108
+ let delta = 0n
109
+ for (const { simulation } of transactions) {
110
+ fee += BigInt(simulation.fee ?? '0')
111
+ for (const change of simulation.balanceChanges) {
112
+ if (change.address === payer && change.asset === 'native') {
113
+ delta += BigInt(change.delta)
114
+ }
115
+ }
116
+ }
117
+ return { success: transactions.every((t) => t.simulation.success), transactions, failed, fee: fee.toString(), payerNativeDelta: delta.toString() }
118
+ }
119
+
120
+ /** 用 from 签名发送:调用的 owner 都必须是签名者本人;一个调用失败不影响后面的(continueOnError),feePayer 可以替 owner 付手续费 */
121
+ export async function sendCalls(client: SolanaClient, from: SignerInput, calls: readonly PlannedCall[], options: BatchCallOptions = {}): Promise<WriteResult[]> {
122
+ if (!calls.length) {
123
+ return []
124
+ }
125
+ // 发送的代码按需加载:只查询、模拟时打包不会带上
126
+ const [{ batchCall }, { resolveSigner }] = await Promise.all([import('./write/batch.js'), import('./write/signer.js')])
127
+ const { address } = await resolveSigner(from)
128
+ const other = calls.find((c) => c.owner !== address)
129
+ if (other) {
130
+ throw new Error(`The account belongs to ${other.owner}, not the signer ${address}`)
131
+ }
132
+ return batchCall(
133
+ client,
134
+ calls.map((c) => ({ from, instructions: c.instructions })),
135
+ { continueOnError: true, ...options },
136
+ )
137
+ }