@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.
- package/CHANGELOG.md +26 -0
- package/README.md +205 -2
- 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/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +5 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +16 -0
- package/dist/layout.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 +168 -0
- package/dist/lp.d.ts.map +1 -0
- package/dist/lp.js +632 -0
- package/dist/lp.js.map +1 -0
- package/dist/lpMath.d.ts +82 -0
- package/dist/lpMath.d.ts.map +1 -0
- package/dist/lpMath.js +365 -0
- package/dist/lpMath.js.map +1 -0
- package/dist/shortcuts.d.ts +8 -0
- package/dist/shortcuts.d.ts.map +1 -1
- package/dist/shortcuts.js +1 -1
- package/dist/shortcuts.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 +31 -0
- package/dist/subpaths/lp.d.ts.map +1 -0
- package/dist/subpaths/lp.js +33 -0
- package/dist/subpaths/lp.js.map +1 -0
- package/dist/subpaths/write.d.ts +22 -0
- package/dist/subpaths/write.d.ts.map +1 -0
- package/dist/subpaths/write.js +19 -0
- package/dist/subpaths/write.js.map +1 -0
- package/dist/write/batch.d.ts +41 -0
- package/dist/write/batch.d.ts.map +1 -0
- package/dist/write/batch.js +46 -0
- package/dist/write/batch.js.map +1 -0
- package/dist/write/collect.d.ts +50 -0
- package/dist/write/collect.d.ts.map +1 -0
- package/dist/write/collect.js +220 -0
- package/dist/write/collect.js.map +1 -0
- package/dist/write/instructions.d.ts +16 -0
- package/dist/write/instructions.d.ts.map +1 -0
- package/dist/write/instructions.js +89 -0
- package/dist/write/instructions.js.map +1 -0
- package/dist/write/send.d.ts +115 -0
- package/dist/write/send.d.ts.map +1 -0
- package/dist/write/send.js +720 -0
- package/dist/write/send.js.map +1 -0
- package/dist/write/signer.d.ts +94 -0
- package/dist/write/signer.d.ts.map +1 -0
- package/dist/write/signer.js +197 -0
- package/dist/write/signer.js.map +1 -0
- package/dist/write/transaction.d.ts +75 -0
- package/dist/write/transaction.d.ts.map +1 -0
- package/dist/write/transaction.js +133 -0
- package/dist/write/transaction.js.map +1 -0
- package/dist/write/transfer.d.ts +72 -0
- package/dist/write/transfer.d.ts.map +1 -0
- package/dist/write/transfer.js +127 -0
- package/dist/write/transfer.js.map +1 -0
- package/package.json +23 -5
- package/src/address.ts +9 -0
- package/src/client.ts +10 -0
- package/src/index.ts +2 -1
- package/src/layout.ts +17 -0
- 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 +850 -0
- package/src/lpMath.ts +420 -0
- package/src/shortcuts.ts +1 -1
- package/src/subpaths/liquidity.ts +45 -0
- package/src/subpaths/lp.ts +71 -0
- package/src/subpaths/write.ts +29 -0
- package/src/write/batch.ts +78 -0
- package/src/write/collect.ts +286 -0
- package/src/write/instructions.ts +98 -0
- package/src/write/send.ts +876 -0
- package/src/write/signer.ts +314 -0
- package/src/write/transaction.ts +181 -0
- package/src/write/transfer.ts +189 -0
package/dist/shortcuts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAQb,MAAM,aAAa,CAAA;AAapB,qEAAqE;AACrE,kCAAkC;AAClC,MAAM,UAAU,GAAG,EAAE,CAAA;AAOrB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAA;AAElD,SAAS,UAAU,CAAO,GAAc,EAAE,GAAM,EAAE,KAAQ;IACxD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACnB,IAAI,GAAG,CAAC,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAU,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,WAAW,GAAG,IAAI,OAAO,EAAkB,CAAA;AACjD,IAAI,cAAc,GAAG,CAAC,CAAA;AAEtB,iEAAiE;AACjE,SAAS,SAAS,CAAC,MAAoB;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAc,EAAE,EAAE;YACrD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC/B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;oBACrB,EAAE,GAAG,EAAE,cAAc,CAAA;oBACrB,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBAC5B,CAAC;gBACD,OAAO,YAAY,EAAE,EAAE,CAAA;YACzB,CAAC;YACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACnG,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAAmC;IACpD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,OAAO,MAAM,EAAE,CAAA;IACxB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9F,CAAC;IACD,OAAO,MAAgB,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 添加 / 移除流动性(子路径 `@w3lib/solana-batch-call/liquidity`):Raydium CLMM、Orca Whirlpool(仓位 NFT),
|
|
3
|
+
* Raydium AMM v4、CPMM(LP 代币)。不放在主入口,不用时打包不会带上这部分代码。不依赖各 DEX 的 SDK。
|
|
4
|
+
*
|
|
5
|
+
* - build*:只读取、不签名,返回预计的数量和按顺序执行的指令,可以当作报价,也可以自己组交易发送
|
|
6
|
+
* - addLiquidity / removeLiquidity / collectFees:构建后签名发送(同 /write 的 batchCall),SOL 自动包装 / 解包
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { getLpPositions } from '@w3lib/solana-batch-call/lp'
|
|
10
|
+
* import { addLiquidity, removeLiquidity } from '@w3lib/solana-batch-call/liquidity'
|
|
11
|
+
*
|
|
12
|
+
* await addLiquidity(client, secretKey, { protocol: 'raydium-clmm', pool, priceLower: 120, priceUpper: 180, amount0Formatted: '1' })
|
|
13
|
+
* const [position] = await getLpPositions(owner, { provider: rpc })
|
|
14
|
+
* await removeLiquidity(client, secretKey, { position, percent: 50 })
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export { addLiquidity, buildAddLiquidity, buildCollectFees, buildRemoveLiquidity, collectFees, removeLiquidity } from '../liquidity/index.js';
|
|
18
|
+
export type { SolanaAddLiquidityParams, SolanaCollectFeesParams, SolanaIncreaseLiquidityParams, SolanaLiquidityOptions, SolanaLiquidityPlan, SolanaLiquidityResult, SolanaLiquiditySendOptions, SolanaLiquidityStep, SolanaLiquidityStepResult, SolanaNewPositionParams, SolanaPositionRef, SolanaRemoveLiquidityParams, } from '../liquidity/types.js';
|
|
19
|
+
export { getLiquidityForAmounts, getMaxAmounts, getMinAmounts, getMintAmounts, nearestUsableTick, priceToTick, sqrtPriceAtTick, tickAtSqrtPrice, type ClmmProgram, } from '../lpMath.js';
|
|
20
|
+
export type { SolanaLpPosition, SolanaLpProtocol, SolanaLpToken } from '../lp.js';
|
|
21
|
+
export type { Instruction } from '../write/transaction.js';
|
|
22
|
+
export type { SignerInput, WriteResult, WriteStatus } from '../subpaths/write.js';
|
|
23
|
+
//# sourceMappingURL=liquidity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidity.d.ts","sourceRoot":"","sources":["../../src/subpaths/liquidity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC7I,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,EAC7B,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,eAAe,EACf,KAAK,WAAW,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACjF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 添加 / 移除流动性(子路径 `@w3lib/solana-batch-call/liquidity`):Raydium CLMM、Orca Whirlpool(仓位 NFT),
|
|
3
|
+
* Raydium AMM v4、CPMM(LP 代币)。不放在主入口,不用时打包不会带上这部分代码。不依赖各 DEX 的 SDK。
|
|
4
|
+
*
|
|
5
|
+
* - build*:只读取、不签名,返回预计的数量和按顺序执行的指令,可以当作报价,也可以自己组交易发送
|
|
6
|
+
* - addLiquidity / removeLiquidity / collectFees:构建后签名发送(同 /write 的 batchCall),SOL 自动包装 / 解包
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { getLpPositions } from '@w3lib/solana-batch-call/lp'
|
|
10
|
+
* import { addLiquidity, removeLiquidity } from '@w3lib/solana-batch-call/liquidity'
|
|
11
|
+
*
|
|
12
|
+
* await addLiquidity(client, secretKey, { protocol: 'raydium-clmm', pool, priceLower: 120, priceUpper: 180, amount0Formatted: '1' })
|
|
13
|
+
* const [position] = await getLpPositions(owner, { provider: rpc })
|
|
14
|
+
* await removeLiquidity(client, secretKey, { position, percent: 50 })
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export { addLiquidity, buildAddLiquidity, buildCollectFees, buildRemoveLiquidity, collectFees, removeLiquidity } from '../liquidity/index.js';
|
|
18
|
+
export { getLiquidityForAmounts, getMaxAmounts, getMinAmounts, getMintAmounts, nearestUsableTick, priceToTick, sqrtPriceAtTick, tickAtSqrtPrice, } from '../lpMath.js';
|
|
19
|
+
//# sourceMappingURL=liquidity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidity.js","sourceRoot":"","sources":["../../src/subpaths/liquidity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAe7I,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,eAAe,GAEhB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LP 仓位(子路径 `@w3lib/solana-batch-call/lp`):Raydium CLMM / Orca Whirlpool 的仓位 NFT,Raydium AMM v4 / CPMM 的 LP 代币,
|
|
3
|
+
* 代币数量、未领取的手续费、可选的美元价值。不放在主入口,不用时打包不会带上这部分代码。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { getLpPositions } from '@w3lib/solana-batch-call/lp'
|
|
7
|
+
*
|
|
8
|
+
* await getLpPositions(owner, { provider: 'https://my-rpc…' }) // 扫描全部代币账户(需要支持 getTokenAccountsByOwner 的节点)
|
|
9
|
+
* await getLpPositions(owner, { mints: [positionNftMint], prices: true }) // 只看这些代币:免费公共节点也能用
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { type LpPositionsOptions, type SolanaLpPosition } from '../lp.js';
|
|
13
|
+
import { type ShortcutOptions } from '../shortcuts.js';
|
|
14
|
+
export { ORCA_WHIRLPOOL_PROGRAM_ID, RAYDIUM_AMM_PROGRAM_ID, RAYDIUM_CLMM_PROGRAM_ID, RAYDIUM_CPMM_PROGRAM_ID, SOLANA_LP_PROTOCOLS, defillamaPrices, lpPositions, type LpPositionsOptions, type SolanaLpAmmPosition, type SolanaLpClmmPosition, type SolanaLpPosition, type SolanaLpProtocol, type SolanaLpToken, type SolanaPriceSource, } from '../lp.js';
|
|
15
|
+
export { MAX_TICK, MIN_TICK, getAmountsForLiquidity, getFeeGrowthInside, getFeesOwed, getLiquidityForAmounts, getMaxAmounts, getMinAmounts, getMintAmounts, nearestUsableTick, orcaSqrtPriceAtTick, priceToTick, raydiumSqrtPriceAtTick, sqrtPriceAtTick, sqrtPriceToPrice, tickAtSqrtPrice, tickToPrice, type ClmmProgram, type TickFeeData, } from '../lpMath.js';
|
|
16
|
+
export interface GetLpPositionsOptions extends LpPositionsOptions, ShortcutOptions {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 查一个地址的 LP 仓位。
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* await getLpPositions(owner, { provider: 'https://my-rpc…' })
|
|
23
|
+
* // [{ type: 'clmm', protocol: 'raydium-clmm', pool, positionMint, token0: { symbol: 'SOL', … }, token1: { symbol: 'USDC', … },
|
|
24
|
+
* // amount0Formatted: '140.26', amount1Formatted: '6852.2', fees0Formatted: '0.546', fees1Formatted: '59.5', inRange: true, … },
|
|
25
|
+
* // { type: 'amm', protocol: 'raydium-amm', pool, lpMint, balance, share: 0.18, amount0Formatted, amount1Formatted, … }]
|
|
26
|
+
* await getLpPositions(owner, { mints: [nftMint, lpMint], pools: [ammPool] }) // 免费公共节点:指定代币和池子
|
|
27
|
+
* await getLpPositions(owner, { provider, prices: true }) // 带美元价值(DefiLlama),按价值排序
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function getLpPositions(owner: string, options?: GetLpPositionsOptions): Promise<SolanaLpPosition[]>;
|
|
31
|
+
//# sourceMappingURL=lp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lp.d.ts","sourceRoot":"","sources":["../../src/subpaths/lp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAe,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB,EAAE,eAAe;CAAG;AAErF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAI9G"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LP 仓位(子路径 `@w3lib/solana-batch-call/lp`):Raydium CLMM / Orca Whirlpool 的仓位 NFT,Raydium AMM v4 / CPMM 的 LP 代币,
|
|
3
|
+
* 代币数量、未领取的手续费、可选的美元价值。不放在主入口,不用时打包不会带上这部分代码。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { getLpPositions } from '@w3lib/solana-batch-call/lp'
|
|
7
|
+
*
|
|
8
|
+
* await getLpPositions(owner, { provider: 'https://my-rpc…' }) // 扫描全部代币账户(需要支持 getTokenAccountsByOwner 的节点)
|
|
9
|
+
* await getLpPositions(owner, { mints: [positionNftMint], prices: true }) // 只看这些代币:免费公共节点也能用
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { lpPositions } from '../lp.js';
|
|
13
|
+
import { resolve } from '../shortcuts.js';
|
|
14
|
+
export { ORCA_WHIRLPOOL_PROGRAM_ID, RAYDIUM_AMM_PROGRAM_ID, RAYDIUM_CLMM_PROGRAM_ID, RAYDIUM_CPMM_PROGRAM_ID, SOLANA_LP_PROTOCOLS, defillamaPrices, lpPositions, } from '../lp.js';
|
|
15
|
+
export { MAX_TICK, MIN_TICK, getAmountsForLiquidity, getFeeGrowthInside, getFeesOwed, getLiquidityForAmounts, getMaxAmounts, getMinAmounts, getMintAmounts, nearestUsableTick, orcaSqrtPriceAtTick, priceToTick, raydiumSqrtPriceAtTick, sqrtPriceAtTick, sqrtPriceToPrice, tickAtSqrtPrice, tickToPrice, } from '../lpMath.js';
|
|
16
|
+
/**
|
|
17
|
+
* 查一个地址的 LP 仓位。
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* await getLpPositions(owner, { provider: 'https://my-rpc…' })
|
|
21
|
+
* // [{ type: 'clmm', protocol: 'raydium-clmm', pool, positionMint, token0: { symbol: 'SOL', … }, token1: { symbol: 'USDC', … },
|
|
22
|
+
* // amount0Formatted: '140.26', amount1Formatted: '6852.2', fees0Formatted: '0.546', fees1Formatted: '59.5', inRange: true, … },
|
|
23
|
+
* // { type: 'amm', protocol: 'raydium-amm', pool, lpMint, balance, share: 0.18, amount0Formatted, amount1Formatted, … }]
|
|
24
|
+
* await getLpPositions(owner, { mints: [nftMint, lpMint], pools: [ammPool] }) // 免费公共节点:指定代币和池子
|
|
25
|
+
* await getLpPositions(owner, { provider, prices: true }) // 带美元价值(DefiLlama),按价值排序
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function getLpPositions(owner, options = {}) {
|
|
29
|
+
// fetch 同时给节点请求(客户端配置)和查价用,与其他快捷函数一致
|
|
30
|
+
const { client, own } = resolve(options, ['protocols', 'mints', 'pools', 'includeClosed', 'prices', 'onPriceError', 'signal']);
|
|
31
|
+
return lpPositions(client, owner, { ...own, ...(options.fetch ? { fetch: options.fetch } : {}) });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=lp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lp.js","sourceRoot":"","sources":["../../src/subpaths/lp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAkD,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,WAAW,GAQZ,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,GAGZ,MAAM,cAAc,CAAA;AAIrB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,UAAiC,EAAE;IAC/E,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC9H,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AACnG,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 批量写操作(子路径 `@w3lib/solana-batch-call/write`):批量调用程序、一对多转账、多钱包归集。
|
|
3
|
+
* 不放在主入口,只做查询时打包不会带上这部分代码。不依赖 Solana SDK,签名用运行环境的 WebCrypto(Ed25519)。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { SolanaClient, NATIVE_MINT } from '@w3lib/solana-batch-call'
|
|
7
|
+
* import { batchCall, batchCollect, batchTransfer } from '@w3lib/solana-batch-call/write'
|
|
8
|
+
*
|
|
9
|
+
* const client = new SolanaClient(rpcUrl)
|
|
10
|
+
* await batchTransfer(client, secretKey, [{ to: a, formatted: '0.5' }, { to: b, token: USDC, formatted: '20' }])
|
|
11
|
+
* await batchCollect(client, [key1, key2], hotWallet, { tokens: [USDC, NATIVE_MINT], feePayer: gasKey })
|
|
12
|
+
* await batchCall(client, [{ from: key1, instructions: [ix1, ix2] }])
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { batchCall, type BatchCallMode, type BatchCallOptions, type WriteCall } from '../write/batch.js';
|
|
16
|
+
export { batchCollect, type BatchCollectOptions, type CollectItemResult, type CollectResult } from '../write/collect.js';
|
|
17
|
+
export { batchTransfer, type BatchTransferOptions, type TransferItem, type TransferMode, type TransferResult } from '../write/transfer.js';
|
|
18
|
+
export { COMPUTE_BUDGET_PROGRAM_ID, closeAccount, createAssociatedTokenAccountIdempotent, setComputeUnitLimit, setComputeUnitPrice, systemTransfer, transferChecked, } from '../write/instructions.js';
|
|
19
|
+
export type { SendOptions, WriteResult, WriteStatus } from '../write/send.js';
|
|
20
|
+
export type { SignerInput, WriteSigner } from '../write/signer.js';
|
|
21
|
+
export type { AccountMeta, Instruction, InstructionInput } from '../write/transaction.js';
|
|
22
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/subpaths/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxH,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1I,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,sCAAsC,EACtC,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC7E,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAClE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 批量写操作(子路径 `@w3lib/solana-batch-call/write`):批量调用程序、一对多转账、多钱包归集。
|
|
3
|
+
* 不放在主入口,只做查询时打包不会带上这部分代码。不依赖 Solana SDK,签名用运行环境的 WebCrypto(Ed25519)。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { SolanaClient, NATIVE_MINT } from '@w3lib/solana-batch-call'
|
|
7
|
+
* import { batchCall, batchCollect, batchTransfer } from '@w3lib/solana-batch-call/write'
|
|
8
|
+
*
|
|
9
|
+
* const client = new SolanaClient(rpcUrl)
|
|
10
|
+
* await batchTransfer(client, secretKey, [{ to: a, formatted: '0.5' }, { to: b, token: USDC, formatted: '20' }])
|
|
11
|
+
* await batchCollect(client, [key1, key2], hotWallet, { tokens: [USDC, NATIVE_MINT], feePayer: gasKey })
|
|
12
|
+
* await batchCall(client, [{ from: key1, instructions: [ix1, ix2] }])
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { batchCall } from '../write/batch.js';
|
|
16
|
+
export { batchCollect } from '../write/collect.js';
|
|
17
|
+
export { batchTransfer } from '../write/transfer.js';
|
|
18
|
+
export { COMPUTE_BUDGET_PROGRAM_ID, closeAccount, createAssociatedTokenAccountIdempotent, setComputeUnitLimit, setComputeUnitPrice, systemTransfer, transferChecked, } from '../write/instructions.js';
|
|
19
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/subpaths/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAA6D,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,YAAY,EAAwE,MAAM,qBAAqB,CAAA;AACxH,OAAO,EAAE,aAAa,EAAwF,MAAM,sBAAsB,CAAA;AAC1I,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,sCAAsC,EACtC,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { SolanaClient } from '../client.js';
|
|
2
|
+
import { type SendOptions, type WriteResult } from './send.js';
|
|
3
|
+
import { type SignerInput } from './signer.js';
|
|
4
|
+
import { type InstructionInput } from './transaction.js';
|
|
5
|
+
/** 一个写调用:一组要原子执行的指令 */
|
|
6
|
+
export interface WriteCall {
|
|
7
|
+
/** 发送的钱包(指令里的签名者之一);不传 feePayer 时也由它付手续费 */
|
|
8
|
+
from: SignerInput;
|
|
9
|
+
/** 指令:@solana/web3.js 的 TransactionInstruction、@solana/kit 的 Instruction 或本库格式,一个或多个 */
|
|
10
|
+
instructions: InstructionInput | readonly InstructionInput[];
|
|
11
|
+
/** 指令需要的其他签名者(如新建账户的 Keypair) */
|
|
12
|
+
signers?: readonly SignerInput[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* - 'pack'(默认):同一手续费支付者的相邻调用打包进同一笔交易(不超过 1232 字节、64 个账户),
|
|
16
|
+
* 模拟时失败的调用会被剔除、其余照常发送;同一笔交易上链后才失败时一起回滚
|
|
17
|
+
* - 'tx':每个调用一笔交易
|
|
18
|
+
*/
|
|
19
|
+
export type BatchCallMode = 'pack' | 'tx';
|
|
20
|
+
export interface BatchCallOptions extends SendOptions {
|
|
21
|
+
mode?: BatchCallMode;
|
|
22
|
+
/** 'pack' 时每笔交易最多几个调用,默认不限(只受交易大小限制) */
|
|
23
|
+
batchSize?: number;
|
|
24
|
+
/**
|
|
25
|
+
* 某个调用发送前失败(模拟失败等)后,同一支付者后面的调用是否继续。默认 false(后面的标记为 skipped)。
|
|
26
|
+
* 交易不等上一笔确认就连续发出,已经发出、之后上链失败的交易拦不住后面已发出的交易
|
|
27
|
+
*/
|
|
28
|
+
continueOnError?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 批量调用程序(写操作)。结果与 calls 一一对应。
|
|
32
|
+
*
|
|
33
|
+
* ```ts
|
|
34
|
+
* await batchCall(client, [
|
|
35
|
+
* { from: key1, instructions: [ix1, ix2] }, // 同一个调用里的指令原子执行
|
|
36
|
+
* { from: key2, instructions: ix3 },
|
|
37
|
+
* ], { feePayer: gasKey }) // 手续费都由 gasKey 付,不同钱包的调用也能打包进同一笔交易
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function batchCall(client: SolanaClient, calls: readonly WriteCall[], options?: BatchCallOptions): Promise<WriteResult[]>;
|
|
41
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/write/batch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAA0C,KAAK,WAAW,EAAa,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AACjH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAE7D,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE9E,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,IAAI,EAAE,WAAW,CAAA;IACjB,wFAAwF;IACxF,YAAY,EAAE,gBAAgB,GAAG,SAAS,gBAAgB,EAAE,CAAA;IAC5D,iCAAiC;IACjC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,CAAA;AAEzC,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgCzI"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { emptyOutcome, sendUnits, toWriteResult } from './send.js';
|
|
2
|
+
import { resolveSigner } from './signer.js';
|
|
3
|
+
import { COMPUTE_BUDGET_PROGRAM_ID } from './instructions.js';
|
|
4
|
+
import { normalizeInstruction } from './transaction.js';
|
|
5
|
+
/**
|
|
6
|
+
* 批量调用程序(写操作)。结果与 calls 一一对应。
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* await batchCall(client, [
|
|
10
|
+
* { from: key1, instructions: [ix1, ix2] }, // 同一个调用里的指令原子执行
|
|
11
|
+
* { from: key2, instructions: ix3 },
|
|
12
|
+
* ], { feePayer: gasKey }) // 手续费都由 gasKey 付,不同钱包的调用也能打包进同一笔交易
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export async function batchCall(client, calls, options = {}) {
|
|
16
|
+
const cache = new Map();
|
|
17
|
+
const feePayer = options.feePayer === undefined ? undefined : await resolveSigner(options.feePayer, cache);
|
|
18
|
+
const prepared = await Promise.all(calls.map(async (call, i) => {
|
|
19
|
+
const from = await resolveSigner(call.from, cache);
|
|
20
|
+
const signers = [from, ...(await Promise.all((call.signers ?? []).map((s) => resolveSigner(s, cache))))];
|
|
21
|
+
const list = Array.isArray(call.instructions) ? call.instructions : [call.instructions];
|
|
22
|
+
// 库会自动加计算单元上限和优先费用指令;调用里自带的同类指令去掉(重复会让整笔交易失败),优先费用用 priorityFee 选项
|
|
23
|
+
const instructions = list.map(normalizeInstruction).filter((ix) => !(ix.programId === COMPUTE_BUDGET_PROGRAM_ID && (ix.data[0] === 2 || ix.data[0] === 3)));
|
|
24
|
+
const payer = feePayer ?? from;
|
|
25
|
+
const known = new Set([payer.address, ...signers.map((s) => s.address)]);
|
|
26
|
+
const missing = instructions.flatMap((ix) => ix.keys).find((k) => k.isSigner && !known.has(k.pubkey));
|
|
27
|
+
if (missing) {
|
|
28
|
+
throw new Error(`calls[${i}]: an instruction requires the signature of ${missing.pubkey}; pass it in signers`);
|
|
29
|
+
}
|
|
30
|
+
return { from, signers, instructions, payer };
|
|
31
|
+
}));
|
|
32
|
+
const results = prepared.map((p, i) => toWriteResult(i, p.from.address, emptyOutcome('skipped')));
|
|
33
|
+
const units = prepared.map((p, i) => ({
|
|
34
|
+
instructions: p.instructions,
|
|
35
|
+
payer: p.payer,
|
|
36
|
+
signers: p.signers.filter((s) => s.address !== p.payer.address),
|
|
37
|
+
continueOnError: options.continueOnError,
|
|
38
|
+
onUpdate: (outcome) => {
|
|
39
|
+
results[i] = toWriteResult(i, p.from.address, outcome);
|
|
40
|
+
options.onUpdate?.(results[i]);
|
|
41
|
+
},
|
|
42
|
+
}));
|
|
43
|
+
await sendUnits(client, units, options, { batchSize: (options.mode ?? 'pack') === 'tx' ? 1 : options.batchSize });
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/write/batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { SolanaClient } from '../client.js';
|
|
2
|
+
import { type SendOptions, type WriteResult } from './send.js';
|
|
3
|
+
import { type SignerInput } from './signer.js';
|
|
4
|
+
export interface BatchCollectOptions extends SendOptions {
|
|
5
|
+
/**
|
|
6
|
+
* 要归集的代币 mint。包含原生 SOL(NATIVE_MINT)时,在代币归集确认后把剩余 SOL 全部转走:
|
|
7
|
+
* 传了 feePayer 时整个余额转走(手续费由 feePayer 付),否则扣掉这笔的手续费后转走,钱包余额归零
|
|
8
|
+
*/
|
|
9
|
+
tokens: readonly string[];
|
|
10
|
+
/**
|
|
11
|
+
* 代币转完后关闭钱包的代币账户(ATA),租金(约 0.00204 SOL / 个)退回钱包本身;同时扫 SOL 时一并转走。默认 false。
|
|
12
|
+
* Token-2022 账户里有未提取的转账手续费等情况关不掉,只影响 close 那一项
|
|
13
|
+
*/
|
|
14
|
+
closeAccounts?: boolean;
|
|
15
|
+
/** 各代币的最小归集数量(最小单位),余额低于它的不归集:`{ [USDC]: 1_000_000n }`;对 SOL 同样有效 */
|
|
16
|
+
minAmount?: Readonly<Record<string, bigint | number | string>>;
|
|
17
|
+
/** 每笔交易最多几个调用,默认不限(按交易大小) */
|
|
18
|
+
batchSize?: number;
|
|
19
|
+
}
|
|
20
|
+
/** 单个钱包单个代币的归集结果;from 是钱包,to 是归集地址 */
|
|
21
|
+
export interface CollectItemResult extends WriteResult {
|
|
22
|
+
to: string;
|
|
23
|
+
token: string;
|
|
24
|
+
native: boolean;
|
|
25
|
+
/** 归集的数量(最小单位);SOL 扫尾在发送前为 '0' */
|
|
26
|
+
amount: string;
|
|
27
|
+
formatted: string | null;
|
|
28
|
+
/** closeAccounts 时关闭代币账户的结果;没有关闭(未开启、SOL、没有归集)时为 null */
|
|
29
|
+
close: WriteResult | null;
|
|
30
|
+
}
|
|
31
|
+
export interface CollectResult {
|
|
32
|
+
/** 按 wallets × tokens 顺序(第 i 个钱包第 j 个代币在 i × tokens.length + j) */
|
|
33
|
+
results: CollectItemResult[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 归集:多个钱包的代币 / SOL 转到同一个地址。
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* const { results } = await batchCollect(client, [key1, key2, key3], hotWallet, {
|
|
40
|
+
* tokens: [USDC, NATIVE_MINT], // 包含 SOL 表示代币归集完后扫空 SOL
|
|
41
|
+
* feePayer: gasKey, // 手续费都由 gasKey 付:子钱包不需要有 SOL,多个钱包的转账打包进同一笔交易
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* 流程:一次读出所有钱包的余额 → 归集地址没有该代币的 ATA 时随第一批转账创建 → 打包发送代币转账(可选关闭代币账户)
|
|
46
|
+
* →(包含 SOL 时)等代币归集确认,按最新余额扫空 SOL。
|
|
47
|
+
* 不传 feePayer 时每个钱包自己付手续费,没有 SOL 的钱包对应的项失败(Solana 上不需要先补 gas:传 feePayer 即可)
|
|
48
|
+
*/
|
|
49
|
+
export declare function batchCollect(client: SolanaClient, wallets: readonly SignerInput[], to: string, options: BatchCollectOptions): Promise<CollectResult>;
|
|
50
|
+
//# sourceMappingURL=collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/write/collect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,OAAO,EAA0E,KAAK,WAAW,EAA6B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AACjK,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAMlF,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD;;;OAGG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,yDAAyD;IACzD,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqM1J"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { getAssociatedTokenAddress, isAddress } from '../address.js';
|
|
2
|
+
import { formatUnits } from '../layout.js';
|
|
3
|
+
import { closeAccount, createAssociatedTokenAccountIdempotent, systemTransfer } from './instructions.js';
|
|
4
|
+
import { emptyOutcome, priorityFeeFor, sendUnits, toWriteResult, transactionFee } from './send.js';
|
|
5
|
+
import { resolveSigner } from './signer.js';
|
|
6
|
+
import { transferInstructions } from './transfer.js';
|
|
7
|
+
/** 扫空 SOL 的交易(一条 System 转账 + 两条计算预算指令)用的计算单元上限 */
|
|
8
|
+
const SWEEP_COMPUTE_UNITS = 1_000;
|
|
9
|
+
/**
|
|
10
|
+
* 归集:多个钱包的代币 / SOL 转到同一个地址。
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const { results } = await batchCollect(client, [key1, key2, key3], hotWallet, {
|
|
14
|
+
* tokens: [USDC, NATIVE_MINT], // 包含 SOL 表示代币归集完后扫空 SOL
|
|
15
|
+
* feePayer: gasKey, // 手续费都由 gasKey 付:子钱包不需要有 SOL,多个钱包的转账打包进同一笔交易
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* 流程:一次读出所有钱包的余额 → 归集地址没有该代币的 ATA 时随第一批转账创建 → 打包发送代币转账(可选关闭代币账户)
|
|
20
|
+
* →(包含 SOL 时)等代币归集确认,按最新余额扫空 SOL。
|
|
21
|
+
* 不传 feePayer 时每个钱包自己付手续费,没有 SOL 的钱包对应的项失败(Solana 上不需要先补 gas:传 feePayer 即可)
|
|
22
|
+
*/
|
|
23
|
+
export async function batchCollect(client, wallets, to, options) {
|
|
24
|
+
if (!isAddress(to)) {
|
|
25
|
+
throw new Error(`Invalid collect address: ${to}`);
|
|
26
|
+
}
|
|
27
|
+
const cache = new Map();
|
|
28
|
+
const signers = await Promise.all(wallets.map((w) => resolveSigner(w, cache)));
|
|
29
|
+
const feePayer = options.feePayer === undefined ? null : await resolveSigner(options.feePayer, cache);
|
|
30
|
+
const tokens = options.tokens;
|
|
31
|
+
const sweep = tokens.some((t) => client.isNativeMint(t));
|
|
32
|
+
const minAmount = new Map(Object.entries(options.minAmount ?? {}).map(([k, v]) => [k, BigInt(v)]));
|
|
33
|
+
const balances = await client.multiBalances(signers.map((s) => ({ owner: s.address, mints: tokens })), { signal: options.signal });
|
|
34
|
+
const items = [];
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
signers.forEach((signer, w) => {
|
|
37
|
+
const duplicate = seen.has(signer.address);
|
|
38
|
+
seen.add(signer.address);
|
|
39
|
+
tokens.forEach((token, t) => {
|
|
40
|
+
const balance = balances[w]?.[t];
|
|
41
|
+
const native = client.isNativeMint(token);
|
|
42
|
+
const item = {
|
|
43
|
+
index: w * tokens.length + t,
|
|
44
|
+
signer,
|
|
45
|
+
token,
|
|
46
|
+
native,
|
|
47
|
+
amount: native || !balance.success ? 0n : BigInt(balance.balance),
|
|
48
|
+
decimals: balance.success ? balance.decimals : null,
|
|
49
|
+
tokenProgram: balance.tokenProgram,
|
|
50
|
+
result: null,
|
|
51
|
+
};
|
|
52
|
+
const skip = !balance.success
|
|
53
|
+
? `cannot read balance: ${balance.error ?? 'unknown error'}`
|
|
54
|
+
: signer.address === to
|
|
55
|
+
? 'skipped: wallet is the collect address'
|
|
56
|
+
: duplicate
|
|
57
|
+
? 'skipped: duplicate wallet'
|
|
58
|
+
: native && feePayer?.address === signer.address
|
|
59
|
+
? 'skipped: wallet is the fee payer'
|
|
60
|
+
: !native && item.amount === 0n
|
|
61
|
+
? 'skipped: zero balance'
|
|
62
|
+
: !native && item.amount < (minAmount.get(token) ?? 0n)
|
|
63
|
+
? 'skipped: below minAmount'
|
|
64
|
+
: null;
|
|
65
|
+
item.result = toCollectResult(item, to, emptyOutcome(skip ? (balance.success ? 'skipped' : 'failed') : 'skipped', skip), null);
|
|
66
|
+
items.push(item);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
const results = items.map((i) => i.result);
|
|
70
|
+
const report = (item, outcome, close = item.result.close) => {
|
|
71
|
+
const hint = !feePayer && outcome.status === 'failed' && /transaction fee|fee payer/.test(outcome.error ?? '') && !outcome.error?.includes('feePayer')
|
|
72
|
+
? ' (pass feePayer to pay fees from another wallet)'
|
|
73
|
+
: '';
|
|
74
|
+
item.result = toCollectResult(item, to, { ...outcome, error: outcome.error && outcome.error + hint }, close);
|
|
75
|
+
results[item.index] = item.result;
|
|
76
|
+
options.onUpdate?.(item.result);
|
|
77
|
+
};
|
|
78
|
+
const active = (item) => item.result.error === null;
|
|
79
|
+
// 归集地址的 ATA:没有的话随转账创建(创建指令是幂等的,同一代币的多笔转账都带上,只有第一笔真正创建)
|
|
80
|
+
const tokenItems = items.filter((i) => !i.native && active(i));
|
|
81
|
+
const targetAtas = new Map(tokenItems.map((i) => [i.token, getAssociatedTokenAddress(to, i.token, i.tokenProgram)]));
|
|
82
|
+
const missing = new Set();
|
|
83
|
+
if (targetAtas.size) {
|
|
84
|
+
const keys = [...targetAtas.values()];
|
|
85
|
+
const accounts = await client.accounts(keys, { signal: options.signal });
|
|
86
|
+
keys.forEach((k, i) => !accounts[i] && missing.add(k));
|
|
87
|
+
}
|
|
88
|
+
// 不传 feePayer 时每个钱包自己付费:如果每笔转账都带创建指令,模拟时每个钱包都要付得起租金(实际只创建一次)。
|
|
89
|
+
// 先由第一个有这种代币的钱包单独创建,确认后再归集;创建失败时退回到每笔都带创建指令
|
|
90
|
+
if (!feePayer && missing.size && !options.dryRun) {
|
|
91
|
+
const setup = [];
|
|
92
|
+
for (const [mint, ata] of targetAtas) {
|
|
93
|
+
if (!missing.has(ata))
|
|
94
|
+
continue;
|
|
95
|
+
const first = tokenItems.find((i) => i.token === mint);
|
|
96
|
+
setup.push({
|
|
97
|
+
instructions: [createAssociatedTokenAccountIdempotent(first.signer.address, ata, to, mint, first.tokenProgram)],
|
|
98
|
+
payer: first.signer,
|
|
99
|
+
signers: [],
|
|
100
|
+
continueOnError: true,
|
|
101
|
+
onUpdate: (outcome) => outcome.status === 'confirmed' && missing.delete(ata),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
await sendUnits(client, setup, { ...options, wait: true }, { batchSize: 1 });
|
|
105
|
+
}
|
|
106
|
+
const units = [];
|
|
107
|
+
/** 每个钱包最后一笔上链交易的 slot(扫 SOL 时按不早于它的状态读余额) */
|
|
108
|
+
let minSlot;
|
|
109
|
+
const track = (outcome) => {
|
|
110
|
+
if (outcome.slot !== null)
|
|
111
|
+
minSlot = Math.max(minSlot ?? 0, outcome.slot);
|
|
112
|
+
};
|
|
113
|
+
for (const item of tokenItems) {
|
|
114
|
+
const payer = feePayer ?? item.signer;
|
|
115
|
+
const signerList = payer.address === item.signer.address ? [] : [item.signer];
|
|
116
|
+
const target = targetAtas.get(item.token);
|
|
117
|
+
units.push({
|
|
118
|
+
instructions: transferInstructions(item.signer, payer, { ...item, to }, target, missing.has(target)),
|
|
119
|
+
payer,
|
|
120
|
+
signers: signerList,
|
|
121
|
+
continueOnError: true,
|
|
122
|
+
onUpdate: (outcome) => {
|
|
123
|
+
track(outcome);
|
|
124
|
+
report(item, outcome);
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
if (options.closeAccounts) {
|
|
128
|
+
const program = item.tokenProgram;
|
|
129
|
+
const account = getAssociatedTokenAddress(item.signer.address, item.token, program);
|
|
130
|
+
units.push({
|
|
131
|
+
instructions: [closeAccount(account, item.signer.address, item.signer.address, program)],
|
|
132
|
+
payer,
|
|
133
|
+
signers: signerList,
|
|
134
|
+
continueOnError: true,
|
|
135
|
+
onUpdate: (outcome) => {
|
|
136
|
+
track(outcome);
|
|
137
|
+
report(item, outcomeOf(item.result), toWriteResult(item.index, item.signer.address, outcome));
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// 要扫 SOL 时必须等代币归集确认(扫的是最新余额,关闭账户退回的租金也要算进去)
|
|
143
|
+
await sendUnits(client, units, sweep ? { ...options, wait: true } : options, { batchSize: options.batchSize });
|
|
144
|
+
if (!sweep) {
|
|
145
|
+
return { results };
|
|
146
|
+
}
|
|
147
|
+
// 代币没有全部归集成功的钱包不扫 SOL:留着付之后重新归集的手续费
|
|
148
|
+
items
|
|
149
|
+
.filter((i) => i.native && active(i))
|
|
150
|
+
.forEach((native) => {
|
|
151
|
+
// dryRun 时代币项是 simulated,也算成功
|
|
152
|
+
const done = (status) => status === 'confirmed' || status === 'skipped' || (options.dryRun && status === 'simulated');
|
|
153
|
+
const unfinished = items.find((i) => !i.native && i.signer.address === native.signer.address && !done(i.result.status));
|
|
154
|
+
if (unfinished) {
|
|
155
|
+
report(native, emptyOutcome('skipped', `skipped: collecting ${unfinished.token} did not succeed (${unfinished.result.status})`));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
const sweepItems = items.filter((i) => i.native && active(i));
|
|
159
|
+
if (!sweepItems.length || options.signal?.aborted) {
|
|
160
|
+
return { results };
|
|
161
|
+
}
|
|
162
|
+
if (options.dryRun) {
|
|
163
|
+
// 代币归集没有真的执行,扫 SOL 的金额要等归集之后才知道:只标记 simulated,不做模拟
|
|
164
|
+
sweepItems.forEach((i) => report(i, emptyOutcome('simulated')));
|
|
165
|
+
return { results };
|
|
166
|
+
}
|
|
167
|
+
let lamports;
|
|
168
|
+
try {
|
|
169
|
+
lamports = await client.solBalances(sweepItems.map((i) => i.signer.address), { minContextSlot: minSlot, signal: options.signal });
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
// 代币归集已经发出:不能整体抛错(调用方会拿不到这些结果),扫 SOL 的项标记失败
|
|
173
|
+
sweepItems.forEach((i) => report(i, emptyOutcome('failed', `cannot read SOL balance: ${err instanceof Error ? err.message : String(err)}`)));
|
|
174
|
+
return { results };
|
|
175
|
+
}
|
|
176
|
+
const prepared = await Promise.all(sweepItems.map(async (item, k) => {
|
|
177
|
+
const balance = BigInt(lamports[k]?.balance ?? '0');
|
|
178
|
+
let amount = balance;
|
|
179
|
+
let fixed;
|
|
180
|
+
if (!feePayer) {
|
|
181
|
+
// 自己付手续费:单独一笔、手续费事先算好,转走剩下的全部(余额归零,不受租金下限限制)
|
|
182
|
+
const price = await priorityFeeFor(client, options, [item.signer.address, to]);
|
|
183
|
+
fixed = { computeUnits: SWEEP_COMPUTE_UNITS, price };
|
|
184
|
+
amount = balance - transactionFee(1, SWEEP_COMPUTE_UNITS, price);
|
|
185
|
+
}
|
|
186
|
+
const min = minAmount.get(item.token) ?? 0n;
|
|
187
|
+
if (amount <= 0n || amount < min) {
|
|
188
|
+
report(item, emptyOutcome('skipped', amount <= 0n ? 'skipped: SOL balance does not cover the fee' : 'skipped: below minAmount'));
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
item.amount = amount;
|
|
192
|
+
const payer = feePayer ?? item.signer;
|
|
193
|
+
return {
|
|
194
|
+
instructions: [systemTransfer(item.signer.address, to, amount)],
|
|
195
|
+
payer,
|
|
196
|
+
signers: payer.address === item.signer.address ? [] : [item.signer],
|
|
197
|
+
fixed,
|
|
198
|
+
continueOnError: true,
|
|
199
|
+
onUpdate: (outcome) => report(item, outcome),
|
|
200
|
+
};
|
|
201
|
+
}));
|
|
202
|
+
await sendUnits(client, prepared.filter((u) => u !== null), options, { batchSize: options.batchSize });
|
|
203
|
+
return { results };
|
|
204
|
+
}
|
|
205
|
+
/** 结果转回交易结果(更新 close 字段时保留转账本身的状态) */
|
|
206
|
+
function outcomeOf(r) {
|
|
207
|
+
return { status: r.status, signature: r.signature, slot: r.slot, fee: r.fee === null ? null : BigInt(r.fee), computeUnits: r.computeUnits, error: r.error };
|
|
208
|
+
}
|
|
209
|
+
function toCollectResult(item, to, outcome, close) {
|
|
210
|
+
return {
|
|
211
|
+
...toWriteResult(item.index, item.signer.address, outcome),
|
|
212
|
+
to,
|
|
213
|
+
token: item.token,
|
|
214
|
+
native: item.native,
|
|
215
|
+
amount: item.amount.toString(),
|
|
216
|
+
formatted: item.decimals === null ? null : formatUnits(item.amount, item.decimals),
|
|
217
|
+
close,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=collect.js.map
|