aboutsummaryrefslogtreecommitdiffstats
path: root/packages/abi-gen/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/abi-gen/src')
-rw-r--r--packages/abi-gen/src/index.ts13
-rw-r--r--packages/abi-gen/src/types.ts5
-rw-r--r--packages/abi-gen/src/utils.ts18
3 files changed, 28 insertions, 8 deletions
diff --git a/packages/abi-gen/src/index.ts b/packages/abi-gen/src/index.ts
index bc5a974a9..d34d74cdf 100644
--- a/packages/abi-gen/src/index.ts
+++ b/packages/abi-gen/src/index.ts
@@ -11,13 +11,14 @@ import * as yargs from 'yargs';
import toSnakeCase = require('to-snake-case');
import * as Web3 from 'web3';
-import { ContextData, ParamKind } from './types';
+import { ContextData, ContractsBackend, ParamKind } from './types';
import { utils } from './utils';
const ABI_TYPE_CONSTRUCTOR = 'constructor';
const ABI_TYPE_METHOD = 'function';
const ABI_TYPE_EVENT = 'event';
const DEFAULT_NETWORK_ID = 50;
+const DEFAULT_BACKEND = 'web3';
const args = yargs
.option('abis', {
@@ -43,6 +44,12 @@ const args = yargs
demandOption: true,
normalize: true,
})
+ .option('backend', {
+ describe: 'Which backend do you plan to use. Either web3 or ethers',
+ type: 'string',
+ choices: [ContractsBackend.Web3, ContractsBackend.Ethers],
+ default: DEFAULT_BACKEND,
+ })
.option('network-id', {
describe: 'ID of the network where contract ABIs are nested in artifacts',
type: 'number',
@@ -73,8 +80,8 @@ function writeOutputFile(name: string, renderedTsCode: string): void {
utils.log(`Created: ${chalk.bold(filePath)}`);
}
-Handlebars.registerHelper('parameterType', utils.solTypeToTsType.bind(utils, ParamKind.Input));
-Handlebars.registerHelper('returnType', utils.solTypeToTsType.bind(utils, ParamKind.Output));
+Handlebars.registerHelper('parameterType', utils.solTypeToTsType.bind(utils, ParamKind.Input, args.backend));
+Handlebars.registerHelper('returnType', utils.solTypeToTsType.bind(utils, ParamKind.Output, args.backend));
if (args.partials) {
registerPartials(args.partials);
diff --git a/packages/abi-gen/src/types.ts b/packages/abi-gen/src/types.ts
index e82ab824b..402e0105e 100644
--- a/packages/abi-gen/src/types.ts
+++ b/packages/abi-gen/src/types.ts
@@ -12,6 +12,11 @@ export enum AbiType {
Fallback = 'fallback',
}
+export enum ContractsBackend {
+ Web3 = 'web3',
+ Ethers = 'ethers',
+}
+
export interface Method extends Web3.MethodAbi {
singleReturnValue: boolean;
}
diff --git a/packages/abi-gen/src/utils.ts b/packages/abi-gen/src/utils.ts
index 14255643a..dc2c5390e 100644
--- a/packages/abi-gen/src/utils.ts
+++ b/packages/abi-gen/src/utils.ts
@@ -3,14 +3,14 @@ import * as _ from 'lodash';
import * as path from 'path';
import * as Web3 from 'web3';
-import { AbiType, ParamKind } from './types';
+import { AbiType, ContractsBackend, ParamKind } from './types';
export const utils = {
- solTypeToTsType(paramKind: ParamKind, solType: string): string {
+ solTypeToTsType(paramKind: ParamKind, backend: ContractsBackend, solType: string): string {
const trailingArrayRegex = /\[\d*\]$/;
if (solType.match(trailingArrayRegex)) {
const arrayItemSolType = solType.replace(trailingArrayRegex, '');
- const arrayItemTsType = utils.solTypeToTsType(paramKind, arrayItemSolType);
+ const arrayItemTsType = utils.solTypeToTsType(paramKind, backend, arrayItemSolType);
const arrayTsType = utils.isUnionType(arrayItemTsType)
? `Array<${arrayItemTsType}>`
: `${arrayItemTsType}[]`;
@@ -24,13 +24,21 @@ export const utils = {
{ regex: '^bytes\\d*$', tsType: 'string' },
];
if (paramKind === ParamKind.Input) {
- // web3 allows to pass those an non-bignumbers and that's nice
- // but it always returns stuff as BigNumbers
+ // web3 and ethers allow to pass those as numbers instead of bignumbers
solTypeRegexToTsType.unshift({
regex: '^u?int(8|16|32)?$',
tsType: 'number|BigNumber',
});
}
+ if (backend === ContractsBackend.Ethers) {
+ if (paramKind === ParamKind.Output) {
+ // ethers-contracts automatically converts small BigNumbers to numbers
+ solTypeRegexToTsType.unshift({
+ regex: '^u?int(8|16|32|48)?$',
+ tsType: 'number',
+ });
+ }
+ }
for (const regexAndTxType of solTypeRegexToTsType) {
const { regex, tsType } = regexAndTxType;
if (solType.match(regex)) {