@w3lib/solana-batch-call 0.4.0 → 0.5.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 (138) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +231 -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/fees.d.ts +89 -0
  8. package/dist/fees.d.ts.map +1 -0
  9. package/dist/fees.js +166 -0
  10. package/dist/fees.js.map +1 -0
  11. package/dist/layout.d.ts +2 -0
  12. package/dist/layout.d.ts.map +1 -1
  13. package/dist/layout.js +2 -2
  14. package/dist/layout.js.map +1 -1
  15. package/dist/lp.d.ts +8 -15
  16. package/dist/lp.d.ts.map +1 -1
  17. package/dist/lp.js +7 -31
  18. package/dist/lp.js.map +1 -1
  19. package/dist/names.d.ts +68 -0
  20. package/dist/names.d.ts.map +1 -0
  21. package/dist/names.js +257 -0
  22. package/dist/names.js.map +1 -0
  23. package/dist/pools.d.ts +9 -0
  24. package/dist/pools.d.ts.map +1 -0
  25. package/dist/pools.js +45 -0
  26. package/dist/pools.js.map +1 -0
  27. package/dist/portfolio.d.ts +64 -0
  28. package/dist/portfolio.d.ts.map +1 -0
  29. package/dist/portfolio.js +57 -0
  30. package/dist/portfolio.js.map +1 -0
  31. package/dist/price.d.ts +90 -0
  32. package/dist/price.d.ts.map +1 -0
  33. package/dist/price.js +287 -0
  34. package/dist/price.js.map +1 -0
  35. package/dist/risk.d.ts +84 -0
  36. package/dist/risk.d.ts.map +1 -0
  37. package/dist/risk.js +211 -0
  38. package/dist/risk.js.map +1 -0
  39. package/dist/rpc.d.ts +2 -0
  40. package/dist/rpc.d.ts.map +1 -1
  41. package/dist/rpc.js +33 -9
  42. package/dist/rpc.js.map +1 -1
  43. package/dist/subpaths/approvals.d.ts +29 -0
  44. package/dist/subpaths/approvals.d.ts.map +1 -0
  45. package/dist/subpaths/approvals.js +30 -0
  46. package/dist/subpaths/approvals.js.map +1 -0
  47. package/dist/subpaths/fees.d.ts +23 -0
  48. package/dist/subpaths/fees.d.ts.map +1 -0
  49. package/dist/subpaths/fees.js +25 -0
  50. package/dist/subpaths/fees.js.map +1 -0
  51. package/dist/subpaths/names.d.ts +37 -0
  52. package/dist/subpaths/names.d.ts.map +1 -0
  53. package/dist/subpaths/names.js +27 -0
  54. package/dist/subpaths/names.js.map +1 -0
  55. package/dist/subpaths/price.d.ts +40 -0
  56. package/dist/subpaths/price.d.ts.map +1 -0
  57. package/dist/subpaths/price.js +43 -0
  58. package/dist/subpaths/price.js.map +1 -0
  59. package/dist/subpaths/risk.d.ts +28 -0
  60. package/dist/subpaths/risk.d.ts.map +1 -0
  61. package/dist/subpaths/risk.js +30 -0
  62. package/dist/subpaths/risk.js.map +1 -0
  63. package/dist/subpaths/swap.d.ts +22 -0
  64. package/dist/subpaths/swap.d.ts.map +1 -0
  65. package/dist/subpaths/swap.js +21 -0
  66. package/dist/subpaths/swap.js.map +1 -0
  67. package/dist/subpaths/write.d.ts +1 -1
  68. package/dist/subpaths/write.d.ts.map +1 -1
  69. package/dist/subpaths/write.js +1 -1
  70. package/dist/subpaths/write.js.map +1 -1
  71. package/dist/swap/amm.d.ts +20 -0
  72. package/dist/swap/amm.d.ts.map +1 -0
  73. package/dist/swap/amm.js +77 -0
  74. package/dist/swap/amm.js.map +1 -0
  75. package/dist/swap/clmmMath.d.ts +24 -0
  76. package/dist/swap/clmmMath.d.ts.map +1 -0
  77. package/dist/swap/clmmMath.js +82 -0
  78. package/dist/swap/clmmMath.js.map +1 -0
  79. package/dist/swap/common.d.ts +68 -0
  80. package/dist/swap/common.d.ts.map +1 -0
  81. package/dist/swap/common.js +65 -0
  82. package/dist/swap/common.js.map +1 -0
  83. package/dist/swap/cpmm.d.ts +28 -0
  84. package/dist/swap/cpmm.d.ts.map +1 -0
  85. package/dist/swap/cpmm.js +113 -0
  86. package/dist/swap/cpmm.js.map +1 -0
  87. package/dist/swap/index.d.ts +145 -0
  88. package/dist/swap/index.d.ts.map +1 -0
  89. package/dist/swap/index.js +349 -0
  90. package/dist/swap/index.js.map +1 -0
  91. package/dist/swap/orca.d.ts +50 -0
  92. package/dist/swap/orca.d.ts.map +1 -0
  93. package/dist/swap/orca.js +382 -0
  94. package/dist/swap/orca.js.map +1 -0
  95. package/dist/swap/raydiumClmm.d.ts +62 -0
  96. package/dist/swap/raydiumClmm.d.ts.map +1 -0
  97. package/dist/swap/raydiumClmm.js +447 -0
  98. package/dist/swap/raydiumClmm.js.map +1 -0
  99. package/dist/tradeCheck.d.ts +45 -0
  100. package/dist/tradeCheck.d.ts.map +1 -0
  101. package/dist/tradeCheck.js +131 -0
  102. package/dist/tradeCheck.js.map +1 -0
  103. package/dist/write/instructions.d.ts +7 -0
  104. package/dist/write/instructions.d.ts.map +1 -1
  105. package/dist/write/instructions.js +24 -1
  106. package/dist/write/instructions.js.map +1 -1
  107. package/dist/write/transaction.d.ts +23 -0
  108. package/dist/write/transaction.d.ts.map +1 -1
  109. package/dist/write/transaction.js +50 -0
  110. package/dist/write/transaction.js.map +1 -1
  111. package/package.json +46 -14
  112. package/src/approvals.ts +358 -0
  113. package/src/fees.ts +259 -0
  114. package/src/layout.ts +2 -2
  115. package/src/lp.ts +8 -44
  116. package/src/names.ts +329 -0
  117. package/src/pools.ts +43 -0
  118. package/src/portfolio.ts +124 -0
  119. package/src/price.ts +366 -0
  120. package/src/risk.ts +243 -0
  121. package/src/rpc.ts +36 -9
  122. package/src/subpaths/approvals.ts +47 -0
  123. package/src/subpaths/fees.ts +41 -0
  124. package/src/subpaths/names.ts +45 -0
  125. package/src/subpaths/price.ts +62 -0
  126. package/src/subpaths/risk.ts +36 -0
  127. package/src/subpaths/swap.ts +41 -0
  128. package/src/subpaths/write.ts +2 -0
  129. package/src/swap/amm.ts +88 -0
  130. package/src/swap/clmmMath.ts +96 -0
  131. package/src/swap/common.ts +113 -0
  132. package/src/swap/cpmm.ts +132 -0
  133. package/src/swap/index.ts +467 -0
  134. package/src/swap/orca.ts +397 -0
  135. package/src/swap/raydiumClmm.ts +464 -0
  136. package/src/tradeCheck.ts +166 -0
  137. package/src/write/instructions.ts +26 -1
  138. package/src/write/transaction.ts +62 -0
@@ -0,0 +1,447 @@
1
+ /**
2
+ * Raydium CLMM 的兑换:swap_v2(按输入数量)。报价照搬程序的 swap_internal(instructions/swap.rs,2026-09 的版本):
3
+ * 按 tick 数组位图找下一个已初始化的 tick,逐个区间计算;包括 fee_on(手续费从输入 / 输出扣)、动态费率(按波动累计)、
4
+ * tick 上的限价单(先按 tick 价格成交)、两边的 Token-2022 转账手续费。
5
+ * 不支持需要位图扩展账户的池子(当前价格或兑换路径超出池子自带位图覆盖的范围,只会出现在 tick spacing < 15 的池子)
6
+ */
7
+ import { MEMO_PROGRAM_ID, Writer, anchorIx, r, w } from '../liquidity/common.js';
8
+ import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '../constants.js';
9
+ import { RAYDIUM_CLMM_PROGRAM_ID, raydiumTickArray } from '../lp.js';
10
+ import { MAX_TICK, MIN_TICK, RAYDIUM_MAX_SQRT_PRICE, RAYDIUM_MIN_SQRT_PRICE, raydiumSqrtPriceAtTick, tickAtSqrtPrice } from '../lpMath.js';
11
+ import { FEE_RATE_DENOMINATOR, SwapMathError, computeSwapStep } from './clmmMath.js';
12
+ import { Bytes, NeedAccounts, UnsupportedPool, U64_MAX, mulDivCeil, need, swapMint, transferFee } from './common.js';
13
+ const POOL_SIZE = 1544;
14
+ const TICK_ARRAY_LEN = 10240;
15
+ const TICK_ARRAY_SIZE = 60;
16
+ const TICK_SIZE = 168;
17
+ const BITMAP_SIZE = 512;
18
+ const Q64 = 1n << 64n;
19
+ /** 先读几个 tick 数组(当前的和兑换方向上已初始化的),不够时每次再多读 3 个,最多 MAX_TICK_ARRAYS 个 */
20
+ const INITIAL_TICK_ARRAYS = 2;
21
+ const MAX_TICK_ARRAYS = 10;
22
+ const MAX_FEE_RATE = 100000n;
23
+ const DYNAMIC_FEE_CONTROL_DENOMINATOR = 100000n;
24
+ const VOLATILITY_SCALE = 10000n;
25
+ const REDUCTION_FACTOR_DENOMINATOR = 10000n;
26
+ /**
27
+ * PoolState:amm_config 9、mint 73 / 105、vault 137 / 169、observation 201、tick_spacing 235、liquidity 237、sqrt_price 253、tick 269、
28
+ * status 389、fee_on 390、tick_array_bitmap 904(16 个 u64)、open_time 1080、dynamic_fee_info 1096(80 字节,全 0 表示没有)
29
+ */
30
+ export function parseRaydiumClmmPool(account) {
31
+ if (account.owner !== RAYDIUM_CLMM_PROGRAM_ID || account.data.length !== POOL_SIZE)
32
+ return null;
33
+ const b = new Bytes(account.data);
34
+ let bitmap = 0n;
35
+ for (let i = 15; i >= 0; i--)
36
+ bitmap = (bitmap << 64n) | b.u64(904 + i * 8);
37
+ const fee = account.data.subarray(1096, 1176);
38
+ const dynamicFee = fee.some((x) => x !== 0)
39
+ ? {
40
+ filterPeriod: BigInt(b.u16(1096)),
41
+ decayPeriod: BigInt(b.u16(1098)),
42
+ reductionFactor: BigInt(b.u16(1100)),
43
+ control: BigInt(b.u32(1102)),
44
+ maxVolatility: BigInt(b.u32(1106)),
45
+ indexReference: b.i32(1110),
46
+ volatilityReference: BigInt(b.u32(1114)),
47
+ volatility: BigInt(b.u32(1118)),
48
+ lastUpdate: b.u64(1122),
49
+ }
50
+ : null;
51
+ return {
52
+ address: account.address,
53
+ config: b.key(9),
54
+ mint0: b.key(73),
55
+ mint1: b.key(105),
56
+ vault0: b.key(137),
57
+ vault1: b.key(169),
58
+ observation: b.key(201),
59
+ tickSpacing: b.u16(235),
60
+ liquidity: b.u128(237),
61
+ sqrtPrice: b.u128(253),
62
+ tick: b.i32(269),
63
+ status: b.u8(389),
64
+ feeOn: b.u8(390),
65
+ bitmap,
66
+ openTime: b.u64(1080),
67
+ dynamicFee,
68
+ };
69
+ }
70
+ const floorDiv = (a, b) => Math.floor(a / b);
71
+ const arrayStart = (tick, spacing) => floorDiv(tick, spacing * TICK_ARRAY_SIZE) * spacing * TICK_ARRAY_SIZE;
72
+ const i128 = (v) => (v >= 1n << 127n ? v - (1n << 128n) : v);
73
+ /** 池子自带位图里这个 tick 数组是否已初始化;超出位图覆盖的范围时为 null */
74
+ function bitmapHas(state, start) {
75
+ const multiplier = state.tickSpacing * TICK_ARRAY_SIZE;
76
+ const bit = start / multiplier + BITMAP_SIZE;
77
+ if (bit < 0 || bit >= 2 * BITMAP_SIZE)
78
+ return null;
79
+ return ((state.bitmap >> BigInt(bit)) & 1n) === 1n;
80
+ }
81
+ /** 兑换会经过的已初始化 tick 数组(当前的,以及方向上接下来的),最多 count 个;需要位图扩展时报不支持 */
82
+ function tickArrayStarts(state, zeroForOne, count) {
83
+ const step = state.tickSpacing * TICK_ARRAY_SIZE;
84
+ let start = arrayStart(state.tick, state.tickSpacing);
85
+ const current = bitmapHas(state, start);
86
+ if (current === null)
87
+ throw new UnsupportedPool('Pool price is outside the default tick array bitmap (needs the bitmap extension account)');
88
+ const out = current ? [start] : [];
89
+ while (out.length < count) {
90
+ start += zeroForOne ? -step : step;
91
+ const has = bitmapHas(state, start);
92
+ if (has === null)
93
+ break;
94
+ if (has)
95
+ out.push(start);
96
+ }
97
+ return out;
98
+ }
99
+ /** TickArrayState:pool_id 8、start_tick_index 40、ticks 44(60 个,每个 168 字节:tick +0、liquidity_net +4、liquidity_gross +20、orders_amount +124、part_filled +132) */
100
+ function readTickArray(state, address, start, account) {
101
+ if (!account || account.owner !== RAYDIUM_CLMM_PROGRAM_ID || account.data.length !== TICK_ARRAY_LEN) {
102
+ throw new UnsupportedPool(`Tick array not loaded: ${address}`);
103
+ }
104
+ const b = new Bytes(account.data);
105
+ if (b.key(8) !== state.address || b.i32(40) !== start)
106
+ throw new UnsupportedPool(`Unexpected tick array: ${address}`);
107
+ return Array.from({ length: TICK_ARRAY_SIZE }, (_, i) => {
108
+ const o = 44 + i * TICK_SIZE;
109
+ return { tick: start + i * state.tickSpacing, liquidityNet: i128(b.u128(o + 4)), liquidityGross: b.u128(o + 20), unfilled: b.u64(o + 124) + b.u64(o + 132) };
110
+ });
111
+ }
112
+ /** 兑换走到了没有读的 tick 数组 */
113
+ export class MissingTickArray extends Error {
114
+ start;
115
+ constructor(start) {
116
+ super(`Tick array ${start} is not loaded`);
117
+ this.start = start;
118
+ }
119
+ }
120
+ const initialized = (t) => t.liquidityGross > 0n || t.unfilled > 0n;
121
+ /** 与程序 tick_spacing_index_from_tick 一致:向负无穷取整 */
122
+ function spacingIndex(tick, spacing) {
123
+ return tick % spacing === 0 || tick >= 0 ? Math.trunc(tick / spacing) : Math.trunc(tick / spacing) - 1;
124
+ }
125
+ /** 动态费率(与程序 compute_dynamic_fee_rate 一致) */
126
+ function dynamicFeeRate(fee, spacing) {
127
+ const crossed = fee.volatility * BigInt(spacing);
128
+ const rate = mulDivCeil(fee.control, crossed * crossed, DYNAMIC_FEE_CONTROL_DENOMINATOR * VOLATILITY_SCALE * VOLATILITY_SCALE);
129
+ return rate > MAX_FEE_RATE ? MAX_FEE_RATE : rate;
130
+ }
131
+ /** tick 的价格(Q64.64,price = sqrt² / 2^64) */
132
+ const priceOf = (sqrt, roundUp) => (sqrt * sqrt + (roundUp ? Q64 - 1n : 0n)) >> 64n;
133
+ /**
134
+ * 本地报价(swap_internal 的按输入数量部分)。amount 是扣掉输入转账手续费后进入池子的数量;
135
+ * 返回池子付出的输出(未扣输出转账手续费)和经过的 tick 数组
136
+ */
137
+ export function raydiumSwap(state, arrays, amount, zeroForOne, baseFeeRate, timestamp) {
138
+ const spacing = state.tickSpacing;
139
+ const limit = zeroForOne ? RAYDIUM_MIN_SQRT_PRICE + 1n : RAYDIUM_MAX_SQRT_PRICE - 1n;
140
+ if (amount === 0n)
141
+ throw new SwapMathError('zero amount');
142
+ if (zeroForOne ? !(limit < state.sqrtPrice) : !(limit > state.sqrtPrice))
143
+ throw new SwapMathError('price is at the limit');
144
+ // 只读一次的 tick 数组按顺序取(与程序一样按位图找下一个)
145
+ const step = spacing * TICK_ARRAY_SIZE;
146
+ const getArray = (start) => {
147
+ const ticks = arrays.get(start);
148
+ if (!ticks)
149
+ throw new MissingTickArray(start);
150
+ return ticks;
151
+ };
152
+ const nextArrayStart = (from) => {
153
+ let s = from;
154
+ for (;;) {
155
+ s += zeroForOne ? -step : step;
156
+ const has = bitmapHas(state, s);
157
+ if (has === null) {
158
+ if (spacing >= 15)
159
+ throw new UnsupportedPool('Insufficient liquidity');
160
+ throw new UnsupportedPool('Swap goes beyond the default tick array bitmap (needs the bitmap extension account)');
161
+ }
162
+ if (has)
163
+ return s;
164
+ }
165
+ };
166
+ const currentStart = arrayStart(state.tick, spacing);
167
+ const currentInit = bitmapHas(state, currentStart);
168
+ if (currentInit === null)
169
+ throw new UnsupportedPool('Pool price is outside the default tick array bitmap (needs the bitmap extension account)');
170
+ let firstContains = currentInit;
171
+ let validStart = currentInit ? currentStart : nextArrayStart(currentStart);
172
+ let ticks = getArray(validStart);
173
+ const starts = [validStart];
174
+ const feeOnInput = state.feeOn === 1 ? zeroForOne : state.feeOn === 2 ? !zeroForOne : true;
175
+ let remaining = amount;
176
+ let calculated = 0n;
177
+ let sqrt = state.sqrtPrice;
178
+ let tick = state.tick;
179
+ let liquidity = state.liquidity;
180
+ // 动态费率:开始时按时间更新参考值
181
+ const fee = state.dynamicFee ? { ...state.dynamicFee } : null;
182
+ let index = 0;
183
+ if (fee) {
184
+ index = spacingIndex(tick, spacing);
185
+ const elapsed = timestamp > fee.lastUpdate ? timestamp - fee.lastUpdate : 0n;
186
+ if (elapsed >= fee.filterPeriod) {
187
+ fee.indexReference = index;
188
+ fee.volatilityReference = elapsed < fee.decayPeriod ? (fee.volatility * fee.reductionFactor) / REDUCTION_FACTOR_DENOMINATOR : 0n;
189
+ fee.lastUpdate = timestamp;
190
+ }
191
+ }
192
+ const updateVolatility = () => {
193
+ if (!fee)
194
+ return;
195
+ const v = fee.volatilityReference + BigInt(Math.abs(fee.indexReference - index)) * VOLATILITY_SCALE;
196
+ fee.volatility = v < fee.maxVolatility ? v : fee.maxVolatility;
197
+ };
198
+ const apply = (amountIn, amountOut, feeAmount) => {
199
+ remaining -= feeOnInput ? amountIn + feeAmount : amountIn;
200
+ calculated += amountOut;
201
+ if (remaining < 0n)
202
+ throw new SwapMathError('amount remaining overflow');
203
+ };
204
+ // 限价单剩余(按 tick):同一笔里可能被吃掉一部分
205
+ const unfilled = new Map();
206
+ let crossed = 0;
207
+ let orders = 0;
208
+ while (remaining !== 0n && sqrt !== limit) {
209
+ // 下一个已初始化的 tick
210
+ let next;
211
+ const inCurrent = arrayStart(tick, spacing) === validStart;
212
+ if (inCurrent) {
213
+ const offset = Math.floor((tick - validStart) / spacing);
214
+ if (zeroForOne) {
215
+ for (let i = offset; i >= 0 && !next; i--)
216
+ if (initialized(ticks[i]))
217
+ next = ticks[i];
218
+ }
219
+ else {
220
+ for (let i = offset + 1; i < TICK_ARRAY_SIZE && !next; i++)
221
+ if (initialized(ticks[i]))
222
+ next = ticks[i];
223
+ }
224
+ }
225
+ if (!next) {
226
+ if (!firstContains) {
227
+ firstContains = true;
228
+ }
229
+ else {
230
+ validStart = nextArrayStart(validStart);
231
+ ticks = getArray(validStart);
232
+ starts.push(validStart);
233
+ }
234
+ next = zeroForOne ? [...ticks].reverse().find(initialized) : ticks.find(initialized);
235
+ if (!next)
236
+ throw new UnsupportedPool('Invalid tick array (no initialized tick)');
237
+ }
238
+ const nextState = { ...next, unfilled: unfilled.get(next.tick) ?? next.unfilled };
239
+ if (!initialized(nextState))
240
+ throw new SwapMathError('tick is not initialized');
241
+ const tickNext = Math.min(Math.max(nextState.tick, MIN_TICK), MAX_TICK);
242
+ const sqrtNextTick = raydiumSqrtPriceAtTick(tickNext);
243
+ const target = (zeroForOne && sqrtNextTick < limit) || (!zeroForOne && sqrtNextTick > limit) ? limit : sqrtNextTick;
244
+ let liquidityNext = liquidity;
245
+ for (;;) {
246
+ updateVolatility();
247
+ let totalFee = baseFeeRate;
248
+ if (fee) {
249
+ totalFee = baseFeeRate + dynamicFeeRate(fee, spacing);
250
+ if (totalFee > MAX_FEE_RATE)
251
+ totalFee = MAX_FEE_RATE;
252
+ }
253
+ // 动态费率:每次最多走到当前 tick 组(tickSpacing 个 tick)的边界
254
+ let skipped = true;
255
+ let bounded = target;
256
+ let boundedTick = null;
257
+ if (fee && liquidity !== 0n && fee.volatility !== fee.maxVolatility) {
258
+ skipped = false;
259
+ const bt = Math.min(Math.max(zeroForOne ? index * spacing : (index + 1) * spacing, MIN_TICK), MAX_TICK);
260
+ const bs = raydiumSqrtPriceAtTick(bt);
261
+ if (zeroForOne ? target <= bs : target >= bs) {
262
+ bounded = bs;
263
+ boundedTick = bt;
264
+ }
265
+ }
266
+ let stepPrice = bounded;
267
+ if (sqrt !== bounded) {
268
+ const s = computeSwapStep(sqrt, bounded, liquidity, remaining, totalFee, zeroForOne, feeOnInput, 'raydium');
269
+ apply(s.amountIn, s.amountOut, s.feeAmount);
270
+ stepPrice = s.sqrtPrice;
271
+ }
272
+ if (sqrtNextTick === stepPrice) {
273
+ // 走到 tick:先按 tick 价格和限价单成交
274
+ const total = nextState.unfilled;
275
+ if (remaining !== 0n && total !== 0n) {
276
+ const price0 = priceOf(sqrtNextTick, !zeroForOne);
277
+ let lin;
278
+ let lfee = 0n;
279
+ let lout;
280
+ if (feeOnInput) {
281
+ lfee = mulDivCeil(remaining, totalFee, FEE_RATE_DENOMINATOR);
282
+ lin = remaining - lfee;
283
+ }
284
+ else {
285
+ lin = remaining;
286
+ }
287
+ const matched = zeroForOne ? (lin * price0) / Q64 : (lin * Q64) / price0;
288
+ if (matched > total) {
289
+ lout = total;
290
+ lin = zeroForOne ? mulDivCeil(total, Q64, price0) : mulDivCeil(total, price0, Q64);
291
+ if (lin > U64_MAX)
292
+ throw new SwapMathError('limit order input overflow');
293
+ if (feeOnInput)
294
+ lfee = mulDivCeil(lin, totalFee, FEE_RATE_DENOMINATOR - totalFee);
295
+ }
296
+ else {
297
+ lout = matched;
298
+ }
299
+ nextState.unfilled = total - lout;
300
+ unfilled.set(nextState.tick, nextState.unfilled);
301
+ if (!feeOnInput) {
302
+ lfee = mulDivCeil(lout, totalFee, FEE_RATE_DENOMINATOR);
303
+ lout -= lfee;
304
+ }
305
+ if (lin !== 0n || lout !== 0n || lfee !== 0n) {
306
+ apply(lin, lout, lfee);
307
+ orders++;
308
+ }
309
+ }
310
+ const hasOrders = nextState.unfilled > 0n;
311
+ if (nextState.liquidityGross > 0n && !hasOrders) {
312
+ liquidityNext = liquidity + (zeroForOne ? -nextState.liquidityNet : nextState.liquidityNet);
313
+ crossed++;
314
+ if (liquidityNext < 0n)
315
+ throw new SwapMathError('liquidity underflow');
316
+ }
317
+ tick = (zeroForOne && !hasOrders) || (!zeroForOne && hasOrders) ? tickNext - 1 : tickNext;
318
+ }
319
+ else if (sqrt !== stepPrice) {
320
+ tick = boundedTick !== null && stepPrice === bounded ? boundedTick : tickAtSqrtPrice('raydium', stepPrice);
321
+ }
322
+ sqrt = stepPrice;
323
+ if (fee) {
324
+ if (skipped) {
325
+ const t = sqrt === sqrtNextTick ? tickNext : tick;
326
+ let idx = spacingIndex(t, spacing);
327
+ if (!zeroForOne && t % spacing === 0)
328
+ idx -= 1;
329
+ index = idx;
330
+ if (fee.volatility !== fee.maxVolatility)
331
+ updateVolatility();
332
+ }
333
+ index += zeroForOne ? -1 : 1;
334
+ }
335
+ if (remaining === 0n || sqrt === target)
336
+ break;
337
+ }
338
+ liquidity = liquidityNext;
339
+ }
340
+ // 没有给价格上限时不允许部分成交
341
+ if (remaining !== 0n)
342
+ throw new UnsupportedPool('Insufficient liquidity');
343
+ return { amountIn: amount, amountOut: calculated, starts, crossed, orders };
344
+ }
345
+ export function raydiumClmmPool(state) {
346
+ const mints = (get) => [
347
+ swapMint(state.mint0, need(get, state.mint0, 'Token mint')),
348
+ swapMint(state.mint1, need(get, state.mint1, 'Token mint')),
349
+ ];
350
+ const arrayAddress = (start) => raydiumTickArray(state.address, start, state.tickSpacing).address;
351
+ return {
352
+ protocol: 'raydium-clmm',
353
+ address: state.address,
354
+ mint0: state.mint0,
355
+ mint1: state.mint1,
356
+ mints,
357
+ accounts(zeroForOne) {
358
+ let starts = [];
359
+ try {
360
+ starts = tickArrayStarts(state, zeroForOne, INITIAL_TICK_ARRAYS);
361
+ }
362
+ catch {
363
+ // 报价时再报不支持
364
+ }
365
+ return [state.config, state.mint0, state.mint1, ...starts.map(arrayAddress)];
366
+ },
367
+ quote(get, amountIn, zeroForOne, env) {
368
+ // status 第 4 位(Swap)为 1 表示禁止兑换
369
+ if (state.status & 16)
370
+ throw new UnsupportedPool('Swap is disabled on this pool');
371
+ if (!(env.timestamp > state.openTime))
372
+ throw new UnsupportedPool('Pool is not open yet');
373
+ const [m0, m1] = mints(get);
374
+ const config = need(get, state.config, 'AMM config');
375
+ if (config.data.length < 57)
376
+ throw new UnsupportedPool('Unexpected AMM config');
377
+ // AmmConfig:protocol_fee_rate 43、trade_fee_rate 47、fund_fee_rate 53(u32)
378
+ const baseFee = BigInt(new Bytes(config.data).u32(47));
379
+ // 已经读到的 tick 数组(按位图顺序,读到第一个没读的为止)
380
+ const all = tickArrayStarts(state, zeroForOne, MAX_TICK_ARRAYS);
381
+ const arrays = new Map();
382
+ for (const start of all) {
383
+ const address = arrayAddress(start);
384
+ const account = get(address);
385
+ if (account === undefined)
386
+ break;
387
+ arrays.set(start, readTickArray(state, address, start, account));
388
+ }
389
+ const [mintIn, mintOut] = zeroForOne ? [m0, m1] : [m1, m0];
390
+ const into = amountIn - transferFee(mintIn, amountIn, env.epoch);
391
+ if (into <= 0n)
392
+ return { amountIn, amountOut: 0n, accounts: [] };
393
+ let result;
394
+ try {
395
+ result = raydiumSwap(state, arrays, into, zeroForOne, baseFee, env.timestamp);
396
+ }
397
+ catch (err) {
398
+ if (!(err instanceof MissingTickArray))
399
+ throw err;
400
+ const more = all.filter((s) => !arrays.has(s)).slice(0, 3);
401
+ if (!more.length)
402
+ throw new UnsupportedPool(`The swap needs more than ${MAX_TICK_ARRAYS} tick arrays (amount too large for this pool)`);
403
+ throw new NeedAccounts(more.map(arrayAddress));
404
+ }
405
+ if (result.amountOut === 0n)
406
+ return { amountIn, amountOut: 0n, accounts: [] };
407
+ // 交易里传经过的 tick 数组,再多带一个(价格在发送前变动时用)
408
+ const loaded = [...arrays.keys()];
409
+ const extra = loaded.find((s) => !result.starts.includes(s) && (zeroForOne ? s < result.starts.at(-1) : s > result.starts.at(-1)));
410
+ const used = extra === undefined ? result.starts : [...result.starts, extra];
411
+ return {
412
+ amountIn,
413
+ amountOut: result.amountOut - transferFee(mintOut, result.amountOut, env.epoch),
414
+ accounts: used.map(arrayAddress),
415
+ crossed: result.crossed,
416
+ orders: result.orders,
417
+ };
418
+ },
419
+ instruction(get, owner, input, output, zeroForOne, quote, minOut) {
420
+ const [m0, m1] = mints(get);
421
+ const [mintIn, mintOut] = zeroForOne ? [m0, m1] : [m1, m0];
422
+ const [vaultIn, vaultOut] = zeroForOne ? [state.vault0, state.vault1] : [state.vault1, state.vault0];
423
+ return {
424
+ programId: RAYDIUM_CLMM_PROGRAM_ID,
425
+ keys: [
426
+ r(owner, true),
427
+ r(state.config),
428
+ w(state.address),
429
+ w(input),
430
+ w(output),
431
+ w(vaultIn),
432
+ w(vaultOut),
433
+ w(state.observation),
434
+ r(TOKEN_PROGRAM_ID),
435
+ r(TOKEN_2022_PROGRAM_ID),
436
+ r(MEMO_PROGRAM_ID),
437
+ r(mintIn.mint),
438
+ r(mintOut.mint),
439
+ ...quote.accounts.map((a) => w(a)),
440
+ ],
441
+ // sqrt_price_limit 0:不限价(程序要求全部成交);is_base_input true
442
+ data: new Writer().bytes(anchorIx('swap_v2')).u64(quote.amountIn).u64(minOut).u128(0n).bool(true).build(),
443
+ };
444
+ },
445
+ };
446
+ }
447
+ //# sourceMappingURL=raydiumClmm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raydiumClmm.js","sourceRoot":"","sources":["../../src/swap/raydiumClmm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { RequestOptions, SolanaClient } from './client.js';
2
+ import { type SolanaSwapOptions } from './swap/index.js';
3
+ export type TradeStage = 'ok' | 'no-pool' | 'buy-failed' | 'sell-failed';
4
+ export interface SolanaTradeCheck {
5
+ mint: string;
6
+ /** ok:买入、卖出都成功;no-pool:内置协议里找不到能报价的路线;buy-failed:买不进;sell-failed:买得进、卖不出(貔貅盘);模拟没做成时为 null */
7
+ stage: TradeStage | null;
8
+ /** 卖不出 */
9
+ honeypot: boolean | null;
10
+ /** 买入用的路线(池子、协议) */
11
+ buyRoute: Array<{
12
+ protocol: string;
13
+ pool: string;
14
+ }> | null;
15
+ /** 花的 SOL、买到的代币、卖回的 SOL(最小单位) */
16
+ spent: string;
17
+ bought: string | null;
18
+ sold: string | null;
19
+ /** 来回损失(0~1):1 − 卖回的 SOL / 花的 SOL(卖出的是买入的最少收到,按卖出的比例折算),含两次的池子手续费、价格影响和转账手续费 */
20
+ roundTripLoss: number | null;
21
+ /** 失败原因(模拟的报错或报价的报错) */
22
+ error: string | null;
23
+ /** 汇总的标记:no-pool、cannot-buy、honeypot、high-round-trip-loss(> 10%) */
24
+ flags: string[];
25
+ }
26
+ export interface TradeCheckOptions extends RequestOptions, Pick<SolanaSwapOptions, 'protocols' | 'intermediates' | 'pools' | 'discover'> {
27
+ /**
28
+ * 模拟用的钱包(要有足够的 SOL;不验签名,可以是任何有 SOL 的系统账户,如自己的地址)。
29
+ * 模拟时它创建代币账户的租金和手续费都不会真的扣
30
+ */
31
+ owner: string;
32
+ /** 买入花多少 SOL:amount(lamports)和 amountFormatted 二选一,默认 0.05 SOL */
33
+ amount?: bigint | number | string;
34
+ amountFormatted?: string;
35
+ }
36
+ /**
37
+ * 模拟买入再卖出,判断能不能交易(每个代币两次报价 + 一次 simulateTransaction)。
38
+ *
39
+ * ```ts
40
+ * const [check] = await tradeChecks(client, [mint], { owner: myAddress })
41
+ * // { stage: 'ok', honeypot: false, roundTripLoss: 0.0061, flags: [] }
42
+ * ```
43
+ */
44
+ export declare function tradeChecks(client: SolanaClient, mints: readonly string[], options: TradeCheckOptions): Promise<SolanaTradeCheck[]>;
45
+ //# sourceMappingURL=tradeCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tradeCheck.d.ts","sourceRoot":"","sources":["../src/tradeCheck.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,EAAa,KAAK,iBAAiB,EAAuB,MAAM,iBAAiB,CAAA;AAKxF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,aAAa,CAAA;AAExE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,8FAA8F;IAC9F,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,UAAU;IACV,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;IACxB,oBAAoB;IACpB,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAA;IAC1D,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,gFAAgF;IAChF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,wBAAwB;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,eAAe,GAAG,OAAO,GAAG,UAAU,CAAC;IACtI;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAWzI"}