@w3lib/evm-batch-call 0.1.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/LICENSE +24 -0
- package/README.md +257 -0
- package/contracts/DeploylessMulticall3.sol +66 -0
- package/dist/aggregate.d.ts +27 -0
- package/dist/aggregate.d.ts.map +1 -0
- package/dist/aggregate.js +198 -0
- package/dist/aggregate.js.map +1 -0
- package/dist/batcher.d.ts +21 -0
- package/dist/batcher.d.ts.map +1 -0
- package/dist/batcher.js +100 -0
- package/dist/batcher.js.map +1 -0
- package/dist/call.d.ts +53 -0
- package/dist/call.d.ts.map +1 -0
- package/dist/call.js +82 -0
- package/dist/call.js.map +1 -0
- package/dist/contract.d.ts +45 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +107 -0
- package/dist/contract.js.map +1 -0
- package/dist/deployless.d.ts +3 -0
- package/dist/deployless.d.ts.map +1 -0
- package/dist/deployless.js +4 -0
- package/dist/deployless.js.map +1 -0
- package/dist/erc20.d.ts +27 -0
- package/dist/erc20.d.ts.map +1 -0
- package/dist/erc20.js +17 -0
- package/dist/erc20.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +56 -0
- package/dist/errors.js.map +1 -0
- package/dist/fallback.d.ts +23 -0
- package/dist/fallback.d.ts.map +1 -0
- package/dist/fallback.js +86 -0
- package/dist/fallback.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/multicall.d.ts +13 -0
- package/dist/multicall.d.ts.map +1 -0
- package/dist/multicall.js +51 -0
- package/dist/multicall.js.map +1 -0
- package/dist/provider.d.ts +137 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +269 -0
- package/dist/provider.js.map +1 -0
- package/dist/rpcNodes.d.ts +5 -0
- package/dist/rpcNodes.d.ts.map +1 -0
- package/dist/rpcNodes.js +193 -0
- package/dist/rpcNodes.js.map +1 -0
- package/dist/source.d.ts +23 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +56 -0
- package/dist/source.js.map +1 -0
- package/dist/tron.d.ts +62 -0
- package/dist/tron.d.ts.map +1 -0
- package/dist/tron.js +223 -0
- package/dist/tron.js.map +1 -0
- package/package.json +63 -0
- package/src/aggregate.ts +254 -0
- package/src/batcher.ts +126 -0
- package/src/call.ts +144 -0
- package/src/contract.ts +145 -0
- package/src/deployless.ts +5 -0
- package/src/erc20.ts +43 -0
- package/src/errors.ts +66 -0
- package/src/fallback.ts +105 -0
- package/src/index.ts +31 -0
- package/src/multicall.ts +60 -0
- package/src/provider.ts +352 -0
- package/src/rpcNodes.ts +194 -0
- package/src/source.ts +84 -0
- package/src/tron.ts +281 -0
package/dist/fallback.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isError } from 'ethers';
|
|
2
|
+
import { isExecutionError } from './errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* 多节点故障切换:按顺序使用节点,出错或超时换下一个;出错的节点在 cooldown 内排到最后。
|
|
5
|
+
*
|
|
6
|
+
* 与 ethers FallbackProvider 相比:
|
|
7
|
+
* - 没有首次请求前对所有节点的 getBlockNumber 同步,一个卡住的节点不会拖住第一次查询
|
|
8
|
+
* - 合约 revert 等确定性结果直接返回,不会拿去别的节点重试
|
|
9
|
+
*/
|
|
10
|
+
export class FallbackRpc {
|
|
11
|
+
#nodes;
|
|
12
|
+
#timeout;
|
|
13
|
+
#cooldown;
|
|
14
|
+
#failedAt;
|
|
15
|
+
constructor(nodes, options = {}) {
|
|
16
|
+
if (!nodes.length) {
|
|
17
|
+
throw new Error('FallbackRpc requires at least one node');
|
|
18
|
+
}
|
|
19
|
+
this.#nodes = nodes;
|
|
20
|
+
this.#timeout = options.timeout ?? 10_000;
|
|
21
|
+
this.#cooldown = options.cooldown ?? 30_000;
|
|
22
|
+
this.#failedAt = nodes.map(() => 0);
|
|
23
|
+
}
|
|
24
|
+
get nodes() {
|
|
25
|
+
return this.#nodes;
|
|
26
|
+
}
|
|
27
|
+
call(tx) {
|
|
28
|
+
return this.#run((node) => node.call(tx));
|
|
29
|
+
}
|
|
30
|
+
getBalance(address, blockTag) {
|
|
31
|
+
return this.#run((node) => node.getBalance(address, blockTag));
|
|
32
|
+
}
|
|
33
|
+
async #run(fn) {
|
|
34
|
+
let lastError;
|
|
35
|
+
for (const index of this.#order()) {
|
|
36
|
+
try {
|
|
37
|
+
const result = await withTimeout(fn(this.#nodes[index]), this.#timeout);
|
|
38
|
+
this.#failedAt[index] = 0;
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (isDeterministic(err)) {
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
this.#failedAt[index] = Date.now();
|
|
46
|
+
lastError = err;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw lastError;
|
|
50
|
+
}
|
|
51
|
+
/** 健康的节点按原顺序在前,冷却中的按出错时间先后排在后面(全挂时也都会再试一次) */
|
|
52
|
+
#order() {
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
const healthy = [];
|
|
55
|
+
const cooling = [];
|
|
56
|
+
this.#failedAt.forEach((at, i) => (at && now - at < this.#cooldown ? cooling : healthy).push(i));
|
|
57
|
+
cooling.sort((a, b) => this.#failedAt[a] - this.#failedAt[b]);
|
|
58
|
+
return [...healthy, ...cooling];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** 换节点也不会变的错误:合约执行结果、参数错误、用户拒绝等 */
|
|
62
|
+
function isDeterministic(err) {
|
|
63
|
+
return (isExecutionError(err) ||
|
|
64
|
+
isError(err, 'INVALID_ARGUMENT') ||
|
|
65
|
+
isError(err, 'ACTION_REJECTED') ||
|
|
66
|
+
isError(err, 'NUMERIC_FAULT'));
|
|
67
|
+
}
|
|
68
|
+
class TimeoutError extends Error {
|
|
69
|
+
constructor(ms) {
|
|
70
|
+
super(`RPC request timed out after ${ms}ms`);
|
|
71
|
+
this.name = 'TimeoutError';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function withTimeout(promise, ms) {
|
|
75
|
+
if (!Number.isFinite(ms) || ms <= 0) {
|
|
76
|
+
return promise;
|
|
77
|
+
}
|
|
78
|
+
let timer;
|
|
79
|
+
return Promise.race([
|
|
80
|
+
promise,
|
|
81
|
+
new Promise((_, reject) => {
|
|
82
|
+
timer = setTimeout(() => reject(new TimeoutError(ms)), ms);
|
|
83
|
+
}),
|
|
84
|
+
]).finally(() => clearTimeout(timer));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { Contract, bindCall, type BoundMethod, type ContractAbi, type ContractRunner } from './contract.js';
|
|
2
|
+
export { DEFAULT_NATIVE_TOKENS, ERC20_ABI, type Erc20Contract, type TokenInfo } from './erc20.js';
|
|
3
|
+
export { Provider, type ProviderConfig, type CallInput, type CallResults, type ProviderSource, type TryCallResults, type StaticCallItem, type StaticCallOverrides, type StaticCallResult, } from './provider.js';
|
|
4
|
+
export { TRON_CHAIN_ID, TronProvider, isTronAddress, toEvmAddress, toTronAddress, type TronProviderOptions, type TronRequest, type TronWebLike, } from './tron.js';
|
|
5
|
+
export { CallFailedError, decodeRevertReason, isExecutionError } from './errors.js';
|
|
6
|
+
export { FallbackRpc, type FallbackOptions } from './fallback.js';
|
|
7
|
+
export { getDefaultRpcUrls, isTronChain, type SourceOptions } from './source.js';
|
|
8
|
+
export { DEFAULT_RPC_URLS, DEFAULT_TRON_HOSTS } from './rpcNodes.js';
|
|
9
|
+
export { MULTICALL3_ADDRESS, getMulticall3, type Multicall } from './multicall.js';
|
|
10
|
+
export type { BlockTag, CallOverrides, EthersLikeProvider } from './aggregate.js';
|
|
11
|
+
export type { BatchOptions } from './batcher.js';
|
|
12
|
+
export type { BoundCall, Call, FailableCall, Params, RawResult } from './call.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3G,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AACjG,OAAO,EACL,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAClF,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjF,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Contract, bindCall } from './contract.js';
|
|
2
|
+
export { DEFAULT_NATIVE_TOKENS, ERC20_ABI } from './erc20.js';
|
|
3
|
+
export { Provider, } from './provider.js';
|
|
4
|
+
export { TRON_CHAIN_ID, TronProvider, isTronAddress, toEvmAddress, toTronAddress, } from './tron.js';
|
|
5
|
+
export { CallFailedError, decodeRevertReason, isExecutionError } from './errors.js';
|
|
6
|
+
export { FallbackRpc } from './fallback.js';
|
|
7
|
+
export { getDefaultRpcUrls, isTronChain } from './source.js';
|
|
8
|
+
export { DEFAULT_RPC_URLS, DEFAULT_TRON_HOSTS } from './rpcNodes.js';
|
|
9
|
+
export { MULTICALL3_ADDRESS, getMulticall3 } from './multicall.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAA2D,MAAM,eAAe,CAAA;AAC3G,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAsC,MAAM,YAAY,CAAA;AACjG,OAAO,EACL,QAAQ,GAST,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,GAId,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multicall3 部署地址表,来自 ethcall (MIT, https://github.com/Destiner/ethcall),另补充了 Tron。
|
|
3
|
+
* 表里没有的链(或地址在该链上无效)会自动走 deployless(见 contracts/DeploylessMulticall3.sol),
|
|
4
|
+
* 不需要链上部署任何合约。
|
|
5
|
+
*/
|
|
6
|
+
export interface Multicall {
|
|
7
|
+
address: string;
|
|
8
|
+
/** 合约部署所在区块;查询更早的区块时改走 deployless */
|
|
9
|
+
block: number;
|
|
10
|
+
}
|
|
11
|
+
export declare const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
12
|
+
export declare function getMulticall3(chainId: number): Multicall | null;
|
|
13
|
+
//# sourceMappingURL=multicall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,kBAAkB,+CAA+C,CAAA;AA6C9E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE/D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multicall3 部署地址表,来自 ethcall (MIT, https://github.com/Destiner/ethcall),另补充了 Tron。
|
|
3
|
+
* 表里没有的链(或地址在该链上无效)会自动走 deployless(见 contracts/DeploylessMulticall3.sol),
|
|
4
|
+
* 不需要链上部署任何合约。
|
|
5
|
+
*/
|
|
6
|
+
export const MULTICALL3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11';
|
|
7
|
+
const CANONICAL = MULTICALL3_ADDRESS;
|
|
8
|
+
const MULTICALL3 = {
|
|
9
|
+
1: { address: CANONICAL, block: 14353601 },
|
|
10
|
+
3: { address: CANONICAL, block: 12063863 },
|
|
11
|
+
4: { address: CANONICAL, block: 10299530 },
|
|
12
|
+
5: { address: CANONICAL, block: 6507670 },
|
|
13
|
+
10: { address: CANONICAL, block: 4286263 },
|
|
14
|
+
14: { address: CANONICAL, block: 3002461 },
|
|
15
|
+
16: { address: CANONICAL, block: 276388 },
|
|
16
|
+
19: { address: CANONICAL, block: 13382504 },
|
|
17
|
+
42: { address: CANONICAL, block: 30285908 },
|
|
18
|
+
56: { address: CANONICAL, block: 15921452 },
|
|
19
|
+
69: { address: CANONICAL, block: 1418387 },
|
|
20
|
+
97: { address: CANONICAL, block: 17422483 },
|
|
21
|
+
100: { address: CANONICAL, block: 21022491 },
|
|
22
|
+
114: { address: CANONICAL, block: 508735 },
|
|
23
|
+
137: { address: CANONICAL, block: 25770160 },
|
|
24
|
+
196: { address: CANONICAL, block: 47416 },
|
|
25
|
+
250: { address: CANONICAL, block: 33001987 },
|
|
26
|
+
252: { address: CANONICAL, block: 0 },
|
|
27
|
+
324: { address: '0x413fEb613604D46586c22801949A5b88b224c260', block: 9531414 },
|
|
28
|
+
420: { address: CANONICAL, block: 49461 },
|
|
29
|
+
1284: { address: CANONICAL, block: 609002 },
|
|
30
|
+
1285: { address: CANONICAL, block: 1597904 },
|
|
31
|
+
1287: { address: CANONICAL, block: 1850686 },
|
|
32
|
+
2222: { address: '0x1578f6d2D3168acF41b506AA666A521994F6BAB6', block: 1176602 },
|
|
33
|
+
4002: { address: CANONICAL, block: 8328688 },
|
|
34
|
+
8453: { address: CANONICAL, block: 5022 },
|
|
35
|
+
42161: { address: CANONICAL, block: 7654707 },
|
|
36
|
+
42220: { address: CANONICAL, block: 13112599 },
|
|
37
|
+
43113: { address: CANONICAL, block: 7096959 },
|
|
38
|
+
43114: { address: CANONICAL, block: 11907934 },
|
|
39
|
+
80001: { address: CANONICAL, block: 25444704 },
|
|
40
|
+
421611: { address: CANONICAL, block: 10228837 },
|
|
41
|
+
5000: { address: '0xd77b59d4cb13bea71f3cc093e401720867355d6e', block: 18877383 },
|
|
42
|
+
1666600000: { address: CANONICAL, block: 24185753 },
|
|
43
|
+
73927: { address: '0x138A85647768815078DF1dD85C6121e611381A0b', block: 14080843 },
|
|
44
|
+
// Tron 主网 TEazPvZwDjDtFeJupyo7QunvnrnUjPH8ED(链上合约名 Multicall3,2026-10 实测)
|
|
45
|
+
728126428: { address: '0x32a4f47a74a6810bd0bf861cabab99656a75de9e', block: 0 },
|
|
46
|
+
81457: { address: '0x23928c6f823e0d78eadc9d2f69ace652ff3cdcb1', block: 368182 },
|
|
47
|
+
};
|
|
48
|
+
export function getMulticall3(chainId) {
|
|
49
|
+
return MULTICALL3[chainId] ?? null;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=multicall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { type BigNumberish } from 'ethers';
|
|
2
|
+
import { type BlockTag, type CallOverrides, type EthersLikeProvider } from './aggregate.js';
|
|
3
|
+
import { type BatchOptions } from './batcher.js';
|
|
4
|
+
import { type BoundCall, type Call } from './call.js';
|
|
5
|
+
import { Contract, type ContractAbi, type ContractRunner } from './contract.js';
|
|
6
|
+
import { type Erc20Contract, type TokenInfo } from './erc20.js';
|
|
7
|
+
import { type Multicall } from './multicall.js';
|
|
8
|
+
import { type ProviderSource, type SourceOptions } from './source.js';
|
|
9
|
+
export type { ProviderSource };
|
|
10
|
+
export interface StaticCallOverrides extends CallOverrides {
|
|
11
|
+
value?: BigNumberish;
|
|
12
|
+
gasLimit?: BigNumberish;
|
|
13
|
+
}
|
|
14
|
+
export interface StaticCallItem {
|
|
15
|
+
call: Call;
|
|
16
|
+
overrides?: StaticCallOverrides;
|
|
17
|
+
}
|
|
18
|
+
export type StaticCallResult<T> = {
|
|
19
|
+
success: true;
|
|
20
|
+
data: T;
|
|
21
|
+
} | {
|
|
22
|
+
success: false;
|
|
23
|
+
error: Error;
|
|
24
|
+
};
|
|
25
|
+
/** all / tryAll 的输入:Call 数组,或 { 名字: Call } 对象 */
|
|
26
|
+
export type CallInput = readonly Call[] | Readonly<Record<string, Call>>;
|
|
27
|
+
type ResultOf<C> = C extends Call<infer R> ? R : any;
|
|
28
|
+
/** 与输入同构的结果:数组 → 数组(元组保留各项类型),对象 → 同名字段 */
|
|
29
|
+
export type CallResults<C> = {
|
|
30
|
+
-readonly [K in keyof C]: ResultOf<C[K]>;
|
|
31
|
+
};
|
|
32
|
+
export type TryCallResults<C> = {
|
|
33
|
+
-readonly [K in keyof C]: ResultOf<C[K]> | null;
|
|
34
|
+
};
|
|
35
|
+
export interface ProviderConfig extends SourceOptions {
|
|
36
|
+
/** 自定义 Multicall3 地址;不填则查内置地址表,表里没有就走 deployless */
|
|
37
|
+
multicall?: Partial<Multicall>;
|
|
38
|
+
/** 强制走 deployless(不依赖链上 multicall 合约) */
|
|
39
|
+
deployless?: boolean;
|
|
40
|
+
/** 单次 eth_call 最多打包的调用数,超出自动拆分并发请求。默认 500 */
|
|
41
|
+
chunkSize?: number;
|
|
42
|
+
/** `provider.call()` 自动合并的参数 */
|
|
43
|
+
batch?: BatchOptions;
|
|
44
|
+
/** `balances()` 里视为主币的地址,默认 0xeeee…eeee 和零地址 */
|
|
45
|
+
nativeTokens?: readonly string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Multicall Provider,API 与 ethcall 的 Provider 保持一致:
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* const multi = new Provider(chainId, ethersProvider)
|
|
52
|
+
* const [symbol, decimals] = await multi.all([erc20.symbol(), erc20.decimals()])
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare class Provider implements ContractRunner {
|
|
56
|
+
#private;
|
|
57
|
+
/**
|
|
58
|
+
* @param chainId 链 ID(接受数字字符串)
|
|
59
|
+
* @param provider 节点:RPC URL、ethers Provider、钱包(window.ethereum / tronWeb)或它们的数组(主节点 + 备用节点)。
|
|
60
|
+
* 不传则使用内置的公共节点表
|
|
61
|
+
* @param config 可选配置
|
|
62
|
+
*/
|
|
63
|
+
constructor(chainId: number | string, provider?: ProviderSource | readonly ProviderSource[], config?: ProviderConfig);
|
|
64
|
+
/**
|
|
65
|
+
* 绑定到本 Provider 的合约:方法返回的 Call 可以直接 await(自动合并成 multicall),
|
|
66
|
+
* 也可以传给 all / tryAll;`method.staticCall(...)` 预执行。
|
|
67
|
+
*
|
|
68
|
+
* ```ts
|
|
69
|
+
* const pair = multi.contract(pairAddress, PAIR_ABI)
|
|
70
|
+
* const [reserves, token0] = await Promise.all([pair.getReserves(), pair.token0()]) // 一次请求
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
contract(address: string, abi: ContractAbi): Contract;
|
|
74
|
+
/** 绑定的 ERC20 合约(内置 ABI,结果带类型) */
|
|
75
|
+
erc20(address: string): Erc20Contract;
|
|
76
|
+
/**
|
|
77
|
+
* 批量查余额,主币和代币混在一起、一次请求。主币地址见 config.nativeTokens。
|
|
78
|
+
* 查询失败(非合约地址、非法地址等)的位置为 0n;需要区分失败请用 tryAll。
|
|
79
|
+
*/
|
|
80
|
+
balances(owner: string, tokens: readonly string[], overrides?: CallOverrides): Promise<bigint[]>;
|
|
81
|
+
/**
|
|
82
|
+
* 批量查代币信息(symbol / name / decimals),一次请求。
|
|
83
|
+
* decimals 读不到(非代币合约、主币占位地址等)的位置为 null。
|
|
84
|
+
*/
|
|
85
|
+
tokenInfo(tokens: readonly string[], overrides?: CallOverrides): Promise<(TokenInfo | null)[]>;
|
|
86
|
+
/**
|
|
87
|
+
* 主币余额查询,可以和合约调用放在同一批里(同一次 eth_call):
|
|
88
|
+
* 有 Multicall3 时调合约的 getEthBalance;deployless 时由 deployless 合约直接用 BALANCE 读取。
|
|
89
|
+
*/
|
|
90
|
+
getEthBalance(address: string): BoundCall<bigint>;
|
|
91
|
+
/**
|
|
92
|
+
* 合并成一次调用,任意一条失败则整体抛错。
|
|
93
|
+
* 可以传数组(结果顺序一致),也可以传 `{ 名字: Call }` 对象(结果是同名字段)。
|
|
94
|
+
*/
|
|
95
|
+
all<const C extends CallInput>(calls: C, overrides?: CallOverrides): Promise<CallResults<C>>;
|
|
96
|
+
all<T = any>(calls: readonly Call[], overrides?: CallOverrides): Promise<T[]>;
|
|
97
|
+
/**
|
|
98
|
+
* 合并成一次调用,失败(revert、解码失败、参数编码失败如非法地址)的位置返回 null。
|
|
99
|
+
* 与 all 一样支持数组或对象。
|
|
100
|
+
*/
|
|
101
|
+
tryAll<const C extends CallInput>(calls: C, overrides?: CallOverrides): Promise<TryCallResults<C>>;
|
|
102
|
+
tryAll<T = any>(calls: readonly Call[], overrides?: CallOverrides): Promise<(T | null)[]>;
|
|
103
|
+
/**
|
|
104
|
+
* 逐条指定是否允许失败:允许失败的位置返回 null,不允许失败的一旦失败整体抛错。
|
|
105
|
+
*/
|
|
106
|
+
tryEach<T = any>(calls: readonly Call[], canFail: readonly boolean[], overrides?: CallOverrides): Promise<(T | null)[]>;
|
|
107
|
+
/**
|
|
108
|
+
* 单条调用,自动与同一收集窗口内的其他 `call()` 合并为一次 multicall。
|
|
109
|
+
* 失败时 reject CallFailedError。适合各组件各自查数据、又希望只发一个请求的场景。
|
|
110
|
+
*/
|
|
111
|
+
call<T = any>(call: Call, overrides?: CallOverrides): Promise<T>;
|
|
112
|
+
/**
|
|
113
|
+
* 预执行(模拟交易):直接对目标合约发 eth_call,可带 from / value / gasLimit,
|
|
114
|
+
* 用于 swap 报价、检查交易是否会 revert 等。失败时抛 CallFailedError(带解析后的 revert 原因)。
|
|
115
|
+
*
|
|
116
|
+
* 不走 multicall:multicall 里子调用的 msg.sender 是 multicall 合约本身、也无法按条带 value,
|
|
117
|
+
* 与真实交易不一致。
|
|
118
|
+
*
|
|
119
|
+
* overrides 优先级:参数 overrides > Call 上的 overrides(`contract.swap(params, { value })`)。
|
|
120
|
+
*/
|
|
121
|
+
staticCall<T = any>(call: Call, overrides?: StaticCallOverrides): Promise<T>;
|
|
122
|
+
/**
|
|
123
|
+
* 批量预执行:每条都是独立的 eth_call,同时发出(JsonRpcProvider 会合进一个 JSON-RPC batch 请求;
|
|
124
|
+
* TronProvider 按 concurrency 限流)。每条结果单独返回成功/失败,不会互相影响。
|
|
125
|
+
*
|
|
126
|
+
* @param items Call,或 `{ call, overrides }` 以便每条带不同的 value / from
|
|
127
|
+
* @param overrides 所有条目共享的 overrides,优先级最低
|
|
128
|
+
*/
|
|
129
|
+
staticCallAll<T = any>(items: ReadonlyArray<Call | StaticCallItem>, overrides?: StaticCallOverrides): Promise<StaticCallResult<T>[]>;
|
|
130
|
+
/** 底层连接(多节点时是 FallbackRpc) */
|
|
131
|
+
get rpc(): EthersLikeProvider;
|
|
132
|
+
/** 当前使用的 multicall 合约(null 表示 deployless) */
|
|
133
|
+
get multicall(): Multicall | null;
|
|
134
|
+
}
|
|
135
|
+
export default Provider;
|
|
136
|
+
export type { BlockTag, CallOverrides };
|
|
137
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import {} from 'ethers';
|
|
2
|
+
import { aggregate } from './aggregate.js';
|
|
3
|
+
import { Batcher } from './batcher.js';
|
|
4
|
+
import { decodeCall, encodeCall } from './call.js';
|
|
5
|
+
import { Contract, bindCall } from './contract.js';
|
|
6
|
+
import { DEFAULT_NATIVE_TOKENS, ERC20_ABI } from './erc20.js';
|
|
7
|
+
import { CallFailedError, isExecutionError } from './errors.js';
|
|
8
|
+
import { MULTICALL3_ADDRESS, getMulticall3 } from './multicall.js';
|
|
9
|
+
import { resolveSource } from './source.js';
|
|
10
|
+
const ETH_BALANCE_INPUTS = [{ name: 'addr', type: 'address' }];
|
|
11
|
+
const ETH_BALANCE_OUTPUTS = [{ name: 'balance', type: 'uint256' }];
|
|
12
|
+
/**
|
|
13
|
+
* Multicall Provider,API 与 ethcall 的 Provider 保持一致:
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* const multi = new Provider(chainId, ethersProvider)
|
|
17
|
+
* const [symbol, decimals] = await multi.all([erc20.symbol(), erc20.decimals()])
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class Provider {
|
|
21
|
+
#ctx;
|
|
22
|
+
#batcher;
|
|
23
|
+
#nativeTokens;
|
|
24
|
+
/**
|
|
25
|
+
* @param chainId 链 ID(接受数字字符串)
|
|
26
|
+
* @param provider 节点:RPC URL、ethers Provider、钱包(window.ethereum / tronWeb)或它们的数组(主节点 + 备用节点)。
|
|
27
|
+
* 不传则使用内置的公共节点表
|
|
28
|
+
* @param config 可选配置
|
|
29
|
+
*/
|
|
30
|
+
constructor(chainId, provider, config = {}) {
|
|
31
|
+
const id = Number(chainId);
|
|
32
|
+
this.#ctx = {
|
|
33
|
+
provider: resolveSource(id, provider, config),
|
|
34
|
+
chainId: id,
|
|
35
|
+
multicall: config.deployless ? null : resolveMulticall(id, config.multicall),
|
|
36
|
+
chunkSize: config.chunkSize ?? 500,
|
|
37
|
+
};
|
|
38
|
+
this.#batcher = new Batcher((requests, overrides) => this.#aggregate(requests, overrides), config.batch);
|
|
39
|
+
this.#nativeTokens = new Set((config.nativeTokens ?? DEFAULT_NATIVE_TOKENS).map((t) => t.toLowerCase()));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 绑定到本 Provider 的合约:方法返回的 Call 可以直接 await(自动合并成 multicall),
|
|
43
|
+
* 也可以传给 all / tryAll;`method.staticCall(...)` 预执行。
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* const pair = multi.contract(pairAddress, PAIR_ABI)
|
|
47
|
+
* const [reserves, token0] = await Promise.all([pair.getReserves(), pair.token0()]) // 一次请求
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
contract(address, abi) {
|
|
51
|
+
return new Contract(address, abi, this);
|
|
52
|
+
}
|
|
53
|
+
/** 绑定的 ERC20 合约(内置 ABI,结果带类型) */
|
|
54
|
+
erc20(address) {
|
|
55
|
+
return new Contract(address, ERC20_ABI, this);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 批量查余额,主币和代币混在一起、一次请求。主币地址见 config.nativeTokens。
|
|
59
|
+
* 查询失败(非合约地址、非法地址等)的位置为 0n;需要区分失败请用 tryAll。
|
|
60
|
+
*/
|
|
61
|
+
async balances(owner, tokens, overrides) {
|
|
62
|
+
const calls = tokens.map((token) => this.#nativeTokens.has(token.toLowerCase()) ? this.getEthBalance(owner) : this.erc20(token).balanceOf(owner));
|
|
63
|
+
const results = await this.tryAll(calls, overrides);
|
|
64
|
+
return results.map((balance) => balance ?? 0n);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 批量查代币信息(symbol / name / decimals),一次请求。
|
|
68
|
+
* decimals 读不到(非代币合约、主币占位地址等)的位置为 null。
|
|
69
|
+
*/
|
|
70
|
+
async tokenInfo(tokens, overrides) {
|
|
71
|
+
// 主币占位地址不是合约,不发请求
|
|
72
|
+
const targets = tokens.filter((token) => !this.#nativeTokens.has(token.toLowerCase()));
|
|
73
|
+
const calls = targets.flatMap((token) => {
|
|
74
|
+
const erc20 = this.erc20(token);
|
|
75
|
+
return [erc20.symbol(), erc20.name(), erc20.decimals()];
|
|
76
|
+
});
|
|
77
|
+
const results = calls.length ? await this.tryAll(calls, overrides) : [];
|
|
78
|
+
const infoByToken = new Map();
|
|
79
|
+
targets.forEach((address, i) => {
|
|
80
|
+
const decimals = results[i * 3 + 2];
|
|
81
|
+
infoByToken.set(address, decimals === null
|
|
82
|
+
? null
|
|
83
|
+
: {
|
|
84
|
+
address,
|
|
85
|
+
symbol: results[i * 3] ?? null,
|
|
86
|
+
name: results[i * 3 + 1] ?? null,
|
|
87
|
+
decimals: Number(decimals),
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
return tokens.map((token) => infoByToken.get(token) ?? null);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 主币余额查询,可以和合约调用放在同一批里(同一次 eth_call):
|
|
94
|
+
* 有 Multicall3 时调合约的 getEthBalance;deployless 时由 deployless 合约直接用 BALANCE 读取。
|
|
95
|
+
*/
|
|
96
|
+
getEthBalance(address) {
|
|
97
|
+
const call = {
|
|
98
|
+
contract: { address: this.#ctx.multicall?.address ?? MULTICALL3_ADDRESS },
|
|
99
|
+
name: 'getEthBalance',
|
|
100
|
+
inputs: ETH_BALANCE_INPUTS,
|
|
101
|
+
outputs: ETH_BALANCE_OUTPUTS,
|
|
102
|
+
params: [address],
|
|
103
|
+
kind: 'ethBalance',
|
|
104
|
+
};
|
|
105
|
+
return bindCall(call, this);
|
|
106
|
+
}
|
|
107
|
+
async all(calls, overrides) {
|
|
108
|
+
const [list, pack] = unpack(calls);
|
|
109
|
+
const results = await this.#aggregate(list.map((call) => encodeCall(call, false)), overrides);
|
|
110
|
+
return pack(list.map((call, i) => decodeCall(call, results[i].returnData)));
|
|
111
|
+
}
|
|
112
|
+
async tryAll(calls, overrides) {
|
|
113
|
+
const [list, pack] = unpack(calls);
|
|
114
|
+
return pack(await this.tryEach(list, list.map(() => true), overrides));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 逐条指定是否允许失败:允许失败的位置返回 null,不允许失败的一旦失败整体抛错。
|
|
118
|
+
*/
|
|
119
|
+
async tryEach(calls, canFail, overrides) {
|
|
120
|
+
// 允许失败的条目编码出错(如后端给的脏地址)只让该条为 null,不拖垮整批
|
|
121
|
+
const requests = calls.map((call, i) => {
|
|
122
|
+
const callCanFail = canFail[i];
|
|
123
|
+
if (callCanFail === undefined) {
|
|
124
|
+
throw new Error('Unable to access the canFail value');
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
return encodeCall(call, callCanFail);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
if (callCanFail) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
const valid = requests.filter((req) => req !== null);
|
|
137
|
+
const results = await this.#aggregate(valid, overrides);
|
|
138
|
+
let j = 0;
|
|
139
|
+
const aligned = requests.map((req) => (req ? results[j++] : { success: false, returnData: '0x' }));
|
|
140
|
+
return decodeTry(calls, aligned);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 单条调用,自动与同一收集窗口内的其他 `call()` 合并为一次 multicall。
|
|
144
|
+
* 失败时 reject CallFailedError。适合各组件各自查数据、又希望只发一个请求的场景。
|
|
145
|
+
*/
|
|
146
|
+
call(call, overrides) {
|
|
147
|
+
const own = call.overrides;
|
|
148
|
+
return this.#batcher.load(call, merge({ blockTag: own?.blockTag, from: own?.from }, overrides));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 预执行(模拟交易):直接对目标合约发 eth_call,可带 from / value / gasLimit,
|
|
152
|
+
* 用于 swap 报价、检查交易是否会 revert 等。失败时抛 CallFailedError(带解析后的 revert 原因)。
|
|
153
|
+
*
|
|
154
|
+
* 不走 multicall:multicall 里子调用的 msg.sender 是 multicall 合约本身、也无法按条带 value,
|
|
155
|
+
* 与真实交易不一致。
|
|
156
|
+
*
|
|
157
|
+
* overrides 优先级:参数 overrides > Call 上的 overrides(`contract.swap(params, { value })`)。
|
|
158
|
+
*/
|
|
159
|
+
async staticCall(call, overrides = {}) {
|
|
160
|
+
const result = await this.#staticCall(call, overrides);
|
|
161
|
+
if (!result.success) {
|
|
162
|
+
throw result.error;
|
|
163
|
+
}
|
|
164
|
+
return result.data;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 批量预执行:每条都是独立的 eth_call,同时发出(JsonRpcProvider 会合进一个 JSON-RPC batch 请求;
|
|
168
|
+
* TronProvider 按 concurrency 限流)。每条结果单独返回成功/失败,不会互相影响。
|
|
169
|
+
*
|
|
170
|
+
* @param items Call,或 `{ call, overrides }` 以便每条带不同的 value / from
|
|
171
|
+
* @param overrides 所有条目共享的 overrides,优先级最低
|
|
172
|
+
*/
|
|
173
|
+
async staticCallAll(items, overrides = {}) {
|
|
174
|
+
return Promise.all(items.map((item) => 'call' in item && 'contract' in item.call
|
|
175
|
+
? this.#staticCall(item.call, item.overrides, overrides)
|
|
176
|
+
: this.#staticCall(item, undefined, overrides)));
|
|
177
|
+
}
|
|
178
|
+
/** 优先级:explicit > Call 自带的 overrides > shared;值为 undefined 的字段不覆盖 */
|
|
179
|
+
async #staticCall(call, explicit, shared) {
|
|
180
|
+
const merged = merge(merge({ ...shared }, call.overrides), explicit);
|
|
181
|
+
if (call.kind === 'ethBalance') {
|
|
182
|
+
try {
|
|
183
|
+
return { success: true, data: (await this.#ctx.provider.getBalance(call.params[0], merged.blockTag)) };
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
return { success: false, error: err instanceof Error ? err : new Error(String(err)) };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
let returnData;
|
|
190
|
+
try {
|
|
191
|
+
const request = encodeCall(call, false);
|
|
192
|
+
returnData = await this.#ctx.provider.call({
|
|
193
|
+
to: request.target,
|
|
194
|
+
data: request.callData,
|
|
195
|
+
from: merged.from,
|
|
196
|
+
value: merged.value,
|
|
197
|
+
gasLimit: merged.gasLimit,
|
|
198
|
+
blockTag: merged.blockTag,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
// 只有执行层面的失败才是 CallFailedError;限流、超时等节点错误原样返回
|
|
203
|
+
if (isExecutionError(err)) {
|
|
204
|
+
return { success: false, error: new CallFailedError(call, err.data ?? '0x', err) };
|
|
205
|
+
}
|
|
206
|
+
return { success: false, error: err instanceof Error ? err : new Error(String(err)) };
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
return { success: true, data: decodeCall(call, returnData) };
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
// 目标地址没有合约时返回 0x,解码失败
|
|
213
|
+
return { success: false, error: new CallFailedError(call, returnData, err) };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** 底层连接(多节点时是 FallbackRpc) */
|
|
217
|
+
get rpc() {
|
|
218
|
+
return this.#ctx.provider;
|
|
219
|
+
}
|
|
220
|
+
/** 当前使用的 multicall 合约(null 表示 deployless) */
|
|
221
|
+
get multicall() {
|
|
222
|
+
return this.#ctx.multicall;
|
|
223
|
+
}
|
|
224
|
+
#aggregate(requests, overrides) {
|
|
225
|
+
return aggregate(this.#ctx, requests, overrides);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function resolveMulticall(chainId, custom) {
|
|
229
|
+
if (custom?.address) {
|
|
230
|
+
return { address: custom.address, block: custom.block ?? 0 };
|
|
231
|
+
}
|
|
232
|
+
return Number.isFinite(chainId) ? getMulticall3(chainId) : null;
|
|
233
|
+
}
|
|
234
|
+
/** 浅合并,source 里值为 undefined 的字段不覆盖 target */
|
|
235
|
+
function merge(target, source) {
|
|
236
|
+
const out = { ...target };
|
|
237
|
+
for (const [key, value] of Object.entries(source ?? {})) {
|
|
238
|
+
if (value !== undefined) {
|
|
239
|
+
out[key] = value;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
/** 把数组 / 对象输入展开成 Call 列表,并返回把结果还原成同样形状的函数 */
|
|
245
|
+
function unpack(calls) {
|
|
246
|
+
if (Array.isArray(calls)) {
|
|
247
|
+
return [calls, (results) => results];
|
|
248
|
+
}
|
|
249
|
+
const keys = Object.keys(calls);
|
|
250
|
+
const record = calls;
|
|
251
|
+
return [keys.map((key) => record[key]), (results) => Object.fromEntries(keys.map((key, i) => [key, results[i]]))];
|
|
252
|
+
}
|
|
253
|
+
function decodeTry(calls, results) {
|
|
254
|
+
return calls.map((call, i) => {
|
|
255
|
+
const result = results[i];
|
|
256
|
+
if (!result.success) {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
try {
|
|
260
|
+
return decodeCall(call, result.returnData);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// 解码失败:多半是目标地址没有合约
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
export default Provider;
|
|
269
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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"}
|