@subsquid/evm-typegen 3.3.0 → 4.0.1
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 +13 -12
- package/lib/main.js.map +1 -1
- package/lib/multicall.d.ts +212 -26
- package/lib/multicall.d.ts.map +1 -1
- package/lib/multicall.js +142 -100
- package/lib/multicall.js.map +1 -1
- package/lib/typegen.d.ts +15 -7
- package/lib/typegen.d.ts.map +1 -1
- package/lib/typegen.js +117 -68
- package/lib/typegen.js.map +1 -1
- package/lib/util/fetch.d.ts.map +1 -1
- package/lib/util/fetch.js +1 -1
- package/lib/util/fetch.js.map +1 -1
- package/lib/util/types.d.ts +2 -6
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +39 -60
- package/lib/util/types.js.map +1 -1
- package/package.json +8 -8
- package/src/main.ts +148 -135
- package/src/multicall.ts +3 -0
- package/src/typegen.ts +228 -111
- package/src/util/fetch.ts +6 -8
- package/src/util/types.ts +44 -62
- package/lib/abi.support.d.ts +0 -57
- package/lib/abi.support.d.ts.map +0 -1
- package/lib/abi.support.js +0 -116
- package/lib/abi.support.js.map +0 -1
- package/src/abi.support.ts +0 -135
package/lib/typegen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typegen.js","sourceRoot":"","sources":["../src/typegen.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"typegen.js","sourceRoot":"","sources":["../src/typegen.ts"],"names":[],"mappings":"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"}
|
package/lib/util/fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":"AAQA,wBAAgB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEpD"}
|
package/lib/util/fetch.js
CHANGED
|
@@ -5,7 +5,7 @@ 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({
|
|
7
7
|
log: (0, logger_1.createLogger)('sqd:evm-typegen:fetch'),
|
|
8
|
-
retryAttempts: 3
|
|
8
|
+
retryAttempts: 3,
|
|
9
9
|
});
|
|
10
10
|
function GET(url) {
|
|
11
11
|
return http.get(url);
|
package/lib/util/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/util/fetch.ts"],"names":[],"mappings":";;;AAAA,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;AAFD,kBAEC"}
|
package/lib/util/types.d.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function getType(param:
|
|
3
|
-
export declare function getFullTupleType(params: ReadonlyArray<ParamType>): string;
|
|
4
|
-
export declare function getTupleType(params: ReadonlyArray<ParamType>): string;
|
|
5
|
-
export declare function getStructType(params: ReadonlyArray<ParamType>): string;
|
|
6
|
-
export declare function getReturnType(outputs: ReadonlyArray<ParamType>): string;
|
|
1
|
+
import type { AbiEventParameter } from 'abitype';
|
|
2
|
+
export declare function getType(param: AbiEventParameter, index?: number): string;
|
|
7
3
|
//# sourceMappingURL=types.d.ts.map
|
package/lib/util/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAkBhD,wBAAgB,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAmCxE"}
|
package/lib/util/types.js
CHANGED
|
@@ -1,68 +1,47 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
function getType(param) {
|
|
10
|
-
if (param.baseType === 'array') {
|
|
11
|
-
(0, assert_1.default)(param.arrayChildren != null, 'Missing children for array type');
|
|
12
|
-
return 'Array<' + getType(param.arrayChildren) + '>';
|
|
13
|
-
}
|
|
14
|
-
if (param.baseType === 'tuple') {
|
|
15
|
-
(0, assert_1.default)(param.components != null, 'Missing components for tuple type');
|
|
16
|
-
return getFullTupleType(param.components);
|
|
17
|
-
}
|
|
18
|
-
if (param.type === 'address' || param.type === 'string') {
|
|
19
|
-
return 'string';
|
|
20
|
-
}
|
|
21
|
-
if (param.type === 'bool') {
|
|
22
|
-
return 'boolean';
|
|
23
|
-
}
|
|
24
|
-
let match = param.type.match(/^(u?int)([0-9]+)$/);
|
|
25
|
-
if (match) {
|
|
26
|
-
return parseInt(match[2]) < 53 ? 'number' : 'bigint';
|
|
27
|
-
}
|
|
28
|
-
if (param.type.substring(0, 5) === 'bytes') {
|
|
29
|
-
return 'string';
|
|
30
|
-
}
|
|
31
|
-
throw new Error('unknown type');
|
|
3
|
+
exports.getType = void 0;
|
|
4
|
+
function isStaticArray(param) {
|
|
5
|
+
return param.type.match(/\[\d+]$/);
|
|
32
6
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
let tuple = getTupleType(params);
|
|
36
|
-
let struct = getStructType(params);
|
|
37
|
-
if (struct == '{}') {
|
|
38
|
-
return tuple;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
return `(${tuple} & ${struct})`;
|
|
42
|
-
}
|
|
7
|
+
function isDynamicArray(param) {
|
|
8
|
+
return param.type.endsWith('[]');
|
|
43
9
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return '[' + params.map(p => {
|
|
47
|
-
return p.name ? `${p.name}: ${getType(p)}` : `_: ${getType(p)}`;
|
|
48
|
-
}).join(', ') + ']';
|
|
10
|
+
function elementsCount(param) {
|
|
11
|
+
return Number(param.type.match(/\[(\d+)]$/)?.[1] ?? 0);
|
|
49
12
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
function getStructType(params) {
|
|
53
|
-
let array = [];
|
|
54
|
-
let counts = {};
|
|
55
|
-
for (let p of params) {
|
|
56
|
-
if (p.name && array[p.name] == null) {
|
|
57
|
-
counts[p.name] = (counts[p.name] || 0) + 1;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
let fields = params.filter(p => counts[p.name] == 1);
|
|
61
|
-
return '{' + fields.map(f => `${f.name}: ${getType(f)}`).join(', ') + '}';
|
|
13
|
+
function arrayChildType(param) {
|
|
14
|
+
return param.type.replace(/\[\d*]$/, '');
|
|
62
15
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
16
|
+
function getType(param, index) {
|
|
17
|
+
const { name, ...namelessParam } = param;
|
|
18
|
+
if (name) {
|
|
19
|
+
return `"${name}": ${getType(namelessParam)}`;
|
|
20
|
+
}
|
|
21
|
+
if (index !== undefined) {
|
|
22
|
+
return `"_${index}": ${getType(namelessParam)}`;
|
|
23
|
+
}
|
|
24
|
+
const { indexed, ...indexlessParam } = param;
|
|
25
|
+
if (indexed) {
|
|
26
|
+
return `indexed(${getType(indexlessParam)})`;
|
|
27
|
+
}
|
|
28
|
+
if (isStaticArray(param)) {
|
|
29
|
+
const elements = elementsCount(param);
|
|
30
|
+
return `p.fixedSizeArray(${getType({
|
|
31
|
+
...param,
|
|
32
|
+
type: arrayChildType(param),
|
|
33
|
+
})}, ${elements})`;
|
|
34
|
+
}
|
|
35
|
+
if (isDynamicArray(param)) {
|
|
36
|
+
return `p.array(${getType({
|
|
37
|
+
...param,
|
|
38
|
+
type: arrayChildType(param),
|
|
39
|
+
})})`;
|
|
40
|
+
}
|
|
41
|
+
if (param.type === 'tuple') {
|
|
42
|
+
return `p.struct({${param.components.map((type, idx) => getType(type, idx)).join(', ')}})`;
|
|
43
|
+
}
|
|
44
|
+
return `p.${param.type}`;
|
|
66
45
|
}
|
|
67
|
-
exports.
|
|
46
|
+
exports.getType = getType;
|
|
68
47
|
//# 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":";;;AAEA,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;AAnCD,0BAmCC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subsquid/evm-typegen",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
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,17 +16,17 @@
|
|
|
16
16
|
"squid-evm-typegen": "bin/run.js"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@subsquid/http-client": "^1.
|
|
20
|
-
"@subsquid/logger": "^1.3.
|
|
21
|
-
"@subsquid/util-internal": "^3.
|
|
19
|
+
"@subsquid/http-client": "^1.4.0",
|
|
20
|
+
"@subsquid/logger": "^1.3.3",
|
|
21
|
+
"@subsquid/util-internal": "^3.2.0",
|
|
22
22
|
"@subsquid/util-internal-code-printer": "^1.2.2",
|
|
23
|
-
"@subsquid/util-internal-commander": "^1.
|
|
23
|
+
"@subsquid/util-internal-commander": "^1.4.0",
|
|
24
|
+
"@subsquid/evm-codec": "^0.1.0",
|
|
25
|
+
"@subsquid/evm-abi": "^0.2.0",
|
|
24
26
|
"commander": "^11.1.0"
|
|
25
27
|
},
|
|
26
|
-
"peerDependencies": {
|
|
27
|
-
"ethers": "^6.9.0"
|
|
28
|
-
},
|
|
29
28
|
"devDependencies": {
|
|
29
|
+
"abitype": "^1.0.0",
|
|
30
30
|
"@types/node": "^18.18.14",
|
|
31
31
|
"typescript": "~5.3.2"
|
|
32
32
|
},
|
package/src/main.ts
CHANGED
|
@@ -1,40 +1,39 @@
|
|
|
1
1
|
import * as fs from 'fs'
|
|
2
|
-
import * as ethers from 'ethers'
|
|
3
2
|
import path from 'path'
|
|
4
|
-
import {InvalidArgumentError, program} from 'commander'
|
|
5
|
-
import {createLogger} from '@subsquid/logger'
|
|
6
|
-
import {runProgram, wait} from '@subsquid/util-internal'
|
|
7
|
-
import {OutDir} from '@subsquid/util-internal-code-printer'
|
|
3
|
+
import { InvalidArgumentError, program } from 'commander'
|
|
4
|
+
import { createLogger } from '@subsquid/logger'
|
|
5
|
+
import { runProgram, wait } from '@subsquid/util-internal'
|
|
8
6
|
import * as validator from '@subsquid/util-internal-commander'
|
|
9
|
-
import {Typegen} from './typegen'
|
|
10
|
-
import {GET} from './util/fetch'
|
|
11
|
-
|
|
7
|
+
import { Typegen } from './typegen'
|
|
8
|
+
import { GET } from './util/fetch'
|
|
9
|
+
import { OutDir } from '@subsquid/util-internal-code-printer'
|
|
12
10
|
|
|
13
11
|
const LOG = createLogger('sqd:evm-typegen')
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
runProgram(
|
|
14
|
+
async function () {
|
|
17
15
|
program
|
|
18
|
-
|
|
16
|
+
.description(
|
|
17
|
+
`
|
|
19
18
|
Generates TypeScript facades for EVM transactions, logs and eth_call queries.
|
|
20
19
|
|
|
21
20
|
The generated facades are assumed to be used by "squids" indexing EVM data.
|
|
22
|
-
`.trim()
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
21
|
+
`.trim(),
|
|
22
|
+
)
|
|
23
|
+
.name('squid-evm-typegen')
|
|
24
|
+
.argument('<output-dir>', 'output directory for generated definitions')
|
|
25
|
+
.argument('[abi...]', 'ABI file', specArgument)
|
|
26
|
+
.option('--multicall', 'generate facade for MakerDAO multicall contract')
|
|
27
|
+
.option(
|
|
28
|
+
'--etherscan-api <url>',
|
|
29
|
+
'etherscan API to fetch contract ABI by a known address',
|
|
30
|
+
validator.Url(['http:', 'https:']),
|
|
31
|
+
)
|
|
32
|
+
.option('--etherscan-api-key <key>', 'etherscan API key')
|
|
33
|
+
.option('--clean', 'delete output directory before run')
|
|
34
|
+
.addHelpText(
|
|
35
|
+
'afterAll',
|
|
36
|
+
`
|
|
38
37
|
ABI file can be specified in three ways:
|
|
39
38
|
|
|
40
39
|
1. as a plain JSON file:
|
|
@@ -53,152 +52,166 @@ In all cases typegen will use ABI's basename as a basename of generated files.
|
|
|
53
52
|
You can overwrite basename of generated files using fragment (#) suffix.
|
|
54
53
|
|
|
55
54
|
squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
|
|
56
|
-
|
|
55
|
+
`,
|
|
56
|
+
)
|
|
57
57
|
|
|
58
58
|
program.parse()
|
|
59
59
|
|
|
60
60
|
let opts = program.opts() as {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
clean?: boolean
|
|
62
|
+
multicall?: boolean
|
|
63
|
+
etherscanApi?: string
|
|
64
|
+
etherscanApiKey?: string
|
|
65
65
|
}
|
|
66
66
|
let dest = new OutDir(program.processedArgs[0])
|
|
67
67
|
let specs = program.processedArgs[1] as Spec[]
|
|
68
68
|
|
|
69
69
|
if (opts.clean && dest.exists()) {
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
LOG.info(`deleting ${dest.path()}`)
|
|
71
|
+
dest.del()
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
if (specs.length == 0 && !opts.multicall) {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
LOG.warn('no ABI files given, nothing to generate')
|
|
76
|
+
return
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
dest.add('abi.support.ts', [__dirname, '../src/abi.support.ts'])
|
|
80
|
-
LOG.info(`saved ${dest.path('abi.support.ts')}`)
|
|
81
|
-
|
|
82
79
|
if (opts.multicall) {
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
dest.add('multicall.ts', [__dirname, '../src/multicall.ts'])
|
|
81
|
+
LOG.info(`saved ${dest.path('multicall.ts')}`)
|
|
85
82
|
}
|
|
86
83
|
|
|
87
84
|
for (let spec of specs) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
new Typegen(dest, abi, spec.name, LOG).generate()
|
|
92
|
-
}
|
|
93
|
-
}, err => LOG.fatal(err))
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
async function read(spec: Spec, options?: {etherscanApi?: string, etherscanApiKey?: string}): Promise<any> {
|
|
97
|
-
if (spec.kind == 'address') {
|
|
98
|
-
return fetchFromEtherscan(spec.src, options?.etherscanApi, options?.etherscanApiKey)
|
|
99
|
-
}
|
|
100
|
-
let abi: any
|
|
101
|
-
if (spec.kind == 'url') {
|
|
102
|
-
abi = await GET(spec.src)
|
|
103
|
-
} else {
|
|
104
|
-
abi = JSON.parse(fs.readFileSync(spec.src, 'utf-8'))
|
|
105
|
-
}
|
|
106
|
-
if (Array.isArray(abi)) {
|
|
107
|
-
return abi
|
|
108
|
-
} else if (Array.isArray(abi?.abi)) {
|
|
109
|
-
return abi.abi
|
|
110
|
-
} else {
|
|
111
|
-
throw new Error('Unrecognized ABI format')
|
|
85
|
+
LOG.info(`processing ${spec.src}`)
|
|
86
|
+
let abi_json = await read(spec, opts)
|
|
87
|
+
await new Typegen(dest, abi_json, spec.name, LOG).generate()
|
|
112
88
|
}
|
|
89
|
+
},
|
|
90
|
+
(err) => LOG.fatal(err),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
async function read(
|
|
94
|
+
spec: Spec,
|
|
95
|
+
options?: { etherscanApi?: string; etherscanApiKey?: string },
|
|
96
|
+
): Promise<any> {
|
|
97
|
+
if (spec.kind == 'address') {
|
|
98
|
+
return fetchFromEtherscan(
|
|
99
|
+
spec.src,
|
|
100
|
+
options?.etherscanApi,
|
|
101
|
+
options?.etherscanApiKey,
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
let abi: any
|
|
105
|
+
if (spec.kind == 'url') {
|
|
106
|
+
abi = await GET(spec.src)
|
|
107
|
+
} else {
|
|
108
|
+
abi = JSON.parse(fs.readFileSync(spec.src, 'utf-8'))
|
|
109
|
+
}
|
|
110
|
+
if (Array.isArray(abi)) {
|
|
111
|
+
return abi
|
|
112
|
+
} else if (Array.isArray(abi?.abi)) {
|
|
113
|
+
return abi.abi
|
|
114
|
+
} else {
|
|
115
|
+
throw new Error('Unrecognized ABI format')
|
|
116
|
+
}
|
|
113
117
|
}
|
|
114
118
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
119
|
+
async function fetchFromEtherscan(
|
|
120
|
+
address: string,
|
|
121
|
+
api?: string,
|
|
122
|
+
apiKey?: string,
|
|
123
|
+
): Promise<any> {
|
|
124
|
+
api = api || 'https://api.etherscan.io/'
|
|
125
|
+
let url = new URL('api?module=contract&action=getabi', api)
|
|
126
|
+
url.searchParams.set('address', address)
|
|
127
|
+
if (apiKey) {
|
|
128
|
+
url.searchParams.set('apiKey', apiKey)
|
|
129
|
+
}
|
|
130
|
+
let response: { status: string; result: string }
|
|
131
|
+
let attempts = 0
|
|
132
|
+
while (true) {
|
|
133
|
+
response = await GET(url.toString())
|
|
134
|
+
if (
|
|
135
|
+
response.status == '0' &&
|
|
136
|
+
response.result.includes('rate limit') &&
|
|
137
|
+
attempts < 4
|
|
138
|
+
) {
|
|
139
|
+
attempts += 1
|
|
140
|
+
let timeout = attempts * 2
|
|
141
|
+
LOG.warn(
|
|
142
|
+
`faced rate limit error while trying to fetch contract ABI. Trying again in ${timeout} seconds.`,
|
|
143
|
+
)
|
|
144
|
+
await wait(timeout * 1000)
|
|
138
145
|
} else {
|
|
139
|
-
|
|
146
|
+
break
|
|
140
147
|
}
|
|
148
|
+
}
|
|
149
|
+
if (response.status == '1') {
|
|
150
|
+
return JSON.parse(response.result)
|
|
151
|
+
} else {
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Failed to fetch contract ABI from ${api}: ${response.result}`,
|
|
154
|
+
)
|
|
155
|
+
}
|
|
141
156
|
}
|
|
142
157
|
|
|
143
|
-
|
|
144
158
|
interface Spec {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
159
|
+
kind: 'address' | 'url' | 'file'
|
|
160
|
+
src: string
|
|
161
|
+
name: string
|
|
148
162
|
}
|
|
149
163
|
|
|
150
|
-
|
|
151
164
|
function specArgument(value: string, prev?: Spec[]): Spec[] {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
165
|
+
let spec = parseSpec(value)
|
|
166
|
+
prev = prev || []
|
|
167
|
+
prev.push(spec)
|
|
168
|
+
return prev
|
|
156
169
|
}
|
|
157
170
|
|
|
171
|
+
function isAddress(spec: string): boolean {
|
|
172
|
+
return spec.match(/^0x[0-9a-fA-F]{40}$/) !== null
|
|
173
|
+
}
|
|
158
174
|
|
|
159
175
|
function parseSpec(spec: string): Spec {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
name: fragment || basename(u.pathname)
|
|
176
|
-
}
|
|
177
|
-
} else {
|
|
178
|
-
return {
|
|
179
|
-
kind: 'file',
|
|
180
|
-
src,
|
|
181
|
-
name: fragment || basename(src)
|
|
182
|
-
}
|
|
176
|
+
let [src, fragment] = splitFragment(spec)
|
|
177
|
+
if (src.startsWith('0x')) {
|
|
178
|
+
if (!isAddress(src))
|
|
179
|
+
throw new InvalidArgumentError('Invalid contract address')
|
|
180
|
+
return {
|
|
181
|
+
kind: 'address',
|
|
182
|
+
src,
|
|
183
|
+
name: fragment || src,
|
|
184
|
+
}
|
|
185
|
+
} else if (src.includes('://')) {
|
|
186
|
+
let u = new URL(validator.Url(['http:', 'https:'])(src))
|
|
187
|
+
return {
|
|
188
|
+
kind: 'url',
|
|
189
|
+
src,
|
|
190
|
+
name: fragment || basename(u.pathname),
|
|
183
191
|
}
|
|
192
|
+
} else {
|
|
193
|
+
return {
|
|
194
|
+
kind: 'file',
|
|
195
|
+
src,
|
|
196
|
+
name: fragment || basename(src),
|
|
197
|
+
}
|
|
198
|
+
}
|
|
184
199
|
}
|
|
185
200
|
|
|
186
|
-
|
|
187
201
|
function splitFragment(spec: string): [string, string] {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
202
|
+
let parts = spec.split('#')
|
|
203
|
+
if (parts.length > 1) {
|
|
204
|
+
let fragment = parts.pop()!
|
|
205
|
+
return [parts.join('#'), fragment]
|
|
206
|
+
} else {
|
|
207
|
+
return [spec, '']
|
|
208
|
+
}
|
|
195
209
|
}
|
|
196
210
|
|
|
197
|
-
|
|
198
211
|
function basename(file: string): string {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
212
|
+
let name = path.parse(file).name
|
|
213
|
+
if (name) return name
|
|
214
|
+
throw new InvalidArgumentError(
|
|
215
|
+
`Can't derive target basename for output files. Use url fragment to specify it, e.g. #erc20`,
|
|
216
|
+
)
|
|
204
217
|
}
|
package/src/multicall.ts
CHANGED