@w3lib/solana-batch-call 0.4.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 (223) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +343 -3
  3. package/dist/approvals.d.ts +129 -0
  4. package/dist/approvals.d.ts.map +1 -0
  5. package/dist/approvals.js +221 -0
  6. package/dist/approvals.js.map +1 -0
  7. package/dist/batchPlan.d.ts +52 -0
  8. package/dist/batchPlan.d.ts.map +1 -0
  9. package/dist/batchPlan.js +85 -0
  10. package/dist/batchPlan.js.map +1 -0
  11. package/dist/claim.d.ts +161 -0
  12. package/dist/claim.d.ts.map +1 -0
  13. package/dist/claim.js +197 -0
  14. package/dist/claim.js.map +1 -0
  15. package/dist/decode.d.ts +22 -0
  16. package/dist/decode.d.ts.map +1 -0
  17. package/dist/decode.js +187 -0
  18. package/dist/decode.js.map +1 -0
  19. package/dist/describe.d.ts +26 -0
  20. package/dist/describe.d.ts.map +1 -0
  21. package/dist/describe.js +58 -0
  22. package/dist/describe.js.map +1 -0
  23. package/dist/fees.d.ts +89 -0
  24. package/dist/fees.d.ts.map +1 -0
  25. package/dist/fees.js +166 -0
  26. package/dist/fees.js.map +1 -0
  27. package/dist/history.d.ts +125 -0
  28. package/dist/history.d.ts.map +1 -0
  29. package/dist/history.js +231 -0
  30. package/dist/history.js.map +1 -0
  31. package/dist/historyHelius.d.ts +52 -0
  32. package/dist/historyHelius.d.ts.map +1 -0
  33. package/dist/historyHelius.js +125 -0
  34. package/dist/historyHelius.js.map +1 -0
  35. package/dist/layout.d.ts +2 -0
  36. package/dist/layout.d.ts.map +1 -1
  37. package/dist/layout.js +2 -2
  38. package/dist/layout.js.map +1 -1
  39. package/dist/liquidity/orca.d.ts +6 -0
  40. package/dist/liquidity/orca.d.ts.map +1 -1
  41. package/dist/liquidity/orca.js +14 -3
  42. package/dist/liquidity/orca.js.map +1 -1
  43. package/dist/liquidity/raydiumClmm.d.ts +6 -0
  44. package/dist/liquidity/raydiumClmm.d.ts.map +1 -1
  45. package/dist/liquidity/raydiumClmm.js +12 -5
  46. package/dist/liquidity/raydiumClmm.js.map +1 -1
  47. package/dist/lp.d.ts +55 -15
  48. package/dist/lp.d.ts.map +1 -1
  49. package/dist/lp.js +98 -46
  50. package/dist/lp.js.map +1 -1
  51. package/dist/lpMath.d.ts +22 -0
  52. package/dist/lpMath.d.ts.map +1 -1
  53. package/dist/lpMath.js +21 -0
  54. package/dist/lpMath.js.map +1 -1
  55. package/dist/names.d.ts +68 -0
  56. package/dist/names.d.ts.map +1 -0
  57. package/dist/names.js +257 -0
  58. package/dist/names.js.map +1 -0
  59. package/dist/pools.d.ts +9 -0
  60. package/dist/pools.d.ts.map +1 -0
  61. package/dist/pools.js +45 -0
  62. package/dist/pools.js.map +1 -0
  63. package/dist/portfolio.d.ts +64 -0
  64. package/dist/portfolio.d.ts.map +1 -0
  65. package/dist/portfolio.js +57 -0
  66. package/dist/portfolio.js.map +1 -0
  67. package/dist/price.d.ts +90 -0
  68. package/dist/price.d.ts.map +1 -0
  69. package/dist/price.js +287 -0
  70. package/dist/price.js.map +1 -0
  71. package/dist/programs.d.ts +19 -0
  72. package/dist/programs.d.ts.map +1 -0
  73. package/dist/programs.js +175 -0
  74. package/dist/programs.js.map +1 -0
  75. package/dist/reclaim.d.ts +190 -0
  76. package/dist/reclaim.d.ts.map +1 -0
  77. package/dist/reclaim.js +399 -0
  78. package/dist/reclaim.js.map +1 -0
  79. package/dist/risk.d.ts +84 -0
  80. package/dist/risk.d.ts.map +1 -0
  81. package/dist/risk.js +211 -0
  82. package/dist/risk.js.map +1 -0
  83. package/dist/rpc.d.ts +2 -0
  84. package/dist/rpc.d.ts.map +1 -1
  85. package/dist/rpc.js +36 -10
  86. package/dist/rpc.js.map +1 -1
  87. package/dist/simulate.d.ts +106 -0
  88. package/dist/simulate.d.ts.map +1 -0
  89. package/dist/simulate.js +418 -0
  90. package/dist/simulate.js.map +1 -0
  91. package/dist/subpaths/approvals.d.ts +29 -0
  92. package/dist/subpaths/approvals.d.ts.map +1 -0
  93. package/dist/subpaths/approvals.js +30 -0
  94. package/dist/subpaths/approvals.js.map +1 -0
  95. package/dist/subpaths/claim.d.ts +31 -0
  96. package/dist/subpaths/claim.d.ts.map +1 -0
  97. package/dist/subpaths/claim.js +31 -0
  98. package/dist/subpaths/claim.js.map +1 -0
  99. package/dist/subpaths/fees.d.ts +23 -0
  100. package/dist/subpaths/fees.d.ts.map +1 -0
  101. package/dist/subpaths/fees.js +25 -0
  102. package/dist/subpaths/fees.js.map +1 -0
  103. package/dist/subpaths/history.d.ts +21 -0
  104. package/dist/subpaths/history.d.ts.map +1 -0
  105. package/dist/subpaths/history.js +22 -0
  106. package/dist/subpaths/history.js.map +1 -0
  107. package/dist/subpaths/lp.d.ts +2 -2
  108. package/dist/subpaths/lp.d.ts.map +1 -1
  109. package/dist/subpaths/lp.js +2 -2
  110. package/dist/subpaths/lp.js.map +1 -1
  111. package/dist/subpaths/names.d.ts +37 -0
  112. package/dist/subpaths/names.d.ts.map +1 -0
  113. package/dist/subpaths/names.js +27 -0
  114. package/dist/subpaths/names.js.map +1 -0
  115. package/dist/subpaths/price.d.ts +40 -0
  116. package/dist/subpaths/price.d.ts.map +1 -0
  117. package/dist/subpaths/price.js +43 -0
  118. package/dist/subpaths/price.js.map +1 -0
  119. package/dist/subpaths/reclaim.d.ts +34 -0
  120. package/dist/subpaths/reclaim.d.ts.map +1 -0
  121. package/dist/subpaths/reclaim.js +34 -0
  122. package/dist/subpaths/reclaim.js.map +1 -0
  123. package/dist/subpaths/risk.d.ts +28 -0
  124. package/dist/subpaths/risk.d.ts.map +1 -0
  125. package/dist/subpaths/risk.js +30 -0
  126. package/dist/subpaths/risk.js.map +1 -0
  127. package/dist/subpaths/simulate.d.ts +22 -0
  128. package/dist/subpaths/simulate.d.ts.map +1 -0
  129. package/dist/subpaths/simulate.js +23 -0
  130. package/dist/subpaths/simulate.js.map +1 -0
  131. package/dist/subpaths/swap.d.ts +22 -0
  132. package/dist/subpaths/swap.d.ts.map +1 -0
  133. package/dist/subpaths/swap.js +21 -0
  134. package/dist/subpaths/swap.js.map +1 -0
  135. package/dist/subpaths/write.d.ts +1 -1
  136. package/dist/subpaths/write.d.ts.map +1 -1
  137. package/dist/subpaths/write.js +1 -1
  138. package/dist/subpaths/write.js.map +1 -1
  139. package/dist/swap/amm.d.ts +20 -0
  140. package/dist/swap/amm.d.ts.map +1 -0
  141. package/dist/swap/amm.js +77 -0
  142. package/dist/swap/amm.js.map +1 -0
  143. package/dist/swap/clmmMath.d.ts +24 -0
  144. package/dist/swap/clmmMath.d.ts.map +1 -0
  145. package/dist/swap/clmmMath.js +82 -0
  146. package/dist/swap/clmmMath.js.map +1 -0
  147. package/dist/swap/common.d.ts +68 -0
  148. package/dist/swap/common.d.ts.map +1 -0
  149. package/dist/swap/common.js +65 -0
  150. package/dist/swap/common.js.map +1 -0
  151. package/dist/swap/cpmm.d.ts +28 -0
  152. package/dist/swap/cpmm.d.ts.map +1 -0
  153. package/dist/swap/cpmm.js +113 -0
  154. package/dist/swap/cpmm.js.map +1 -0
  155. package/dist/swap/index.d.ts +145 -0
  156. package/dist/swap/index.d.ts.map +1 -0
  157. package/dist/swap/index.js +349 -0
  158. package/dist/swap/index.js.map +1 -0
  159. package/dist/swap/orca.d.ts +50 -0
  160. package/dist/swap/orca.d.ts.map +1 -0
  161. package/dist/swap/orca.js +382 -0
  162. package/dist/swap/orca.js.map +1 -0
  163. package/dist/swap/raydiumClmm.d.ts +62 -0
  164. package/dist/swap/raydiumClmm.d.ts.map +1 -0
  165. package/dist/swap/raydiumClmm.js +447 -0
  166. package/dist/swap/raydiumClmm.js.map +1 -0
  167. package/dist/tradeCheck.d.ts +45 -0
  168. package/dist/tradeCheck.d.ts.map +1 -0
  169. package/dist/tradeCheck.js +131 -0
  170. package/dist/tradeCheck.js.map +1 -0
  171. package/dist/write/instructions.d.ts +9 -0
  172. package/dist/write/instructions.d.ts.map +1 -1
  173. package/dist/write/instructions.js +40 -1
  174. package/dist/write/instructions.js.map +1 -1
  175. package/dist/write/transaction.d.ts +23 -0
  176. package/dist/write/transaction.d.ts.map +1 -1
  177. package/dist/write/transaction.js +50 -0
  178. package/dist/write/transaction.js.map +1 -1
  179. package/package.json +66 -14
  180. package/src/approvals.ts +358 -0
  181. package/src/batchPlan.ts +137 -0
  182. package/src/claim.ts +323 -0
  183. package/src/decode.ts +202 -0
  184. package/src/describe.ts +77 -0
  185. package/src/fees.ts +259 -0
  186. package/src/history.ts +336 -0
  187. package/src/historyHelius.ts +136 -0
  188. package/src/layout.ts +2 -2
  189. package/src/liquidity/orca.ts +15 -5
  190. package/src/liquidity/raydiumClmm.ts +13 -5
  191. package/src/lp.ts +148 -59
  192. package/src/lpMath.ts +38 -0
  193. package/src/names.ts +329 -0
  194. package/src/pools.ts +43 -0
  195. package/src/portfolio.ts +124 -0
  196. package/src/price.ts +366 -0
  197. package/src/programs.ts +216 -0
  198. package/src/reclaim.ts +547 -0
  199. package/src/risk.ts +243 -0
  200. package/src/rpc.ts +39 -10
  201. package/src/simulate.ts +535 -0
  202. package/src/subpaths/approvals.ts +47 -0
  203. package/src/subpaths/claim.ts +53 -0
  204. package/src/subpaths/fees.ts +41 -0
  205. package/src/subpaths/history.ts +38 -0
  206. package/src/subpaths/lp.ts +5 -1
  207. package/src/subpaths/names.ts +45 -0
  208. package/src/subpaths/price.ts +62 -0
  209. package/src/subpaths/reclaim.ts +57 -0
  210. package/src/subpaths/risk.ts +36 -0
  211. package/src/subpaths/simulate.ts +37 -0
  212. package/src/subpaths/swap.ts +41 -0
  213. package/src/subpaths/write.ts +2 -0
  214. package/src/swap/amm.ts +88 -0
  215. package/src/swap/clmmMath.ts +96 -0
  216. package/src/swap/common.ts +113 -0
  217. package/src/swap/cpmm.ts +132 -0
  218. package/src/swap/index.ts +467 -0
  219. package/src/swap/orca.ts +397 -0
  220. package/src/swap/raydiumClmm.ts +464 -0
  221. package/src/tradeCheck.ts +166 -0
  222. package/src/write/instructions.ts +43 -1
  223. package/src/write/transaction.ts +62 -0
@@ -0,0 +1,418 @@
1
+ /**
2
+ * 交易模拟(子路径 `@w3lib/solana-batch-call/simulate`):simulateTransaction(不验签名,换最新 blockhash)+ 钱包和交易里可写账户的前后状态,
3
+ * 算出余额变化、授权变化(delegate / SetAuthority / 关闭账户)、指令说明、程序错误、手续费和警告。支持 legacy 和 v0(地址查找表)交易
4
+ */
5
+ import { base64 } from '@scure/base';
6
+ import { encodeAddress, isAddress } from './address.js';
7
+ import { NATIVE_MINT, SOL_DECIMALS, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from './constants.js';
8
+ import { decodeInstruction } from './decode.js';
9
+ import { classify, describe } from './describe.js';
10
+ import { formatUnits, parseMint } from './layout.js';
11
+ import { BPF_LOADER_UPGRADEABLE, COMPUTE_BUDGET, PROGRAMS, programErrorName } from './programs.js';
12
+ import { MAX_ACCOUNT_LOCKS, PACKET_DATA_SIZE, compileMessage, parseMessage, serializeTransaction, splitTransaction, transactionSize, normalizeInstruction, } from './write/transaction.js';
13
+ const U64_HALF = 1n << 63n;
14
+ const HIGH_FEE_LAMPORTS = 10000000n;
15
+ const short = (a) => `${a.slice(0, 4)}…${a.slice(-4)}`;
16
+ function build(input, options) {
17
+ if (typeof input === 'string')
18
+ return { bytes: base64.decode(input), owner: options.owner, expected: [...(options.signers ?? [])] };
19
+ if (input instanceof Uint8Array)
20
+ return { bytes: input, owner: options.owner, expected: [...(options.signers ?? [])] };
21
+ let payer;
22
+ let list;
23
+ let expected = [...(options.signers ?? [])];
24
+ if (Array.isArray(input)) {
25
+ const calls = input;
26
+ payer = calls[0]?.owner;
27
+ list = calls.flatMap((c) => [...c.instructions]);
28
+ expected.push(...calls.map((c) => c.owner));
29
+ }
30
+ else if ('steps' in input) {
31
+ payer = input.owner;
32
+ const steps = options.step === undefined ? input.steps : input.steps.filter((_, i) => i === options.step);
33
+ list = steps.flatMap((s) => [...s.instructions]);
34
+ expected.push(...(input.signers ?? []).map((s) => s.address));
35
+ }
36
+ else {
37
+ payer = input.feePayer ?? input.owner;
38
+ const ix = input.instructions;
39
+ list = Array.isArray(ix) ? [...ix] : [ix];
40
+ }
41
+ payer = options.owner ?? payer;
42
+ if (!payer || !isAddress(payer))
43
+ throw new Error('Simulation needs a valid owner / feePayer address');
44
+ const instructions = list.map(normalizeInstruction);
45
+ const hasLimit = instructions.some((ix) => ix.programId === COMPUTE_BUDGET && ix.data[0] === 2);
46
+ const withLimit = hasLimit ? instructions : [{ programId: COMPUTE_BUDGET, keys: [], data: new Uint8Array([2, 0xc0, 0x5c, 0x15, 0x00]) }, ...instructions];
47
+ const message = compileMessage(payer, withLimit, SYSTEM_PROGRAM_ID);
48
+ if (transactionSize(message) > PACKET_DATA_SIZE || message.accountKeys.length > MAX_ACCOUNT_LOCKS) {
49
+ throw new Error('The instructions do not fit in one transaction; simulate the steps one by one with the `step` option');
50
+ }
51
+ return { bytes: serializeTransaction(message, message.signers.map(() => null)), owner: payer, expected: [payer, ...expected] };
52
+ }
53
+ /** 解析交易:地址查找表里的账户读表补上(静态账户 + 表里可写的 + 表里只读的) */
54
+ async function resolveTransaction(client, bytes, signal) {
55
+ if (((bytes[0] ?? 0) & 0x80) !== 0)
56
+ throw new Error('Unsupported transaction format (v1): only legacy and v0 transactions can be simulated');
57
+ const { message } = splitTransaction(bytes);
58
+ const parsed = parseMessage(message);
59
+ const loadedWritable = [];
60
+ const loadedReadonly = [];
61
+ if (parsed.lookups.length) {
62
+ const tables = await client.accounts(parsed.lookups.map((l) => l.table), { signal });
63
+ parsed.lookups.forEach((l, i) => {
64
+ const data = tables[i]?.data;
65
+ if (!data)
66
+ throw new Error(`Address lookup table not found: ${l.table}`);
67
+ const at = (index) => {
68
+ const start = 56 + 32 * index;
69
+ if (start + 32 > data.length)
70
+ throw new Error(`Address lookup table ${l.table} has no entry ${index}`);
71
+ return encodeAddress(data.slice(start, start + 32));
72
+ };
73
+ loadedWritable.push(...l.writable.map(at));
74
+ loadedReadonly.push(...l.readonly.map(at));
75
+ });
76
+ }
77
+ const keys = [...parsed.staticKeys, ...loadedWritable, ...loadedReadonly];
78
+ const key = (i) => {
79
+ const k = keys[i];
80
+ if (k === undefined)
81
+ throw new Error('Invalid transaction: bad account index');
82
+ return k;
83
+ };
84
+ return {
85
+ version: parsed.version,
86
+ signers: parsed.staticKeys.slice(0, parsed.signatures),
87
+ keys,
88
+ writable: new Set([...parsed.writable, ...loadedWritable]),
89
+ instructions: parsed.instructions.map((ix) => ({ programId: ix.programId, accounts: ix.accounts.map(key), data: ix.data })),
90
+ };
91
+ }
92
+ function tokenState(snap) {
93
+ const d = snap?.data;
94
+ if (!snap || !d || (snap.owner !== TOKEN_PROGRAM_ID && snap.owner !== TOKEN_2022_PROGRAM_ID))
95
+ return null;
96
+ if (d.length !== 165 && !(d.length > 165 && d[165] === 2))
97
+ return null;
98
+ const view = new DataView(d.buffer, d.byteOffset, d.byteLength);
99
+ const key = (o) => encodeAddress(d.slice(o, o + 32));
100
+ if (d[108] === 0)
101
+ return null;
102
+ return {
103
+ mint: key(0),
104
+ owner: key(32),
105
+ amount: view.getBigUint64(64, true),
106
+ delegate: view.getUint32(72, true) === 1 ? key(76) : null,
107
+ delegatedAmount: view.getBigUint64(121, true),
108
+ closeAuthority: view.getUint32(129, true) === 1 ? key(133) : null,
109
+ };
110
+ }
111
+ function mintAuthorities(snap) {
112
+ if (!snap || (snap.owner !== TOKEN_PROGRAM_ID && snap.owner !== TOKEN_2022_PROGRAM_ID))
113
+ return null;
114
+ try {
115
+ const m = parseMint(snap.data);
116
+ return { mintAuthority: m.mintAuthority, freezeAuthority: m.freezeAuthority };
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ // ---- 错误 ----
123
+ const TX_ERRORS = {
124
+ InsufficientFundsForFee: 'insufficient SOL for the transaction fee',
125
+ AccountNotFound: 'fee payer account not found (it has no SOL)',
126
+ BlockhashNotFound: 'blockhash not found',
127
+ AccountInUse: 'account in use',
128
+ };
129
+ /** 失败原因:Anchor 日志的错误名 > 程序错误码(按失败的程序查表)> 日志里程序打印的说明 > 错误本身 */
130
+ export function failureText(err, logs, ixs) {
131
+ if (typeof err === 'string')
132
+ return TX_ERRORS[err] ?? err;
133
+ const ie = err?.InstructionError;
134
+ if (!ie) {
135
+ if (err?.InsufficientFundsForRent)
136
+ return 'account would be left with less SOL than the rent-exempt minimum';
137
+ return JSON.stringify(err);
138
+ }
139
+ const [index, reason] = ie;
140
+ const at = ixs[index];
141
+ const where = at ? `instruction ${index} (${at.program ?? short(at.programId)}${at.method ? ` ${at.method}` : ''})` : `instruction ${index}`;
142
+ const reversed = [...logs].reverse();
143
+ const anchor = reversed.find((l) => /AnchorError/.test(l));
144
+ const anchorText = anchor && /Error Code: (\w+)\. Error Number: (\d+)\. Error Message: (.*?)\.?$/.exec(anchor);
145
+ if (anchorText)
146
+ return `${where} failed: ${anchorText[1]} (${anchorText[2]}): ${anchorText[3]}`;
147
+ const custom = reason?.Custom;
148
+ if (custom !== undefined) {
149
+ const failed = reversed.map((l) => /^Program (\w+) failed: custom program error/.exec(l)?.[1]).find(Boolean) ?? at?.programId;
150
+ const name = programErrorName(failed, custom);
151
+ const detail = reversed.find((l) => /^Program log: (Error|error)/.test(l))?.replace(/^Program log: /, '');
152
+ return `${where} failed: ${name ?? `custom program error 0x${custom.toString(16)}`}${name ? ` (0x${custom.toString(16)})` : ''}${detail ? ` - ${detail}` : ''}`;
153
+ }
154
+ const plain = reversed.find((l) => !l.startsWith('Program ') || /^Program log: /.test(l))?.replace(/^Program log: /, '');
155
+ return `${where} failed: ${typeof reason === 'string' ? reason : JSON.stringify(reason)}${plain ? ` - ${plain}` : ''}`;
156
+ }
157
+ /**
158
+ * 模拟一笔交易,不需要签名、不会发送。输入:base64 / 字节的交易,或本库构建器的输出
159
+ * (buildSwap / buildAddLiquidity… 的计划、`{ owner, instructions }`、buildRevokes / buildCloses 的结果)
160
+ */
161
+ export async function simulate(client, input, options = {}) {
162
+ const { signal } = options;
163
+ const built = build(input, options);
164
+ const tx = await resolveTransaction(client, built.bytes, signal);
165
+ const wallet = built.owner ?? tx.signers[0];
166
+ if (!wallet)
167
+ throw new Error('Transaction has no signer');
168
+ const decodedIxs = tx.instructions.map((ix, i) => decodeInstruction(i, ix.programId, ix.accounts, ix.data));
169
+ // 要看前后状态的账户:钱包、额外要看的、交易里可写的里和钱包有关的(新建的账户、钱包的代币账户、mint);
170
+ // 公共节点的 simulateTransaction 一次最多返回 10 个账户(publicnode),所以先读前状态筛一遍,不够再分批模拟
171
+ const candidates = [...new Set([wallet, ...(options.watch ?? []).filter(isAddress), ...tx.keys.filter((k) => tx.writable.has(k))])];
172
+ const preAll = await client.accounts(candidates, { signal });
173
+ const keep = (address, i) => {
174
+ const before = preAll[i];
175
+ if (address === wallet || options.watch?.includes(address) || !before)
176
+ return true;
177
+ return tokenState(before)?.owner === wallet || mintAuthorities(before) !== null;
178
+ };
179
+ const watch = candidates.filter(keep);
180
+ const pre = watch.map((a) => preAll[candidates.indexOf(a)] ?? null);
181
+ const raw = base64.encode(built.bytes);
182
+ const run = (addresses) => client.request('simulateTransaction', [raw, { encoding: 'base64', sigVerify: false, replaceRecentBlockhash: true, commitment: 'confirmed', accounts: { encoding: 'base64', addresses } }], { signal });
183
+ let sim;
184
+ try {
185
+ sim = await run(watch);
186
+ }
187
+ catch (err) {
188
+ const max = Number(/maximum of (\d+) accounts/i.exec(err instanceof Error ? err.message : '')?.[1]);
189
+ if (!(max >= 1))
190
+ throw err;
191
+ const chunks = Array.from({ length: Math.ceil(watch.length / max) }, (_, i) => watch.slice(i * max, (i + 1) * max));
192
+ const parts = await Promise.all(chunks.map(run));
193
+ sim = { value: { ...parts[0].value, accounts: parts.every((x) => x.value.accounts) ? parts.flatMap((x) => x.value.accounts ?? []) : null } };
194
+ }
195
+ const value = sim.value;
196
+ const logs = value.logs ?? [];
197
+ const success = !value.err;
198
+ const post = success && value.accounts ? value.accounts.map((a) => (a ? { lamports: BigInt(a.lamports), owner: a.owner, data: base64.decode(a.data[0]) } : null)) : null;
199
+ const preAt = (i) => {
200
+ const a = pre[i];
201
+ return a ? { lamports: a.lamports, owner: a.owner, data: a.data } : null;
202
+ };
203
+ // 手续费:签名费 + 计算单元上限 × 单价
204
+ let limit = null;
205
+ let price = 0n;
206
+ for (const ix of tx.instructions) {
207
+ if (ix.programId !== COMPUTE_BUDGET)
208
+ continue;
209
+ const view = new DataView(ix.data.buffer, ix.data.byteOffset, ix.data.byteLength);
210
+ if (ix.data[0] === 2 && ix.data.length >= 5)
211
+ limit = BigInt(view.getUint32(1, true));
212
+ if (ix.data[0] === 3 && ix.data.length >= 9)
213
+ price = view.getBigUint64(1, true);
214
+ }
215
+ const nonBudget = tx.instructions.filter((ix) => ix.programId !== COMPUTE_BUDGET).length;
216
+ const units = BigInt(Math.min(1_400_000, limit !== null ? Number(limit) : 200_000 * nonBudget));
217
+ const fee = 5000n * BigInt(tx.signers.length) + (price * units + 999999n) / 1000000n;
218
+ const feePayer = tx.signers[0];
219
+ const warnings = [];
220
+ const warn = (code, severity, message, address) => warnings.push({ code, severity, message, address });
221
+ const approvalChanges = [];
222
+ const tokenDeltas = new Map();
223
+ let nativeDelta = 0n;
224
+ const mints = new Set();
225
+ if (post) {
226
+ watch.forEach((address, i) => {
227
+ const before = preAt(i);
228
+ const after = post[i] ?? null;
229
+ if (address === wallet) {
230
+ nativeDelta = (after?.lamports ?? 0n) - (before?.lamports ?? 0n);
231
+ if (before && after && before.owner === SYSTEM_PROGRAM_ID && after.owner !== SYSTEM_PROGRAM_ID) {
232
+ approvalChanges.push({ kind: 'authority-changed', account: address, authorityType: 'AccountOwner', authority: after.owner, previousAuthority: before.owner });
233
+ }
234
+ }
235
+ const a = tokenState(before);
236
+ const b = tokenState(after);
237
+ const mine = (t) => t?.owner === wallet;
238
+ const mint = (a ?? b)?.mint;
239
+ if (mint && (mine(a) || mine(b))) {
240
+ mints.add(mint);
241
+ tokenDeltas.set(mint, (tokenDeltas.get(mint) ?? 0n) + (mine(b) ? b.amount : 0n) - (mine(a) ? a.amount : 0n));
242
+ const common = { account: address, mint, owner: wallet };
243
+ if (a && !b) {
244
+ approvalChanges.push({ ...common, kind: 'account-closed', balance: a.amount.toString() });
245
+ }
246
+ else if (b) {
247
+ const unlimited = b.delegatedAmount >= U64_HALF;
248
+ if (b.delegate && !a?.delegate)
249
+ approvalChanges.push({ ...common, kind: 'delegate-set', delegate: b.delegate, previousDelegate: null, amount: b.delegatedAmount.toString(), unlimited });
250
+ else if (b.delegate && a?.delegate && (a.delegate !== b.delegate || b.delegatedAmount > a.delegatedAmount)) {
251
+ approvalChanges.push({ ...common, kind: 'delegate-changed', delegate: b.delegate, previousDelegate: a.delegate, amount: b.delegatedAmount.toString(), unlimited });
252
+ }
253
+ else if (!b.delegate && a?.delegate)
254
+ approvalChanges.push({ ...common, kind: 'delegate-revoked', delegate: null, previousDelegate: a.delegate, amount: '0' });
255
+ if (a && a.owner !== b.owner)
256
+ approvalChanges.push({ ...common, kind: 'authority-changed', authorityType: 'AccountOwner', authority: b.owner, previousAuthority: a.owner });
257
+ if (a && a.closeAuthority !== b.closeAuthority) {
258
+ approvalChanges.push({ ...common, kind: 'authority-changed', authorityType: 'CloseAccount', authority: b.closeAuthority, previousAuthority: a.closeAuthority });
259
+ }
260
+ }
261
+ }
262
+ const ma = mintAuthorities(before);
263
+ const mb = mintAuthorities(after);
264
+ if (ma && mb) {
265
+ for (const [type, field] of [['MintTokens', 'mintAuthority'], ['FreezeAccount', 'freezeAuthority']]) {
266
+ if (ma[field] !== mb[field])
267
+ approvalChanges.push({ kind: 'authority-changed', account: address, mint: address, authorityType: type, authority: mb[field], previousAuthority: ma[field] });
268
+ }
269
+ }
270
+ });
271
+ }
272
+ else {
273
+ // 没有模拟后的状态(模拟失败):只能按指令判断授权
274
+ for (const ix of decodedIxs) {
275
+ const args = ix.args;
276
+ if (ix.method === 'approve' || ix.method === 'approveChecked') {
277
+ approvalChanges.push({ kind: 'delegate-set', account: args?.account, mint: args?.mint ?? undefined, owner: args?.owner, delegate: args?.delegate, amount: args?.amount, unlimited: BigInt(args?.amount ?? 0) >= U64_HALF });
278
+ }
279
+ else if (ix.method === 'setAuthority') {
280
+ approvalChanges.push({ kind: 'authority-changed', account: args?.account, authorityType: args?.authorityType, authority: args?.newAuthority });
281
+ }
282
+ }
283
+ }
284
+ for (const ix of decodedIxs) {
285
+ const args = ix.args;
286
+ if (ix.method === 'closeAccount') {
287
+ const closed = approvalChanges.find((c) => c.kind === 'account-closed' && c.account === args?.account);
288
+ if (closed)
289
+ closed.destination = args?.destination;
290
+ }
291
+ }
292
+ // 余额变化:钱包的 SOL(不含手续费)和代币,Wrapped SOL 并入 SOL
293
+ const balanceChanges = [];
294
+ if (post) {
295
+ const wsol = tokenDeltas.get(NATIVE_MINT) ?? 0n;
296
+ tokenDeltas.delete(NATIVE_MINT);
297
+ mints.delete(NATIVE_MINT);
298
+ const sol = nativeDelta + (feePayer === wallet ? fee : 0n) + wsol;
299
+ if (sol !== 0n)
300
+ balanceChanges.push({ address: wallet, asset: 'native', symbol: 'SOL', decimals: SOL_DECIMALS, delta: sol.toString(), formatted: formatUnits(sol, SOL_DECIMALS) });
301
+ const ids = [...tokenDeltas.entries()].filter(([, v]) => v !== 0n);
302
+ const details = ids.length
303
+ ? await client.tokens(ids.map(([m]) => m), { fields: ['symbol', 'decimals'], signal }).catch(() => null)
304
+ : [];
305
+ if (!details)
306
+ warn('metadata-unavailable', 'info', 'Token symbols / decimals could not be read');
307
+ ids.forEach(([mint, delta], i) => {
308
+ const detail = details?.[i];
309
+ const decimals = detail?.decimals ?? 0;
310
+ balanceChanges.push({ address: wallet, asset: mint, symbol: detail?.symbol ?? short(mint), decimals, delta: delta.toString(), formatted: formatUnits(delta, decimals) });
311
+ });
312
+ }
313
+ const kind = classify(decodedIxs, balanceChanges);
314
+ const recipient = decodedIxs.find((ix) => ix.type === 'transfer')?.args;
315
+ const decoded = {
316
+ type: kind?.type ?? 'unknown',
317
+ protocol: kind?.protocol,
318
+ method: kind?.method,
319
+ summary: describe(kind, decodedIxs, balanceChanges, recipient?.to ?? recipient?.destination),
320
+ inferred: kind?.inferred,
321
+ instructions: decodedIxs,
322
+ };
323
+ // ---- 警告 ----
324
+ if (!success)
325
+ warn('simulation-failed', 'warn', 'The transaction fails in simulation');
326
+ for (const c of approvalChanges) {
327
+ if (c.kind === 'delegate-set' || c.kind === 'delegate-changed') {
328
+ warn(c.unlimited ? 'unlimited-delegate' : 'delegate-approved', c.unlimited ? 'danger' : 'warn', `${short(c.delegate)} can spend ${c.unlimited ? 'an unlimited amount of' : c.amount} of the tokens in ${short(c.account)}`, c.delegate);
329
+ }
330
+ else if (c.kind === 'authority-changed') {
331
+ const sev = c.authorityType === 'AccountOwner' || c.authorityType === 'CloseAccount' ? 'danger' : 'warn';
332
+ warn('authority-changed', sev, `${c.authorityType} authority of ${short(c.account)} changes to ${c.authority ? short(c.authority) : 'none'}`, c.authority ?? undefined);
333
+ }
334
+ else if (c.kind === 'account-closed' && c.destination && c.destination !== wallet) {
335
+ warn('close-to-other', 'warn', `Closing ${short(c.account)}${c.balance && c.balance !== '0' ? ` (balance ${c.balance})` : ''} sends its lamports to ${short(c.destination)}`, c.destination);
336
+ }
337
+ }
338
+ for (const ix of decodedIxs) {
339
+ if (ix.method === 'assign' || ix.method === 'assignWithSeed')
340
+ warn('assign-owner', 'danger', `Assigns ${short(String(ix.args?.account))} to another program`, String(ix.args?.account));
341
+ if (ix.programId === BPF_LOADER_UPGRADEABLE && (ix.method === 'upgrade' || ix.method === 'setAuthority'))
342
+ warn('program-upgrade', 'danger', `Program loader instruction: ${ix.method}`);
343
+ }
344
+ const unknown = new Set(decodedIxs.filter((ix) => !PROGRAMS[ix.programId]).map((ix) => ix.programId));
345
+ for (const program of unknown)
346
+ warn('unknown-program', 'warn', `Calls an unrecognized program ${short(program)}`, program);
347
+ const expected = new Set(built.expected.length ? built.expected : [wallet]);
348
+ expected.add(wallet);
349
+ for (const s of tx.signers) {
350
+ if (!expected.has(s))
351
+ warn('unexpected-signer', 'warn', `The transaction also needs a signature from ${short(s)}`, s);
352
+ }
353
+ if (!tx.signers.includes(wallet))
354
+ warn('wallet-not-signer', 'info', `${short(wallet)} does not sign this transaction`, wallet);
355
+ if (fee > HIGH_FEE_LAMPORTS)
356
+ warn('high-fee', 'warn', `Network fee is ${formatUnits(fee, SOL_DECIMALS)} SOL`);
357
+ if (post) {
358
+ const walletPre = preAt(watch.indexOf(wallet))?.lamports ?? 0n;
359
+ const spent = -(nativeDelta + (feePayer === wallet ? fee : 0n));
360
+ if (walletPre > 0n && spent > 0n && spent * 10n >= walletPre * 9n)
361
+ warn('drains-balance', 'warn', 'Spends 90% or more of the wallet SOL balance', wallet);
362
+ watch.forEach((address, i) => {
363
+ if (address === wallet)
364
+ return;
365
+ const before = preAt(i);
366
+ const after = post[i] ?? null;
367
+ const isDestination = decodedIxs.some((ix) => (ix.method === 'transfer' || ix.method === 'transferWithSeed') && ix.programId === SYSTEM_PROGRAM_ID && ix.args?.to === address);
368
+ if (isDestination && (!before || before.lamports === 0n))
369
+ warn('new-recipient', 'warn', `${short(address)} has never held SOL (new account)`, address);
370
+ const t = tokenState(after);
371
+ if (!before && t && t.owner !== wallet && decodedIxs.some((ix) => ix.type === 'transfer' && ix.args?.destination === address)) {
372
+ warn('new-recipient', 'warn', `${short(t.owner)} did not have a token account for this mint yet`, t.owner);
373
+ }
374
+ });
375
+ }
376
+ const result = {
377
+ success,
378
+ ...(success ? {} : { error: failureText(value.err, logs, decodedIxs) }),
379
+ gasUsed: String(value.unitsConsumed ?? 0),
380
+ fee: fee.toString(),
381
+ balanceChanges,
382
+ approvalChanges,
383
+ decoded,
384
+ warnings,
385
+ logs,
386
+ signers: tx.signers,
387
+ version: tx.version,
388
+ };
389
+ // ---- 可选:价格、风险(按需加载) ----
390
+ const assets = balanceChanges.map((c) => (c.asset === 'native' ? NATIVE_MINT : c.asset));
391
+ if (options.prices && balanceChanges.length) {
392
+ const { tokenPrices } = await import('./price.js');
393
+ const sources = Array.isArray(options.prices) ? { sources: options.prices } : {};
394
+ const prices = await tokenPrices(client, assets, { ...sources, signal, fetch: options.fetch }).catch(() => null);
395
+ balanceChanges.forEach((c, i) => {
396
+ const p = prices?.[i]?.price;
397
+ c.usd = p == null ? null : Number(c.formatted) * p;
398
+ });
399
+ }
400
+ if (options.risk) {
401
+ const tokens = [...mints].filter((m) => balanceChanges.some((c) => c.asset === m));
402
+ if (tokens.length) {
403
+ const { tokenRisks } = await import('./risk.js');
404
+ const risks = await tokenRisks(client, tokens, { signal }).catch(() => null);
405
+ if (risks) {
406
+ result.risks = Object.fromEntries(risks.map((r) => [r.mint, r.flags]));
407
+ const severe = ['permanent-delegate', 'transfer-hook', 'high-transfer-fee', 'non-transferable', 'default-frozen', 'paused', 'not-found'];
408
+ for (const r of risks) {
409
+ const hit = r.flags.filter((f) => severe.includes(f));
410
+ if (hit.length)
411
+ warn('token-risk', 'warn', `${short(r.mint)}: ${hit.join(', ')}`, r.mint);
412
+ }
413
+ }
414
+ }
415
+ }
416
+ return result;
417
+ }
418
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 授权管理(子路径 `@w3lib/solana-batch-call/approvals`):批量查地址的代币账户给出的授权(delegate)、可以关闭回收租金的空账户,
3
+ * 批量撤销 / 关闭。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
4
+ *
5
+ * ```ts
6
+ * import { closeTokenAccounts, getApprovals, revokeApprovals } from '@w3lib/solana-batch-call/approvals'
7
+ *
8
+ * const list = await getApprovals(owner, { mints: [USDC, BONK] })
9
+ * await revokeApprovals(client, key, list)
10
+ * await closeTokenAccounts(client, key, list.filter((a) => a.amount === '0'))
11
+ * ```
12
+ */
13
+ import { type ApprovalsQuery, type TokenAccountApproval } from '../approvals.js';
14
+ import { type ShortcutOptions } from '../shortcuts.js';
15
+ export { approvals, buildCloses, buildRevokes, closeTokenAccounts, parseTokenAccountState, revokeApprovals, type ApprovalCall, type ApprovalResult, type ApprovalsQuery, type BuildClosesOptions, type CloseAccountsOptions, type CloseBlocker, type TokenAccountApproval, } from '../approvals.js';
16
+ export { closeAccount, harvestWithheldTokensToMint, revoke } from '../write/instructions.js';
17
+ export interface GetApprovalsOptions extends ApprovalsQuery, ShortcutOptions {
18
+ }
19
+ /**
20
+ * 查地址的代币账户给出的授权和可以关闭的空账户,节点参数与 getBalances 相同。
21
+ *
22
+ * ```ts
23
+ * await getApprovals(owner, { mints: [USDC, BONK] }) // 指定代币:读 ATA,免费公共节点也能用
24
+ * await getApprovals(owner, { provider: 'https://my-rpc…' }) // 全部代币账户:需要支持 getTokenAccountsByOwner 的节点
25
+ * // [{ account, mint: USDC, symbol: 'USDC', delegate: 'GYFk…', delegatedAmount: '6993125', revocable: true, closable: false, closeBlocker: 'balance', … }]
26
+ * ```
27
+ */
28
+ export declare function getApprovals(owner: string, options?: GetApprovalsOptions): Promise<TokenAccountApproval[]>;
29
+ //# sourceMappingURL=approvals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAa,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAE5F,MAAM,WAAW,mBAAoB,SAAQ,cAAc,EAAE,eAAe;CAAG;AAE/E;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAG9G"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 授权管理(子路径 `@w3lib/solana-batch-call/approvals`):批量查地址的代币账户给出的授权(delegate)、可以关闭回收租金的空账户,
3
+ * 批量撤销 / 关闭。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
4
+ *
5
+ * ```ts
6
+ * import { closeTokenAccounts, getApprovals, revokeApprovals } from '@w3lib/solana-batch-call/approvals'
7
+ *
8
+ * const list = await getApprovals(owner, { mints: [USDC, BONK] })
9
+ * await revokeApprovals(client, key, list)
10
+ * await closeTokenAccounts(client, key, list.filter((a) => a.amount === '0'))
11
+ * ```
12
+ */
13
+ import { approvals } from '../approvals.js';
14
+ import { resolve } from '../shortcuts.js';
15
+ export { approvals, buildCloses, buildRevokes, closeTokenAccounts, parseTokenAccountState, revokeApprovals, } from '../approvals.js';
16
+ export { closeAccount, harvestWithheldTokensToMint, revoke } from '../write/instructions.js';
17
+ /**
18
+ * 查地址的代币账户给出的授权和可以关闭的空账户,节点参数与 getBalances 相同。
19
+ *
20
+ * ```ts
21
+ * await getApprovals(owner, { mints: [USDC, BONK] }) // 指定代币:读 ATA,免费公共节点也能用
22
+ * await getApprovals(owner, { provider: 'https://my-rpc…' }) // 全部代币账户:需要支持 getTokenAccountsByOwner 的节点
23
+ * // [{ account, mint: USDC, symbol: 'USDC', delegate: 'GYFk…', delegatedAmount: '6993125', revocable: true, closable: false, closeBlocker: 'balance', … }]
24
+ * ```
25
+ */
26
+ export function getApprovals(owner, options = {}) {
27
+ const { client, own } = resolve(options, ['mints', 'all', 'signal']);
28
+ return approvals(client, owner, own);
29
+ }
30
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,SAAS,EAAkD,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAQhB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAI5F;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAA+B,EAAE;IAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpE,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 批量领取(子路径 `@w3lib/solana-batch-call/claim`):Orca Whirlpool、Raydium CLMM 仓位的未领取手续费和挖矿奖励(农场奖励)。
3
+ * 先只读预览(每个仓位能领多少、美元价值),再把全部(或选中的)仓位的领取指令打包成交易,发送前用 /simulate 模拟。
4
+ * 不放在主入口,不用时打包不会带上这部分代码;指令来自 /liquidity 的 collectFees。
5
+ *
6
+ * ```ts
7
+ * import { claimAll, getClaimable } from '@w3lib/solana-batch-call/claim'
8
+ *
9
+ * const c = await getClaimable(owner, { provider: 'https://my-rpc…' }) // 预览,不发交易
10
+ * c.totalUsd // 全部能领的美元价值
11
+ * await claimAll(client, key, c.positions) // 批量领取
12
+ * ```
13
+ */
14
+ import { type Claimable, type ClaimQuery } from '../claim.js';
15
+ import { type ShortcutOptions } from '../shortcuts.js';
16
+ export { buildClaimAll, claimAll, claimable, simulateClaim, type BuildClaimOptions, type ClaimCall, type ClaimCallResult, type ClaimOptions, type ClaimPlan, type ClaimProtocol, type ClaimQuery, type ClaimResult, type ClaimSimulation, type ClaimTarget, type Claimable, type ClaimableAmount, type ClaimablePosition, } from '../claim.js';
17
+ export type { PlanSimulation } from '../batchPlan.js';
18
+ export interface GetClaimableOptions extends ClaimQuery, ShortcutOptions {
19
+ }
20
+ /**
21
+ * 预览一个地址能领取的手续费和挖矿奖励(只读取),节点参数与 getBalances 相同。默认列出全部代币账户(需要支持 getTokenAccountsByOwner 的节点),
22
+ * 免费公共节点传 `mints`(仓位 NFT 的 mint)只看指定仓位。
23
+ *
24
+ * ```ts
25
+ * const c = await getClaimable(owner, { provider: 'https://my-rpc…' })
26
+ * // { totalUsd: 345.6, tokens: [{ symbol: 'SOL', formatted: '1.627', usd: 290 }, { symbol: 'RAY', formatted: '0.0427', usd: 0.08 }, …],
27
+ * // positions: [{ protocol: 'raydium-clmm', positionMint, fees: [{ symbol: 'SOL', … }, { symbol: 'USDC', … }], rewards: [{ index: 0, symbol: 'RAY', … }], totalUsd: 345.6 }] }
28
+ * ```
29
+ */
30
+ export declare function getClaimable(owner: string, options?: GetClaimableOptions): Promise<Claimable>;
31
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/subpaths/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,WAAW,mBAAoB,SAAQ,UAAU,EAAE,eAAe;CAAG;AAE3E;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAGjG"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 批量领取(子路径 `@w3lib/solana-batch-call/claim`):Orca Whirlpool、Raydium CLMM 仓位的未领取手续费和挖矿奖励(农场奖励)。
3
+ * 先只读预览(每个仓位能领多少、美元价值),再把全部(或选中的)仓位的领取指令打包成交易,发送前用 /simulate 模拟。
4
+ * 不放在主入口,不用时打包不会带上这部分代码;指令来自 /liquidity 的 collectFees。
5
+ *
6
+ * ```ts
7
+ * import { claimAll, getClaimable } from '@w3lib/solana-batch-call/claim'
8
+ *
9
+ * const c = await getClaimable(owner, { provider: 'https://my-rpc…' }) // 预览,不发交易
10
+ * c.totalUsd // 全部能领的美元价值
11
+ * await claimAll(client, key, c.positions) // 批量领取
12
+ * ```
13
+ */
14
+ import { claimable } from '../claim.js';
15
+ import { resolve } from '../shortcuts.js';
16
+ export { buildClaimAll, claimAll, claimable, simulateClaim, } from '../claim.js';
17
+ /**
18
+ * 预览一个地址能领取的手续费和挖矿奖励(只读取),节点参数与 getBalances 相同。默认列出全部代币账户(需要支持 getTokenAccountsByOwner 的节点),
19
+ * 免费公共节点传 `mints`(仓位 NFT 的 mint)只看指定仓位。
20
+ *
21
+ * ```ts
22
+ * const c = await getClaimable(owner, { provider: 'https://my-rpc…' })
23
+ * // { totalUsd: 345.6, tokens: [{ symbol: 'SOL', formatted: '1.627', usd: 290 }, { symbol: 'RAY', formatted: '0.0427', usd: 0.08 }, …],
24
+ * // positions: [{ protocol: 'raydium-clmm', positionMint, fees: [{ symbol: 'SOL', … }, { symbol: 'USDC', … }], rewards: [{ index: 0, symbol: 'RAY', … }], totalUsd: 345.6 }] }
25
+ * ```
26
+ */
27
+ export function getClaimable(owner, options = {}) {
28
+ const { client, own } = resolve(options, ['mints', 'protocols', 'prices', 'now', 'signal']);
29
+ return claimable(client, owner, { ...own, ...(options.fetch ? { fetch: options.fetch } : {}) });
30
+ }
31
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/subpaths/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAmC,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,aAAa,GAcd,MAAM,aAAa,CAAA;AAKpB;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAA+B,EAAE;IAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC3F,OAAO,SAAS,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;AACjG,CAAC"}