@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.
Files changed (160) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +240 -4
  3. package/contracts/TokenProbe.sol +103 -0
  4. package/dist/aggregate.d.ts.map +1 -1
  5. package/dist/aggregate.js +114 -3
  6. package/dist/aggregate.js.map +1 -1
  7. package/dist/approvals.d.ts +169 -0
  8. package/dist/approvals.d.ts.map +1 -0
  9. package/dist/approvals.js +310 -0
  10. package/dist/approvals.js.map +1 -0
  11. package/dist/chains.d.ts.map +1 -1
  12. package/dist/chains.js +4 -0
  13. package/dist/chains.js.map +1 -1
  14. package/dist/fees.d.ts +97 -0
  15. package/dist/fees.d.ts.map +1 -0
  16. package/dist/fees.js +115 -0
  17. package/dist/fees.js.map +1 -0
  18. package/dist/http.d.ts +10 -0
  19. package/dist/http.d.ts.map +1 -0
  20. package/dist/http.js +30 -0
  21. package/dist/http.js.map +1 -0
  22. package/dist/liquidity/common.d.ts +72 -0
  23. package/dist/liquidity/common.d.ts.map +1 -0
  24. package/dist/liquidity/common.js +271 -0
  25. package/dist/liquidity/common.js.map +1 -0
  26. package/dist/liquidity/concentrated.d.ts +19 -0
  27. package/dist/liquidity/concentrated.d.ts.map +1 -0
  28. package/dist/liquidity/concentrated.js +106 -0
  29. package/dist/liquidity/concentrated.js.map +1 -0
  30. package/dist/liquidity/index.d.ts +42 -0
  31. package/dist/liquidity/index.d.ts.map +1 -0
  32. package/dist/liquidity/index.js +143 -0
  33. package/dist/liquidity/index.js.map +1 -0
  34. package/dist/liquidity/types.d.ts +182 -0
  35. package/dist/liquidity/types.d.ts.map +1 -0
  36. package/dist/liquidity/types.js +2 -0
  37. package/dist/liquidity/types.js.map +1 -0
  38. package/dist/liquidity/v2.d.ts +5 -0
  39. package/dist/liquidity/v2.d.ts.map +1 -0
  40. package/dist/liquidity/v2.js +342 -0
  41. package/dist/liquidity/v2.js.map +1 -0
  42. package/dist/liquidity/v3.d.ts +6 -0
  43. package/dist/liquidity/v3.d.ts.map +1 -0
  44. package/dist/liquidity/v3.js +310 -0
  45. package/dist/liquidity/v3.js.map +1 -0
  46. package/dist/liquidity/v4.d.ts +5 -0
  47. package/dist/liquidity/v4.d.ts.map +1 -0
  48. package/dist/liquidity/v4.js +279 -0
  49. package/dist/liquidity/v4.js.map +1 -0
  50. package/dist/lp.d.ts +10 -2
  51. package/dist/lp.d.ts.map +1 -1
  52. package/dist/lp.js +31 -19
  53. package/dist/lp.js.map +1 -1
  54. package/dist/lpMath.d.ts +55 -0
  55. package/dist/lpMath.d.ts.map +1 -1
  56. package/dist/lpMath.js +209 -0
  57. package/dist/lpMath.js.map +1 -1
  58. package/dist/multicall.d.ts.map +1 -1
  59. package/dist/multicall.js +3 -0
  60. package/dist/multicall.js.map +1 -1
  61. package/dist/names.d.ts +55 -0
  62. package/dist/names.d.ts.map +1 -0
  63. package/dist/names.js +93 -0
  64. package/dist/names.js.map +1 -0
  65. package/dist/owner.d.ts +4 -26
  66. package/dist/owner.d.ts.map +1 -1
  67. package/dist/owner.js +7 -112
  68. package/dist/owner.js.map +1 -1
  69. package/dist/portfolio.d.ts +54 -0
  70. package/dist/portfolio.d.ts.map +1 -0
  71. package/dist/portfolio.js +49 -0
  72. package/dist/portfolio.js.map +1 -0
  73. package/dist/price.d.ts +95 -0
  74. package/dist/price.d.ts.map +1 -0
  75. package/dist/price.js +329 -0
  76. package/dist/price.js.map +1 -0
  77. package/dist/risk.d.ts +42 -0
  78. package/dist/risk.d.ts.map +1 -0
  79. package/dist/risk.js +134 -0
  80. package/dist/risk.js.map +1 -0
  81. package/dist/rpcNodes.d.ts.map +1 -1
  82. package/dist/rpcNodes.js +18 -0
  83. package/dist/rpcNodes.js.map +1 -1
  84. package/dist/subpaths/approvals.d.ts +26 -0
  85. package/dist/subpaths/approvals.d.ts.map +1 -0
  86. package/dist/subpaths/approvals.js +27 -0
  87. package/dist/subpaths/approvals.js.map +1 -0
  88. package/dist/subpaths/fees.d.ts +23 -0
  89. package/dist/subpaths/fees.d.ts.map +1 -0
  90. package/dist/subpaths/fees.js +25 -0
  91. package/dist/subpaths/fees.js.map +1 -0
  92. package/dist/subpaths/liquidity.d.ts +24 -0
  93. package/dist/subpaths/liquidity.d.ts.map +1 -0
  94. package/dist/subpaths/liquidity.js +21 -0
  95. package/dist/subpaths/liquidity.js.map +1 -0
  96. package/dist/subpaths/lp.d.ts +1 -1
  97. package/dist/subpaths/lp.d.ts.map +1 -1
  98. package/dist/subpaths/lp.js +1 -1
  99. package/dist/subpaths/lp.js.map +1 -1
  100. package/dist/subpaths/names.d.ts +35 -0
  101. package/dist/subpaths/names.d.ts.map +1 -0
  102. package/dist/subpaths/names.js +39 -0
  103. package/dist/subpaths/names.js.map +1 -0
  104. package/dist/subpaths/price.d.ts +38 -0
  105. package/dist/subpaths/price.d.ts.map +1 -0
  106. package/dist/subpaths/price.js +40 -0
  107. package/dist/subpaths/price.js.map +1 -0
  108. package/dist/subpaths/risk.d.ts +19 -0
  109. package/dist/subpaths/risk.d.ts.map +1 -0
  110. package/dist/subpaths/risk.js +20 -0
  111. package/dist/subpaths/risk.js.map +1 -0
  112. package/dist/subpaths/swap.d.ts +19 -0
  113. package/dist/subpaths/swap.d.ts.map +1 -0
  114. package/dist/subpaths/swap.js +20 -0
  115. package/dist/subpaths/swap.js.map +1 -0
  116. package/dist/swap.d.ts +128 -0
  117. package/dist/swap.d.ts.map +1 -0
  118. package/dist/swap.js +291 -0
  119. package/dist/swap.js.map +1 -0
  120. package/dist/tokenProbe.d.ts +3 -0
  121. package/dist/tokenProbe.d.ts.map +1 -0
  122. package/dist/tokenProbe.js +4 -0
  123. package/dist/tokenProbe.js.map +1 -0
  124. package/dist/write/tron.d.ts +27 -0
  125. package/dist/write/tron.d.ts.map +1 -1
  126. package/dist/write/tron.js +30 -0
  127. package/dist/write/tron.js.map +1 -1
  128. package/package.json +32 -1
  129. package/src/aggregate.ts +110 -3
  130. package/src/approvals.ts +462 -0
  131. package/src/chains.ts +4 -0
  132. package/src/fees.ts +201 -0
  133. package/src/http.ts +34 -0
  134. package/src/liquidity/common.ts +314 -0
  135. package/src/liquidity/concentrated.ts +121 -0
  136. package/src/liquidity/index.ts +171 -0
  137. package/src/liquidity/types.ts +194 -0
  138. package/src/liquidity/v2.ts +371 -0
  139. package/src/liquidity/v3.ts +382 -0
  140. package/src/liquidity/v4.ts +348 -0
  141. package/src/lp.ts +39 -19
  142. package/src/lpMath.ts +223 -0
  143. package/src/multicall.ts +3 -0
  144. package/src/names.ts +141 -0
  145. package/src/owner.ts +7 -138
  146. package/src/portfolio.ts +91 -0
  147. package/src/price.ts +415 -0
  148. package/src/risk.ts +166 -0
  149. package/src/rpcNodes.ts +18 -0
  150. package/src/subpaths/approvals.ts +48 -0
  151. package/src/subpaths/fees.ts +43 -0
  152. package/src/subpaths/liquidity.ts +52 -0
  153. package/src/subpaths/lp.ts +20 -1
  154. package/src/subpaths/names.ts +43 -0
  155. package/src/subpaths/price.ts +60 -0
  156. package/src/subpaths/risk.ts +23 -0
  157. package/src/subpaths/swap.ts +36 -0
  158. package/src/swap.ts +413 -0
  159. package/src/tokenProbe.ts +5 -0
  160. package/src/write/tron.ts +48 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 手续费估算(子路径 `@w3lib/evm-batch-call/fees`):EIP-1559 的三档费用建议、一笔交易的手续费(含 L1 数据费),
3
+ * Tron 按能量 / 带宽和账户剩余的资源算要烧的 TRX。不放在主入口,不用时打包不会带上这部分代码。
4
+ *
5
+ * ```ts
6
+ * import { getCostEstimate, getFeeEstimate } from '@w3lib/evm-batch-call/fees'
7
+ *
8
+ * await getFeeEstimate({ chainId: 1 })
9
+ * await getCostEstimate({ from: user, to: USDT, data }, { chainId: 728126428 })
10
+ * ```
11
+ */
12
+ import { estimateCost, estimateFees, type CostCall, type CostEstimate, type EstimateCostOptions, type EstimateFeesOptions, type FeeEstimate } from '../fees.js'
13
+ import { resolve, type ShortcutProviderOptions } from '../shortcuts.js'
14
+
15
+ export {
16
+ estimateCost,
17
+ estimateFees,
18
+ type CostCall,
19
+ type CostEstimate,
20
+ type EstimateCostOptions,
21
+ type EstimateFeesOptions,
22
+ type EvmCostEstimate,
23
+ type FeeEstimate,
24
+ type FeeLevel,
25
+ type FeeLevelEstimate,
26
+ type TronCost,
27
+ } from '../fees.js'
28
+
29
+ export interface GetFeeEstimateOptions extends EstimateFeesOptions, ShortcutProviderOptions {}
30
+
31
+ /** 当前的三档手续费建议(EVM 链),节点参数与 getBalances 相同 */
32
+ export function getFeeEstimate(options: GetFeeEstimateOptions = {}): Promise<FeeEstimate> {
33
+ const { provider, own } = resolve(options, ['blocks', 'percentiles', 'baseFeeMultiplier'])
34
+ return estimateFees(provider, own)
35
+ }
36
+
37
+ export interface GetCostEstimateOptions extends EstimateCostOptions, ShortcutProviderOptions {}
38
+
39
+ /** 一笔交易的手续费(EVM:gas × 价格 + L1 数据费;Tron:要烧的 TRX) */
40
+ export function getCostEstimate(call: CostCall, options: GetCostEstimateOptions = {}): Promise<CostEstimate> {
41
+ const { provider, own } = resolve(options, ['blocks', 'percentiles', 'baseFeeMultiplier', 'level', 'fees'])
42
+ return estimateCost(provider, call, own)
43
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * 添加 / 移除流动性(子路径 `@w3lib/evm-batch-call/liquidity`):V2(Router)、V3(仓位 NFT)、Uniswap V4(PositionManager + Permit2),
3
+ * 包括 Tron 上的 SunSwap V2 / V3。不放在主入口,不用时打包不会带上这部分代码。
4
+ *
5
+ * - build*:只读取、不签名,返回预计的数量和要按顺序发送的交易(授权在前),可以当作报价,也可以交给钱包自己发送
6
+ * - addLiquidity / removeLiquidity / collectFees:构建后用私钥 / ethers Signer / 浏览器钱包签名发送(同 /write 的 batchCall)
7
+ *
8
+ * ```ts
9
+ * import { getLpPositions } from '@w3lib/evm-batch-call/lp'
10
+ * import { addLiquidity, buildAddLiquidity, removeLiquidity } from '@w3lib/evm-batch-call/liquidity'
11
+ *
12
+ * const plan = await buildAddLiquidity(multi, owner, { protocol: 'pancakeswap-v3', tokenA: WBNB, tokenB: USDT, fee: 500, priceLower: 550, priceUpper: 650, amountAFormatted: '1' })
13
+ * await addLiquidity(multi, privateKey, { protocol: 'pancakeswap-v2', tokenA: NATIVE_TOKEN, tokenB: USDT, amountAFormatted: '0.1' })
14
+ * const [position] = await getLpPositions(owner, { chainId: 56 })
15
+ * await removeLiquidity(multi, privateKey, { position, percent: 50 })
16
+ * ```
17
+ */
18
+ export {
19
+ addLiquidity,
20
+ buildAddLiquidity,
21
+ buildCollectFees,
22
+ buildRemoveLiquidity,
23
+ collectFees,
24
+ removeLiquidity,
25
+ } from '../liquidity/index.js'
26
+ export { PERMIT2_ADDRESS } from '../liquidity/common.js'
27
+ export type {
28
+ AddLiquidityParams,
29
+ CollectFeesParams,
30
+ IncreaseLiquidityParams,
31
+ LiquidityOptions,
32
+ LiquidityPlan,
33
+ LiquidityResult,
34
+ LiquiditySendOptions,
35
+ LiquidityTx,
36
+ LiquidityTxResult,
37
+ NewPositionParams,
38
+ PositionRef,
39
+ RemoveLiquidityParams,
40
+ } from '../liquidity/types.js'
41
+ export {
42
+ getLiquidityForAmounts,
43
+ getMaxAmounts,
44
+ getMinAmounts,
45
+ getMintAmounts,
46
+ getTickAtSqrtRatio,
47
+ nearestUsableTick,
48
+ priceToSqrtPriceX96,
49
+ priceToTick,
50
+ } from '../lpMath.js'
51
+ export type { LpPosition, LpProtocol, LpToken } from '../lp.js'
52
+ export type { SignerInput, WriteResult, WriteStatus } from '../subpaths/write.js'
@@ -35,7 +35,26 @@ export {
35
35
  type V4ScanOptions,
36
36
  type V4ScanProgress,
37
37
  } from '../lpV4.js'
38
- export { MAX_TICK, MIN_TICK, getAmountsForLiquidity, getFeeGrowthInside, getFeesEarned, getSqrtRatioAtTick, sqrtPriceToPrice, tickToPrice } from '../lpMath.js'
38
+ export {
39
+ MAX_SQRT_RATIO,
40
+ MAX_TICK,
41
+ MIN_SQRT_RATIO,
42
+ MIN_TICK,
43
+ getAmountsForLiquidity,
44
+ getFeeGrowthInside,
45
+ getFeesEarned,
46
+ getLiquidityForAmounts,
47
+ getMaxAmounts,
48
+ getMinAmounts,
49
+ getMintAmounts,
50
+ getSqrtRatioAtTick,
51
+ getTickAtSqrtRatio,
52
+ nearestUsableTick,
53
+ priceToSqrtPriceX96,
54
+ priceToTick,
55
+ sqrtPriceToPrice,
56
+ tickToPrice,
57
+ } from '../lpMath.js'
39
58
  export { defillamaPrices, type PriceSource } from '../owner.js'
40
59
 
41
60
  export interface GetLpPositionsOptions extends LpPositionsOptions, ShortcutProviderOptions {}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 域名解析(子路径 `@w3lib/evm-batch-call/names`):ENS、SPACE ID(.bnb)、Basenames(.base.eth),名字 → 地址、地址 → 名字。
3
+ * 不放在主入口,不用时打包不会带上这部分代码。
4
+ *
5
+ * ```ts
6
+ * import { getAddressNames, getNameAddresses } from '@w3lib/evm-batch-call/names'
7
+ *
8
+ * await getNameAddresses(['vitalik.eth'], { chainId: 1 })
9
+ * await getAddressNames([user], { chainId: 56 })
10
+ * ```
11
+ */
12
+ import { lookupAddresses, resolveNames, type AddressName, type NamesOptions, type ResolvedName } from '../names.js'
13
+ import { resolve, type ShortcutProviderOptions } from '../shortcuts.js'
14
+
15
+ export { NAME_SERVICES, lookupAddresses, resolveNames, type AddressName, type NameService, type NamesOptions, type ResolvedName } from '../names.js'
16
+
17
+ export interface GetNamesOptions extends NamesOptions, ShortcutProviderOptions {}
18
+
19
+ /**
20
+ * 名字 → 地址,节点参数与 getBalances 相同(用这条链的域名服务:Ethereum 是 ENS,BSC 是 SPACE ID,Base 是 Basenames)。
21
+ *
22
+ * ```ts
23
+ * await getNameAddresses(['vitalik.eth', 'nick.eth'], { chainId: 1 })
24
+ * // [{ name: 'vitalik.eth', normalized: 'vitalik.eth', address: '0xd8dA…6045', service: 'ens' }, …]
25
+ * ```
26
+ */
27
+ export function getNameAddresses(names: readonly string[], options: GetNamesOptions = {}): Promise<ResolvedName[]> {
28
+ const { provider, own } = resolve(options, ['services'])
29
+ return resolveNames(provider, names, own)
30
+ }
31
+
32
+ /**
33
+ * 地址 → 名字(反查的主名字,正查核对过)。
34
+ *
35
+ * ```ts
36
+ * await getAddressNames(['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'], { chainId: 1 })
37
+ * // [{ address: '0xd8dA…', name: 'vitalik.eth', service: 'ens' }]
38
+ * ```
39
+ */
40
+ export function getAddressNames(addresses: readonly string[], options: GetNamesOptions = {}): Promise<AddressName[]> {
41
+ const { provider, own } = resolve(options, ['services'])
42
+ return lookupAddresses(provider, addresses, own)
43
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 价格(子路径 `@w3lib/evm-batch-call/price`):代币的美元价格(DefiLlama 当前 / 历史价格,没有收录的从链上 V2 / V3 池子算)、
3
+ * 组合价格源、地址的资产总值。不放在主入口,不用时打包不会带上这部分代码。
4
+ *
5
+ * ```ts
6
+ * import { getTokenPrices, getPortfolio } from '@w3lib/evm-batch-call/price'
7
+ *
8
+ * await getTokenPrices([NATIVE_TOKEN, USDT, newToken], { chainId: 56 })
9
+ * await getPortfolio(user, { chainId: 56, tokens: [NATIVE_TOKEN, USDT], lp: true })
10
+ * ```
11
+ */
12
+ import { portfolio, type Portfolio, type PortfolioOptions } from '../portfolio.js'
13
+ import { tokenPrices, type TokenPrice, type TokenPricesOptions } from '../price.js'
14
+ import { resolve, type ShortcutProviderOptions } from '../shortcuts.js'
15
+
16
+ export { portfolio, type Portfolio, type PortfolioOptions, type PortfolioToken } from '../portfolio.js'
17
+ export {
18
+ DEFILLAMA_CHAINS,
19
+ STABLECOINS,
20
+ combinePrices,
21
+ defillamaPrices,
22
+ onchainPrices,
23
+ priceKeyOf,
24
+ tokenPrices,
25
+ type DefillamaPriceOptions,
26
+ type OnchainPriceOptions,
27
+ type PriceSource,
28
+ type PriceSourceContext,
29
+ type TokenPrice,
30
+ type TokenPricesOptions,
31
+ } from '../price.js'
32
+
33
+ export interface GetTokenPricesOptions extends TokenPricesOptions, ShortcutProviderOptions {}
34
+
35
+ /**
36
+ * 查代币的美元价格(主币用 NATIVE_TOKEN),节点参数与 getBalances 相同。
37
+ *
38
+ * ```ts
39
+ * await getTokenPrices([NATIVE_TOKEN, USDT], { chainId: 56 })
40
+ * // [{ token: '0xEeee…', native: true, price: 612.3, source: 'defillama' }, { token: USDT, …, price: 1, source: 'defillama' }]
41
+ * ```
42
+ */
43
+ export function getTokenPrices(tokens: readonly string[], options: GetTokenPricesOptions = {}): Promise<TokenPrice[]> {
44
+ const { provider, own } = resolve(options, ['sources', 'onError', 'fetch'])
45
+ return tokenPrices(provider, tokens, own)
46
+ }
47
+
48
+ export interface GetPortfolioOptions extends PortfolioOptions, ShortcutProviderOptions {}
49
+
50
+ /**
51
+ * 地址的资产总值:传入代币的余额 × 价格,可选加上 LP 仓位(lp: true)。
52
+ *
53
+ * ```ts
54
+ * const p = await getPortfolio(user, { chainId: 56, tokens: [NATIVE_TOKEN, USDT, CAKE], lp: true })
55
+ * ```
56
+ */
57
+ export function getPortfolio(owner: string, options: GetPortfolioOptions): Promise<Portfolio> {
58
+ const { provider, own } = resolve(options, ['tokens', 'sources', 'lp', 'minUsd', 'onPriceError', 'fetch'])
59
+ return portfolio(provider, owner, own as PortfolioOptions)
60
+ }
@@ -0,0 +1,23 @@
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, type TokenRisk, type TokenRiskOptions } from '../risk.js'
13
+ import { resolve, type ShortcutProviderOptions } from '../shortcuts.js'
14
+
15
+ export { tokenRisks, type ProbeStage, type TokenRisk, type TokenRiskOptions } from '../risk.js'
16
+
17
+ export interface GetTokenRisksOptions extends TokenRiskOptions, ShortcutProviderOptions {}
18
+
19
+ /** 检查代币的风险,节点参数与 getBalances 相同 */
20
+ export function getTokenRisks(tokens: readonly string[], options: GetTokenRisksOptions = {}): Promise<TokenRisk[]> {
21
+ const { provider, own } = resolve(options, ['amount', 'protocols'])
22
+ return tokenRisks(provider, tokens, own)
23
+ }
@@ -0,0 +1,36 @@
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, type SwapOptions, type SwapParams, type SwapPlan } from '../swap.js'
13
+ import { resolve, type ShortcutProviderOptions } from '../shortcuts.js'
14
+
15
+ export {
16
+ V3_SWAP_CONTRACTS,
17
+ buildSwap,
18
+ swap,
19
+ swapProtocols,
20
+ type SwapOptions,
21
+ type SwapParams,
22
+ type SwapPlan,
23
+ type SwapResult,
24
+ type SwapRoute,
25
+ type SwapSendOptions,
26
+ type SwapTx,
27
+ type SwapTxResult,
28
+ } from '../swap.js'
29
+
30
+ export interface GetSwapQuoteOptions extends SwapOptions, ShortcutProviderOptions {}
31
+
32
+ /** 报价并构建兑换的交易(同 buildSwap),节点参数与 getBalances 相同 */
33
+ export function getSwapQuote(owner: string, params: SwapParams, options: GetSwapQuoteOptions = {}): Promise<SwapPlan> {
34
+ const { provider, overrides, own } = resolve(options, ['slippage', 'deadline', 'recipient', 'approve', 'protocols', 'intermediates', 'route'])
35
+ return buildSwap(provider, owner, params, { ...own, ...(overrides.blockTag === undefined ? {} : { blockTag: overrides.blockTag }) })
36
+ }