@subsquid/evm-typegen 3.3.0 → 4.0.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 +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/main.js
CHANGED
|
@@ -27,15 +27,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const fs = __importStar(require("fs"));
|
|
30
|
-
const ethers = __importStar(require("ethers"));
|
|
31
30
|
const path_1 = __importDefault(require("path"));
|
|
32
31
|
const commander_1 = require("commander");
|
|
33
32
|
const logger_1 = require("@subsquid/logger");
|
|
34
33
|
const util_internal_1 = require("@subsquid/util-internal");
|
|
35
|
-
const util_internal_code_printer_1 = require("@subsquid/util-internal-code-printer");
|
|
36
34
|
const validator = __importStar(require("@subsquid/util-internal-commander"));
|
|
37
35
|
const typegen_1 = require("./typegen");
|
|
38
36
|
const fetch_1 = require("./util/fetch");
|
|
37
|
+
const util_internal_code_printer_1 = require("@subsquid/util-internal-code-printer");
|
|
39
38
|
const LOG = (0, logger_1.createLogger)('sqd:evm-typegen');
|
|
40
39
|
(0, util_internal_1.runProgram)(async function () {
|
|
41
40
|
commander_1.program
|
|
@@ -83,8 +82,6 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
|
|
|
83
82
|
LOG.warn('no ABI files given, nothing to generate');
|
|
84
83
|
return;
|
|
85
84
|
}
|
|
86
|
-
dest.add('abi.support.ts', [__dirname, '../src/abi.support.ts']);
|
|
87
|
-
LOG.info(`saved ${dest.path('abi.support.ts')}`);
|
|
88
85
|
if (opts.multicall) {
|
|
89
86
|
dest.add('multicall.ts', [__dirname, '../src/multicall.ts']);
|
|
90
87
|
LOG.info(`saved ${dest.path('multicall.ts')}`);
|
|
@@ -92,10 +89,9 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
|
|
|
92
89
|
for (let spec of specs) {
|
|
93
90
|
LOG.info(`processing ${spec.src}`);
|
|
94
91
|
let abi_json = await read(spec, opts);
|
|
95
|
-
|
|
96
|
-
new typegen_1.Typegen(dest, abi, spec.name, LOG).generate();
|
|
92
|
+
await new typegen_1.Typegen(dest, abi_json, spec.name, LOG).generate();
|
|
97
93
|
}
|
|
98
|
-
}, err => LOG.fatal(err));
|
|
94
|
+
}, (err) => LOG.fatal(err));
|
|
99
95
|
async function read(spec, options) {
|
|
100
96
|
if (spec.kind == 'address') {
|
|
101
97
|
return fetchFromEtherscan(spec.src, options?.etherscanApi, options?.etherscanApiKey);
|
|
@@ -128,7 +124,9 @@ async function fetchFromEtherscan(address, api, apiKey) {
|
|
|
128
124
|
let attempts = 0;
|
|
129
125
|
while (true) {
|
|
130
126
|
response = await (0, fetch_1.GET)(url.toString());
|
|
131
|
-
if (response.status == '0' &&
|
|
127
|
+
if (response.status == '0' &&
|
|
128
|
+
response.result.includes('rate limit') &&
|
|
129
|
+
attempts < 4) {
|
|
132
130
|
attempts += 1;
|
|
133
131
|
let timeout = attempts * 2;
|
|
134
132
|
LOG.warn(`faced rate limit error while trying to fetch contract ABI. Trying again in ${timeout} seconds.`);
|
|
@@ -151,15 +149,18 @@ function specArgument(value, prev) {
|
|
|
151
149
|
prev.push(spec);
|
|
152
150
|
return prev;
|
|
153
151
|
}
|
|
152
|
+
function isAddress(spec) {
|
|
153
|
+
return spec.match(/^0x[0-9a-fA-F]{40}$/) !== null;
|
|
154
|
+
}
|
|
154
155
|
function parseSpec(spec) {
|
|
155
156
|
let [src, fragment] = splitFragment(spec);
|
|
156
157
|
if (src.startsWith('0x')) {
|
|
157
|
-
if (!
|
|
158
|
+
if (!isAddress(src))
|
|
158
159
|
throw new commander_1.InvalidArgumentError('Invalid contract address');
|
|
159
160
|
return {
|
|
160
161
|
kind: 'address',
|
|
161
162
|
src,
|
|
162
|
-
name: fragment || src
|
|
163
|
+
name: fragment || src,
|
|
163
164
|
};
|
|
164
165
|
}
|
|
165
166
|
else if (src.includes('://')) {
|
|
@@ -167,14 +168,14 @@ function parseSpec(spec) {
|
|
|
167
168
|
return {
|
|
168
169
|
kind: 'url',
|
|
169
170
|
src,
|
|
170
|
-
name: fragment || basename(u.pathname)
|
|
171
|
+
name: fragment || basename(u.pathname),
|
|
171
172
|
};
|
|
172
173
|
}
|
|
173
174
|
else {
|
|
174
175
|
return {
|
|
175
176
|
kind: 'file',
|
|
176
177
|
src,
|
|
177
|
-
name: fragment || basename(src)
|
|
178
|
+
name: fragment || basename(src),
|
|
178
179
|
};
|
|
179
180
|
}
|
|
180
181
|
}
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAwB;AACxB
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/lib/multicall.d.ts
CHANGED
|
@@ -1,30 +1,216 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* TODO migrate multicall
|
|
3
|
+
import * as ethers from 'ethers'
|
|
4
|
+
import {ContractBase, Func} from './abi.support'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const abi = new ethers.Interface([
|
|
8
|
+
{
|
|
9
|
+
type: 'function',
|
|
10
|
+
name: 'aggregate',
|
|
11
|
+
stateMutability: 'nonpayable',
|
|
12
|
+
inputs: [
|
|
13
|
+
{
|
|
14
|
+
name: 'calls',
|
|
15
|
+
type: 'tuple[]',
|
|
16
|
+
components: [
|
|
17
|
+
{name: 'target', type: 'address'},
|
|
18
|
+
{name: 'callData', type: 'bytes'},
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
outputs: [
|
|
23
|
+
{name: 'blockNumber', type: 'uint256'},
|
|
24
|
+
{name: 'returnData', type: 'bytes[]'},
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'tryAggregate',
|
|
29
|
+
type: 'function',
|
|
30
|
+
stateMutability: 'nonpayable',
|
|
31
|
+
inputs: [
|
|
32
|
+
{name: 'requireSuccess', type: 'bool'},
|
|
33
|
+
{
|
|
34
|
+
name: 'calls',
|
|
35
|
+
type: 'tuple[]',
|
|
36
|
+
components: [
|
|
37
|
+
{name: 'target', type: 'address'},
|
|
38
|
+
{name: 'callData', type: 'bytes'},
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
outputs: [
|
|
43
|
+
{
|
|
44
|
+
name: 'returnData',
|
|
45
|
+
type: 'tuple[]',
|
|
46
|
+
components: [
|
|
47
|
+
{name: 'success', type: 'bool'},
|
|
48
|
+
{name: 'returnData', type: 'bytes'},
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
])
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
type AnyFunc = Func<any, {}, any>
|
|
57
|
+
type Call = [address: string, bytes: string]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
const aggregate = new Func<[calls: Call[]], {}, {blockNumber: bigint, returnData: string[]}>(
|
|
61
|
+
abi, abi.getFunction('aggregate')!.selector
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const try_aggregate = new Func<[requireSuccess: boolean, calls: Array<[target: string, callData: string]>], {}, Array<{success: boolean, returnData: string}>>(
|
|
66
|
+
abi, abi.getFunction('tryAggregate')!.selector
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
4
70
|
export type MulticallResult<T> = {
|
|
5
|
-
success: true
|
|
6
|
-
value: T
|
|
71
|
+
success: true
|
|
72
|
+
value: T
|
|
7
73
|
} | {
|
|
8
|
-
success: false
|
|
9
|
-
returnData?: string
|
|
10
|
-
value?: undefined
|
|
11
|
-
};
|
|
12
|
-
export declare class Multicall extends ContractBase {
|
|
13
|
-
static aggregate: Func<[calls: Call[]], {}, {
|
|
14
|
-
blockNumber: bigint;
|
|
15
|
-
returnData: string[];
|
|
16
|
-
}>;
|
|
17
|
-
static try_aggregate: Func<[requireSuccess: boolean, calls: [target: string, callData: string][]], {}, {
|
|
18
|
-
success: boolean;
|
|
19
|
-
returnData: string;
|
|
20
|
-
}[]>;
|
|
21
|
-
aggregate<Args extends any[], R>(func: Func<Args, {}, R>, address: string, calls: Args[], paging?: number): Promise<R[]>;
|
|
22
|
-
aggregate<Args extends any[], R>(func: Func<Args, {}, R>, calls: [address: string, args: Args][], paging?: number): Promise<R[]>;
|
|
23
|
-
aggregate(calls: [func: AnyFunc, address: string, args: any[]][], paging?: number): Promise<any[]>;
|
|
24
|
-
tryAggregate<Args extends any[], R>(func: Func<Args, {}, R>, address: string, calls: Args[], paging?: number): Promise<MulticallResult<R>[]>;
|
|
25
|
-
tryAggregate<Args extends any[], R>(func: Func<Args, {}, R>, calls: [address: string, args: Args][], paging?: number): Promise<MulticallResult<R>[]>;
|
|
26
|
-
tryAggregate(calls: [func: AnyFunc, address: string, args: any[]][], paging?: number): Promise<MulticallResult<any>[]>;
|
|
27
|
-
private makeCalls;
|
|
74
|
+
success: false
|
|
75
|
+
returnData?: string
|
|
76
|
+
value?: undefined
|
|
28
77
|
}
|
|
29
|
-
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
export class Multicall extends ContractBase {
|
|
81
|
+
static aggregate = aggregate
|
|
82
|
+
static try_aggregate = try_aggregate
|
|
83
|
+
|
|
84
|
+
aggregate<Args extends any[], R>(
|
|
85
|
+
func: Func<Args, {}, R>,
|
|
86
|
+
address: string,
|
|
87
|
+
calls: Args[],
|
|
88
|
+
paging?: number
|
|
89
|
+
): Promise<R[]>
|
|
90
|
+
|
|
91
|
+
aggregate<Args extends any[], R>(
|
|
92
|
+
func: Func<Args, {}, R>,
|
|
93
|
+
calls: [address: string, args: Args][],
|
|
94
|
+
paging?: number
|
|
95
|
+
): Promise<R[]>
|
|
96
|
+
|
|
97
|
+
aggregate(
|
|
98
|
+
calls: [func: AnyFunc, address: string, args: any[]][],
|
|
99
|
+
paging?: number
|
|
100
|
+
): Promise<any[]>
|
|
101
|
+
|
|
102
|
+
async aggregate(...args: any[]): Promise<any[]> {
|
|
103
|
+
let [calls, funcs, page] = this.makeCalls(args)
|
|
104
|
+
let size = calls.length
|
|
105
|
+
let results = new Array(size)
|
|
106
|
+
for (let [from, to] of splitIntoPages(size, page)) {
|
|
107
|
+
let {returnData} = await this.eth_call(aggregate, [calls.slice(from, to)])
|
|
108
|
+
for (let i = from; i < to; i++) {
|
|
109
|
+
let data = returnData[i - from]
|
|
110
|
+
results[i] = funcs[i].decodeResult(data)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return results
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
tryAggregate<Args extends any[], R>(
|
|
117
|
+
func: Func<Args, {}, R>,
|
|
118
|
+
address: string,
|
|
119
|
+
calls: Args[],
|
|
120
|
+
paging?: number
|
|
121
|
+
): Promise<MulticallResult<R>[]>
|
|
122
|
+
|
|
123
|
+
tryAggregate<Args extends any[], R>(
|
|
124
|
+
func: Func<Args, {}, R>,
|
|
125
|
+
calls: [address: string, args: Args][],
|
|
126
|
+
paging?: number
|
|
127
|
+
): Promise<MulticallResult<R>[]>
|
|
128
|
+
|
|
129
|
+
tryAggregate(
|
|
130
|
+
calls: [func: AnyFunc, address: string, args: any[]][],
|
|
131
|
+
paging?: number
|
|
132
|
+
): Promise<MulticallResult<any>[]>
|
|
133
|
+
|
|
134
|
+
async tryAggregate(...args: any[]): Promise<any[]> {
|
|
135
|
+
let [calls, funcs, page] = this.makeCalls(args)
|
|
136
|
+
let size = calls.length
|
|
137
|
+
let results = new Array(size)
|
|
138
|
+
for (let [from, to] of splitIntoPages(size, page)) {
|
|
139
|
+
let response = await this.eth_call(try_aggregate, [false, calls.slice(from, to)])
|
|
140
|
+
for (let i = from; i < to; i++) {
|
|
141
|
+
let res = response[i - from]
|
|
142
|
+
if (res.success) {
|
|
143
|
+
try {
|
|
144
|
+
results[i] = {
|
|
145
|
+
success: true,
|
|
146
|
+
value: funcs[i].decodeResult(res.returnData)
|
|
147
|
+
}
|
|
148
|
+
} catch(err: any) {
|
|
149
|
+
results[i] = {success: false, returnData: res.returnData}
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
results[i] = {success: false}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return results
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private makeCalls(args: any[]): [calls: Call[], funcs: AnyFunc[], page: number] {
|
|
160
|
+
let page = typeof args[args.length-1] == 'number' ? args.pop()! : Number.MAX_SAFE_INTEGER
|
|
161
|
+
switch(args.length) {
|
|
162
|
+
case 1: {
|
|
163
|
+
let list: [func: AnyFunc, address: string, args: any[]][] = args[0]
|
|
164
|
+
let calls = new Array(list.length)
|
|
165
|
+
let funcs = new Array(list.length)
|
|
166
|
+
for (let i = 0; i < list.length; i++) {
|
|
167
|
+
let [func, address, args] = list[i]
|
|
168
|
+
calls[i] = [address, func.encode(args)]
|
|
169
|
+
funcs[i] = func
|
|
170
|
+
}
|
|
171
|
+
return [calls, funcs, page]
|
|
172
|
+
}
|
|
173
|
+
case 2: {
|
|
174
|
+
let func: AnyFunc = args[0]
|
|
175
|
+
let list: [address: string, args: any[]][] = args[1]
|
|
176
|
+
let calls = new Array(list.length)
|
|
177
|
+
let funcs = new Array(list.length)
|
|
178
|
+
for (let i = 0; i < list.length; i++) {
|
|
179
|
+
let [address, args] = list[i]
|
|
180
|
+
calls[i] = [address, func.encode(args)]
|
|
181
|
+
funcs[i] = func
|
|
182
|
+
}
|
|
183
|
+
return [calls, funcs, page]
|
|
184
|
+
}
|
|
185
|
+
case 3: {
|
|
186
|
+
let func: AnyFunc = args[0]
|
|
187
|
+
let address: string = args[1]
|
|
188
|
+
let list: any[][] = args[2]
|
|
189
|
+
let calls = new Array(list.length)
|
|
190
|
+
let funcs = new Array(list.length)
|
|
191
|
+
for (let i = 0; i < list.length; i++) {
|
|
192
|
+
let args = list[i]
|
|
193
|
+
calls[i] = [address, func.encode(args)]
|
|
194
|
+
funcs[i] = func
|
|
195
|
+
}
|
|
196
|
+
return [calls, funcs, page]
|
|
197
|
+
}
|
|
198
|
+
default:
|
|
199
|
+
throw new Error('unexpected number of arguments')
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
function* splitIntoPages(size: number, page: number): Iterable<[from: number, to: number]> {
|
|
206
|
+
let from = 0
|
|
207
|
+
while (size) {
|
|
208
|
+
let step = Math.min(page, size)
|
|
209
|
+
let to = from + step
|
|
210
|
+
yield [from, to]
|
|
211
|
+
size -= step
|
|
212
|
+
from = to
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
*/
|
|
30
216
|
//# sourceMappingURL=multicall.d.ts.map
|
package/lib/multicall.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsNE"}
|