@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/rpcNodes.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// 内置公共节点表,手动维护;修改后用 `pnpm check:rpc` 检查可用性。
|
|
2
|
+
// 节点按优先级排序,要求能在浏览器里直连:放行跨域、支持 batch 请求、chainId 正确、不要求 API Key。
|
|
3
|
+
/** 各 EVM 链的公共 RPC 节点(按优先级排序) */
|
|
4
|
+
export const DEFAULT_RPC_URLS = {
|
|
5
|
+
// eth
|
|
6
|
+
1: [
|
|
7
|
+
'https://rpc.mevblocker.io',
|
|
8
|
+
'https://eth.blockrazor.xyz',
|
|
9
|
+
'https://ethereum-rpc.publicnode.com',
|
|
10
|
+
],
|
|
11
|
+
// base
|
|
12
|
+
8453: [
|
|
13
|
+
'https://base-rpc.publicnode.com',
|
|
14
|
+
'https://mainnet.base.org',
|
|
15
|
+
'https://base.api.pocket.network',
|
|
16
|
+
],
|
|
17
|
+
// bsc
|
|
18
|
+
56: [
|
|
19
|
+
'https://bsc.blockrazor.xyz',
|
|
20
|
+
'https://bsc-dataseed1.bnbchain.org',
|
|
21
|
+
'https://bsc-dataseed2.bnbchain.org',
|
|
22
|
+
'https://bsc-dataseed.bnbchain.org',
|
|
23
|
+
'https://bsc-dataseed3.bnbchain.org',
|
|
24
|
+
'https://bsc-dataseed4.bnbchain.org',
|
|
25
|
+
'https://bsc-rpc.publicnode.com',
|
|
26
|
+
'https://bsc.publicnode.com',
|
|
27
|
+
],
|
|
28
|
+
// arbitrum
|
|
29
|
+
42161: [
|
|
30
|
+
'https://arb1.arbitrum.io/rpc',
|
|
31
|
+
'https://arbitrum-one-rpc.publicnode.com',
|
|
32
|
+
'https://arb-one.api.pocket.network',
|
|
33
|
+
],
|
|
34
|
+
// optimism
|
|
35
|
+
10: [
|
|
36
|
+
'https://mainnet.optimism.io',
|
|
37
|
+
'https://op.api.pocket.network',
|
|
38
|
+
],
|
|
39
|
+
// polygon
|
|
40
|
+
137: [
|
|
41
|
+
'https://polygon.drpc.org',
|
|
42
|
+
'https://poly.api.pocket.network',
|
|
43
|
+
],
|
|
44
|
+
// avax
|
|
45
|
+
43114: [
|
|
46
|
+
'https://api.avax.network/ext/bc/C/rpc',
|
|
47
|
+
'https://avax.api.pocket.network',
|
|
48
|
+
],
|
|
49
|
+
// scroll
|
|
50
|
+
534352: [
|
|
51
|
+
'https://rpc.scroll.io',
|
|
52
|
+
'https://scroll-rpc.publicnode.com',
|
|
53
|
+
'https://scroll.api.pocket.network',
|
|
54
|
+
],
|
|
55
|
+
// linea
|
|
56
|
+
59144: [
|
|
57
|
+
'https://rpc.linea.build',
|
|
58
|
+
'https://linea.api.pocket.network',
|
|
59
|
+
],
|
|
60
|
+
// blast
|
|
61
|
+
81457: [
|
|
62
|
+
'https://rpc.blast.io',
|
|
63
|
+
'https://blast.api.pocket.network',
|
|
64
|
+
],
|
|
65
|
+
// zksync
|
|
66
|
+
324: [
|
|
67
|
+
'https://mainnet.era.zksync.io',
|
|
68
|
+
'https://zksync-era.api.pocket.network',
|
|
69
|
+
],
|
|
70
|
+
// mode
|
|
71
|
+
34443: [
|
|
72
|
+
'https://mainnet.mode.network',
|
|
73
|
+
],
|
|
74
|
+
// mantle
|
|
75
|
+
5000: [
|
|
76
|
+
'https://rpc.mantle.xyz',
|
|
77
|
+
'https://mantle.api.pocket.network',
|
|
78
|
+
],
|
|
79
|
+
// xlayer
|
|
80
|
+
196: [
|
|
81
|
+
'https://rpc.xlayer.tech',
|
|
82
|
+
'https://xlayerrpc.okx.com',
|
|
83
|
+
],
|
|
84
|
+
// monad
|
|
85
|
+
143: [
|
|
86
|
+
'https://rpc.monad.xyz',
|
|
87
|
+
'https://rpc2.monad.xyz',
|
|
88
|
+
'https://rpc3.monad.xyz',
|
|
89
|
+
],
|
|
90
|
+
// core
|
|
91
|
+
1116: [
|
|
92
|
+
'https://rpc.coredao.org',
|
|
93
|
+
'https://rpc.ankr.com/core',
|
|
94
|
+
],
|
|
95
|
+
// plasma
|
|
96
|
+
9745: [
|
|
97
|
+
'https://rpc.plasma.to',
|
|
98
|
+
],
|
|
99
|
+
// morph
|
|
100
|
+
2818: [
|
|
101
|
+
'https://rpc-quicknode.morphl2.io',
|
|
102
|
+
'https://rpc.morphl2.io',
|
|
103
|
+
],
|
|
104
|
+
// hyperevm
|
|
105
|
+
999: [
|
|
106
|
+
'https://rpc.hyperliquid.xyz/evm',
|
|
107
|
+
'https://rpc.hypurrscan.io',
|
|
108
|
+
],
|
|
109
|
+
// eni
|
|
110
|
+
173: [
|
|
111
|
+
'https://rpc.eniac.network',
|
|
112
|
+
'https://jp.enirpc.com',
|
|
113
|
+
'https://rpc1.eniac.network',
|
|
114
|
+
'https://rpc2.eniac.network',
|
|
115
|
+
'https://jp.eniacrpc.net',
|
|
116
|
+
],
|
|
117
|
+
// fsc
|
|
118
|
+
201022: [
|
|
119
|
+
'https://fsc-dataseed1.fonscan.io',
|
|
120
|
+
'https://fsc-dataseed2.fonscan.io',
|
|
121
|
+
'https://fsc-dataseed3.fonscan.io',
|
|
122
|
+
'https://rpc.hieswap.com',
|
|
123
|
+
],
|
|
124
|
+
// anubis
|
|
125
|
+
6714: [
|
|
126
|
+
'https://rpc.anubispace.org',
|
|
127
|
+
],
|
|
128
|
+
// opbnb
|
|
129
|
+
204: [
|
|
130
|
+
'https://opbnb-mainnet-rpc.bnbchain.org',
|
|
131
|
+
'https://opbnb-rpc.publicnode.com',
|
|
132
|
+
'https://opbnb.api.pocket.network',
|
|
133
|
+
],
|
|
134
|
+
// safe
|
|
135
|
+
6666665: [
|
|
136
|
+
'https://safe4.anwang.com/rpc',
|
|
137
|
+
],
|
|
138
|
+
// berachain
|
|
139
|
+
80094: [
|
|
140
|
+
'https://rpc.berachain.com',
|
|
141
|
+
'https://berachain-rpc.publicnode.com',
|
|
142
|
+
'https://bera.api.pocket.network',
|
|
143
|
+
],
|
|
144
|
+
// fusnchain
|
|
145
|
+
8379: [
|
|
146
|
+
'https://rpc.fusn.network',
|
|
147
|
+
],
|
|
148
|
+
// ma
|
|
149
|
+
20260131: [
|
|
150
|
+
'https://rpc.ma-chain.xyz',
|
|
151
|
+
],
|
|
152
|
+
// robinhood
|
|
153
|
+
4663: [
|
|
154
|
+
'https://rpc.mainnet.chain.robinhood.com',
|
|
155
|
+
'https://robinhood.api.pocket.network',
|
|
156
|
+
],
|
|
157
|
+
// mychain
|
|
158
|
+
210400: [
|
|
159
|
+
'https://rpc.mychain.my',
|
|
160
|
+
],
|
|
161
|
+
// stable
|
|
162
|
+
988: [
|
|
163
|
+
'https://rpc.stable.xyz',
|
|
164
|
+
],
|
|
165
|
+
// unichain
|
|
166
|
+
130: [
|
|
167
|
+
'https://unichain-rpc.publicnode.com',
|
|
168
|
+
'https://mainnet.unichain.org',
|
|
169
|
+
],
|
|
170
|
+
// botchain
|
|
171
|
+
677: [
|
|
172
|
+
'https://rpc.botchain.ai',
|
|
173
|
+
],
|
|
174
|
+
// winchain
|
|
175
|
+
86233268: [
|
|
176
|
+
'https://rpc.winchain.win',
|
|
177
|
+
'https://rpc2.winchain.win',
|
|
178
|
+
],
|
|
179
|
+
// ink
|
|
180
|
+
57073: [
|
|
181
|
+
'https://rpc-gel.inkonchain.com',
|
|
182
|
+
'https://rpc-qnd.inkonchain.com',
|
|
183
|
+
'https://ink.api.pocket.network',
|
|
184
|
+
],
|
|
185
|
+
};
|
|
186
|
+
/** Tron 主网全节点 HTTP API(均支持跨域与 deployless) */
|
|
187
|
+
export const DEFAULT_TRON_HOSTS = [
|
|
188
|
+
'https://api.trongrid.io',
|
|
189
|
+
'https://tron-rpc.publicnode.com',
|
|
190
|
+
'https://api.tronstack.io',
|
|
191
|
+
'https://tron-mainnet.token.im',
|
|
192
|
+
];
|
|
193
|
+
//# sourceMappingURL=rpcNodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpcNodes.js","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,+DAA+D;AAE/D,gCAAgC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAgD;IAC3E,MAAM;IACN,CAAC,EAAE;QACD,2BAA2B;QAC3B,4BAA4B;QAC5B,qCAAqC;KACtC;IACD,OAAO;IACP,IAAI,EAAE;QACJ,iCAAiC;QACjC,0BAA0B;QAC1B,iCAAiC;KAClC;IACD,MAAM;IACN,EAAE,EAAE;QACF,4BAA4B;QAC5B,oCAAoC;QACpC,oCAAoC;QACpC,mCAAmC;QACnC,oCAAoC;QACpC,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;KAC7B;IACD,WAAW;IACX,KAAK,EAAE;QACL,8BAA8B;QAC9B,yCAAyC;QACzC,oCAAoC;KACrC;IACD,WAAW;IACX,EAAE,EAAE;QACF,6BAA6B;QAC7B,+BAA+B;KAChC;IACD,UAAU;IACV,GAAG,EAAE;QACH,0BAA0B;QAC1B,iCAAiC;KAClC;IACD,OAAO;IACP,KAAK,EAAE;QACL,uCAAuC;QACvC,iCAAiC;KAClC;IACD,SAAS;IACT,MAAM,EAAE;QACN,uBAAuB;QACvB,mCAAmC;QACnC,mCAAmC;KACpC;IACD,QAAQ;IACR,KAAK,EAAE;QACL,yBAAyB;QACzB,kCAAkC;KACnC;IACD,QAAQ;IACR,KAAK,EAAE;QACL,sBAAsB;QACtB,kCAAkC;KACnC;IACD,SAAS;IACT,GAAG,EAAE;QACH,+BAA+B;QAC/B,uCAAuC;KACxC;IACD,OAAO;IACP,KAAK,EAAE;QACL,8BAA8B;KAC/B;IACD,SAAS;IACT,IAAI,EAAE;QACJ,wBAAwB;QACxB,mCAAmC;KACpC;IACD,SAAS;IACT,GAAG,EAAE;QACH,yBAAyB;QACzB,2BAA2B;KAC5B;IACD,QAAQ;IACR,GAAG,EAAE;QACH,uBAAuB;QACvB,wBAAwB;QACxB,wBAAwB;KACzB;IACD,OAAO;IACP,IAAI,EAAE;QACJ,yBAAyB;QACzB,2BAA2B;KAC5B;IACD,SAAS;IACT,IAAI,EAAE;QACJ,uBAAuB;KACxB;IACD,QAAQ;IACR,IAAI,EAAE;QACJ,kCAAkC;QAClC,wBAAwB;KACzB;IACD,WAAW;IACX,GAAG,EAAE;QACH,iCAAiC;QACjC,2BAA2B;KAC5B;IACD,MAAM;IACN,GAAG,EAAE;QACH,2BAA2B;QAC3B,uBAAuB;QACvB,4BAA4B;QAC5B,4BAA4B;QAC5B,yBAAyB;KAC1B;IACD,MAAM;IACN,MAAM,EAAE;QACN,kCAAkC;QAClC,kCAAkC;QAClC,kCAAkC;QAClC,yBAAyB;KAC1B;IACD,SAAS;IACT,IAAI,EAAE;QACJ,4BAA4B;KAC7B;IACD,QAAQ;IACR,GAAG,EAAE;QACH,wCAAwC;QACxC,kCAAkC;QAClC,kCAAkC;KACnC;IACD,OAAO;IACP,OAAO,EAAE;QACP,8BAA8B;KAC/B;IACD,YAAY;IACZ,KAAK,EAAE;QACL,2BAA2B;QAC3B,sCAAsC;QACtC,iCAAiC;KAClC;IACD,YAAY;IACZ,IAAI,EAAE;QACJ,0BAA0B;KAC3B;IACD,KAAK;IACL,QAAQ,EAAE;QACR,0BAA0B;KAC3B;IACD,YAAY;IACZ,IAAI,EAAE;QACJ,yCAAyC;QACzC,sCAAsC;KACvC;IACD,UAAU;IACV,MAAM,EAAE;QACN,wBAAwB;KACzB;IACD,SAAS;IACT,GAAG,EAAE;QACH,wBAAwB;KACzB;IACD,WAAW;IACX,GAAG,EAAE;QACH,qCAAqC;QACrC,8BAA8B;KAC/B;IACD,WAAW;IACX,GAAG,EAAE;QACH,yBAAyB;KAC1B;IACD,WAAW;IACX,QAAQ,EAAE;QACR,0BAA0B;QAC1B,2BAA2B;KAC5B;IACD,MAAM;IACN,KAAK,EAAE;QACL,gCAAgC;QAChC,gCAAgC;QAChC,gCAAgC;KACjC;CACF,CAAA;AAED,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,yBAAyB;IACzB,iCAAiC;IACjC,0BAA0B;IAC1B,+BAA+B;CAChC,CAAA"}
|
package/dist/source.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Eip1193Provider } from 'ethers';
|
|
2
|
+
import type { EthersLikeProvider } from './aggregate.js';
|
|
3
|
+
import { type FallbackOptions } from './fallback.js';
|
|
4
|
+
import { type TronProviderOptions, type TronWebLike } from './tron.js';
|
|
5
|
+
/**
|
|
6
|
+
* 可传给 Provider 的底层连接(也可以传数组,按顺序作为主节点 + 备用节点):
|
|
7
|
+
* - RPC URL 字符串(Tron 链上是全节点 HTTP 地址)
|
|
8
|
+
* - ethers v6 Provider(JsonRpcProvider / BrowserProvider / FallbackProvider …)
|
|
9
|
+
* - 浏览器插件钱包注入的 EIP-1193 对象(window.ethereum、OKX、Rabby …),内部用 BrowserProvider 包装
|
|
10
|
+
* - Tron:TronProvider,或钱包注入的 tronWeb(TronLink / OKX …)
|
|
11
|
+
*/
|
|
12
|
+
export type ProviderSource = string | EthersLikeProvider | Eip1193Provider | TronWebLike;
|
|
13
|
+
export interface SourceOptions {
|
|
14
|
+
/** 多节点故障切换参数;单节点时 timeout 也作为 URL 节点的请求超时 */
|
|
15
|
+
fallback?: FallbackOptions;
|
|
16
|
+
/** 用 URL 创建的 TronProvider 的参数(apiKey、minInterval 等) */
|
|
17
|
+
tron?: Omit<TronProviderOptions, 'fullHost' | 'request'>;
|
|
18
|
+
}
|
|
19
|
+
export declare function isTronChain(chainId: number): boolean;
|
|
20
|
+
/** 链的默认节点:EVM 用内置公共节点表,Tron 主网用内置全节点列表 */
|
|
21
|
+
export declare function getDefaultRpcUrls(chainId: number): readonly string[];
|
|
22
|
+
export declare function resolveSource(chainId: number, source: ProviderSource | readonly ProviderSource[] | undefined, options?: SourceOptions): EthersLikeProvider;
|
|
23
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAA;AAE7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAEjE,OAAO,EAA+B,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAEnG;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,kBAAkB,GAAG,eAAe,GAAG,WAAW,CAAA;AAExF,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,uDAAuD;IACvD,IAAI,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,SAAS,CAAC,CAAA;CACzD;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAKpE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,GAAG,SAAS,cAAc,EAAE,GAAG,SAAS,EAC9D,OAAO,GAAE,aAAkB,GAC1B,kBAAkB,CAapB"}
|
package/dist/source.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { BrowserProvider, FetchRequest, JsonRpcProvider } from 'ethers';
|
|
2
|
+
import { FallbackRpc } from './fallback.js';
|
|
3
|
+
import { DEFAULT_RPC_URLS, DEFAULT_TRON_HOSTS } from './rpcNodes.js';
|
|
4
|
+
import { TRON_CHAIN_ID, TronProvider } from './tron.js';
|
|
5
|
+
const TRON_CHAIN_IDS = new Set(Object.values(TRON_CHAIN_ID));
|
|
6
|
+
export function isTronChain(chainId) {
|
|
7
|
+
return TRON_CHAIN_IDS.has(chainId);
|
|
8
|
+
}
|
|
9
|
+
/** 链的默认节点:EVM 用内置公共节点表,Tron 主网用内置全节点列表 */
|
|
10
|
+
export function getDefaultRpcUrls(chainId) {
|
|
11
|
+
if (chainId === TRON_CHAIN_ID.mainnet) {
|
|
12
|
+
return DEFAULT_TRON_HOSTS;
|
|
13
|
+
}
|
|
14
|
+
return DEFAULT_RPC_URLS[chainId] ?? [];
|
|
15
|
+
}
|
|
16
|
+
export function resolveSource(chainId, source, options = {}) {
|
|
17
|
+
const list = source === undefined ? getDefaultRpcUrls(chainId) : Array.isArray(source) ? source : [source];
|
|
18
|
+
if (!list.length) {
|
|
19
|
+
throw new Error(source === undefined
|
|
20
|
+
? `No default RPC for chain ${chainId}, please pass a provider or RPC URLs`
|
|
21
|
+
: 'Provider list is empty');
|
|
22
|
+
}
|
|
23
|
+
// 多节点时 Tron 节点不在单节点内重试 429,直接切到下一个节点
|
|
24
|
+
const multiple = list.length > 1;
|
|
25
|
+
const nodes = list.map((item) => toEthersLike(chainId, item, options, multiple));
|
|
26
|
+
return multiple ? new FallbackRpc(nodes, options.fallback) : nodes[0];
|
|
27
|
+
}
|
|
28
|
+
function toEthersLike(chainId, source, options, multiple) {
|
|
29
|
+
if (typeof source === 'string') {
|
|
30
|
+
if (isTronChain(chainId)) {
|
|
31
|
+
return new TronProvider({ retries: multiple ? 0 : undefined, ...options.tron, fullHost: source });
|
|
32
|
+
}
|
|
33
|
+
// 静态网络(不发 eth_chainId 探测)+ 单次请求超时
|
|
34
|
+
const request = new FetchRequest(source);
|
|
35
|
+
const timeout = options.fallback?.timeout ?? 10_000;
|
|
36
|
+
// timeout <= 0 表示不限制(与 FallbackRpc 一致);FetchRequest 的 0 是立即超时,所以这里不设
|
|
37
|
+
if (timeout > 0 && Number.isFinite(timeout)) {
|
|
38
|
+
request.timeout = timeout;
|
|
39
|
+
}
|
|
40
|
+
return Number.isFinite(chainId)
|
|
41
|
+
? new JsonRpcProvider(request, chainId, { staticNetwork: true })
|
|
42
|
+
: new JsonRpcProvider(request);
|
|
43
|
+
}
|
|
44
|
+
const value = source;
|
|
45
|
+
if (typeof value.call === 'function') {
|
|
46
|
+
return source;
|
|
47
|
+
}
|
|
48
|
+
if (value.fullNode && typeof value.fullNode.request === 'function') {
|
|
49
|
+
return TronProvider.fromTronWeb(source, options.tron);
|
|
50
|
+
}
|
|
51
|
+
if (typeof value.request === 'function') {
|
|
52
|
+
return new BrowserProvider(source);
|
|
53
|
+
}
|
|
54
|
+
throw new Error('Unsupported provider: expected an RPC URL, an ethers Provider, an EIP-1193 provider or a tronWeb instance');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
|
package/dist/tron.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type TransactionRequest } from 'ethers';
|
|
2
|
+
import type { EthersLikeProvider } from './aggregate.js';
|
|
3
|
+
/** Tron 链 ID(与 TronGrid /jsonrpc 的 eth_chainId 一致) */
|
|
4
|
+
export declare const TRON_CHAIN_ID: {
|
|
5
|
+
readonly mainnet: 728126428;
|
|
6
|
+
readonly shasta: 2494104990;
|
|
7
|
+
readonly nile: 3448148188;
|
|
8
|
+
};
|
|
9
|
+
export declare function isTronAddress(value: unknown): boolean;
|
|
10
|
+
/** T 开头的 base58 地址 → 0x 开头的 20 字节地址(ABI 编码用);已经是 0x 地址则原样返回 */
|
|
11
|
+
export declare function toEvmAddress(address: string): string;
|
|
12
|
+
/** 0x 地址 / 41 开头的 hex 地址 → T 开头的 base58 地址 */
|
|
13
|
+
export declare function toTronAddress(address: string): string;
|
|
14
|
+
/** 只用到 tronWeb 的这几个字段,兼容 tronweb v5/v6 及钱包注入的实例 */
|
|
15
|
+
export interface TronWebLike {
|
|
16
|
+
fullNode: {
|
|
17
|
+
request: (url: string, payload: Record<string, unknown>, method: string) => Promise<any>;
|
|
18
|
+
};
|
|
19
|
+
defaultAddress?: {
|
|
20
|
+
base58?: string | false;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export type TronRequest = (path: string, body: Record<string, unknown>) => Promise<any>;
|
|
24
|
+
export interface TronProviderOptions {
|
|
25
|
+
/** 全节点地址,默认 https://api.trongrid.io */
|
|
26
|
+
fullHost?: string;
|
|
27
|
+
/** TronGrid API Key(TRON-PRO-API-KEY) */
|
|
28
|
+
apiKey?: string;
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
/**
|
|
31
|
+
* 自定义请求函数,可以接入已有的 tronWeb:
|
|
32
|
+
* `request: (path, body) => tronWeb.fullNode.request(path, body, 'post')`
|
|
33
|
+
*/
|
|
34
|
+
request?: TronRequest;
|
|
35
|
+
/** 同时在途的最大请求数,避免触发 TronGrid 限频。默认 4 */
|
|
36
|
+
concurrency?: number;
|
|
37
|
+
/** 相邻两次请求发起的最小间隔(毫秒)。没有 API Key 时建议 200 左右。默认 0 */
|
|
38
|
+
minInterval?: number;
|
|
39
|
+
/** 遇到 HTTP 429 时的重试次数(指数退避,从 1s 开始)。默认 3 */
|
|
40
|
+
retries?: number;
|
|
41
|
+
/** 不传 from 时使用的调用者地址;传函数则每次调用时取值(钱包切换账号后自动跟随) */
|
|
42
|
+
defaultFrom?: string | (() => string | null | undefined);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 基于 Tron 全节点 HTTP API 的 Provider 适配器,实现 ethers Provider 的 `call` / `getBalance`,
|
|
46
|
+
* 可以直接传给 `new Provider(TRON_CHAIN_ID.mainnet, tronProvider)`。
|
|
47
|
+
*
|
|
48
|
+
* 不用 TronGrid 的 /jsonrpc 是因为它不支持合约创建调用(deployless)、不带 revert 数据、不支持 value。
|
|
49
|
+
* 注意:Tron HTTP API 只能查询最新状态,传历史 blockTag 会直接报错。
|
|
50
|
+
*/
|
|
51
|
+
export declare class TronProvider implements EthersLikeProvider {
|
|
52
|
+
#private;
|
|
53
|
+
constructor(options?: TronProviderOptions);
|
|
54
|
+
/**
|
|
55
|
+
* 复用浏览器钱包(TronLink / OKX 等)注入的 tronWeb:请求走钱包配置的节点,
|
|
56
|
+
* 默认以当前连接的钱包地址作为调用者(预执行时 msg.sender 即用户)。
|
|
57
|
+
*/
|
|
58
|
+
static fromTronWeb(tronWeb: TronWebLike, options?: Omit<TronProviderOptions, 'request' | 'fullHost'>): TronProvider;
|
|
59
|
+
call(tx: TransactionRequest): Promise<string>;
|
|
60
|
+
getBalance(address: unknown, blockTag?: unknown): Promise<bigint>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=tron.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tron.d.ts","sourceRoot":"","sources":["../src/tron.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,kBAAkB,EACxB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExD,sDAAsD;AACtD,eAAO,MAAM,aAAa;;;;CAIhB,CAAA;AAIV,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcpD;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWrD;AAMD,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;KAAE,CAAA;IACtG,cAAc,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAA;CAC7C;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;AAEvF,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;CACzD;AAcD;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,kBAAkB;;gBAUzC,OAAO,GAAE,mBAAwB;IAuB7C;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,UAAU,CAAM,GAAG,YAAY;IAQjH,IAAI,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiD7C,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAmDxE"}
|
package/dist/tron.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { decodeBase58, encodeBase58, getBytes, hexlify, makeError, sha256, toBeHex, toUtf8String, } from 'ethers';
|
|
2
|
+
/** Tron 链 ID(与 TronGrid /jsonrpc 的 eth_chainId 一致) */
|
|
3
|
+
export const TRON_CHAIN_ID = {
|
|
4
|
+
mainnet: 728126428,
|
|
5
|
+
shasta: 2494104990,
|
|
6
|
+
nile: 3448148188,
|
|
7
|
+
};
|
|
8
|
+
const TRON_ADDRESS_RE = /^T[1-9A-HJ-NP-Za-km-z]{33}$/;
|
|
9
|
+
export function isTronAddress(value) {
|
|
10
|
+
return typeof value === 'string' && TRON_ADDRESS_RE.test(value);
|
|
11
|
+
}
|
|
12
|
+
/** T 开头的 base58 地址 → 0x 开头的 20 字节地址(ABI 编码用);已经是 0x 地址则原样返回 */
|
|
13
|
+
export function toEvmAddress(address) {
|
|
14
|
+
if (!isTronAddress(address)) {
|
|
15
|
+
if (/^41[0-9a-fA-F]{40}$/.test(address)) {
|
|
16
|
+
return `0x${address.slice(2)}`;
|
|
17
|
+
}
|
|
18
|
+
return address;
|
|
19
|
+
}
|
|
20
|
+
const bytes = getBytes(toBeHex(decodeBase58(address), 25));
|
|
21
|
+
const payload = bytes.slice(0, 21);
|
|
22
|
+
const checksum = getBytes(sha256(sha256(payload))).slice(0, 4);
|
|
23
|
+
if (bytes[0] !== 0x41 || hexlify(checksum) !== hexlify(bytes.slice(21))) {
|
|
24
|
+
throw new Error(`Invalid Tron address: ${address}`);
|
|
25
|
+
}
|
|
26
|
+
return hexlify(payload.slice(1));
|
|
27
|
+
}
|
|
28
|
+
/** 0x 地址 / 41 开头的 hex 地址 → T 开头的 base58 地址 */
|
|
29
|
+
export function toTronAddress(address) {
|
|
30
|
+
if (isTronAddress(address)) {
|
|
31
|
+
return address;
|
|
32
|
+
}
|
|
33
|
+
const hex = address.replace(/^0x/i, '').replace(/^41(?=[0-9a-fA-F]{40}$)/, '');
|
|
34
|
+
if (!/^[0-9a-fA-F]{40}$/.test(hex)) {
|
|
35
|
+
throw new Error(`Invalid address: ${address}`);
|
|
36
|
+
}
|
|
37
|
+
const payload = getBytes(`0x41${hex}`);
|
|
38
|
+
const checksum = getBytes(sha256(sha256(payload))).slice(0, 4);
|
|
39
|
+
return encodeBase58(new Uint8Array([...payload, ...checksum]));
|
|
40
|
+
}
|
|
41
|
+
function toTronHex(address) {
|
|
42
|
+
return `41${toEvmAddress(address).slice(2).toLowerCase()}`;
|
|
43
|
+
}
|
|
44
|
+
class HttpError extends Error {
|
|
45
|
+
status;
|
|
46
|
+
constructor(message, status) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.status = status;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb,Tron 的零地址
|
|
52
|
+
const ZERO_OWNER = '410000000000000000000000000000000000000000';
|
|
53
|
+
/**
|
|
54
|
+
* 基于 Tron 全节点 HTTP API 的 Provider 适配器,实现 ethers Provider 的 `call` / `getBalance`,
|
|
55
|
+
* 可以直接传给 `new Provider(TRON_CHAIN_ID.mainnet, tronProvider)`。
|
|
56
|
+
*
|
|
57
|
+
* 不用 TronGrid 的 /jsonrpc 是因为它不支持合约创建调用(deployless)、不带 revert 数据、不支持 value。
|
|
58
|
+
* 注意:Tron HTTP API 只能查询最新状态,传历史 blockTag 会直接报错。
|
|
59
|
+
*/
|
|
60
|
+
export class TronProvider {
|
|
61
|
+
#request;
|
|
62
|
+
#concurrency;
|
|
63
|
+
#minInterval;
|
|
64
|
+
#retries;
|
|
65
|
+
#defaultFrom;
|
|
66
|
+
#active = 0;
|
|
67
|
+
#nextStart = 0;
|
|
68
|
+
#waiting = [];
|
|
69
|
+
constructor(options = {}) {
|
|
70
|
+
this.#concurrency = Math.max(1, options.concurrency ?? 4);
|
|
71
|
+
this.#minInterval = Math.max(0, options.minInterval ?? 0);
|
|
72
|
+
this.#retries = Math.max(0, options.retries ?? 3);
|
|
73
|
+
this.#defaultFrom = options.defaultFrom;
|
|
74
|
+
if (options.request) {
|
|
75
|
+
this.#request = options.request;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const host = (options.fullHost ?? 'https://api.trongrid.io').replace(/\/+$/, '');
|
|
79
|
+
const headers = { 'content-type': 'application/json', ...options.headers };
|
|
80
|
+
if (options.apiKey) {
|
|
81
|
+
headers['TRON-PRO-API-KEY'] = options.apiKey;
|
|
82
|
+
}
|
|
83
|
+
this.#request = async (path, body) => {
|
|
84
|
+
const res = await fetch(`${host}/${path}`, { method: 'POST', headers, body: JSON.stringify(body) });
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
throw new HttpError(`Tron request ${path} failed: HTTP ${res.status}`, res.status);
|
|
87
|
+
}
|
|
88
|
+
return res.json();
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 复用浏览器钱包(TronLink / OKX 等)注入的 tronWeb:请求走钱包配置的节点,
|
|
94
|
+
* 默认以当前连接的钱包地址作为调用者(预执行时 msg.sender 即用户)。
|
|
95
|
+
*/
|
|
96
|
+
static fromTronWeb(tronWeb, options = {}) {
|
|
97
|
+
return new TronProvider({
|
|
98
|
+
...options,
|
|
99
|
+
defaultFrom: options.defaultFrom ?? (() => tronWeb.defaultAddress?.base58 || undefined),
|
|
100
|
+
request: (path, body) => tronWeb.fullNode.request(path, body, 'post'),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async call(tx) {
|
|
104
|
+
assertLatest(tx.blockTag);
|
|
105
|
+
const body = {
|
|
106
|
+
owner_address: tx.from ? toTronHex(String(tx.from)) : this.#getDefaultFrom(),
|
|
107
|
+
data: String(tx.data ?? '0x').replace(/^0x/, ''),
|
|
108
|
+
};
|
|
109
|
+
if (tx.to) {
|
|
110
|
+
body.contract_address = toTronHex(String(tx.to));
|
|
111
|
+
}
|
|
112
|
+
if (tx.value) {
|
|
113
|
+
body.call_value = Number(BigInt(tx.value));
|
|
114
|
+
}
|
|
115
|
+
const res = await this.#limit(() => this.#request('wallet/triggerconstantcontract', body));
|
|
116
|
+
const result = res?.result ?? {};
|
|
117
|
+
const message = typeof result.message === 'string' ? decodeMessage(result.message) : '';
|
|
118
|
+
if (result.code) {
|
|
119
|
+
// 地址上没有合约:与 EVM 节点一致返回 0x(multicall 地址无效时会据此退回 deployless)
|
|
120
|
+
if (result.code === 'CONTRACT_VALIDATE_ERROR' && /not exist/i.test(message)) {
|
|
121
|
+
return '0x';
|
|
122
|
+
}
|
|
123
|
+
// 其余 code(如 call_value 超过余额)是交易本身校验不通过,换节点也一样:
|
|
124
|
+
// 按执行错误抛出(isExecutionError 能识别),不触发 FallbackRpc 换节点,staticCall 得到 CallFailedError
|
|
125
|
+
throw makeError(`Tron call failed: ${result.code}${message ? ` ${message}` : ''}`, 'CALL_EXCEPTION', {
|
|
126
|
+
action: 'call',
|
|
127
|
+
data: null,
|
|
128
|
+
reason: message || null,
|
|
129
|
+
transaction: { to: tx.to ? String(tx.to) : null, from: tx.from ? String(tx.from) : undefined, data: String(tx.data ?? '0x') },
|
|
130
|
+
invocation: null,
|
|
131
|
+
revert: null,
|
|
132
|
+
info: { error: { code: result.code, message: `${result.code}: ${message}` } },
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const output = `0x${res?.constant_result?.[0] ?? ''}`;
|
|
136
|
+
if (res?.transaction?.ret?.[0]?.ret === 'FAILED') {
|
|
137
|
+
throw makeError(message || 'execution reverted', 'CALL_EXCEPTION', {
|
|
138
|
+
action: 'call',
|
|
139
|
+
data: output,
|
|
140
|
+
reason: null,
|
|
141
|
+
transaction: { to: tx.to ? String(tx.to) : null, from: tx.from ? String(tx.from) : undefined, data: String(tx.data ?? '0x') },
|
|
142
|
+
invocation: null,
|
|
143
|
+
revert: null,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return output;
|
|
147
|
+
}
|
|
148
|
+
async getBalance(address, blockTag) {
|
|
149
|
+
assertLatest(blockTag);
|
|
150
|
+
const res = await this.#limit(() => this.#request('wallet/getaccount', { address: toTronHex(String(address)) }));
|
|
151
|
+
return BigInt(res?.balance ?? 0);
|
|
152
|
+
}
|
|
153
|
+
#getDefaultFrom() {
|
|
154
|
+
const from = typeof this.#defaultFrom === 'function' ? this.#defaultFrom() : this.#defaultFrom;
|
|
155
|
+
return from ? toTronHex(from) : ZERO_OWNER;
|
|
156
|
+
}
|
|
157
|
+
async #limit(task) {
|
|
158
|
+
if (this.#active >= this.#concurrency) {
|
|
159
|
+
// 名额由释放方直接转交(#active 不变),避免被唤醒前被新来的请求抢走而超出并发上限
|
|
160
|
+
await new Promise((resolve) => this.#waiting.push(resolve));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.#active++;
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
for (let attempt = 0;; attempt++) {
|
|
167
|
+
await this.#throttle();
|
|
168
|
+
try {
|
|
169
|
+
return await task();
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
if (attempt >= this.#retries || !isRateLimited(err)) {
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
await sleep(1000 * 2 ** attempt);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
const next = this.#waiting.shift();
|
|
181
|
+
if (next) {
|
|
182
|
+
next();
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
this.#active--;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async #throttle() {
|
|
190
|
+
if (!this.#minInterval) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
const start = Math.max(now, this.#nextStart);
|
|
195
|
+
this.#nextStart = start + this.#minInterval;
|
|
196
|
+
if (start > now) {
|
|
197
|
+
await sleep(start - now);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function assertLatest(blockTag) {
|
|
202
|
+
if (blockTag === undefined || blockTag === null || blockTag === 'latest' || blockTag === 'pending') {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
throw new Error(`Tron does not support calls at block ${String(blockTag)}`);
|
|
206
|
+
}
|
|
207
|
+
function isRateLimited(err) {
|
|
208
|
+
// fetch 实现抛 HttpError;tronWeb(axios)的错误带 response.status
|
|
209
|
+
const e = err;
|
|
210
|
+
return e?.status === 429 || e?.response?.status === 429;
|
|
211
|
+
}
|
|
212
|
+
function sleep(ms) {
|
|
213
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
214
|
+
}
|
|
215
|
+
function decodeMessage(hex) {
|
|
216
|
+
try {
|
|
217
|
+
return toUtf8String(`0x${hex}`);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return hex;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=tron.js.map
|
package/dist/tron.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tron.js","sourceRoot":"","sources":["../src/tron.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@w3lib/evm-batch-call",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Batched EVM/Tron contract reads via Multicall3 with deployless fallback, native balances, RPC failover, auto-batching and staticCall simulation. ethcall compatible.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ethers",
|
|
7
|
+
"ethereum",
|
|
8
|
+
"evm",
|
|
9
|
+
"multicall",
|
|
10
|
+
"multicall3",
|
|
11
|
+
"batch",
|
|
12
|
+
"ethcall"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"author": "L",
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"src",
|
|
28
|
+
"contracts",
|
|
29
|
+
"README.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"ethers": "^6.0.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"ethers": "^6.17.0",
|
|
41
|
+
"solc": "0.8.30"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/web3-lib/libs.git",
|
|
49
|
+
"directory": "packages/evm-batch-call"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/web3-lib/libs/tree/main/packages/evm-batch-call#readme",
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/web3-lib/libs/issues"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
57
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:live": "LIVE=1 vitest run test/live.test.ts",
|
|
60
|
+
"build:contracts": "node scripts/build-contracts.mjs",
|
|
61
|
+
"check:rpc": "node scripts/check-rpc-nodes.mjs"
|
|
62
|
+
}
|
|
63
|
+
}
|