@w3lib/evm-batch-call 0.6.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 +24 -0
- package/README.md +161 -2
- 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/lp.d.ts +2 -1
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +2 -1
- package/dist/lp.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/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 +25 -0
- package/dist/write/tron.d.ts.map +1 -1
- package/dist/write/tron.js +26 -0
- package/dist/write/tron.js.map +1 -1
- package/package.json +39 -16
- 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/lp.ts +3 -1
- 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/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 +43 -0
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"}
|
package/dist/write/tron.d.ts
CHANGED
|
@@ -47,6 +47,31 @@ interface RefBlock {
|
|
|
47
47
|
}
|
|
48
48
|
/** 交易的 raw_data:参考区块、过期时间、合约、时间戳、fee_limit(字段按编号顺序写,与节点重新序列化的结果一致,txID 才对得上) */
|
|
49
49
|
export declare function encodeRawData(contract: TronContract, ref: RefBlock, expiration: number, timestamp: number, feeLimit: bigint): Uint8Array;
|
|
50
|
+
/** 一笔交易的手续费估算(子路径 /fees 的 estimateCost 在 Tron 上用) */
|
|
51
|
+
export interface TronCostEstimate {
|
|
52
|
+
/** 合约调用消耗的能量(模拟得到);转 TRX 为 0 */
|
|
53
|
+
energy: number;
|
|
54
|
+
/** 交易的字节数(带宽) */
|
|
55
|
+
bandwidth: number;
|
|
56
|
+
/** 账户剩余的能量 / 带宽不够时要烧的 TRX(sun) */
|
|
57
|
+
energyBurn: bigint;
|
|
58
|
+
bandwidthBurn: bigint;
|
|
59
|
+
/** 转 TRX 给没激活的地址:激活费(含创建账户的带宽),算在 bandwidthBurn 里 */
|
|
60
|
+
activates: boolean;
|
|
61
|
+
/** 每单位能量、每字节带宽的价格(sun) */
|
|
62
|
+
energyPrice: bigint;
|
|
63
|
+
bandwidthPrice: bigint;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 估算一笔交易要烧多少 TRX:合约调用模拟出能量,按发送者剩余的质押能量 / 免费和质押带宽抵扣,不够的部分按链参数的价格烧 TRX。
|
|
67
|
+
* 能量按模拟值(不加余量),实际执行可能略有出入
|
|
68
|
+
*/
|
|
69
|
+
export declare function tronEstimateCost(provider: Provider, call: {
|
|
70
|
+
from: string;
|
|
71
|
+
to: string;
|
|
72
|
+
data?: string;
|
|
73
|
+
value?: bigint;
|
|
74
|
+
}): Promise<TronCostEstimate>;
|
|
50
75
|
export declare function tronBatchCall(provider: Provider, calls: readonly WriteCall[], options?: BatchCallOptions & TronSendOptions): Promise<WriteResult[]>;
|
|
51
76
|
/** Tron 一对多转账:每个收款人一笔交易(Tron 上没有通用的 Disperse 合约),结果的 via 为 'tx' */
|
|
52
77
|
export declare function tronBatchTransfer(provider: Provider, from: SignerInput, recipients: readonly TransferItem[], options?: BatchTransferOptions & TronSendOptions): Promise<TransferResult[]>;
|
package/dist/write/tron.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tron.d.ts","sourceRoot":"","sources":["../../src/write/tron.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAqB,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzF,OAAO,EAA0D,KAAK,eAAe,EAAkB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAC1I,OAAO,EAAgB,KAAK,WAAW,EAAmB,MAAM,aAAa,CAAA;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAIvF,aAAa;AACb,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,GAAG,EAAE,UAAU,CAAA;IACf,QAAQ,EAAE,YAAY,CAAA;IACtB,GAAG,EAAE,QAAQ,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAuBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0B/J;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAW,GAAG,MAAM,CA2B1G;AAuED,6BAA6B;AAC7B,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E;AAwBD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAoBzF,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAWxI;
|
|
1
|
+
{"version":3,"file":"tron.d.ts","sourceRoot":"","sources":["../../src/write/tron.ts"],"names":[],"mappings":"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"}
|
package/dist/write/tron.js
CHANGED
|
@@ -633,6 +633,32 @@ async function tronRpc(provider, options) {
|
|
|
633
633
|
function canonical(address) {
|
|
634
634
|
return toTronAddress(toEvmAddress(address));
|
|
635
635
|
}
|
|
636
|
+
/**
|
|
637
|
+
* 估算一笔交易要烧多少 TRX:合约调用模拟出能量,按发送者剩余的质押能量 / 免费和质押带宽抵扣,不够的部分按链参数的价格烧 TRX。
|
|
638
|
+
* 能量按模拟值(不加余量),实际执行可能略有出入
|
|
639
|
+
*/
|
|
640
|
+
export async function tronEstimateCost(provider, call) {
|
|
641
|
+
const rpc = await tronRpc(provider, {});
|
|
642
|
+
const from = canonical(call.from);
|
|
643
|
+
const to = canonical(call.to);
|
|
644
|
+
const value = call.value ?? 0n;
|
|
645
|
+
const data = call.data && call.data !== '0x' ? call.data : null;
|
|
646
|
+
const [params, resources, isContract] = await Promise.all([rpc.params(), rpc.resources(from), data ? Promise.resolve(true) : rpc.isContract(to)]);
|
|
647
|
+
const contract = isContract ? { type: 'trigger', owner: from, contract: to, data: data ?? '0x', callValue: value } : { type: 'transfer', owner: from, to, amount: value };
|
|
648
|
+
const energy = contract.type === 'trigger' ? await rpc.simulate(contract) : 0;
|
|
649
|
+
const feeLimit = contract.type === 'trigger' ? BigInt(Math.ceil(energy * 1.5)) * params.energyFee || 1000000n : 0n;
|
|
650
|
+
const bytes = transactionBytes(contract, feeLimit);
|
|
651
|
+
const activates = contract.type === 'transfer' && !(await rpc.accountExists(to));
|
|
652
|
+
return {
|
|
653
|
+
energy,
|
|
654
|
+
bandwidth: bytes,
|
|
655
|
+
energyBurn: BigInt(Math.max(0, energy - resources.energy)) * params.energyFee,
|
|
656
|
+
bandwidthBurn: contract.type === 'transfer' ? transferBurn(resources, bytes, params, activates) : bandwidthBurn(resources, bytes, params.bandwidthFee),
|
|
657
|
+
activates,
|
|
658
|
+
energyPrice: params.energyFee,
|
|
659
|
+
bandwidthPrice: params.bandwidthFee,
|
|
660
|
+
};
|
|
661
|
+
}
|
|
636
662
|
/** 转 TRX:普通地址用 TransferContract;合约地址用合约调用(空 calldata 带 call_value,主网禁止 TransferContract 转给合约) */
|
|
637
663
|
async function trxContract(rpc, owner, to, amount) {
|
|
638
664
|
return (await rpc.isContract(to)) ? { type: 'trigger', owner, contract: to, data: '0x', callValue: amount } : { type: 'transfer', owner, to, amount };
|