@subsquid/evm-typegen 4.3.0 → 4.5.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/lib/main.js +26 -10
- package/lib/main.js.map +1 -1
- package/lib/multicall.d.ts +6 -6
- package/lib/multicall.d.ts.map +1 -1
- package/lib/multicall.js +48 -45
- package/lib/multicall.js.map +1 -1
- package/lib/util/fetch.js +1 -2
- package/lib/util/fetch.js.map +1 -1
- package/lib/util/types.js +1 -2
- package/lib/util/types.js.map +1 -1
- package/package.json +5 -5
- package/src/main.ts +49 -15
- package/src/multicall.ts +72 -64
package/lib/main.js
CHANGED
|
@@ -47,8 +47,9 @@ The generated facades are assumed to be used by "squids" indexing EVM data.
|
|
|
47
47
|
.argument('<output-dir>', 'output directory for generated definitions')
|
|
48
48
|
.argument('[abi...]', 'ABI file', specArgument)
|
|
49
49
|
.option('--multicall', 'generate facade for MakerDAO multicall contract')
|
|
50
|
-
.option('--etherscan-api <url>', 'etherscan API to fetch contract ABI by a known address', validator.Url(['http:', 'https:']))
|
|
50
|
+
.option('--etherscan-api <url>', 'etherscan API to fetch contract ABI by a known address', validator.Url(['http:', 'https:']), 'https://api.etherscan.io/v2')
|
|
51
51
|
.option('--etherscan-api-key <key>', 'etherscan API key')
|
|
52
|
+
.option('--etherscan-chain-id <id>', 'the id of the chain to fetch the contract from', validator.positiveInt)
|
|
52
53
|
.option('--clean', 'delete output directory before run')
|
|
53
54
|
.addHelpText('afterAll', `
|
|
54
55
|
ABI file can be specified in three ways:
|
|
@@ -94,7 +95,7 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
|
|
|
94
95
|
}, (err) => LOG.fatal(err));
|
|
95
96
|
async function read(spec, options) {
|
|
96
97
|
if (spec.kind == 'address') {
|
|
97
|
-
return fetchFromEtherscan(spec.src, options
|
|
98
|
+
return fetchFromEtherscan(spec.src, getEtherscanAPIConfig(options));
|
|
98
99
|
}
|
|
99
100
|
let abi;
|
|
100
101
|
if (spec.kind == 'url') {
|
|
@@ -113,13 +114,21 @@ async function read(spec, options) {
|
|
|
113
114
|
throw new Error('Unrecognized ABI format');
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
|
-
async function fetchFromEtherscan(address,
|
|
117
|
-
api = api
|
|
118
|
-
let url = new URL(
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
async function fetchFromEtherscan(address, config) {
|
|
118
|
+
let api = config.api + (config.api.endsWith('/') ? '' : '/') + 'api';
|
|
119
|
+
let url = new URL(api);
|
|
120
|
+
let params = new URLSearchParams({
|
|
121
|
+
module: 'contract',
|
|
122
|
+
action: 'getabi',
|
|
123
|
+
address,
|
|
124
|
+
});
|
|
125
|
+
if (config.chainId) {
|
|
126
|
+
params.set('chainid', config.chainId);
|
|
127
|
+
}
|
|
128
|
+
if (config.apiKey) {
|
|
129
|
+
params.set('apiKey', config.apiKey);
|
|
130
|
+
}
|
|
131
|
+
url.search = params.toString();
|
|
123
132
|
let response;
|
|
124
133
|
let attempts = 0;
|
|
125
134
|
while (true) {
|
|
@@ -140,7 +149,7 @@ async function fetchFromEtherscan(address, api, apiKey) {
|
|
|
140
149
|
return JSON.parse(response.result);
|
|
141
150
|
}
|
|
142
151
|
else {
|
|
143
|
-
throw new Error(`Failed to fetch contract ABI from ${api}: ${response.result}`);
|
|
152
|
+
throw new Error(`Failed to fetch contract ABI from ${config.api}: ${response.result}`);
|
|
144
153
|
}
|
|
145
154
|
}
|
|
146
155
|
function specArgument(value, prev) {
|
|
@@ -195,4 +204,11 @@ function basename(file) {
|
|
|
195
204
|
return name;
|
|
196
205
|
throw new commander_1.InvalidArgumentError(`Can't derive target basename for output files. Use url fragment to specify it, e.g. #erc20`);
|
|
197
206
|
}
|
|
207
|
+
function getEtherscanAPIConfig(options) {
|
|
208
|
+
return {
|
|
209
|
+
api: options.etherscanApi || 'https://api.etherscan.io/v2',
|
|
210
|
+
apiKey: options.etherscanApiKey || undefined,
|
|
211
|
+
chainId: options.etherscanChainId || (options.etherscanApi ? undefined : '1'),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
198
214
|
//# sourceMappingURL=main.js.map
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAwB;AACxB,gDAAuB;AACvB,yCAAyD;AACzD,6CAA+C;AAC/C,2DAA0D;AAC1D,6EAA8D;AAC9D,uCAAmC;AACnC,wCAAkC;AAClC,qFAA6D;AAE7D,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,iBAAiB,CAAC,CAAA;AAE3C,IAAA,0BAAU,EACR,KAAK;IACH,mBAAO;SACJ,WAAW,CACV;;;;KAIH,CAAC,IAAI,EAAE,CACL;SACA,IAAI,CAAC,mBAAmB,CAAC;SACzB,QAAQ,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACtE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC;SAC9C,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;SACxE,MAAM,CACL,uBAAuB,EACvB,wDAAwD,EACxD,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAwB;AACxB,gDAAuB;AACvB,yCAAyD;AACzD,6CAA+C;AAC/C,2DAA0D;AAC1D,6EAA8D;AAC9D,uCAAmC;AACnC,wCAAkC;AAClC,qFAA6D;AAE7D,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,iBAAiB,CAAC,CAAA;AAE3C,IAAA,0BAAU,EACR,KAAK;IACH,mBAAO;SACJ,WAAW,CACV;;;;KAIH,CAAC,IAAI,EAAE,CACL;SACA,IAAI,CAAC,mBAAmB,CAAC;SACzB,QAAQ,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACtE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC;SAC9C,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;SACxE,MAAM,CACL,uBAAuB,EACvB,wDAAwD,EACxD,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAClC,6BAA6B,CAC9B;SACA,MAAM,CAAC,2BAA2B,EAAE,mBAAmB,CAAC;SACxD,MAAM,CACL,2BAA2B,EAC3B,gDAAgD,EAChD,SAAS,CAAC,WAAW,CACtB;SACA,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC;SACvD,WAAW,CACV,UAAU,EACV;;;;;;;;;;;;;;;;;;;SAmBC,CACF,CAAA;IAEH,mBAAO,CAAC,KAAK,EAAE,CAAA;IAEf,IAAI,IAAI,GAAG,mBAAO,CAAC,IAAI,EAMtB,CAAA;IACD,IAAI,IAAI,GAAG,IAAI,mCAAM,CAAC,mBAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,IAAI,KAAK,GAAG,mBAAO,CAAC,aAAa,CAAC,CAAC,CAAW,CAAA;IAE9C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,EAAE,CAAA;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;QACnD,OAAM;IACR,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAA;QAC5D,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAClC,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,IAAI,iBAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC9D,CAAC;AACH,CAAC,EACD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CACxB,CAAA;AAED,KAAK,UAAU,IAAI,CACjB,IAAU,EACV,OAIC;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,GAAQ,CAAA;IACZ,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,GAAG,GAAG,MAAM,IAAA,WAAG,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IACtD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAA;IACZ,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,GAAG,CAAC,GAAG,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,OAAe,EACf,MAA0B;IAE1B,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACpE,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IAEtB,IAAI,MAAM,GAAG,IAAI,eAAe,CAAC;QAC/B,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,QAAQ;QAChB,OAAO;KACR,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;IAE9B,IAAI,QAA4C,CAAA;IAChD,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,QAAQ,GAAG,MAAM,IAAA,WAAG,EAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpC,IACE,QAAQ,CAAC,MAAM,IAAI,GAAG;YACtB,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;YACtC,QAAQ,GAAG,CAAC,EACZ,CAAC;YACD,QAAQ,IAAI,CAAC,CAAA;YACb,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAA;YAC1B,GAAG,CAAC,IAAI,CACN,8EAA8E,OAAO,WAAW,CACjG,CAAA;YACD,MAAM,IAAA,oBAAI,EAAC,OAAO,GAAG,IAAI,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,MAAK;QACP,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,EAAE,CACtE,CAAA;IACH,CAAC;AACH,CAAC;AAQD,SAAS,YAAY,CAAC,KAAa,EAAE,IAAa;IAChD,IAAI,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAC3B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAA;IACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACf,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,IAAI,CAAA;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YACjB,MAAM,IAAI,gCAAoB,CAAC,0BAA0B,CAAC,CAAA;QAC5D,OAAO;YACL,IAAI,EAAE,SAAS;YACf,GAAG;YACH,IAAI,EAAE,QAAQ,IAAI,GAAG;SACtB,CAAA;IACH,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,GAAG;YACH,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;SACvC,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,GAAG;YACH,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC;SAChC,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QAC3B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,GAAG,cAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;IAChC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,IAAI,gCAAoB,CAC5B,4FAA4F,CAC7F,CAAA;AACH,CAAC;AAQD,SAAS,qBAAqB,CAAC,OAI9B;IACG,OAAO;QACH,GAAG,EAAE,OAAO,CAAC,YAAY,IAAI,6BAA6B;QAC1D,MAAM,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;QAC5C,OAAO,EAAE,OAAO,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;KAChF,CAAA;AACL,CAAC"}
|
package/lib/multicall.d.ts
CHANGED
|
@@ -39,12 +39,12 @@ export declare class Multicall extends ContractBase {
|
|
|
39
39
|
readonly success: boolean;
|
|
40
40
|
readonly returnData: string;
|
|
41
41
|
}[]>>;
|
|
42
|
-
aggregate<TF extends AnyFunc>(func: TF, address: string, calls: FunctionArguments<TF>[],
|
|
43
|
-
aggregate<TF extends AnyFunc>(func: TF, calls: (readonly [address: string, args: FunctionArguments<TF>])[],
|
|
44
|
-
aggregate(calls: AggregateTuple[],
|
|
45
|
-
tryAggregate<TF extends AnyFunc>(func: TF, address: string, calls: FunctionArguments<TF>[],
|
|
46
|
-
tryAggregate<TF extends AnyFunc>(func: TF, calls: (readonly [address: string, args: FunctionArguments<TF>])[],
|
|
47
|
-
tryAggregate(calls: AggregateTuple[],
|
|
42
|
+
aggregate<TF extends AnyFunc>(func: TF, address: string, calls: FunctionArguments<TF>[], pageSize?: number): Promise<FunctionReturn<TF>[]>;
|
|
43
|
+
aggregate<TF extends AnyFunc>(func: TF, calls: (readonly [address: string, args: FunctionArguments<TF>])[], pageSize?: number): Promise<FunctionReturn<TF>[]>;
|
|
44
|
+
aggregate(calls: AggregateTuple[], pageSize?: number): Promise<any[]>;
|
|
45
|
+
tryAggregate<TF extends AnyFunc>(func: TF, address: string, calls: FunctionArguments<TF>[], pageSize?: number): Promise<MulticallResult<TF>[]>;
|
|
46
|
+
tryAggregate<TF extends AnyFunc>(func: TF, calls: (readonly [address: string, args: FunctionArguments<TF>])[], pageSize?: number): Promise<MulticallResult<TF>[]>;
|
|
47
|
+
tryAggregate(calls: AggregateTuple[], pageSize?: number): Promise<MulticallResult<any>[]>;
|
|
48
48
|
private makeCalls;
|
|
49
49
|
}
|
|
50
50
|
export {};
|
package/lib/multicall.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,qBAAqB,CAAA;AACxC,OAAO,EAAM,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAC,MAAM,mBAAmB,CAAA;AAclH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;IAC7D,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CACzB,GAAG;IACF,OAAO,EAAE,KAAK,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,KAAK,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AACpC,KAAK,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;AAGrI,qBAAa,SAAU,SAAQ,YAAY;IACzC,MAAM,CAAC,SAAS;;;;;;;;;;;OAAY;IAC5B,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;UAAe;IAElC,SAAS,CAAC,EAAE,SAAS,OAAO,EAC1B,IAAI,EAAE,EAAE,EACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAC9B,
|
|
1
|
+
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,qBAAqB,CAAA;AACxC,OAAO,EAAM,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAC,MAAM,mBAAmB,CAAA;AAclH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;IAC7D,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CACzB,GAAG;IACF,OAAO,EAAE,KAAK,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,KAAK,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AACpC,KAAK,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;AAGrI,qBAAa,SAAU,SAAQ,YAAY;IACzC,MAAM,CAAC,SAAS;;;;;;;;;;;OAAY;IAC5B,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;UAAe;IAElC,SAAS,CAAC,EAAE,SAAS,OAAO,EAC1B,IAAI,EAAE,EAAE,EACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;IAEhC,SAAS,CAAC,EAAE,SAAS,OAAO,EAC1B,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAClE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;IAEhC,SAAS,CACP,KAAK,EAAE,cAAc,EAAE,EACvB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,EAAE,CAAC;IAiBjB,YAAY,CAAC,EAAE,SAAS,OAAO,EAC7B,IAAI,EAAE,EAAE,EACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;IAEjC,YAAY,CAAC,EAAE,SAAS,OAAO,EAC7B,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAClE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;IAEjC,YAAY,CACV,KAAK,EAAE,cAAc,EAAE,EACvB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAiClC,OAAO,CAAC,SAAS;CAqClB"}
|
package/lib/multicall.js
CHANGED
|
@@ -38,45 +38,43 @@ const tryAggregate = (0, evm_abi_1.fun)('0xbce38bd7', "tryAggregate(bool,(addres
|
|
|
38
38
|
}, p.array(p.struct({ success: p.bool, returnData: p.bytes })));
|
|
39
39
|
class Multicall extends evm_abi_1.ContractBase {
|
|
40
40
|
async aggregate(...args) {
|
|
41
|
-
let [calls,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
}
|
|
41
|
+
let [calls, pageSize] = this.makeCalls(args);
|
|
42
|
+
if (calls.length === 0)
|
|
43
|
+
return [];
|
|
44
|
+
const pages = Array.from(splitArray(pageSize, calls));
|
|
45
|
+
const results = await Promise.all(pages.flatMap(async (page) => {
|
|
46
|
+
const { returnData } = await this.eth_call(aggregate, { calls: page });
|
|
47
|
+
return returnData.map((data, i) => page[i].func.decodeResult(data));
|
|
48
|
+
}));
|
|
51
49
|
return results;
|
|
52
50
|
}
|
|
53
51
|
async tryAggregate(...args) {
|
|
54
|
-
let [calls,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
let [calls, pageSize] = this.makeCalls(args);
|
|
53
|
+
if (calls.length === 0)
|
|
54
|
+
return [];
|
|
55
|
+
const pages = Array.from(splitArray(pageSize, calls));
|
|
56
|
+
const results = await Promise.all(pages.flatMap(async (page) => {
|
|
57
|
+
const response = await this.eth_call(tryAggregate, {
|
|
59
58
|
requireSuccess: false,
|
|
60
|
-
calls:
|
|
59
|
+
calls: page,
|
|
61
60
|
});
|
|
62
|
-
|
|
63
|
-
let res = response[i - from];
|
|
61
|
+
return response.map((res, i) => {
|
|
64
62
|
if (res.success) {
|
|
65
63
|
try {
|
|
66
|
-
|
|
64
|
+
return {
|
|
67
65
|
success: true,
|
|
68
|
-
value:
|
|
66
|
+
value: page[i].func.decodeResult(res.returnData)
|
|
69
67
|
};
|
|
70
68
|
}
|
|
71
69
|
catch (err) {
|
|
72
|
-
|
|
70
|
+
return { success: false, returnData: res.returnData };
|
|
73
71
|
}
|
|
74
72
|
}
|
|
75
73
|
else {
|
|
76
|
-
|
|
74
|
+
return { success: false };
|
|
77
75
|
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
76
|
+
});
|
|
77
|
+
}));
|
|
80
78
|
return results;
|
|
81
79
|
}
|
|
82
80
|
makeCalls(args) {
|
|
@@ -85,55 +83,60 @@ class Multicall extends evm_abi_1.ContractBase {
|
|
|
85
83
|
case 1: {
|
|
86
84
|
let list = args[0];
|
|
87
85
|
let calls = new Array(list.length);
|
|
88
|
-
let funcs = new Array(list.length);
|
|
89
86
|
for (let i = 0; i < list.length; i++) {
|
|
90
87
|
let [func, address, args] = list[i];
|
|
91
|
-
calls[i] = { target: address, callData: func.encode(args) };
|
|
92
|
-
funcs[i] = func;
|
|
88
|
+
calls[i] = { target: address, callData: func.encode(args), func };
|
|
93
89
|
}
|
|
94
|
-
return [calls,
|
|
90
|
+
return [calls, page];
|
|
95
91
|
}
|
|
96
92
|
case 2: {
|
|
97
93
|
let func = args[0];
|
|
98
94
|
let list = args[1];
|
|
99
95
|
let calls = new Array(list.length);
|
|
100
|
-
let funcs = new Array(list.length);
|
|
101
96
|
for (let i = 0; i < list.length; i++) {
|
|
102
97
|
let [address, args] = list[i];
|
|
103
|
-
calls[i] = { target: address, callData: func.encode(args) };
|
|
104
|
-
funcs[i] = func;
|
|
98
|
+
calls[i] = { target: address, callData: func.encode(args), func };
|
|
105
99
|
}
|
|
106
|
-
return [calls,
|
|
100
|
+
return [calls, page];
|
|
107
101
|
}
|
|
108
102
|
case 3: {
|
|
109
103
|
let func = args[0];
|
|
110
104
|
let address = args[1];
|
|
111
105
|
let list = args[2];
|
|
112
106
|
let calls = new Array(list.length);
|
|
113
|
-
let funcs = new Array(list.length);
|
|
114
107
|
for (let i = 0; i < list.length; i++) {
|
|
115
108
|
let args = list[i];
|
|
116
|
-
calls[i] = { target: address, callData: func.encode(args) };
|
|
117
|
-
funcs[i] = func;
|
|
109
|
+
calls[i] = { target: address, callData: func.encode(args), func };
|
|
118
110
|
}
|
|
119
|
-
return [calls,
|
|
111
|
+
return [calls, page];
|
|
120
112
|
}
|
|
121
113
|
default:
|
|
122
|
-
throw new Error(
|
|
114
|
+
throw new Error(`Unexpected number of arguments: ${args.length}`);
|
|
123
115
|
}
|
|
124
116
|
}
|
|
125
117
|
}
|
|
126
118
|
exports.Multicall = Multicall;
|
|
127
119
|
Multicall.aggregate = aggregate;
|
|
128
120
|
Multicall.tryAggregate = tryAggregate;
|
|
129
|
-
function*
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
let
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
121
|
+
function* splitSlice(maxSize, beg, end) {
|
|
122
|
+
maxSize = Math.max(1, maxSize);
|
|
123
|
+
end = end ?? Number.MAX_SAFE_INTEGER;
|
|
124
|
+
while (beg < end) {
|
|
125
|
+
let left = end - beg;
|
|
126
|
+
let splits = Math.ceil(left / maxSize);
|
|
127
|
+
let step = Math.round(left / splits);
|
|
128
|
+
yield [beg, beg + step];
|
|
129
|
+
beg += step;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function* splitArray(maxSize, arr) {
|
|
133
|
+
if (arr.length <= maxSize) {
|
|
134
|
+
yield arr;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
for (let [beg, end] of splitSlice(maxSize, 0, arr.length)) {
|
|
138
|
+
yield arr.slice(beg, end);
|
|
139
|
+
}
|
|
137
140
|
}
|
|
138
141
|
}
|
|
139
142
|
//# sourceMappingURL=multicall.js.map
|
package/lib/multicall.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAwC;AACxC,+CAAkH;AAElH,MAAM,SAAS,GAAG,IAAA,aAAG,EAAC,YAAY,EAAE,8BAA8B,EAAE;IAClE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,QAAQ,EAAE,CAAC,CAAC,KAAK;KAClB,CAAC,CAAC;CACJ,EAAE,EAAC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAC,CAAC,CAAA;AAE1D,MAAM,YAAY,GAAG,IAAA,aAAG,EAAC,YAAY,EAAE,sCAAsC,EAAE;IAC7E,cAAc,EAAE,CAAC,CAAC,IAAI;IACtB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAC,CAAC,CAAC;CACjE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAC,CAAC,CAAC,CAAC,CAAA;AAe7D,MAAa,SAAU,SAAQ,sBAAY;IAsBzC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAW;QAC5B,IAAI,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"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"}
|
package/lib/util/fetch.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GET =
|
|
3
|
+
exports.GET = GET;
|
|
4
4
|
const logger_1 = require("@subsquid/logger");
|
|
5
5
|
const http_client_1 = require("@subsquid/http-client");
|
|
6
6
|
const http = new http_client_1.HttpClient({
|
|
@@ -10,5 +10,4 @@ const http = new http_client_1.HttpClient({
|
|
|
10
10
|
function GET(url) {
|
|
11
11
|
return http.get(url);
|
|
12
12
|
}
|
|
13
|
-
exports.GET = GET;
|
|
14
13
|
//# sourceMappingURL=fetch.js.map
|
package/lib/util/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":";;AAQA,kBAEC;AAVD,6CAA+C;AAC/C,uDAAkD;AAElD,MAAM,IAAI,GAAG,IAAI,wBAAU,CAAC;IAC1B,GAAG,EAAE,IAAA,qBAAY,EAAC,uBAAuB,CAAC;IAC1C,aAAa,EAAE,CAAC;CACjB,CAAC,CAAA;AAEF,SAAgB,GAAG,CAAU,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACtB,CAAC"}
|
package/lib/util/types.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getType =
|
|
3
|
+
exports.getType = getType;
|
|
4
4
|
function isStaticArray(param) {
|
|
5
5
|
return param.type.match(/\[\d+]$/);
|
|
6
6
|
}
|
|
@@ -43,5 +43,4 @@ function getType(param, index) {
|
|
|
43
43
|
}
|
|
44
44
|
return `p.${param.type}`;
|
|
45
45
|
}
|
|
46
|
-
exports.getType = getType;
|
|
47
46
|
//# sourceMappingURL=types.js.map
|
package/lib/util/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":";;AAkBA,0BAmCC;AAnDD,SAAS,aAAa,CAAC,KAAwB;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,SAAgB,OAAO,CAAC,KAAwB,EAAE,KAAc;IAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,GAAG,KAAK,CAAA;IAExC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,IAAI,MAAM,OAAO,CAAC,aAAoB,CAAC,EAAE,CAAA;IACtD,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,CAAA;IACjD,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAA;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,WAAW,OAAO,CAAC,cAAqB,CAAC,GAAG,CAAA;IACrD,CAAC;IACD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACrC,OAAO,oBAAoB,OAAO,CAAC;YACjC,GAAG,KAAK;YACR,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC;SAC5B,CAAC,KAAK,QAAQ,GAAG,CAAA;IACpB,CAAC;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,OAAO,CAAC;YACxB,GAAG,KAAK;YACR,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC;SAC5B,CAAC,GAAG,CAAA;IACP,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,aAAc,KAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAuB,EAAE,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;IAChI,CAAC;IAED,OAAO,KAAK,KAAK,CAAC,IAAI,EAAE,CAAA;AAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subsquid/evm-typegen",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "CLI for generating typescript types and decode implementations for evm logs",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"repository": "git@github.com:subsquid/squid.git",
|
|
@@ -16,19 +16,19 @@
|
|
|
16
16
|
"squid-evm-typegen": "bin/run.js"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@subsquid/http-client": "^1.
|
|
20
|
-
"@subsquid/logger": "^1.
|
|
19
|
+
"@subsquid/http-client": "^1.8.0",
|
|
20
|
+
"@subsquid/logger": "^1.4.0",
|
|
21
21
|
"@subsquid/util-internal": "^3.2.0",
|
|
22
22
|
"@subsquid/util-internal-code-printer": "^1.2.2",
|
|
23
23
|
"@subsquid/util-internal-commander": "^1.4.0",
|
|
24
24
|
"@subsquid/evm-codec": "^0.3.0",
|
|
25
|
-
"@subsquid/evm-abi": "^0.3.
|
|
25
|
+
"@subsquid/evm-abi": "^0.3.1",
|
|
26
26
|
"commander": "^11.1.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^18.18.14",
|
|
30
30
|
"abitype": "^1.0.4",
|
|
31
|
-
"typescript": "~5.
|
|
31
|
+
"typescript": "~5.5.4"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "rm -rf lib && tsc"
|
package/src/main.ts
CHANGED
|
@@ -28,8 +28,14 @@ The generated facades are assumed to be used by "squids" indexing EVM data.
|
|
|
28
28
|
'--etherscan-api <url>',
|
|
29
29
|
'etherscan API to fetch contract ABI by a known address',
|
|
30
30
|
validator.Url(['http:', 'https:']),
|
|
31
|
+
'https://api.etherscan.io/v2'
|
|
31
32
|
)
|
|
32
33
|
.option('--etherscan-api-key <key>', 'etherscan API key')
|
|
34
|
+
.option(
|
|
35
|
+
'--etherscan-chain-id <id>',
|
|
36
|
+
'the id of the chain to fetch the contract from',
|
|
37
|
+
validator.positiveInt,
|
|
38
|
+
)
|
|
33
39
|
.option('--clean', 'delete output directory before run')
|
|
34
40
|
.addHelpText(
|
|
35
41
|
'afterAll',
|
|
@@ -60,8 +66,9 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
|
|
|
60
66
|
let opts = program.opts() as {
|
|
61
67
|
clean?: boolean
|
|
62
68
|
multicall?: boolean
|
|
63
|
-
etherscanApi
|
|
69
|
+
etherscanApi: string
|
|
64
70
|
etherscanApiKey?: string
|
|
71
|
+
etherscanChainId?: string
|
|
65
72
|
}
|
|
66
73
|
let dest = new OutDir(program.processedArgs[0])
|
|
67
74
|
let specs = program.processedArgs[1] as Spec[]
|
|
@@ -92,14 +99,14 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
|
|
|
92
99
|
|
|
93
100
|
async function read(
|
|
94
101
|
spec: Spec,
|
|
95
|
-
options
|
|
102
|
+
options: {
|
|
103
|
+
etherscanApi: string;
|
|
104
|
+
etherscanChainId?: string
|
|
105
|
+
etherscanApiKey?: string,
|
|
106
|
+
},
|
|
96
107
|
): Promise<any> {
|
|
97
108
|
if (spec.kind == 'address') {
|
|
98
|
-
return fetchFromEtherscan(
|
|
99
|
-
spec.src,
|
|
100
|
-
options?.etherscanApi,
|
|
101
|
-
options?.etherscanApiKey,
|
|
102
|
-
)
|
|
109
|
+
return fetchFromEtherscan(spec.src, getEtherscanAPIConfig(options))
|
|
103
110
|
}
|
|
104
111
|
let abi: any
|
|
105
112
|
if (spec.kind == 'url') {
|
|
@@ -118,15 +125,24 @@ async function read(
|
|
|
118
125
|
|
|
119
126
|
async function fetchFromEtherscan(
|
|
120
127
|
address: string,
|
|
121
|
-
|
|
122
|
-
apiKey?: string,
|
|
128
|
+
config: EtherscanAPIConfig,
|
|
123
129
|
): Promise<any> {
|
|
124
|
-
api = api
|
|
125
|
-
let url = new URL(
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
130
|
+
let api = config.api + (config.api.endsWith('/') ? '' : '/') + 'api'
|
|
131
|
+
let url = new URL(api)
|
|
132
|
+
|
|
133
|
+
let params = new URLSearchParams({
|
|
134
|
+
module: 'contract',
|
|
135
|
+
action: 'getabi',
|
|
136
|
+
address,
|
|
137
|
+
})
|
|
138
|
+
if (config.chainId) {
|
|
139
|
+
params.set('chainid', config.chainId);
|
|
140
|
+
}
|
|
141
|
+
if (config.apiKey) {
|
|
142
|
+
params.set('apiKey', config.apiKey);
|
|
129
143
|
}
|
|
144
|
+
url.search = params.toString()
|
|
145
|
+
|
|
130
146
|
let response: { status: string; result: string }
|
|
131
147
|
let attempts = 0
|
|
132
148
|
while (true) {
|
|
@@ -150,7 +166,7 @@ async function fetchFromEtherscan(
|
|
|
150
166
|
return JSON.parse(response.result)
|
|
151
167
|
} else {
|
|
152
168
|
throw new Error(
|
|
153
|
-
`Failed to fetch contract ABI from ${api}: ${response.result}`,
|
|
169
|
+
`Failed to fetch contract ABI from ${config.api}: ${response.result}`,
|
|
154
170
|
)
|
|
155
171
|
}
|
|
156
172
|
}
|
|
@@ -215,3 +231,21 @@ function basename(file: string): string {
|
|
|
215
231
|
`Can't derive target basename for output files. Use url fragment to specify it, e.g. #erc20`,
|
|
216
232
|
)
|
|
217
233
|
}
|
|
234
|
+
|
|
235
|
+
interface EtherscanAPIConfig {
|
|
236
|
+
api: string
|
|
237
|
+
apiKey?: string
|
|
238
|
+
chainId?: string
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function getEtherscanAPIConfig(options: {
|
|
242
|
+
etherscanApi: string
|
|
243
|
+
etherscanApiKey?: string
|
|
244
|
+
etherscanChainId?: string
|
|
245
|
+
}): EtherscanAPIConfig {
|
|
246
|
+
return {
|
|
247
|
+
api: options.etherscanApi || 'https://api.etherscan.io/v2',
|
|
248
|
+
apiKey: options.etherscanApiKey || undefined,
|
|
249
|
+
chainId: options.etherscanChainId || (options.etherscanApi ? undefined : '1'),
|
|
250
|
+
}
|
|
251
|
+
}
|
package/src/multicall.ts
CHANGED
|
@@ -24,7 +24,7 @@ export type MulticallResult<T extends AbiFunction<any, any>> = {
|
|
|
24
24
|
|
|
25
25
|
type AnyFunc = AbiFunction<any, any>
|
|
26
26
|
type AggregateTuple<T extends AnyFunc = AnyFunc> = [func: T, address: string, args: T extends AnyFunc ? FunctionArguments<T> : never]
|
|
27
|
-
type Call = {target: string, callData: string}
|
|
27
|
+
type Call = {target: string, func: AnyFunc, callData: string}
|
|
28
28
|
|
|
29
29
|
export class Multicall extends ContractBase {
|
|
30
30
|
static aggregate = aggregate
|
|
@@ -34,31 +34,32 @@ export class Multicall extends ContractBase {
|
|
|
34
34
|
func: TF,
|
|
35
35
|
address: string,
|
|
36
36
|
calls: FunctionArguments<TF>[],
|
|
37
|
-
|
|
37
|
+
pageSize?: number
|
|
38
38
|
): Promise<FunctionReturn<TF>[]>
|
|
39
39
|
|
|
40
40
|
aggregate<TF extends AnyFunc>(
|
|
41
41
|
func: TF,
|
|
42
42
|
calls: (readonly [address: string, args: FunctionArguments<TF>])[],
|
|
43
|
-
|
|
43
|
+
pageSize?: number
|
|
44
44
|
): Promise<FunctionReturn<TF>[]>
|
|
45
45
|
|
|
46
46
|
aggregate(
|
|
47
47
|
calls: AggregateTuple[],
|
|
48
|
-
|
|
48
|
+
pageSize?: number
|
|
49
49
|
): Promise<any[]>
|
|
50
50
|
|
|
51
51
|
async aggregate(...args: any[]): Promise<any[]> {
|
|
52
|
-
let [calls,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
let [calls, pageSize] = this.makeCalls(args)
|
|
53
|
+
if (calls.length === 0) return []
|
|
54
|
+
|
|
55
|
+
const pages = Array.from(splitArray(pageSize, calls))
|
|
56
|
+
const results = await Promise.all(
|
|
57
|
+
pages.flatMap(async (page) => {
|
|
58
|
+
const {returnData} = await this.eth_call(aggregate, {calls: page})
|
|
59
|
+
return returnData.map((data, i) => page[i].func.decodeResult(data))
|
|
60
|
+
})
|
|
61
|
+
)
|
|
62
|
+
|
|
62
63
|
return results
|
|
63
64
|
}
|
|
64
65
|
|
|
@@ -66,101 +67,108 @@ export class Multicall extends ContractBase {
|
|
|
66
67
|
func: TF,
|
|
67
68
|
address: string,
|
|
68
69
|
calls: FunctionArguments<TF>[],
|
|
69
|
-
|
|
70
|
+
pageSize?: number
|
|
70
71
|
): Promise<MulticallResult<TF>[]>
|
|
71
72
|
|
|
72
73
|
tryAggregate<TF extends AnyFunc>(
|
|
73
74
|
func: TF,
|
|
74
75
|
calls: (readonly [address: string, args: FunctionArguments<TF>])[],
|
|
75
|
-
|
|
76
|
+
pageSize?: number
|
|
76
77
|
): Promise<MulticallResult<TF>[]>
|
|
77
78
|
|
|
78
79
|
tryAggregate(
|
|
79
80
|
calls: AggregateTuple[],
|
|
80
|
-
|
|
81
|
+
pageSize?: number
|
|
81
82
|
): Promise<MulticallResult<any>[]>
|
|
82
83
|
|
|
83
84
|
async tryAggregate(...args: any[]): Promise<any[]> {
|
|
84
|
-
let [calls,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
85
|
+
let [calls, pageSize] = this.makeCalls(args)
|
|
86
|
+
if (calls.length === 0) return []
|
|
87
|
+
|
|
88
|
+
const pages = Array.from(splitArray(pageSize, calls))
|
|
89
|
+
const results = await Promise.all(
|
|
90
|
+
pages.flatMap(async (page) => {
|
|
91
|
+
const response = await this.eth_call(tryAggregate, {
|
|
92
|
+
requireSuccess: false,
|
|
93
|
+
calls: page,
|
|
94
|
+
})
|
|
95
|
+
return response.map((res, i) => {
|
|
96
|
+
if (res.success) {
|
|
97
|
+
try {
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
value: page[i].func.decodeResult(res.returnData)
|
|
101
|
+
}
|
|
102
|
+
} catch (err: any) {
|
|
103
|
+
return {success: false, returnData: res.returnData}
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
return {success: false}
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
)
|
|
111
|
+
|
|
108
112
|
return results
|
|
109
113
|
}
|
|
110
114
|
|
|
111
|
-
private makeCalls(args: any[]): [calls: Call[],
|
|
115
|
+
private makeCalls(args: any[]): [calls: Call[], page: number] {
|
|
112
116
|
let page = typeof args[args.length - 1] == 'number' ? args.pop()! : Number.MAX_SAFE_INTEGER
|
|
113
117
|
switch (args.length) {
|
|
114
118
|
case 1: {
|
|
115
119
|
let list: AggregateTuple[] = args[0]
|
|
116
120
|
let calls: Call[] = new Array(list.length)
|
|
117
|
-
let funcs = new Array(list.length)
|
|
118
121
|
for (let i = 0; i < list.length; i++) {
|
|
119
122
|
let [func, address, args] = list[i]
|
|
120
|
-
calls[i] = {target: address, callData: func.encode(args)}
|
|
121
|
-
funcs[i] = func
|
|
123
|
+
calls[i] = {target: address, callData: func.encode(args), func}
|
|
122
124
|
}
|
|
123
|
-
return [calls,
|
|
125
|
+
return [calls, page]
|
|
124
126
|
}
|
|
125
127
|
case 2: {
|
|
126
128
|
let func: AnyFunc = args[0]
|
|
127
129
|
let list: [address: string, args: any][] = args[1]
|
|
128
130
|
let calls: Call[] = new Array(list.length)
|
|
129
|
-
let funcs = new Array(list.length)
|
|
130
131
|
for (let i = 0; i < list.length; i++) {
|
|
131
132
|
let [address, args] = list[i]
|
|
132
|
-
calls[i] = {target: address, callData: func.encode(args)}
|
|
133
|
-
funcs[i] = func
|
|
133
|
+
calls[i] = {target: address, callData: func.encode(args), func}
|
|
134
134
|
}
|
|
135
|
-
return [calls,
|
|
135
|
+
return [calls, page]
|
|
136
136
|
}
|
|
137
137
|
case 3: {
|
|
138
138
|
let func: AnyFunc = args[0]
|
|
139
139
|
let address: string = args[1]
|
|
140
140
|
let list: any = args[2]
|
|
141
141
|
let calls: Call[] = new Array(list.length)
|
|
142
|
-
let funcs = new Array(list.length)
|
|
143
142
|
for (let i = 0; i < list.length; i++) {
|
|
144
143
|
let args = list[i]
|
|
145
|
-
calls[i] = {target: address, callData: func.encode(args)}
|
|
146
|
-
funcs[i] = func
|
|
144
|
+
calls[i] = {target: address, callData: func.encode(args), func}
|
|
147
145
|
}
|
|
148
|
-
return [calls,
|
|
146
|
+
return [calls, page]
|
|
149
147
|
}
|
|
150
148
|
default:
|
|
151
|
-
throw new Error(
|
|
149
|
+
throw new Error(`Unexpected number of arguments: ${args.length}`)
|
|
152
150
|
}
|
|
153
151
|
}
|
|
154
152
|
}
|
|
155
153
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
while (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
154
|
+
function* splitSlice(maxSize: number, beg: number, end?: number): Iterable<[beg: number, end: number]> {
|
|
155
|
+
maxSize = Math.max(1, maxSize)
|
|
156
|
+
end = end ?? Number.MAX_SAFE_INTEGER
|
|
157
|
+
while (beg < end) {
|
|
158
|
+
let left = end - beg
|
|
159
|
+
let splits = Math.ceil(left / maxSize)
|
|
160
|
+
let step = Math.round(left / splits)
|
|
161
|
+
yield [beg, beg + step]
|
|
162
|
+
beg += step
|
|
165
163
|
}
|
|
166
164
|
}
|
|
165
|
+
|
|
166
|
+
function* splitArray<T>(maxSize: number, arr: T[]): Iterable<T[]> {
|
|
167
|
+
if (arr.length <= maxSize) {
|
|
168
|
+
yield arr
|
|
169
|
+
} else {
|
|
170
|
+
for (let [beg, end] of splitSlice(maxSize, 0, arr.length)) {
|
|
171
|
+
yield arr.slice(beg, end)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|