@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,310 @@
1
+ /**
2
+ * 授权管理(子路径 `@w3lib/evm-batch-call/approvals`):批量查一个地址给出的授权——ERC20 额度、Permit2 额度(含过期时间)、
3
+ * NFT 的 setApprovalForAll;按 Approval 事件增量发现授权过的代币;批量撤销(approve 0、Permit2 lockdown、setApprovalForAll false)
4
+ */
5
+ import { Interface } from 'ethers';
6
+ import { formatUnits } from './erc20.js';
7
+ import { LP_PROTOCOLS } from './lp.js';
8
+ import { runLogScan } from './scan.js';
9
+ import { isTronChain, toEvmAddress, toTronAddress } from './tron.js';
10
+ /** Uniswap 的 Permit2(各 EVM 链上地址相同;Tron 上没有) */
11
+ export const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
12
+ const erc20 = (address, name) => ({ address, name, kind: 'erc20' });
13
+ const nft = (address, name) => ({ address, name, kind: 'nft' });
14
+ /** 多条链上地址相同的合约(CREATE2 部署) */
15
+ const EVERYWHERE = [
16
+ erc20(PERMIT2_ADDRESS, 'Uniswap Permit2'),
17
+ erc20('0x111111125421cA6dc452d289314280a0f8842A65', '1inch Router v6'),
18
+ erc20('0x1111111254EEB25477B68fb85Ed929f73A960582', '1inch Router v5'),
19
+ erc20('0x6A000F20005980200259B80c5102003040001068', 'ParaSwap Augustus v6.2'),
20
+ erc20('0x0000000000001fF3684f28c67538d4D072C22734', '0x AllowanceHolder'),
21
+ nft('0x1E0049783F008A0085193E00003D00cd54003c71', 'OpenSea Seaport Conduit'),
22
+ ];
23
+ /** 各链的 Router(不含 LP_PROTOCOLS 里已有的 V2 Router、仓位合约,它们自动加入)。2026-10 在链上核对过有合约 */
24
+ const BY_CHAIN = {
25
+ 1: [
26
+ erc20('0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45', 'Uniswap SwapRouter02'),
27
+ erc20('0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af', 'Uniswap Universal Router'),
28
+ erc20('0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD', 'Uniswap Universal Router (old)'),
29
+ erc20('0x13f4EA83D0bd40E75C8222255bc855a974568Dd4', 'PancakeSwap Smart Router'),
30
+ erc20('0xDef1C0ded9bec7F1a1670819833240f027b25EfF', '0x Exchange Proxy'),
31
+ erc20('0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57', 'ParaSwap Augustus v5'),
32
+ nft('0x00000000000111AbE46ff893f3B2fdF1F759a8A8', 'Blur Execution Delegate'),
33
+ ],
34
+ 56: [
35
+ erc20('0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2', 'Uniswap SwapRouter02'),
36
+ erc20('0x1906c1d672b88cD1B9aC7593301cA990F94Eae07', 'Uniswap Universal Router'),
37
+ erc20('0x13f4EA83D0bd40E75C8222255bc855a974568Dd4', 'PancakeSwap Smart Router'),
38
+ erc20('0xd9C500DfF816a1Da21A48A732d3498Bf09dc9AEB', 'PancakeSwap Universal Router'),
39
+ erc20('0xDef1C0ded9bec7F1a1670819833240f027b25EfF', '0x Exchange Proxy'),
40
+ erc20('0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57', 'ParaSwap Augustus v5'),
41
+ ],
42
+ 8453: [
43
+ erc20('0x2626664c2603336E57B271c5C0b26F421741e481', 'Uniswap SwapRouter02'),
44
+ erc20('0x6fF5693b99212Da76ad316178A184AB56D299b43', 'Uniswap Universal Router'),
45
+ erc20('0x678Aa4bF4E210cf2166753e054d5b7c31cc7fa86', 'PancakeSwap Smart Router'),
46
+ ],
47
+ 42161: [
48
+ erc20('0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45', 'Uniswap SwapRouter02'),
49
+ erc20('0xA51afAFe0263b40EdaEf0Df8781eA9aa03E381a3', 'Uniswap Universal Router'),
50
+ erc20('0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57', 'ParaSwap Augustus v5'),
51
+ ],
52
+ 10: [
53
+ erc20('0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45', 'Uniswap SwapRouter02'),
54
+ erc20('0x851116D9223fabED8E56C0E6b8Ad0c31d98B3507', 'Uniswap Universal Router'),
55
+ erc20('0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57', 'ParaSwap Augustus v5'),
56
+ ],
57
+ 137: [
58
+ erc20('0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45', 'Uniswap SwapRouter02'),
59
+ erc20('0x1095692A6237d83C6a72F3F5eFEdb9A670C49223', 'Uniswap Universal Router'),
60
+ erc20('0xDef1C0ded9bec7F1a1670819833240f027b25EfF', '0x Exchange Proxy'),
61
+ erc20('0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57', 'ParaSwap Augustus v5'),
62
+ ],
63
+ 43114: [
64
+ erc20('0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE', 'Uniswap SwapRouter02'),
65
+ erc20('0x94b75331AE8d42C1b61065089B7d48FE14aA73b7', 'Uniswap Universal Router'),
66
+ erc20('0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57', 'ParaSwap Augustus v5'),
67
+ ],
68
+ };
69
+ /**
70
+ * 这条链上已知的被授权方:内置协议表的 V2 Router、V3 / V4 仓位合约,各链的 Router / 聚合器,NFT 市场。
71
+ * Tron 上只有协议表里的 SunSwap 合约(没有 Permit2)
72
+ */
73
+ export function knownSpenders(chainId) {
74
+ const tron = isTronChain(chainId);
75
+ const fromLp = LP_PROTOCOLS.filter((p) => p.chainId === chainId).flatMap((p) => [
76
+ ...(p.router ? [erc20(p.router, `${p.name} Router`)] : []),
77
+ // V3 / V4 仓位合约:代币授权(添加流动性)
78
+ ...(p.positionManager ? [erc20(p.positionManager, `${p.name} Positions`)] : []),
79
+ ]);
80
+ const list = [...fromLp, ...(tron ? [] : EVERYWHERE), ...(BY_CHAIN[chainId] ?? [])];
81
+ const seen = new Set();
82
+ return list.filter((s) => {
83
+ const k = `${s.kind}:${keyOf(chainId, s.address)}`;
84
+ if (seen.has(k))
85
+ return false;
86
+ seen.add(k);
87
+ return true;
88
+ });
89
+ }
90
+ /** 地址的比较键:EVM 小写 0x;Tron 是 T 开头的 base58 */
91
+ const keyOf = (chainId, address) => (isTronChain(chainId) ? toTronAddress(address) : address.toLowerCase());
92
+ const ERC20_ABI = [
93
+ 'function allowance(address owner, address spender) view returns (uint256)',
94
+ 'function decimals() view returns (uint8)',
95
+ 'function symbol() view returns (string)',
96
+ ];
97
+ const PERMIT2_ABI = ['function allowance(address owner, address token, address spender) view returns (uint160 amount, uint48 expiration, uint48 nonce)'];
98
+ const NFT_ABI = ['function isApprovedForAll(address owner, address operator) view returns (bool)'];
99
+ const UNLIMITED = 2n ** 96n;
100
+ /**
101
+ * 查一个地址给出的授权(全部读取合成一次 multicall)。默认检查已知的 Router / 聚合器 / NFT 市场,
102
+ * 代币要自己给(如持有的代币,或用 scanApprovals 按事件发现)。
103
+ *
104
+ * ```ts
105
+ * await approvals(provider, user, { tokens: [USDT, USDC] }) // 对已知的被授权方
106
+ * await approvals(provider, user, { pairs: [{ token: USDT, spender: someContract }] })
107
+ * await approvals(provider, user, { nfts: [BAYC] }) // NFT 市场的 setApprovalForAll
108
+ * ```
109
+ */
110
+ export async function approvals(provider, owner, query) {
111
+ const chainId = await provider.getChainId();
112
+ const tron = isTronChain(chainId);
113
+ const key = (a) => keyOf(chainId, a);
114
+ const known = knownSpenders(chainId);
115
+ const names = new Map(known.map((s) => [key(s.address), s.name]));
116
+ const addressOf = (s) => {
117
+ if (typeof s !== 'string')
118
+ names.set(key(s.address), s.name);
119
+ return typeof s === 'string' ? s : s.address;
120
+ };
121
+ const spenders = (query.spenders ?? known.filter((s) => s.kind === 'erc20')).map(addressOf);
122
+ const operators = (query.operators ?? known.filter((s) => s.kind === 'nft')).map(addressOf);
123
+ const pairs = dedupe([...(query.tokens ?? []).flatMap((token) => spenders.map((spender) => ({ token, spender }))), ...(query.pairs ?? [])], (p) => `${key(p.token)}:${key(p.spender)}`);
124
+ const nftPairs = dedupe([...(query.nfts ?? []).flatMap((collection) => operators.map((operator) => ({ collection, operator }))), ...(query.nftPairs ?? [])], (p) => `${key(p.collection)}:${key(p.operator)}`);
125
+ // Permit2 的额度:被授权方是 Permit2 自己的没有意义(ERC20 授权给 Permit2 才有意义),不查
126
+ const permitPairs = (query.permit2 ?? true) && !tron ? pairs.filter((p) => key(p.spender) !== key(PERMIT2_ADDRESS)) : [];
127
+ const tokens = dedupe(pairs.map((p) => p.token), key);
128
+ const calls = [
129
+ ...pairs.map((p) => provider.contract(p.token, ERC20_ABI).allowance(owner, p.spender)),
130
+ ...permitPairs.map((p) => provider.contract(PERMIT2_ADDRESS, PERMIT2_ABI).allowance(owner, p.token, p.spender)),
131
+ ...tokens.flatMap((t) => [provider.contract(t, ERC20_ABI).decimals(), provider.contract(t, ERC20_ABI).symbol()]),
132
+ ...nftPairs.map((p) => provider.contract(p.collection, NFT_ABI).isApprovedForAll(owner, p.operator)),
133
+ ];
134
+ const results = calls.length ? await provider.tryAll(calls) : [];
135
+ let i = 0;
136
+ const allowances = results.slice(i, (i += pairs.length));
137
+ const permits = new Map(permitPairs.map((p, j) => [p, results[i + j]]));
138
+ i += permitPairs.length;
139
+ const meta = new Map();
140
+ for (const t of tokens) {
141
+ const [decimals, symbol] = results.slice(i, (i += 2));
142
+ meta.set(key(t), { decimals: decimals === null ? null : Number(decimals), symbol: typeof symbol === 'string' ? symbol : null });
143
+ }
144
+ const nftStates = results.slice(i);
145
+ const now = Math.floor(Date.now() / 1000);
146
+ const out = [];
147
+ pairs.forEach((p, j) => {
148
+ const m = meta.get(key(p.token)) ?? { decimals: null, symbol: null };
149
+ const base = { spender: p.spender, spenderName: names.get(key(p.spender)) ?? null, token: p.token, symbol: m.symbol, decimals: m.decimals };
150
+ const amount = allowances[j];
151
+ if (amount !== null && amount !== undefined && (amount > 0n || query.includeZero)) {
152
+ out.push({ type: 'erc20', ...base, amount: amount.toString(), formatted: m.decimals === null ? null : formatUnits(amount, m.decimals), unlimited: amount >= UNLIMITED });
153
+ }
154
+ const permit = permits.get(p);
155
+ if (permit) {
156
+ const [value, expiration, nonce] = [permit[0], Number(permit[1]), Number(permit[2])];
157
+ // Permit2 在 block.timestamp > expiration 时才拒绝
158
+ const expired = expiration < now;
159
+ if ((value > 0n && !expired) || query.includeZero) {
160
+ out.push({
161
+ type: 'permit2',
162
+ ...base,
163
+ amount: value.toString(),
164
+ formatted: m.decimals === null ? null : formatUnits(value, m.decimals),
165
+ unlimited: value >= UNLIMITED,
166
+ expiration,
167
+ expired,
168
+ nonce,
169
+ });
170
+ }
171
+ }
172
+ });
173
+ nftPairs.forEach((p, j) => {
174
+ const approved = nftStates[j];
175
+ if (approved === true || (approved === false && query.includeZero)) {
176
+ out.push({ type: 'nft', collection: p.collection, spender: p.operator, spenderName: names.get(key(p.operator)) ?? null, approved });
177
+ }
178
+ });
179
+ return out;
180
+ }
181
+ function dedupe(list, keyFn) {
182
+ const seen = new Map();
183
+ for (const x of list)
184
+ if (!seen.has(keyFn(x)))
185
+ seen.set(keyFn(x), x);
186
+ return [...seen.values()];
187
+ }
188
+ // ---------------------------------------------------------------------------
189
+ // 按事件发现
190
+ // ---------------------------------------------------------------------------
191
+ /** Approval(address indexed owner, address indexed spender, uint256):ERC20(3 个 topic)和 ERC721 单个 NFT(4 个 topic)相同 */
192
+ const APPROVAL_TOPIC = '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925';
193
+ /** ApprovalForAll(address indexed owner, address indexed operator, bool) */
194
+ const APPROVAL_FOR_ALL_TOPIC = '0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31';
195
+ /** Permit2 的 Approval(address indexed owner, address indexed token, address indexed spender, uint160, uint48):直接调用 approve */
196
+ const PERMIT2_APPROVAL_TOPIC = '0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b';
197
+ /** Permit2 的 Permit(address indexed owner, address indexed token, address indexed spender, uint160, uint48, uint48):签名授权(Universal Router 等大多用它) */
198
+ const PERMIT2_PERMIT_TOPIC = '0xc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec';
199
+ /**
200
+ * 按事件发现地址授权过的代币和 NFT 合约(只发现,不判断是否还有效:把结果的 pairs / nftPairs 交给 approvals 查当前状态)。
201
+ * 需要节点支持 eth_getLogs;免费公共节点的范围限制很严(如 BSC 每次 25 个区块),从很早的区块扫全部历史不现实,
202
+ * 适合从某个时间点开始增量扫描(保存 progress,下次接着扫)。Tron 不支持
203
+ *
204
+ * ```ts
205
+ * let { pairs, nftPairs, progress } = await scanApprovals(provider, user, { lookbackBlocks: 50_000 })
206
+ * const list = await approvals(provider, user, { pairs, nftPairs, spenders: [] })
207
+ * // 之后:await scanApprovals(provider, user, { progress })
208
+ * ```
209
+ */
210
+ export async function scanApprovals(provider, owner, options = {}) {
211
+ const chainId = await provider.getChainId();
212
+ if (isTronChain(chainId))
213
+ throw new Error('scanApprovals is not supported on Tron (no eth_getLogs)');
214
+ const ownerTopic = `0x${toEvmAddress(owner).slice(2).toLowerCase().padStart(64, '0')}`;
215
+ const addr = (topic) => (topic ? `0x${topic.slice(26)}` : null);
216
+ const lookback = Math.max(0, Math.floor(options.lookbackBlocks ?? 0));
217
+ const maxRequests = Math.max(3, Math.floor(options.maxRequests ?? 30));
218
+ const timeBudget = options.timeBudget ?? 10_000;
219
+ const base = {
220
+ provider,
221
+ initialCursor: (target) => (options.fromBlock !== undefined ? options.fromBlock - 1 : target - lookback),
222
+ maxRange: Math.max(1, Math.floor(options.blockRange ?? 1000)),
223
+ maxRequests: Math.ceil(maxRequests / 3),
224
+ timeBudget,
225
+ confirmations: 0,
226
+ ...(options.signal ? { signal: options.signal } : {}),
227
+ };
228
+ const [erc20Progress, nftProgress, permit2Progress] = await Promise.all([
229
+ runLogScan({
230
+ ...base,
231
+ saved: options.progress?.erc20 ?? undefined,
232
+ filter: { topics: [APPROVAL_TOPIC, ownerTopic] },
233
+ // ERC721 的单个 NFT 授权也是这个事件(4 个 topic),不是代币额度,跳过
234
+ collect: (log) => (log.topics.length === 3 ? `${log.address.toLowerCase()}:${addr(log.topics[2])}` : null),
235
+ }),
236
+ runLogScan({
237
+ ...base,
238
+ saved: options.progress?.nft ?? undefined,
239
+ filter: { topics: [APPROVAL_FOR_ALL_TOPIC, ownerTopic] },
240
+ collect: (log) => `${log.address.toLowerCase()}:${addr(log.topics[2])}`,
241
+ }),
242
+ runLogScan({
243
+ ...base,
244
+ saved: options.progress?.permit2 ?? undefined,
245
+ // 两种事件的 topic0 不同:按 owner 过滤 Permit2 的全部事件,只收这两种(Lockdown 等其他事件的 owner 也在 topic1)
246
+ filter: { address: PERMIT2_ADDRESS, topics: [null, ownerTopic] },
247
+ collect: (log) => (log.topics[0] === PERMIT2_APPROVAL_TOPIC || log.topics[0] === PERMIT2_PERMIT_TOPIC ? `${addr(log.topics[2])}:${addr(log.topics[3])}` : null),
248
+ }),
249
+ ]);
250
+ const split = (item) => item.split(':');
251
+ const pairs = dedupe([...(erc20Progress?.items ?? []), ...(permit2Progress?.items ?? [])].map((item) => {
252
+ const [token, spender] = split(item);
253
+ return { token, spender };
254
+ }), (p) => `${p.token}:${p.spender}`);
255
+ const nftPairs = (nftProgress?.items ?? []).map((item) => {
256
+ const [collection, operator] = split(item);
257
+ return { collection, operator };
258
+ });
259
+ const cursors = [erc20Progress, nftProgress, permit2Progress].map((p) => p?.cursor ?? -1);
260
+ return { pairs, nftPairs, cursor: Math.min(...cursors), progress: { erc20: erc20Progress, nft: nftProgress, permit2: permit2Progress } };
261
+ }
262
+ const erc20Interface = new Interface(['function approve(address spender, uint256 amount) returns (bool)']);
263
+ const permit2Interface = new Interface(['function lockdown((address token, address spender)[] approvals)']);
264
+ const nftInterface = new Interface(['function setApprovalForAll(address operator, bool approved)']);
265
+ /**
266
+ * 撤销授权要发的交易(不签名):ERC20 每个一笔 approve(spender, 0);Permit2 的全部合成一笔 lockdown;NFT 每个一笔 setApprovalForAll(false)。
267
+ * Tron 上 to 是 T 地址
268
+ */
269
+ export function buildRevokes(list, chainId) {
270
+ const tron = chainId !== undefined && isTronChain(chainId);
271
+ const to = (a) => (tron ? toTronAddress(a) : a);
272
+ const hex = (a) => toEvmAddress(a);
273
+ const txs = [];
274
+ const permits = list.filter((a) => a.type === 'permit2');
275
+ for (const a of list) {
276
+ if (a.type === 'erc20')
277
+ txs.push({ kind: 'approve', to: to(a.token), data: erc20Interface.encodeFunctionData('approve', [hex(a.spender), 0n]), value: '0', approvals: [a] });
278
+ if (a.type === 'nft')
279
+ txs.push({ kind: 'setApprovalForAll', to: to(a.collection), data: nftInterface.encodeFunctionData('setApprovalForAll', [hex(a.spender), false]), value: '0', approvals: [a] });
280
+ }
281
+ if (permits.length) {
282
+ txs.push({
283
+ kind: 'lockdown',
284
+ to: PERMIT2_ADDRESS,
285
+ data: permit2Interface.encodeFunctionData('lockdown', [permits.map((p) => ({ token: hex(p.token), spender: hex(p.spender) }))]),
286
+ value: '0',
287
+ approvals: permits,
288
+ });
289
+ }
290
+ return txs;
291
+ }
292
+ /**
293
+ * 撤销授权:构建(同 buildRevokes)后用 from 签名发送,钱包和选项同 batchCall(mode: '7702' 时同一钱包的撤销合成一笔交易)。
294
+ * 默认一笔失败不影响后面的(continueOnError: true)
295
+ *
296
+ * ```ts
297
+ * const list = await approvals(provider, user, { tokens })
298
+ * await revokeApprovals(provider, key, list.filter((a) => a.unlimited))
299
+ * ```
300
+ */
301
+ export async function revokeApprovals(provider, from, list, options = {}) {
302
+ const txs = buildRevokes(list, await provider.getChainId());
303
+ if (!txs.length)
304
+ return [];
305
+ // 发送的代码按需加载:只查授权时打包不会带上
306
+ const { batchCall } = await import('./write/batch.js');
307
+ const results = await batchCall(provider, txs.map((tx) => ({ from, to: tx.to, data: tx.data })), { continueOnError: true, ...options });
308
+ return results.map((r, i) => ({ ...r, kind: txs[i].kind, approvals: txs[i].approvals }));
309
+ }
310
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA8BtE,CAAA;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE7E;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAG5E,CAAA;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAEvE"}
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAkCtE,CAAA;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE7E;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAG5E,CAAA;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAEvE"}
package/dist/chains.js CHANGED
@@ -11,7 +11,10 @@ export const NATIVE_CURRENCIES = {
11
11
  324: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // zkSync Mainnet
12
12
  988: { name: 'USDT0', symbol: 'USDT0', decimals: 18 }, // Stable Mainnet
13
13
  999: { name: 'HYPE', symbol: 'HYPE', decimals: 18 }, // HyperEVM
14
+ 1030: { name: 'CFX', symbol: 'CFX', decimals: 18 }, // Conflux eSpace
14
15
  1116: { name: 'Core Blockchain Native Token', symbol: 'CORE', decimals: 18 }, // Core Blockchain Mainnet
16
+ 1672: { name: 'PharosCoin', symbol: 'PROS', decimals: 18 }, // Pharos Mainnet
17
+ 1776: { name: 'Injective', symbol: 'INJ', decimals: 18 }, // Injective
15
18
  2818: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Morph
16
19
  4663: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Robinhood Chain
17
20
  5000: { name: 'Mantle', symbol: 'MNT', decimals: 18 }, // Mantle
@@ -25,6 +28,7 @@ export const NATIVE_CURRENCIES = {
25
28
  80094: { name: 'BERA Token', symbol: 'BERA', decimals: 18 }, // Berachain
26
29
  81457: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Blast
27
30
  534352: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Scroll
31
+ 201022: { name: 'FON', symbol: 'FON', decimals: 18 }, // FSC(ave_web 链配置的主币)
28
32
  6666665: { name: 'SAFE(AnWang)', symbol: 'SAFE', decimals: 18 }, // Safe(AnWang) Mainnet
29
33
  20260131: { name: 'MetaAssets', symbol: 'MA', decimals: 18 }, // Meta Assets Chain
30
34
  728126428: { name: 'TRON', symbol: 'TRX', decimals: 6 }, // Tron
@@ -1 +1 @@
1
- {"version":3,"file":"chains.js","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import type { Provider } from './provider.js';
2
+ import { type LogScanProgress } from './scan.js';
3
+ import type { PriceSource } from './price.js';
4
+ import type { BatchCallOptions } from './write/batch.js';
5
+ import type { WriteResult } from './write/send.js';
6
+ import type { SignerInput } from './write/signer.js';
7
+ /** 支持的链:目前只有 BSC(Flap 在 Base、X Layer 等链上也有部署,但没有核实过,不开放) */
8
+ export declare const FLAP_DIVIDEND_CHAINS: Readonly<Record<number, {
9
+ portal: string;
10
+ taxTokenHelper: string;
11
+ swapRegistry: string;
12
+ }>>;
13
+ /** Flap 代币地址的靓号后缀(Portal 创建时用):税收代币是 7777,普通代币是 8888(实测也有 8888 的代币带分红合约);发现持仓时只收这类地址 */
14
+ export declare const FLAP_TOKEN_SUFFIXES: readonly string[];
15
+ export interface DividendItem {
16
+ /** 持有人 */
17
+ owner: string;
18
+ /** 带分红的 Flap 代币 */
19
+ token: string;
20
+ symbol: string | null;
21
+ decimals: number;
22
+ /** 持有人当前的代币余额(可以是 0:卖掉后之前累计的分红仍可领取) */
23
+ balance: string;
24
+ /** 这个代币的 Dividend 合约(领取的目标) */
25
+ dividendContract: string;
26
+ /** Dividend 合约里配置的分红代币地址(WBNB 也是这个地址) */
27
+ dividendToken: string;
28
+ /** 实际收到的资产:'native'(分红代币是 WBNB 时领取会解包成 BNB)或分红代币地址 */
29
+ asset: 'native' | string;
30
+ assetSymbol: string | null;
31
+ assetDecimals: number;
32
+ /** 分红资产的 decimals 读不到(节点出错等):assetDecimals 按 18 估,claimableFormatted 可能不准,usd 固定为 null */
33
+ decimalsUnknown?: boolean;
34
+ /** 当前可领取的数量(asset 的最小单位),领取时就是收到的数量 */
35
+ claimable: string;
36
+ claimableFormatted: string;
37
+ /** 已经领取过的累计数量 */
38
+ claimed: string;
39
+ claimedFormatted: string;
40
+ /** 可领取部分的美元价值;没开价格或没有价格时为 null */
41
+ usd: number | null;
42
+ /** 持有人要持有至少这么多代币才会继续累计新的分红(已累计的不受影响) */
43
+ minimumShareBalance: string;
44
+ /** 当前余额是否达到 minimumShareBalance(false 时新的分红不再累计,但 claimable 仍可领取) */
45
+ accruing: boolean;
46
+ /** 适配器名称 */
47
+ adapter: 'flap';
48
+ }
49
+ export interface DividendUnsupported {
50
+ token: string;
51
+ reason: string;
52
+ }
53
+ export interface DividendScanOptions {
54
+ /** 收哪些后缀的代币地址,默认 FLAP_TOKEN_SUFFIXES */
55
+ suffixes?: readonly string[];
56
+ /** 起点区块(含);不传时往回扫 lookbackBlocks 个区块 */
57
+ fromBlock?: number;
58
+ /** 不传 fromBlock 时往回扫多少个区块,默认 5000 */
59
+ lookbackBlocks?: number;
60
+ /** 上次的进度(结果的 scan.progress),传了就接着扫 */
61
+ progress?: LogScanProgress;
62
+ /** 单次 getLogs 的最大区块范围,默认 1000;节点有上限时自动缩小 */
63
+ blockRange?: number;
64
+ /** 这次最多发多少个 getLogs,默认 10 */
65
+ maxRequests?: number;
66
+ /** 这次最多花多少毫秒,默认 10000 */
67
+ timeBudget?: number;
68
+ signal?: AbortSignal;
69
+ }
70
+ export interface DividendsOptions {
71
+ /** 要检查的代币(Flap 代币地址)。可以和 discover 一起用 */
72
+ tokens?: readonly string[];
73
+ /** 从持有人收到过的 Transfer 事件里发现 Flap 代币(只收靓号后缀 7777 / 8888 的地址,再逐个核对;发现的代币里没有分红合约的不报告),true 用默认值 */
74
+ discover?: boolean | DividendScanOptions;
75
+ /** 查分红资产的美元价格:true(默认)用 DefiLlama + 链上池子,也可以传自己的 PriceSource,false 不查 */
76
+ prices?: boolean | PriceSource;
77
+ fetch?: typeof fetch;
78
+ /** 包含没有可领取分红的代币(默认 false,只返回 claimable > 0 的) */
79
+ includeZero?: boolean;
80
+ }
81
+ export interface DividendsResult {
82
+ items: DividendItem[];
83
+ /** 检查过但识别不了的代币(不是税收代币、没有分红合约、合约函数不符) */
84
+ unsupported: DividendUnsupported[];
85
+ /** discover 的扫描状态:cursor 是已扫到的区块,progress 可以存下来下次接着扫 */
86
+ scan?: {
87
+ cursor: number;
88
+ progress: LogScanProgress | null;
89
+ tokens: string[];
90
+ };
91
+ /** 查价格出错时的信息(这时 usd 都是 null) */
92
+ priceError?: string;
93
+ }
94
+ /** 发现持有人收到过的 Flap 税收代币(只发现,不核对有没有分红:把 tokens 交给 dividends) */
95
+ export declare function scanDividendTokens(provider: Provider, owner: string, options?: DividendScanOptions): Promise<{
96
+ tokens: string[];
97
+ cursor: number;
98
+ progress: LogScanProgress | null;
99
+ }>;
100
+ /**
101
+ * 查持有人在 Flap 代币上的分红:余额、可领取数量、已领取数量、分红资产和美元价值。
102
+ * 代币来自 tokens 和 discover(扫描收到过的 Transfer),每个代币都在链上核对(dividendContract() + Dividend 合约的函数),
103
+ * 核对不过的放进 unsupported。不发送交易
104
+ */
105
+ export declare function dividends(provider: Provider, owner: string, options?: DividendsOptions): Promise<DividendsResult>;
106
+ export interface ClaimDividendTx {
107
+ to: string;
108
+ data: string;
109
+ value: '0';
110
+ item: DividendItem;
111
+ }
112
+ /**
113
+ * 领取分红要发的交易(不签名):每个代币一笔 `withdrawDividendsFor(owner)`,发给它的 Dividend 合约,款项直接到 owner。
114
+ * 只包含 claimable > 0 的项。只校验 owner / dividendContract 是合法地址,不连链:items 来自调用方,
115
+ * 要确认 dividendContract 确实是代币自己的 Dividend 合约,用 claimDividends(发送前会在链上核对)
116
+ */
117
+ export declare function buildClaimDividends(items: readonly DividendItem[]): ClaimDividendTx[];
118
+ export interface ClaimDividendsOptions extends BatchCallOptions {
119
+ /** 发送前先用 /simulate 模拟每一笔(claimable 只是查询时的快照,可能已经变了),会 revert 的不发(结果 status 为 'skipped',error 是原因)。默认 true,false 不模拟;dryRun 只预估 gas */
120
+ simulate?: boolean;
121
+ }
122
+ export interface ClaimDividendResult extends WriteResult {
123
+ item: DividendItem;
124
+ }
125
+ /**
126
+ * 领取分红:构建(同 buildClaimDividends)后用 from 签名发送,钱包和选项同 batchCall
127
+ * (mode: '7702' / '4337' / '5792' 时合成一笔原子交易)。任何人都可以替持有人领取,款项直接到 item.owner,所以 from 不必是持有人(如代付 gas)。
128
+ *
129
+ * ```ts
130
+ * const { items } = await getDividends(user, { chainId: 56, discover: true })
131
+ * await claimDividends(provider, key, items, { mode: '7702' })
132
+ * ```
133
+ */
134
+ export declare function claimDividends(provider: Provider, from: SignerInput, items: readonly DividendItem[], options?: ClaimDividendsOptions): Promise<ClaimDividendResult[]>;
135
+ //# sourceMappingURL=dividends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dividends.d.ts","sourceRoot":"","sources":["../src/dividends.ts"],"names":[],"mappings":"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"}