@w3lib/solana-batch-call 0.3.0 → 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 (68) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +74 -1
  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/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/liquidity/amm.d.ts +7 -0
  12. package/dist/liquidity/amm.d.ts.map +1 -0
  13. package/dist/liquidity/amm.js +307 -0
  14. package/dist/liquidity/amm.js.map +1 -0
  15. package/dist/liquidity/clmm.d.ts +18 -0
  16. package/dist/liquidity/clmm.d.ts.map +1 -0
  17. package/dist/liquidity/clmm.js +85 -0
  18. package/dist/liquidity/clmm.js.map +1 -0
  19. package/dist/liquidity/common.d.ts +94 -0
  20. package/dist/liquidity/common.d.ts.map +1 -0
  21. package/dist/liquidity/common.js +228 -0
  22. package/dist/liquidity/common.js.map +1 -0
  23. package/dist/liquidity/index.d.ts +34 -0
  24. package/dist/liquidity/index.d.ts.map +1 -0
  25. package/dist/liquidity/index.js +157 -0
  26. package/dist/liquidity/index.js.map +1 -0
  27. package/dist/liquidity/orca.d.ts +6 -0
  28. package/dist/liquidity/orca.d.ts.map +1 -0
  29. package/dist/liquidity/orca.js +303 -0
  30. package/dist/liquidity/orca.js.map +1 -0
  31. package/dist/liquidity/raydiumClmm.d.ts +6 -0
  32. package/dist/liquidity/raydiumClmm.d.ts.map +1 -0
  33. package/dist/liquidity/raydiumClmm.js +307 -0
  34. package/dist/liquidity/raydiumClmm.js.map +1 -0
  35. package/dist/liquidity/types.d.ts +150 -0
  36. package/dist/liquidity/types.d.ts.map +1 -0
  37. package/dist/liquidity/types.js +2 -0
  38. package/dist/liquidity/types.js.map +1 -0
  39. package/dist/lp.d.ts +45 -0
  40. package/dist/lp.d.ts.map +1 -1
  41. package/dist/lp.js +8 -7
  42. package/dist/lp.js.map +1 -1
  43. package/dist/lpMath.d.ts +45 -0
  44. package/dist/lpMath.d.ts.map +1 -1
  45. package/dist/lpMath.js +189 -0
  46. package/dist/lpMath.js.map +1 -1
  47. package/dist/subpaths/liquidity.d.ts +23 -0
  48. package/dist/subpaths/liquidity.d.ts.map +1 -0
  49. package/dist/subpaths/liquidity.js +19 -0
  50. package/dist/subpaths/liquidity.js.map +1 -0
  51. package/dist/subpaths/lp.d.ts +1 -1
  52. package/dist/subpaths/lp.d.ts.map +1 -1
  53. package/dist/subpaths/lp.js +1 -1
  54. package/dist/subpaths/lp.js.map +1 -1
  55. package/package.json +17 -10
  56. package/src/address.ts +9 -0
  57. package/src/index.ts +1 -1
  58. package/src/liquidity/amm.ts +353 -0
  59. package/src/liquidity/clmm.ts +108 -0
  60. package/src/liquidity/common.ts +285 -0
  61. package/src/liquidity/index.ts +177 -0
  62. package/src/liquidity/orca.ts +344 -0
  63. package/src/liquidity/raydiumClmm.ts +348 -0
  64. package/src/liquidity/types.ts +158 -0
  65. package/src/lp.ts +9 -8
  66. package/src/lpMath.ts +215 -0
  67. package/src/subpaths/liquidity.ts +45 -0
  68. package/src/subpaths/lp.ts +9 -0
@@ -0,0 +1,307 @@
1
+ import { decodeAddress, findProgramAddress, getAssociatedTokenAddress } from '../address.js';
2
+ import { ASSOCIATED_TOKEN_PROGRAM_ID, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '../constants.js';
3
+ import { RAYDIUM_CLMM_PROGRAM_ID, SOLANA_LP_PROTOCOLS, raydiumTickArray, utf8 } from '../lp.js';
4
+ import { getAmountsForLiquidity, getMaxAmounts, getMinAmounts, getMintAmounts, sqrtPriceAtTick } from '../lpMath.js';
5
+ import { liquidityFor, priceInfo, queryPosition, resolveRange } from './clmm.js';
6
+ import { Bytes, DEFAULT_ADDRESS, MEMO_PROGRAM_ID, RENT_SYSVAR_ID, Writer, anchorIx, makePlan, mintMeta, mustAccounts, nativeSide, newMintKeypair, parseAmount, prepareTokenAccounts, r, refMint, removeAmount, tokenInfo, w, } from './common.js';
7
+ const PROGRAM = RAYDIUM_CLMM_PROGRAM_ID;
8
+ const TICK_ARRAY_SIZE = 60;
9
+ /** 池子账户里的 tick 数组位图覆盖的范围:± tickSpacing × 60 × 512,超出时要带上位图扩展账户 */
10
+ const BITMAP_SIZE = 512;
11
+ /** PoolState:mint 73 / 105、vault 137 / 169、tick_spacing 235、sqrt_price 253、tick 269、reward_infos 397(3 个,每个 169 字节:mint +57、vault +89) */
12
+ function parsePool(address, data) {
13
+ if (data.length < 904) {
14
+ throw new Error(`Not a Raydium CLMM pool: ${address}`);
15
+ }
16
+ const b = new Bytes(data);
17
+ const rewards = [];
18
+ for (let i = 0; i < 3; i++) {
19
+ const offset = 397 + i * 169;
20
+ const mint = b.key(offset + 57);
21
+ // 与程序一致:奖励的 mint 不为默认地址就算已初始化
22
+ if (mint !== DEFAULT_ADDRESS) {
23
+ rewards.push({ mint, vault: b.key(offset + 89) });
24
+ }
25
+ }
26
+ return { address, mint0: b.key(73), mint1: b.key(105), vault0: b.key(137), vault1: b.key(169), tickSpacing: b.u16(235), sqrtPrice: b.u128(253), tick: b.i32(269), rewards };
27
+ }
28
+ /** 读池子和两种代币的 mint;已知 mint 时(已有仓位,查询结果里有)与池子一次读完 */
29
+ async function readPool(ctx, address, knownMints, extra = []) {
30
+ // 已知 mint 时与池子、额外的账户(如仓位 NFT 的 mint)一次读完
31
+ const first = await mustAccounts(ctx, [address, ...(knownMints ?? []), ...extra], (i) => (i > (knownMints?.length ?? 0) ? 'Account' : i ? 'Token mint' : 'Raydium CLMM pool'));
32
+ if (first[0]?.owner !== PROGRAM) {
33
+ throw new Error(`Not a Raydium CLMM pool: ${address}`);
34
+ }
35
+ const pool = parsePool(address, first[0].data);
36
+ const [m0, m1] = knownMints && knownMints[0] === pool.mint0 && knownMints[1] === pool.mint1 ? first.slice(1, 3) : await mustAccounts(ctx, [pool.mint0, pool.mint1], () => 'Token mint');
37
+ return { pool, mints: [mintMeta(pool.mint0, m0), mintMeta(pool.mint1, m1)], extra: first.slice(1 + (knownMints?.length ?? 0)) };
38
+ }
39
+ const be32 = (n) => {
40
+ const b = new Uint8Array(4);
41
+ new DataView(b.buffer).setInt32(0, n, false);
42
+ return b;
43
+ };
44
+ const personalPositionAddress = (nftMint) => findProgramAddress([utf8('position'), decodeAddress(nftMint)], PROGRAM);
45
+ /**
46
+ * ProtocolPositionState:程序的种子是 tick 的大端字节(to_be_bytes)。当前版本的程序已不再校验这个账户(官方 SDK 传的是小端推导出的地址,
47
+ * 主网照样成功),按程序的种子推导,以后恢复校验也对
48
+ */
49
+ const protocolPositionAddress = (pool, lower, upper) => findProgramAddress([utf8('position'), decodeAddress(pool), be32(lower), be32(upper)], PROGRAM);
50
+ /** 区间两端的 tick 数组;超出池子位图覆盖的范围时还要位图扩展账户 */
51
+ function tickAccounts(pool, tickLower, tickUpper) {
52
+ const lower = raydiumTickArray(pool.address, tickLower, pool.tickSpacing);
53
+ const upper = raydiumTickArray(pool.address, tickUpper, pool.tickSpacing);
54
+ const [lowerStart, upperStart] = [lower.start, upper.start];
55
+ const max = pool.tickSpacing * TICK_ARRAY_SIZE * BITMAP_SIZE;
56
+ const overflow = [lowerStart, upperStart].some((s) => s >= max || s < -max);
57
+ return {
58
+ lowerStart,
59
+ upperStart,
60
+ lower: lower.address,
61
+ upper: upper.address,
62
+ bitmap: overflow ? [w(findProgramAddress([utf8('pool_tick_array_bitmap_extension'), decodeAddress(pool.address)], PROGRAM))] : [],
63
+ };
64
+ }
65
+ export async function raydiumAdd(ctx, params) {
66
+ let pool;
67
+ let mints;
68
+ let tickLower;
69
+ let tickUpper;
70
+ /** 已有仓位:NFT mint 和它的代币程序 */
71
+ let existing = null;
72
+ /** 已有仓位:代币信息用查询结果里的,不再读一次 */
73
+ let known = null;
74
+ if ('position' in params) {
75
+ const mint = refMint(params.position);
76
+ const position = await queryPosition(ctx, 'raydium-clmm', mint);
77
+ known = [position.token0, position.token1];
78
+ let nft;
79
+ ({ pool, mints, extra: nft } = await readPool(ctx, position.pool, [position.token0.mint, position.token1.mint], [mint]));
80
+ [tickLower, tickUpper] = [position.tickLower, position.tickUpper];
81
+ existing = { mint, program: nft[0].owner };
82
+ }
83
+ else {
84
+ ;
85
+ ({ pool, mints } = await readPool(ctx, params.pool));
86
+ tickLower = 0;
87
+ tickUpper = 0;
88
+ }
89
+ const [token0, token1] = known ?? (await tokenInfo(ctx, mints));
90
+ if (!existing) {
91
+ ;
92
+ [tickLower, tickUpper] = resolveRange('raydium', params, token0, token1, pool.tickSpacing);
93
+ }
94
+ const amount0 = parseAmount(params.amount0, params.amount0Formatted, mints[0].decimals, 'amount0');
95
+ const amount1 = parseAmount(params.amount1, params.amount1Formatted, mints[1].decimals, 'amount1');
96
+ const liquidity = liquidityFor('raydium', pool.tick, pool.sqrtPrice, tickLower, tickUpper, amount0, amount1, token0, token1);
97
+ const sqrtA = sqrtPriceAtTick('raydium', tickLower);
98
+ const sqrtB = sqrtPriceAtTick('raydium', tickUpper);
99
+ const [expected0, expected1] = getMintAmounts(pool.tick, pool.sqrtPrice, sqrtA, sqrtB, liquidity, tickLower, tickUpper);
100
+ const [max0, max1] = getMaxAmounts('raydium', pool.sqrtPrice, tickLower, tickUpper, liquidity, ctx.slippage);
101
+ const tokens = await prepareTokenAccounts(ctx, mints, [max0, max1]);
102
+ const ticks = tickAccounts(pool, tickLower, tickUpper);
103
+ const protocolPosition = protocolPositionAddress(pool.address, tickLower, tickUpper);
104
+ const signers = [];
105
+ let positionMint;
106
+ let ix;
107
+ if (existing) {
108
+ positionMint = existing.mint;
109
+ ix = {
110
+ programId: PROGRAM,
111
+ keys: [
112
+ r(ctx.owner, true),
113
+ r(getAssociatedTokenAddress(ctx.owner, existing.mint, existing.program)),
114
+ w(pool.address),
115
+ r(protocolPosition),
116
+ w(personalPositionAddress(existing.mint)),
117
+ w(ticks.lower),
118
+ w(ticks.upper),
119
+ w(tokens.accounts[0]),
120
+ w(tokens.accounts[1]),
121
+ w(pool.vault0),
122
+ w(pool.vault1),
123
+ r(TOKEN_PROGRAM_ID),
124
+ r(TOKEN_2022_PROGRAM_ID),
125
+ r(pool.mint0),
126
+ r(pool.mint1),
127
+ ...ticks.bitmap,
128
+ ],
129
+ // base_flag: None(按给定的流动性)
130
+ data: new Writer().bytes(anchorIx('increase_liquidity_v2')).u128(liquidity).u64(max0).u64(max1).u8(0).bool(false).build(),
131
+ };
132
+ }
133
+ else {
134
+ const nft = await newMintKeypair();
135
+ signers.push(nft);
136
+ positionMint = nft.address;
137
+ ix = {
138
+ programId: PROGRAM,
139
+ keys: [
140
+ w(ctx.owner, true),
141
+ r(ctx.recipient),
142
+ w(nft.address, true),
143
+ w(getAssociatedTokenAddress(ctx.recipient, nft.address, TOKEN_2022_PROGRAM_ID)),
144
+ w(pool.address),
145
+ r(protocolPosition),
146
+ w(ticks.lower),
147
+ w(ticks.upper),
148
+ w(personalPositionAddress(nft.address)),
149
+ w(tokens.accounts[0]),
150
+ w(tokens.accounts[1]),
151
+ w(pool.vault0),
152
+ w(pool.vault1),
153
+ r(RENT_SYSVAR_ID),
154
+ r(SYSTEM_PROGRAM_ID),
155
+ r(TOKEN_PROGRAM_ID),
156
+ r(ASSOCIATED_TOKEN_PROGRAM_ID),
157
+ r(TOKEN_2022_PROGRAM_ID),
158
+ r(pool.mint0),
159
+ r(pool.mint1),
160
+ ...ticks.bitmap,
161
+ ],
162
+ // 仓位 NFT 用 Token-2022(不建 Metaplex 元数据,租金更少);tick 数组不存在时程序自动创建
163
+ data: new Writer()
164
+ .bytes(anchorIx('open_position_with_token22_nft'))
165
+ .i32(tickLower)
166
+ .i32(tickUpper)
167
+ .i32(ticks.lowerStart)
168
+ .i32(ticks.upperStart)
169
+ .u128(liquidity)
170
+ .u64(max0)
171
+ .u64(max1)
172
+ .bool(false)
173
+ .u8(0)
174
+ .bool(false)
175
+ .build(),
176
+ };
177
+ }
178
+ return makePlan(ctx, {
179
+ action: 'add',
180
+ protocol: 'raydium-clmm',
181
+ protocolName: SOLANA_LP_PROTOCOLS['raydium-clmm'].name,
182
+ type: 'clmm',
183
+ pool: pool.address,
184
+ token0,
185
+ token1,
186
+ positionMint,
187
+ position: personalPositionAddress(positionMint),
188
+ lpMint: null,
189
+ tickLower,
190
+ tickUpper,
191
+ ...priceInfo(pool.tick, pool.sqrtPrice, token0, token1, tickLower, tickUpper),
192
+ liquidity: liquidity.toString(),
193
+ amount0: expected0.toString(),
194
+ amount1: expected1.toString(),
195
+ amount0Max: max0.toString(),
196
+ amount1Max: max1.toString(),
197
+ amount0Min: null,
198
+ amount1Min: null,
199
+ // 追加流动性时 Raydium 不领取手续费(留在仓位里)
200
+ fees0: '0',
201
+ fees1: '0',
202
+ rewardMints: [],
203
+ native: nativeSide(tokens.nativeIndex),
204
+ steps: [
205
+ { kind: 'setup', instructions: tokens.setup },
206
+ { kind: 'add', instructions: [...tokens.wrap, ix, ...tokens.cleanup] },
207
+ ],
208
+ signers,
209
+ });
210
+ }
211
+ /** 移除(liquidity > 0)/ 只领取手续费和奖励(collectOnly:流动性为 0 的 decrease) */
212
+ export async function raydiumRemove(ctx, params, collectOnly = false) {
213
+ const mint = refMint(params.position);
214
+ const position = await queryPosition(ctx, 'raydium-clmm', mint);
215
+ const { pool, mints, extra } = await readPool(ctx, position.pool, [position.token0.mint, position.token1.mint], [mint]);
216
+ const total = BigInt(position.liquidity);
217
+ let liquidity = 0n;
218
+ if (!collectOnly) {
219
+ if (total === 0n) {
220
+ throw new Error(`Position ${mint} has no liquidity; use collectFees to collect what is owed`);
221
+ }
222
+ liquidity = removeAmount(total, params.percent, params.liquidity);
223
+ }
224
+ const burn = !collectOnly && !!params.burn;
225
+ if (burn && liquidity !== total) {
226
+ throw new Error('burn: true needs the whole position to be removed');
227
+ }
228
+ const [token0, token1] = [position.token0, position.token1];
229
+ const { tickLower, tickUpper } = position;
230
+ const [amount0, amount1] = getAmountsForLiquidity(pool.tick, pool.sqrtPrice, sqrtPriceAtTick('raydium', tickLower), sqrtPriceAtTick('raydium', tickUpper), liquidity, tickLower, tickUpper);
231
+ const [min0, min1] = liquidity === 0n ? [0n, 0n] : getMinAmounts('raydium', pool.sqrtPrice, tickLower, tickUpper, liquidity, ctx.slippage);
232
+ const nftAccount = extra[0];
233
+ const rewardMintAccounts = pool.rewards.length ? await mustAccounts(ctx, pool.rewards.map((x) => x.mint), () => 'Reward mint') : [];
234
+ const nftProgram = nftAccount.owner;
235
+ const rewardMints = pool.rewards.map((x, i) => mintMeta(x.mint, rewardMintAccounts[i], false));
236
+ // 两种代币和奖励的代币都收到 owner 的关联代币账户:没有时创建;wSOL(池子的一边或奖励)原来没有账户时用完关闭、换回 SOL
237
+ const rewardOnly = rewardMints.filter((m) => !mints.some((x) => x.mint === m.mint));
238
+ const tokens = await prepareTokenAccounts(ctx, [...mints, ...rewardOnly], [null, null, ...rewardOnly.map(() => null)]);
239
+ const rewardAccounts = rewardMints.map((m) => getAssociatedTokenAddress(ctx.owner, m.mint, m.program));
240
+ const ticks = tickAccounts(pool, tickLower, tickUpper);
241
+ const personal = personalPositionAddress(mint);
242
+ const nftAta = getAssociatedTokenAddress(ctx.owner, mint, nftProgram);
243
+ const decrease = {
244
+ programId: PROGRAM,
245
+ keys: [
246
+ r(ctx.owner, true),
247
+ r(nftAta),
248
+ w(personal),
249
+ w(pool.address),
250
+ r(protocolPositionAddress(pool.address, tickLower, tickUpper)),
251
+ w(pool.vault0),
252
+ w(pool.vault1),
253
+ w(ticks.lower),
254
+ w(ticks.upper),
255
+ w(tokens.accounts[0]),
256
+ w(tokens.accounts[1]),
257
+ r(TOKEN_PROGRAM_ID),
258
+ r(TOKEN_2022_PROGRAM_ID),
259
+ r(MEMO_PROGRAM_ID),
260
+ r(pool.mint0),
261
+ r(pool.mint1),
262
+ ...ticks.bitmap,
263
+ ...pool.rewards.flatMap((x, i) => [w(x.vault), w(rewardAccounts[i]), r(x.mint)]),
264
+ ],
265
+ data: new Writer().bytes(anchorIx('decrease_liquidity_v2')).u128(liquidity).u64(min0).u64(min1).build(),
266
+ };
267
+ const main = [decrease];
268
+ if (burn) {
269
+ main.push({
270
+ programId: PROGRAM,
271
+ keys: [w(ctx.owner, true), w(mint), w(nftAta), w(personal), r(SYSTEM_PROGRAM_ID), r(nftProgram), w(pool.address)],
272
+ data: anchorIx('close_position'),
273
+ });
274
+ }
275
+ return makePlan(ctx, {
276
+ action: collectOnly ? 'collect' : 'remove',
277
+ protocol: 'raydium-clmm',
278
+ protocolName: SOLANA_LP_PROTOCOLS['raydium-clmm'].name,
279
+ type: 'clmm',
280
+ pool: pool.address,
281
+ token0,
282
+ token1,
283
+ positionMint: mint,
284
+ position: personal,
285
+ lpMint: null,
286
+ tickLower,
287
+ tickUpper,
288
+ ...priceInfo(pool.tick, pool.sqrtPrice, token0, token1, tickLower, tickUpper),
289
+ liquidity: liquidity.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: position.fees0 ?? '0',
297
+ fees1: position.fees1 ?? '0',
298
+ rewardMints: rewardMints.map((m) => m.mint),
299
+ native: nativeSide(tokens.nativeIndex),
300
+ steps: [
301
+ { kind: 'setup', instructions: tokens.setup },
302
+ { kind: collectOnly ? 'collect' : 'remove', instructions: [...tokens.wrap, ...main, ...tokens.cleanup] },
303
+ ],
304
+ signers: [],
305
+ });
306
+ }
307
+ //# sourceMappingURL=raydiumClmm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raydiumClmm.js","sourceRoot":"","sources":["../../src/liquidity/raydiumClmm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import type { SolanaLpPosition, SolanaLpProtocol, SolanaLpToken } from '../lp.js';
2
+ import type { SendOptions, WriteResult, WriteStatus } from '../write/send.js';
3
+ import type { Instruction } from '../write/transaction.js';
4
+ type Amount = bigint | number | string;
5
+ /**
6
+ * 已有的仓位:直接传 getLpPositions 查到的 SolanaLpPosition,或者只传能定位仓位的字段:
7
+ * - Raydium CLMM / Orca Whirlpool:positionMint(仓位 NFT 的 mint)
8
+ * - Raydium AMM v4 / CPMM:pool(池子地址)
9
+ */
10
+ export interface SolanaPositionRef {
11
+ protocol: SolanaLpProtocol;
12
+ positionMint?: string;
13
+ pool?: string;
14
+ }
15
+ /** 往已有仓位追加:两边数量给一边即可(另一边按当前价格算),也可以都给(按较少的一边) */
16
+ export interface SolanaIncreaseLiquidityParams {
17
+ position: SolanaPositionRef | SolanaLpPosition;
18
+ /** token0 的数量:amount0(最小单位)和 amount0Formatted(按精度换算,如 '1.5')二选一 */
19
+ amount0?: Amount;
20
+ amount0Formatted?: string;
21
+ amount1?: Amount;
22
+ amount1Formatted?: string;
23
+ }
24
+ /**
25
+ * 新建仓位(Raydium CLMM / Orca:一个新的仓位 NFT;AMM v4 / CPMM:往池子里加流动性,拿到 LP 代币)。
26
+ * 池子用地址指定(Solana 上同一对代币有很多池子,按地址最明确);价格是“1 个 token0 值多少个 token1”(池子的方向)
27
+ */
28
+ export interface SolanaNewPositionParams {
29
+ protocol: SolanaLpProtocol;
30
+ pool: string;
31
+ /** 集中流动性:价格区间(token1 / token0,取最近的可用 tick);或直接给 tick;或 fullRange */
32
+ priceLower?: string | number;
33
+ priceUpper?: string | number;
34
+ tickLower?: number;
35
+ tickUpper?: number;
36
+ fullRange?: boolean;
37
+ amount0?: Amount;
38
+ amount0Formatted?: string;
39
+ amount1?: Amount;
40
+ amount1Formatted?: string;
41
+ }
42
+ export type SolanaAddLiquidityParams = SolanaIncreaseLiquidityParams | SolanaNewPositionParams;
43
+ export interface SolanaRemoveLiquidityParams {
44
+ position: SolanaPositionRef | SolanaLpPosition;
45
+ /** 移除的比例(百分数,(0, 100]),默认 100 */
46
+ percent?: number;
47
+ /** 或者直接给移除的数量:集中流动性是 L,AMM 是 LP 代币数量(最小单位) */
48
+ liquidity?: Amount;
49
+ /** 集中流动性:全部移除后关闭仓位、销毁 NFT(退回租金),默认 false */
50
+ burn?: boolean;
51
+ }
52
+ export interface SolanaCollectFeesParams {
53
+ /** 集中流动性的仓位(AMM 的手续费已经计入 LP 份额) */
54
+ position: SolanaPositionRef | SolanaLpPosition;
55
+ }
56
+ export interface SolanaLiquidityOptions {
57
+ /** 价格滑点(比例,0.005 = 0.5%),默认 0.005 */
58
+ slippage?: number;
59
+ /**
60
+ * Wrapped SOL 那一边用 SOL 支付 / 收取(自动包装 / 解包),默认 true。
61
+ * 用的是 wSOL 的关联代币账户:原来没有时创建、用完关闭(剩余的 wSOL 换回 SOL);原来就有时只补差额、不关闭
62
+ */
63
+ native?: boolean;
64
+ /** 新建仓位的 NFT 归谁,默认 owner */
65
+ recipient?: string;
66
+ /** 取消读取 */
67
+ signal?: AbortSignal;
68
+ }
69
+ /** 一步:要原子执行的一组指令 */
70
+ export interface SolanaLiquidityStep {
71
+ /**
72
+ * - setup:创建代币账户、初始化 tick 数组等准备工作(与主指令能放进同一笔交易时会合并)
73
+ * - add / remove / collect:添加 / 移除流动性、领取手续费
74
+ */
75
+ kind: 'setup' | 'add' | 'remove' | 'collect';
76
+ instructions: Instruction[];
77
+ }
78
+ /** 添加 / 移除流动性的计划:预计的数量 + 按顺序执行的指令。只读取、不签名,可以当作报价 */
79
+ export interface SolanaLiquidityPlan {
80
+ action: 'add' | 'remove' | 'collect';
81
+ protocol: SolanaLpProtocol;
82
+ protocolName: string;
83
+ type: 'clmm' | 'amm';
84
+ pool: string;
85
+ owner: string;
86
+ token0: SolanaLpToken;
87
+ token1: SolanaLpToken;
88
+ /** 集中流动性:仓位 NFT 的 mint(新建时是新生成的,见 signers)和仓位账户 */
89
+ positionMint: string | null;
90
+ position: string | null;
91
+ /** AMM:LP 代币的 mint */
92
+ lpMint: string | null;
93
+ /** 集中流动性:区间、池子当前的 tick 和价格(token1 / token0,按精度换算,只用于展示) */
94
+ tickLower: number | null;
95
+ tickUpper: number | null;
96
+ tick: number | null;
97
+ price: number | null;
98
+ priceLower: number | null;
99
+ priceUpper: number | null;
100
+ /** 添加 / 移除的流动性:集中流动性是 L;AMM 是 LP 代币数量 */
101
+ liquidity: string;
102
+ /** 按当前价格预计存入 / 取出的数量(不含手续费) */
103
+ amount0: string;
104
+ amount1: string;
105
+ amount0Formatted: string | null;
106
+ amount1Formatted: string | null;
107
+ /** 添加:最多会用掉的数量(按滑点);移除:null */
108
+ amount0Max: string | null;
109
+ amount1Max: string | null;
110
+ /** 移除:至少会拿到的数量;添加:null */
111
+ amount0Min: string | null;
112
+ amount1Min: string | null;
113
+ /** 一并领取的未领取手续费(集中流动性移除 / 领取时);AMM 为 '0' */
114
+ fees0: string;
115
+ fees1: string;
116
+ fees0Formatted: string | null;
117
+ fees1Formatted: string | null;
118
+ /** 一并领取的挖矿奖励的代币(集中流动性移除 / 领取时;数量要等交易执行后才知道) */
119
+ rewardMints: string[];
120
+ /** 哪一边用 SOL 支付 / 收取(自动包装 / 解包 wSOL) */
121
+ native: 'token0' | 'token1' | null;
122
+ /** 按顺序执行;setup 和主指令能放进同一笔交易时会合并 */
123
+ steps: SolanaLiquidityStep[];
124
+ /**
125
+ * 除 owner 外还需要签名的临时密钥(新建集中流动性仓位时的 NFT mint,32 字节种子)。
126
+ * 自己发送时用它签名主指令所在的交易(如 web3.js 的 Keypair.fromSeed(secretKey))
127
+ */
128
+ signers: Array<{
129
+ address: string;
130
+ secretKey: Uint8Array;
131
+ }>;
132
+ }
133
+ export interface SolanaLiquiditySendOptions extends SolanaLiquidityOptions, Omit<SendOptions, 'onUpdate' | 'signal'> {
134
+ /** 发送前检查余额够不够(添加时),默认 true */
135
+ checkBalance?: boolean;
136
+ onUpdate?: (result: SolanaLiquidityStepResult) => void;
137
+ }
138
+ export interface SolanaLiquidityStepResult extends WriteResult {
139
+ kind: SolanaLiquidityStep['kind'];
140
+ }
141
+ export interface SolanaLiquidityResult {
142
+ plan: SolanaLiquidityPlan;
143
+ /** 与 plan.steps 一一对应 */
144
+ results: SolanaLiquidityStepResult[];
145
+ /** 主指令(最后一步)的状态和签名 */
146
+ status: WriteStatus;
147
+ signature: string | null;
148
+ }
149
+ export {};
150
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/liquidity/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/liquidity/types.ts"],"names":[],"mappings":""}
package/dist/lp.d.ts CHANGED
@@ -1,8 +1,13 @@
1
1
  import type { RequestOptions, SolanaClient } from './client.js';
2
+ import { type AccountInfo } from './layout.js';
2
3
  export declare const RAYDIUM_CLMM_PROGRAM_ID = "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK";
3
4
  export declare const ORCA_WHIRLPOOL_PROGRAM_ID = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc";
4
5
  export declare const RAYDIUM_AMM_PROGRAM_ID = "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8";
5
6
  export declare const RAYDIUM_CPMM_PROGRAM_ID = "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C";
7
+ /** AMM v4 的 LP mint 权限(固定地址) */
8
+ export declare const RAYDIUM_AMM_AUTHORITY = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1";
9
+ /** CPMM 的 LP mint 权限:PDA ["vault_and_lp_mint_auth_seed"] */
10
+ export declare const RAYDIUM_CPMM_AUTHORITY = "GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL";
6
11
  export type SolanaLpProtocol = 'raydium-clmm' | 'orca-whirlpool' | 'raydium-amm' | 'raydium-cpmm';
7
12
  export declare const SOLANA_LP_PROTOCOLS: Readonly<Record<SolanaLpProtocol, {
8
13
  name: string;
@@ -110,6 +115,46 @@ export interface LpPositionsOptions extends RequestOptions {
110
115
  /** 查价格用的 fetch,默认全局 fetch */
111
116
  fetch?: typeof fetch;
112
117
  }
118
+ /** 小端读取账户数据(添加 / 移除流动性也用) */
119
+ export declare class Bytes {
120
+ #private;
121
+ readonly data: Uint8Array;
122
+ constructor(data: Uint8Array);
123
+ u8(o: number): number;
124
+ u16(o: number): number;
125
+ u32(o: number): number;
126
+ i32(o: number): number;
127
+ u64(o: number): bigint;
128
+ u128(o: number): bigint;
129
+ key(o: number): string;
130
+ }
131
+ export interface AmmPoolState {
132
+ protocol: 'raydium-amm' | 'raydium-cpmm';
133
+ address: string;
134
+ lpMint: string;
135
+ mint0: string;
136
+ mint1: string;
137
+ vault0: string;
138
+ vault1: string;
139
+ decimals0: number;
140
+ decimals1: number;
141
+ /** 从金库余额里扣掉的、不属于 LP 的部分(AMM v4 待提取的收益;CPMM 协议 / 基金 / 创建者手续费) */
142
+ reserved0: bigint;
143
+ reserved1: bigint;
144
+ lpSupply: bigint;
145
+ }
146
+ export declare function parseAmmPool(account: AccountInfo): AmmPoolState | null;
147
+ export declare const utf8: (s: string) => Uint8Array<ArrayBuffer>;
148
+ /** Raydium tick 数组:PDA ["tick_array", pool, start(i32 大端)],每个数组 60 个 tick */
149
+ export declare function raydiumTickArray(pool: string, tick: number, spacing: number): {
150
+ address: string;
151
+ start: number;
152
+ };
153
+ /** Orca tick 数组:PDA ["tick_array", whirlpool, start(十进制字符串)],每个数组 88 个 tick */
154
+ export declare function orcaTickArray(pool: string, tick: number, spacing: number): {
155
+ address: string;
156
+ start: number;
157
+ };
113
158
  /**
114
159
  * 查一个地址的 LP 仓位:Raydium CLMM / Orca Whirlpool 的仓位 NFT,Raydium AMM v4 / CPMM 的 LP 代币。
115
160
  * 返回两种代币的数量、未领取的手续费(集中流动性),可选美元价值。
package/dist/lp.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lp.d.ts","sourceRoot":"","sources":["../src/lp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lp.d.ts","sourceRoot":"","sources":["../src/lp.ts"],"names":[],"mappings":"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"}
package/dist/lp.js CHANGED
@@ -9,9 +9,9 @@ export const ORCA_WHIRLPOOL_PROGRAM_ID = 'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3u
9
9
  export const RAYDIUM_AMM_PROGRAM_ID = '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8';
10
10
  export const RAYDIUM_CPMM_PROGRAM_ID = 'CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C';
11
11
  /** AMM v4 的 LP mint 权限(固定地址) */
12
- const RAYDIUM_AMM_AUTHORITY = '5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1';
12
+ export const RAYDIUM_AMM_AUTHORITY = '5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1';
13
13
  /** CPMM 的 LP mint 权限:PDA ["vault_and_lp_mint_auth_seed"] */
14
- const RAYDIUM_CPMM_AUTHORITY = 'GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL';
14
+ export const RAYDIUM_CPMM_AUTHORITY = 'GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL';
15
15
  export const SOLANA_LP_PROTOCOLS = {
16
16
  'raydium-clmm': { name: 'Raydium CLMM', type: 'clmm', programId: RAYDIUM_CLMM_PROGRAM_ID },
17
17
  'orca-whirlpool': { name: 'Orca Whirlpool', type: 'clmm', programId: ORCA_WHIRLPOOL_PROGRAM_ID },
@@ -48,7 +48,8 @@ export function defillamaPrices(options = {}) {
48
48
  // ---------------------------------------------------------------------------
49
49
  // 账户布局(各程序的 Anchor / 原生账户,偏移量含 8 字节判别符)
50
50
  // ---------------------------------------------------------------------------
51
- class Bytes {
51
+ /** 小端读取账户数据(添加 / 移除流动性也用) */
52
+ export class Bytes {
52
53
  data;
53
54
  #view;
54
55
  constructor(data) {
@@ -180,7 +181,7 @@ function cpmmPool(address, b) {
180
181
  reserved1: b.u64(349) + b.u64(365) + b.u64(405),
181
182
  };
182
183
  }
183
- function parseAmmPool(account) {
184
+ export function parseAmmPool(account) {
184
185
  const b = new Bytes(account.data);
185
186
  if (account.owner === RAYDIUM_AMM_PROGRAM_ID && account.data.length === AMM_POOL_SIZE) {
186
187
  return ammPool(account.address, b);
@@ -190,19 +191,19 @@ function parseAmmPool(account) {
190
191
  }
191
192
  return null;
192
193
  }
193
- const utf8 = (s) => new TextEncoder().encode(s);
194
+ export const utf8 = (s) => new TextEncoder().encode(s);
194
195
  function floorDiv(a, b) {
195
196
  return Math.floor(a / b) * b;
196
197
  }
197
198
  /** Raydium tick 数组:PDA ["tick_array", pool, start(i32 大端)],每个数组 60 个 tick */
198
- function raydiumTickArray(pool, tick, spacing) {
199
+ export function raydiumTickArray(pool, tick, spacing) {
199
200
  const start = floorDiv(tick, spacing * RAYDIUM_TICK_ARRAY_SIZE);
200
201
  const be = new Uint8Array(4);
201
202
  new DataView(be.buffer).setInt32(0, start, false);
202
203
  return { address: findProgramAddress([utf8('tick_array'), decodeAddress(pool), be], RAYDIUM_CLMM_PROGRAM_ID), start };
203
204
  }
204
205
  /** Orca tick 数组:PDA ["tick_array", whirlpool, start(十进制字符串)],每个数组 88 个 tick */
205
- function orcaTickArray(pool, tick, spacing) {
206
+ export function orcaTickArray(pool, tick, spacing) {
206
207
  const start = floorDiv(tick, spacing * ORCA_TICK_ARRAY_SIZE);
207
208
  return { address: findProgramAddress([utf8('tick_array'), decodeAddress(pool), utf8(String(start))], ORCA_WHIRLPOOL_PROGRAM_ID), start };
208
209
  }