@w3lib/evm-batch-call 0.7.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.
- package/CHANGELOG.md +30 -0
- package/README.md +206 -1
- package/dist/dividends.d.ts +135 -0
- package/dist/dividends.d.ts.map +1 -0
- package/dist/dividends.js +253 -0
- package/dist/dividends.js.map +1 -0
- package/dist/history.d.ts +154 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +247 -0
- package/dist/history.js.map +1 -0
- package/dist/historySources.d.ts +32 -0
- package/dist/historySources.d.ts.map +1 -0
- package/dist/historySources.js +319 -0
- package/dist/historySources.js.map +1 -0
- package/dist/liquidity/v3.d.ts +2 -0
- package/dist/liquidity/v3.d.ts.map +1 -1
- package/dist/liquidity/v3.js +1 -1
- package/dist/liquidity/v3.js.map +1 -1
- package/dist/liquidity/v4.d.ts +21 -0
- package/dist/liquidity/v4.d.ts.map +1 -1
- package/dist/liquidity/v4.js +4 -3
- package/dist/liquidity/v4.js.map +1 -1
- package/dist/lp.d.ts +8 -0
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +17 -1
- package/dist/lp.js.map +1 -1
- package/dist/lpV4.d.ts +4 -0
- package/dist/lpV4.d.ts.map +1 -1
- package/dist/lpV4.js +27 -3
- package/dist/lpV4.js.map +1 -1
- package/dist/permit.d.ts +137 -0
- package/dist/permit.d.ts.map +1 -0
- package/dist/permit.js +355 -0
- package/dist/permit.js.map +1 -0
- package/dist/portfolio.d.ts +2 -0
- package/dist/portfolio.d.ts.map +1 -1
- package/dist/portfolio.js +9 -4
- package/dist/portfolio.js.map +1 -1
- package/dist/rewards/farms.d.ts +26 -0
- package/dist/rewards/farms.d.ts.map +1 -0
- package/dist/rewards/farms.js +210 -0
- package/dist/rewards/farms.js.map +1 -0
- package/dist/rewards/index.d.ts +42 -0
- package/dist/rewards/index.d.ts.map +1 -0
- package/dist/rewards/index.js +382 -0
- package/dist/rewards/index.js.map +1 -0
- package/dist/rewards/types.d.ts +170 -0
- package/dist/rewards/types.d.ts.map +1 -0
- package/dist/rewards/types.js +2 -0
- package/dist/rewards/types.js.map +1 -0
- package/dist/simulate.d.ts +186 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +559 -0
- package/dist/simulate.js.map +1 -0
- package/dist/simulateDecode.d.ts +33 -0
- package/dist/simulateDecode.d.ts.map +1 -0
- package/dist/simulateDecode.js +321 -0
- package/dist/simulateDecode.js.map +1 -0
- package/dist/smartAccount/account.d.ts +31 -0
- package/dist/smartAccount/account.d.ts.map +1 -0
- package/dist/smartAccount/account.js +33 -0
- package/dist/smartAccount/account.js.map +1 -0
- package/dist/smartAccount/clients.d.ts +77 -0
- package/dist/smartAccount/clients.d.ts.map +1 -0
- package/dist/smartAccount/clients.js +122 -0
- package/dist/smartAccount/clients.js.map +1 -0
- package/dist/smartAccount/eip5792.d.ts +77 -0
- package/dist/smartAccount/eip5792.d.ts.map +1 -0
- package/dist/smartAccount/eip5792.js +152 -0
- package/dist/smartAccount/eip5792.js.map +1 -0
- package/dist/smartAccount/send.d.ts +40 -0
- package/dist/smartAccount/send.d.ts.map +1 -0
- package/dist/smartAccount/send.js +271 -0
- package/dist/smartAccount/send.js.map +1 -0
- package/dist/smartAccount/userOp.d.ts +91 -0
- package/dist/smartAccount/userOp.d.ts.map +1 -0
- package/dist/smartAccount/userOp.js +124 -0
- package/dist/smartAccount/userOp.js.map +1 -0
- package/dist/subpaths/dividends.d.ts +28 -0
- package/dist/subpaths/dividends.d.ts.map +1 -0
- package/dist/subpaths/dividends.js +29 -0
- package/dist/subpaths/dividends.js.map +1 -0
- package/dist/subpaths/history.d.ts +22 -0
- package/dist/subpaths/history.d.ts.map +1 -0
- package/dist/subpaths/history.js +23 -0
- package/dist/subpaths/history.js.map +1 -0
- package/dist/subpaths/permit.d.ts +14 -0
- package/dist/subpaths/permit.d.ts.map +1 -0
- package/dist/subpaths/permit.js +14 -0
- package/dist/subpaths/permit.js.map +1 -0
- package/dist/subpaths/price.js +2 -2
- package/dist/subpaths/price.js.map +1 -1
- package/dist/subpaths/rewards.d.ts +27 -0
- package/dist/subpaths/rewards.d.ts.map +1 -0
- package/dist/subpaths/rewards.js +25 -0
- package/dist/subpaths/rewards.js.map +1 -0
- package/dist/subpaths/simulate.d.ts +25 -0
- package/dist/subpaths/simulate.d.ts.map +1 -0
- package/dist/subpaths/simulate.js +28 -0
- package/dist/subpaths/simulate.js.map +1 -0
- package/dist/subpaths/smart-account.d.ts +24 -0
- package/dist/subpaths/smart-account.d.ts.map +1 -0
- package/dist/subpaths/smart-account.js +24 -0
- package/dist/subpaths/smart-account.js.map +1 -0
- package/dist/swap.d.ts +45 -5
- package/dist/swap.d.ts.map +1 -1
- package/dist/swap.js +108 -12
- package/dist/swap.js.map +1 -1
- package/dist/write/batch.d.ts +34 -2
- package/dist/write/batch.d.ts.map +1 -1
- package/dist/write/batch.js +22 -3
- package/dist/write/batch.js.map +1 -1
- package/dist/write/collect.d.ts +9 -0
- package/dist/write/collect.d.ts.map +1 -1
- package/dist/write/collect.js +41 -1
- package/dist/write/collect.js.map +1 -1
- package/dist/write/send.d.ts +4 -0
- package/dist/write/send.d.ts.map +1 -1
- package/dist/write/send.js.map +1 -1
- package/dist/write/signer.d.ts +5 -1
- package/dist/write/signer.d.ts.map +1 -1
- package/dist/write/signer.js.map +1 -1
- package/dist/write/transfer.d.ts +5 -3
- package/dist/write/transfer.d.ts.map +1 -1
- package/dist/write/transfer.js +12 -6
- package/dist/write/transfer.js.map +1 -1
- package/package.json +35 -1
- package/src/dividends.ts +360 -0
- package/src/history.ts +367 -0
- package/src/historySources.ts +360 -0
- package/src/liquidity/v3.ts +1 -1
- package/src/liquidity/v4.ts +4 -3
- package/src/lp.ts +18 -1
- package/src/lpV4.ts +32 -2
- package/src/permit.ts +457 -0
- package/src/portfolio.ts +11 -4
- package/src/rewards/farms.ts +229 -0
- package/src/rewards/index.ts +431 -0
- package/src/rewards/types.ts +179 -0
- package/src/simulate.ts +727 -0
- package/src/simulateDecode.ts +352 -0
- package/src/smartAccount/account.ts +63 -0
- package/src/smartAccount/clients.ts +180 -0
- package/src/smartAccount/eip5792.ts +187 -0
- package/src/smartAccount/send.ts +341 -0
- package/src/smartAccount/userOp.ts +180 -0
- package/src/subpaths/dividends.ts +47 -0
- package/src/subpaths/history.ts +41 -0
- package/src/subpaths/permit.ts +39 -0
- package/src/subpaths/price.ts +2 -2
- package/src/subpaths/rewards.ts +46 -0
- package/src/subpaths/simulate.ts +51 -0
- package/src/subpaths/smart-account.ts +40 -0
- package/src/swap.ts +139 -18
- package/src/write/batch.ts +44 -5
- package/src/write/collect.ts +60 -1
- package/src/write/send.ts +4 -0
- package/src/write/signer.ts +5 -1
- package/src/write/transfer.ts +17 -10
package/dist/write/transfer.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type BigNumberish } from 'ethers';
|
|
2
2
|
import type { Provider } from '../provider.js';
|
|
3
|
+
import { type BatchCallOptions } from './batch.js';
|
|
3
4
|
import { type SendOptions, type TronSendOptions, type WriteResult } from './send.js';
|
|
4
5
|
import { type SignerInput } from './signer.js';
|
|
5
6
|
/**
|
|
@@ -21,10 +22,11 @@ export interface TransferItem {
|
|
|
21
22
|
* - 'disperse'(默认):通过 Disperse 合约,每种代币每 batchSize 个收款人一笔交易。以下情况自动改为逐笔发送:
|
|
22
23
|
* 链上没有 Disperse 合约;某种代币只有一个收款人;某一批预估 revert(收款地址拒收主币、转账收税的代币等,逐笔发送能把出问题的那一个单独标成失败)
|
|
23
24
|
* - 'tx':每个收款人一笔交易
|
|
24
|
-
* - '7702':EIP-7702 批量执行,每 batchSize 个收款人一笔(见 BatchCallOptions.mode
|
|
25
|
+
* - '7702':EIP-7702 批量执行,每 batchSize 个收款人一笔(见 BatchCallOptions.mode);传 sponsor 时由 sponsor 代付 gas
|
|
26
|
+
* - '4337' / '5792':智能账户 UserOperation / 浏览器钱包 wallet_sendCalls,每 batchSize 个收款人一笔、原子执行(见 BatchCallOptions.mode)
|
|
25
27
|
*/
|
|
26
|
-
export type TransferMode = 'disperse' | 'tx' | '7702';
|
|
27
|
-
export interface BatchTransferOptions extends SendOptions, TronSendOptions {
|
|
28
|
+
export type TransferMode = 'disperse' | 'tx' | '7702' | '4337' | '5792';
|
|
29
|
+
export interface BatchTransferOptions extends SendOptions, TronSendOptions, Pick<BatchCallOptions, 'sponsor' | 'smartAccount' | 'eip1193' | 'atomicRequired' | 'capabilities'> {
|
|
28
30
|
/** 默认转的代币,默认主币(NATIVE_TOKEN);每项也可以单独指定 token */
|
|
29
31
|
token?: string;
|
|
30
32
|
mode?: TransferMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAGxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAGxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAA0B,KAAK,gBAAgB,EAAuB,MAAM,YAAY,CAAA;AAE/F,OAAO,EAAyC,KAAK,WAAW,EAAE,KAAK,eAAe,EAA8B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AACvJ,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAElF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,+CAA+C,CAAA;AAQ5E,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,kCAAkC;IAClC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvE,MAAM,WAAW,oBAAqB,SAAQ,WAAW,EAAE,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,gBAAgB,GAAG,cAAc,CAAC;IAC5K,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAwB;AACxB,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,eAAe;IACf,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,sCAAsC;IACtC,GAAG,EAAE,YAAY,CAAA;IACjB;;;OAGG;IACH,SAAS,EAAE,aAAa,EAAE,CAAA;CAC3B;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAA;CACf;AAeD,UAAU;AACV,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAaD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAmB7K"}
|
package/dist/write/transfer.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Interface, getAddress, getBigInt, parseUnits } from 'ethers';
|
|
2
2
|
import { ERC20_ABI, NATIVE_TOKEN, formatUnits } from '../erc20.js';
|
|
3
|
-
import {
|
|
3
|
+
import { sendByMode, tronModule } from './batch.js';
|
|
4
4
|
import { WriteRpc } from './rpc.js';
|
|
5
5
|
import { emptyOutcome, sendJobs, toWriteResult } from './send.js';
|
|
6
6
|
import { resolveSigner } from './signer.js';
|
|
@@ -53,9 +53,15 @@ export async function batchTransfer(provider, from, recipients, options = {}) {
|
|
|
53
53
|
}
|
|
54
54
|
const rpc = await WriteRpc.from(provider);
|
|
55
55
|
const signer = await resolveSigner(from);
|
|
56
|
-
const planned = await plan(provider, signer.address, recipients, options);
|
|
57
56
|
const mode = options.mode ?? 'disperse';
|
|
58
|
-
|
|
57
|
+
// 4337 的 SimpleAccount:资产在账户地址里,不是 owner 的地址
|
|
58
|
+
let holder = signer.address;
|
|
59
|
+
if (mode === '4337' && (options.smartAccount?.account ?? 'simple') === 'simple') {
|
|
60
|
+
const { getSimpleAccountAddress } = await import('../smartAccount/account.js');
|
|
61
|
+
holder = await getSimpleAccountAddress(rpc, signer.address, options.smartAccount?.entryPoint ?? '0.7', options.smartAccount?.salt, options.smartAccount?.factory);
|
|
62
|
+
}
|
|
63
|
+
const planned = await plan(provider, holder, recipients, options);
|
|
64
|
+
if (mode !== 'disperse') {
|
|
59
65
|
return sendDirect(rpc, signer, planned, mode, options);
|
|
60
66
|
}
|
|
61
67
|
return sendDisperse(rpc, provider, signer, planned, options);
|
|
@@ -123,7 +129,7 @@ function toTransferResult(p, result, via) {
|
|
|
123
129
|
approvals: [],
|
|
124
130
|
};
|
|
125
131
|
}
|
|
126
|
-
/** 'tx' / '7702':直接转账 */
|
|
132
|
+
/** 'tx' / '7702' / '4337' / '5792':直接转账 */
|
|
127
133
|
async function sendDirect(rpc, signer, planned, mode, options) {
|
|
128
134
|
const calls = planned.map((p) => transferCall(signer, p));
|
|
129
135
|
const callOptions = {
|
|
@@ -132,7 +138,7 @@ async function sendDirect(rpc, signer, planned, mode, options) {
|
|
|
132
138
|
continueOnError: true,
|
|
133
139
|
onUpdate: options.onUpdate && ((r) => options.onUpdate?.(toTransferResult(planned[r.index], r, mode))),
|
|
134
140
|
};
|
|
135
|
-
const results =
|
|
141
|
+
const results = await sendByMode(rpc, calls, callOptions);
|
|
136
142
|
return results.map((r, i) => toTransferResult(planned[i], r, mode));
|
|
137
143
|
}
|
|
138
144
|
/** 预估 / 执行时合约 revert(换成逐笔发送可能成功,或至少能定位到是哪个收款项) */
|
|
@@ -233,7 +239,7 @@ async function sendDisperse(rpc, provider, signer, planned, options) {
|
|
|
233
239
|
if (direct.length && !options.signal?.aborted) {
|
|
234
240
|
direct.sort((a, b) => a.index - b.index);
|
|
235
241
|
const calls = direct.map((p) => transferCall(signer, p));
|
|
236
|
-
await
|
|
242
|
+
await sendByMode(rpc, calls, {
|
|
237
243
|
...options,
|
|
238
244
|
mode: 'tx',
|
|
239
245
|
continueOnError: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@w3lib/evm-batch-call",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Batched EVM/Tron contract reads via Multicall3 with deployless fallback, native balances, RPC failover, auto-batching and staticCall simulation; batch transfer, collect and contract calls (Disperse / EIP-7702). ethcall compatible.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ethers",
|
|
@@ -36,6 +36,14 @@
|
|
|
36
36
|
"types": "./dist/subpaths/liquidity.d.ts",
|
|
37
37
|
"import": "./dist/subpaths/liquidity.js"
|
|
38
38
|
},
|
|
39
|
+
"./rewards": {
|
|
40
|
+
"types": "./dist/subpaths/rewards.d.ts",
|
|
41
|
+
"import": "./dist/subpaths/rewards.js"
|
|
42
|
+
},
|
|
43
|
+
"./dividends": {
|
|
44
|
+
"types": "./dist/subpaths/dividends.d.ts",
|
|
45
|
+
"import": "./dist/subpaths/dividends.js"
|
|
46
|
+
},
|
|
39
47
|
"./approvals": {
|
|
40
48
|
"types": "./dist/subpaths/approvals.d.ts",
|
|
41
49
|
"import": "./dist/subpaths/approvals.js"
|
|
@@ -64,6 +72,22 @@
|
|
|
64
72
|
"types": "./dist/subpaths/swap.d.ts",
|
|
65
73
|
"import": "./dist/subpaths/swap.js"
|
|
66
74
|
},
|
|
75
|
+
"./permit": {
|
|
76
|
+
"types": "./dist/subpaths/permit.d.ts",
|
|
77
|
+
"import": "./dist/subpaths/permit.js"
|
|
78
|
+
},
|
|
79
|
+
"./smart-account": {
|
|
80
|
+
"types": "./dist/subpaths/smart-account.d.ts",
|
|
81
|
+
"import": "./dist/subpaths/smart-account.js"
|
|
82
|
+
},
|
|
83
|
+
"./history": {
|
|
84
|
+
"types": "./dist/subpaths/history.d.ts",
|
|
85
|
+
"import": "./dist/subpaths/history.js"
|
|
86
|
+
},
|
|
87
|
+
"./simulate": {
|
|
88
|
+
"types": "./dist/subpaths/simulate.d.ts",
|
|
89
|
+
"import": "./dist/subpaths/simulate.js"
|
|
90
|
+
},
|
|
67
91
|
"./write": {
|
|
68
92
|
"types": "./dist/subpaths/write.d.ts",
|
|
69
93
|
"import": "./dist/subpaths/write.js"
|
|
@@ -109,6 +133,16 @@
|
|
|
109
133
|
"test:live:lp": "LIVE=1 vitest run test/lp-live.test.ts",
|
|
110
134
|
"test:live:liquidity": "LIVE=1 vitest run test/liquidity-tron-live.test.ts",
|
|
111
135
|
"test:fork": "vitest run test/liquidity-fork.test.ts",
|
|
136
|
+
"test:live:simulate": "LIVE=1 vitest run test/simulate-live.test.ts",
|
|
137
|
+
"test:live:history": "LIVE=1 vitest run test/history-live.test.ts",
|
|
138
|
+
"test:live:smart-account": "LIVE=1 vitest run test/smart-account-live.test.ts",
|
|
139
|
+
"test:live:rewards": "LIVE=1 vitest run test/rewards-live.test.ts",
|
|
140
|
+
"test:live:dividends": "LIVE=1 vitest run test/dividends-live.test.ts",
|
|
141
|
+
"test:fork:simulate": "vitest run test/simulate-fork.test.ts",
|
|
142
|
+
"test:fork:smart-account": "vitest run test/smart-account-fork.test.ts",
|
|
143
|
+
"test:fork:permit": "vitest run test/permit-fork.test.ts",
|
|
144
|
+
"test:fork:rewards": "vitest run test/rewards-fork.test.ts",
|
|
145
|
+
"test:fork:dividends": "vitest run test/dividends-fork.test.ts",
|
|
112
146
|
"build:contracts": "node scripts/build-contracts.mjs",
|
|
113
147
|
"check:rpc": "node scripts/check-rpc-nodes.mjs",
|
|
114
148
|
"demo": "vite demo",
|
package/src/dividends.ts
ADDED
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flap(flap.sh,BNB Chain 发币平台)的分红:持有带分红的 Flap 税收代币(FlapTaxToken)的地址按持仓比例分到税收,
|
|
3
|
+
* 分红放在每个代币自己的 Dividend 合约里,持有人(或任何人替持有人)调用 withdrawDividendsFor 领取。
|
|
4
|
+
*
|
|
5
|
+
* 核实过的合约(BSC 主网,2026-10 在主网分叉上实测):
|
|
6
|
+
* - 代币:`dividendContract()` 返回它的 Dividend 合约(Tax Token V3 总是部署;V2 只在 dividendBps > 0 时部署)
|
|
7
|
+
* - Dividend 合约(EIP-1167 克隆,实现 0xd67447C2…5905,Sourcify / BscScan 上未验证源码,函数靠官方文档 + 链上调用核对):
|
|
8
|
+
* `dividendToken()`、`weth()`、`minimumShareBalance()`、`withdrawableDividends(address)`、`withdrawnDividends(address)`、
|
|
9
|
+
* `withdrawDividendsFor(address)`(任何人可调,款项直接到持有人)
|
|
10
|
+
* - 官方 TaxTokenHelper(0x53841c73…8346)的 `getDividendInfo(token, user) → (claimed, pending)` 与上面两个函数结果一致(测试里交叉核对)
|
|
11
|
+
*
|
|
12
|
+
* 只有一种合约形态,所以只有一个适配器(flap);识别不了的代币(没有 dividendContract() 或 Dividend 合约缺函数)放进 unsupported,
|
|
13
|
+
* 不猜函数。
|
|
14
|
+
*/
|
|
15
|
+
import { Interface, getAddress } from 'ethers'
|
|
16
|
+
|
|
17
|
+
import { NATIVE_TOKEN, formatUnits } from './erc20.js'
|
|
18
|
+
import type { Provider } from './provider.js'
|
|
19
|
+
import { runLogScan, type LogScanProgress } from './scan.js'
|
|
20
|
+
import type { PriceSource } from './price.js'
|
|
21
|
+
import { isTronChain } from './tron.js'
|
|
22
|
+
import type { BatchCallOptions } from './write/batch.js'
|
|
23
|
+
import type { WriteResult } from './write/send.js'
|
|
24
|
+
import type { SignerInput } from './write/signer.js'
|
|
25
|
+
|
|
26
|
+
/** 支持的链:目前只有 BSC(Flap 在 Base、X Layer 等链上也有部署,但没有核实过,不开放) */
|
|
27
|
+
export const FLAP_DIVIDEND_CHAINS: Readonly<Record<number, { portal: string; taxTokenHelper: string; swapRegistry: string }>> = {
|
|
28
|
+
56: {
|
|
29
|
+
portal: '0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0',
|
|
30
|
+
taxTokenHelper: '0x53841c73217735F37BC1775538b03b23feFD8346',
|
|
31
|
+
swapRegistry: '0x644A8f560138418bAD4EdEFC7c17878a3c2fBEB6',
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Flap 代币地址的靓号后缀(Portal 创建时用):税收代币是 7777,普通代币是 8888(实测也有 8888 的代币带分红合约);发现持仓时只收这类地址 */
|
|
36
|
+
export const FLAP_TOKEN_SUFFIXES: readonly string[] = ['7777', '8888']
|
|
37
|
+
|
|
38
|
+
const TOKEN_ABI = [
|
|
39
|
+
'function dividendContract() view returns (address)',
|
|
40
|
+
'function balanceOf(address) view returns (uint256)',
|
|
41
|
+
'function symbol() view returns (string)',
|
|
42
|
+
'function decimals() view returns (uint8)',
|
|
43
|
+
]
|
|
44
|
+
const DIVIDEND_ABI = [
|
|
45
|
+
'function dividendToken() view returns (address)',
|
|
46
|
+
'function weth() view returns (address)',
|
|
47
|
+
'function minimumShareBalance() view returns (uint256)',
|
|
48
|
+
'function withdrawableDividends(address) view returns (uint256)',
|
|
49
|
+
'function withdrawnDividends(address) view returns (uint256)',
|
|
50
|
+
]
|
|
51
|
+
const ERC20_META_ABI = ['function symbol() view returns (string)', 'function decimals() view returns (uint8)']
|
|
52
|
+
const claimInterface = new Interface(['function withdrawDividendsFor(address user)'])
|
|
53
|
+
const ZERO = '0x0000000000000000000000000000000000000000'
|
|
54
|
+
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
|
|
55
|
+
|
|
56
|
+
/** 一次最多检查的代币数(防止传入或发现的列表无限大) */
|
|
57
|
+
const MAX_TOKENS = 200
|
|
58
|
+
|
|
59
|
+
export interface DividendItem {
|
|
60
|
+
/** 持有人 */
|
|
61
|
+
owner: string
|
|
62
|
+
/** 带分红的 Flap 代币 */
|
|
63
|
+
token: string
|
|
64
|
+
symbol: string | null
|
|
65
|
+
decimals: number
|
|
66
|
+
/** 持有人当前的代币余额(可以是 0:卖掉后之前累计的分红仍可领取) */
|
|
67
|
+
balance: string
|
|
68
|
+
/** 这个代币的 Dividend 合约(领取的目标) */
|
|
69
|
+
dividendContract: string
|
|
70
|
+
/** Dividend 合约里配置的分红代币地址(WBNB 也是这个地址) */
|
|
71
|
+
dividendToken: string
|
|
72
|
+
/** 实际收到的资产:'native'(分红代币是 WBNB 时领取会解包成 BNB)或分红代币地址 */
|
|
73
|
+
asset: 'native' | string
|
|
74
|
+
assetSymbol: string | null
|
|
75
|
+
assetDecimals: number
|
|
76
|
+
/** 分红资产的 decimals 读不到(节点出错等):assetDecimals 按 18 估,claimableFormatted 可能不准,usd 固定为 null */
|
|
77
|
+
decimalsUnknown?: boolean
|
|
78
|
+
/** 当前可领取的数量(asset 的最小单位),领取时就是收到的数量 */
|
|
79
|
+
claimable: string
|
|
80
|
+
claimableFormatted: string
|
|
81
|
+
/** 已经领取过的累计数量 */
|
|
82
|
+
claimed: string
|
|
83
|
+
claimedFormatted: string
|
|
84
|
+
/** 可领取部分的美元价值;没开价格或没有价格时为 null */
|
|
85
|
+
usd: number | null
|
|
86
|
+
/** 持有人要持有至少这么多代币才会继续累计新的分红(已累计的不受影响) */
|
|
87
|
+
minimumShareBalance: string
|
|
88
|
+
/** 当前余额是否达到 minimumShareBalance(false 时新的分红不再累计,但 claimable 仍可领取) */
|
|
89
|
+
accruing: boolean
|
|
90
|
+
/** 适配器名称 */
|
|
91
|
+
adapter: 'flap'
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface DividendUnsupported {
|
|
95
|
+
token: string
|
|
96
|
+
reason: string
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface DividendScanOptions {
|
|
100
|
+
/** 收哪些后缀的代币地址,默认 FLAP_TOKEN_SUFFIXES */
|
|
101
|
+
suffixes?: readonly string[]
|
|
102
|
+
/** 起点区块(含);不传时往回扫 lookbackBlocks 个区块 */
|
|
103
|
+
fromBlock?: number
|
|
104
|
+
/** 不传 fromBlock 时往回扫多少个区块,默认 5000 */
|
|
105
|
+
lookbackBlocks?: number
|
|
106
|
+
/** 上次的进度(结果的 scan.progress),传了就接着扫 */
|
|
107
|
+
progress?: LogScanProgress
|
|
108
|
+
/** 单次 getLogs 的最大区块范围,默认 1000;节点有上限时自动缩小 */
|
|
109
|
+
blockRange?: number
|
|
110
|
+
/** 这次最多发多少个 getLogs,默认 10 */
|
|
111
|
+
maxRequests?: number
|
|
112
|
+
/** 这次最多花多少毫秒,默认 10000 */
|
|
113
|
+
timeBudget?: number
|
|
114
|
+
signal?: AbortSignal
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface DividendsOptions {
|
|
118
|
+
/** 要检查的代币(Flap 代币地址)。可以和 discover 一起用 */
|
|
119
|
+
tokens?: readonly string[]
|
|
120
|
+
/** 从持有人收到过的 Transfer 事件里发现 Flap 代币(只收靓号后缀 7777 / 8888 的地址,再逐个核对;发现的代币里没有分红合约的不报告),true 用默认值 */
|
|
121
|
+
discover?: boolean | DividendScanOptions
|
|
122
|
+
/** 查分红资产的美元价格:true(默认)用 DefiLlama + 链上池子,也可以传自己的 PriceSource,false 不查 */
|
|
123
|
+
prices?: boolean | PriceSource
|
|
124
|
+
fetch?: typeof fetch
|
|
125
|
+
/** 包含没有可领取分红的代币(默认 false,只返回 claimable > 0 的) */
|
|
126
|
+
includeZero?: boolean
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface DividendsResult {
|
|
130
|
+
items: DividendItem[]
|
|
131
|
+
/** 检查过但识别不了的代币(不是税收代币、没有分红合约、合约函数不符) */
|
|
132
|
+
unsupported: DividendUnsupported[]
|
|
133
|
+
/** discover 的扫描状态:cursor 是已扫到的区块,progress 可以存下来下次接着扫 */
|
|
134
|
+
scan?: { cursor: number; progress: LogScanProgress | null; tokens: string[] }
|
|
135
|
+
/** 查价格出错时的信息(这时 usd 都是 null) */
|
|
136
|
+
priceError?: string
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function assertChain(chainId: number): void {
|
|
140
|
+
if (isTronChain(chainId) || !FLAP_DIVIDEND_CHAINS[chainId]) {
|
|
141
|
+
throw new Error(`Flap dividends are only supported on BNB Chain (56), got chain ${chainId}`)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** 发现持有人收到过的 Flap 税收代币(只发现,不核对有没有分红:把 tokens 交给 dividends) */
|
|
146
|
+
export async function scanDividendTokens(provider: Provider, owner: string, options: DividendScanOptions = {}): Promise<{ tokens: string[]; cursor: number; progress: LogScanProgress | null }> {
|
|
147
|
+
assertChain(await provider.getChainId())
|
|
148
|
+
const ownerTopic = `0x${getAddress(owner).slice(2).toLowerCase().padStart(64, '0')}`
|
|
149
|
+
const lookback = Math.max(0, Math.floor(options.lookbackBlocks ?? 5000))
|
|
150
|
+
const suffixes = (options.suffixes ?? FLAP_TOKEN_SUFFIXES).map((x) => x.toLowerCase())
|
|
151
|
+
const progress = await runLogScan({
|
|
152
|
+
provider,
|
|
153
|
+
saved: options.progress,
|
|
154
|
+
initialCursor: (target) => (options.fromBlock !== undefined ? options.fromBlock - 1 : target - lookback),
|
|
155
|
+
filter: { topics: [TRANSFER_TOPIC, null, ownerTopic] },
|
|
156
|
+
// 只收 ERC20 的 Transfer(3 个 topic)里靓号后缀的合约
|
|
157
|
+
collect: (log) => (log.topics.length === 3 && suffixes.some((s) => log.address.toLowerCase().endsWith(s)) ? log.address.toLowerCase() : null),
|
|
158
|
+
maxRange: Math.max(1, Math.floor(options.blockRange ?? 1000)),
|
|
159
|
+
maxRequests: Math.max(1, Math.floor(options.maxRequests ?? 10)),
|
|
160
|
+
timeBudget: options.timeBudget ?? 10_000,
|
|
161
|
+
confirmations: 0,
|
|
162
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
163
|
+
})
|
|
164
|
+
return { tokens: (progress?.items ?? []).map((a) => getAddress(a)), cursor: progress?.cursor ?? -1, progress }
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* 查持有人在 Flap 代币上的分红:余额、可领取数量、已领取数量、分红资产和美元价值。
|
|
169
|
+
* 代币来自 tokens 和 discover(扫描收到过的 Transfer),每个代币都在链上核对(dividendContract() + Dividend 合约的函数),
|
|
170
|
+
* 核对不过的放进 unsupported。不发送交易
|
|
171
|
+
*/
|
|
172
|
+
export async function dividends(provider: Provider, owner: string, options: DividendsOptions = {}): Promise<DividendsResult> {
|
|
173
|
+
const chainId = await provider.getChainId()
|
|
174
|
+
assertChain(chainId)
|
|
175
|
+
const holder = getAddress(owner)
|
|
176
|
+
|
|
177
|
+
let scan: DividendsResult['scan']
|
|
178
|
+
const found = new Map<string, string>()
|
|
179
|
+
const explicit = new Set<string>()
|
|
180
|
+
for (const t of options.tokens ?? []) {
|
|
181
|
+
found.set(getAddress(t).toLowerCase(), getAddress(t))
|
|
182
|
+
explicit.add(getAddress(t).toLowerCase())
|
|
183
|
+
}
|
|
184
|
+
if (options.discover) {
|
|
185
|
+
const r = await scanDividendTokens(provider, holder, options.discover === true ? {} : options.discover)
|
|
186
|
+
scan = { cursor: r.cursor, progress: r.progress, tokens: r.tokens }
|
|
187
|
+
for (const t of r.tokens) found.set(t.toLowerCase(), t)
|
|
188
|
+
}
|
|
189
|
+
const tokens = [...found.values()]
|
|
190
|
+
if (tokens.length > MAX_TOKENS) throw new Error(`Too many tokens (${tokens.length}), at most ${MAX_TOKENS} per call`)
|
|
191
|
+
const result: DividendsResult = { items: [], unsupported: [], ...(scan ? { scan } : {}) }
|
|
192
|
+
if (!tokens.length) return result
|
|
193
|
+
|
|
194
|
+
// 第一步:代币本身(余额、精度、Dividend 合约地址)
|
|
195
|
+
const stage1 = await provider.tryAll(tokens.flatMap((t) => [provider.contract(t, TOKEN_ABI).dividendContract(), provider.contract(t, TOKEN_ABI).balanceOf(holder), provider.contract(t, TOKEN_ABI).symbol(), provider.contract(t, TOKEN_ABI).decimals()]))
|
|
196
|
+
const valid: Array<{ token: string; dividend: string; balance: bigint; symbol: string | null; decimals: number }> = []
|
|
197
|
+
tokens.forEach((token, i) => {
|
|
198
|
+
const [dividend, balance, symbol, decimals] = stage1.slice(i * 4, i * 4 + 4) as [string | null, bigint | null, string | null, bigint | null]
|
|
199
|
+
if (dividend === null || dividend === ZERO) {
|
|
200
|
+
// 发现来的代币大多不是分红代币(普通 8888 代币等),只报告用户明确传入的
|
|
201
|
+
if (explicit.has(token.toLowerCase())) result.unsupported.push({ token, reason: dividend === null ? 'no dividendContract() (not a Flap tax token V2/V3)' : 'token has no dividend contract' })
|
|
202
|
+
} else if (balance === null || decimals === null) {
|
|
203
|
+
result.unsupported.push({ token, reason: 'not an ERC20 token' })
|
|
204
|
+
} else {
|
|
205
|
+
valid.push({ token, dividend, balance, symbol: typeof symbol === 'string' ? symbol : null, decimals: Number(decimals) })
|
|
206
|
+
}
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
// 第二步:Dividend 合约(分红代币、可领取、已领取、最低持仓)
|
|
210
|
+
const stage2 = valid.length
|
|
211
|
+
? await provider.tryAll(valid.flatMap((v) => {
|
|
212
|
+
const d = provider.contract(v.dividend, DIVIDEND_ABI)
|
|
213
|
+
return [d.dividendToken(), d.weth(), d.withdrawableDividends(holder), d.withdrawnDividends(holder), d.minimumShareBalance()]
|
|
214
|
+
}))
|
|
215
|
+
: []
|
|
216
|
+
const rows: Array<{ v: (typeof valid)[number]; dividendToken: string; weth: string | null; claimable: bigint; claimed: bigint; min: bigint }> = []
|
|
217
|
+
valid.forEach((v, i) => {
|
|
218
|
+
const [dividendToken, weth, claimable, claimed, min] = stage2.slice(i * 5, i * 5 + 5) as [string | null, string | null, bigint | null, bigint | null, bigint | null]
|
|
219
|
+
if (dividendToken === null || claimable === null || claimed === null || min === null) {
|
|
220
|
+
result.unsupported.push({ token: v.token, reason: 'dividend contract does not expose the expected functions (unknown generation)' })
|
|
221
|
+
} else {
|
|
222
|
+
rows.push({ v, dividendToken, weth, claimable, claimed, min })
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
// 第三步:分红资产的 symbol / decimals(WBNB 作为 BNB 领取:按主币处理)
|
|
227
|
+
const isNative = (r: (typeof rows)[number]) => r.dividendToken === ZERO || (r.weth !== null && r.dividendToken.toLowerCase() === r.weth.toLowerCase())
|
|
228
|
+
const assetTokens = [...new Set(rows.filter((r) => !isNative(r)).map((r) => r.dividendToken))]
|
|
229
|
+
const meta = new Map<string, { symbol: string | null; decimals: number; known: boolean }>()
|
|
230
|
+
if (assetTokens.length) {
|
|
231
|
+
const res = await provider.tryAll(assetTokens.flatMap((a) => [provider.contract(a, ERC20_META_ABI).symbol(), provider.contract(a, ERC20_META_ABI).decimals()]))
|
|
232
|
+
assetTokens.forEach((a, i) => meta.set(a, { symbol: typeof res[i * 2] === 'string' ? (res[i * 2] as string) : null, decimals: res[i * 2 + 1] === null ? 18 : Number(res[i * 2 + 1]), known: res[i * 2 + 1] !== null }))
|
|
233
|
+
}
|
|
234
|
+
const nativeMeta = { symbol: 'BNB', decimals: 18, known: true }
|
|
235
|
+
|
|
236
|
+
const items: DividendItem[] = rows.map((r) => {
|
|
237
|
+
const native = isNative(r)
|
|
238
|
+
const m = native ? nativeMeta : (meta.get(r.dividendToken) ?? { symbol: null, decimals: 18, known: false })
|
|
239
|
+
return {
|
|
240
|
+
owner: holder,
|
|
241
|
+
token: r.v.token,
|
|
242
|
+
symbol: r.v.symbol,
|
|
243
|
+
decimals: r.v.decimals,
|
|
244
|
+
balance: r.v.balance.toString(),
|
|
245
|
+
dividendContract: getAddress(r.v.dividend),
|
|
246
|
+
dividendToken: getAddress(r.dividendToken),
|
|
247
|
+
asset: native ? 'native' : getAddress(r.dividendToken),
|
|
248
|
+
assetSymbol: m.symbol,
|
|
249
|
+
assetDecimals: m.decimals,
|
|
250
|
+
...(m.known ? {} : { decimalsUnknown: true }),
|
|
251
|
+
claimable: r.claimable.toString(),
|
|
252
|
+
claimableFormatted: formatUnits(r.claimable, m.decimals),
|
|
253
|
+
claimed: r.claimed.toString(),
|
|
254
|
+
claimedFormatted: formatUnits(r.claimed, m.decimals),
|
|
255
|
+
usd: null,
|
|
256
|
+
minimumShareBalance: r.min.toString(),
|
|
257
|
+
accruing: r.v.balance >= r.min && r.v.balance > 0n,
|
|
258
|
+
adapter: 'flap',
|
|
259
|
+
}
|
|
260
|
+
})
|
|
261
|
+
const shown = options.includeZero ? items : items.filter((i) => BigInt(i.claimable) > 0n)
|
|
262
|
+
|
|
263
|
+
if (options.prices !== false && shown.length) {
|
|
264
|
+
try {
|
|
265
|
+
const { tokenPrices } = await import('./price.js')
|
|
266
|
+
const assets = [...new Set(shown.map((i) => (i.asset === 'native' ? NATIVE_TOKEN : i.asset)))]
|
|
267
|
+
const prices = await tokenPrices(provider, assets, { ...(typeof options.prices === 'object' ? { sources: [options.prices] } : {}), ...(options.fetch ? { fetch: options.fetch } : {}) })
|
|
268
|
+
const byAsset = new Map(prices.map((p) => [p.token.toLowerCase(), p.price]))
|
|
269
|
+
for (const i of shown) {
|
|
270
|
+
if (i.decimalsUnknown) continue // 精度未知,换算不出可信的美元价值
|
|
271
|
+
const price = byAsset.get((i.asset === 'native' ? NATIVE_TOKEN : i.asset).toLowerCase())
|
|
272
|
+
i.usd = price === null || price === undefined ? null : Number(i.claimableFormatted) * price
|
|
273
|
+
}
|
|
274
|
+
} catch (err) {
|
|
275
|
+
result.priceError = err instanceof Error ? err.message : String(err)
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
result.items = shown
|
|
279
|
+
return result
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
// 领取
|
|
284
|
+
// ---------------------------------------------------------------------------
|
|
285
|
+
|
|
286
|
+
export interface ClaimDividendTx {
|
|
287
|
+
to: string
|
|
288
|
+
data: string
|
|
289
|
+
value: '0'
|
|
290
|
+
item: DividendItem
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* 领取分红要发的交易(不签名):每个代币一笔 `withdrawDividendsFor(owner)`,发给它的 Dividend 合约,款项直接到 owner。
|
|
295
|
+
* 只包含 claimable > 0 的项。只校验 owner / dividendContract 是合法地址,不连链:items 来自调用方,
|
|
296
|
+
* 要确认 dividendContract 确实是代币自己的 Dividend 合约,用 claimDividends(发送前会在链上核对)
|
|
297
|
+
*/
|
|
298
|
+
export function buildClaimDividends(items: readonly DividendItem[]): ClaimDividendTx[] {
|
|
299
|
+
return items
|
|
300
|
+
.filter((item) => BigInt(item.claimable) > 0n)
|
|
301
|
+
.map((item) => {
|
|
302
|
+
if (item.adapter !== 'flap') throw new Error(`Unsupported dividend adapter for ${item.token}`)
|
|
303
|
+
let to: string
|
|
304
|
+
let owner: string
|
|
305
|
+
try {
|
|
306
|
+
to = getAddress(item.dividendContract)
|
|
307
|
+
owner = getAddress(item.owner)
|
|
308
|
+
} catch {
|
|
309
|
+
throw new Error(`Invalid dividendContract / owner address for ${item.token}`)
|
|
310
|
+
}
|
|
311
|
+
return { to, data: claimInterface.encodeFunctionData('withdrawDividendsFor', [owner]), value: '0' as const, item }
|
|
312
|
+
})
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export interface ClaimDividendsOptions extends BatchCallOptions {
|
|
316
|
+
/** 发送前先用 /simulate 模拟每一笔(claimable 只是查询时的快照,可能已经变了),会 revert 的不发(结果 status 为 'skipped',error 是原因)。默认 true,false 不模拟;dryRun 只预估 gas */
|
|
317
|
+
simulate?: boolean
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export interface ClaimDividendResult extends WriteResult {
|
|
321
|
+
item: DividendItem
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* 领取分红:构建(同 buildClaimDividends)后用 from 签名发送,钱包和选项同 batchCall
|
|
326
|
+
* (mode: '7702' / '4337' / '5792' 时合成一笔原子交易)。任何人都可以替持有人领取,款项直接到 item.owner,所以 from 不必是持有人(如代付 gas)。
|
|
327
|
+
*
|
|
328
|
+
* ```ts
|
|
329
|
+
* const { items } = await getDividends(user, { chainId: 56, discover: true })
|
|
330
|
+
* await claimDividends(provider, key, items, { mode: '7702' })
|
|
331
|
+
* ```
|
|
332
|
+
*/
|
|
333
|
+
export async function claimDividends(provider: Provider, from: SignerInput, items: readonly DividendItem[], options: ClaimDividendsOptions = {}): Promise<ClaimDividendResult[]> {
|
|
334
|
+
assertChain(await provider.getChainId())
|
|
335
|
+
const { simulate: preCheck = true, ...sendOptions } = options
|
|
336
|
+
const txs = buildClaimDividends(items)
|
|
337
|
+
if (!txs.length) return []
|
|
338
|
+
const skipped = new Map<number, string>()
|
|
339
|
+
// 核对 items 里的 dividendContract 确实是代币自己的 Dividend 合约(items 来自调用方,不能直接信)
|
|
340
|
+
const onChain = await provider.tryAll<string>(txs.map((tx) => provider.contract(tx.item.token, TOKEN_ABI).dividendContract()))
|
|
341
|
+
onChain.forEach((d, i) => {
|
|
342
|
+
if (d === null || (txs[i] as ClaimDividendTx).to.toLowerCase() !== d.toLowerCase()) {
|
|
343
|
+
skipped.set(i, `dividendContract mismatch: ${(txs[i] as ClaimDividendTx).to} is not the dividend contract of ${(txs[i] as ClaimDividendTx).item.token}`)
|
|
344
|
+
}
|
|
345
|
+
})
|
|
346
|
+
if (preCheck) {
|
|
347
|
+
const { simulate } = await import('./simulate.js')
|
|
348
|
+
const sims = await Promise.all(txs.map((tx, i): Promise<{ success: boolean; error?: string }> => skipped.has(i) ? Promise.resolve({ success: true }) : simulate(provider, { to: tx.to, data: tx.data, from: tx.item.owner }, { usd: false, risk: false }).catch((err: unknown) => ({ success: false, error: err instanceof Error ? err.message : String(err) }))))
|
|
349
|
+
sims.forEach((s, i) => !s.success && skipped.set(i, s.error ?? 'simulation failed'))
|
|
350
|
+
}
|
|
351
|
+
const send = txs.map((tx, i) => ({ tx, i })).filter(({ i }) => !skipped.has(i))
|
|
352
|
+
const { batchCall } = await import('./write/batch.js')
|
|
353
|
+
const sent = send.length ? await batchCall(provider, send.map(({ tx }) => ({ from, to: tx.to, data: tx.data })), { continueOnError: true, ...sendOptions }) : []
|
|
354
|
+
const sentBy = new Map(send.map(({ i }, k) => [i, sent[k] as WriteResult]))
|
|
355
|
+
return txs.map((tx, i) => {
|
|
356
|
+
const r = sentBy.get(i)
|
|
357
|
+
if (r) return { ...r, index: i, item: tx.item }
|
|
358
|
+
return { index: i, from: tx.item.owner, to: tx.to, status: 'skipped', hash: null, nonce: null, gasLimit: null, gasUsed: null, fee: null, blockNumber: null, error: skipped.get(i) ?? null, item: tx.item }
|
|
359
|
+
})
|
|
360
|
+
}
|