@w3lib/solana-batch-call 0.2.2 → 0.4.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 (123) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +205 -2
  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/client.d.ts +4 -0
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +8 -0
  10. package/dist/client.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/layout.d.ts +5 -0
  16. package/dist/layout.d.ts.map +1 -1
  17. package/dist/layout.js +16 -0
  18. package/dist/layout.js.map +1 -1
  19. package/dist/liquidity/amm.d.ts +7 -0
  20. package/dist/liquidity/amm.d.ts.map +1 -0
  21. package/dist/liquidity/amm.js +307 -0
  22. package/dist/liquidity/amm.js.map +1 -0
  23. package/dist/liquidity/clmm.d.ts +18 -0
  24. package/dist/liquidity/clmm.d.ts.map +1 -0
  25. package/dist/liquidity/clmm.js +85 -0
  26. package/dist/liquidity/clmm.js.map +1 -0
  27. package/dist/liquidity/common.d.ts +94 -0
  28. package/dist/liquidity/common.d.ts.map +1 -0
  29. package/dist/liquidity/common.js +228 -0
  30. package/dist/liquidity/common.js.map +1 -0
  31. package/dist/liquidity/index.d.ts +34 -0
  32. package/dist/liquidity/index.d.ts.map +1 -0
  33. package/dist/liquidity/index.js +157 -0
  34. package/dist/liquidity/index.js.map +1 -0
  35. package/dist/liquidity/orca.d.ts +6 -0
  36. package/dist/liquidity/orca.d.ts.map +1 -0
  37. package/dist/liquidity/orca.js +303 -0
  38. package/dist/liquidity/orca.js.map +1 -0
  39. package/dist/liquidity/raydiumClmm.d.ts +6 -0
  40. package/dist/liquidity/raydiumClmm.d.ts.map +1 -0
  41. package/dist/liquidity/raydiumClmm.js +307 -0
  42. package/dist/liquidity/raydiumClmm.js.map +1 -0
  43. package/dist/liquidity/types.d.ts +150 -0
  44. package/dist/liquidity/types.d.ts.map +1 -0
  45. package/dist/liquidity/types.js +2 -0
  46. package/dist/liquidity/types.js.map +1 -0
  47. package/dist/lp.d.ts +168 -0
  48. package/dist/lp.d.ts.map +1 -0
  49. package/dist/lp.js +632 -0
  50. package/dist/lp.js.map +1 -0
  51. package/dist/lpMath.d.ts +82 -0
  52. package/dist/lpMath.d.ts.map +1 -0
  53. package/dist/lpMath.js +365 -0
  54. package/dist/lpMath.js.map +1 -0
  55. package/dist/shortcuts.d.ts +8 -0
  56. package/dist/shortcuts.d.ts.map +1 -1
  57. package/dist/shortcuts.js +1 -1
  58. package/dist/shortcuts.js.map +1 -1
  59. package/dist/subpaths/liquidity.d.ts +23 -0
  60. package/dist/subpaths/liquidity.d.ts.map +1 -0
  61. package/dist/subpaths/liquidity.js +19 -0
  62. package/dist/subpaths/liquidity.js.map +1 -0
  63. package/dist/subpaths/lp.d.ts +31 -0
  64. package/dist/subpaths/lp.d.ts.map +1 -0
  65. package/dist/subpaths/lp.js +33 -0
  66. package/dist/subpaths/lp.js.map +1 -0
  67. package/dist/subpaths/write.d.ts +22 -0
  68. package/dist/subpaths/write.d.ts.map +1 -0
  69. package/dist/subpaths/write.js +19 -0
  70. package/dist/subpaths/write.js.map +1 -0
  71. package/dist/write/batch.d.ts +41 -0
  72. package/dist/write/batch.d.ts.map +1 -0
  73. package/dist/write/batch.js +46 -0
  74. package/dist/write/batch.js.map +1 -0
  75. package/dist/write/collect.d.ts +50 -0
  76. package/dist/write/collect.d.ts.map +1 -0
  77. package/dist/write/collect.js +220 -0
  78. package/dist/write/collect.js.map +1 -0
  79. package/dist/write/instructions.d.ts +16 -0
  80. package/dist/write/instructions.d.ts.map +1 -0
  81. package/dist/write/instructions.js +89 -0
  82. package/dist/write/instructions.js.map +1 -0
  83. package/dist/write/send.d.ts +115 -0
  84. package/dist/write/send.d.ts.map +1 -0
  85. package/dist/write/send.js +720 -0
  86. package/dist/write/send.js.map +1 -0
  87. package/dist/write/signer.d.ts +94 -0
  88. package/dist/write/signer.d.ts.map +1 -0
  89. package/dist/write/signer.js +197 -0
  90. package/dist/write/signer.js.map +1 -0
  91. package/dist/write/transaction.d.ts +75 -0
  92. package/dist/write/transaction.d.ts.map +1 -0
  93. package/dist/write/transaction.js +133 -0
  94. package/dist/write/transaction.js.map +1 -0
  95. package/dist/write/transfer.d.ts +72 -0
  96. package/dist/write/transfer.d.ts.map +1 -0
  97. package/dist/write/transfer.js +127 -0
  98. package/dist/write/transfer.js.map +1 -0
  99. package/package.json +23 -5
  100. package/src/address.ts +9 -0
  101. package/src/client.ts +10 -0
  102. package/src/index.ts +2 -1
  103. package/src/layout.ts +17 -0
  104. package/src/liquidity/amm.ts +353 -0
  105. package/src/liquidity/clmm.ts +108 -0
  106. package/src/liquidity/common.ts +285 -0
  107. package/src/liquidity/index.ts +177 -0
  108. package/src/liquidity/orca.ts +344 -0
  109. package/src/liquidity/raydiumClmm.ts +348 -0
  110. package/src/liquidity/types.ts +158 -0
  111. package/src/lp.ts +850 -0
  112. package/src/lpMath.ts +420 -0
  113. package/src/shortcuts.ts +1 -1
  114. package/src/subpaths/liquidity.ts +45 -0
  115. package/src/subpaths/lp.ts +71 -0
  116. package/src/subpaths/write.ts +29 -0
  117. package/src/write/batch.ts +78 -0
  118. package/src/write/collect.ts +286 -0
  119. package/src/write/instructions.ts +98 -0
  120. package/src/write/send.ts +876 -0
  121. package/src/write/signer.ts +314 -0
  122. package/src/write/transaction.ts +181 -0
  123. package/src/write/transfer.ts +189 -0
@@ -0,0 +1,307 @@
1
+ import { createProgramAddress, decodeAddress, getAssociatedTokenAddress } from '../address.js';
2
+ import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '../constants.js';
3
+ import { parseTokenAccount } from '../layout.js';
4
+ import { RAYDIUM_AMM_AUTHORITY, RAYDIUM_AMM_PROGRAM_ID, RAYDIUM_CPMM_AUTHORITY, RAYDIUM_CPMM_PROGRAM_ID, SOLANA_LP_PROTOCOLS, parseAmmPool, } from '../lp.js';
5
+ import { ceilDiv } from '../lpMath.js';
6
+ import { Bytes, MEMO_PROGRAM_ID, Writer, anchorIx, makePlan, minus, mintMeta, mustAccounts, nativeSide, parseAmount, plus, prepareTokenAccounts, r, refPool, removeAmount, tokenInfo, w, } from './common.js';
7
+ async function readPool(ctx, protocol, address) {
8
+ const [account] = await mustAccounts(ctx, [address], () => 'Pool');
9
+ const state = parseAmmPool(account);
10
+ if (!state || state.protocol !== protocol) {
11
+ throw new Error(`Not a ${SOLANA_LP_PROTOCOLS[protocol].name} pool: ${address}`);
12
+ }
13
+ const [m0, m1, v0, v1] = await mustAccounts(ctx, [state.mint0, state.mint1, state.vault0, state.vault1], (i) => (i < 2 ? 'Token mint' : 'Pool vault'));
14
+ const sub = (a, b) => (a > b ? a - b : 0n);
15
+ return {
16
+ state,
17
+ data: account.data,
18
+ mints: [mintMeta(state.mint0, m0), mintMeta(state.mint1, m1)],
19
+ reserve0: sub(parseTokenAccount(v0.data).amount, state.reserved0),
20
+ reserve1: sub(parseTokenAccount(v1.data).amount, state.reserved1),
21
+ };
22
+ }
23
+ /** AMM v4 存入:按固定的一边(baseSide 0 = token0)收取,另一边 = 固定数量 × 储备比例(向上取整),LP = 固定数量 × 总量 / 储备 */
24
+ function ammDeposit(pool, given0, given1) {
25
+ const { reserve0, reserve1 } = pool;
26
+ const supply = pool.state.lpSupply;
27
+ const by0 = (a0) => ({ side: 0, amount0: a0, amount1: ceilDiv(a0 * reserve1, reserve0), lp: (a0 * supply) / reserve0 });
28
+ const by1 = (a1) => ({ side: 1, amount0: ceilDiv(a1 * reserve0, reserve1), amount1: a1, lp: (a1 * supply) / reserve1 });
29
+ if (given0 !== undefined && given1 !== undefined) {
30
+ const a = by0(given0);
31
+ // 两边都给:按不超出另一边的那一边固定
32
+ return a.amount1 <= given1 ? a : by1(given1);
33
+ }
34
+ return given0 !== undefined ? by0(given0) : by1(given1);
35
+ }
36
+ /** CPMM 存入:按要拿到的 LP 收取两边(向上取整);给一边时 LP = 数量 × 总量 / 储备(向下取整,用掉的不超过给的) */
37
+ function cpmmDeposit(pool, given0, given1) {
38
+ const { reserve0, reserve1 } = pool;
39
+ const supply = pool.state.lpSupply;
40
+ const lp0 = given0 === undefined ? null : (given0 * supply) / reserve0;
41
+ const lp1 = given1 === undefined ? null : (given1 * supply) / reserve1;
42
+ // side:决定 LP 数量的那一边(两边都给时是较少的一边)
43
+ const side = lp0 === null ? 1 : lp1 === null ? 0 : lp0 <= lp1 ? 0 : 1;
44
+ const lp = side === 0 ? lp0 : lp1;
45
+ return { side, lp, amount0: ceilDiv(lp * reserve0, supply), amount1: ceilDiv(lp * reserve1, supply) };
46
+ }
47
+ function info(pool, token0, token1, protocol) {
48
+ return {
49
+ protocol,
50
+ protocolName: SOLANA_LP_PROTOCOLS[protocol].name,
51
+ type: 'amm',
52
+ pool: pool.state.address,
53
+ token0,
54
+ token1,
55
+ positionMint: null,
56
+ position: null,
57
+ lpMint: pool.state.lpMint,
58
+ tickLower: null,
59
+ tickUpper: null,
60
+ tick: null,
61
+ price: null,
62
+ priceLower: null,
63
+ priceUpper: null,
64
+ };
65
+ }
66
+ /** AMM v4 池子里 OpenBook 相关的账户:open_orders 496、market 528、market_program 560、target_orders 592 */
67
+ function ammKeys(pool) {
68
+ const b = new Bytes(pool.data);
69
+ return { openOrders: b.key(496), market: b.key(528), marketProgram: b.key(560), targetOrders: b.key(592) };
70
+ }
71
+ /** OpenBook 市场账户(MarketStateV3,含 5 字节前缀):vault_signer_nonce 45、base_vault 117、quote_vault 165、event_queue 253、bids 285、asks 317 */
72
+ async function readMarket(ctx, market, program) {
73
+ const [account] = await mustAccounts(ctx, [market], () => 'OpenBook market of the AMM v4 pool');
74
+ const data = account.data;
75
+ if (data.length < 388) {
76
+ throw new Error(`Unexpected OpenBook market account: ${market}`);
77
+ }
78
+ const b = new Bytes(data);
79
+ const nonce = new Uint8Array(8);
80
+ new DataView(nonce.buffer).setBigUint64(0, b.u64(45), true);
81
+ return {
82
+ baseVault: b.key(117),
83
+ quoteVault: b.key(165),
84
+ eventQueue: b.key(253),
85
+ bids: b.key(285),
86
+ asks: b.key(317),
87
+ authority: createProgramAddress([decodeAddress(market), nonce], program),
88
+ };
89
+ }
90
+ export async function ammAdd(ctx, protocol, params) {
91
+ const address = 'position' in params ? refPool(params.position) : params.pool;
92
+ if (!('position' in params) && (params.fullRange || params.priceLower !== undefined || params.priceUpper !== undefined || params.tickLower !== undefined || params.tickUpper !== undefined)) {
93
+ throw new Error(`${SOLANA_LP_PROTOCOLS[protocol].name} has no price range: pass only the amounts`);
94
+ }
95
+ const pool = await readPool(ctx, protocol, address);
96
+ const { state, mints } = pool;
97
+ if (state.lpSupply === 0n || pool.reserve0 === 0n || pool.reserve1 === 0n) {
98
+ throw new Error(`Pool ${address} is empty`);
99
+ }
100
+ const [token0, token1] = (await tokenInfo(ctx, mints));
101
+ const given0 = parseAmount(params.amount0, params.amount0Formatted, mints[0].decimals, 'amount0');
102
+ const given1 = parseAmount(params.amount1, params.amount1Formatted, mints[1].decimals, 'amount1');
103
+ if (given0 === undefined && given1 === undefined) {
104
+ throw new Error('Pass the amount of at least one token');
105
+ }
106
+ const lpMeta = { mint: state.lpMint, program: TOKEN_PROGRAM_ID, decimals: 0 };
107
+ let lp;
108
+ let amount0;
109
+ let amount1;
110
+ let max0;
111
+ let max1;
112
+ /** 决定数量的那一边(AMM v4 是固定收取的一边) */
113
+ let side = 0;
114
+ let ix;
115
+ if (protocol === 'raydium-cpmm') {
116
+ ;
117
+ ({ lp, amount0, amount1, side } = cpmmDeposit(pool, given0, given1));
118
+ [max0, max1] = [plus(amount0, ctx.slippage), plus(amount1, ctx.slippage)];
119
+ }
120
+ else {
121
+ const d = ammDeposit(pool, given0, given1);
122
+ ({ lp, amount0, amount1, side } = d);
123
+ [max0, max1] = side === 0 ? [amount0, plus(amount1, ctx.slippage)] : [plus(amount0, ctx.slippage), amount1];
124
+ }
125
+ // 两边都给时,另一边的上限不超过给的数量(决定数量的那一边保留滑点余量,否则价格稍有不利就失败)
126
+ if (side === 0 && given1 !== undefined && max1 > given1)
127
+ max1 = given1;
128
+ if (side === 1 && given0 !== undefined && max0 > given0)
129
+ max0 = given0;
130
+ if (lp === 0n || amount0 === 0n || amount1 === 0n) {
131
+ throw new Error('Amount too small: no LP tokens would be minted');
132
+ }
133
+ const tokens = await prepareTokenAccounts(ctx, [...mints, lpMeta], [max0, max1, null]);
134
+ const [user0, user1, userLp] = tokens.accounts;
135
+ if (protocol === 'raydium-cpmm') {
136
+ ix = {
137
+ programId: RAYDIUM_CPMM_PROGRAM_ID,
138
+ keys: [
139
+ r(ctx.owner, true),
140
+ r(RAYDIUM_CPMM_AUTHORITY),
141
+ w(state.address),
142
+ w(userLp),
143
+ w(user0),
144
+ w(user1),
145
+ w(state.vault0),
146
+ w(state.vault1),
147
+ r(TOKEN_PROGRAM_ID),
148
+ r(TOKEN_2022_PROGRAM_ID),
149
+ r(state.mint0),
150
+ r(state.mint1),
151
+ w(state.lpMint),
152
+ ],
153
+ data: new Writer().bytes(anchorIx('deposit')).u64(lp).u64(max0).u64(max1).build(),
154
+ };
155
+ }
156
+ else {
157
+ const keys = ammKeys(pool);
158
+ const market = await readMarket(ctx, keys.market, keys.marketProgram);
159
+ ix = {
160
+ programId: RAYDIUM_AMM_PROGRAM_ID,
161
+ keys: [
162
+ r(TOKEN_PROGRAM_ID),
163
+ w(state.address),
164
+ r(RAYDIUM_AMM_AUTHORITY),
165
+ r(keys.openOrders),
166
+ w(keys.targetOrders),
167
+ w(state.lpMint),
168
+ w(state.vault0),
169
+ w(state.vault1),
170
+ r(keys.market),
171
+ w(user0),
172
+ w(user1),
173
+ w(userLp),
174
+ r(ctx.owner, true),
175
+ r(market.eventQueue),
176
+ ],
177
+ // deposit:max_coin、max_pc、base_side(0 = 固定 coin)、other_amount_min(另一边至少收取多少)
178
+ data: new Writer()
179
+ .u8(3)
180
+ .u64(max0)
181
+ .u64(max1)
182
+ .u64(BigInt(side))
183
+ .u64(side === 0 ? minus(amount1, ctx.slippage) : minus(amount0, ctx.slippage))
184
+ .build(),
185
+ };
186
+ }
187
+ return makePlan(ctx, {
188
+ action: 'add',
189
+ ...info(pool, token0, token1, protocol),
190
+ liquidity: lp.toString(),
191
+ amount0: amount0.toString(),
192
+ amount1: amount1.toString(),
193
+ amount0Max: max0.toString(),
194
+ amount1Max: max1.toString(),
195
+ amount0Min: null,
196
+ amount1Min: null,
197
+ fees0: '0',
198
+ fees1: '0',
199
+ rewardMints: [],
200
+ native: nativeSide(tokens.nativeIndex),
201
+ steps: [
202
+ { kind: 'setup', instructions: tokens.setup },
203
+ { kind: 'add', instructions: [...tokens.wrap, ix, ...tokens.cleanup] },
204
+ ],
205
+ signers: [],
206
+ });
207
+ }
208
+ export async function ammRemove(ctx, protocol, params) {
209
+ const address = refPool(params.position);
210
+ const pool = await readPool(ctx, protocol, address);
211
+ const { state, mints } = pool;
212
+ const lpAccount = getAssociatedTokenAddress(ctx.owner, state.lpMint, TOKEN_PROGRAM_ID);
213
+ const [held] = await ctx.client.accounts([lpAccount], { signal: ctx.signal });
214
+ const balance = held ? parseTokenAccount(held.data).amount : 0n;
215
+ if (balance === 0n) {
216
+ throw new Error(`${ctx.owner} holds no LP tokens of ${address} (in its associated token account)`);
217
+ }
218
+ const lp = removeAmount(balance, params.percent, params.liquidity);
219
+ const [token0, token1] = (await tokenInfo(ctx, mints));
220
+ // 与程序一致:份额 × 储备,向下取整
221
+ const amount0 = (lp * pool.reserve0) / state.lpSupply;
222
+ const amount1 = (lp * pool.reserve1) / state.lpSupply;
223
+ if (amount0 === 0n && amount1 === 0n) {
224
+ throw new Error('Amount too small: nothing would be withdrawn');
225
+ }
226
+ const min0 = minus(amount0, ctx.slippage);
227
+ const min1 = minus(amount1, ctx.slippage);
228
+ const tokens = await prepareTokenAccounts(ctx, mints, [null, null]);
229
+ const [user0, user1] = tokens.accounts;
230
+ let ix;
231
+ if (protocol === 'raydium-cpmm') {
232
+ ix = {
233
+ programId: RAYDIUM_CPMM_PROGRAM_ID,
234
+ keys: [
235
+ r(ctx.owner, true),
236
+ r(RAYDIUM_CPMM_AUTHORITY),
237
+ w(state.address),
238
+ w(lpAccount),
239
+ w(user0),
240
+ w(user1),
241
+ w(state.vault0),
242
+ w(state.vault1),
243
+ r(TOKEN_PROGRAM_ID),
244
+ r(TOKEN_2022_PROGRAM_ID),
245
+ r(state.mint0),
246
+ r(state.mint1),
247
+ w(state.lpMint),
248
+ r(MEMO_PROGRAM_ID),
249
+ ],
250
+ data: new Writer().bytes(anchorIx('withdraw')).u64(lp).u64(min0).u64(min1).build(),
251
+ };
252
+ }
253
+ else {
254
+ const keys = ammKeys(pool);
255
+ const market = await readMarket(ctx, keys.market, keys.marketProgram);
256
+ ix = {
257
+ programId: RAYDIUM_AMM_PROGRAM_ID,
258
+ keys: [
259
+ r(TOKEN_PROGRAM_ID),
260
+ w(state.address),
261
+ r(RAYDIUM_AMM_AUTHORITY),
262
+ w(keys.openOrders),
263
+ w(keys.targetOrders),
264
+ w(state.lpMint),
265
+ w(state.vault0),
266
+ w(state.vault1),
267
+ // 原来的 withdraw_queue / temp_lp 账户,程序已不再使用,按官方 SDK 传池子地址占位
268
+ w(state.address),
269
+ w(state.address),
270
+ r(keys.marketProgram),
271
+ w(keys.market),
272
+ w(market.baseVault),
273
+ w(market.quoteVault),
274
+ r(market.authority),
275
+ w(lpAccount),
276
+ w(user0),
277
+ w(user1),
278
+ r(ctx.owner, true),
279
+ w(market.eventQueue),
280
+ w(market.bids),
281
+ w(market.asks),
282
+ ],
283
+ data: new Writer().u8(4).u64(lp).u64(min0).u64(min1).build(),
284
+ };
285
+ }
286
+ return makePlan(ctx, {
287
+ action: 'remove',
288
+ ...info(pool, token0, token1, protocol),
289
+ liquidity: lp.toString(),
290
+ amount0: amount0.toString(),
291
+ amount1: amount1.toString(),
292
+ amount0Max: null,
293
+ amount1Max: null,
294
+ amount0Min: min0.toString(),
295
+ amount1Min: min1.toString(),
296
+ fees0: '0',
297
+ fees1: '0',
298
+ rewardMints: [],
299
+ native: nativeSide(tokens.nativeIndex),
300
+ steps: [
301
+ { kind: 'setup', instructions: tokens.setup },
302
+ { kind: 'remove', instructions: [...tokens.wrap, ix, ...tokens.cleanup] },
303
+ ],
304
+ signers: [],
305
+ });
306
+ }
307
+ //# sourceMappingURL=amm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amm.js","sourceRoot":"","sources":["../../src/liquidity/amm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAoB,MAAM,cAAc,CAAA;AAClE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,GAGb,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EACL,KAAK,EACL,eAAe,EACf,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,IAAI,EACJ,oBAAoB,EACpB,CAAC,EACD,OAAO,EACP,YAAY,EACZ,SAAS,EACT,CAAC,GAGF,MAAM,aAAa,CAAA;AAepB,KAAK,UAAU,QAAQ,CAAC,GAAQ,EAAE,QAAqB,EAAE,OAAe;IACtE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,YAAY,CAAC,OAAsB,CAAC,CAAA;IAClD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,SAAS,mBAAmB,CAAC,QAAQ,CAAC,CAAC,IAAI,UAAU,OAAO,EAAE,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;IACtJ,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC1D,OAAO;QACL,KAAK;QACL,IAAI,EAAG,OAAuB,CAAC,IAAI;QACnC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAiB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAiB,CAAC,CAAC;QAC3F,QAAQ,EAAE,GAAG,CAAC,iBAAiB,CAAE,EAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;QAClF,QAAQ,EAAE,GAAG,CAAC,iBAAiB,CAAE,EAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;KACnF,CAAA;AACH,CAAC;AAED,0FAA0F;AAC1F,SAAS,UAAU,CAAC,IAAU,EAAE,MAA0B,EAAE,MAA0B;IACpF,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;IAClC,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAA;IAC/H,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAA;IAC/H,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;QACrB,qBAAqB;QACrB,OAAO,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAgB,CAAC,CAAA;AACnE,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,IAAU,EAAE,MAA0B,EAAE,MAA0B;IACrF,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;IAClC,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAA;IACtE,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAA;IACtE,iCAAiC;IACjC,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAE,GAAc,CAAC,CAAC,CAAE,GAAc,CAAA;IACzD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAA;AACvG,CAAC;AAED,SAAS,IAAI,CAAC,IAAU,EAAE,MAAqB,EAAE,MAAqB,EAAE,QAAqB;IAC3F,OAAO;QACL,QAAQ;QACR,YAAY,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,IAAI;QAChD,IAAI,EAAE,KAAc;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;QACxB,MAAM;QACN,MAAM;QACN,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;QACzB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;KACjB,CAAA;AACH,CAAC;AAED,gGAAgG;AAChG,SAAS,OAAO,CAAC,IAAU;IACzB,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAA;AAC5G,CAAC;AAED,mIAAmI;AACnI,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,MAAc,EAAE,OAAe;IACjE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,oCAAoC,CAAC,CAAA;IAC/F,MAAM,IAAI,GAAI,OAAuB,CAAC,IAAI,CAAA;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3D,OAAO;QACL,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACrB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACtB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACtB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAChB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAChB,SAAS,EAAE,oBAAoB,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC;KACzE,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAQ,EAAE,QAAqB,EAAE,MAA+D;IAC3H,MAAM,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;IAC7E,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;QAC5L,MAAM,IAAI,KAAK,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,IAAI,4CAA4C,CAAC,CAAA;IACpG,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACnD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,WAAW,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAmC,CAAA;IACxF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACjG,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACjG,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IAC7E,IAAI,EAAU,CAAA;IACd,IAAI,OAAe,CAAA;IACnB,IAAI,OAAe,CAAA;IACnB,IAAI,IAAY,CAAA;IAChB,IAAI,IAAY,CAAA;IAChB,gCAAgC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,EAAe,CAAA;IACnB,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,CAAC;QAAA,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAEpE;QAAA,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC5E,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CACzC;QAAA,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAEpC;QAAA,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;IAC9G,CAAC;IACD,kDAAkD;IAClD,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,GAAG,MAAM;QAAE,IAAI,GAAG,MAAM,CAAA;IACtE,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,GAAG,MAAM;QAAE,IAAI,GAAG,MAAM,CAAA;IACtE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACtF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,QAAoC,CAAA;IAC1E,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,EAAE,GAAG;YACH,SAAS,EAAE,uBAAuB;YAClC,IAAI,EAAE;gBACJ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClB,CAAC,CAAC,sBAAsB,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChB,CAAC,CAAC,MAAM,CAAC;gBACT,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,gBAAgB,CAAC;gBACnB,CAAC,CAAC,qBAAqB,CAAC;gBACxB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBACd,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBACd,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;aAChB;YACD,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;SAClF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACrE,EAAE,GAAG;YACH,SAAS,EAAE,sBAAsB;YACjC,IAAI,EAAE;gBACJ,CAAC,CAAC,gBAAgB,CAAC;gBACnB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChB,CAAC,CAAC,qBAAqB,CAAC;gBACxB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;gBAClB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gBACpB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;gBACd,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,MAAM,CAAC;gBACT,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;aACrB;YACD,6EAA6E;YAC7E,IAAI,EAAE,IAAI,MAAM,EAAE;iBACf,EAAE,CAAC,CAAC,CAAC;iBACL,GAAG,CAAC,IAAI,CAAC;iBACT,GAAG,CAAC,IAAI,CAAC;iBACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBACjB,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;iBAC7E,KAAK,EAAE;SACX,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE;QACnB,MAAM,EAAE,KAAK;QACb,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;QACvC,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE;QACxB,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;QACtC,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE;YAC7C,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE;SACvE;QACD,OAAO,EAAE,EAAE;KACZ,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,QAAqB,EAAE,MAAmC;IAClG,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACnD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAC7B,MAAM,SAAS,GAAG,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACtF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,0BAA0B,OAAO,oCAAoC,CAAC,CAAA;IACpG,CAAC;IACD,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAClE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAmC,CAAA;IACxF,qBAAqB;IACrB,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;IACrD,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;IACrD,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACnE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,QAA4B,CAAA;IAC1D,IAAI,EAAe,CAAA;IACnB,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,EAAE,GAAG;YACH,SAAS,EAAE,uBAAuB;YAClC,IAAI,EAAE;gBACJ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClB,CAAC,CAAC,sBAAsB,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChB,CAAC,CAAC,SAAS,CAAC;gBACZ,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,gBAAgB,CAAC;gBACnB,CAAC,CAAC,qBAAqB,CAAC;gBACxB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBACd,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBACd,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,eAAe,CAAC;aACnB;YACD,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;SACnF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACrE,EAAE,GAAG;YACH,SAAS,EAAE,sBAAsB;YACjC,IAAI,EAAE;gBACJ,CAAC,CAAC,gBAAgB,CAAC;gBACnB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChB,CAAC,CAAC,qBAAqB,CAAC;gBACxB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;gBAClB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gBACpB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACf,0DAA0D;gBAC1D,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;gBACrB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;gBACd,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;gBACnB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACpB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;gBACnB,CAAC,CAAC,SAAS,CAAC;gBACZ,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,KAAK,CAAC;gBACR,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;aACf;YACD,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;SAC7D,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE;QACnB,MAAM,EAAE,QAAQ;QAChB,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;QACvC,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE;QACxB,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC3B,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;QACtC,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE;YAC7C,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE;SAC1E;QACD,OAAO,EAAE,EAAE;KACZ,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type SolanaLpClmmPosition, type SolanaLpToken } from '../lp.js';
2
+ import { type ClmmProgram } from '../lpMath.js';
3
+ import type { Ctx } from './common.js';
4
+ import type { SolanaNewPositionParams } from './types.js';
5
+ /** 新建仓位的 tick 区间:fullRange / tickLower + tickUpper / priceLower + priceUpper(token1 / token0)三选一 */
6
+ export declare function resolveRange(program: ClmmProgram, params: SolanaNewPositionParams, token0: SolanaLpToken, token1: SolanaLpToken, tickSpacing: number): [number, number];
7
+ /** 按输入的数量算添加的流动性;价格在区间外时只需要一种代币,给错了另一种会报错 */
8
+ export declare function liquidityFor(program: ClmmProgram, tick: number, sqrtPrice: bigint, tickLower: number, tickUpper: number, amount0: bigint | undefined, amount1: bigint | undefined, token0: SolanaLpToken, token1: SolanaLpToken): bigint;
9
+ /** 计划里的价格字段(token1 / token0,按精度换算,只用于展示) */
10
+ export declare function priceInfo(tick: number, sqrtPrice: bigint, token0: SolanaLpToken, token1: SolanaLpToken, tickLower: number, tickUpper: number): {
11
+ tick: number;
12
+ price: number | null;
13
+ priceLower: number | null;
14
+ priceUpper: number | null;
15
+ };
16
+ /** 已有的仓位:用查询拿到数量、手续费、价格(要求 owner 持有仓位 NFT 的关联代币账户) */
17
+ export declare function queryPosition(ctx: Ctx, protocol: 'raydium-clmm' | 'orca-whirlpool', positionMint: string): Promise<SolanaLpClmmPosition>;
18
+ //# sourceMappingURL=clmm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clmm.d.ts","sourceRoot":"","sources":["../../src/liquidity/clmm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,oBAAoB,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AACrF,OAAO,EASL,KAAK,WAAW,EACjB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAEzD,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCvK;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,GACpB,MAAM,CAmBR;AAED,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;EAQ5I;AAED,sDAAsD;AACtD,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,GAAG,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAO9I"}
@@ -0,0 +1,85 @@
1
+ import { lpPositions } from '../lp.js';
2
+ import { MAX_TICK, MIN_TICK, getLiquidityForAmounts, nearestUsableTick, priceToTick, sqrtPriceAtTick, sqrtPriceToPrice, tickToPrice, } from '../lpMath.js';
3
+ /** 新建仓位的 tick 区间:fullRange / tickLower + tickUpper / priceLower + priceUpper(token1 / token0)三选一 */
4
+ export function resolveRange(program, params, token0, token1, tickSpacing) {
5
+ const byTicks = params.tickLower !== undefined || params.tickUpper !== undefined;
6
+ const byPrices = params.priceLower !== undefined || params.priceUpper !== undefined;
7
+ if (Number(!!params.fullRange) + Number(byTicks) + Number(byPrices) !== 1) {
8
+ throw new Error('Pass exactly one of fullRange, tickLower + tickUpper, or priceLower + priceUpper');
9
+ }
10
+ let lower;
11
+ let upper;
12
+ if (params.fullRange) {
13
+ lower = Math.ceil(MIN_TICK / tickSpacing) * tickSpacing;
14
+ upper = Math.floor(MAX_TICK / tickSpacing) * tickSpacing;
15
+ }
16
+ else if (byTicks) {
17
+ if (params.tickLower === undefined || params.tickUpper === undefined) {
18
+ throw new Error('Pass both tickLower and tickUpper');
19
+ }
20
+ lower = params.tickLower;
21
+ upper = params.tickUpper;
22
+ for (const tick of [lower, upper]) {
23
+ if (!Number.isInteger(tick) || tick < MIN_TICK || tick > MAX_TICK || tick % tickSpacing !== 0) {
24
+ throw new RangeError(`tick ${tick} must be an integer multiple of tickSpacing ${tickSpacing} within [${MIN_TICK}, ${MAX_TICK}]`);
25
+ }
26
+ }
27
+ }
28
+ else {
29
+ if (params.priceLower === undefined || params.priceUpper === undefined) {
30
+ throw new Error('Pass both priceLower and priceUpper');
31
+ }
32
+ if (token0.decimals === null || token1.decimals === null) {
33
+ throw new Error('Cannot read token decimals to convert prices; pass ticks instead');
34
+ }
35
+ const ticks = [params.priceLower, params.priceUpper].map((price) => {
36
+ return nearestUsableTick(priceToTick(program, price, token0.decimals, token1.decimals), tickSpacing);
37
+ });
38
+ [lower, upper] = ticks[0] <= ticks[1] ? ticks : [ticks[1], ticks[0]];
39
+ }
40
+ if (lower >= upper) {
41
+ throw new RangeError(`The price range is too narrow: tickLower ${lower} must be below tickUpper ${upper} (tickSpacing ${tickSpacing})`);
42
+ }
43
+ return [lower, upper];
44
+ }
45
+ /** 按输入的数量算添加的流动性;价格在区间外时只需要一种代币,给错了另一种会报错 */
46
+ export function liquidityFor(program, tick, sqrtPrice, tickLower, tickUpper, amount0, amount1, token0, token1) {
47
+ const name = (t) => t.symbol ?? t.mint;
48
+ if (amount0 === undefined && amount1 === undefined) {
49
+ throw new Error('Pass the amount of at least one token');
50
+ }
51
+ if (amount1 === undefined && (tick >= tickUpper || sqrtPrice >= sqrtPriceAtTick(program, tickUpper))) {
52
+ throw new Error(`The current price is above the range: the position takes only ${name(token1)} (token1); pass amount1 instead`);
53
+ }
54
+ if (amount0 === undefined && (tick < tickLower || sqrtPrice <= sqrtPriceAtTick(program, tickLower))) {
55
+ throw new Error(`The current price is below the range: the position takes only ${name(token0)} (token0); pass amount0 instead`);
56
+ }
57
+ const liquidity = getLiquidityForAmounts(tick, sqrtPrice, sqrtPriceAtTick(program, tickLower), sqrtPriceAtTick(program, tickUpper), amount0, amount1, tickLower, tickUpper);
58
+ if (liquidity === 0n) {
59
+ throw new Error('Amount too small: the liquidity rounds to 0');
60
+ }
61
+ if (liquidity >= 1n << 128n) {
62
+ throw new RangeError('Amount too large');
63
+ }
64
+ return liquidity;
65
+ }
66
+ /** 计划里的价格字段(token1 / token0,按精度换算,只用于展示) */
67
+ export function priceInfo(tick, sqrtPrice, token0, token1, tickLower, tickUpper) {
68
+ const known = token0.decimals !== null && token1.decimals !== null;
69
+ return {
70
+ tick,
71
+ price: known ? sqrtPriceToPrice(sqrtPrice, token0.decimals, token1.decimals) : null,
72
+ priceLower: known ? tickToPrice(tickLower, token0.decimals, token1.decimals) : null,
73
+ priceUpper: known ? tickToPrice(tickUpper, token0.decimals, token1.decimals) : null,
74
+ };
75
+ }
76
+ /** 已有的仓位:用查询拿到数量、手续费、价格(要求 owner 持有仓位 NFT 的关联代币账户) */
77
+ export async function queryPosition(ctx, protocol, positionMint) {
78
+ const list = await lpPositions(ctx.client, ctx.owner, { protocols: [protocol], mints: [positionMint], includeClosed: true, signal: ctx.signal });
79
+ const found = list.find((p) => p.type === 'clmm' && p.positionMint === positionMint);
80
+ if (!found) {
81
+ throw new Error(`${ctx.owner} does not hold the ${protocol} position ${positionMint} (in its associated token account)`);
82
+ }
83
+ return found;
84
+ }
85
+ //# sourceMappingURL=clmm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clmm.js","sourceRoot":"","sources":["../../src/liquidity/clmm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiD,MAAM,UAAU,CAAA;AACrF,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,WAAW,GAEZ,MAAM,cAAc,CAAA;AAIrB,oGAAoG;AACpG,MAAM,UAAU,YAAY,CAAC,OAAoB,EAAE,MAA+B,EAAE,MAAqB,EAAE,MAAqB,EAAE,WAAmB;IACnJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAA;IAChF,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAA;IACnF,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IACD,IAAI,KAAa,CAAA;IACjB,IAAI,KAAa,CAAA;IACjB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,WAAW,CAAA;QACvD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,WAAW,CAAA;IAC1D,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACtD,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,SAAS,CAAA;QACxB,KAAK,GAAG,MAAM,CAAC,SAAS,CAAA;QACxB,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,GAAG,WAAW,KAAK,CAAC,EAAE,CAAC;gBAC9F,MAAM,IAAI,UAAU,CAAC,QAAQ,IAAI,+CAA+C,WAAW,YAAY,QAAQ,KAAK,QAAQ,GAAG,CAAC,CAAA;YAClI,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACxD,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QACrF,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACjE,OAAO,iBAAiB,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAkB,EAAE,MAAM,CAAC,QAAkB,CAAC,EAAE,WAAW,CAAC,CAAA;QAC1H,CAAC,CAAqB,CACrB;QAAA,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,4CAA4C,KAAK,4BAA4B,KAAK,iBAAiB,WAAW,GAAG,CAAC,CAAA;IACzI,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACvB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,YAAY,CAC1B,OAAoB,EACpB,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,SAAiB,EACjB,OAA2B,EAC3B,OAA2B,EAC3B,MAAqB,EACrB,MAAqB;IAErB,MAAM,IAAI,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAA;IACrD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,SAAS,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,KAAK,CAAC,iEAAiE,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAA;IACjI,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,SAAS,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,iEAAiE,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAA;IACjI,CAAC;IACD,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAC3K,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IACD,IAAI,SAAS,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiB,EAAE,MAAqB,EAAE,MAAqB,EAAE,SAAiB,EAAE,SAAiB;IAC3I,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAA;IAClE,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,QAAkB,EAAE,MAAM,CAAC,QAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;QACvG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,QAAkB,EAAE,MAAM,CAAC,QAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;QACvG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,QAAkB,EAAE,MAAM,CAAC,QAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;KACxG,CAAA;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAQ,EAAE,QAA2C,EAAE,YAAoB;IAC7G,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IAChJ,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAA6B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CAAA;IAC/G,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,sBAAsB,QAAQ,aAAa,YAAY,oCAAoC,CAAC,CAAA;IAC1H,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,94 @@
1
+ import type { SolanaClient } from '../client.js';
2
+ import { type AccountInfo } from '../layout.js';
3
+ import type { SolanaLpPosition, SolanaLpToken } from '../lp.js';
4
+ import type { Instruction } from '../write/transaction.js';
5
+ import type { SolanaLiquidityOptions, SolanaLiquidityPlan, SolanaPositionRef } from './types.js';
6
+ export declare const MEMO_PROGRAM_ID = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";
7
+ export declare const RENT_SYSVAR_ID = "SysvarRent111111111111111111111111111111111";
8
+ export declare const DEFAULT_ADDRESS = "11111111111111111111111111111111";
9
+ export interface Ctx {
10
+ client: SolanaClient;
11
+ owner: string;
12
+ recipient: string;
13
+ slippage: number;
14
+ native: boolean;
15
+ signal: AbortSignal | undefined;
16
+ }
17
+ export declare function createCtx(client: SolanaClient, owner: string, options: SolanaLiquidityOptions): Ctx;
18
+ export { Bytes } from '../lp.js';
19
+ /** 按字段顺序写指令数据(小端) */
20
+ export declare class Writer {
21
+ #private;
22
+ bytes(values: ArrayLike<number>): this;
23
+ u8(v: number): this;
24
+ bool(v: boolean): this;
25
+ i32(v: number): this;
26
+ u64(v: bigint): this;
27
+ u128(v: bigint): this;
28
+ build(): Uint8Array;
29
+ }
30
+ /** Anchor 指令判别符:sha256("global:<名称>") 的前 8 字节 */
31
+ export declare function anchorIx(name: string): Uint8Array;
32
+ export declare const w: (pubkey: string, isSigner?: boolean) => {
33
+ pubkey: string;
34
+ isSigner: boolean;
35
+ isWritable: boolean;
36
+ };
37
+ export declare const r: (pubkey: string, isSigner?: boolean) => {
38
+ pubkey: string;
39
+ isSigner: boolean;
40
+ isWritable: boolean;
41
+ };
42
+ /** 读账户,缺失时报错 */
43
+ export declare function mustAccounts(ctx: Ctx, addresses: readonly string[], what: (i: number) => string): Promise<AccountInfo[]>;
44
+ /** 代币的 mint 信息:所属的代币程序、精度 */
45
+ export interface MintMeta {
46
+ mint: string;
47
+ program: string;
48
+ decimals: number;
49
+ }
50
+ /**
51
+ * pool:池子里的两种代币。带转账手续费的 Token-2022 代币不支持(程序按扣费前 / 后的数量检查上下限,计划里的数量会对不上,
52
+ * 手续费超过滑点时交易一定失败),构建时报错;挖矿奖励的代币不检查(只影响到账数量)
53
+ */
54
+ export declare function mintMeta(mint: string, account: AccountInfo, pool?: boolean): MintMeta;
55
+ /** 代币信息(symbol / 精度),与 getLpPositions 的格式一致 */
56
+ export declare function tokenInfo(ctx: Ctx, mints: readonly MintMeta[]): Promise<SolanaLpToken[]>;
57
+ export declare function fmt(value: bigint, token: SolanaLpToken): string | null;
58
+ /** 解析输入的数量:amount(最小单位)和 formatted 二选一,都没给时返回 undefined */
59
+ export declare function parseAmount(raw: bigint | number | string | undefined, formatted: string | undefined, decimals: number, name: string): bigint | undefined;
60
+ /** 按滑点向下取:value × (1 − slippage) */
61
+ export declare function minus(value: bigint, slippage: number): bigint;
62
+ /** 按滑点向上取:value × (1 + slippage),向上取整 */
63
+ export declare function plus(value: bigint, slippage: number): bigint;
64
+ /** 移除的数量:percent(百分数)或 liquidity,二选一,默认全部 */
65
+ export declare function removeAmount(total: bigint, percent: number | undefined, liquidity: bigint | number | string | undefined): bigint;
66
+ /** 用 SOL 的是哪一边 */
67
+ export declare const nativeSide: (index: number | null) => "token0" | "token1" | null;
68
+ /**
69
+ * owner 的代币账户(ATA):添加时要付出的、移除时要收到的。
70
+ * 不存在时创建(setup);wSOL 且 native 时:添加前把差额 SOL 包装进去,最后(原来没有的)关闭换回 SOL
71
+ */
72
+ export interface TokenAccounts {
73
+ /** 每个 mint 的 ATA */
74
+ accounts: string[];
75
+ /** 创建缺少的代币账户 */
76
+ setup: Instruction[];
77
+ /** 包装 SOL(转入 + SyncNative):放在主指令前、同一步里(主指令失败时不会留下包装好的 SOL) */
78
+ wrap: Instruction[];
79
+ cleanup: Instruction[];
80
+ /** 哪一边用 SOL(下标),没有时为 null */
81
+ nativeIndex: number | null;
82
+ }
83
+ export declare function prepareTokenAccounts(ctx: Ctx, mints: readonly MintMeta[], pay: ReadonlyArray<bigint | null>): Promise<TokenAccounts>;
84
+ /** 仓位引用里的字段 */
85
+ export declare function refMint(ref: SolanaPositionRef | SolanaLpPosition): string;
86
+ export declare function refPool(ref: SolanaPositionRef | SolanaLpPosition): string;
87
+ /** 新的仓位 NFT mint:WebCrypto 生成 Ed25519 密钥,secretKey 是 32 字节种子(PKCS#8 的最后 32 字节) */
88
+ export declare function newMintKeypair(): Promise<{
89
+ address: string;
90
+ secretKey: Uint8Array;
91
+ }>;
92
+ type PlanInput = Omit<SolanaLiquidityPlan, 'owner' | 'amount0Formatted' | 'amount1Formatted' | 'fees0Formatted' | 'fees1Formatted'>;
93
+ export declare function makePlan(ctx: Ctx, input: PlanInput): SolanaLiquidityPlan;
94
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/liquidity/common.ts"],"names":[],"mappings":"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"}