@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,175 @@
1
+ /**
2
+ * 常见程序的名字、指令名(Anchor 程序按 sha256("global:<name>") 的前 8 字节识别)和自定义错误码,
3
+ * 给 /simulate 和 /history 说明交易在做什么。只收录认得准的,其他程序只显示地址
4
+ */
5
+ import { sha256 } from '@noble/hashes/sha2.js';
6
+ import { ASSOCIATED_TOKEN_PROGRAM_ID, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, } from './constants.js';
7
+ // 与 lp.ts 里的同名常量相同;这里不 import 它,避免 /simulate、/history 把整个 LP 模块打进来
8
+ const RAYDIUM_CLMM_PROGRAM_ID = 'CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK';
9
+ const ORCA_WHIRLPOOL_PROGRAM_ID = 'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc';
10
+ const RAYDIUM_AMM_PROGRAM_ID = '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8';
11
+ const RAYDIUM_CPMM_PROGRAM_ID = 'CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C';
12
+ export const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
13
+ export const MEMO_V2 = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';
14
+ export const MEMO_V1 = 'Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo';
15
+ export const BPF_LOADER_UPGRADEABLE = 'BPFLoaderUpgradeab1e11111111111111111111111';
16
+ const p = (name, protocol = name) => ({ name, protocol });
17
+ const b = (name) => ({ name, builtin: true });
18
+ export const PROGRAMS = {
19
+ [SYSTEM_PROGRAM_ID]: b('System Program'),
20
+ [TOKEN_PROGRAM_ID]: b('SPL Token'),
21
+ [TOKEN_2022_PROGRAM_ID]: b('Token-2022'),
22
+ [ASSOCIATED_TOKEN_PROGRAM_ID]: b('Associated Token Account'),
23
+ [COMPUTE_BUDGET]: b('Compute Budget'),
24
+ [MEMO_V2]: b('Memo'),
25
+ [MEMO_V1]: b('Memo'),
26
+ [BPF_LOADER_UPGRADEABLE]: b('BPF Loader Upgradeable'),
27
+ AddressLookupTab1e1111111111111111111111111: b('Address Lookup Table'),
28
+ Stake11111111111111111111111111111111111111: b('Stake Program'),
29
+ Vote111111111111111111111111111111111111111: b('Vote Program'),
30
+ Ed25519SigVerify111111111111111111111111111: b('Ed25519 Program'),
31
+ KeccakSecp256k11111111111111111111111111111: b('Secp256k1 Program'),
32
+ metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s: b('Metaplex Token Metadata'),
33
+ JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4: p('Jupiter Aggregator v6', 'Jupiter'),
34
+ JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB: p('Jupiter Aggregator v4', 'Jupiter'),
35
+ DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M: p('Jupiter DCA', 'Jupiter'),
36
+ j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X: p('Jupiter Limit Order', 'Jupiter'),
37
+ jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu: p('Jupiter Limit Order v2', 'Jupiter'),
38
+ PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu: p('Jupiter Perpetuals', 'Jupiter'),
39
+ [RAYDIUM_AMM_PROGRAM_ID]: p('Raydium AMM v4', 'Raydium'),
40
+ [RAYDIUM_CLMM_PROGRAM_ID]: p('Raydium CLMM', 'Raydium'),
41
+ [RAYDIUM_CPMM_PROGRAM_ID]: p('Raydium CPMM', 'Raydium'),
42
+ routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS: p('Raydium Route', 'Raydium'),
43
+ [ORCA_WHIRLPOOL_PROGRAM_ID]: p('Orca Whirlpool', 'Orca'),
44
+ '9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP': p('Orca v2', 'Orca'),
45
+ LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo: p('Meteora DLMM', 'Meteora'),
46
+ Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB: p('Meteora Pools', 'Meteora'),
47
+ cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG: p('Meteora DAMM v2', 'Meteora'),
48
+ dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN: p('Meteora Dynamic Bonding Curve', 'Meteora'),
49
+ '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P': p('Pump.fun', 'Pump.fun'),
50
+ pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA: p('PumpSwap', 'Pump.fun'),
51
+ PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY: p('Phoenix'),
52
+ srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX: p('OpenBook v1', 'OpenBook'),
53
+ opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb: p('OpenBook v2', 'OpenBook'),
54
+ LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj: p('Lifinity v2', 'Lifinity'),
55
+ MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD: p('Marinade'),
56
+ MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA: p('marginfi v2', 'marginfi'),
57
+ KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD: p('Kamino Lending', 'Kamino'),
58
+ dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH: p('Drift v2', 'Drift'),
59
+ So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo: p('Solend'),
60
+ SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf: p('Squads v4', 'Squads'),
61
+ wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb: p('Wormhole Token Bridge', 'Wormhole'),
62
+ CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR: p('Candy Machine v3', 'Metaplex'),
63
+ Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g: p('Candy Guard', 'Metaplex'),
64
+ CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d: p('Metaplex Core', 'Metaplex'),
65
+ TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN: p('Tensor Swap', 'Tensor'),
66
+ M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K: p('Magic Eden v2', 'Magic Eden'),
67
+ };
68
+ /** 按指令名(snake_case)识别的 Anchor 程序:指令名 → 大类 */
69
+ const JUPITER_METHODS = {
70
+ ...Object.fromEntries(['route', 'route_with_token_ledger', 'shared_accounts_route', 'shared_accounts_route_with_token_ledger', 'exact_out_route', 'shared_accounts_exact_out_route'].map((n) => [n, 'swap'])),
71
+ set_token_ledger: 'setup',
72
+ };
73
+ const ANCHOR = {
74
+ JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4: JUPITER_METHODS,
75
+ JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB: JUPITER_METHODS,
76
+ dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN: { swap: 'swap', swap2: 'swap' },
77
+ CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR: { mint: 'mint', mint_v2: 'mint' },
78
+ Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g: { mint: 'mint', mint_v2: 'mint' },
79
+ [ORCA_WHIRLPOOL_PROGRAM_ID]: {
80
+ ...Object.fromEntries(['swap', 'swap_v2', 'two_hop_swap', 'two_hop_swap_v2'].map((n) => [n, 'swap'])),
81
+ ...Object.fromEntries([
82
+ 'increase_liquidity', 'increase_liquidity_v2', 'decrease_liquidity', 'decrease_liquidity_v2', 'open_position', 'open_position_with_metadata',
83
+ 'open_position_with_token_extensions', 'close_position', 'close_position_with_token_extensions', 'collect_fees', 'collect_fees_v2', 'collect_reward',
84
+ 'collect_reward_v2', 'open_bundled_position', 'close_bundled_position', 'increase_liquidity_by_token_amounts_v2',
85
+ ].map((n) => [n, 'liquidity'])),
86
+ initialize_tick_array: 'setup',
87
+ initialize_dynamic_tick_array: 'setup',
88
+ },
89
+ [RAYDIUM_CLMM_PROGRAM_ID]: {
90
+ ...Object.fromEntries(['swap', 'swap_v2', 'swap_router_base_in'].map((n) => [n, 'swap'])),
91
+ ...Object.fromEntries(['open_position', 'open_position_v2', 'open_position_with_token22_nft', 'increase_liquidity', 'increase_liquidity_v2', 'decrease_liquidity', 'decrease_liquidity_v2', 'close_position', 'collect_fund_fee'].map((n) => [n, 'liquidity'])),
92
+ },
93
+ [RAYDIUM_CPMM_PROGRAM_ID]: { swap_base_input: 'swap', swap_base_output: 'swap', deposit: 'liquidity', withdraw: 'liquidity' },
94
+ LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo: {
95
+ ...Object.fromEntries(['swap', 'swap_exact_out', 'swap_with_price_impact'].map((n) => [n, 'swap'])),
96
+ ...Object.fromEntries([
97
+ 'add_liquidity', 'add_liquidity_by_weight', 'add_liquidity_by_strategy', 'add_liquidity_by_strategy_one_side', 'add_liquidity_one_side', 'remove_liquidity',
98
+ 'remove_liquidity_by_range', 'remove_all_liquidity', 'claim_fee', 'claim_reward', 'close_position', 'initialize_position',
99
+ ].map((n) => [n, 'liquidity'])),
100
+ },
101
+ Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB: {
102
+ swap: 'swap',
103
+ add_balance_liquidity: 'liquidity',
104
+ add_imbalance_liquidity: 'liquidity',
105
+ remove_balance_liquidity: 'liquidity',
106
+ remove_liquidity_single_side: 'liquidity',
107
+ },
108
+ cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG: {
109
+ swap: 'swap',
110
+ swap2: 'swap',
111
+ add_liquidity: 'liquidity',
112
+ remove_liquidity: 'liquidity',
113
+ remove_all_liquidity: 'liquidity',
114
+ claim_position_fee: 'liquidity',
115
+ create_position: 'liquidity',
116
+ close_position: 'liquidity',
117
+ },
118
+ '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P': { buy: 'swap', sell: 'swap', create: 'mint', create_v2: 'mint' },
119
+ pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA: { buy: 'swap', sell: 'swap', deposit: 'liquidity', withdraw: 'liquidity', create_pool: 'liquidity' },
120
+ };
121
+ /** Raydium AMM v4:第一个字节是指令编号 */
122
+ const AMM_V4 = {
123
+ 3: ['deposit', 'liquidity'],
124
+ 4: ['withdraw', 'liquidity'],
125
+ 9: ['swapBaseIn', 'swap'],
126
+ 11: ['swapBaseOut', 'swap'],
127
+ 16: ['swapBaseInV2', 'swap'],
128
+ 17: ['swapBaseOutV2', 'swap'],
129
+ };
130
+ let discriminators;
131
+ const hex = (bytes) => Array.from(bytes, (x) => x.toString(16).padStart(2, '0')).join('');
132
+ /** 认得的程序指令:返回指令名和大类;不认识的指令(程序认得)返回 null */
133
+ export function knownMethod(programId, data) {
134
+ if (programId === RAYDIUM_AMM_PROGRAM_ID)
135
+ return AMM_V4[data[0]] ?? null;
136
+ const methods = ANCHOR[programId];
137
+ if (!methods || data.length < 8)
138
+ return null;
139
+ if (!discriminators) {
140
+ discriminators = new Map(Object.entries(ANCHOR).map(([program, list]) => [
141
+ program,
142
+ new Map(Object.entries(list).map(([name, type]) => [hex(sha256(new TextEncoder().encode(`global:${name}`)).slice(0, 8)), [name, type]])),
143
+ ]));
144
+ }
145
+ return discriminators.get(programId)?.get(hex(data.slice(0, 8))) ?? null;
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // 自定义错误码
149
+ // ---------------------------------------------------------------------------
150
+ const list = (names) => Object.fromEntries(names.split(',').map((n, i) => [i, n]));
151
+ const SYSTEM_ERRORS = list('AccountAlreadyInUse,ResultWithNegativeLamports,InvalidProgramId,InvalidAccountDataLength,MaxSeedLengthExceeded,AddressWithSeedMismatch,NonceNoRecentBlockhashes,NonceBlockhashNotExpired,NonceUnexpectedBlockhashValue');
152
+ const TOKEN_ERRORS = list('NotRentExempt,InsufficientFunds,InvalidMint,MintMismatch,OwnerMismatch,FixedSupply,AlreadyInUse,InvalidNumberOfProvidedSigners,InvalidNumberOfRequiredSigners,UninitializedState,NativeNotSupported,NonNativeHasBalance,InvalidInstruction,InvalidState,Overflow,AuthorityTypeNotSupported,MintCannotFreeze,AccountFrozen,MintDecimalsMismatch,NonNativeNotSupported');
153
+ const JUPITER_ERRORS = Object.fromEntries('EmptyRoute,SlippageToleranceExceeded,InvalidCalculation,MissingPlatformFeeAccount,InvalidSlippage,NotEnoughPercent,InvalidInputIndex,InvalidOutputIndex,NotEnoughAccountKeys,NonZeroMinimumOutAmountNotSupported,InvalidRoutePlan,InvalidReferralAuthority,LedgerTokenAccountDoesNotMatch,InvalidTokenLedger,IncorrectTokenProgramID,TokenProgramNotProvided,SwapNotSupported,ExactOutAmountNotMatched,SourceAndDestinationMintCannotBeTheSame'
154
+ .split(',')
155
+ .map((n, i) => [6000 + i, n]));
156
+ const RAYDIUM_AMM_ERRORS = { 22: 'InvalidStatus', 23: 'InvalidInstruction', 30: 'ExceededSlippage', 40: 'InsufficientFunds' };
157
+ /** Anchor 框架自带的错误码(2000 起是账户约束) */
158
+ const ANCHOR_ERRORS = {
159
+ 100: 'InstructionMissing', 101: 'InstructionFallbackNotFound', 102: 'InstructionDidNotDeserialize', 2000: 'ConstraintMut', 2001: 'ConstraintHasOne',
160
+ 2002: 'ConstraintSigner', 2003: 'ConstraintRaw', 2004: 'ConstraintOwner', 2006: 'ConstraintSeeds', 2012: 'ConstraintAddress', 2014: 'ConstraintTokenMint',
161
+ 2015: 'ConstraintTokenOwner', 3001: 'AccountDiscriminatorNotFound', 3002: 'AccountDiscriminatorMismatch', 3003: 'AccountDidNotDeserialize',
162
+ 3007: 'AccountOwnedByWrongProgram', 3010: 'AccountNotSigner', 3012: 'AccountNotInitialized',
163
+ };
164
+ const PROGRAM_ERRORS = {
165
+ [SYSTEM_PROGRAM_ID]: SYSTEM_ERRORS,
166
+ [TOKEN_PROGRAM_ID]: TOKEN_ERRORS,
167
+ [TOKEN_2022_PROGRAM_ID]: TOKEN_ERRORS,
168
+ JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4: JUPITER_ERRORS,
169
+ [RAYDIUM_AMM_PROGRAM_ID]: RAYDIUM_AMM_ERRORS,
170
+ };
171
+ /** 自定义错误码的名字:先看这个程序自己的表,再看 Anchor 框架的;认不出时返回 undefined */
172
+ export function programErrorName(programId, code) {
173
+ return (programId ? PROGRAM_ERRORS[programId]?.[code] : undefined) ?? ANCHOR_ERRORS[code];
174
+ }
175
+ //# sourceMappingURL=programs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs.js","sourceRoot":"","sources":["../src/programs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ import type { RequestOptions, SolanaClient } from './client.js';
2
+ import { type TokenAccountApproval } from './approvals.js';
3
+ import { type SolanaPriceSource } from './price.js';
4
+ import { type SolanaTokenRisk } from './risk.js';
5
+ import { type PlanSimulation, type PlanSimulationOptions, type PlannedCall } from './batchPlan.js';
6
+ import type { BatchCallOptions } from './write/batch.js';
7
+ import type { SignerInput } from './write/signer.js';
8
+ import type { WriteResult } from './write/send.js';
9
+ export type ReclaimKind = 'empty-token' | 'junk-token' | 'wrapped-sol' | 'orca-position' | 'raydium-position';
10
+ /**
11
+ * 关不掉的原因:frozen 账户被冻结;close-authority 关闭权限是别的地址;confidential-balance Token-2022 机密余额不为 0;
12
+ * paused / permissioned-burn 代币暂停了 / 只有指定的地址能销毁(垃圾币销毁不了);owed 仓位还有没领的手续费 / 奖励(先领取)
13
+ */
14
+ export type ReclaimBlocker = 'frozen' | 'close-authority' | 'confidential-balance' | 'paused' | 'permissioned-burn' | 'owed';
15
+ /** 能回收租金的一项(字段都是字符串 / 数字 / 布尔 / null,可以直接 JSON.stringify) */
16
+ export interface ReclaimItem {
17
+ kind: ReclaimKind;
18
+ /** 要关闭的代币账户(仓位是持有仓位 NFT 的代币账户) */
19
+ account: string;
20
+ /** 账户的 owner(签名者) */
21
+ owner: string;
22
+ /** 代币的 mint(仓位是 NFT 的 mint) */
23
+ mint: string;
24
+ tokenProgram: string;
25
+ symbol: string | null;
26
+ decimals: number | null;
27
+ /** 账户里的余额(最小单位):垃圾币会被销毁,Wrapped SOL 会解包成 SOL */
28
+ amount: string;
29
+ formatted: string | null;
30
+ /** 余额的美元价值(查到价格时;没有价格为 null) */
31
+ usd: number | null;
32
+ /** Token-2022 账户里暂存的转账手续费:不为 0 时关闭前先收到 mint 上(自动处理) */
33
+ withheldAmount: string;
34
+ /** 预计退回的 lamports:账户里的全部(Wrapped SOL 含余额;仓位是仓位账户 + NFT 账户 + Token-2022 NFT 一并关闭的 mint),十进制字符串;以模拟的结果为准 */
35
+ lamports: string;
36
+ /** 其中的租金(Wrapped SOL 不含包装的余额) */
37
+ rentLamports: string;
38
+ /** 建议勾选:空账户、Wrapped SOL、空仓位总是 true;垃圾币只有“有把握”的才是 true(价格查询正常,且有价格但价值不超过 maxJunkUsd、/risk 有垃圾风险标记、或 isJunk 返回 true;光是名字可疑不够) */
39
+ selected: boolean;
40
+ /** 判断依据:dust / no-price / spam-name / risk:<flag> / custom / empty-position / unwrap / … */
41
+ reasons: string[];
42
+ /** 仓位:协议、仓位账户和池子 */
43
+ position?: {
44
+ protocol: 'orca-whirlpool' | 'raydium-clmm';
45
+ positionMint: string;
46
+ position: string;
47
+ pool: string;
48
+ };
49
+ /** 只在 blocked 里:关不掉的原因 */
50
+ blocker?: ReclaimBlocker;
51
+ }
52
+ export interface Reclaimable {
53
+ owner: string;
54
+ /** 能回收的 */
55
+ items: ReclaimItem[];
56
+ /** 暂时关不掉的(带 blocker):冻结的、关闭权限是别人的、还有没领的手续费的仓位等 */
57
+ blocked: ReclaimItem[];
58
+ /** items 的 lamports 之和 */
59
+ totalLamports: string;
60
+ /** items 里 selected 的 lamports 之和 */
61
+ selectedLamports: string;
62
+ /** 每种的数量和 lamports(只含 items) */
63
+ byKind: Partial<Record<ReclaimKind, {
64
+ count: number;
65
+ lamports: string;
66
+ }>>;
67
+ /** 提示(价格服务出错时垃圾币不自动勾选等) */
68
+ warnings: string[];
69
+ }
70
+ /** isJunk 回调收到的信息 */
71
+ export interface JunkContext {
72
+ account: TokenAccountApproval;
73
+ /** 美元价格;没有时为 null */
74
+ price: number | null;
75
+ /** 余额的美元价值;没有价格时为 null */
76
+ usd: number | null;
77
+ /** /risk 的检查结果(risk 选项关闭或读不到时为 null) */
78
+ risk: SolanaTokenRisk | null;
79
+ }
80
+ export interface ReclaimQuery extends RequestOptions {
81
+ /** 只看这些 mint 的关联代币账户(免费公共节点也能用);不传时列出全部代币账户(getTokenAccountsByOwner,需要支持它的节点) */
82
+ mints?: readonly string[];
83
+ /** 找垃圾币(有余额的代币),默认 true;false 只找空账户、Wrapped SOL 和空仓位 */
84
+ junk?: boolean;
85
+ /** 找已清空的集中流动性仓位,默认 true */
86
+ positions?: boolean;
87
+ /** 价格:true(默认)用 DefiLlama;false 不查(这时垃圾币都不自动勾选);也可以传自己的价格源(如 combinePrices([defillamaPrices(), onchainPrices()])) */
88
+ prices?: boolean | SolanaPriceSource;
89
+ /** 有价格且价值不超过它的代币算“尘埃”(美元,默认 0.01);超过它的代币不会当垃圾币(isJunk 明确返回 true 的除外) */
90
+ maxJunkUsd?: number;
91
+ /** 查垃圾特征用 /risk(不可转让、转账手续费很高、已暂停等),默认 true */
92
+ risk?: boolean;
93
+ /**
94
+ * 自己判断哪些是垃圾币:返回 true 一定算垃圾币并勾选(NFT 和仓位 NFT 除外),false 一定不算,undefined 用默认判断。
95
+ * 例如白名单:`({ account }) => (mine.has(account.mint) ? false : undefined)`
96
+ */
97
+ isJunk?: (context: JunkContext) => boolean | undefined;
98
+ fetch?: typeof fetch;
99
+ }
100
+ /**
101
+ * 扫描钱包里能回收租金的账户(只读取)。需要列出全部代币账户(getTokenAccountsByOwner),免费公共节点不支持时传 `mints` 只看指定代币的 ATA。
102
+ *
103
+ * ```ts
104
+ * const r = await reclaimable(client, owner)
105
+ * r.totalLamports // 全部能拿回的 lamports
106
+ * r.items.filter((i) => i.selected) // 建议勾选的
107
+ * ```
108
+ */
109
+ export declare function reclaimable(client: SolanaClient, owner: string, query?: ReclaimQuery): Promise<Reclaimable>;
110
+ /** 一个账户要执行的指令(作为一个调用,原子执行) */
111
+ export interface ReclaimCall extends PlannedCall {
112
+ kind: ReclaimKind;
113
+ account: string;
114
+ item: ReclaimItem;
115
+ }
116
+ export interface BuildReclaimOptions extends RequestOptions {
117
+ /** 退回的 SOL 给谁,默认 owner。Raydium CLMM 的仓位账户租金程序固定退给 owner(不能指定),这时 destination 对它们无效并给出警告 */
118
+ destination?: string;
119
+ }
120
+ export interface ReclaimPlan {
121
+ owner: string;
122
+ destination: string;
123
+ calls: ReclaimCall[];
124
+ /** 重新读取后发现状态变了、没有构建的(余额变了、有人转入了代币、仓位有新的手续费等):每项给出原因 */
125
+ skipped: Array<{
126
+ item: ReclaimItem;
127
+ reason: string;
128
+ }>;
129
+ /** 预计退回的 lamports 之和(按重新读到的账户),十进制字符串 */
130
+ lamports: string;
131
+ warnings: string[];
132
+ }
133
+ /**
134
+ * 构建回收的指令(只读取、不签名):发送前重新读取每个账户的当前状态再核对(owner、mint、余额、冻结、关闭权限、仓位是否清空),
135
+ * 状态变了的不构建、列在 skipped。每个账户一个调用(垃圾币:销毁 → 收暂存手续费 → 关闭,原子执行)。
136
+ * 绝不关闭有余额的账户:空账户余额不为 0 时跳过;垃圾币只销毁和列表里一致的余额(有人又转入了就跳过);只有 Wrapped SOL 带余额关闭(解包)
137
+ *
138
+ * ```ts
139
+ * const r = await reclaimable(client, owner)
140
+ * const plan = await buildReclaim(client, owner, r.items.filter((i) => i.selected))
141
+ * ```
142
+ */
143
+ export declare function buildReclaim(client: SolanaClient, owner: string, items: readonly ReclaimItem[], options?: BuildReclaimOptions): Promise<ReclaimPlan>;
144
+ export interface ReclaimSimulationOptions extends Omit<PlanSimulationOptions, 'watch'> {
145
+ }
146
+ export interface ReclaimSimulation extends PlanSimulation {
147
+ /**
148
+ * 预计退回 destination 的 lamports(不含手续费)。destination 就是手续费支付者时取模拟里它的 SOL 变化(lamportsSource 为 'simulation',最准);
149
+ * 否则 /simulate 看不到收款地址的 SOL,按构建时读到的账户余额估算('estimate')
150
+ */
151
+ lamports: string;
152
+ lamportsSource: 'simulation' | 'estimate';
153
+ }
154
+ /**
155
+ * 用 /simulate 模拟构建好的回收(不签名、不发送):逐笔交易的结果、哪些调用会失败、手续费、预计退回的 SOL
156
+ *
157
+ * ```ts
158
+ * const sim = await simulateReclaim(client, plan)
159
+ * if (!sim.success) console.log(sim.failed) // [{ index, error }]
160
+ * sim.lamports // 预计拿回的 lamports
161
+ * ```
162
+ */
163
+ export declare function simulateReclaim(client: SolanaClient, plan: ReclaimPlan, options?: ReclaimSimulationOptions): Promise<ReclaimSimulation>;
164
+ export interface ReclaimOptions extends BatchCallOptions, BuildReclaimOptions {
165
+ /** 发送前先用 /simulate 模拟,模拟失败的调用不发送,默认 true */
166
+ simulate?: boolean;
167
+ }
168
+ export interface ReclaimCallResult extends WriteResult {
169
+ kind: ReclaimKind;
170
+ account: string;
171
+ item: ReclaimItem;
172
+ }
173
+ export interface ReclaimResult {
174
+ plan: ReclaimPlan;
175
+ /** 发送前的模拟(simulate: false 时为 null) */
176
+ simulation: ReclaimSimulation | null;
177
+ /** 与 plan.calls 一一对应;dryRun 时 status 为 'simulated' / 'failed',没有签名 */
178
+ results: ReclaimCallResult[];
179
+ }
180
+ /**
181
+ * 回收:构建(重新读取账户并核对)→ 模拟 → 用 from 签名发送(钱包同 /write 的 batchCall,多个账户打包进同一笔交易,feePayer 可以替 owner 付手续费)。
182
+ * 一个账户失败不影响其他的。dryRun: true 只构建和模拟(不签名,from 只用来取地址)
183
+ *
184
+ * ```ts
185
+ * const r = await reclaimable(client, owner)
186
+ * const { simulation, results } = await reclaim(client, key, r.items.filter((i) => i.selected), { destination: cold })
187
+ * ```
188
+ */
189
+ export declare function reclaim(client: SolanaClient, from: SignerInput, items: readonly ReclaimItem[], options?: ReclaimOptions): Promise<ReclaimResult>;
190
+ //# sourceMappingURL=reclaim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reclaim.d.ts","sourceRoot":"","sources":["../src/reclaim.ts"],"names":[],"mappings":"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"}