@w3lib/evm-batch-call 0.6.0 → 0.8.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 (248) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +367 -3
  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/dividends.d.ts +135 -0
  15. package/dist/dividends.d.ts.map +1 -0
  16. package/dist/dividends.js +253 -0
  17. package/dist/dividends.js.map +1 -0
  18. package/dist/fees.d.ts +97 -0
  19. package/dist/fees.d.ts.map +1 -0
  20. package/dist/fees.js +115 -0
  21. package/dist/fees.js.map +1 -0
  22. package/dist/history.d.ts +154 -0
  23. package/dist/history.d.ts.map +1 -0
  24. package/dist/history.js +247 -0
  25. package/dist/history.js.map +1 -0
  26. package/dist/historySources.d.ts +32 -0
  27. package/dist/historySources.d.ts.map +1 -0
  28. package/dist/historySources.js +319 -0
  29. package/dist/historySources.js.map +1 -0
  30. package/dist/http.d.ts +10 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +30 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/liquidity/v3.d.ts +2 -0
  35. package/dist/liquidity/v3.d.ts.map +1 -1
  36. package/dist/liquidity/v3.js +1 -1
  37. package/dist/liquidity/v3.js.map +1 -1
  38. package/dist/liquidity/v4.d.ts +21 -0
  39. package/dist/liquidity/v4.d.ts.map +1 -1
  40. package/dist/liquidity/v4.js +4 -3
  41. package/dist/liquidity/v4.js.map +1 -1
  42. package/dist/lp.d.ts +10 -1
  43. package/dist/lp.d.ts.map +1 -1
  44. package/dist/lp.js +19 -2
  45. package/dist/lp.js.map +1 -1
  46. package/dist/lpV4.d.ts +4 -0
  47. package/dist/lpV4.d.ts.map +1 -1
  48. package/dist/lpV4.js +27 -3
  49. package/dist/lpV4.js.map +1 -1
  50. package/dist/multicall.d.ts.map +1 -1
  51. package/dist/multicall.js +3 -0
  52. package/dist/multicall.js.map +1 -1
  53. package/dist/names.d.ts +55 -0
  54. package/dist/names.d.ts.map +1 -0
  55. package/dist/names.js +93 -0
  56. package/dist/names.js.map +1 -0
  57. package/dist/owner.d.ts +4 -26
  58. package/dist/owner.d.ts.map +1 -1
  59. package/dist/owner.js +7 -112
  60. package/dist/owner.js.map +1 -1
  61. package/dist/permit.d.ts +137 -0
  62. package/dist/permit.d.ts.map +1 -0
  63. package/dist/permit.js +355 -0
  64. package/dist/permit.js.map +1 -0
  65. package/dist/portfolio.d.ts +56 -0
  66. package/dist/portfolio.d.ts.map +1 -0
  67. package/dist/portfolio.js +54 -0
  68. package/dist/portfolio.js.map +1 -0
  69. package/dist/price.d.ts +95 -0
  70. package/dist/price.d.ts.map +1 -0
  71. package/dist/price.js +329 -0
  72. package/dist/price.js.map +1 -0
  73. package/dist/rewards/farms.d.ts +26 -0
  74. package/dist/rewards/farms.d.ts.map +1 -0
  75. package/dist/rewards/farms.js +210 -0
  76. package/dist/rewards/farms.js.map +1 -0
  77. package/dist/rewards/index.d.ts +42 -0
  78. package/dist/rewards/index.d.ts.map +1 -0
  79. package/dist/rewards/index.js +382 -0
  80. package/dist/rewards/index.js.map +1 -0
  81. package/dist/rewards/types.d.ts +170 -0
  82. package/dist/rewards/types.d.ts.map +1 -0
  83. package/dist/rewards/types.js +2 -0
  84. package/dist/rewards/types.js.map +1 -0
  85. package/dist/risk.d.ts +42 -0
  86. package/dist/risk.d.ts.map +1 -0
  87. package/dist/risk.js +134 -0
  88. package/dist/risk.js.map +1 -0
  89. package/dist/rpcNodes.d.ts.map +1 -1
  90. package/dist/rpcNodes.js +18 -0
  91. package/dist/rpcNodes.js.map +1 -1
  92. package/dist/simulate.d.ts +186 -0
  93. package/dist/simulate.d.ts.map +1 -0
  94. package/dist/simulate.js +559 -0
  95. package/dist/simulate.js.map +1 -0
  96. package/dist/simulateDecode.d.ts +33 -0
  97. package/dist/simulateDecode.d.ts.map +1 -0
  98. package/dist/simulateDecode.js +321 -0
  99. package/dist/simulateDecode.js.map +1 -0
  100. package/dist/smartAccount/account.d.ts +31 -0
  101. package/dist/smartAccount/account.d.ts.map +1 -0
  102. package/dist/smartAccount/account.js +33 -0
  103. package/dist/smartAccount/account.js.map +1 -0
  104. package/dist/smartAccount/clients.d.ts +77 -0
  105. package/dist/smartAccount/clients.d.ts.map +1 -0
  106. package/dist/smartAccount/clients.js +122 -0
  107. package/dist/smartAccount/clients.js.map +1 -0
  108. package/dist/smartAccount/eip5792.d.ts +77 -0
  109. package/dist/smartAccount/eip5792.d.ts.map +1 -0
  110. package/dist/smartAccount/eip5792.js +152 -0
  111. package/dist/smartAccount/eip5792.js.map +1 -0
  112. package/dist/smartAccount/send.d.ts +40 -0
  113. package/dist/smartAccount/send.d.ts.map +1 -0
  114. package/dist/smartAccount/send.js +271 -0
  115. package/dist/smartAccount/send.js.map +1 -0
  116. package/dist/smartAccount/userOp.d.ts +91 -0
  117. package/dist/smartAccount/userOp.d.ts.map +1 -0
  118. package/dist/smartAccount/userOp.js +124 -0
  119. package/dist/smartAccount/userOp.js.map +1 -0
  120. package/dist/subpaths/approvals.d.ts +26 -0
  121. package/dist/subpaths/approvals.d.ts.map +1 -0
  122. package/dist/subpaths/approvals.js +27 -0
  123. package/dist/subpaths/approvals.js.map +1 -0
  124. package/dist/subpaths/dividends.d.ts +28 -0
  125. package/dist/subpaths/dividends.d.ts.map +1 -0
  126. package/dist/subpaths/dividends.js +29 -0
  127. package/dist/subpaths/dividends.js.map +1 -0
  128. package/dist/subpaths/fees.d.ts +23 -0
  129. package/dist/subpaths/fees.d.ts.map +1 -0
  130. package/dist/subpaths/fees.js +25 -0
  131. package/dist/subpaths/fees.js.map +1 -0
  132. package/dist/subpaths/history.d.ts +22 -0
  133. package/dist/subpaths/history.d.ts.map +1 -0
  134. package/dist/subpaths/history.js +23 -0
  135. package/dist/subpaths/history.js.map +1 -0
  136. package/dist/subpaths/names.d.ts +35 -0
  137. package/dist/subpaths/names.d.ts.map +1 -0
  138. package/dist/subpaths/names.js +39 -0
  139. package/dist/subpaths/names.js.map +1 -0
  140. package/dist/subpaths/permit.d.ts +14 -0
  141. package/dist/subpaths/permit.d.ts.map +1 -0
  142. package/dist/subpaths/permit.js +14 -0
  143. package/dist/subpaths/permit.js.map +1 -0
  144. package/dist/subpaths/price.d.ts +38 -0
  145. package/dist/subpaths/price.d.ts.map +1 -0
  146. package/dist/subpaths/price.js +40 -0
  147. package/dist/subpaths/price.js.map +1 -0
  148. package/dist/subpaths/rewards.d.ts +27 -0
  149. package/dist/subpaths/rewards.d.ts.map +1 -0
  150. package/dist/subpaths/rewards.js +25 -0
  151. package/dist/subpaths/rewards.js.map +1 -0
  152. package/dist/subpaths/risk.d.ts +19 -0
  153. package/dist/subpaths/risk.d.ts.map +1 -0
  154. package/dist/subpaths/risk.js +20 -0
  155. package/dist/subpaths/risk.js.map +1 -0
  156. package/dist/subpaths/simulate.d.ts +25 -0
  157. package/dist/subpaths/simulate.d.ts.map +1 -0
  158. package/dist/subpaths/simulate.js +28 -0
  159. package/dist/subpaths/simulate.js.map +1 -0
  160. package/dist/subpaths/smart-account.d.ts +24 -0
  161. package/dist/subpaths/smart-account.d.ts.map +1 -0
  162. package/dist/subpaths/smart-account.js +24 -0
  163. package/dist/subpaths/smart-account.js.map +1 -0
  164. package/dist/subpaths/swap.d.ts +19 -0
  165. package/dist/subpaths/swap.d.ts.map +1 -0
  166. package/dist/subpaths/swap.js +20 -0
  167. package/dist/subpaths/swap.js.map +1 -0
  168. package/dist/swap.d.ts +168 -0
  169. package/dist/swap.d.ts.map +1 -0
  170. package/dist/swap.js +387 -0
  171. package/dist/swap.js.map +1 -0
  172. package/dist/tokenProbe.d.ts +3 -0
  173. package/dist/tokenProbe.d.ts.map +1 -0
  174. package/dist/tokenProbe.js +4 -0
  175. package/dist/tokenProbe.js.map +1 -0
  176. package/dist/write/batch.d.ts +34 -2
  177. package/dist/write/batch.d.ts.map +1 -1
  178. package/dist/write/batch.js +22 -3
  179. package/dist/write/batch.js.map +1 -1
  180. package/dist/write/collect.d.ts +9 -0
  181. package/dist/write/collect.d.ts.map +1 -1
  182. package/dist/write/collect.js +41 -1
  183. package/dist/write/collect.js.map +1 -1
  184. package/dist/write/send.d.ts +4 -0
  185. package/dist/write/send.d.ts.map +1 -1
  186. package/dist/write/send.js.map +1 -1
  187. package/dist/write/signer.d.ts +5 -1
  188. package/dist/write/signer.d.ts.map +1 -1
  189. package/dist/write/signer.js.map +1 -1
  190. package/dist/write/transfer.d.ts +5 -3
  191. package/dist/write/transfer.d.ts.map +1 -1
  192. package/dist/write/transfer.js +12 -6
  193. package/dist/write/transfer.js.map +1 -1
  194. package/dist/write/tron.d.ts +25 -0
  195. package/dist/write/tron.d.ts.map +1 -1
  196. package/dist/write/tron.js +26 -0
  197. package/dist/write/tron.js.map +1 -1
  198. package/package.json +73 -16
  199. package/src/aggregate.ts +110 -3
  200. package/src/approvals.ts +462 -0
  201. package/src/chains.ts +4 -0
  202. package/src/dividends.ts +360 -0
  203. package/src/fees.ts +201 -0
  204. package/src/history.ts +367 -0
  205. package/src/historySources.ts +360 -0
  206. package/src/http.ts +34 -0
  207. package/src/liquidity/v3.ts +1 -1
  208. package/src/liquidity/v4.ts +4 -3
  209. package/src/lp.ts +21 -2
  210. package/src/lpV4.ts +32 -2
  211. package/src/multicall.ts +3 -0
  212. package/src/names.ts +141 -0
  213. package/src/owner.ts +7 -138
  214. package/src/permit.ts +457 -0
  215. package/src/portfolio.ts +98 -0
  216. package/src/price.ts +415 -0
  217. package/src/rewards/farms.ts +229 -0
  218. package/src/rewards/index.ts +431 -0
  219. package/src/rewards/types.ts +179 -0
  220. package/src/risk.ts +166 -0
  221. package/src/rpcNodes.ts +18 -0
  222. package/src/simulate.ts +727 -0
  223. package/src/simulateDecode.ts +352 -0
  224. package/src/smartAccount/account.ts +63 -0
  225. package/src/smartAccount/clients.ts +180 -0
  226. package/src/smartAccount/eip5792.ts +187 -0
  227. package/src/smartAccount/send.ts +341 -0
  228. package/src/smartAccount/userOp.ts +180 -0
  229. package/src/subpaths/approvals.ts +48 -0
  230. package/src/subpaths/dividends.ts +47 -0
  231. package/src/subpaths/fees.ts +43 -0
  232. package/src/subpaths/history.ts +41 -0
  233. package/src/subpaths/names.ts +43 -0
  234. package/src/subpaths/permit.ts +39 -0
  235. package/src/subpaths/price.ts +60 -0
  236. package/src/subpaths/rewards.ts +46 -0
  237. package/src/subpaths/risk.ts +23 -0
  238. package/src/subpaths/simulate.ts +51 -0
  239. package/src/subpaths/smart-account.ts +40 -0
  240. package/src/subpaths/swap.ts +36 -0
  241. package/src/swap.ts +534 -0
  242. package/src/tokenProbe.ts +5 -0
  243. package/src/write/batch.ts +44 -5
  244. package/src/write/collect.ts +60 -1
  245. package/src/write/send.ts +4 -0
  246. package/src/write/signer.ts +5 -1
  247. package/src/write/transfer.ts +17 -10
  248. package/src/write/tron.ts +43 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rewards/types.ts"],"names":[],"mappings":""}
package/dist/risk.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ import { type LpProtocol } from './lp.js';
2
+ import type { Provider } from './provider.js';
3
+ export type ProbeStage = 'ok' | 'buy-failed' | 'transfer-failed' | 'approve-failed' | 'sell-failed';
4
+ export interface TokenRisk {
5
+ token: string;
6
+ /** 模拟用的 V2 协议和池子(代币 / 包装主币里包装主币一侧最深的);没有池子时为 null */
7
+ protocol: string | null;
8
+ pool: string | null;
9
+ /** 模拟到哪一步:ok 全部成功;buy-failed 买不进(可能还没开放交易、限制了合约地址);sell-failed 卖不出(貔貅盘) */
10
+ stage: ProbeStage | null;
11
+ /** 卖不出,或卖出税 ≥ 90% */
12
+ honeypot: boolean | null;
13
+ /** 税率(0~1):实际数量比 Router 报价少多少;对应的步骤没跑到时为 null */
14
+ buyTax: number | null;
15
+ sellTax: number | null;
16
+ transferTax: number | null;
17
+ /** 买入 / 卖出消耗的 gas(异常高可能有额外逻辑) */
18
+ buyGas: number | null;
19
+ sellGas: number | null;
20
+ /** EIP-1967 代理的实现合约(可升级:规则以后可以改);不是代理时为 null */
21
+ implementation: string | null;
22
+ /** owner():没有这个方法时为 null;零地址表示已放弃 */
23
+ owner: string | null;
24
+ /** 汇总的风险标记:honeypot、cannot-buy、high-buy-tax / high-sell-tax / high-transfer-tax(> 10%)、has-tax(> 0.5%)、proxy、owned、no-pool */
25
+ flags: string[];
26
+ }
27
+ export interface TokenRiskOptions {
28
+ /** 模拟买入用的主币数量(最小单位),默认包装主币储备的 1 / 1000,最多 1 个主币 */
29
+ amount?: bigint;
30
+ /** 用哪些 V2 协议的池子,默认这条链内置表里有 Router 的 V2 协议 */
31
+ protocols?: readonly LpProtocol[];
32
+ }
33
+ /**
34
+ * 检查代币的风险(每个代币一次模拟的 eth_call,加上一次 multicall 找池子、读 owner)。
35
+ *
36
+ * ```ts
37
+ * const [risk] = await tokenRisks(provider, [token])
38
+ * // { stage: 'ok', honeypot: false, buyTax: 0.05, sellTax: 0.05, transferTax: 0, flags: ['has-tax', 'owned'], … }
39
+ * ```
40
+ */
41
+ export declare function tokenRisks(provider: Provider, tokens: readonly string[], options?: TokenRiskOptions): Promise<TokenRisk[]>;
42
+ //# sourceMappingURL=risk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../src/risk.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAA;AAEnG,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,2EAA2E;IAC3E,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,qBAAqB;IACrB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;IACxB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,iCAAiC;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,8HAA8H;IAC9H,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;CAClC;AAaD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAgFpI"}
package/dist/risk.js ADDED
@@ -0,0 +1,134 @@
1
+ /**
2
+ * 代币风险检查(子路径 `@w3lib/evm-batch-call/risk`):在 eth_call 里模拟“买入 → 转账 → 卖出”(deployless 的探测合约,不部署、不发交易),
3
+ * 算出买入税、转账税、卖出税,判断能不能卖(貔貅盘);另外看合约是不是可升级的代理、owner 有没有放弃。
4
+ * 只能检查在内置 V2 协议里有 代币 / 包装主币 池子的代币;Tron 不支持
5
+ */
6
+ import { AbiCoder, Interface, concat } from 'ethers';
7
+ import { LP_PROTOCOLS, LP_QUOTE_TOKENS } from './lp.js';
8
+ import { TOKEN_PROBE_BYTECODE } from './tokenProbe.js';
9
+ import { isExecutionError } from './errors.js';
10
+ import { isTronChain } from './tron.js';
11
+ const coder = AbiCoder.defaultAbiCoder();
12
+ const factoryInterface = new Interface(['function getPair(address tokenA, address tokenB) view returns (address)']);
13
+ const pairInterface = new Interface(['function token0() view returns (address)', 'function getReserves() view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)']);
14
+ const ownerInterface = new Interface(['function owner() view returns (address)']);
15
+ /** EIP-1967 的实现合约槽位:bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1) */
16
+ const IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
17
+ const STAGES = ['ok', 'buy-failed', 'transfer-failed', 'approve-failed', 'sell-failed'];
18
+ const ZERO = '0x0000000000000000000000000000000000000000';
19
+ /**
20
+ * 检查代币的风险(每个代币一次模拟的 eth_call,加上一次 multicall 找池子、读 owner)。
21
+ *
22
+ * ```ts
23
+ * const [risk] = await tokenRisks(provider, [token])
24
+ * // { stage: 'ok', honeypot: false, buyTax: 0.05, sellTax: 0.05, transferTax: 0, flags: ['has-tax', 'owned'], … }
25
+ * ```
26
+ */
27
+ export async function tokenRisks(provider, tokens, options = {}) {
28
+ const chainId = await provider.getChainId();
29
+ if (isTronChain(chainId))
30
+ throw new Error('tokenRisks is not supported on Tron');
31
+ const wrapped = LP_QUOTE_TOKENS[chainId]?.[0];
32
+ const protocols = (options.protocols ?? LP_PROTOCOLS.filter((p) => p.chainId === chainId)).filter((p) => p.version === 'v2' && p.router && p.factory);
33
+ if (!wrapped || !protocols.length)
34
+ throw new Error(`No V2 protocol with a router on chain ${chainId}`);
35
+ // 1. 每个代币在每个 V2 协议里和包装主币的池子,以及 owner()
36
+ const pairCalls = tokens.flatMap((t) => protocols.map((p) => provider.contract(p.factory, factoryInterface).getPair(t, wrapped)));
37
+ const ownerCalls = tokens.map((t) => provider.contract(t, ownerInterface).owner());
38
+ const first = await provider.tryAll([...pairCalls, ...ownerCalls]);
39
+ const pairs = first.slice(0, pairCalls.length);
40
+ const owners = first.slice(pairCalls.length);
41
+ const found = pairs.flatMap((pair, i) => (pair && pair.toLowerCase() !== ZERO ? [{ i, pair }] : []));
42
+ const reserves = found.length
43
+ ? await provider.tryAll(found.flatMap(({ pair }) => [provider.contract(pair, pairInterface).token0(), provider.contract(pair, pairInterface).getReserves()]))
44
+ : [];
45
+ // 每个代币:包装主币一侧最深的池子
46
+ const best = tokens.map(() => null);
47
+ found.forEach(({ i, pair }, k) => {
48
+ const token0 = reserves[k * 2];
49
+ const r = reserves[k * 2 + 1];
50
+ if (!token0 || !r)
51
+ return;
52
+ const wrappedReserve = token0.toLowerCase() === wrapped.toLowerCase() ? r[0] : r[1];
53
+ const t = Math.floor(i / protocols.length);
54
+ const current = best[t];
55
+ if (wrappedReserve > 0n && (!current || wrappedReserve > current.wrappedReserve))
56
+ best[t] = { protocol: protocols[i % protocols.length], pair, wrappedReserve };
57
+ });
58
+ const { runOnNodes } = await import('./write/rpc.js');
59
+ const node = (method, fn, isFinal) => runOnNodes(provider.rpc, method, (n) => fn(n), isFinal);
60
+ const ONE = 10n ** 18n;
61
+ return Promise.all(tokens.map(async (token, t) => {
62
+ const pick = best[t];
63
+ const owner = owners[t] ?? null;
64
+ const implementation = await node('getStorage', (n) => (n.getStorage ? n.getStorage(token, IMPLEMENTATION_SLOT) : Promise.resolve('0x')))
65
+ .then((slot) => (slot && BigInt(slot) !== 0n ? `0x${slot.slice(-40)}` : null))
66
+ .catch(() => null);
67
+ const base = { token, implementation, owner, buyTax: null, sellTax: null, transferTax: null, buyGas: null, sellGas: null };
68
+ if (!pick)
69
+ return { ...base, protocol: null, pool: null, stage: null, honeypot: null, flags: flagsOf({ ...base, stage: null, honeypot: null }, true) };
70
+ const amount = options.amount ?? min(pick.wrappedReserve / 1000n, ONE);
71
+ // deployless:没有 to 的 eth_call 执行构造函数;从包装主币合约发起(它持有大量主币,eth_call 不需要签名)
72
+ const data = concat([TOKEN_PROBE_BYTECODE, coder.encode(['address', 'address', 'address'], [pick.protocol.router, token, pick.pair])]);
73
+ let decoded = null;
74
+ try {
75
+ // 探测合约自己不会 revert(每一步都 try);执行出错(如买入时代币合约把调用方拒之门外导致整体 revert)算买不进,
76
+ // 节点、网络、限频的错误照常抛出,不当成代币的风险
77
+ const out = await node('call', (n) => n.call({ from: wrapped, data, value: amount }), isExecutionError);
78
+ decoded = coder.decode(new Array(11).fill('uint256'), out).toArray();
79
+ }
80
+ catch (err) {
81
+ if (!isExecutionError(err))
82
+ throw err;
83
+ decoded = null;
84
+ }
85
+ if (!decoded) {
86
+ const failed = { ...base, protocol: pick.protocol.id, pool: pick.pair, stage: 'buy-failed', honeypot: null };
87
+ return { ...failed, flags: flagsOf(failed, false) };
88
+ }
89
+ const [stageIndex, buyQuote, bought, transferSent, transferReceived, sellAmount, sellQuote, sold, buyGas, sellGas, pairReceived] = decoded;
90
+ const stage = STAGES[Number(stageIndex)] ?? 'buy-failed';
91
+ const tax = (actual, expected) => (expected > 0n ? Math.max(0, 1 - Number((actual * 1000000n) / expected) / 1_000_000) : null);
92
+ const result = {
93
+ ...base,
94
+ protocol: pick.protocol.id,
95
+ pool: pick.pair,
96
+ stage,
97
+ buyTax: stage === 'buy-failed' ? null : tax(bought, buyQuote),
98
+ transferTax: stage === 'ok' || stage === 'approve-failed' || stage === 'sell-failed' ? tax(transferReceived, transferSent) : null,
99
+ // 卖出税:池子实际收到的代币(转账时扣的税,精确),和实际换回的主币比报价少多少(有的代币卖出时顺便把收来的税也卖进同一个池子,
100
+ // 池子那边看不出来),取较大的
101
+ sellTax: stage === 'ok' ? Math.max(tax(pairReceived, sellAmount) ?? 0, tax(sold, sellQuote) ?? 0) : null,
102
+ buyGas: stage === 'buy-failed' ? null : Number(buyGas),
103
+ sellGas: stage === 'ok' ? Number(sellGas) : null,
104
+ honeypot: stage === 'sell-failed' || stage === 'transfer-failed' || stage === 'approve-failed' ? true : stage === 'ok' ? (tax(sold, sellQuote) ?? 0) >= 0.9 : null,
105
+ };
106
+ return { ...result, flags: flagsOf(result, false) };
107
+ }));
108
+ }
109
+ const min = (a, b) => (a < b ? a : b);
110
+ function flagsOf(r, noPool) {
111
+ const flags = [];
112
+ if (noPool)
113
+ flags.push('no-pool');
114
+ if (r.honeypot)
115
+ flags.push('honeypot');
116
+ if (r.stage === 'buy-failed')
117
+ flags.push('cannot-buy');
118
+ for (const [name, value] of [
119
+ ['buy', r.buyTax],
120
+ ['sell', r.sellTax],
121
+ ['transfer', r.transferTax],
122
+ ]) {
123
+ if (value !== null && value > 0.1)
124
+ flags.push(`high-${name}-tax`);
125
+ }
126
+ if ([r.buyTax, r.sellTax, r.transferTax].some((v) => v !== null && v > 0.005))
127
+ flags.push('has-tax');
128
+ if (r.implementation)
129
+ flags.push('proxy');
130
+ if (r.owner && r.owner.toLowerCase() !== ZERO)
131
+ flags.push('owned');
132
+ return flags;
133
+ }
134
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../src/risk.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rpcNodes.d.ts","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"AAGA,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAqLxE,CAAA;AAED,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAK/C,CAAA"}
1
+ {"version":3,"file":"rpcNodes.d.ts","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"AAGA,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAuMxE,CAAA;AAED,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAK/C,CAAA"}
package/dist/rpcNodes.js CHANGED
@@ -182,6 +182,24 @@ export const DEFAULT_RPC_URLS = {
182
182
  'https://rpc-qnd.inkonchain.com',
183
183
  'https://ink.api.pocket.network',
184
184
  ],
185
+ // 星空链(Starry)
186
+ 202308: [
187
+ 'https://rpc.starryscan.com',
188
+ ],
189
+ // conflux
190
+ 1030: [
191
+ 'https://evm.confluxrpc.com',
192
+ ],
193
+ // injective
194
+ 1776: [
195
+ 'https://sentry.evm-rpc.injective.network',
196
+ 'https://injectiveevm-rpc.polkachu.com',
197
+ ],
198
+ // pharos
199
+ 1672: [
200
+ 'https://rpc.pharos.xyz',
201
+ 'https://infra.originstake.com/pharos/evm',
202
+ ],
185
203
  };
186
204
  /** Tron 主网全节点 HTTP API(均支持跨域与 deployless) */
187
205
  export const DEFAULT_TRON_HOSTS = [
@@ -1 +1 @@
1
- {"version":3,"file":"rpcNodes.js","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rpcNodes.js","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * 交易模拟(子路径 `@w3lib/evm-batch-call/simulate`):发送前先看会发生什么——成不成功、花多少 gas、哪些资产进出、给了什么授权、风险提示。
3
+ *
4
+ * - EVM:`eth_simulateV1`(公共节点 publicnode / drpc / mainnet.base.org / bsc-dataseed 等都支持):一次请求执行一串交易、状态逐笔延续,
5
+ * `traceTransfers` 把主币转账也变成日志;资产变化和授权变化都从日志里算(ERC20 / 721 / 1155 Transfer、WETH Deposit / Withdrawal、Approval、
6
+ * ApprovalForAll、Permit2 Approval)。不支持时退回 `eth_call` + `eth_estimateGas`:只能知道成不成功和 gas,资产变化只能按 calldata 估
7
+ * - Tron:`triggerconstantcontract`(能量、日志里的 TRC20 Transfer / Approval);TRX 的变化只有 call_value
8
+ */
9
+ import { type BigNumberish } from 'ethers';
10
+ import type { BlockTag } from './aggregate.js';
11
+ import type { Provider } from './provider.js';
12
+ import { type DecodedCall } from './simulateDecode.js';
13
+ export { decodeCalldata, decodeRevert, type DecodedCall, type DecodedType } from './simulateDecode.js';
14
+ /** 要模拟的交易,字段与 buildSwap / buildRevokes / 流动性构建的 transactions 里的一致(多出来的字段忽略) */
15
+ export interface SimulateTx {
16
+ from?: string;
17
+ to?: string;
18
+ data?: string;
19
+ /** 附带的主币(最小单位;Tron 是 sun) */
20
+ value?: BigNumberish;
21
+ gas?: BigNumberish;
22
+ }
23
+ /** 状态覆盖(eth_call / eth_simulateV1 的格式):改余额、nonce、代码、存储 */
24
+ export type StateOverrides = Record<string, {
25
+ balance?: string;
26
+ nonce?: string;
27
+ code?: string;
28
+ state?: Record<string, string>;
29
+ stateDiff?: Record<string, string>;
30
+ }>;
31
+ export interface SimulateOptions {
32
+ /** 发送者(交易里没有 from 时用),也是资产变化 / 授权变化的主体 */
33
+ from?: string;
34
+ /** 另外要统计资产变化、授权的地址(默认只有 from) */
35
+ watch?: readonly string[];
36
+ /** 按这个区块的状态模拟(默认最新) */
37
+ blockTag?: BlockTag;
38
+ stateOverrides?: StateOverrides;
39
+ /** 每笔交易的 gas 上限,默认 min(1000 万, 2500 万 / 笔数):不同节点限制一个模拟里的总 gas */
40
+ gas?: bigint;
41
+ /** 估算手续费(gasUsed × 当前 gas 价格;不含 L1 数据费),默认 true */
42
+ fee?: boolean;
43
+ /** 给资产变化带美元价值(用 /price,按需加载):true 用默认价格源,或传 tokenPrices 的 sources */
44
+ usd?: boolean | import('./price.js').TokenPricesOptions['sources'];
45
+ /** 对收到的代币做风险检查(用 /risk,按需加载,只支持 EVM 的 V2 池子能买卖的代币),有问题时加进 warnings */
46
+ risk?: boolean;
47
+ /** 不用 eth_simulateV1,直接 eth_call + estimateGas(调试 / 节点行为不一致时) */
48
+ forceCall?: boolean;
49
+ }
50
+ export type WarningSeverity = 'info' | 'warn' | 'danger';
51
+ export interface SimulationWarning {
52
+ severity: WarningSeverity;
53
+ /**
54
+ * unlimited-approval / unknown-spender / approve-to-eoa / unlimited-nft-approval / no-code / large-value /
55
+ * token-risk / unknown-method / no-logs / no-state / reverted
56
+ */
57
+ code: string;
58
+ message: string;
59
+ /** 相关地址:授权类提示是被授权方,token-risk 是代币 */
60
+ address?: string;
61
+ }
62
+ export interface BalanceChange {
63
+ address: string;
64
+ /** 代币地址;主币是 'native' */
65
+ asset: string;
66
+ symbol: string | null;
67
+ decimals: number;
68
+ /** 带符号的最小单位数量 */
69
+ delta: string;
70
+ formatted: string;
71
+ usd?: number | null;
72
+ /** NFT(721 / 1155):tokenId,数量是个数 */
73
+ tokenId?: string;
74
+ standard: 'native' | 'erc20' | 'erc721' | 'erc1155';
75
+ }
76
+ export interface ApprovalChange {
77
+ type: 'erc20' | 'permit2' | 'nft' | 'nft-token';
78
+ owner: string;
79
+ /** 代币 / NFT 合约 */
80
+ token: string;
81
+ symbol: string | null;
82
+ /** 被授权方(ERC20 的 spender、Permit2 的 spender、NFT 的 operator / approved) */
83
+ spender: string;
84
+ spenderName?: string;
85
+ /** 新的额度(最小单位);NFT 的 ApprovalForAll 是 '1' / '0',单个 NFT 是 tokenId */
86
+ amount: string;
87
+ unlimited: boolean;
88
+ /** 授权被取消(额度 0 / setApprovalForAll false) */
89
+ revoked: boolean;
90
+ /** Permit2:授权到期的时间(秒) */
91
+ expiration?: number;
92
+ }
93
+ /** 一条转账(所有地址之间的,不只是 from 的) */
94
+ export interface SimulatedTransfer {
95
+ asset: string;
96
+ from: string;
97
+ to: string;
98
+ amount: string;
99
+ tokenId?: string;
100
+ standard: BalanceChange['standard'];
101
+ }
102
+ export interface SimulationResult {
103
+ success: boolean;
104
+ /** 失败原因:解码后的 revert 原因(Error / Panic / 常见自定义错误)或节点给的错误信息 */
105
+ error?: string;
106
+ /** revert 的原始数据 */
107
+ revertData?: string;
108
+ /** 消耗的 gas(Tron 是能量) */
109
+ gasUsed: string;
110
+ /** 估算的手续费(wei),不含 L1 数据费;Tron 没有 */
111
+ fee?: string;
112
+ balanceChanges: BalanceChange[];
113
+ approvalChanges: ApprovalChange[];
114
+ decoded: {
115
+ type: DecodedCall['type'];
116
+ protocol?: string;
117
+ method?: string;
118
+ summary: string;
119
+ args?: Record<string, unknown>;
120
+ calls?: DecodedCall[];
121
+ };
122
+ warnings: SimulationWarning[];
123
+ transfers: SimulatedTransfer[];
124
+ /** 原始日志 */
125
+ logs?: Array<{
126
+ address: string;
127
+ topics: string[];
128
+ data: string;
129
+ }>;
130
+ /** 用的模拟方式:'simulateV1'(有日志)、'eth_call'(只有成败和 gas)、'tron' */
131
+ mode: 'simulateV1' | 'eth_call' | 'tron';
132
+ returnData?: string;
133
+ }
134
+ export interface BatchSimulationResult {
135
+ /** 全部成功 */
136
+ success: boolean;
137
+ /** 每笔交易的结果,与输入一一对应 */
138
+ results: SimulationResult[];
139
+ /** 第一笔失败的下标 */
140
+ failedIndex?: number;
141
+ gasUsed: string;
142
+ fee?: string;
143
+ /** 汇总(同一个资产、同一个地址的变化相加;授权取最后的状态) */
144
+ balanceChanges: BalanceChange[];
145
+ approvalChanges: ApprovalChange[];
146
+ warnings: SimulationWarning[];
147
+ mode: SimulationResult['mode'];
148
+ }
149
+ /**
150
+ * 模拟一笔交易(不签名、不发送)。可以直接传 `buildSwap` / `buildRevokes` / 流动性构建里的交易。
151
+ *
152
+ * ```ts
153
+ * const plan = await buildSwap(provider, user, { tokenIn, tokenOut, amountInFormatted: '1' })
154
+ * const sim = await simulate(provider, plan.transactions[1], { from: user }) // 兑换这一笔(授权在前,没发出去时用 simulateBatch)
155
+ * if (!sim.success) throw new Error(sim.error)
156
+ * sim.balanceChanges // [{ asset: 'native', delta: '-1000…', formatted: '-1', … }, { asset: USDC, formatted: '2300.5', … }]
157
+ * sim.warnings // [{ severity: 'warn', code: 'unknown-spender', … }]
158
+ * ```
159
+ */
160
+ export declare function simulate(provider: Provider, tx: SimulateTx, options?: SimulateOptions): Promise<SimulationResult>;
161
+ /**
162
+ * 按顺序模拟一串依赖前一笔的交易(如先 approve 再兑换:`plan.transactions`)。eth_simulateV1 在同一个区块里依次执行,状态延续;
163
+ * 不支持的节点退回单笔 eth_call,后面的交易看不到前面的结果(结果里有 `no-state` 提示;Tron 同理)。
164
+ *
165
+ * ```ts
166
+ * const sim = await simulateBatch(provider, plan.transactions, { from: user, usd: true })
167
+ * sim.success; sim.balanceChanges // 汇总:整个流程你付出 / 收到什么
168
+ * ```
169
+ */
170
+ export declare function simulateBatch(provider: Provider, txs: readonly SimulateTx[] | {
171
+ transactions: readonly SimulateTx[];
172
+ }, options?: SimulateOptions): Promise<BatchSimulationResult>;
173
+ /**
174
+ * 模拟通过才发送的一行守卫:`simulate` 失败或有 danger 级别的提示时抛错,否则返回模拟结果,由调用方继续发送。
175
+ *
176
+ * ```ts
177
+ * await assertSimulation(simulate(provider, tx, { from }))
178
+ * await batchCall(provider, key, [{ to: tx.to, data: tx.data, value: tx.value }])
179
+ * ```
180
+ */
181
+ export declare function assertSimulation<T extends Pick<SimulationResult, 'success' | 'error' | 'warnings'> | Pick<BatchSimulationResult, 'success' | 'warnings'> & {
182
+ results: Array<Pick<SimulationResult, 'error'>>;
183
+ }>(simulation: Promise<T> | T, options?: {
184
+ allowDanger?: boolean;
185
+ }): Promise<T>;
186
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"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"}