@subsquid/evm-typegen 1.1.0 → 1.2.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 +86 -69
- package/lib/main.js.map +1 -1
- package/package.json +1 -1
- package/src/main.ts +107 -76
package/lib/main.js
CHANGED
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.run = void 0;
|
|
7
|
+
const abi_1 = require("@ethersproject/abi");
|
|
8
|
+
const util_internal_code_printer_1 = require("@subsquid/util-internal-code-printer");
|
|
7
9
|
const commander_1 = require("commander");
|
|
8
|
-
const process_1 = __importDefault(require("process"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
10
|
const fs_1 = __importDefault(require("fs"));
|
|
11
|
-
const
|
|
12
|
-
const
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const process_1 = __importDefault(require("process"));
|
|
13
13
|
function run() {
|
|
14
14
|
commander_1.program.description(`
|
|
15
15
|
Generates TypeScript definitions for evm log events
|
|
@@ -50,7 +50,6 @@ function generateTsFromAbi(inputPathRaw, outputPathRaw) {
|
|
|
50
50
|
const abi = new abi_1.Interface(rawABI);
|
|
51
51
|
const typeNames = {};
|
|
52
52
|
const abiEvents = Object.values(abi.events).map((event) => {
|
|
53
|
-
let signature = `${event.name}(`;
|
|
54
53
|
let eventTypeName = `${event.name}`;
|
|
55
54
|
if (typeNames[event.name]) {
|
|
56
55
|
eventTypeName += typeNames[event.name].toString();
|
|
@@ -60,6 +59,8 @@ function generateTsFromAbi(inputPathRaw, outputPathRaw) {
|
|
|
60
59
|
eventTypeName += "0";
|
|
61
60
|
typeNames[event.name] = 1;
|
|
62
61
|
}
|
|
62
|
+
eventTypeName += 'Event';
|
|
63
|
+
let signature = `${event.name}(`;
|
|
63
64
|
if (event.inputs.length > 0) {
|
|
64
65
|
signature += event.inputs[0].type;
|
|
65
66
|
}
|
|
@@ -75,11 +76,7 @@ function generateTsFromAbi(inputPathRaw, outputPathRaw) {
|
|
|
75
76
|
};
|
|
76
77
|
});
|
|
77
78
|
for (const decl of abiEvents) {
|
|
78
|
-
output.
|
|
79
|
-
for (const input of decl.inputs) {
|
|
80
|
-
output.line(`${input.name}: ${getType(input)};`);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
79
|
+
output.line(`export type ${decl.eventTypeName} = ${getTupleType(decl.inputs)}`);
|
|
83
80
|
output.line("");
|
|
84
81
|
}
|
|
85
82
|
output.block("export interface EvmEvent", () => {
|
|
@@ -87,39 +84,47 @@ function generateTsFromAbi(inputPathRaw, outputPathRaw) {
|
|
|
87
84
|
output.line("topics: string[];");
|
|
88
85
|
});
|
|
89
86
|
output.line();
|
|
87
|
+
output.block(`function decodeEvent(signature: string, data: EvmEvent): any`, () => {
|
|
88
|
+
output.line(`return abi.decodeEventLog(`);
|
|
89
|
+
output.indentation(() => {
|
|
90
|
+
output.line(`abi.getEvent(signature),`);
|
|
91
|
+
output.line(`data.data || "",`);
|
|
92
|
+
output.line("data.topics");
|
|
93
|
+
});
|
|
94
|
+
output.line(");");
|
|
95
|
+
});
|
|
96
|
+
output.line();
|
|
90
97
|
output.block("export const events =", () => {
|
|
91
98
|
for (const decl of abiEvents) {
|
|
92
|
-
output.block(`"${decl.signature}"
|
|
99
|
+
output.block(`"${decl.signature}":`, () => {
|
|
93
100
|
output.line(`topic: abi.getEventTopic("${decl.signature}"),`);
|
|
94
|
-
output.block(`decode(data: EvmEvent): ${decl.eventTypeName}
|
|
95
|
-
output.line(`
|
|
96
|
-
output.indentation(() => {
|
|
97
|
-
output.line(`abi.getEvent("${decl.signature}"),`);
|
|
98
|
-
output.line(`data.data || "",`);
|
|
99
|
-
output.line("data.topics");
|
|
100
|
-
});
|
|
101
|
-
output.line(");");
|
|
102
|
-
output.block("return ", () => {
|
|
103
|
-
for (let i = 0; i < decl.inputs.length; ++i) {
|
|
104
|
-
const input = decl.inputs[i];
|
|
105
|
-
output.line(`${input.name}: ${`result[${i}]`},`);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
101
|
+
output.block(`decode(data: EvmEvent): ${decl.eventTypeName}`, () => {
|
|
102
|
+
output.line(`return decodeEvent("${decl.signature}", data)`);
|
|
108
103
|
});
|
|
109
104
|
});
|
|
110
105
|
output.line(",");
|
|
111
106
|
}
|
|
112
107
|
});
|
|
113
108
|
output.line();
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
109
|
+
let abiFunctions = new Map();
|
|
110
|
+
for (let func of Object.values(abi.functions)) {
|
|
111
|
+
if (!func.constant || func.outputs == null)
|
|
112
|
+
continue;
|
|
113
|
+
let abiFunction = abiFunctions.get(func.name);
|
|
114
|
+
if (abiFunction == null) {
|
|
115
|
+
abiFunction = {
|
|
116
|
+
name: func.name,
|
|
117
|
+
overloads: []
|
|
118
|
+
};
|
|
119
|
+
abiFunctions.set(func.name, abiFunction);
|
|
120
|
+
}
|
|
121
|
+
let returnTypeName = func.outputs.length == 1 ? getType(func.outputs[0]) : getTupleType(func.outputs);
|
|
122
|
+
abiFunction.overloads.push({
|
|
119
123
|
inputs: func.inputs,
|
|
120
|
-
outputs: func.outputs || []
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
outputs: func.outputs || [],
|
|
125
|
+
returnTypeName
|
|
126
|
+
});
|
|
127
|
+
}
|
|
123
128
|
output.block("interface ChainContext ", () => {
|
|
124
129
|
output.line(`_chain: Chain`);
|
|
125
130
|
});
|
|
@@ -159,33 +164,34 @@ function generateTsFromAbi(inputPathRaw, outputPathRaw) {
|
|
|
159
164
|
});
|
|
160
165
|
});
|
|
161
166
|
output.line();
|
|
162
|
-
|
|
167
|
+
for (const decl of abiFunctions.values()) {
|
|
168
|
+
if (decl.overloads.length > 1) {
|
|
169
|
+
for (let overload of decl.overloads) {
|
|
170
|
+
const args = overload.inputs.map((i, n) => `${i.name || `arg${n}`}: ${getType(i)}`);
|
|
171
|
+
const returnType = overload.returnTypeName;
|
|
172
|
+
output.line(`async ${decl.name}(${args}): Promise<${returnType}>`);
|
|
173
|
+
}
|
|
174
|
+
output.block(`async ${decl.name}(...args: any[])`, () => {
|
|
175
|
+
output.line(`return this.call("${decl.name}", args)`);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
const overload = decl.overloads[0];
|
|
180
|
+
const params = overload.inputs.map((i, n) => `${i.name || `arg${n}`}: ${getType(i)}`);
|
|
181
|
+
const returnType = overload.returnTypeName;
|
|
182
|
+
output.block(`async ${decl.name}(${params.join(`, `)}): Promise<${returnType}>`, () => {
|
|
183
|
+
output.line(`return this.call("${decl.name}", [${overload.inputs.map((i, n) => `${i.name || `arg${n}`}`).join(`, `)}])`);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
output.line();
|
|
187
|
+
}
|
|
188
|
+
output.block(`private async call(name: string, args: any[]) : Promise<any>`, () => {
|
|
163
189
|
output.line(`const fragment = abi.getFunction(name)`);
|
|
164
190
|
output.line(`const data = abi.encodeFunctionData(fragment, args)`);
|
|
165
191
|
output.line(`const result = await this._chain.client.call('eth_call', [{to: this.address, data}, this.blockHeight])`);
|
|
166
|
-
output.line(`
|
|
192
|
+
output.line(`const decoded = abi.decodeFunctionResult(fragment, result)`);
|
|
193
|
+
output.line(`return decoded.length > 1 ? decoded : decoded[0]`);
|
|
167
194
|
});
|
|
168
|
-
for (const decl of abiFunctions) {
|
|
169
|
-
const params = decl.inputs.map((i) => `${i.name}: ${getType(i)}`);
|
|
170
|
-
const returnType = decl.outputs.length > 1
|
|
171
|
-
? `{${decl.outputs.map((i) => `${i.name}: ${getType(i)}`)}}`
|
|
172
|
-
: getType(decl.outputs[0]);
|
|
173
|
-
output.line();
|
|
174
|
-
output.block(`async ${decl.name}(${params.join(`, `)}): Promise<${returnType}>`, () => {
|
|
175
|
-
output.line(`const result = await this.call("${decl.name}", [${decl.inputs.map((i) => `${i.name}`).join(`, `)}])`);
|
|
176
|
-
if (decl.outputs.length > 1) {
|
|
177
|
-
output.block("return ", () => {
|
|
178
|
-
for (let i = 0; i < decl.outputs.length; ++i) {
|
|
179
|
-
const out = decl.outputs[i];
|
|
180
|
-
output.line(`${out.name}: ${`result[${i}]`},`);
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
output.line(`return result[0]`);
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
195
|
});
|
|
190
196
|
output.line();
|
|
191
197
|
output.block("function getJsonAbi(): any", () => {
|
|
@@ -196,7 +202,7 @@ function generateTsFromAbi(inputPathRaw, outputPathRaw) {
|
|
|
196
202
|
fs_1.default.writeFileSync(outputPathRaw, output.toString());
|
|
197
203
|
}
|
|
198
204
|
// taken from: https://github.com/ethers-io/ethers.js/blob/948f77050dae884fe88932fd88af75560aac9d78/packages/cli/src.ts/typescript.ts#L10
|
|
199
|
-
function getType(param
|
|
205
|
+
function getType(param) {
|
|
200
206
|
if (param.type === "address" || param.type === "string") {
|
|
201
207
|
return "string";
|
|
202
208
|
}
|
|
@@ -204,28 +210,39 @@ function getType(param, flexible) {
|
|
|
204
210
|
return "boolean";
|
|
205
211
|
}
|
|
206
212
|
if (param.type.substring(0, 5) === "bytes") {
|
|
207
|
-
if (flexible) {
|
|
208
|
-
return "string | ethers.utils.BytesLike";
|
|
209
|
-
}
|
|
210
213
|
return "string";
|
|
211
214
|
}
|
|
212
215
|
let match = param.type.match(/^(u?int)([0-9]+)$/);
|
|
213
216
|
if (match) {
|
|
214
|
-
|
|
215
|
-
return "ethers.BigNumberish";
|
|
216
|
-
}
|
|
217
|
-
if (parseInt(match[2]) < 53) {
|
|
218
|
-
return 'number';
|
|
219
|
-
}
|
|
220
|
-
return 'ethers.BigNumber';
|
|
217
|
+
return parseInt(match[2]) < 53 ? 'number' : 'ethers.BigNumber';
|
|
221
218
|
}
|
|
222
219
|
if (param.baseType === "array") {
|
|
223
220
|
return "Array<" + getType(param.arrayChildren) + ">";
|
|
224
221
|
}
|
|
225
222
|
if (param.baseType === "tuple") {
|
|
226
|
-
|
|
227
|
-
return "{ " + struct.join(", ") + " }";
|
|
223
|
+
return getTupleType(param.components);
|
|
228
224
|
}
|
|
229
225
|
throw new Error("unknown type");
|
|
230
226
|
}
|
|
227
|
+
function getTupleType(params) {
|
|
228
|
+
let tuple = '[' + params.map(p => {
|
|
229
|
+
return p.name ? `${p.name}: ${getType(p)}` : getType(p);
|
|
230
|
+
}).join(', ') + ']';
|
|
231
|
+
let fields = getStructFields(params);
|
|
232
|
+
if (fields.length == 0)
|
|
233
|
+
return tuple;
|
|
234
|
+
let struct = '{' + fields.map(f => `${f.name}: ${getType(f)}`).join(', ') + '}';
|
|
235
|
+
return `(${tuple} & ${struct})`;
|
|
236
|
+
}
|
|
237
|
+
// https://github.com/ethers-io/ethers.js/blob/948f77050dae884fe88932fd88af75560aac9d78/packages/abi/src.ts/coders/tuple.ts#L29
|
|
238
|
+
function getStructFields(params) {
|
|
239
|
+
let array = [];
|
|
240
|
+
let counts = {};
|
|
241
|
+
for (let p of params) {
|
|
242
|
+
if (p.name && array[p.name] == null) {
|
|
243
|
+
counts[p.name] = (counts[p.name] || 0) + 1;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return params.filter(p => counts[p.name] == 1);
|
|
247
|
+
}
|
|
231
248
|
//# 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,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/main.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import fs from "fs"
|
|
5
|
-
import
|
|
6
|
-
import
|
|
1
|
+
import {EventFragment, Interface, ParamType} from "@ethersproject/abi"
|
|
2
|
+
import {Output} from "@subsquid/util-internal-code-printer"
|
|
3
|
+
import {program} from "commander"
|
|
4
|
+
import fs from "fs"
|
|
5
|
+
import path from "path"
|
|
6
|
+
import process from "process"
|
|
7
7
|
|
|
8
8
|
export function run(): void {
|
|
9
9
|
program.description(`
|
|
@@ -55,9 +55,7 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
55
55
|
const typeNames: {[key: string]: number} = {};
|
|
56
56
|
|
|
57
57
|
const abiEvents: Array<AbiEvent> = Object.values(abi.events).map((event: EventFragment): AbiEvent => {
|
|
58
|
-
let signature = `${event.name}(`;
|
|
59
58
|
let eventTypeName = `${event.name}`;
|
|
60
|
-
|
|
61
59
|
if (typeNames[event.name]) {
|
|
62
60
|
eventTypeName += typeNames[event.name].toString();
|
|
63
61
|
typeNames[event.name]++;
|
|
@@ -65,16 +63,16 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
65
63
|
eventTypeName += "0";
|
|
66
64
|
typeNames[event.name] = 1;
|
|
67
65
|
}
|
|
66
|
+
eventTypeName += 'Event'
|
|
68
67
|
|
|
68
|
+
let signature = `${event.name}(`;
|
|
69
69
|
if (event.inputs.length > 0) {
|
|
70
70
|
signature += event.inputs[0].type;
|
|
71
71
|
}
|
|
72
|
-
|
|
73
72
|
for (let i = 1; i < event.inputs.length; ++i) {
|
|
74
73
|
const input = event.inputs[i];
|
|
75
74
|
signature += `,${input.type}`;
|
|
76
75
|
}
|
|
77
|
-
|
|
78
76
|
signature += ")";
|
|
79
77
|
|
|
80
78
|
return {
|
|
@@ -85,11 +83,7 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
85
83
|
});
|
|
86
84
|
|
|
87
85
|
for (const decl of abiEvents) {
|
|
88
|
-
output.
|
|
89
|
-
for (const input of decl.inputs) {
|
|
90
|
-
output.line(`${input.name}: ${getType(input)};`);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
86
|
+
output.line(`export type ${decl.eventTypeName} = ${getTupleType(decl.inputs)}`)
|
|
93
87
|
output.line("");
|
|
94
88
|
}
|
|
95
89
|
|
|
@@ -100,24 +94,24 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
100
94
|
|
|
101
95
|
output.line();
|
|
102
96
|
|
|
97
|
+
output.block(`function decodeEvent(signature: string, data: EvmEvent): any`, () => {
|
|
98
|
+
output.line(`return abi.decodeEventLog(`);
|
|
99
|
+
output.indentation(() => {
|
|
100
|
+
output.line(`abi.getEvent(signature),`);
|
|
101
|
+
output.line(`data.data || "",`);
|
|
102
|
+
output.line("data.topics");
|
|
103
|
+
});
|
|
104
|
+
output.line(");");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
output.line();
|
|
108
|
+
|
|
103
109
|
output.block("export const events =", () => {
|
|
104
110
|
for (const decl of abiEvents) {
|
|
105
|
-
output.block(`"${decl.signature}"
|
|
111
|
+
output.block(`"${decl.signature}":`, () => {
|
|
106
112
|
output.line(`topic: abi.getEventTopic("${decl.signature}"),`);
|
|
107
|
-
output.block(`decode(data: EvmEvent): ${decl.eventTypeName}
|
|
108
|
-
output.line(`
|
|
109
|
-
output.indentation(() => {
|
|
110
|
-
output.line(`abi.getEvent("${decl.signature}"),`);
|
|
111
|
-
output.line(`data.data || "",`);
|
|
112
|
-
output.line("data.topics");
|
|
113
|
-
});
|
|
114
|
-
output.line(");");
|
|
115
|
-
output.block("return ", () => {
|
|
116
|
-
for (let i = 0; i < decl.inputs.length; ++i) {
|
|
117
|
-
const input = decl.inputs[i];
|
|
118
|
-
output.line(`${input.name}: ${`result[${i}]`},`);
|
|
119
|
-
}
|
|
120
|
-
});
|
|
113
|
+
output.block(`decode(data: EvmEvent): ${decl.eventTypeName}`, () => {
|
|
114
|
+
output.line(`return decodeEvent("${decl.signature}", data)`);
|
|
121
115
|
});
|
|
122
116
|
});
|
|
123
117
|
output.line(",");
|
|
@@ -126,15 +120,27 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
126
120
|
|
|
127
121
|
output.line();
|
|
128
122
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
123
|
+
let abiFunctions: Map<string, AbiFunction> = new Map()
|
|
124
|
+
for (let func of Object.values(abi.functions)) {
|
|
125
|
+
if (!func.constant || func.outputs == null) continue
|
|
126
|
+
|
|
127
|
+
let abiFunction = abiFunctions.get(func.name)
|
|
128
|
+
if (abiFunction == null) {
|
|
129
|
+
abiFunction = {
|
|
133
130
|
name: func.name,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
131
|
+
overloads: []
|
|
132
|
+
}
|
|
133
|
+
abiFunctions.set(func.name, abiFunction)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
let returnTypeName = func.outputs.length == 1 ? getType(func.outputs[0]) : getTupleType(func.outputs)
|
|
137
|
+
|
|
138
|
+
abiFunction.overloads.push({
|
|
139
|
+
inputs: func.inputs,
|
|
140
|
+
outputs: func.outputs || [],
|
|
141
|
+
returnTypeName
|
|
142
|
+
})
|
|
143
|
+
}
|
|
138
144
|
|
|
139
145
|
output.block("interface ChainContext ", () => {
|
|
140
146
|
output.line(`_chain: Chain`);
|
|
@@ -175,32 +181,33 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
175
181
|
})
|
|
176
182
|
})
|
|
177
183
|
output.line();
|
|
178
|
-
|
|
184
|
+
for (const decl of abiFunctions.values()) {
|
|
185
|
+
if (decl.overloads.length > 1) {
|
|
186
|
+
for (let overload of decl.overloads) {
|
|
187
|
+
const args = overload.inputs.map((i, n) => `${i.name || `arg${n}`}: ${getType(i)}`)
|
|
188
|
+
const returnType = overload.returnTypeName
|
|
189
|
+
output.line(`async ${decl.name}(${args}): Promise<${returnType}>`)
|
|
190
|
+
}
|
|
191
|
+
output.block(`async ${decl.name}(...args: any[])`, () => {
|
|
192
|
+
output.line(`return this.call("${decl.name}", args)`);
|
|
193
|
+
});
|
|
194
|
+
} else {
|
|
195
|
+
const overload = decl.overloads[0]
|
|
196
|
+
const params = overload.inputs.map((i, n) => `${i.name || `arg${n}`}: ${getType(i)}`)
|
|
197
|
+
const returnType = overload.returnTypeName
|
|
198
|
+
output.block(`async ${decl.name}(${params.join(`, `)}): Promise<${returnType}>`, () => {
|
|
199
|
+
output.line(`return this.call("${decl.name}", [${overload.inputs.map((i, n) => `${i.name || `arg${n}`}`).join(`, `)}])`);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
output.line();
|
|
203
|
+
}
|
|
204
|
+
output.block(`private async call(name: string, args: any[]) : Promise<any>`, () => {
|
|
179
205
|
output.line(`const fragment = abi.getFunction(name)`);
|
|
180
206
|
output.line(`const data = abi.encodeFunctionData(fragment, args)`);
|
|
181
207
|
output.line(`const result = await this._chain.client.call('eth_call', [{to: this.address, data}, this.blockHeight])`);
|
|
182
|
-
output.line(`
|
|
208
|
+
output.line(`const decoded = abi.decodeFunctionResult(fragment, result)`);
|
|
209
|
+
output.line(`return decoded.length > 1 ? decoded : decoded[0]`);
|
|
183
210
|
})
|
|
184
|
-
for (const decl of abiFunctions) {
|
|
185
|
-
const params = decl.inputs.map((i) => `${i.name}: ${getType(i)}`)
|
|
186
|
-
const returnType = decl.outputs.length > 1
|
|
187
|
-
? `{${decl.outputs.map((i) => `${i.name}: ${getType(i)}`)}}`
|
|
188
|
-
: getType(decl.outputs[0])
|
|
189
|
-
output.line();
|
|
190
|
-
output.block(`async ${decl.name}(${params.join(`, `)}): Promise<${returnType}>`, () => {
|
|
191
|
-
output.line(`const result = await this.call("${decl.name}", [${decl.inputs.map((i) => `${i.name}`).join(`, `)}])`);
|
|
192
|
-
if (decl.outputs.length > 1) {
|
|
193
|
-
output.block("return ", () => {
|
|
194
|
-
for (let i = 0; i < decl.outputs.length; ++i) {
|
|
195
|
-
const out = decl.outputs[i];
|
|
196
|
-
output.line(`${out.name}: ${`result[${i}]`},`);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
} else {
|
|
200
|
-
output.line(`return result[0]`);
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
211
|
})
|
|
205
212
|
|
|
206
213
|
output.line();
|
|
@@ -215,25 +222,22 @@ function generateTsFromAbi(inputPathRaw: string, outputPathRaw: string): void {
|
|
|
215
222
|
}
|
|
216
223
|
|
|
217
224
|
// taken from: https://github.com/ethers-io/ethers.js/blob/948f77050dae884fe88932fd88af75560aac9d78/packages/cli/src.ts/typescript.ts#L10
|
|
218
|
-
function getType(param: ParamType
|
|
219
|
-
if (param.type === "address" || param.type === "string") {
|
|
225
|
+
function getType(param: ParamType): string {
|
|
226
|
+
if (param.type === "address" || param.type === "string") {
|
|
227
|
+
return "string"
|
|
228
|
+
}
|
|
220
229
|
|
|
221
|
-
if (param.type === "bool") {
|
|
230
|
+
if (param.type === "bool") {
|
|
231
|
+
return "boolean"
|
|
232
|
+
}
|
|
222
233
|
|
|
223
234
|
if (param.type.substring(0, 5) === "bytes") {
|
|
224
|
-
if (flexible) {
|
|
225
|
-
return "string | ethers.utils.BytesLike";
|
|
226
|
-
}
|
|
227
235
|
return "string"
|
|
228
236
|
}
|
|
229
237
|
|
|
230
238
|
let match = param.type.match(/^(u?int)([0-9]+)$/)
|
|
231
239
|
if (match) {
|
|
232
|
-
|
|
233
|
-
return "ethers.BigNumberish";
|
|
234
|
-
}
|
|
235
|
-
if (parseInt(match[2]) < 53) {return 'number';}
|
|
236
|
-
return 'ethers.BigNumber';
|
|
240
|
+
return parseInt(match[2]) < 53 ? 'number' : 'ethers.BigNumber'
|
|
237
241
|
}
|
|
238
242
|
|
|
239
243
|
if (param.baseType === "array") {
|
|
@@ -241,13 +245,37 @@ function getType(param: ParamType, flexible?: boolean): string {
|
|
|
241
245
|
}
|
|
242
246
|
|
|
243
247
|
if (param.baseType === "tuple") {
|
|
244
|
-
|
|
245
|
-
return "{ " + struct.join(", ") + " }";
|
|
248
|
+
return getTupleType(param.components);
|
|
246
249
|
}
|
|
247
250
|
|
|
248
251
|
throw new Error("unknown type");
|
|
249
252
|
}
|
|
250
253
|
|
|
254
|
+
function getTupleType(params: ParamType[]) {
|
|
255
|
+
let tuple = '[' + params.map(p => {
|
|
256
|
+
return p.name ? `${p.name}: ${getType(p)}` : getType(p)
|
|
257
|
+
}).join(', ') + ']'
|
|
258
|
+
|
|
259
|
+
let fields = getStructFields(params)
|
|
260
|
+
if (fields.length == 0) return tuple
|
|
261
|
+
|
|
262
|
+
let struct = '{' + fields.map(f => `${f.name}: ${getType(f)}`).join(', ') + '}'
|
|
263
|
+
|
|
264
|
+
return `(${tuple} & ${struct})`
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// https://github.com/ethers-io/ethers.js/blob/948f77050dae884fe88932fd88af75560aac9d78/packages/abi/src.ts/coders/tuple.ts#L29
|
|
268
|
+
function getStructFields(params: ParamType[]): ParamType[] {
|
|
269
|
+
let array: any = []
|
|
270
|
+
let counts: Record<string, number> = {}
|
|
271
|
+
for (let p of params) {
|
|
272
|
+
if (p.name && array[p.name] == null) {
|
|
273
|
+
counts[p.name] = (counts[p.name] || 0) + 1
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return params.filter(p => counts[p.name] == 1)
|
|
277
|
+
}
|
|
278
|
+
|
|
251
279
|
interface AbiEvent {
|
|
252
280
|
signature: string;
|
|
253
281
|
eventTypeName: string;
|
|
@@ -256,6 +284,9 @@ interface AbiEvent {
|
|
|
256
284
|
|
|
257
285
|
interface AbiFunction {
|
|
258
286
|
name: string;
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
287
|
+
overloads: {
|
|
288
|
+
inputs: ParamType[];
|
|
289
|
+
outputs: ParamType[];
|
|
290
|
+
returnTypeName?: string;
|
|
291
|
+
}[]
|
|
292
|
+
}
|