@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.
Files changed (110) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +161 -2
  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/lp.d.ts +2 -1
  23. package/dist/lp.d.ts.map +1 -1
  24. package/dist/lp.js +2 -1
  25. package/dist/lp.js.map +1 -1
  26. package/dist/multicall.d.ts.map +1 -1
  27. package/dist/multicall.js +3 -0
  28. package/dist/multicall.js.map +1 -1
  29. package/dist/names.d.ts +55 -0
  30. package/dist/names.d.ts.map +1 -0
  31. package/dist/names.js +93 -0
  32. package/dist/names.js.map +1 -0
  33. package/dist/owner.d.ts +4 -26
  34. package/dist/owner.d.ts.map +1 -1
  35. package/dist/owner.js +7 -112
  36. package/dist/owner.js.map +1 -1
  37. package/dist/portfolio.d.ts +54 -0
  38. package/dist/portfolio.d.ts.map +1 -0
  39. package/dist/portfolio.js +49 -0
  40. package/dist/portfolio.js.map +1 -0
  41. package/dist/price.d.ts +95 -0
  42. package/dist/price.d.ts.map +1 -0
  43. package/dist/price.js +329 -0
  44. package/dist/price.js.map +1 -0
  45. package/dist/risk.d.ts +42 -0
  46. package/dist/risk.d.ts.map +1 -0
  47. package/dist/risk.js +134 -0
  48. package/dist/risk.js.map +1 -0
  49. package/dist/rpcNodes.d.ts.map +1 -1
  50. package/dist/rpcNodes.js +18 -0
  51. package/dist/rpcNodes.js.map +1 -1
  52. package/dist/subpaths/approvals.d.ts +26 -0
  53. package/dist/subpaths/approvals.d.ts.map +1 -0
  54. package/dist/subpaths/approvals.js +27 -0
  55. package/dist/subpaths/approvals.js.map +1 -0
  56. package/dist/subpaths/fees.d.ts +23 -0
  57. package/dist/subpaths/fees.d.ts.map +1 -0
  58. package/dist/subpaths/fees.js +25 -0
  59. package/dist/subpaths/fees.js.map +1 -0
  60. package/dist/subpaths/names.d.ts +35 -0
  61. package/dist/subpaths/names.d.ts.map +1 -0
  62. package/dist/subpaths/names.js +39 -0
  63. package/dist/subpaths/names.js.map +1 -0
  64. package/dist/subpaths/price.d.ts +38 -0
  65. package/dist/subpaths/price.d.ts.map +1 -0
  66. package/dist/subpaths/price.js +40 -0
  67. package/dist/subpaths/price.js.map +1 -0
  68. package/dist/subpaths/risk.d.ts +19 -0
  69. package/dist/subpaths/risk.d.ts.map +1 -0
  70. package/dist/subpaths/risk.js +20 -0
  71. package/dist/subpaths/risk.js.map +1 -0
  72. package/dist/subpaths/swap.d.ts +19 -0
  73. package/dist/subpaths/swap.d.ts.map +1 -0
  74. package/dist/subpaths/swap.js +20 -0
  75. package/dist/subpaths/swap.js.map +1 -0
  76. package/dist/swap.d.ts +128 -0
  77. package/dist/swap.d.ts.map +1 -0
  78. package/dist/swap.js +291 -0
  79. package/dist/swap.js.map +1 -0
  80. package/dist/tokenProbe.d.ts +3 -0
  81. package/dist/tokenProbe.d.ts.map +1 -0
  82. package/dist/tokenProbe.js +4 -0
  83. package/dist/tokenProbe.js.map +1 -0
  84. package/dist/write/tron.d.ts +25 -0
  85. package/dist/write/tron.d.ts.map +1 -1
  86. package/dist/write/tron.js +26 -0
  87. package/dist/write/tron.js.map +1 -1
  88. package/package.json +39 -16
  89. package/src/aggregate.ts +110 -3
  90. package/src/approvals.ts +462 -0
  91. package/src/chains.ts +4 -0
  92. package/src/fees.ts +201 -0
  93. package/src/http.ts +34 -0
  94. package/src/lp.ts +3 -1
  95. package/src/multicall.ts +3 -0
  96. package/src/names.ts +141 -0
  97. package/src/owner.ts +7 -138
  98. package/src/portfolio.ts +91 -0
  99. package/src/price.ts +415 -0
  100. package/src/risk.ts +166 -0
  101. package/src/rpcNodes.ts +18 -0
  102. package/src/subpaths/approvals.ts +48 -0
  103. package/src/subpaths/fees.ts +43 -0
  104. package/src/subpaths/names.ts +43 -0
  105. package/src/subpaths/price.ts +60 -0
  106. package/src/subpaths/risk.ts +23 -0
  107. package/src/subpaths/swap.ts +36 -0
  108. package/src/swap.ts +413 -0
  109. package/src/tokenProbe.ts +5 -0
  110. package/src/write/tron.ts +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,mBAAoB,SAAQ,cAAc,EAAE,uBAAuB;CAAG;AAEvF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG7F"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 授权管理(子路径 `@w3lib/evm-batch-call/approvals`):批量查地址给出的授权(ERC20、Permit2、NFT 的 setApprovalForAll),
3
+ * 按 Approval 事件发现授权过的代币,批量撤销。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
4
+ *
5
+ * ```ts
6
+ * import { getApprovals, revokeApprovals } from '@w3lib/evm-batch-call/approvals'
7
+ *
8
+ * const list = await getApprovals(user, { chainId: 56, tokens: [USDT, CAKE] })
9
+ * await revokeApprovals(provider, key, list.filter((a) => a.type !== 'nft' && a.unlimited))
10
+ * ```
11
+ */
12
+ import { approvals } from '../approvals.js';
13
+ import { resolve } from '../shortcuts.js';
14
+ export { PERMIT2_ADDRESS, approvals, buildRevokes, knownSpenders, revokeApprovals, scanApprovals, } from '../approvals.js';
15
+ /**
16
+ * 查地址给出的授权,节点参数与 getBalances 相同。默认检查已知的 Router / 聚合器 / NFT 市场。
17
+ *
18
+ * ```ts
19
+ * await getApprovals(user, { chainId: 56, tokens: [USDT, CAKE] })
20
+ * // [{ type: 'erc20', token: USDT, symbol: 'USDT', spender: '0x1111…', spenderName: '1inch Router v6', amount: '…', unlimited: true }, …]
21
+ * ```
22
+ */
23
+ export function getApprovals(owner, options) {
24
+ const { provider, own } = resolve(options, ['tokens', 'spenders', 'pairs', 'permit2', 'nfts', 'operators', 'nftPairs', 'includeZero']);
25
+ return approvals(provider, owner, own);
26
+ }
27
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAsC,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,GAYd,MAAM,iBAAiB,CAAA;AAIxB;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAA4B;IACtE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;IACtI,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,23 @@
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 { type CostCall, type CostEstimate, type EstimateCostOptions, type EstimateFeesOptions, type FeeEstimate } from '../fees.js';
13
+ import { type ShortcutProviderOptions } from '../shortcuts.js';
14
+ export { estimateCost, estimateFees, type CostCall, type CostEstimate, type EstimateCostOptions, type EstimateFeesOptions, type EvmCostEstimate, type FeeEstimate, type FeeLevel, type FeeLevelEstimate, type TronCost, } from '../fees.js';
15
+ export interface GetFeeEstimateOptions extends EstimateFeesOptions, ShortcutProviderOptions {
16
+ }
17
+ /** 当前的三档手续费建议(EVM 链),节点参数与 getBalances 相同 */
18
+ export declare function getFeeEstimate(options?: GetFeeEstimateOptions): Promise<FeeEstimate>;
19
+ export interface GetCostEstimateOptions extends EstimateCostOptions, ShortcutProviderOptions {
20
+ }
21
+ /** 一笔交易的手续费(EVM:gas × 价格 + L1 数据费;Tron:要烧的 TRX) */
22
+ export declare function getCostEstimate(call: CostCall, options?: GetCostEstimateOptions): Promise<CostEstimate>;
23
+ //# sourceMappingURL=fees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.d.ts","sourceRoot":"","sources":["../../src/subpaths/fees.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAA8B,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAC/J,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,QAAQ,GACd,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB,EAAE,uBAAuB;CAAG;AAE9F,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,WAAW,CAAC,CAGxF;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB,EAAE,uBAAuB;CAAG;AAE/F,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,YAAY,CAAC,CAG3G"}
@@ -0,0 +1,25 @@
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 } from '../fees.js';
13
+ import { resolve } from '../shortcuts.js';
14
+ export { estimateCost, estimateFees, } from '../fees.js';
15
+ /** 当前的三档手续费建议(EVM 链),节点参数与 getBalances 相同 */
16
+ export function getFeeEstimate(options = {}) {
17
+ const { provider, own } = resolve(options, ['blocks', 'percentiles', 'baseFeeMultiplier']);
18
+ return estimateFees(provider, own);
19
+ }
20
+ /** 一笔交易的手续费(EVM:gas × 价格 + L1 数据费;Tron:要烧的 TRX) */
21
+ export function getCostEstimate(call, options = {}) {
22
+ const { provider, own } = resolve(options, ['blocks', 'percentiles', 'baseFeeMultiplier', 'level', 'fees']);
23
+ return estimateCost(provider, call, own);
24
+ }
25
+ //# sourceMappingURL=fees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.js","sourceRoot":"","sources":["../../src/subpaths/fees.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,YAAY,EAA0G,MAAM,YAAY,CAAA;AAC/J,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,YAAY,EACZ,YAAY,GAUb,MAAM,YAAY,CAAA;AAInB,6CAA6C;AAC7C,MAAM,UAAU,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC1F,OAAO,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACpC,CAAC;AAID,mDAAmD;AACnD,MAAM,UAAU,eAAe,CAAC,IAAc,EAAE,UAAkC,EAAE;IAClF,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IAC3G,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,35 @@
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 { type AddressName, type NamesOptions, type ResolvedName } from '../names.js';
13
+ import { type ShortcutProviderOptions } from '../shortcuts.js';
14
+ export { NAME_SERVICES, lookupAddresses, resolveNames, type AddressName, type NameService, type NamesOptions, type ResolvedName } from '../names.js';
15
+ export interface GetNamesOptions extends NamesOptions, ShortcutProviderOptions {
16
+ }
17
+ /**
18
+ * 名字 → 地址,节点参数与 getBalances 相同(用这条链的域名服务:Ethereum 是 ENS,BSC 是 SPACE ID,Base 是 Basenames)。
19
+ *
20
+ * ```ts
21
+ * await getNameAddresses(['vitalik.eth', 'nick.eth'], { chainId: 1 })
22
+ * // [{ name: 'vitalik.eth', normalized: 'vitalik.eth', address: '0xd8dA…6045', service: 'ens' }, …]
23
+ * ```
24
+ */
25
+ export declare function getNameAddresses(names: readonly string[], options?: GetNamesOptions): Promise<ResolvedName[]>;
26
+ /**
27
+ * 地址 → 名字(反查的主名字,正查核对过)。
28
+ *
29
+ * ```ts
30
+ * await getAddressNames(['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'], { chainId: 1 })
31
+ * // [{ address: '0xd8dA…', name: 'vitalik.eth', service: 'ens' }]
32
+ * ```
33
+ */
34
+ export declare function getAddressNames(addresses: readonly string[], options?: GetNamesOptions): Promise<AddressName[]>;
35
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/subpaths/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAiC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACnH,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAEpJ,MAAM,WAAW,eAAgB,SAAQ,YAAY,EAAE,uBAAuB;CAAG;AAEjF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGjH;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGnH"}
@@ -0,0 +1,39 @@
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 } from '../names.js';
13
+ import { resolve } from '../shortcuts.js';
14
+ export { NAME_SERVICES, lookupAddresses, resolveNames } from '../names.js';
15
+ /**
16
+ * 名字 → 地址,节点参数与 getBalances 相同(用这条链的域名服务:Ethereum 是 ENS,BSC 是 SPACE ID,Base 是 Basenames)。
17
+ *
18
+ * ```ts
19
+ * await getNameAddresses(['vitalik.eth', 'nick.eth'], { chainId: 1 })
20
+ * // [{ name: 'vitalik.eth', normalized: 'vitalik.eth', address: '0xd8dA…6045', service: 'ens' }, …]
21
+ * ```
22
+ */
23
+ export function getNameAddresses(names, options = {}) {
24
+ const { provider, own } = resolve(options, ['services']);
25
+ return resolveNames(provider, names, own);
26
+ }
27
+ /**
28
+ * 地址 → 名字(反查的主名字,正查核对过)。
29
+ *
30
+ * ```ts
31
+ * await getAddressNames(['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'], { chainId: 1 })
32
+ * // [{ address: '0xd8dA…', name: 'vitalik.eth', service: 'ens' }]
33
+ * ```
34
+ */
35
+ export function getAddressNames(addresses, options = {}) {
36
+ const { provider, own } = resolve(options, ['services']);
37
+ return lookupAddresses(provider, addresses, own);
38
+ }
39
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/subpaths/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,eAAe,EAAE,YAAY,EAA0D,MAAM,aAAa,CAAA;AACnH,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAA4E,MAAM,aAAa,CAAA;AAIpJ;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwB,EAAE,UAA2B,EAAE;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACxD,OAAO,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,SAA4B,EAAE,UAA2B,EAAE;IACzF,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IACxD,OAAO,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;AAClD,CAAC"}
@@ -0,0 +1,38 @@
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 { type Portfolio, type PortfolioOptions } from '../portfolio.js';
13
+ import { type TokenPrice, type TokenPricesOptions } from '../price.js';
14
+ import { type ShortcutProviderOptions } from '../shortcuts.js';
15
+ export { portfolio, type Portfolio, type PortfolioOptions, type PortfolioToken } from '../portfolio.js';
16
+ export { DEFILLAMA_CHAINS, STABLECOINS, combinePrices, defillamaPrices, onchainPrices, priceKeyOf, tokenPrices, type DefillamaPriceOptions, type OnchainPriceOptions, type PriceSource, type PriceSourceContext, type TokenPrice, type TokenPricesOptions, } from '../price.js';
17
+ export interface GetTokenPricesOptions extends TokenPricesOptions, ShortcutProviderOptions {
18
+ }
19
+ /**
20
+ * 查代币的美元价格(主币用 NATIVE_TOKEN),节点参数与 getBalances 相同。
21
+ *
22
+ * ```ts
23
+ * await getTokenPrices([NATIVE_TOKEN, USDT], { chainId: 56 })
24
+ * // [{ token: '0xEeee…', native: true, price: 612.3, source: 'defillama' }, { token: USDT, …, price: 1, source: 'defillama' }]
25
+ * ```
26
+ */
27
+ export declare function getTokenPrices(tokens: readonly string[], options?: GetTokenPricesOptions): Promise<TokenPrice[]>;
28
+ export interface GetPortfolioOptions extends PortfolioOptions, ShortcutProviderOptions {
29
+ }
30
+ /**
31
+ * 地址的资产总值:传入代币的余额 × 价格,可选加上 LP 仓位(lp: true)。
32
+ *
33
+ * ```ts
34
+ * const p = await getPortfolio(user, { chainId: 56, tokens: [NATIVE_TOKEN, USDT, CAKE], lp: true })
35
+ * ```
36
+ */
37
+ export declare function getPortfolio(owner: string, options: GetPortfolioOptions): Promise<Portfolio>;
38
+ //# sourceMappingURL=price.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price.d.ts","sourceRoot":"","sources":["../../src/subpaths/price.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACvG,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB,EAAE,uBAAuB;CAAG;AAE7F;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGpH;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB,EAAE,uBAAuB;CAAG;AAEzF;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAG5F"}
@@ -0,0 +1,40 @@
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 } from '../portfolio.js';
13
+ import { tokenPrices } from '../price.js';
14
+ import { resolve } from '../shortcuts.js';
15
+ export { portfolio } from '../portfolio.js';
16
+ export { DEFILLAMA_CHAINS, STABLECOINS, combinePrices, defillamaPrices, onchainPrices, priceKeyOf, tokenPrices, } from '../price.js';
17
+ /**
18
+ * 查代币的美元价格(主币用 NATIVE_TOKEN),节点参数与 getBalances 相同。
19
+ *
20
+ * ```ts
21
+ * await getTokenPrices([NATIVE_TOKEN, USDT], { chainId: 56 })
22
+ * // [{ token: '0xEeee…', native: true, price: 612.3, source: 'defillama' }, { token: USDT, …, price: 1, source: 'defillama' }]
23
+ * ```
24
+ */
25
+ export function getTokenPrices(tokens, options = {}) {
26
+ const { provider, own } = resolve(options, ['sources', 'onError', 'fetch']);
27
+ return tokenPrices(provider, tokens, own);
28
+ }
29
+ /**
30
+ * 地址的资产总值:传入代币的余额 × 价格,可选加上 LP 仓位(lp: true)。
31
+ *
32
+ * ```ts
33
+ * const p = await getPortfolio(user, { chainId: 56, tokens: [NATIVE_TOKEN, USDT, CAKE], lp: true })
34
+ * ```
35
+ */
36
+ export function getPortfolio(owner, options) {
37
+ const { provider, own } = resolve(options, ['tokens', 'sources', 'lp', 'minUsd', 'onPriceError', 'fetch']);
38
+ return portfolio(provider, owner, own);
39
+ }
40
+ //# sourceMappingURL=price.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price.js","sourceRoot":"","sources":["../../src/subpaths/price.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAyC,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,WAAW,EAA4C,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,SAAS,EAA8D,MAAM,iBAAiB,CAAA;AACvG,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,GAOZ,MAAM,aAAa,CAAA;AAIpB;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB,EAAE,UAAiC,EAAE;IAC3F,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3E,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;AAC3C,CAAC;AAID;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAA4B;IACtE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAA;IAC1G,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAuB,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,19 @@
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 { type TokenRisk, type TokenRiskOptions } from '../risk.js';
13
+ import { type ShortcutProviderOptions } from '../shortcuts.js';
14
+ export { tokenRisks, type ProbeStage, type TokenRisk, type TokenRiskOptions } from '../risk.js';
15
+ export interface GetTokenRisksOptions extends TokenRiskOptions, ShortcutProviderOptions {
16
+ }
17
+ /** 检查代币的风险,节点参数与 getBalances 相同 */
18
+ export declare function getTokenRisks(tokens: readonly string[], options?: GetTokenRisksOptions): Promise<TokenRisk[]>;
19
+ //# sourceMappingURL=risk.d.ts.map
@@ -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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"}