@w3lib/solana-batch-call 0.3.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 (198) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +304 -3
  3. package/dist/address.d.ts +2 -0
  4. package/dist/address.d.ts.map +1 -1
  5. package/dist/address.js +8 -0
  6. package/dist/address.js.map +1 -1
  7. package/dist/approvals.d.ts +129 -0
  8. package/dist/approvals.d.ts.map +1 -0
  9. package/dist/approvals.js +221 -0
  10. package/dist/approvals.js.map +1 -0
  11. package/dist/fees.d.ts +89 -0
  12. package/dist/fees.d.ts.map +1 -0
  13. package/dist/fees.js +166 -0
  14. package/dist/fees.js.map +1 -0
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/layout.d.ts +2 -0
  20. package/dist/layout.d.ts.map +1 -1
  21. package/dist/layout.js +2 -2
  22. package/dist/layout.js.map +1 -1
  23. package/dist/liquidity/amm.d.ts +7 -0
  24. package/dist/liquidity/amm.d.ts.map +1 -0
  25. package/dist/liquidity/amm.js +307 -0
  26. package/dist/liquidity/amm.js.map +1 -0
  27. package/dist/liquidity/clmm.d.ts +18 -0
  28. package/dist/liquidity/clmm.d.ts.map +1 -0
  29. package/dist/liquidity/clmm.js +85 -0
  30. package/dist/liquidity/clmm.js.map +1 -0
  31. package/dist/liquidity/common.d.ts +94 -0
  32. package/dist/liquidity/common.d.ts.map +1 -0
  33. package/dist/liquidity/common.js +228 -0
  34. package/dist/liquidity/common.js.map +1 -0
  35. package/dist/liquidity/index.d.ts +34 -0
  36. package/dist/liquidity/index.d.ts.map +1 -0
  37. package/dist/liquidity/index.js +157 -0
  38. package/dist/liquidity/index.js.map +1 -0
  39. package/dist/liquidity/orca.d.ts +6 -0
  40. package/dist/liquidity/orca.d.ts.map +1 -0
  41. package/dist/liquidity/orca.js +303 -0
  42. package/dist/liquidity/orca.js.map +1 -0
  43. package/dist/liquidity/raydiumClmm.d.ts +6 -0
  44. package/dist/liquidity/raydiumClmm.d.ts.map +1 -0
  45. package/dist/liquidity/raydiumClmm.js +307 -0
  46. package/dist/liquidity/raydiumClmm.js.map +1 -0
  47. package/dist/liquidity/types.d.ts +150 -0
  48. package/dist/liquidity/types.d.ts.map +1 -0
  49. package/dist/liquidity/types.js +2 -0
  50. package/dist/liquidity/types.js.map +1 -0
  51. package/dist/lp.d.ts +53 -15
  52. package/dist/lp.d.ts.map +1 -1
  53. package/dist/lp.js +15 -38
  54. package/dist/lp.js.map +1 -1
  55. package/dist/lpMath.d.ts +45 -0
  56. package/dist/lpMath.d.ts.map +1 -1
  57. package/dist/lpMath.js +189 -0
  58. package/dist/lpMath.js.map +1 -1
  59. package/dist/names.d.ts +68 -0
  60. package/dist/names.d.ts.map +1 -0
  61. package/dist/names.js +257 -0
  62. package/dist/names.js.map +1 -0
  63. package/dist/pools.d.ts +9 -0
  64. package/dist/pools.d.ts.map +1 -0
  65. package/dist/pools.js +45 -0
  66. package/dist/pools.js.map +1 -0
  67. package/dist/portfolio.d.ts +64 -0
  68. package/dist/portfolio.d.ts.map +1 -0
  69. package/dist/portfolio.js +57 -0
  70. package/dist/portfolio.js.map +1 -0
  71. package/dist/price.d.ts +90 -0
  72. package/dist/price.d.ts.map +1 -0
  73. package/dist/price.js +287 -0
  74. package/dist/price.js.map +1 -0
  75. package/dist/risk.d.ts +84 -0
  76. package/dist/risk.d.ts.map +1 -0
  77. package/dist/risk.js +211 -0
  78. package/dist/risk.js.map +1 -0
  79. package/dist/rpc.d.ts +2 -0
  80. package/dist/rpc.d.ts.map +1 -1
  81. package/dist/rpc.js +33 -9
  82. package/dist/rpc.js.map +1 -1
  83. package/dist/subpaths/approvals.d.ts +29 -0
  84. package/dist/subpaths/approvals.d.ts.map +1 -0
  85. package/dist/subpaths/approvals.js +30 -0
  86. package/dist/subpaths/approvals.js.map +1 -0
  87. package/dist/subpaths/fees.d.ts +23 -0
  88. package/dist/subpaths/fees.d.ts.map +1 -0
  89. package/dist/subpaths/fees.js +25 -0
  90. package/dist/subpaths/fees.js.map +1 -0
  91. package/dist/subpaths/liquidity.d.ts +23 -0
  92. package/dist/subpaths/liquidity.d.ts.map +1 -0
  93. package/dist/subpaths/liquidity.js +19 -0
  94. package/dist/subpaths/liquidity.js.map +1 -0
  95. package/dist/subpaths/lp.d.ts +1 -1
  96. package/dist/subpaths/lp.d.ts.map +1 -1
  97. package/dist/subpaths/lp.js +1 -1
  98. package/dist/subpaths/lp.js.map +1 -1
  99. package/dist/subpaths/names.d.ts +37 -0
  100. package/dist/subpaths/names.d.ts.map +1 -0
  101. package/dist/subpaths/names.js +27 -0
  102. package/dist/subpaths/names.js.map +1 -0
  103. package/dist/subpaths/price.d.ts +40 -0
  104. package/dist/subpaths/price.d.ts.map +1 -0
  105. package/dist/subpaths/price.js +43 -0
  106. package/dist/subpaths/price.js.map +1 -0
  107. package/dist/subpaths/risk.d.ts +28 -0
  108. package/dist/subpaths/risk.d.ts.map +1 -0
  109. package/dist/subpaths/risk.js +30 -0
  110. package/dist/subpaths/risk.js.map +1 -0
  111. package/dist/subpaths/swap.d.ts +22 -0
  112. package/dist/subpaths/swap.d.ts.map +1 -0
  113. package/dist/subpaths/swap.js +21 -0
  114. package/dist/subpaths/swap.js.map +1 -0
  115. package/dist/subpaths/write.d.ts +1 -1
  116. package/dist/subpaths/write.d.ts.map +1 -1
  117. package/dist/subpaths/write.js +1 -1
  118. package/dist/subpaths/write.js.map +1 -1
  119. package/dist/swap/amm.d.ts +20 -0
  120. package/dist/swap/amm.d.ts.map +1 -0
  121. package/dist/swap/amm.js +77 -0
  122. package/dist/swap/amm.js.map +1 -0
  123. package/dist/swap/clmmMath.d.ts +24 -0
  124. package/dist/swap/clmmMath.d.ts.map +1 -0
  125. package/dist/swap/clmmMath.js +82 -0
  126. package/dist/swap/clmmMath.js.map +1 -0
  127. package/dist/swap/common.d.ts +68 -0
  128. package/dist/swap/common.d.ts.map +1 -0
  129. package/dist/swap/common.js +65 -0
  130. package/dist/swap/common.js.map +1 -0
  131. package/dist/swap/cpmm.d.ts +28 -0
  132. package/dist/swap/cpmm.d.ts.map +1 -0
  133. package/dist/swap/cpmm.js +113 -0
  134. package/dist/swap/cpmm.js.map +1 -0
  135. package/dist/swap/index.d.ts +145 -0
  136. package/dist/swap/index.d.ts.map +1 -0
  137. package/dist/swap/index.js +349 -0
  138. package/dist/swap/index.js.map +1 -0
  139. package/dist/swap/orca.d.ts +50 -0
  140. package/dist/swap/orca.d.ts.map +1 -0
  141. package/dist/swap/orca.js +382 -0
  142. package/dist/swap/orca.js.map +1 -0
  143. package/dist/swap/raydiumClmm.d.ts +62 -0
  144. package/dist/swap/raydiumClmm.d.ts.map +1 -0
  145. package/dist/swap/raydiumClmm.js +447 -0
  146. package/dist/swap/raydiumClmm.js.map +1 -0
  147. package/dist/tradeCheck.d.ts +45 -0
  148. package/dist/tradeCheck.d.ts.map +1 -0
  149. package/dist/tradeCheck.js +131 -0
  150. package/dist/tradeCheck.js.map +1 -0
  151. package/dist/write/instructions.d.ts +7 -0
  152. package/dist/write/instructions.d.ts.map +1 -1
  153. package/dist/write/instructions.js +24 -1
  154. package/dist/write/instructions.js.map +1 -1
  155. package/dist/write/transaction.d.ts +23 -0
  156. package/dist/write/transaction.d.ts.map +1 -1
  157. package/dist/write/transaction.js +50 -0
  158. package/dist/write/transaction.js.map +1 -1
  159. package/package.json +41 -2
  160. package/src/address.ts +9 -0
  161. package/src/approvals.ts +358 -0
  162. package/src/fees.ts +259 -0
  163. package/src/index.ts +1 -1
  164. package/src/layout.ts +2 -2
  165. package/src/liquidity/amm.ts +353 -0
  166. package/src/liquidity/clmm.ts +108 -0
  167. package/src/liquidity/common.ts +285 -0
  168. package/src/liquidity/index.ts +177 -0
  169. package/src/liquidity/orca.ts +344 -0
  170. package/src/liquidity/raydiumClmm.ts +348 -0
  171. package/src/liquidity/types.ts +158 -0
  172. package/src/lp.ts +17 -52
  173. package/src/lpMath.ts +215 -0
  174. package/src/names.ts +329 -0
  175. package/src/pools.ts +43 -0
  176. package/src/portfolio.ts +124 -0
  177. package/src/price.ts +366 -0
  178. package/src/risk.ts +243 -0
  179. package/src/rpc.ts +36 -9
  180. package/src/subpaths/approvals.ts +47 -0
  181. package/src/subpaths/fees.ts +41 -0
  182. package/src/subpaths/liquidity.ts +45 -0
  183. package/src/subpaths/lp.ts +9 -0
  184. package/src/subpaths/names.ts +45 -0
  185. package/src/subpaths/price.ts +62 -0
  186. package/src/subpaths/risk.ts +36 -0
  187. package/src/subpaths/swap.ts +41 -0
  188. package/src/subpaths/write.ts +2 -0
  189. package/src/swap/amm.ts +88 -0
  190. package/src/swap/clmmMath.ts +96 -0
  191. package/src/swap/common.ts +113 -0
  192. package/src/swap/cpmm.ts +132 -0
  193. package/src/swap/index.ts +467 -0
  194. package/src/swap/orca.ts +397 -0
  195. package/src/swap/raydiumClmm.ts +464 -0
  196. package/src/tradeCheck.ts +166 -0
  197. package/src/write/instructions.ts +26 -1
  198. package/src/write/transaction.ts +62 -0
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Orca Whirlpool 的兑换:swap_v2(按输入数量)。报价照搬程序(manager/swap_manager.rs、fee_rate_manager.rs、util/sparse_swap.rs):
3
+ * 当前价格起最多 3 个 tick 数组(不存在的按全空处理),逐个区间计算;包括自适应费率(Oracle 账户里的波动累计)和两边的 Token-2022 转账手续费。
4
+ * 兑换超出这 3 个 tick 数组时程序会失败,报价同样不可用
5
+ */
6
+ import { sha256 } from '@noble/hashes/sha2.js';
7
+ import { decodeAddress, findProgramAddress } from '../address.js';
8
+ import { SYSTEM_PROGRAM_ID } from '../constants.js';
9
+ import { MEMO_PROGRAM_ID, Writer, anchorIx, r, w } from '../liquidity/common.js';
10
+ import { ORCA_WHIRLPOOL_PROGRAM_ID, orcaTickArray, utf8 } from '../lp.js';
11
+ import { MAX_TICK, MIN_TICK, ORCA_MAX_SQRT_PRICE, ORCA_MIN_SQRT_PRICE, orcaSqrtPriceAtTick, tickAtSqrtPrice } from '../lpMath.js';
12
+ import { SwapMathError, computeSwapStep } from './clmmMath.js';
13
+ import { Bytes, UnsupportedPool, need, swapMint, transferFee } from './common.js';
14
+ const PROGRAM = ORCA_WHIRLPOOL_PROGRAM_ID;
15
+ const POOL_SIZE = 653;
16
+ const TICK_ARRAY_SIZE = 88;
17
+ const FIXED_TICK_SIZE = 113;
18
+ const FEE_RATE_HARD_LIMIT = 100000n;
19
+ const VOLATILITY_SCALE = 10000n;
20
+ const REDUCTION_FACTOR_DENOMINATOR = 10000n;
21
+ const CONTROL_FACTOR_DENOMINATOR = 100000n;
22
+ const MAX_REFERENCE_AGE = 3600n;
23
+ /** Whirlpool:tick_spacing 41、fee_rate 45、liquidity 49、sqrt_price 65、tick 81、mint_a 101、vault_a 133、mint_b 181、vault_b 213 */
24
+ export function parseWhirlpool(account) {
25
+ if (account.owner !== PROGRAM || account.data.length !== POOL_SIZE)
26
+ return null;
27
+ const b = new Bytes(account.data);
28
+ return {
29
+ address: account.address,
30
+ tickSpacing: b.u16(41),
31
+ feeRate: BigInt(b.u16(45)),
32
+ liquidity: b.u128(49),
33
+ sqrtPrice: b.u128(65),
34
+ tick: b.i32(81),
35
+ mint0: b.key(101),
36
+ vault0: b.key(133),
37
+ mint1: b.key(181),
38
+ vault1: b.key(213),
39
+ };
40
+ }
41
+ const disc = (name) => sha256(utf8(`account:${name}`)).subarray(0, 8);
42
+ let discriminators;
43
+ const starts = (data, prefix) => data.length >= 8 && prefix.every((x, i) => data[i] === x);
44
+ const i128 = (v) => (v >= 1n << 127n ? v - (1n << 128n) : v);
45
+ const floorDiv = (a, b) => Math.floor(a / b);
46
+ export const oracleAddress = (pool) => findProgramAddress([utf8('oracle'), decodeAddress(pool)], PROGRAM);
47
+ /** 与程序 get_start_tick_indexes 一致:当前所在的数组和方向上接下来的两个(向右时 tick 靠近数组末尾会整体右移一个) */
48
+ export function whirlpoolTickArrayStarts(state, aToB) {
49
+ const size = TICK_ARRAY_SIZE * state.tickSpacing;
50
+ const base = floorDiv(state.tick, size) * size;
51
+ const offsets = aToB ? [0, -1, -2] : state.tick + state.tickSpacing >= base + size ? [1, 2, 3] : [0, 1, 2];
52
+ const minStart = MIN_TICK - ((MIN_TICK % size) + size);
53
+ return offsets
54
+ .map((o) => base + o * size)
55
+ .filter((s) => (s < MIN_TICK || s > MAX_TICK ? s <= MIN_TICK && s === minStart : s % size === 0));
56
+ }
57
+ /** 固定大小(TickArray)或可变大小(DynamicTickArray)的 tick 数组;账户不存在时按全空处理(与程序的 ZeroedTickArray 一致) */
58
+ function readTickArray(pool, start, account) {
59
+ const empty = { start, ticks: new Array(TICK_ARRAY_SIZE).fill(null) };
60
+ if (!account || (account.owner === SYSTEM_PROGRAM_ID && account.data.length === 0))
61
+ return empty;
62
+ if (account.owner !== PROGRAM)
63
+ throw new UnsupportedPool(`Tick array owned by another program: ${account.address}`);
64
+ discriminators ??= { fixed: disc('TickArray'), dynamic: disc('DynamicTickArray'), oracle: disc('Oracle') };
65
+ const b = new Bytes(account.data);
66
+ const data = account.data;
67
+ if (starts(data, discriminators.fixed) && data.length >= 12 + TICK_ARRAY_SIZE * FIXED_TICK_SIZE + 32) {
68
+ if (b.key(12 + TICK_ARRAY_SIZE * FIXED_TICK_SIZE) !== pool)
69
+ throw new UnsupportedPool('Tick array of another whirlpool');
70
+ return {
71
+ start: b.i32(8),
72
+ ticks: Array.from({ length: TICK_ARRAY_SIZE }, (_, i) => {
73
+ const o = 12 + i * FIXED_TICK_SIZE;
74
+ return { initialized: b.u8(o) === 1, liquidityNet: i128(b.u128(o + 1)) };
75
+ }),
76
+ };
77
+ }
78
+ if (starts(data, discriminators.dynamic) && data.length >= 60) {
79
+ if (b.key(12) !== pool)
80
+ throw new UnsupportedPool('Tick array of another whirlpool');
81
+ // 可变大小:未初始化的 tick 1 字节(0),初始化的 1 字节(1)+ 112 字节数据
82
+ const ticks = [];
83
+ let o = 60;
84
+ for (let i = 0; i < TICK_ARRAY_SIZE; i++) {
85
+ if (o >= data.length)
86
+ throw new UnsupportedPool('Truncated dynamic tick array');
87
+ if (b.u8(o) === 1) {
88
+ if (o + 113 > data.length)
89
+ throw new UnsupportedPool('Truncated dynamic tick array');
90
+ ticks.push({ initialized: true, liquidityNet: i128(b.u128(o + 1)) });
91
+ o += 113;
92
+ }
93
+ else {
94
+ ticks.push({ initialized: false, liquidityNet: 0n });
95
+ o += 1;
96
+ }
97
+ }
98
+ return { start: b.i32(8), ticks };
99
+ }
100
+ throw new UnsupportedPool(`Unexpected tick array account: ${account.address}`);
101
+ }
102
+ /** Oracle:whirlpool 8、trade_enable_timestamp 40、常量 48(filter 48、decay 50、reduction 52、control 54、max_va 58、tick_group_size 62)、变量 82(last_ref 82、last_major 90、vr 98、ref 102、va 106) */
103
+ function readOracle(pool, account) {
104
+ if (!account || (account.owner === SYSTEM_PROGRAM_ID && account.data.length === 0))
105
+ return null;
106
+ discriminators ??= { fixed: disc('TickArray'), dynamic: disc('DynamicTickArray'), oracle: disc('Oracle') };
107
+ if (account.owner !== PROGRAM || !starts(account.data, discriminators.oracle) || account.data.length < 126)
108
+ throw new UnsupportedPool('Unexpected oracle account');
109
+ const b = new Bytes(account.data);
110
+ if (b.key(8) !== pool)
111
+ throw new UnsupportedPool('Oracle of another whirlpool');
112
+ return {
113
+ tradeEnableTimestamp: b.u64(40),
114
+ filterPeriod: BigInt(b.u16(48)),
115
+ decayPeriod: BigInt(b.u16(50)),
116
+ reductionFactor: BigInt(b.u16(52)),
117
+ controlFactor: BigInt(b.u32(54)),
118
+ maxVolatility: BigInt(b.u32(58)),
119
+ tickGroupSize: b.u16(62),
120
+ lastReferenceUpdate: b.u64(82),
121
+ lastMajorSwap: b.u64(90),
122
+ volatilityReference: BigInt(b.u32(98)),
123
+ indexReference: b.i32(102),
124
+ volatility: BigInt(b.u32(106)),
125
+ };
126
+ }
127
+ /** 自适应费率(FeeRateManager::Adaptive);静态费率的池子 fee 为 null */
128
+ class FeeManager {
129
+ aToB;
130
+ staticFee;
131
+ fee;
132
+ index = 0;
133
+ lower = null;
134
+ upper = null;
135
+ constructor(aToB, staticFee, fee, tick, timestamp) {
136
+ this.aToB = aToB;
137
+ this.staticFee = staticFee;
138
+ this.fee = fee;
139
+ if (!fee)
140
+ return;
141
+ const size = fee.tickGroupSize;
142
+ this.index = floorDiv(tick, size);
143
+ // update_reference
144
+ const max = fee.lastReferenceUpdate > fee.lastMajorSwap ? fee.lastReferenceUpdate : fee.lastMajorSwap;
145
+ if (timestamp < max)
146
+ throw new SwapMathError('invalid timestamp');
147
+ if (timestamp - fee.lastReferenceUpdate > MAX_REFERENCE_AGE) {
148
+ fee.indexReference = this.index;
149
+ fee.volatilityReference = 0n;
150
+ fee.lastReferenceUpdate = timestamp;
151
+ }
152
+ else {
153
+ const elapsed = timestamp - max;
154
+ if (elapsed >= fee.filterPeriod) {
155
+ fee.indexReference = this.index;
156
+ fee.volatilityReference = elapsed < fee.decayPeriod ? (fee.volatility * fee.reductionFactor) / REDUCTION_FACTOR_DENOMINATOR : 0n;
157
+ fee.lastReferenceUpdate = timestamp;
158
+ }
159
+ }
160
+ const delta = Number((fee.maxVolatility - fee.volatilityReference + VOLATILITY_SCALE - 1n) / VOLATILITY_SCALE);
161
+ const lowerIndex = fee.indexReference - delta;
162
+ const upperIndex = fee.indexReference + delta;
163
+ const lowerTick = lowerIndex * size;
164
+ const upperTick = upperIndex * size + size;
165
+ this.lower = lowerTick > MIN_TICK ? { index: lowerIndex, sqrt: orcaSqrtPriceAtTick(lowerTick) } : null;
166
+ this.upper = upperTick < MAX_TICK ? { index: upperIndex, sqrt: orcaSqrtPriceAtTick(upperTick) } : null;
167
+ }
168
+ updateVolatility() {
169
+ const f = this.fee;
170
+ if (!f)
171
+ return;
172
+ const v = f.volatilityReference + BigInt(Math.abs(f.indexReference - this.index)) * VOLATILITY_SCALE;
173
+ f.volatility = v < f.maxVolatility ? v : f.maxVolatility;
174
+ }
175
+ totalFee() {
176
+ const f = this.fee;
177
+ if (!f)
178
+ return this.staticFee;
179
+ const crossed = f.volatility * BigInt(f.tickGroupSize);
180
+ const den = CONTROL_FACTOR_DENOMINATOR * VOLATILITY_SCALE * VOLATILITY_SCALE;
181
+ let adaptive = (f.controlFactor * crossed * crossed + den - 1n) / den;
182
+ if (adaptive > FEE_RATE_HARD_LIMIT)
183
+ adaptive = FEE_RATE_HARD_LIMIT;
184
+ const total = this.staticFee + adaptive;
185
+ return total > FEE_RATE_HARD_LIMIT ? FEE_RATE_HARD_LIMIT : total;
186
+ }
187
+ /** 这一步最多走到的价格和是否跳过了 tick 组的逐个计算 */
188
+ bounded(target, liquidity) {
189
+ const f = this.fee;
190
+ if (!f)
191
+ return [target, false];
192
+ if (f.controlFactor === 0n || liquidity === 0n)
193
+ return [target, true];
194
+ if (this.lower && this.index < this.lower.index)
195
+ return this.aToB ? [target, true] : [target < this.lower.sqrt ? target : this.lower.sqrt, true];
196
+ if (this.upper && this.index > this.upper.index)
197
+ return this.aToB ? [target > this.upper.sqrt ? target : this.upper.sqrt, true] : [target, true];
198
+ const size = f.tickGroupSize;
199
+ const boundary = Math.min(Math.max(this.aToB ? this.index * size : this.index * size + size, MIN_TICK), MAX_TICK);
200
+ const s = orcaSqrtPriceAtTick(boundary);
201
+ return this.aToB ? [target > s ? target : s, false] : [target < s ? target : s, false];
202
+ }
203
+ advance() {
204
+ if (this.fee)
205
+ this.index += this.aToB ? -1 : 1;
206
+ }
207
+ advanceAfterSkip(sqrtPrice, nextTickSqrt, nextTick) {
208
+ const f = this.fee;
209
+ const size = f.tickGroupSize;
210
+ let tick;
211
+ let onBoundary;
212
+ if (sqrtPrice === nextTickSqrt) {
213
+ tick = nextTick;
214
+ onBoundary = nextTick % size === 0;
215
+ }
216
+ else {
217
+ tick = tickAtSqrtPrice('orca', sqrtPrice);
218
+ onBoundary = tick % size === 0 && sqrtPrice === orcaSqrtPriceAtTick(tick);
219
+ }
220
+ const last = onBoundary && !this.aToB ? Math.trunc(tick / size) - 1 : floorDiv(tick, size);
221
+ if ((this.aToB && last < this.index) || (!this.aToB && last > this.index)) {
222
+ this.index = last;
223
+ this.updateVolatility();
224
+ }
225
+ this.index += this.aToB ? -1 : 1;
226
+ }
227
+ }
228
+ /** 本地报价(swap_manager::swap 的按输入数量部分):amount 是扣掉输入转账手续费后的数量,返回池子付出的输出 */
229
+ export function whirlpoolSwap(state, arrays, oracle, amount, aToB, timestamp) {
230
+ if (amount === 0n)
231
+ throw new SwapMathError('zero amount');
232
+ const spacing = state.tickSpacing;
233
+ const limit = aToB ? ORCA_MIN_SQRT_PRICE : ORCA_MAX_SQRT_PRICE;
234
+ if (aToB ? limit >= state.sqrtPrice : limit <= state.sqrtPrice)
235
+ throw new SwapMathError('price is at the limit');
236
+ if (oracle && oracle.tradeEnableTimestamp > timestamp)
237
+ throw new UnsupportedPool('Trading is not enabled yet');
238
+ const size = TICK_ARRAY_SIZE * spacing;
239
+ const fees = new FeeManager(aToB, state.feeRate, oracle ? { ...oracle } : null, state.tick, timestamp);
240
+ const nextInit = (arrayIndex, tickIndex) => {
241
+ let search = tickIndex;
242
+ let i = arrayIndex;
243
+ for (;;) {
244
+ const array = arrays[i];
245
+ if (!array)
246
+ throw new UnsupportedPool('Swap goes beyond the 3 tick arrays the program accepts (amount too large for this pool)');
247
+ // in_search_range:向右时整体左移一个 tickSpacing
248
+ const lo = array.start - (aToB ? 0 : spacing);
249
+ if (search < lo || search >= lo + size)
250
+ throw new SwapMathError('invalid tick array sequence');
251
+ let offset = floorDiv(search - array.start, spacing);
252
+ if (!aToB)
253
+ offset += 1;
254
+ for (; offset >= 0 && offset < TICK_ARRAY_SIZE; offset += aToB ? -1 : 1) {
255
+ if (array.ticks[offset]?.initialized)
256
+ return [i, array.start + offset * spacing];
257
+ }
258
+ if (aToB && array.start <= MIN_TICK)
259
+ return [i, MIN_TICK];
260
+ if (!aToB && array.start + size > MAX_TICK)
261
+ return [i, MAX_TICK];
262
+ if (i + 1 === arrays.length)
263
+ return [i, aToB ? array.start : array.start + size - 1];
264
+ search = aToB ? array.start - 1 : array.start + size - 1;
265
+ i += 1;
266
+ }
267
+ };
268
+ let remaining = amount;
269
+ let calculated = 0n;
270
+ let sqrt = state.sqrtPrice;
271
+ let tick = state.tick;
272
+ let liquidity = state.liquidity;
273
+ let arrayIndex = 0;
274
+ let crossed = 0;
275
+ while (remaining > 0n && limit !== sqrt) {
276
+ const [nextArray, nextTick] = nextInit(arrayIndex, tick);
277
+ const nextTickSqrt = orcaSqrtPriceAtTick(nextTick);
278
+ const target = aToB ? (nextTickSqrt > limit ? nextTickSqrt : limit) : nextTickSqrt < limit ? nextTickSqrt : limit;
279
+ for (;;) {
280
+ fees.updateVolatility();
281
+ const totalFee = fees.totalFee();
282
+ const [bounded, skipped] = fees.bounded(target, liquidity);
283
+ const step = computeSwapStep(sqrt, bounded, liquidity, remaining, totalFee, aToB, true, 'orca');
284
+ remaining -= step.amountIn + step.feeAmount;
285
+ if (remaining < 0n)
286
+ throw new SwapMathError('amount remaining overflow');
287
+ calculated += step.amountOut;
288
+ if (step.sqrtPrice === nextTickSqrt) {
289
+ const array = arrays[nextArray];
290
+ const usable = nextTick >= MIN_TICK && nextTick <= MAX_TICK && nextTick % spacing === 0 && nextTick >= array.start && nextTick < array.start + size;
291
+ const t = usable ? array.ticks[floorDiv(nextTick - array.start, spacing)] : null;
292
+ if (t?.initialized) {
293
+ liquidity += aToB ? -t.liquidityNet : t.liquidityNet;
294
+ crossed++;
295
+ if (liquidity < 0n || liquidity >= 1n << 128n)
296
+ throw new SwapMathError('liquidity overflow');
297
+ }
298
+ const offset = floorDiv(nextTick - array.start, spacing);
299
+ arrayIndex = (aToB && offset === 0) || (!aToB && offset === TICK_ARRAY_SIZE - 1) ? nextArray + 1 : nextArray;
300
+ tick = aToB ? nextTick - 1 : nextTick;
301
+ }
302
+ else if (step.sqrtPrice !== sqrt) {
303
+ tick = tickAtSqrtPrice('orca', step.sqrtPrice);
304
+ }
305
+ sqrt = step.sqrtPrice;
306
+ if (!skipped)
307
+ fees.advance();
308
+ else
309
+ fees.advanceAfterSkip(sqrt, nextTickSqrt, nextTick);
310
+ if (remaining === 0n || sqrt === target)
311
+ break;
312
+ }
313
+ }
314
+ // 不给价格上限时只有走到最低 / 最高价格才会部分成交:当作流动性不足
315
+ if (remaining > 0n)
316
+ throw new UnsupportedPool('Insufficient liquidity');
317
+ return { amountOut: calculated, crossed };
318
+ }
319
+ export function whirlpoolPool(state) {
320
+ const mints = (get) => [
321
+ swapMint(state.mint0, need(get, state.mint0, 'Token mint')),
322
+ swapMint(state.mint1, need(get, state.mint1, 'Token mint')),
323
+ ];
324
+ const oracle = oracleAddress(state.address);
325
+ const arrayAddresses = (aToB) => whirlpoolTickArrayStarts(state, aToB).map((s) => ({ start: s, address: orcaTickArray(state.address, s, state.tickSpacing).address }));
326
+ return {
327
+ protocol: 'orca-whirlpool',
328
+ address: state.address,
329
+ mint0: state.mint0,
330
+ mint1: state.mint1,
331
+ mints,
332
+ accounts: (aToB) => [state.mint0, state.mint1, oracle, ...arrayAddresses(aToB).map((a) => a.address)],
333
+ quote(get, amountIn, aToB, env) {
334
+ const [m0, m1] = mints(get);
335
+ const list = arrayAddresses(aToB);
336
+ const arrays = list.map((a) => {
337
+ const account = get(a.address);
338
+ if (account === undefined)
339
+ throw new Error(`Tick array was not loaded: ${a.address}`);
340
+ return readTickArray(state.address, a.start, account);
341
+ });
342
+ const oracleAccount = get(oracle);
343
+ if (oracleAccount === undefined)
344
+ throw new Error(`Oracle was not loaded: ${oracle}`);
345
+ const [mintIn, mintOut] = aToB ? [m0, m1] : [m1, m0];
346
+ const into = amountIn - transferFee(mintIn, amountIn, env.epoch);
347
+ if (into <= 0n)
348
+ return { amountIn, amountOut: 0n, accounts: [] };
349
+ const { amountOut: out, crossed } = whirlpoolSwap(state, arrays, readOracle(state.address, oracleAccount), into, aToB, env.timestamp);
350
+ // 固定传 3 个 tick 数组(不足 3 个有效起点时重复最后一个,程序会去重)
351
+ const addresses = list.map((a) => a.address);
352
+ while (addresses.length < 3)
353
+ addresses.push(addresses[addresses.length - 1]);
354
+ return { amountIn, amountOut: out - transferFee(mintOut, out, env.epoch), accounts: addresses, crossed };
355
+ },
356
+ instruction(get, owner, input, output, aToB, quote, minOut) {
357
+ const [m0, m1] = mints(get);
358
+ const [ownerA, ownerB] = aToB ? [input, output] : [output, input];
359
+ return {
360
+ programId: PROGRAM,
361
+ keys: [
362
+ r(m0.program),
363
+ r(m1.program),
364
+ r(MEMO_PROGRAM_ID),
365
+ r(owner, true),
366
+ w(state.address),
367
+ r(m0.mint),
368
+ r(m1.mint),
369
+ w(ownerA),
370
+ w(state.vault0),
371
+ w(ownerB),
372
+ w(state.vault1),
373
+ ...quote.accounts.map((a) => w(a)),
374
+ w(oracle),
375
+ ],
376
+ // sqrt_price_limit 0(不限价)、amount_specified_is_input、a_to_b、remaining_accounts_info: None
377
+ data: new Writer().bytes(anchorIx('swap_v2')).u64(quote.amountIn).u64(minOut).u128(0n).bool(true).bool(aToB).u8(0).build(),
378
+ };
379
+ },
380
+ };
381
+ }
382
+ //# sourceMappingURL=orca.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orca.js","sourceRoot":"","sources":["../../src/swap/orca.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { AccountInfo } from '../layout.js';
2
+ import { type SwapPool } from './common.js';
3
+ interface DynamicFee {
4
+ filterPeriod: bigint;
5
+ decayPeriod: bigint;
6
+ reductionFactor: bigint;
7
+ control: bigint;
8
+ maxVolatility: bigint;
9
+ indexReference: number;
10
+ volatilityReference: bigint;
11
+ volatility: bigint;
12
+ lastUpdate: bigint;
13
+ }
14
+ export interface RaydiumClmmState {
15
+ address: string;
16
+ config: string;
17
+ mint0: string;
18
+ mint1: string;
19
+ vault0: string;
20
+ vault1: string;
21
+ observation: string;
22
+ tickSpacing: number;
23
+ liquidity: bigint;
24
+ sqrtPrice: bigint;
25
+ tick: number;
26
+ status: number;
27
+ feeOn: number;
28
+ bitmap: bigint;
29
+ openTime: bigint;
30
+ dynamicFee: DynamicFee | null;
31
+ }
32
+ /**
33
+ * PoolState:amm_config 9、mint 73 / 105、vault 137 / 169、observation 201、tick_spacing 235、liquidity 237、sqrt_price 253、tick 269、
34
+ * status 389、fee_on 390、tick_array_bitmap 904(16 个 u64)、open_time 1080、dynamic_fee_info 1096(80 字节,全 0 表示没有)
35
+ */
36
+ export declare function parseRaydiumClmmPool(account: AccountInfo): RaydiumClmmState | null;
37
+ interface TickState {
38
+ tick: number;
39
+ liquidityNet: bigint;
40
+ liquidityGross: bigint;
41
+ /** 限价单未成交的数量(orders_amount + part_filled_orders_remaining) */
42
+ unfilled: bigint;
43
+ }
44
+ /** 兑换走到了没有读的 tick 数组 */
45
+ export declare class MissingTickArray extends Error {
46
+ readonly start: number;
47
+ constructor(start: number);
48
+ }
49
+ /**
50
+ * 本地报价(swap_internal 的按输入数量部分)。amount 是扣掉输入转账手续费后进入池子的数量;
51
+ * 返回池子付出的输出(未扣输出转账手续费)和经过的 tick 数组
52
+ */
53
+ export declare function raydiumSwap(state: RaydiumClmmState, arrays: ReadonlyMap<number, TickState[]>, amount: bigint, zeroForOne: boolean, baseFeeRate: bigint, timestamp: bigint): {
54
+ amountIn: bigint;
55
+ amountOut: bigint;
56
+ starts: number[];
57
+ crossed: number;
58
+ orders: number;
59
+ };
60
+ export declare function raydiumClmmPool(state: RaydiumClmmState): SwapPool;
61
+ export {};
62
+ //# sourceMappingURL=raydiumClmm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raydiumClmm.d.ts","sourceRoot":"","sources":["../../src/swap/raydiumClmm.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAK/C,OAAO,EAA0J,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAgBnM,UAAU,UAAU;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;CAC9B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAqClF;AA8BD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAeD,wBAAwB;AACxB,qBAAa,gBAAiB,SAAQ,KAAK;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAGnC;AAmBD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAuL5F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,QAAQ,CA2FjE"}