@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.
- package/CHANGELOG.md +12 -0
- package/README.md +74 -1
- package/dist/address.d.ts +2 -0
- package/dist/address.d.ts.map +1 -1
- package/dist/address.js +8 -0
- package/dist/address.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/liquidity/amm.d.ts +7 -0
- package/dist/liquidity/amm.d.ts.map +1 -0
- package/dist/liquidity/amm.js +307 -0
- package/dist/liquidity/amm.js.map +1 -0
- package/dist/liquidity/clmm.d.ts +18 -0
- package/dist/liquidity/clmm.d.ts.map +1 -0
- package/dist/liquidity/clmm.js +85 -0
- package/dist/liquidity/clmm.js.map +1 -0
- package/dist/liquidity/common.d.ts +94 -0
- package/dist/liquidity/common.d.ts.map +1 -0
- package/dist/liquidity/common.js +228 -0
- package/dist/liquidity/common.js.map +1 -0
- package/dist/liquidity/index.d.ts +34 -0
- package/dist/liquidity/index.d.ts.map +1 -0
- package/dist/liquidity/index.js +157 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/liquidity/orca.d.ts +6 -0
- package/dist/liquidity/orca.d.ts.map +1 -0
- package/dist/liquidity/orca.js +303 -0
- package/dist/liquidity/orca.js.map +1 -0
- package/dist/liquidity/raydiumClmm.d.ts +6 -0
- package/dist/liquidity/raydiumClmm.d.ts.map +1 -0
- package/dist/liquidity/raydiumClmm.js +307 -0
- package/dist/liquidity/raydiumClmm.js.map +1 -0
- package/dist/liquidity/types.d.ts +150 -0
- package/dist/liquidity/types.d.ts.map +1 -0
- package/dist/liquidity/types.js +2 -0
- package/dist/liquidity/types.js.map +1 -0
- package/dist/lp.d.ts +45 -0
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +8 -7
- package/dist/lp.js.map +1 -1
- package/dist/lpMath.d.ts +45 -0
- package/dist/lpMath.d.ts.map +1 -1
- package/dist/lpMath.js +189 -0
- package/dist/lpMath.js.map +1 -1
- package/dist/subpaths/liquidity.d.ts +23 -0
- package/dist/subpaths/liquidity.d.ts.map +1 -0
- package/dist/subpaths/liquidity.js +19 -0
- package/dist/subpaths/liquidity.js.map +1 -0
- package/dist/subpaths/lp.d.ts +1 -1
- package/dist/subpaths/lp.d.ts.map +1 -1
- package/dist/subpaths/lp.js +1 -1
- package/dist/subpaths/lp.js.map +1 -1
- package/package.json +17 -10
- package/src/address.ts +9 -0
- package/src/index.ts +1 -1
- package/src/liquidity/amm.ts +353 -0
- package/src/liquidity/clmm.ts +108 -0
- package/src/liquidity/common.ts +285 -0
- package/src/liquidity/index.ts +177 -0
- package/src/liquidity/orca.ts +344 -0
- package/src/liquidity/raydiumClmm.ts +348 -0
- package/src/liquidity/types.ts +158 -0
- package/src/lp.ts +9 -8
- package/src/lpMath.ts +215 -0
- package/src/subpaths/liquidity.ts +45 -0
- package/src/subpaths/lp.ts +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### 新功能
|
|
6
|
+
|
|
7
|
+
- 添加 / 移除流动性,子路径 `@w3lib/solana-batch-call/liquidity`(不依赖各 DEX 的 SDK):
|
|
8
|
+
- `buildAddLiquidity` / `buildRemoveLiquidity` / `buildCollectFees` 只构建(报价 + 按顺序执行的指令),`addLiquidity` / `removeLiquidity` / `collectFees` 构建后签名发送(钱包同 `/write`)
|
|
9
|
+
- Raydium CLMM、Orca Whirlpool:新建仓位(价格区间 / tick / 全区间,给一边算另一边)、追加、按比例移除、全部移除并关闭仓位、领取手续费和挖矿奖励;Orca 自动初始化缺少的 tick 数组
|
|
10
|
+
- Raydium CPMM、AMM v4:存入(给一边,另一边按储备比例)、按比例取出
|
|
11
|
+
- SOL 自动包装 / 解包,缺少的代币账户自动创建;滑点按价格范围算集中流动性的上下限
|
|
12
|
+
- `createProgramAddress`(按给定种子算 PDA)
|
|
13
|
+
- `/lp` 的数学工具新增 `getLiquidityForAmounts`、`getMintAmounts`、`tickAtSqrtPrice`、`priceToTick`、`getMinAmounts` / `getMaxAmounts` 等
|
|
14
|
+
|
|
3
15
|
## 0.3.0
|
|
4
16
|
|
|
5
17
|
### 新功能
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @w3lib/solana-batch-call
|
|
2
2
|
|
|
3
|
-
Solana 批量读取库:余额(SOL / SPL Token / Token-2022)、代币详情、NFT、[LP 仓位](#lp-仓位)(子路径 `/lp`);以及[批量写操作](#批量写操作)(一对多转账、多钱包归集、批量调用程序,子路径 `/write`)。不依赖 Solana SDK,直接发 JSON-RPC。
|
|
3
|
+
Solana 批量读取库:余额(SOL / SPL Token / Token-2022)、代币详情、NFT、[LP 仓位](#lp-仓位)(子路径 `/lp`);[添加 / 移除流动性](#添加--移除流动性)(子路径 `/liquidity`);以及[批量写操作](#批量写操作)(一对多转账、多钱包归集、批量调用程序,子路径 `/write`)。不依赖 Solana SDK,直接发 JSON-RPC。
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
pnpm add @w3lib/solana-batch-call
|
|
@@ -136,6 +136,76 @@ await getLpPositions(owner, { provider, prices: true })
|
|
|
136
136
|
|
|
137
137
|
**局限**:质押在农场里的 LP 代币、Orca 的仓位组合(Position Bundle)、锁仓的 Raydium 仓位(NFT 不在用户名下)查不到;Meteora 等其他 DEX 暂不支持。免费公共节点不支持扫描(`getTokenAccountsByOwner`)和按 LP mint 找池子(`getProgramAccounts`),需要传 `mints` / `pools` 或用自己的节点(官方节点 `api.mainnet-beta.solana.com` 两个方法都支持,但只能在服务端用,且按方法限频:同一个批量请求里有两个 `getTokenAccountsByOwner` 就会被拒,可以用 `new HttpRpc(url, { batch: false })` 关闭合并)。
|
|
138
138
|
|
|
139
|
+
## 添加 / 移除流动性
|
|
140
|
+
|
|
141
|
+
子路径 `@w3lib/solana-batch-call/liquidity`:**Raydium CLMM**、**Orca Whirlpool**(仓位 NFT),**Raydium AMM v4**、**Raydium CPMM**(LP 代币),与 [LP 仓位](#lp-仓位) 相同的四个协议。不依赖各 DEX 的 SDK,指令按程序的格式本地编码。
|
|
142
|
+
|
|
143
|
+
- `buildAddLiquidity` / `buildRemoveLiquidity` / `buildCollectFees`:只读取、不签名,返回预计的数量和按顺序执行的指令(`steps`),可以当作报价,也可以自己组交易发送
|
|
144
|
+
- `addLiquidity` / `removeLiquidity` / `collectFees`:构建后签名发送,钱包与 `/write` 的 `batchCall` 相同(私钥、Keypair、Wallet Standard 钱包、wallet-adapter、@solana/kit 签名器)。准备工作(创建代币账户、初始化 Orca 的 tick 数组)和主指令能放进同一笔交易时合成一笔、原子执行(主指令模拟失败时什么都不发);放不下时先发准备工作。SOL 的包装和解包始终和主指令在同一步里,不会留下包装好的 SOL
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import { SolanaClient } from '@w3lib/solana-batch-call'
|
|
148
|
+
import { getLpPositions } from '@w3lib/solana-batch-call/lp'
|
|
149
|
+
import { addLiquidity, buildAddLiquidity, collectFees, removeLiquidity } from '@w3lib/solana-batch-call/liquidity'
|
|
150
|
+
|
|
151
|
+
const client = new SolanaClient(rpcUrl)
|
|
152
|
+
|
|
153
|
+
// 报价:新建集中流动性仓位。池子按地址指定,价格是“1 个 token0 值多少个 token1”(池子的方向),给一边的数量
|
|
154
|
+
const plan = await buildAddLiquidity(client, owner, {
|
|
155
|
+
protocol: 'raydium-clmm', pool, priceLower: 140, priceUpper: 160, // 或 fullRange: true,或 tickLower / tickUpper
|
|
156
|
+
amount0Formatted: '1', // 或 amount0(最小单位);也可以两边都给
|
|
157
|
+
})
|
|
158
|
+
// { type: 'clmm', token0: { mint, symbol: 'SOL', decimals: 9 }, token1, tickLower, tickUpper, tick, price, liquidity,
|
|
159
|
+
// amount0Formatted, amount1Formatted, amount0Max, amount1Max, native: 'token0', positionMint,
|
|
160
|
+
// steps: [{ kind: 'setup', instructions }, { kind: 'add', instructions }],
|
|
161
|
+
// signers: [{ address: positionMint, secretKey }] } // 新仓位 NFT 的临时密钥,主指令所在的交易要它签名
|
|
162
|
+
|
|
163
|
+
// 发送:SOL 自动包装 / 解包
|
|
164
|
+
await addLiquidity(client, secretKey, { protocol: 'orca-whirlpool', pool, fullRange: true, amount0Formatted: '0.5' })
|
|
165
|
+
await addLiquidity(client, secretKey, { protocol: 'raydium-cpmm', pool, amount1Formatted: '100' }) // AMM:给一边,另一边按储备比例
|
|
166
|
+
|
|
167
|
+
// 已有仓位:直接用 getLpPositions 的结果(或 { protocol, positionMint } / { protocol, pool })
|
|
168
|
+
const [position] = await getLpPositions(owner, { provider: rpcUrl })
|
|
169
|
+
await addLiquidity(client, secretKey, { position, amount0Formatted: '0.1' }) // 追加
|
|
170
|
+
await removeLiquidity(client, secretKey, { position, percent: 50 }) // 按比例移除(集中流动性同时领取手续费和挖矿奖励)
|
|
171
|
+
await removeLiquidity(client, secretKey, { position, burn: true }) // 全部移除、关闭仓位(退回租金)
|
|
172
|
+
await collectFees(client, secretKey, { position }) // 只领取手续费和奖励
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
| | Raydium CLMM | Orca Whirlpool | Raydium CPMM | Raydium AMM v4 |
|
|
176
|
+
| --- | --- | --- | --- | --- |
|
|
177
|
+
| 新建 / 追加 | `open_position_with_token22_nft`(NFT 用 Token-2022,tick 数组由程序创建)/ `increase_liquidity_v2` | 初始化缺少的 tick 数组 → `open_position_with_token_extensions` → `increase_liquidity_v2` | `deposit`(按 LP 数量,两边按上限) | `deposit`(固定一边,另一边按上限和最小值) |
|
|
178
|
+
| 移除 | `decrease_liquidity_v2`(同时领取手续费、奖励)+ `close_position` | `decrease_liquidity_v2` + `collect_fees_v2` + `collect_reward_v2` + `close_position` | `withdraw` | `withdraw`(带 OpenBook 市场账户) |
|
|
179
|
+
| 领取 | 流动性为 0 的 `decrease_liquidity_v2` | `update_fees_and_rewards` + `collect_fees_v2` + `collect_reward_v2` | 计入 LP 份额 | 计入 LP 份额 |
|
|
180
|
+
|
|
181
|
+
选项(构建和发送都可以传):
|
|
182
|
+
|
|
183
|
+
- `slippage`:价格滑点,默认 `0.005`。集中流动性添加按价格在 `[p × (1 − s), p × (1 + s)]` 内最不利时需要的数量给出 `amount0Max` / `amount1Max`(实际只扣按成交价格算的部分),移除给出 `amount0Min` / `amount1Min`;AMM 按数量 × (1 ± s),两边都给时,按较少的一边算,另一边的上限不超过给的数量
|
|
184
|
+
- `native`:wSOL 那一边用 SOL 支付 / 收取,默认 `true`。用的是 wSOL 的关联代币账户:原来没有时创建、用完关闭(剩下的换回 SOL);原来就有时只补差额、不关闭(收到的留在 wSOL 账户里)
|
|
185
|
+
- `recipient`:新建仓位的 NFT 归谁,默认发送者(Orca 要求是发送者:开仓和加流动性在同一笔交易里,要 NFT 持有者签名)
|
|
186
|
+
- 发送时还有 `/write` 的发送参数(`feePayer`、`priorityFee`、`wait`、`onUpdate`…)和 `checkBalance`(默认 true:代币按预计数量、SOL 按上限减去已有的 wSOL 检查)
|
|
187
|
+
|
|
188
|
+
数值与说明:
|
|
189
|
+
|
|
190
|
+
- **流动性**:集中流动性的 `liquidity` 与程序算出来的逐位一致;CPMM 存入拿到的 LP 与计划一致;AMM v4 的 LP 按储备比例预计(储备随交易变化)
|
|
191
|
+
- **仓位**:往已有仓位追加、移除、领取都要求发送者在关联代币账户里持有仓位 NFT / LP 代币(与 `getLpPositions` 传 `mints` 时相同)
|
|
192
|
+
- **全部移除并关闭**(`burn: true`):同一笔交易里先领取手续费和奖励,再关闭仓位账户和 NFT,退回租金
|
|
193
|
+
- **奖励**:池子有挖矿奖励时一并领取(`rewardMints`),收到发送者的关联代币账户(没有时创建);数量要等交易执行后才知道
|
|
194
|
+
- **Token-2022**:代币按各自的代币程序处理;带转账手续费的代币不支持(程序按扣费前 / 后的数量检查上下限,构建时直接报错);挖矿奖励的代币不限
|
|
195
|
+
|
|
196
|
+
核对方式:在主网上以真实仓位持有人 / 交易所热钱包的身份模拟执行(`simulateTransaction`,取回执行后的账户):Raydium CLMM 和 Orca 的新建、追加、部分移除、全部移除并关闭、领取,AMM v4 和 CPMM 的存入、取出,流动性 / LP 数量与计划逐位核对,收到的数量不少于最小值。
|
|
197
|
+
|
|
198
|
+
**局限**:
|
|
199
|
+
|
|
200
|
+
- 不使用地址查找表(ALT),一步的指令要能放进一笔 legacy 交易(最坏情况:Raydium 移除带 3 个奖励、位图扩展、关闭仓位约 1180 字节,在 1232 以内)
|
|
201
|
+
- 带转账钩子(transfer hook)的 Token-2022 代币不支持
|
|
202
|
+
- 奖励金库余额不足时程序只发放一部分、剩下的继续记账,这时 `burn: true` 关闭仓位会失败(不会扣代币),先不带 `burn` 移除
|
|
203
|
+
- AMM v4 执行前会结算待提取的收益,储备可能比读到的略少:`slippage: 0` 时存入 / 取出可能失败
|
|
204
|
+
- 新建集中流动性仓位需要 NFT mint 的临时密钥一起签名:会修改交易的钱包(如自动加优先费用)不能用于新建,追加 / 移除不受影响
|
|
205
|
+
- `dryRun: true` 时如果准备工作和主指令放不进一笔交易,主指令的模拟看不到准备工作的结果,会报失败
|
|
206
|
+
|
|
207
|
+
打包:在已经用到 `SolanaClient` 的基础上,只用 `build*` 约增加 43KB(minify,gzip 约 14KB,含 `/lp` 的仓位查询),加上发送约 66KB(gzip 约 22KB,含 `/write` 的发送代码)。
|
|
208
|
+
|
|
139
209
|
## 余额的三种模式
|
|
140
210
|
|
|
141
211
|
| | 指定 mints(默认,`accounts: 'ata'`) | 指定 mints + `accounts: 'all'` | 扫描(不传 mints,或 `scan: true`) |
|
|
@@ -394,6 +464,9 @@ Node 20.19+(依赖的 `@noble/hashes` 2.x 要求)、现代浏览器。写操
|
|
|
394
464
|
```bash
|
|
395
465
|
pnpm test # 单元测试(模拟节点,不需要网络)
|
|
396
466
|
pnpm test:live # 连真实节点(SOLANA_RPC 指定支持索引方法的节点;需要代理时加 NODE_USE_ENV_PROXY=1)
|
|
467
|
+
pnpm test:live:lp # LP 仓位连主网核对
|
|
468
|
+
pnpm test:live:liquidity # 加减流动性在主网上模拟(simulateTransaction,不发送)
|
|
469
|
+
pnpm demo # 本地运行 demo(demo/,直接用 src 的源码)
|
|
397
470
|
pnpm build
|
|
398
471
|
```
|
|
399
472
|
|
package/dist/address.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export declare function isOnCurve(bytes: Uint8Array): boolean;
|
|
|
13
13
|
* seeds 每项不超过 32 字节、最多 15 个(加上 bump 共 16 个,链上上限),超出时抛错。
|
|
14
14
|
*/
|
|
15
15
|
export declare function findProgramAddress(seeds: Uint8Array[], programId: string): string;
|
|
16
|
+
/** createProgramAddress:用给定的种子(含 bump / nonce)算 PDA;落在曲线上时报错(与 web3.js PublicKey.createProgramAddressSync 相同) */
|
|
17
|
+
export declare function createProgramAddress(seeds: Uint8Array[], programId: string): string;
|
|
16
18
|
/** 关联代币账户(ATA)地址 */
|
|
17
19
|
export declare function getAssociatedTokenAddress(owner: string, mint: string, tokenProgram: string): string;
|
|
18
20
|
/** Metaplex Token Metadata 账户地址 */
|
package/dist/address.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"AAKA,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CASzD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAMzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEvD;AA4BD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAoBpD;AAoBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA0BjF;AAED,oBAAoB;AACpB,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnG;AAED,mCAAmC;AACnC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"AAKA,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CASzD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAMzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEvD;AA4BD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAoBpD;AAoBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA0BjF;AAED,iHAAiH;AACjH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMnF;AAED,oBAAoB;AACpB,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnG;AAED,mCAAmC;AACnC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
package/dist/address.js
CHANGED
|
@@ -118,6 +118,14 @@ export function findProgramAddress(seeds, programId) {
|
|
|
118
118
|
}
|
|
119
119
|
throw new Error('Unable to find a viable program address bump seed');
|
|
120
120
|
}
|
|
121
|
+
/** createProgramAddress:用给定的种子(含 bump / nonce)算 PDA;落在曲线上时报错(与 web3.js PublicKey.createProgramAddressSync 相同) */
|
|
122
|
+
export function createProgramAddress(seeds, programId) {
|
|
123
|
+
const hash = sha256(concat([...seeds, decodeAddress(programId), PDA_MARKER]));
|
|
124
|
+
if (isOnCurve(hash)) {
|
|
125
|
+
throw new Error('Invalid seeds: address is on the ed25519 curve');
|
|
126
|
+
}
|
|
127
|
+
return encodeAddress(hash);
|
|
128
|
+
}
|
|
121
129
|
/** 关联代币账户(ATA)地址 */
|
|
122
130
|
export function getAssociatedTokenAddress(owner, mint, tokenProgram) {
|
|
123
131
|
return findProgramAddress([decodeAddress(owner), decodeAddress(tokenProgram), decodeAddress(mint)], ASSOCIATED_TOKEN_PROGRAM_ID);
|
package/dist/address.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { SolanaClient, exportTokenMetaCache, importTokenMetaCache, persistTokenM
|
|
|
2
2
|
export { getBalances, getMultiBalances, getNftOwners, getNfts, getOwnerNfts, getOwnerTokens, getSolBalances, getTokens, watchBalances, type GetBalancesOptions, type GetNftsOptions, type GetOwnerTokensOptions, type GetSolBalancesOptions, type GetTokensOptions, type WatchBalancesOptions, type ShortcutOptions, } from './shortcuts.js';
|
|
3
3
|
export { DEFAULT_TOKEN_FIELDS, type Commitment, type DefaultTokenField, type FailureReason, type NftDetails, type NftOwner, type OwnedToken, type SolBalance, type TokenBalance, type TokenDetails, type TokenField, type TokenProgramName, type TokenProgramOption, type TokenStandard, type TransferFee, type TransferFeeConfig, } from './types.js';
|
|
4
4
|
export { ASSOCIATED_TOKEN_PROGRAM_ID, DEFAULT_RPC_URLS, GENESIS_HASHES, METADATA_PROGRAM_ID, NATIVE_MINT, SOL_DECIMALS, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, clusterOfGenesis, type Cluster, } from './constants.js';
|
|
5
|
-
export { decodeAddress, encodeAddress, findProgramAddress, getAssociatedTokenAddress, getMetadataAddress, isAddress, isOnCurve } from './address.js';
|
|
5
|
+
export { createProgramAddress, decodeAddress, encodeAddress, findProgramAddress, getAssociatedTokenAddress, getMetadataAddress, isAddress, isOnCurve } from './address.js';
|
|
6
6
|
export { formatAmount, formatUnits, parseMetaplexMetadata, parseMint, parseTokenAccount, parseTransferFeeConfig, parseUnits, type AccountInfo, type MetaplexMetadata, type MintInfo, type TokenAccountInfo, type TokenMetadata, type TransferFeeConfigInfo, type TransferFeeInfo, } from './layout.js';
|
|
7
7
|
export { AllNodesFailedError, FallbackRpc, HttpError, HttpRpc, MIN_CONTEXT_SLOT_NOT_REACHED, RpcError, isNodeFault, nodeLabel, onRequest, type FallbackOptions, type HttpRpcOptions, type RequestEvent, type RpcTransport, } from './rpc.js';
|
|
8
8
|
export { NetworkCheckedRpc, NetworkMismatchError, type RpcSource, type SourceOptions } from './source.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,OAAO,GACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,OAAO,GACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC1K,OAAO,EACL,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,SAAS,EACT,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,SAAS,EACT,OAAO,EACP,4BAA4B,EAC5B,QAAQ,EACR,WAAW,EACX,SAAS,EACT,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { SolanaClient, exportTokenMetaCache, importTokenMetaCache, persistTokenM
|
|
|
2
2
|
export { getBalances, getMultiBalances, getNftOwners, getNfts, getOwnerNfts, getOwnerTokens, getSolBalances, getTokens, watchBalances, } from './shortcuts.js';
|
|
3
3
|
export { DEFAULT_TOKEN_FIELDS, } from './types.js';
|
|
4
4
|
export { ASSOCIATED_TOKEN_PROGRAM_ID, DEFAULT_RPC_URLS, GENESIS_HASHES, METADATA_PROGRAM_ID, NATIVE_MINT, SOL_DECIMALS, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, clusterOfGenesis, } from './constants.js';
|
|
5
|
-
export { decodeAddress, encodeAddress, findProgramAddress, getAssociatedTokenAddress, getMetadataAddress, isAddress, isOnCurve } from './address.js';
|
|
5
|
+
export { createProgramAddress, decodeAddress, encodeAddress, findProgramAddress, getAssociatedTokenAddress, getMetadataAddress, isAddress, isOnCurve } from './address.js';
|
|
6
6
|
export { formatAmount, formatUnits, parseMetaplexMetadata, parseMint, parseTokenAccount, parseTransferFeeConfig, parseUnits, } from './layout.js';
|
|
7
7
|
export { AllNodesFailedError, FallbackRpc, HttpError, HttpRpc, MIN_CONTEXT_SLOT_NOT_REACHED, RpcError, isNodeFault, nodeLabel, onRequest, } from './rpc.js';
|
|
8
8
|
export { NetworkCheckedRpc, NetworkMismatchError } from './source.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GAYtB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,GAQd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,GAgBrB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GAYtB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,GAQd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,GAgBrB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC1K,OAAO,EACL,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,SAAS,EACT,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,GAQX,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,SAAS,EACT,OAAO,EACP,4BAA4B,EAC5B,QAAQ,EACR,WAAW,EACX,SAAS,EACT,SAAS,GAKV,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAsC,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Ctx } from './common.js';
|
|
2
|
+
import type { SolanaIncreaseLiquidityParams, SolanaLiquidityPlan, SolanaNewPositionParams, SolanaRemoveLiquidityParams } from './types.js';
|
|
3
|
+
type AmmProtocol = 'raydium-amm' | 'raydium-cpmm';
|
|
4
|
+
export declare function ammAdd(ctx: Ctx, protocol: AmmProtocol, params: SolanaIncreaseLiquidityParams | SolanaNewPositionParams): Promise<SolanaLiquidityPlan>;
|
|
5
|
+
export declare function ammRemove(ctx: Ctx, protocol: AmmProtocol, params: SolanaRemoveLiquidityParams): Promise<SolanaLiquidityPlan>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=amm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amm.d.ts","sourceRoot":"","sources":["../../src/liquidity/amm.ts"],"names":[],"mappings":"AAeA,OAAO,EAkBL,KAAK,GAAG,EAET,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAE1I,KAAK,WAAW,GAAG,aAAa,GAAG,cAAc,CAAA;AAqGjD,wBAAsB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,6BAA6B,GAAG,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkH3J;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiGlI"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|