dequanto 0.1.14 → 0.1.21
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/cjs/config/Config.js.map +1 -1
- package/lib/cjs/gen/Generator.d.ts +2 -0
- package/lib/cjs/gen/Generator.js +2 -0
- package/lib/cjs/gen/Generator.js.map +1 -1
- package/lib/cjs/gen/GeneratorFromAbi.d.ts +30 -7
- package/lib/cjs/gen/GeneratorFromAbi.js +193 -110
- package/lib/cjs/gen/GeneratorFromAbi.js.map +1 -1
- package/lib/cjs/gen/GeneratorStorageReader.d.ts +1 -0
- package/lib/cjs/gen/GeneratorStorageReader.js +25 -9
- package/lib/cjs/gen/GeneratorStorageReader.js.map +1 -1
- package/lib/cjs/utils/$config.js +4 -0
- package/lib/cjs/utils/$config.js.map +1 -1
- package/lib/esm/config/Config.js.map +1 -1
- package/lib/esm/gen/Generator.d.ts +2 -0
- package/lib/esm/gen/Generator.js.map +1 -1
- package/lib/esm/gen/Generator.mjs +2 -0
- package/lib/esm/gen/GeneratorFromAbi.d.ts +30 -7
- package/lib/esm/gen/GeneratorFromAbi.js.map +1 -1
- package/lib/esm/gen/GeneratorFromAbi.mjs +193 -110
- package/lib/esm/gen/GeneratorStorageReader.d.ts +1 -0
- package/lib/esm/gen/GeneratorStorageReader.js.map +1 -1
- package/lib/esm/gen/GeneratorStorageReader.mjs +25 -9
- package/lib/esm/utils/$config.js.map +1 -1
- package/lib/esm/utils/$config.mjs +4 -0
- package/package.json +2 -2
- package/src/config/Config.ts +2 -1
- package/src/gen/ContractStorageReaderTemplate.js +17 -0
- package/src/gen/ContractTemplate.js +77 -0
- package/src/gen/Generator.ts +6 -0
- package/src/gen/GeneratorFromAbi.ts +204 -121
- package/src/gen/GeneratorStorageReader.ts +29 -11
- package/src/utils/$config.ts +4 -0
|
@@ -15,6 +15,7 @@ export class GeneratorFromAbi {
|
|
|
15
15
|
return Gen;
|
|
16
16
|
}
|
|
17
17
|
async generate(abiJson, opts) {
|
|
18
|
+
let targetType = opts.target ?? 'ts';
|
|
18
19
|
let methodsArr = alot(abiJson)
|
|
19
20
|
.filter(x => x.type === 'function' || x.type === 'constructor')
|
|
20
21
|
.groupBy(x => x.name)
|
|
@@ -30,18 +31,9 @@ export class GeneratorFromAbi {
|
|
|
30
31
|
return null;
|
|
31
32
|
})
|
|
32
33
|
.filter(Boolean)
|
|
34
|
+
.map(x => x[opts?.target ?? 'ts'])
|
|
33
35
|
.map(Str.formatMethod)
|
|
34
36
|
.toArray();
|
|
35
|
-
// let methodInterfacesArr = alot(abiJson)
|
|
36
|
-
// .filter(x => x.type === 'function')
|
|
37
|
-
// .groupBy(x => x.name)
|
|
38
|
-
// .map(group => {
|
|
39
|
-
// let item = group.values[0];
|
|
40
|
-
// return Gen.serializeMethodInterfacesTs(item.name, group.values);
|
|
41
|
-
// })
|
|
42
|
-
// .filter(Boolean)
|
|
43
|
-
// .toArray();
|
|
44
|
-
//let methodInterfacesAll = Gen.serializeMethodInterfacesAllTs(methodInterfacesArr);
|
|
45
37
|
let methodTypes = alot(abiJson)
|
|
46
38
|
.filter(x => x.type === 'function')
|
|
47
39
|
.groupBy(x => x.name)
|
|
@@ -55,6 +47,7 @@ export class GeneratorFromAbi {
|
|
|
55
47
|
.filter(x => x.type === 'event')
|
|
56
48
|
.map(x => Gen.serializeEvent(x))
|
|
57
49
|
.filter(Boolean)
|
|
50
|
+
.map(x => x[opts?.target ?? 'ts'])
|
|
58
51
|
.map(Str.formatMethod);
|
|
59
52
|
let eventTypes = alot(abiJson)
|
|
60
53
|
.filter(x => x.type === 'event')
|
|
@@ -70,11 +63,13 @@ export class GeneratorFromAbi {
|
|
|
70
63
|
.filter(x => x.type === 'event')
|
|
71
64
|
.map(x => Gen.serializeEventExtractor(x))
|
|
72
65
|
.filter(Boolean)
|
|
66
|
+
.map(x => x[opts?.target ?? 'ts'])
|
|
73
67
|
.map(Str.formatMethod);
|
|
74
68
|
let eventsFetchersArr = abiJson
|
|
75
69
|
.filter(x => x.type === 'event')
|
|
76
70
|
.map(x => Gen.serializeEventFetcher(x))
|
|
77
71
|
.filter(Boolean)
|
|
72
|
+
.map(x => x[opts?.target ?? 'ts'])
|
|
78
73
|
.map(Str.formatMethod);
|
|
79
74
|
// let eventInterfaces = abiJson
|
|
80
75
|
// .filter(x => x.type === 'event')
|
|
@@ -86,7 +81,7 @@ export class GeneratorFromAbi {
|
|
|
86
81
|
let eventsExtractors = eventsExtractorsArr.join('\n\n');
|
|
87
82
|
let eventsFetchers = eventsFetchersArr.join('\n\n');
|
|
88
83
|
let name = opts.name;
|
|
89
|
-
let templatePath = $path.resolve(`/src/gen/ContractTemplate
|
|
84
|
+
let templatePath = $path.resolve(`/src/gen/ContractTemplate.${targetType}`);
|
|
90
85
|
let template = await File.readAsync(templatePath, { skipHooks: true });
|
|
91
86
|
let EtherscanStr;
|
|
92
87
|
let EthWeb3ClientStr;
|
|
@@ -94,13 +89,14 @@ export class GeneratorFromAbi {
|
|
|
94
89
|
let sourceUri;
|
|
95
90
|
let Web3ClientOptions = '';
|
|
96
91
|
let EvmScanOptions = '';
|
|
92
|
+
let importPfx = targetType === 'js' ? 'dequanto' : '@dequanto';
|
|
97
93
|
switch (opts.network) {
|
|
98
94
|
case 'bsc':
|
|
99
95
|
EtherscanStr = 'Bscscan';
|
|
100
96
|
EthWeb3ClientStr = 'BscWeb3Client';
|
|
101
97
|
imports = [
|
|
102
|
-
`import { Bscscan } from '
|
|
103
|
-
`import { BscWeb3Client } from '
|
|
98
|
+
`import { Bscscan } from '${importPfx}/explorer/Bscscan'`,
|
|
99
|
+
`import { BscWeb3Client } from '${importPfx}/clients/BscWeb3Client'`,
|
|
104
100
|
];
|
|
105
101
|
sourceUri = `https://bscscan.com/address/${opts.address}#code`;
|
|
106
102
|
break;
|
|
@@ -108,8 +104,8 @@ export class GeneratorFromAbi {
|
|
|
108
104
|
EtherscanStr = 'Polyscan';
|
|
109
105
|
EthWeb3ClientStr = 'PolyWeb3Client';
|
|
110
106
|
imports = [
|
|
111
|
-
`import { Polyscan } from '
|
|
112
|
-
`import { PolyWeb3Client } from '
|
|
107
|
+
`import { Polyscan } from '${importPfx}/explorer/Polyscan'`,
|
|
108
|
+
`import { PolyWeb3Client } from '${importPfx}/clients/PolyWeb3Client'`,
|
|
113
109
|
];
|
|
114
110
|
sourceUri = `https://polygonscan.com/address/${opts.address}#code`;
|
|
115
111
|
break;
|
|
@@ -117,8 +113,8 @@ export class GeneratorFromAbi {
|
|
|
117
113
|
EtherscanStr = 'XDaiscan';
|
|
118
114
|
EthWeb3ClientStr = 'XDaiWeb3Client';
|
|
119
115
|
imports = [
|
|
120
|
-
`import { XDaiscan } from '
|
|
121
|
-
`import { XDaiWeb3Client } from '
|
|
116
|
+
`import { XDaiscan } from '${importPfx}/chains/xdai/XDaiscan'`,
|
|
117
|
+
`import { XDaiWeb3Client } from '${importPfx}/chains/xdai/XDaiWeb3Client'`,
|
|
122
118
|
];
|
|
123
119
|
sourceUri = `https://blockscout.com/xdai/mainnet/address/${opts.address}/contracts`;
|
|
124
120
|
break;
|
|
@@ -126,8 +122,8 @@ export class GeneratorFromAbi {
|
|
|
126
122
|
EtherscanStr = 'Etherscan';
|
|
127
123
|
EthWeb3ClientStr = 'EthWeb3Client';
|
|
128
124
|
imports = [
|
|
129
|
-
`import { Etherscan } from '
|
|
130
|
-
`import { EthWeb3Client } from '
|
|
125
|
+
`import { Etherscan } from '${importPfx}/explorer/Etherscan'`,
|
|
126
|
+
`import { EthWeb3Client } from '${importPfx}/clients/EthWeb3Client'`,
|
|
131
127
|
];
|
|
132
128
|
sourceUri = `https://etherscan.io/address/${opts.address}#code`;
|
|
133
129
|
break;
|
|
@@ -135,8 +131,8 @@ export class GeneratorFromAbi {
|
|
|
135
131
|
EtherscanStr = 'Etherscan';
|
|
136
132
|
EthWeb3ClientStr = 'HardhatWeb3Client';
|
|
137
133
|
imports = [
|
|
138
|
-
`import { Etherscan } from '
|
|
139
|
-
`import { HardhatWeb3Client } from '
|
|
134
|
+
`import { Etherscan } from '${importPfx}/explorer/Etherscan'`,
|
|
135
|
+
`import { HardhatWeb3Client } from '${importPfx}/hardhat/HardhatWeb3Client'`,
|
|
140
136
|
];
|
|
141
137
|
sourceUri = ``;
|
|
142
138
|
break;
|
|
@@ -146,8 +142,8 @@ export class GeneratorFromAbi {
|
|
|
146
142
|
EtherscanStr = 'Evmscan';
|
|
147
143
|
EthWeb3ClientStr = 'EvmWeb3Client';
|
|
148
144
|
imports = [
|
|
149
|
-
`import { Evmscan } from '
|
|
150
|
-
`import { EvmWeb3Client } from '
|
|
145
|
+
`import { Evmscan } from '${importPfx}/explorer/Evmscan'`,
|
|
146
|
+
`import { EvmWeb3Client } from '${importPfx}/clients/EvmWeb3Client'`,
|
|
151
147
|
];
|
|
152
148
|
Web3ClientOptions = `{ platform: '${opts.network}' }`;
|
|
153
149
|
EvmScanOptions = `{ platform: '${opts.network}' }`;
|
|
@@ -165,7 +161,7 @@ export class GeneratorFromAbi {
|
|
|
165
161
|
let outputFilename = /[^\\/]+$/.exec(name)[0];
|
|
166
162
|
let outputPath = /\.(ts|js)$/.test(opts.output)
|
|
167
163
|
? opts.output
|
|
168
|
-
: class_Uri.combine(opts.output, outputDirectory, `${outputFilename}.
|
|
164
|
+
: class_Uri.combine(opts.output, outputDirectory, `${outputFilename}.${opts.outputFileExt ?? targetType}`);
|
|
169
165
|
let meta = {
|
|
170
166
|
artifact: opts.artifact
|
|
171
167
|
? this.getRelativePath(opts.artifact)
|
|
@@ -181,13 +177,13 @@ export class GeneratorFromAbi {
|
|
|
181
177
|
let storageReaderClass = '';
|
|
182
178
|
try {
|
|
183
179
|
let storageReaderGenerator = new GeneratorStorageReader();
|
|
184
|
-
let reader = await storageReaderGenerator.generate({ ...opts });
|
|
180
|
+
let reader = await storageReaderGenerator.generate({ ...opts, target: targetType });
|
|
185
181
|
if (reader.sourcePath != null && opts.address == null) {
|
|
186
182
|
sourceUri = this.getRelativePath(reader.sourcePath);
|
|
187
183
|
}
|
|
188
184
|
if (reader.className) {
|
|
189
185
|
storageReaderClass = reader.code;
|
|
190
|
-
storageReaderProperty = `declare storage: ${reader.className}
|
|
186
|
+
storageReaderProperty = targetType === 'ts' ? `declare storage: ${reader.className}` : '';
|
|
191
187
|
storageReaderInitializer = `this.storage = new ${reader.className}(this.address, this.client, this.explorer);`;
|
|
192
188
|
$logger.log(`green<StorageReader> was generated`);
|
|
193
189
|
}
|
|
@@ -220,8 +216,8 @@ export class GeneratorFromAbi {
|
|
|
220
216
|
.replace(`/* STORAGE_READER_INITIALIZER */`, storageReaderInitializer)
|
|
221
217
|
.replace(`/* STORAGE_READER_PROPERTY */`, storageReaderProperty)
|
|
222
218
|
.replace(`/* STORAGE_READER_CLASS */`, () => storageReaderClass)
|
|
223
|
-
.replace(`/* TX_CALLER_METHODS */`, () => Gen.serializeTxCallerMethods(className, abiJson))
|
|
224
|
-
.replace(`/* TX_DATA_METHODS */`, () => Gen.serializeTxDataMethods(className, abiJson))
|
|
219
|
+
.replace(`/* TX_CALLER_METHODS */`, () => Gen.serializeTxCallerMethods(className, abiJson)[targetType])
|
|
220
|
+
.replace(`/* TX_DATA_METHODS */`, () => Gen.serializeTxDataMethods(className, abiJson)[targetType])
|
|
225
221
|
.replace(`/* $EVENT_TYPES$ */`, () => Str.indent(eventTypes.map(x => x.code).join('\n'), ' '))
|
|
226
222
|
.replace(`/* $METHOD_TYPES$ */`, () => Str.indent(methodTypes.map(x => x.code).join('\n'), ' '));
|
|
227
223
|
await File.writeAsync(outputPath, code, { skipHooks: true });
|
|
@@ -295,8 +291,8 @@ var Gen;
|
|
|
295
291
|
// abi.length > 1 if has method overloads
|
|
296
292
|
function serializeMethodInterfacesTs(name, abis) {
|
|
297
293
|
let args = abis.map(abi => {
|
|
298
|
-
let {
|
|
299
|
-
return `[ ${
|
|
294
|
+
let { fnInputArgumentsTargets } = serializeArgumentsTs(abi);
|
|
295
|
+
return `[ ${fnInputArgumentsTargets.ts} ]`;
|
|
300
296
|
}).join(' | ');
|
|
301
297
|
let iface = `IMethod${name[0].toUpperCase()}${name.substring(1)}`;
|
|
302
298
|
let code = [
|
|
@@ -314,8 +310,8 @@ var Gen;
|
|
|
314
310
|
Gen.serializeMethodInterfacesTs = serializeMethodInterfacesTs;
|
|
315
311
|
function serializeMethodTypeTs(name, abis) {
|
|
316
312
|
let args = abis.map(abi => {
|
|
317
|
-
let {
|
|
318
|
-
return `[ ${
|
|
313
|
+
let { fnInputArgumentsTargets } = serializeArgumentsTs(abi);
|
|
314
|
+
return `[ ${fnInputArgumentsTargets.ts} ]`;
|
|
319
315
|
}).join(' | ');
|
|
320
316
|
let iface = `IMethod${name[0].toUpperCase()}${name.substring(1)}`;
|
|
321
317
|
let code = [
|
|
@@ -362,9 +358,9 @@ var Gen;
|
|
|
362
358
|
}
|
|
363
359
|
Gen.serializeEventsInterfacesAllTs = serializeEventsInterfacesAllTs;
|
|
364
360
|
function serializeEventType(event) {
|
|
365
|
-
let {
|
|
366
|
-
let outputParams = `{ ${
|
|
367
|
-
let outputArgs = `[ ${
|
|
361
|
+
let { fnInputArgumentsTargets, callInputArguments, fnResult } = serializeArgumentsTs(event);
|
|
362
|
+
let outputParams = `{ ${fnInputArgumentsTargets.ts} }`;
|
|
363
|
+
let outputArgs = `[ ${fnInputArgumentsTargets.ts.replace('\n', '')} ]`;
|
|
368
364
|
let code = [
|
|
369
365
|
`${event.name}: {`,
|
|
370
366
|
` outputParams: ${outputParams},`,
|
|
@@ -377,36 +373,58 @@ var Gen;
|
|
|
377
373
|
}
|
|
378
374
|
Gen.serializeEventType = serializeEventType;
|
|
379
375
|
function serializeEvent(abi) {
|
|
380
|
-
let {
|
|
381
|
-
return
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
376
|
+
let { fnInputArgumentsTargets, callInputArguments, fnResult } = serializeArgumentsTs(abi);
|
|
377
|
+
return {
|
|
378
|
+
ts: `
|
|
379
|
+
on${abi.name} (fn?: (event: TClientEventsStreamData<TEventArguments<'${abi.name}'>>) => void): ClientEventsStream<TClientEventsStreamData<TEventArguments<'${abi.name}'>>> {
|
|
380
|
+
return this.$onLog('${abi.name}', fn);
|
|
381
|
+
}
|
|
382
|
+
`,
|
|
383
|
+
js: `
|
|
384
|
+
on${abi.name} (fn) {
|
|
385
|
+
return this.$onLog('${abi.name}', fn);
|
|
386
|
+
}
|
|
387
|
+
`
|
|
388
|
+
};
|
|
386
389
|
}
|
|
387
390
|
Gen.serializeEvent = serializeEvent;
|
|
388
391
|
function serializeEventExtractor(abi) {
|
|
389
|
-
return
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
392
|
+
return {
|
|
393
|
+
ts: `
|
|
394
|
+
extractLogs${abi.name} (tx: TEth.TxReceipt): ITxLogItem<TEventParams<'${abi.name}'>>[] {
|
|
395
|
+
let abi = this.$getAbiItem('event', '${abi.name}');
|
|
396
|
+
return this.$extractLogs(tx, abi) as any as ITxLogItem<TEventParams<'${abi.name}'>>[];
|
|
397
|
+
}
|
|
398
|
+
`,
|
|
399
|
+
js: `
|
|
400
|
+
extractLogs${abi.name} (tx) {
|
|
401
|
+
let abi = this.$getAbiItem('event', '${abi.name}');
|
|
402
|
+
return this.$extractLogs(tx, abi);
|
|
403
|
+
}
|
|
404
|
+
`
|
|
405
|
+
};
|
|
395
406
|
}
|
|
396
407
|
Gen.serializeEventExtractor = serializeEventExtractor;
|
|
397
408
|
function serializeEventFetcher(abi) {
|
|
398
409
|
let inputs = abi.inputs;
|
|
399
410
|
let indexed = alot(inputs).takeWhile(x => x.indexed).toArray();
|
|
400
411
|
let indexedParams = indexed.map(param => `${param.name}?: ${$abiType.getTsType(param.type, param)}`);
|
|
401
|
-
return
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
412
|
+
return {
|
|
413
|
+
ts: `
|
|
414
|
+
async getPastLogs${abi.name} (options?: {
|
|
415
|
+
fromBlock?: number | Date
|
|
416
|
+
toBlock?: number | Date
|
|
417
|
+
params?: { ${indexedParams} }
|
|
418
|
+
}): Promise<ITxLogItem<TEventParams<'${abi.name}'>>[]> {
|
|
419
|
+
return await this.$getPastLogsParsed('${abi.name}', options) as any;
|
|
420
|
+
}
|
|
421
|
+
`,
|
|
422
|
+
js: `
|
|
423
|
+
async getPastLogs${abi.name} (options) {
|
|
424
|
+
return await this.$getPastLogsParsed('${abi.name}', options);
|
|
425
|
+
}
|
|
426
|
+
`
|
|
427
|
+
};
|
|
410
428
|
}
|
|
411
429
|
Gen.serializeEventFetcher = serializeEventFetcher;
|
|
412
430
|
// export function serializeEventInterface (abi: TAbiItem) {
|
|
@@ -435,76 +453,115 @@ var Gen;
|
|
|
435
453
|
}
|
|
436
454
|
Gen.serializeMethodAbi = serializeMethodAbi;
|
|
437
455
|
function serializeReadMethodTs(abi) {
|
|
438
|
-
let {
|
|
456
|
+
let { fnInputArgumentsTargets, callInputArguments, fnResult } = serializeArgumentsTs(abi);
|
|
439
457
|
if (callInputArguments) {
|
|
440
458
|
callInputArguments = `, ${callInputArguments}`;
|
|
441
459
|
}
|
|
442
|
-
return
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
460
|
+
return {
|
|
461
|
+
ts: `
|
|
462
|
+
// ${$abiUtils.getMethodSignature(abi)}
|
|
463
|
+
async ${abi.name} (${fnInputArgumentsTargets.ts}): ${fnResult} {
|
|
464
|
+
return this.$read(this.$getAbiItem('function', '${abi.name}')${callInputArguments});
|
|
465
|
+
}
|
|
466
|
+
`,
|
|
467
|
+
js: `
|
|
468
|
+
// ${$abiUtils.getMethodSignature(abi)}
|
|
469
|
+
async ${abi.name} (${fnInputArgumentsTargets.js}) {
|
|
470
|
+
return this.$read(this.$getAbiItem('function', '${abi.name}')${callInputArguments});
|
|
471
|
+
}
|
|
472
|
+
`
|
|
473
|
+
};
|
|
448
474
|
}
|
|
449
475
|
function serializeReadMethodTsOverloads(abis) {
|
|
450
476
|
let overrides = abis.map(abi => {
|
|
451
|
-
let {
|
|
477
|
+
let { fnInputArgumentsTargets, fnResult } = serializeArgumentsTs(abi);
|
|
452
478
|
return `
|
|
453
479
|
// ${$abiUtils.getMethodSignature(abi)}
|
|
454
|
-
async ${abi.name} (${
|
|
480
|
+
async ${abi.name} (${fnInputArgumentsTargets.ts}): ${fnResult}
|
|
455
481
|
`;
|
|
456
482
|
}).join('\n');
|
|
457
483
|
let abi = abis[0];
|
|
458
484
|
let { fnResult } = serializeArgumentsTs(abi);
|
|
459
485
|
let sigs = abis.map(abi => serializeMethodAbi(abi)).map(x => `'${x}'`).join(', ');
|
|
460
|
-
return
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
486
|
+
return {
|
|
487
|
+
ts: `
|
|
488
|
+
${overrides}
|
|
489
|
+
async ${abi.name} (...args): ${fnResult} {
|
|
490
|
+
let abi = this.$getAbiItemOverload([ ${sigs} ], args);
|
|
491
|
+
return this.$read(abi, ...args);
|
|
492
|
+
}
|
|
493
|
+
`,
|
|
494
|
+
js: `
|
|
495
|
+
async ${abi.name} (...args) {
|
|
496
|
+
let abi = this.$getAbiItemOverload([ ${sigs} ], args);
|
|
497
|
+
return this.$read(abi, ...args);
|
|
498
|
+
}
|
|
499
|
+
`
|
|
500
|
+
};
|
|
467
501
|
}
|
|
468
502
|
function serializeWriteMethodTs(abi) {
|
|
469
|
-
let {
|
|
503
|
+
let { fnInputArgumentsTargets, callInputArguments } = serializeArgumentsTs(abi);
|
|
470
504
|
if (callInputArguments) {
|
|
471
505
|
callInputArguments = `, ${callInputArguments}`;
|
|
472
506
|
}
|
|
473
|
-
return
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
507
|
+
return {
|
|
508
|
+
ts: `
|
|
509
|
+
// ${$abiUtils.getMethodSignature(abi)}
|
|
510
|
+
async ${abi.name} (sender: TSender, ${fnInputArgumentsTargets.ts}): Promise<TxWriter> {
|
|
511
|
+
return this.$write(this.$getAbiItem('function', '${abi.name}'), sender${callInputArguments});
|
|
512
|
+
}
|
|
513
|
+
`,
|
|
514
|
+
js: `
|
|
515
|
+
// ${$abiUtils.getMethodSignature(abi)}
|
|
516
|
+
async ${abi.name} (sender, ${fnInputArgumentsTargets.js}) {
|
|
517
|
+
return this.$write(this.$getAbiItem('function', '${abi.name}'), sender${callInputArguments});
|
|
518
|
+
}
|
|
519
|
+
`
|
|
520
|
+
};
|
|
479
521
|
}
|
|
480
522
|
function serializeConstructorMethodTs(abi) {
|
|
481
|
-
let {
|
|
523
|
+
let { fnInputArgumentsTargets, callInputArguments } = serializeArgumentsTs(abi);
|
|
482
524
|
if (callInputArguments) {
|
|
483
525
|
callInputArguments = `, ${callInputArguments}`;
|
|
484
526
|
}
|
|
485
|
-
return
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
527
|
+
return {
|
|
528
|
+
ts: `
|
|
529
|
+
async $constructor (deployer: TSender, ${fnInputArgumentsTargets.ts}): Promise<TxWriter> {
|
|
530
|
+
throw new Error('Not implemented. Typing purpose. Use the ContractDeployer class to deploy the contract');
|
|
531
|
+
}
|
|
532
|
+
`,
|
|
533
|
+
js: `
|
|
534
|
+
async $constructor (deployer, ${fnInputArgumentsTargets.js}) {
|
|
535
|
+
throw new Error('Not implemented. Typing purpose. Use the ContractDeployer class to deploy the contract');
|
|
536
|
+
}
|
|
537
|
+
`
|
|
538
|
+
};
|
|
490
539
|
}
|
|
491
540
|
function serializeWriteMethodTsOverloads(abis) {
|
|
492
541
|
let overrides = abis.map(abi => {
|
|
493
|
-
let {
|
|
542
|
+
let { fnInputArgumentsTargets, fnResult } = serializeArgumentsTs(abi);
|
|
494
543
|
return `
|
|
495
544
|
// ${$abiUtils.getMethodSignature(abi)}
|
|
496
|
-
async ${abi.name} (sender: TSender, ${
|
|
545
|
+
async ${abi.name} (sender: TSender, ${fnInputArgumentsTargets.ts}): Promise<TxWriter>
|
|
497
546
|
`;
|
|
498
547
|
}).join('\n');
|
|
499
548
|
let abi = abis[0];
|
|
500
549
|
let sigs = abis.map(abi => serializeMethodAbi(abi)).map(x => `'${x}'`).join(', ');
|
|
501
|
-
return
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
550
|
+
return {
|
|
551
|
+
ts: `
|
|
552
|
+
${overrides}
|
|
553
|
+
async ${abi.name} (sender: TSender, ...args): Promise<TxWriter> {
|
|
554
|
+
let abi = this.$getAbiItemOverload([ ${sigs} ], args);
|
|
555
|
+
return this.$write(abi, sender, ...args);
|
|
556
|
+
}
|
|
557
|
+
`,
|
|
558
|
+
js: `
|
|
559
|
+
async ${abi.name} (sender, ...args) {
|
|
560
|
+
let abi = this.$getAbiItemOverload([ ${sigs} ], args);
|
|
561
|
+
return this.$write(abi, sender, ...args);
|
|
562
|
+
}
|
|
563
|
+
`
|
|
564
|
+
};
|
|
508
565
|
}
|
|
509
566
|
function serializeArgumentsTs(abi) {
|
|
510
567
|
let inputs = abi.inputs.map((input, i) => {
|
|
@@ -517,22 +574,38 @@ var Gen;
|
|
|
517
574
|
}
|
|
518
575
|
return result;
|
|
519
576
|
});
|
|
520
|
-
let
|
|
577
|
+
let fnInputArgumentsArr = inputs
|
|
521
578
|
?.map((input) => {
|
|
522
579
|
let tsType = $abiType.getTsType(input.type, input);
|
|
523
580
|
if (tsType == null) {
|
|
524
581
|
throw new Error(`Unknown abi type in arguments: ${input.type}`);
|
|
525
582
|
}
|
|
526
|
-
return
|
|
583
|
+
return { name: input.name, type: tsType };
|
|
584
|
+
}) ?? [];
|
|
585
|
+
let fnInputArgumentsTs = fnInputArgumentsArr
|
|
586
|
+
.map((input) => {
|
|
587
|
+
return `${input.name}: ${input.type}`;
|
|
527
588
|
})
|
|
528
|
-
|
|
589
|
+
.join(', ');
|
|
590
|
+
let fnInputArgumentsJs = fnInputArgumentsArr
|
|
591
|
+
.map((input) => {
|
|
592
|
+
return `${input.name}`;
|
|
593
|
+
})
|
|
594
|
+
.join(', ');
|
|
529
595
|
let callInputArguments = inputs
|
|
530
596
|
?.map(input => {
|
|
531
597
|
return `${input.name}`;
|
|
532
598
|
})
|
|
533
599
|
?.join(', ') ?? '';
|
|
534
600
|
let fnResult = serializeMethodTsReturns(abi.outputs);
|
|
535
|
-
return {
|
|
601
|
+
return {
|
|
602
|
+
fnInputArgumentsTargets: {
|
|
603
|
+
ts: fnInputArgumentsTs,
|
|
604
|
+
js: fnInputArgumentsJs,
|
|
605
|
+
},
|
|
606
|
+
callInputArguments,
|
|
607
|
+
fnResult
|
|
608
|
+
};
|
|
536
609
|
}
|
|
537
610
|
function isObjectParams(params) {
|
|
538
611
|
return params?.every(x => Boolean(x.name));
|
|
@@ -610,34 +683,44 @@ var Gen;
|
|
|
610
683
|
function serializeTxCallerMethods(className, abiJson) {
|
|
611
684
|
let methods = abiJson.filter(x => x.type === 'function');
|
|
612
685
|
let writeMethods = methods.filter(abi => $abiUtils.isReadMethod(abi) === false);
|
|
613
|
-
let lines =
|
|
614
|
-
|
|
615
|
-
lines.push(serializeMethodTs(method));
|
|
686
|
+
let lines = writeMethods.map(method => {
|
|
687
|
+
return serializeMethodTs(method);
|
|
616
688
|
});
|
|
617
|
-
return
|
|
689
|
+
return {
|
|
690
|
+
ts: lines.map(x => x.ts).join('\n'),
|
|
691
|
+
js: lines.map(x => x.js).join('\n'),
|
|
692
|
+
};
|
|
618
693
|
function serializeMethodTs(abi) {
|
|
619
|
-
let {
|
|
694
|
+
let { fnInputArgumentsTargets, callInputArguments, fnResult } = serializeArgumentsTs(abi);
|
|
620
695
|
if (callInputArguments) {
|
|
621
696
|
callInputArguments = `, ${callInputArguments}`;
|
|
622
697
|
}
|
|
623
|
-
return
|
|
698
|
+
return {
|
|
699
|
+
ts: ` ${abi.name} (sender: TSender, ${fnInputArgumentsTargets.ts}): Promise<{ error?: Error & { data?: { type: string, params } }, result? }>`,
|
|
700
|
+
js: ` ${abi.name} (sender, ${fnInputArgumentsTargets.js})`,
|
|
701
|
+
};
|
|
624
702
|
}
|
|
625
703
|
}
|
|
626
704
|
Gen.serializeTxCallerMethods = serializeTxCallerMethods;
|
|
627
705
|
function serializeTxDataMethods(className, abiJson) {
|
|
628
706
|
let methods = abiJson.filter(x => x.type === 'function');
|
|
629
707
|
let writeMethods = methods.filter(abi => $abiUtils.isReadMethod(abi) === false);
|
|
630
|
-
let lines =
|
|
631
|
-
|
|
632
|
-
lines.push(serializeInterfaceMethodTs(method));
|
|
708
|
+
let lines = writeMethods.map(method => {
|
|
709
|
+
return serializeInterfaceMethodTs(method);
|
|
633
710
|
});
|
|
634
|
-
return
|
|
711
|
+
return {
|
|
712
|
+
ts: lines.map(x => x.ts).join('\n'),
|
|
713
|
+
js: lines.map(x => x.js).join('\n'),
|
|
714
|
+
};
|
|
635
715
|
function serializeInterfaceMethodTs(abi) {
|
|
636
|
-
let {
|
|
716
|
+
let { fnInputArgumentsTargets, callInputArguments, fnResult } = serializeArgumentsTs(abi);
|
|
637
717
|
if (callInputArguments) {
|
|
638
718
|
callInputArguments = `, ${callInputArguments}`;
|
|
639
719
|
}
|
|
640
|
-
return
|
|
720
|
+
return {
|
|
721
|
+
ts: ` ${abi.name} (sender: TSender, ${fnInputArgumentsTargets.ts}): Promise<TEth.TxLike>`,
|
|
722
|
+
js: ` ${abi.name} (sender, ${fnInputArgumentsTargets.js})`,
|
|
723
|
+
};
|
|
641
724
|
}
|
|
642
725
|
}
|
|
643
726
|
Gen.serializeTxDataMethods = serializeTxDataMethods;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeneratorStorageReader.js","sourceRoot":"","sources":["../../../src/gen/GeneratorStorageReader.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAIvB,gEAA4D;AAC5D,uDAAmD;AACnD,qCAA8B;AAC9B,qCAAiC;AACjC,uDAAmD;AACnD,iDAA6C;AAC7C,uCAAmC;AAGnC,MAAa,sBAAsB;IAE/B,KAAK,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"GeneratorStorageReader.js","sourceRoot":"","sources":["../../../src/gen/GeneratorStorageReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { $path } from '../utils/$path.mjs';
|
|
|
8
8
|
import { $gen } from './utils/$gen.mjs';
|
|
9
9
|
export class GeneratorStorageReader {
|
|
10
10
|
async generate(opts) {
|
|
11
|
+
let targetType = opts.target ?? 'ts';
|
|
11
12
|
let { client, sources, contractName, address } = opts;
|
|
12
13
|
let files = alot.fromObject(sources ?? {}).map(x => {
|
|
13
14
|
return {
|
|
@@ -36,8 +37,8 @@ export class GeneratorStorageReader {
|
|
|
36
37
|
$require.String(file?.content ?? file?.path, `Expected a source content to resolve slots`);
|
|
37
38
|
let slots = await SlotsParser.slots({ code: file.content, path: file.path }, contractName, { files });
|
|
38
39
|
let methods = this.serializeSlots(slots);
|
|
39
|
-
let codeMethods = methods.join('\n\n');
|
|
40
|
-
let templatePath = $path.resolve(`/src/gen/ContractStorageReaderTemplate
|
|
40
|
+
let codeMethods = methods.map(x => x[targetType]).join('\n\n');
|
|
41
|
+
let templatePath = $path.resolve(`/src/gen/ContractStorageReaderTemplate.${targetType}`);
|
|
41
42
|
let template = await File.readAsync(templatePath, { skipHooks: true });
|
|
42
43
|
let className = $gen.toClassName(opts.name + 'StorageReader');
|
|
43
44
|
let code = template
|
|
@@ -53,17 +54,29 @@ export class GeneratorStorageReader {
|
|
|
53
54
|
serializeSlots(slots) {
|
|
54
55
|
return slots
|
|
55
56
|
.map(slot => this.serializeSlot(slot))
|
|
56
|
-
.map(
|
|
57
|
+
.map(entry => {
|
|
58
|
+
return {
|
|
59
|
+
ts: Str.formatMethod(entry.ts),
|
|
60
|
+
js: Str.formatMethod(entry.js),
|
|
61
|
+
};
|
|
62
|
+
});
|
|
57
63
|
}
|
|
58
64
|
serializeSlot(slot) {
|
|
59
65
|
let name = slot.name;
|
|
60
66
|
let type = slot.type;
|
|
61
67
|
let { parametersTypes, parametersCall, returnType } = this.getParameters(type);
|
|
62
|
-
return
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
return {
|
|
69
|
+
ts: `
|
|
70
|
+
async ${name}(${parametersTypes?.ts ?? ''}): Promise<${returnType}> {
|
|
71
|
+
return this.$storage.get(['${name}', ${parametersCall ?? ''}]);
|
|
72
|
+
}
|
|
73
|
+
`,
|
|
74
|
+
js: `
|
|
75
|
+
async ${name}(${parametersTypes?.js ?? ''}) {
|
|
76
|
+
return this.$storage.get(['${name}', ${parametersCall ?? ''}]);
|
|
77
|
+
}
|
|
78
|
+
`
|
|
79
|
+
};
|
|
67
80
|
}
|
|
68
81
|
getParameters(type) {
|
|
69
82
|
if (type.startsWith('mapping')) {
|
|
@@ -72,7 +85,10 @@ export class GeneratorStorageReader {
|
|
|
72
85
|
let keyTsType = $abiType.getTsTypeFromDefinition(keyType);
|
|
73
86
|
let valueTsType = $abiType.getTsTypeFromDefinition(valueType);
|
|
74
87
|
return {
|
|
75
|
-
parametersTypes:
|
|
88
|
+
parametersTypes: {
|
|
89
|
+
ts: `key: ${keyTsType}`,
|
|
90
|
+
js: `key`
|
|
91
|
+
},
|
|
76
92
|
returnType: `${valueTsType}`,
|
|
77
93
|
parametersCall: 'key',
|
|
78
94
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"$config.js","sourceRoot":"","sources":["../../../src/utils/$config.ts"],"names":[],"mappings":";;;AAAA,oDAAiD;AACjD,2CAA8D;AAE9D,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,WAAW;IACzC,CAAC,CAAC,MAAM;IACR,CAAC,CAAC,MAAM,CAAC;AACb,IAAiB,OAAO,
|
|
1
|
+
{"version":3,"file":"$config.js","sourceRoot":"","sources":["../../../src/utils/$config.ts"],"names":[],"mappings":"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"}
|