@w3lib/evm-batch-call 0.5.0 → 0.7.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 +38 -0
- package/README.md +240 -4
- package/contracts/TokenProbe.sol +103 -0
- package/dist/aggregate.d.ts.map +1 -1
- package/dist/aggregate.js +114 -3
- package/dist/aggregate.js.map +1 -1
- package/dist/approvals.d.ts +169 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +310 -0
- package/dist/approvals.js.map +1 -0
- package/dist/chains.d.ts.map +1 -1
- package/dist/chains.js +4 -0
- package/dist/chains.js.map +1 -1
- package/dist/fees.d.ts +97 -0
- package/dist/fees.d.ts.map +1 -0
- package/dist/fees.js +115 -0
- package/dist/fees.js.map +1 -0
- package/dist/http.d.ts +10 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +30 -0
- package/dist/http.js.map +1 -0
- package/dist/liquidity/common.d.ts +72 -0
- package/dist/liquidity/common.d.ts.map +1 -0
- package/dist/liquidity/common.js +271 -0
- package/dist/liquidity/common.js.map +1 -0
- package/dist/liquidity/concentrated.d.ts +19 -0
- package/dist/liquidity/concentrated.d.ts.map +1 -0
- package/dist/liquidity/concentrated.js +106 -0
- package/dist/liquidity/concentrated.js.map +1 -0
- package/dist/liquidity/index.d.ts +42 -0
- package/dist/liquidity/index.d.ts.map +1 -0
- package/dist/liquidity/index.js +143 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/liquidity/types.d.ts +182 -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/liquidity/v2.d.ts +5 -0
- package/dist/liquidity/v2.d.ts.map +1 -0
- package/dist/liquidity/v2.js +342 -0
- package/dist/liquidity/v2.js.map +1 -0
- package/dist/liquidity/v3.d.ts +6 -0
- package/dist/liquidity/v3.d.ts.map +1 -0
- package/dist/liquidity/v3.js +310 -0
- package/dist/liquidity/v3.js.map +1 -0
- package/dist/liquidity/v4.d.ts +5 -0
- package/dist/liquidity/v4.d.ts.map +1 -0
- package/dist/liquidity/v4.js +279 -0
- package/dist/liquidity/v4.js.map +1 -0
- package/dist/lp.d.ts +10 -2
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +31 -19
- package/dist/lp.js.map +1 -1
- package/dist/lpMath.d.ts +55 -0
- package/dist/lpMath.d.ts.map +1 -1
- package/dist/lpMath.js +209 -0
- package/dist/lpMath.js.map +1 -1
- package/dist/multicall.d.ts.map +1 -1
- package/dist/multicall.js +3 -0
- package/dist/multicall.js.map +1 -1
- package/dist/names.d.ts +55 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +93 -0
- package/dist/names.js.map +1 -0
- package/dist/owner.d.ts +4 -26
- package/dist/owner.d.ts.map +1 -1
- package/dist/owner.js +7 -112
- package/dist/owner.js.map +1 -1
- package/dist/portfolio.d.ts +54 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +49 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/price.d.ts +95 -0
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +329 -0
- package/dist/price.js.map +1 -0
- package/dist/risk.d.ts +42 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +134 -0
- package/dist/risk.js.map +1 -0
- package/dist/rpcNodes.d.ts.map +1 -1
- package/dist/rpcNodes.js +18 -0
- package/dist/rpcNodes.js.map +1 -1
- package/dist/subpaths/approvals.d.ts +26 -0
- package/dist/subpaths/approvals.d.ts.map +1 -0
- package/dist/subpaths/approvals.js +27 -0
- package/dist/subpaths/approvals.js.map +1 -0
- package/dist/subpaths/fees.d.ts +23 -0
- package/dist/subpaths/fees.d.ts.map +1 -0
- package/dist/subpaths/fees.js +25 -0
- package/dist/subpaths/fees.js.map +1 -0
- package/dist/subpaths/liquidity.d.ts +24 -0
- package/dist/subpaths/liquidity.d.ts.map +1 -0
- package/dist/subpaths/liquidity.js +21 -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/dist/subpaths/names.d.ts +35 -0
- package/dist/subpaths/names.d.ts.map +1 -0
- package/dist/subpaths/names.js +39 -0
- package/dist/subpaths/names.js.map +1 -0
- package/dist/subpaths/price.d.ts +38 -0
- package/dist/subpaths/price.d.ts.map +1 -0
- package/dist/subpaths/price.js +40 -0
- package/dist/subpaths/price.js.map +1 -0
- package/dist/subpaths/risk.d.ts +19 -0
- package/dist/subpaths/risk.d.ts.map +1 -0
- package/dist/subpaths/risk.js +20 -0
- package/dist/subpaths/risk.js.map +1 -0
- package/dist/subpaths/swap.d.ts +19 -0
- package/dist/subpaths/swap.d.ts.map +1 -0
- package/dist/subpaths/swap.js +20 -0
- package/dist/subpaths/swap.js.map +1 -0
- package/dist/swap.d.ts +128 -0
- package/dist/swap.d.ts.map +1 -0
- package/dist/swap.js +291 -0
- package/dist/swap.js.map +1 -0
- package/dist/tokenProbe.d.ts +3 -0
- package/dist/tokenProbe.d.ts.map +1 -0
- package/dist/tokenProbe.js +4 -0
- package/dist/tokenProbe.js.map +1 -0
- package/dist/write/tron.d.ts +27 -0
- package/dist/write/tron.d.ts.map +1 -1
- package/dist/write/tron.js +30 -0
- package/dist/write/tron.js.map +1 -1
- package/package.json +32 -1
- package/src/aggregate.ts +110 -3
- package/src/approvals.ts +462 -0
- package/src/chains.ts +4 -0
- package/src/fees.ts +201 -0
- package/src/http.ts +34 -0
- package/src/liquidity/common.ts +314 -0
- package/src/liquidity/concentrated.ts +121 -0
- package/src/liquidity/index.ts +171 -0
- package/src/liquidity/types.ts +194 -0
- package/src/liquidity/v2.ts +371 -0
- package/src/liquidity/v3.ts +382 -0
- package/src/liquidity/v4.ts +348 -0
- package/src/lp.ts +39 -19
- package/src/lpMath.ts +223 -0
- package/src/multicall.ts +3 -0
- package/src/names.ts +141 -0
- package/src/owner.ts +7 -138
- package/src/portfolio.ts +91 -0
- package/src/price.ts +415 -0
- package/src/risk.ts +166 -0
- package/src/rpcNodes.ts +18 -0
- package/src/subpaths/approvals.ts +48 -0
- package/src/subpaths/fees.ts +43 -0
- package/src/subpaths/liquidity.ts +52 -0
- package/src/subpaths/lp.ts +20 -1
- package/src/subpaths/names.ts +43 -0
- package/src/subpaths/price.ts +60 -0
- package/src/subpaths/risk.ts +23 -0
- package/src/subpaths/swap.ts +36 -0
- package/src/swap.ts +413 -0
- package/src/tokenProbe.ts +5 -0
- package/src/write/tron.ts +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/subpaths/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC9E,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE/F,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB,EAAE,uBAAuB;CAAG;AAE1F,mCAAmC;AACnC,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGjH"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代币风险检查(子路径 `@w3lib/evm-batch-call/risk`):模拟买入 / 转账 / 卖出,算出买卖税、判断貔貅盘,看是不是可升级代理、owner 有没有放弃。
|
|
3
|
+
* 不放在主入口,不用时打包不会带上这部分代码(含约 2.7KB 的探测合约字节码)。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { getTokenRisks } from '@w3lib/evm-batch-call/risk'
|
|
7
|
+
*
|
|
8
|
+
* const [risk] = await getTokenRisks([token], { chainId: 56 })
|
|
9
|
+
* if (risk.honeypot) alert('卖不出')
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { tokenRisks } from '../risk.js';
|
|
13
|
+
import { resolve } from '../shortcuts.js';
|
|
14
|
+
export { tokenRisks } from '../risk.js';
|
|
15
|
+
/** 检查代币的风险,节点参数与 getBalances 相同 */
|
|
16
|
+
export function getTokenRisks(tokens, options = {}) {
|
|
17
|
+
const { provider, own } = resolve(options, ['amount', 'protocols']);
|
|
18
|
+
return tokenRisks(provider, tokens, own);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/subpaths/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAyC,MAAM,YAAY,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,UAAU,EAA0D,MAAM,YAAY,CAAA;AAI/F,mCAAmC;AACnC,MAAM,UAAU,aAAa,CAAC,MAAyB,EAAE,UAAgC,EAAE;IACzF,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAA;IACnE,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 兑换(子路径 `@w3lib/evm-batch-call/swap`):在内置协议的 V2 / V3 池子里找最好的路线(直接或两跳),报价并构建 / 发送兑换交易。
|
|
3
|
+
* 不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { getSwapQuote, swap } from '@w3lib/evm-batch-call/swap'
|
|
7
|
+
*
|
|
8
|
+
* const plan = await getSwapQuote(user, { tokenIn: NATIVE_TOKEN, tokenOut: USDT, amountInFormatted: '0.1' }, { chainId: 56 })
|
|
9
|
+
* await swap(provider, key, { tokenIn: NATIVE_TOKEN, tokenOut: USDT, amountInFormatted: '0.1' })
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { type SwapOptions, type SwapParams, type SwapPlan } from '../swap.js';
|
|
13
|
+
import { type ShortcutProviderOptions } from '../shortcuts.js';
|
|
14
|
+
export { V3_SWAP_CONTRACTS, buildSwap, swap, swapProtocols, type SwapOptions, type SwapParams, type SwapPlan, type SwapResult, type SwapRoute, type SwapSendOptions, type SwapTx, type SwapTxResult, } from '../swap.js';
|
|
15
|
+
export interface GetSwapQuoteOptions extends SwapOptions, ShortcutProviderOptions {
|
|
16
|
+
}
|
|
17
|
+
/** 报价并构建兑换的交易(同 buildSwap),节点参数与 getBalances 相同 */
|
|
18
|
+
export declare function getSwapQuote(owner: string, params: SwapParams, options?: GetSwapQuoteOptions): Promise<SwapPlan>;
|
|
19
|
+
//# sourceMappingURL=swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/subpaths/swap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AACxF,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,IAAI,EACJ,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,YAAY,GAClB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,mBAAoB,SAAQ,WAAW,EAAE,uBAAuB;CAAG;AAEpF,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGpH"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 兑换(子路径 `@w3lib/evm-batch-call/swap`):在内置协议的 V2 / V3 池子里找最好的路线(直接或两跳),报价并构建 / 发送兑换交易。
|
|
3
|
+
* 不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { getSwapQuote, swap } from '@w3lib/evm-batch-call/swap'
|
|
7
|
+
*
|
|
8
|
+
* const plan = await getSwapQuote(user, { tokenIn: NATIVE_TOKEN, tokenOut: USDT, amountInFormatted: '0.1' }, { chainId: 56 })
|
|
9
|
+
* await swap(provider, key, { tokenIn: NATIVE_TOKEN, tokenOut: USDT, amountInFormatted: '0.1' })
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { buildSwap } from '../swap.js';
|
|
13
|
+
import { resolve } from '../shortcuts.js';
|
|
14
|
+
export { V3_SWAP_CONTRACTS, buildSwap, swap, swapProtocols, } from '../swap.js';
|
|
15
|
+
/** 报价并构建兑换的交易(同 buildSwap),节点参数与 getBalances 相同 */
|
|
16
|
+
export function getSwapQuote(owner, params, options = {}) {
|
|
17
|
+
const { provider, overrides, own } = resolve(options, ['slippage', 'deadline', 'recipient', 'approve', 'protocols', 'intermediates', 'route']);
|
|
18
|
+
return buildSwap(provider, owner, params, { ...own, ...(overrides.blockTag === undefined ? {} : { blockTag: overrides.blockTag }) });
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/subpaths/swap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAoD,MAAM,YAAY,CAAA;AACxF,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,IAAI,EACJ,aAAa,GASd,MAAM,YAAY,CAAA;AAInB,mDAAmD;AACnD,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAkB,EAAE,UAA+B,EAAE;IAC/F,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;IAC9I,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;AACtI,CAAC"}
|
package/dist/swap.d.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 兑换(子路径 `@w3lib/evm-batch-call/swap`):在内置协议表的 V2 / V3 池子里找路线(直接兑换,或经过包装主币 / 稳定币的两跳),
|
|
3
|
+
* 批量报价(V2 用 Router 的 getAmountsOut,V3 用 QuoterV2,按 gas 分成几次并发的 eth_call),选输出最多的;按滑点算最少收到的数量,
|
|
4
|
+
* 构建授权 + 兑换的交易(V2 走 Router 的 swapExact…SupportingFeeOnTransferTokens,V3 走 SwapRouter02 / PancakeSwap SmartRouter 的 multicall)
|
|
5
|
+
*/
|
|
6
|
+
import { type BigNumberish } from 'ethers';
|
|
7
|
+
import type { LiquidityTxResult } from './liquidity/types.js';
|
|
8
|
+
import { type LpProtocol, type LpToken } from './lp.js';
|
|
9
|
+
import type { BlockTag } from './aggregate.js';
|
|
10
|
+
import type { Provider } from './provider.js';
|
|
11
|
+
import type { BatchCallOptions } from './write/batch.js';
|
|
12
|
+
import type { SignerInput } from './write/signer.js';
|
|
13
|
+
/** V3 协议的报价合约(QuoterV2)和兑换合约(SwapRouter02 接口),按 协议 id → chainId。2026-10 在链上核对过(Router 的 WETH9 / deployer,并用 eth_call 实际执行过兑换) */
|
|
14
|
+
export declare const V3_SWAP_CONTRACTS: Readonly<Record<string, Readonly<Record<number, {
|
|
15
|
+
quoter: string;
|
|
16
|
+
router: string;
|
|
17
|
+
}>>>>;
|
|
18
|
+
export interface SwapParams {
|
|
19
|
+
/** 卖出 / 买入的代币;主币用 NATIVE_TOKEN 或零地址(池子里按包装主币,交易里自动包装 / 解包) */
|
|
20
|
+
tokenIn: string;
|
|
21
|
+
tokenOut: string;
|
|
22
|
+
/** 卖出的数量:amountIn(最小单位)和 amountInFormatted(按精度换算,如 '1.5')二选一 */
|
|
23
|
+
amountIn?: BigNumberish;
|
|
24
|
+
amountInFormatted?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SwapOptions {
|
|
27
|
+
/** 价格滑点(比例,0.005 = 0.5%),最少收到 = 报价 × (1 − slippage),默认 0.005 */
|
|
28
|
+
slippage?: number;
|
|
29
|
+
/** 交易的有效期(秒),默认 1200 */
|
|
30
|
+
deadline?: number;
|
|
31
|
+
/** 收到代币的地址,默认 owner */
|
|
32
|
+
recipient?: string;
|
|
33
|
+
/** 授权额度:'exact'(默认,本次卖出的数量)或 'max' */
|
|
34
|
+
approve?: 'exact' | 'max';
|
|
35
|
+
/**
|
|
36
|
+
* 代币的转账税(比例,0.05 = 5%),默认 0。V2 报价(getAmountsOut)不含转账税,带税的代币
|
|
37
|
+
* 实际收到的比报价少,最少收到按 (1 − slippage) × (1 − tax) 算,否则会因 INSUFFICIENT_OUTPUT_AMOUNT 回滚。
|
|
38
|
+
* 税率可用 /risk 的 getTokenRisks 查;只对 V2 路线生效(V3 不支持带税的代币)。plan.amountOut 仍是不含税的报价
|
|
39
|
+
*/
|
|
40
|
+
tax?: number;
|
|
41
|
+
/** 只用这些协议(id,如 ['pancakeswap-v3']),默认这条链内置表里能兑换的 V2 / V3 协议 */
|
|
42
|
+
protocols?: readonly string[];
|
|
43
|
+
/** 两跳的中间代币,默认 LP_QUOTE_TOKENS 里这条链的(包装主币和稳定币);传 [] 只找直接兑换 */
|
|
44
|
+
intermediates?: readonly string[];
|
|
45
|
+
/** 按这个区块的状态报价(默认最新):同一个区块里报价可以复现 */
|
|
46
|
+
blockTag?: BlockTag;
|
|
47
|
+
/** 指定路线(如之前报价结果 routes 里的某一条):只用这条路线报价和兑换,不选最好的 */
|
|
48
|
+
route?: Pick<SwapRoute, 'protocol' | 'path' | 'fees'>;
|
|
49
|
+
}
|
|
50
|
+
export interface SwapRoute {
|
|
51
|
+
protocol: string;
|
|
52
|
+
protocolName: string;
|
|
53
|
+
version: 'v2' | 'v3';
|
|
54
|
+
/** 经过的代币(池子里的地址,主币是包装主币) */
|
|
55
|
+
path: string[];
|
|
56
|
+
/** V3:每一跳池子的手续费档位;V2 为空 */
|
|
57
|
+
fees: number[];
|
|
58
|
+
/** 这条路线的报价(最小单位) */
|
|
59
|
+
amountOut: string;
|
|
60
|
+
}
|
|
61
|
+
export interface SwapTx {
|
|
62
|
+
/** approve:卖出的代币授权给 Router;swap:兑换 */
|
|
63
|
+
kind: 'approve' | 'swap';
|
|
64
|
+
to: string;
|
|
65
|
+
data: string;
|
|
66
|
+
/** 附带的主币(最小单位):卖出主币时为卖出的数量 */
|
|
67
|
+
value: string;
|
|
68
|
+
token?: string;
|
|
69
|
+
spender?: string;
|
|
70
|
+
amount?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface SwapPlan {
|
|
73
|
+
tokenIn: LpToken;
|
|
74
|
+
tokenOut: LpToken;
|
|
75
|
+
amountIn: string;
|
|
76
|
+
amountInFormatted: string | null;
|
|
77
|
+
/** 报价(最小单位)和最少收到的数量(按滑点) */
|
|
78
|
+
amountOut: string;
|
|
79
|
+
amountOutFormatted: string | null;
|
|
80
|
+
amountOutMin: string;
|
|
81
|
+
amountOutMinFormatted: string | null;
|
|
82
|
+
/** 1 个 tokenIn 换多少 tokenOut(按这笔的数量) */
|
|
83
|
+
price: number | null;
|
|
84
|
+
/** 价格影响(0~1):这笔的价格比极小数量的价格差多少;算不出时为 null */
|
|
85
|
+
priceImpact: number | null;
|
|
86
|
+
route: SwapRoute;
|
|
87
|
+
/** 其他候选路线的报价,从高到低(含选中的) */
|
|
88
|
+
routes: SwapRoute[];
|
|
89
|
+
/** 按顺序发送的交易(授权在前) */
|
|
90
|
+
transactions: SwapTx[];
|
|
91
|
+
}
|
|
92
|
+
/** 这条链上能兑换的协议:V2 要有 Router,V3 要有报价和兑换合约(V3_SWAP_CONTRACTS) */
|
|
93
|
+
export declare function swapProtocols(chainId: number): LpProtocol[];
|
|
94
|
+
/**
|
|
95
|
+
* 报价并构建兑换的交易(不签名):选输出最多的路线,最少收到 = 报价 × (1 − slippage);卖出代币时额度不够先授权给 Router。
|
|
96
|
+
*
|
|
97
|
+
* ```ts
|
|
98
|
+
* const plan = await buildSwap(provider, user, { tokenIn: NATIVE_TOKEN, tokenOut: USDT, amountInFormatted: '0.1' })
|
|
99
|
+
* plan.amountOutFormatted // '61.2'
|
|
100
|
+
* plan.route // { protocol: 'pancakeswap-v3', path: [WBNB, USDT], fees: [100], … }
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function buildSwap(provider: Provider, owner: string, params: SwapParams, options?: SwapOptions): Promise<SwapPlan>;
|
|
104
|
+
export type SwapTxResult = Omit<LiquidityTxResult, 'kind'> & {
|
|
105
|
+
kind: SwapTx['kind'];
|
|
106
|
+
};
|
|
107
|
+
export interface SwapResult {
|
|
108
|
+
plan: SwapPlan;
|
|
109
|
+
/** 每笔交易的结果(授权、兑换) */
|
|
110
|
+
results: SwapTxResult[];
|
|
111
|
+
/** 兑换那一笔的状态和哈希 */
|
|
112
|
+
status: LiquidityTxResult['status'];
|
|
113
|
+
hash: string | null;
|
|
114
|
+
}
|
|
115
|
+
export interface SwapSendOptions extends SwapOptions, Omit<BatchCallOptions, 'mode' | 'continueOnError' | 'onUpdate'> {
|
|
116
|
+
onUpdate?: (result: SwapTxResult) => void;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 兑换:构建(同 buildSwap)后用 from 签名发送(钱包同 /write:私钥、ethers Signer、浏览器钱包、Tron 钱包)。
|
|
120
|
+
* 授权失败时不发兑换的交易
|
|
121
|
+
*
|
|
122
|
+
* ```ts
|
|
123
|
+
* const r = await swap(provider, key, { tokenIn: USDT, tokenOut: NATIVE_TOKEN, amountInFormatted: '100' }, { slippage: 0.01 })
|
|
124
|
+
* r.status // 'confirmed'
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function swap(provider: Provider, from: SignerInput, params: SwapParams, options?: SwapSendOptions): Promise<SwapResult>;
|
|
128
|
+
//# sourceMappingURL=swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../src/swap.ts"],"names":[],"mappings":"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"}
|
package/dist/swap.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 兑换(子路径 `@w3lib/evm-batch-call/swap`):在内置协议表的 V2 / V3 池子里找路线(直接兑换,或经过包装主币 / 稳定币的两跳),
|
|
3
|
+
* 批量报价(V2 用 Router 的 getAmountsOut,V3 用 QuoterV2,按 gas 分成几次并发的 eth_call),选输出最多的;按滑点算最少收到的数量,
|
|
4
|
+
* 构建授权 + 兑换的交易(V2 走 Router 的 swapExact…SupportingFeeOnTransferTokens,V3 走 SwapRouter02 / PancakeSwap SmartRouter 的 multicall)
|
|
5
|
+
*/
|
|
6
|
+
import { Interface } from 'ethers';
|
|
7
|
+
import { approvals, createCtx, evm, fmt, isNative, minus, out, parseAmount, same, tokenInfo } from './liquidity/common.js';
|
|
8
|
+
import { LP_PROTOCOLS, LP_QUOTE_TOKENS } from './lp.js';
|
|
9
|
+
/** V3 协议的报价合约(QuoterV2)和兑换合约(SwapRouter02 接口),按 协议 id → chainId。2026-10 在链上核对过(Router 的 WETH9 / deployer,并用 eth_call 实际执行过兑换) */
|
|
10
|
+
export const V3_SWAP_CONTRACTS = {
|
|
11
|
+
'uniswap-v3': {
|
|
12
|
+
1: { quoter: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e', router: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45' },
|
|
13
|
+
10: { quoter: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e', router: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45' },
|
|
14
|
+
56: { quoter: '0x78D78E420Da98ad378D7799bE8f4AF69033EB077', router: '0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2' },
|
|
15
|
+
137: { quoter: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e', router: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45' },
|
|
16
|
+
8453: { quoter: '0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a', router: '0x2626664c2603336E57B271c5C0b26F421741e481' },
|
|
17
|
+
42161: { quoter: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e', router: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45' },
|
|
18
|
+
43114: { quoter: '0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F', router: '0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE' },
|
|
19
|
+
},
|
|
20
|
+
'pancakeswap-v3': {
|
|
21
|
+
1: { quoter: '0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997', router: '0x13f4EA83D0bd40E75C8222255bc855a974568Dd4' },
|
|
22
|
+
56: { quoter: '0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997', router: '0x13f4EA83D0bd40E75C8222255bc855a974568Dd4' },
|
|
23
|
+
// Base 上的 SmartRouter 地址与 Ethereum / BSC 不同
|
|
24
|
+
8453: { quoter: '0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997', router: '0x678Aa4bF4E210cf2166753e054d5b7c31cc7fa86' },
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const V3_FEES = [100, 500, 2500, 3000, 10000];
|
|
28
|
+
/** SwapRouter02 的特殊收款地址:留在 Router 里(之后 unwrapWETH9 换成主币) */
|
|
29
|
+
const ADDRESS_THIS = '0x0000000000000000000000000000000000000002';
|
|
30
|
+
const v2RouterInterface = new Interface([
|
|
31
|
+
'function getAmountsOut(uint256 amountIn, address[] path) view returns (uint256[] amounts)',
|
|
32
|
+
'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',
|
|
33
|
+
'function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable',
|
|
34
|
+
'function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',
|
|
35
|
+
]);
|
|
36
|
+
const v3FactoryInterface = new Interface(['function getPool(address tokenA, address tokenB, uint24 fee) view returns (address)']);
|
|
37
|
+
const v3PoolInterface = new Interface(['function liquidity() view returns (uint128)']);
|
|
38
|
+
/** QuoterV2 很费 gas(池子很薄时一次可达上千万):每次 eth_call 只放几个报价,多个 eth_call 并发,避免超过节点的 gas 上限后被悄悄截掉 */
|
|
39
|
+
const QUOTES_PER_CALL = 3;
|
|
40
|
+
/** 两跳时每一跳最多用几个手续费档位(按当前流动性取最大的) */
|
|
41
|
+
const TIERS_PER_LEG = 2;
|
|
42
|
+
const quoterInterface = new Interface([
|
|
43
|
+
'function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)',
|
|
44
|
+
'function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)',
|
|
45
|
+
]);
|
|
46
|
+
const swapRouterInterface = new Interface([
|
|
47
|
+
'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)',
|
|
48
|
+
'function exactInput((bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable returns (uint256 amountOut)',
|
|
49
|
+
'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',
|
|
50
|
+
'function multicall(uint256 deadline, bytes[] data) payable returns (bytes[] results)',
|
|
51
|
+
]);
|
|
52
|
+
/** 这条链上能兑换的协议:V2 要有 Router,V3 要有报价和兑换合约(V3_SWAP_CONTRACTS) */
|
|
53
|
+
export function swapProtocols(chainId) {
|
|
54
|
+
return LP_PROTOCOLS.filter((p) => p.chainId === chainId && ((p.version === 'v2' && !!p.router) || (p.version === 'v3' && !!V3_SWAP_CONTRACTS[p.id]?.[chainId])));
|
|
55
|
+
}
|
|
56
|
+
/** V3 的路径编码:token ‖ fee(uint24) ‖ token ‖ … */
|
|
57
|
+
function encodePath(path, fees) {
|
|
58
|
+
let hex = path[0]?.slice(2).toLowerCase() ?? '';
|
|
59
|
+
fees.forEach((fee, i) => {
|
|
60
|
+
hex += fee.toString(16).padStart(6, '0') + path[i + 1].slice(2).toLowerCase();
|
|
61
|
+
});
|
|
62
|
+
return `0x${hex}`;
|
|
63
|
+
}
|
|
64
|
+
/** 列出候选路线(V3 先查哪些池子存在)并一次 multicall 报价,按输出从高到低 */
|
|
65
|
+
async function quoteRoutes(ctx, tokenIn, tokenOut, amountIn, options) {
|
|
66
|
+
const all = swapProtocols(ctx.chainId);
|
|
67
|
+
const protocols = options.protocols ? all.filter((p) => options.protocols?.includes(p.id)) : all;
|
|
68
|
+
if (!protocols.length)
|
|
69
|
+
throw new Error(`No swap protocol on chain ${ctx.chainId}${options.protocols ? ` among ${options.protocols.join(', ')}` : ''}`);
|
|
70
|
+
const mids = (options.intermediates ?? LP_QUOTE_TOKENS[ctx.chainId] ?? []).map(evm).filter((m) => !same(m, tokenIn) && !same(m, tokenOut));
|
|
71
|
+
// V3:先查池子是否存在(每一跳的每个手续费档位)
|
|
72
|
+
const v3 = protocols.filter((p) => p.version === 'v3');
|
|
73
|
+
const legs = [];
|
|
74
|
+
for (const p of v3) {
|
|
75
|
+
for (const fee of V3_FEES) {
|
|
76
|
+
legs.push({ p, a: tokenIn, b: tokenOut, fee });
|
|
77
|
+
for (const m of mids)
|
|
78
|
+
legs.push({ p, a: tokenIn, b: m, fee }, { p, a: m, b: tokenOut, fee });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const overrides = options.blockTag === undefined ? undefined : { blockTag: options.blockTag };
|
|
82
|
+
const pools = legs.length ? await ctx.provider.tryAll(legs.map((l) => ctx.provider.contract(l.p.factory, v3FactoryInterface).getPool(l.a, l.b, l.fee)), overrides) : [];
|
|
83
|
+
// 再读存在的池子的当前流动性:没有流动性的不报价;两跳的每一跳只留流动性最大的几个档位(同一对代币的流动性可以直接比)
|
|
84
|
+
const found = legs.flatMap((l, i) => (pools[i] && BigInt(pools[i]) !== 0n ? [{ ...l, pool: pools[i] }] : []));
|
|
85
|
+
const liquidity = found.length ? await ctx.provider.tryAll(found.map((l) => ctx.provider.contract(l.pool, v3PoolInterface).liquidity()), overrides) : [];
|
|
86
|
+
const live = found.map((l, i) => ({ ...l, liquidity: liquidity[i] ?? 0n })).filter((l) => l.liquidity > 0n);
|
|
87
|
+
const legKey = (l) => `${l.p.id}:${l.a}:${l.b}`;
|
|
88
|
+
const byLeg = new Map();
|
|
89
|
+
for (const l of live)
|
|
90
|
+
byLeg.set(legKey(l), [...(byLeg.get(legKey(l)) ?? []), l]);
|
|
91
|
+
const exists = new Set();
|
|
92
|
+
for (const [key, list] of byLeg) {
|
|
93
|
+
const direct = key.endsWith(`:${tokenIn}:${tokenOut}`);
|
|
94
|
+
const kept = direct ? list : [...list].sort((x, y) => (x.liquidity < y.liquidity ? 1 : x.liquidity > y.liquidity ? -1 : 0)).slice(0, TIERS_PER_LEG);
|
|
95
|
+
for (const l of kept)
|
|
96
|
+
exists.add(`${l.p.id}:${l.a}:${l.b}:${l.fee}`);
|
|
97
|
+
}
|
|
98
|
+
const has = (p, a, b, fee) => exists.has(`${p.id}:${a}:${b}:${fee}`);
|
|
99
|
+
const candidates = [];
|
|
100
|
+
for (const p of protocols) {
|
|
101
|
+
if (p.version === 'v2') {
|
|
102
|
+
const router = p.router;
|
|
103
|
+
candidates.push({ protocol: p, version: 'v2', path: [tokenIn, tokenOut], fees: [], router });
|
|
104
|
+
for (const m of mids)
|
|
105
|
+
candidates.push({ protocol: p, version: 'v2', path: [tokenIn, m, tokenOut], fees: [], router });
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const c = V3_SWAP_CONTRACTS[p.id]?.[ctx.chainId];
|
|
109
|
+
for (const fee of V3_FEES) {
|
|
110
|
+
if (has(p, tokenIn, tokenOut, fee))
|
|
111
|
+
candidates.push({ protocol: p, version: 'v3', path: [tokenIn, tokenOut], fees: [fee], router: c.router, quoter: c.quoter });
|
|
112
|
+
}
|
|
113
|
+
for (const m of mids) {
|
|
114
|
+
for (const f1 of V3_FEES) {
|
|
115
|
+
if (!has(p, tokenIn, m, f1))
|
|
116
|
+
continue;
|
|
117
|
+
for (const f2 of V3_FEES) {
|
|
118
|
+
if (has(p, m, tokenOut, f2))
|
|
119
|
+
candidates.push({ protocol: p, version: 'v3', path: [tokenIn, m, tokenOut], fees: [f1, f2], router: c.router, quoter: c.quoter });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// V2 的 getAmountsOut 很便宜,一次报完;V3 每 QUOTES_PER_CALL 个一组并发
|
|
125
|
+
const v2Index = candidates.flatMap((c, i) => (c.version === 'v2' ? [i] : []));
|
|
126
|
+
const v3Index = candidates.flatMap((c, i) => (c.version === 'v3' ? [i] : []));
|
|
127
|
+
const groups = [v2Index, ...Array.from({ length: Math.ceil(v3Index.length / QUOTES_PER_CALL) }, (_, k) => v3Index.slice(k * QUOTES_PER_CALL, (k + 1) * QUOTES_PER_CALL))].filter((g) => g.length);
|
|
128
|
+
const quotes = new Array(candidates.length).fill(null);
|
|
129
|
+
await Promise.all(groups.map(async (group) => {
|
|
130
|
+
const results = await ctx.provider.tryAll(group.map((i) => quoteCall(ctx, candidates[i], amountIn)), overrides);
|
|
131
|
+
group.forEach((i, k) => (quotes[i] = results[k]));
|
|
132
|
+
}));
|
|
133
|
+
return candidates
|
|
134
|
+
.map((c, i) => ({ ...c, amountOut: amountOf(c, quotes[i]) }))
|
|
135
|
+
.filter((c) => c.amountOut > 0n)
|
|
136
|
+
.sort((a, b) => (a.amountOut < b.amountOut ? 1 : a.amountOut > b.amountOut ? -1 : 0));
|
|
137
|
+
}
|
|
138
|
+
function quoteCall(ctx, c, amountIn) {
|
|
139
|
+
if (c.version === 'v2')
|
|
140
|
+
return ctx.provider.contract(c.router, v2RouterInterface).getAmountsOut(amountIn, c.path);
|
|
141
|
+
const quoter = ctx.provider.contract(c.quoter, quoterInterface);
|
|
142
|
+
return c.path.length === 2
|
|
143
|
+
? quoter.quoteExactInputSingle({ tokenIn: c.path[0], tokenOut: c.path[1], amountIn, fee: c.fees[0], sqrtPriceLimitX96: 0n })
|
|
144
|
+
: quoter.quoteExactInput(encodePath(c.path, c.fees), amountIn);
|
|
145
|
+
}
|
|
146
|
+
function amountOf(c, result) {
|
|
147
|
+
if (result === null || result === undefined)
|
|
148
|
+
return 0n;
|
|
149
|
+
if (c.version === 'v2') {
|
|
150
|
+
const amounts = result;
|
|
151
|
+
return amounts.length === c.path.length ? amounts[amounts.length - 1] : 0n;
|
|
152
|
+
}
|
|
153
|
+
return result[0] ?? 0n;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 报价并构建兑换的交易(不签名):选输出最多的路线,最少收到 = 报价 × (1 − slippage);卖出代币时额度不够先授权给 Router。
|
|
157
|
+
*
|
|
158
|
+
* ```ts
|
|
159
|
+
* const plan = await buildSwap(provider, user, { tokenIn: NATIVE_TOKEN, tokenOut: USDT, amountInFormatted: '0.1' })
|
|
160
|
+
* plan.amountOutFormatted // '61.2'
|
|
161
|
+
* plan.route // { protocol: 'pancakeswap-v3', path: [WBNB, USDT], fees: [100], … }
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export async function buildSwap(provider, owner, params, options = {}) {
|
|
165
|
+
const { slippage, deadline, recipient, approve } = options;
|
|
166
|
+
const ctx = await createCtx(provider, owner, { slippage, deadline, recipient, approve });
|
|
167
|
+
const wrapped = LP_QUOTE_TOKENS[ctx.chainId]?.[0];
|
|
168
|
+
const nativeIn = isNative(ctx, params.tokenIn);
|
|
169
|
+
const nativeOut = isNative(ctx, params.tokenOut);
|
|
170
|
+
if ((nativeIn || nativeOut) && !wrapped)
|
|
171
|
+
throw new Error(`No wrapped native token known on chain ${ctx.chainId}`);
|
|
172
|
+
const tokenIn = nativeIn ? evm(wrapped) : evm(params.tokenIn);
|
|
173
|
+
const tokenOut = nativeOut ? evm(wrapped) : evm(params.tokenOut);
|
|
174
|
+
if (same(tokenIn, tokenOut))
|
|
175
|
+
throw new Error(nativeIn || nativeOut ? 'Wrapping / unwrapping the native token is not a swap; use the wrapped token contract' : 'tokenIn and tokenOut are the same');
|
|
176
|
+
const [infoIn, infoOut] = await tokenInfo(ctx, [nativeIn ? params.tokenIn : tokenIn, nativeOut ? params.tokenOut : tokenOut]);
|
|
177
|
+
const tIn = infoIn;
|
|
178
|
+
const tOut = infoOut;
|
|
179
|
+
const amountIn = parseAmount(params.amountIn, params.amountInFormatted, tIn, 'amountIn');
|
|
180
|
+
if (amountIn === undefined || amountIn <= 0n)
|
|
181
|
+
throw new Error('amountIn must be greater than 0');
|
|
182
|
+
const all = await quoteRoutes(ctx, tokenIn, tokenOut, amountIn, options);
|
|
183
|
+
const wanted = options.route;
|
|
184
|
+
const routes = wanted
|
|
185
|
+
? all.filter((c) => c.protocol.id === wanted.protocol && c.path.length === wanted.path.length && c.path.every((a, i) => same(a, wanted.path[i])) && c.fees.join() === wanted.fees.join())
|
|
186
|
+
: all;
|
|
187
|
+
const best = routes[0];
|
|
188
|
+
if (!best)
|
|
189
|
+
throw new Error(wanted ? 'The given route has no quote (pool missing or no liquidity)' : 'No route found: no pool for this pair (directly or through the intermediate tokens) in the built-in protocols');
|
|
190
|
+
// 价格影响:同一路线卖出极小的数量(1 / 10000)的价格
|
|
191
|
+
const small = amountIn / 10000n;
|
|
192
|
+
const smallOut = small > 0n ? amountOf(best, await provider.tryAll([quoteCall(ctx, best, small)], options.blockTag === undefined ? undefined : { blockTag: options.blockTag }).then((r) => r[0])) : 0n;
|
|
193
|
+
// 参考交易的输出太小时取整误差太大(几个最小单位就差好几个百分点),算不准,返回 null
|
|
194
|
+
const priceImpact = smallOut >= 10000n ? Math.max(0, 1 - Number(best.amountOut) / Number(amountIn) / (Number(smallOut) / Number(small))) : null;
|
|
195
|
+
const tax = options.tax ?? 0;
|
|
196
|
+
if (!(tax >= 0 && tax < 1))
|
|
197
|
+
throw new RangeError(`tax must be in [0, 1): ${tax}`);
|
|
198
|
+
const keep = best.version === 'v2' ? 1 - tax : 1;
|
|
199
|
+
const amountOutMin = minus((best.amountOut * BigInt(Math.round(keep * 1_000_000))) / 1000000n, ctx.slippage);
|
|
200
|
+
// approvals 只会返回 kind 为 'approve' 的交易
|
|
201
|
+
// Router 在 Tron 上是 T 地址:授权的 ABI 参数要用 0x 格式
|
|
202
|
+
const transactions = (nativeIn ? [] : await approvals(ctx, [{ token: tokenIn, spender: evm(best.router), amount: amountIn }]));
|
|
203
|
+
transactions.push(swapTx(ctx, best, amountIn, amountOutMin, nativeIn, nativeOut));
|
|
204
|
+
const route = (c) => ({
|
|
205
|
+
protocol: c.protocol.id,
|
|
206
|
+
protocolName: c.protocol.name,
|
|
207
|
+
version: c.version,
|
|
208
|
+
path: c.path.map((a) => out(ctx, a)),
|
|
209
|
+
fees: c.fees,
|
|
210
|
+
amountOut: c.amountOut.toString(),
|
|
211
|
+
});
|
|
212
|
+
const decimals = (t) => t.decimals ?? 0;
|
|
213
|
+
return {
|
|
214
|
+
tokenIn: tIn,
|
|
215
|
+
tokenOut: tOut,
|
|
216
|
+
amountIn: amountIn.toString(),
|
|
217
|
+
amountInFormatted: fmt(amountIn, tIn),
|
|
218
|
+
amountOut: best.amountOut.toString(),
|
|
219
|
+
amountOutFormatted: fmt(best.amountOut, tOut),
|
|
220
|
+
amountOutMin: amountOutMin.toString(),
|
|
221
|
+
amountOutMinFormatted: fmt(amountOutMin, tOut),
|
|
222
|
+
price: tIn.decimals === null || tOut.decimals === null ? null : Number(best.amountOut) / 10 ** decimals(tOut) / (Number(amountIn) / 10 ** decimals(tIn)),
|
|
223
|
+
priceImpact,
|
|
224
|
+
route: route(best),
|
|
225
|
+
routes: routes.map(route),
|
|
226
|
+
transactions,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function swapTx(ctx, c, amountIn, amountOutMin, nativeIn, nativeOut) {
|
|
230
|
+
const value = nativeIn ? amountIn.toString() : '0';
|
|
231
|
+
if (c.version === 'v2') {
|
|
232
|
+
const data = nativeIn
|
|
233
|
+
? v2RouterInterface.encodeFunctionData('swapExactETHForTokensSupportingFeeOnTransferTokens', [amountOutMin, c.path, ctx.recipient, ctx.deadline])
|
|
234
|
+
: nativeOut
|
|
235
|
+
? v2RouterInterface.encodeFunctionData('swapExactTokensForETHSupportingFeeOnTransferTokens', [amountIn, amountOutMin, c.path, ctx.recipient, ctx.deadline])
|
|
236
|
+
: v2RouterInterface.encodeFunctionData('swapExactTokensForTokensSupportingFeeOnTransferTokens', [amountIn, amountOutMin, c.path, ctx.recipient, ctx.deadline]);
|
|
237
|
+
return { kind: 'swap', to: out(ctx, c.router), data, value };
|
|
238
|
+
}
|
|
239
|
+
// V3:卖出主币时附带 value(Router 自动包装);买入主币时先收到 Router,再 unwrapWETH9 给收款地址
|
|
240
|
+
const recipient = nativeOut ? ADDRESS_THIS : ctx.recipient;
|
|
241
|
+
const swap = c.path.length === 2
|
|
242
|
+
? swapRouterInterface.encodeFunctionData('exactInputSingle', [
|
|
243
|
+
{ tokenIn: c.path[0], tokenOut: c.path[1], fee: c.fees[0], recipient, amountIn, amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0n },
|
|
244
|
+
])
|
|
245
|
+
: swapRouterInterface.encodeFunctionData('exactInput', [{ path: encodePath(c.path, c.fees), recipient, amountIn, amountOutMinimum: amountOutMin }]);
|
|
246
|
+
const calls = nativeOut ? [swap, swapRouterInterface.encodeFunctionData('unwrapWETH9', [amountOutMin, ctx.recipient])] : [swap];
|
|
247
|
+
return { kind: 'swap', to: out(ctx, c.router), data: swapRouterInterface.encodeFunctionData('multicall', [ctx.deadline, calls]), value };
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 兑换:构建(同 buildSwap)后用 from 签名发送(钱包同 /write:私钥、ethers Signer、浏览器钱包、Tron 钱包)。
|
|
251
|
+
* 授权失败时不发兑换的交易
|
|
252
|
+
*
|
|
253
|
+
* ```ts
|
|
254
|
+
* const r = await swap(provider, key, { tokenIn: USDT, tokenOut: NATIVE_TOKEN, amountInFormatted: '100' }, { slippage: 0.01 })
|
|
255
|
+
* r.status // 'confirmed'
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
export async function swap(provider, from, params, options = {}) {
|
|
259
|
+
const [{ batchCall, tronModule }, { resolveSigner }, { emptyOutcome, toWriteResult }] = await Promise.all([import('./write/batch.js'), import('./write/signer.js'), import('./write/send.js')]);
|
|
260
|
+
const tron = await tronModule(provider);
|
|
261
|
+
const owner = tron ? await tron.tronSignerAddress(from) : (await resolveSigner(from)).address;
|
|
262
|
+
let plan = await buildSwap(provider, owner, params, options);
|
|
263
|
+
const send = async (txs) => (await batchCall(provider, txs.map((tx) => ({ from, to: tx.to, data: tx.data, value: BigInt(tx.value) })), {
|
|
264
|
+
...options,
|
|
265
|
+
mode: 'tx',
|
|
266
|
+
continueOnError: false,
|
|
267
|
+
onUpdate: options.onUpdate ? (r) => options.onUpdate?.({ ...r, kind: txs[r.index].kind }) : undefined,
|
|
268
|
+
})).map((r, i) => ({ ...r, kind: txs[i].kind }));
|
|
269
|
+
const txs = plan.transactions;
|
|
270
|
+
let results;
|
|
271
|
+
if (txs.length === 1) {
|
|
272
|
+
results = await send(txs);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// 有授权时先发授权:确认后重新报价再发兑换,deadline 和最少收到从发兑换那一刻算,
|
|
276
|
+
// 不会因为授权等得久而过期或按旧价成交
|
|
277
|
+
const approved = await send(txs.slice(0, -1));
|
|
278
|
+
const last = txs[txs.length - 1];
|
|
279
|
+
if (approved.every((r) => r.status === 'confirmed')) {
|
|
280
|
+
plan = await buildSwap(provider, owner, params, options);
|
|
281
|
+
const fresh = plan.transactions[plan.transactions.length - 1];
|
|
282
|
+
results = [...approved, ...(await send([fresh])).map((r) => ({ ...r, index: txs.length - 1 }))];
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
results = [...approved, { ...toWriteResult(txs.length - 1, owner, last.to, emptyOutcome('skipped', 'skipped: the approval did not succeed')), kind: last.kind }];
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const main = results[results.length - 1];
|
|
289
|
+
return { plan, results, status: main.status, hash: main.hash };
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=swap.js.map
|
package/dist/swap.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../src/swap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** constructor(address router, address token, address pair) payable — 返回 (stage, buyQuote, bought, transferSent, transferReceived, sellAmount, sellQuote, sold, buyGas, sellGas, pairReceived) */
|
|
2
|
+
export declare const TOKEN_PROBE_BYTECODE = "0x6080604052604051610ba0380380610ba0833981016040819052610022916108be565b61007f60405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e39190610901565b6040805160028082526060820183529293506000929091602083019080368337019050509050818160008151811061011d5761011d610939565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061015157610151610939565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81529087169063d06ca61f9061018e9034908590600401610994565b600060405180830381865afa9250505080156101cc57506040513d6000823e601f3d908101601f191682016040526101c991908101906109b5565b60015b156101f757806001815181106101e4576101e4610939565b6020026020010151846020018181525050505b60005a9050866001600160a01b031663b6f9de953460008530426040518663ffffffff1660e01b81526004016102309493929190610a81565b6000604051808303818588803b15801561024957600080fd5b505af19350505050801561025b575060015b61026857600184526102e7565b5a6102739082610ab6565b6101008501526040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa1580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610ad7565b60408501525b83511580156102fb5750600a846040015110155b1561042d5760408051306020808301919091526001600160a01b038916828401528251808303840181526060909201835281519101209085015161034190600a90610af0565b606086018190526040516001600160a01b038316602482015260448101919091526103ad90889063a9059cbb60e01b906064015b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529061080116565b15610426576040516370a0823160e01b81526001600160a01b0382811660048301528816906370a0823190602401602060405180830381865afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c9190610ad7565b608086015261042b565b600285525b505b83516000036104dd576040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa15801561047a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049e9190610ad7565b60a08501526040516001600160a01b038816602482015260001960448201526104d490879063095ea7b360e01b90606401610375565b6104dd57600384525b835160000361075d5785826000815181106104fa576104fa610939565b60200260200101906001600160a01b031690816001600160a01b031681525050828260018151811061052e5761052e610939565b6001600160a01b03928316602091820292909201015260a085015160405163d06ca61f60e01b81529189169163d06ca61f9161056e918690600401610994565b600060405180830381865afa9250505080156105ac57506040513d6000823e601f3d908101601f191682016040526105a991908101906109b5565b60015b156105d757806001815181106105c4576105c4610939565b60200260200101518560c0018181525050505b6040516370a0823160e01b81526001600160a01b03868116600483015247916000918916906370a0823190602401602060405180830381865afa158015610622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106469190610ad7565b90505a60a087015160405163791ac94760e01b81529194506001600160a01b038b169163791ac9479161068491600090899030904290600401610b12565b600060405180830381600087803b15801561069e57600080fd5b505af19250505080156106af575060015b6106bc576004865261075a565b5a6106c79084610ab6565b6101208701526106d78247610ab6565b60e08701526040516370a0823160e01b81526001600160a01b0388811660048301528291908a16906370a0823190602401602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190610ad7565b6107539190610ab6565b6101408701525b50505b6000846040516020016107e89190600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015261012083015161012083015261014083015161014083015292915050565b6040516020818303038152906040529050805160208201f35b6000806000846001600160a01b03168460405161081e9190610b4e565b6000604051808303816000865af19150503d806000811461085b576040519150601f19603f3d011682016040523d82523d6000602084013e610860565b606091505b5091509150818015610897575080511580610897575060208151101580156108975750808060200190518101906108979190610b7d565b925050505b92915050565b80516001600160a01b03811681146108b957600080fd5b919050565b6000806000606084860312156108d357600080fd5b6108dc846108a2565b92506108ea602085016108a2565b91506108f8604085016108a2565b90509250925092565b60006020828403121561091357600080fd5b61091c826108a2565b9392505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561098a5781516001600160a01b0316865260209586019590910190600101610963565b5093949350505050565b8281526040602082015260006109ad604083018461094f565b949350505050565b6000602082840312156109c757600080fd5b81516001600160401b038111156109dd57600080fd5b8201601f810184136109ee57600080fd5b80516001600160401b03811115610a0757610a07610923565b604051600582901b90603f8201601f191681016001600160401b0381118282101715610a3557610a35610923565b604052918252602081840181019290810187841115610a5357600080fd5b6020850194505b83851015610a7657845180825260209586019590935001610a5a565b509695505050505050565b848152608060208201526000610a9a608083018661094f565b6001600160a01b03949094166040830152506060015292915050565b8181038181111561089c57634e487b7160e01b600052601160045260246000fd5b600060208284031215610ae957600080fd5b5051919050565b600082610b0d57634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a060408201526000610b3160a083018661094f565b6001600160a01b0394909416606083015250608001529392505050565b6000825160005b81811015610b6f5760208186018101518583015201610b55565b506000920191825250919050565b600060208284031215610b8f57600080fd5b8151801515811461091c57600080fdfe";
|
|
3
|
+
//# sourceMappingURL=tokenProbe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenProbe.d.ts","sourceRoot":"","sources":["../src/tokenProbe.ts"],"names":[],"mappings":"AAEA,kMAAkM;AAClM,eAAO,MAAM,oBAAoB,u0LACqyL,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// 由 scripts/build-contracts.mjs 生成,不要手改。源码:contracts/TokenProbe.sol(solc 0.8.30+commit.73712a01.Emscripten.clang)
|
|
2
|
+
/** constructor(address router, address token, address pair) payable — 返回 (stage, buyQuote, bought, transferSent, transferReceived, sellAmount, sellQuote, sold, buyGas, sellGas, pairReceived) */
|
|
3
|
+
export const TOKEN_PROBE_BYTECODE = '0x6080604052604051610ba0380380610ba0833981016040819052610022916108be565b61007f60405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e39190610901565b6040805160028082526060820183529293506000929091602083019080368337019050509050818160008151811061011d5761011d610939565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061015157610151610939565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81529087169063d06ca61f9061018e9034908590600401610994565b600060405180830381865afa9250505080156101cc57506040513d6000823e601f3d908101601f191682016040526101c991908101906109b5565b60015b156101f757806001815181106101e4576101e4610939565b6020026020010151846020018181525050505b60005a9050866001600160a01b031663b6f9de953460008530426040518663ffffffff1660e01b81526004016102309493929190610a81565b6000604051808303818588803b15801561024957600080fd5b505af19350505050801561025b575060015b61026857600184526102e7565b5a6102739082610ab6565b6101008501526040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa1580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610ad7565b60408501525b83511580156102fb5750600a846040015110155b1561042d5760408051306020808301919091526001600160a01b038916828401528251808303840181526060909201835281519101209085015161034190600a90610af0565b606086018190526040516001600160a01b038316602482015260448101919091526103ad90889063a9059cbb60e01b906064015b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529061080116565b15610426576040516370a0823160e01b81526001600160a01b0382811660048301528816906370a0823190602401602060405180830381865afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c9190610ad7565b608086015261042b565b600285525b505b83516000036104dd576040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa15801561047a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049e9190610ad7565b60a08501526040516001600160a01b038816602482015260001960448201526104d490879063095ea7b360e01b90606401610375565b6104dd57600384525b835160000361075d5785826000815181106104fa576104fa610939565b60200260200101906001600160a01b031690816001600160a01b031681525050828260018151811061052e5761052e610939565b6001600160a01b03928316602091820292909201015260a085015160405163d06ca61f60e01b81529189169163d06ca61f9161056e918690600401610994565b600060405180830381865afa9250505080156105ac57506040513d6000823e601f3d908101601f191682016040526105a991908101906109b5565b60015b156105d757806001815181106105c4576105c4610939565b60200260200101518560c0018181525050505b6040516370a0823160e01b81526001600160a01b03868116600483015247916000918916906370a0823190602401602060405180830381865afa158015610622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106469190610ad7565b90505a60a087015160405163791ac94760e01b81529194506001600160a01b038b169163791ac9479161068491600090899030904290600401610b12565b600060405180830381600087803b15801561069e57600080fd5b505af19250505080156106af575060015b6106bc576004865261075a565b5a6106c79084610ab6565b6101208701526106d78247610ab6565b60e08701526040516370a0823160e01b81526001600160a01b0388811660048301528291908a16906370a0823190602401602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190610ad7565b6107539190610ab6565b6101408701525b50505b6000846040516020016107e89190600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015261012083015161012083015261014083015161014083015292915050565b6040516020818303038152906040529050805160208201f35b6000806000846001600160a01b03168460405161081e9190610b4e565b6000604051808303816000865af19150503d806000811461085b576040519150601f19603f3d011682016040523d82523d6000602084013e610860565b606091505b5091509150818015610897575080511580610897575060208151101580156108975750808060200190518101906108979190610b7d565b925050505b92915050565b80516001600160a01b03811681146108b957600080fd5b919050565b6000806000606084860312156108d357600080fd5b6108dc846108a2565b92506108ea602085016108a2565b91506108f8604085016108a2565b90509250925092565b60006020828403121561091357600080fd5b61091c826108a2565b9392505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561098a5781516001600160a01b0316865260209586019590910190600101610963565b5093949350505050565b8281526040602082015260006109ad604083018461094f565b949350505050565b6000602082840312156109c757600080fd5b81516001600160401b038111156109dd57600080fd5b8201601f810184136109ee57600080fd5b80516001600160401b03811115610a0757610a07610923565b604051600582901b90603f8201601f191681016001600160401b0381118282101715610a3557610a35610923565b604052918252602081840181019290810187841115610a5357600080fd5b6020850194505b83851015610a7657845180825260209586019590935001610a5a565b509695505050505050565b848152608060208201526000610a9a608083018661094f565b6001600160a01b03949094166040830152506060015292915050565b8181038181111561089c57634e487b7160e01b600052601160045260246000fd5b600060208284031215610ae957600080fd5b5051919050565b600082610b0d57634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a060408201526000610b3160a083018661094f565b6001600160a01b0394909416606083015250608001529392505050565b6000825160005b81811015610b6f5760208186018101518583015201610b55565b506000920191825250919050565b600060208284031215610b8f57600080fd5b8151801515811461091c57600080fdfe';
|
|
4
|
+
//# sourceMappingURL=tokenProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenProbe.js","sourceRoot":"","sources":["../src/tokenProbe.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAElH,kMAAkM;AAClM,MAAM,CAAC,MAAM,oBAAoB,GAC/B,o0LAAo0L,CAAA"}
|