aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/order-utils/test/abi/abi_encoder.ts1
-rw-r--r--packages/order-utils/test/abi/config.ts4
-rw-r--r--packages/order-utils/test/abi/data_type.ts72
-rw-r--r--packages/order-utils/test/abi/evm_data_types.ts36
-rw-r--r--packages/order-utils/test/abi_encoder_test.ts4
5 files changed, 44 insertions, 73 deletions
diff --git a/packages/order-utils/test/abi/abi_encoder.ts b/packages/order-utils/test/abi/abi_encoder.ts
index ddcfb1fd1..4f4906550 100644
--- a/packages/order-utils/test/abi/abi_encoder.ts
+++ b/packages/order-utils/test/abi/abi_encoder.ts
@@ -1,4 +1,3 @@
-export * from './config';
export * from './calldata';
export * from './data_type';
export * from './evm_data_types'; \ No newline at end of file
diff --git a/packages/order-utils/test/abi/config.ts b/packages/order-utils/test/abi/config.ts
deleted file mode 100644
index 015cee59a..000000000
--- a/packages/order-utils/test/abi/config.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { DataTypeFactory } from './data_type';
-import { EvmDataTypeFactoryImpl } from './evm_data_types';
-
-DataTypeFactory.setImpl(new EvmDataTypeFactoryImpl()); \ No newline at end of file
diff --git a/packages/order-utils/test/abi/data_type.ts b/packages/order-utils/test/abi/data_type.ts
index 7884cf3cf..4c4537a69 100644
--- a/packages/order-utils/test/abi/data_type.ts
+++ b/packages/order-utils/test/abi/data_type.ts
@@ -5,20 +5,31 @@ import { BigNumber } from '@0x/utils';
import ethUtil = require('ethereumjs-util');
var _ = require('lodash');
+export interface DataTypeFactory {
+ create: (dataItem: DataItem, parentDataType: DataType) => DataType;
+ mapDataItemToDataType: (dataItem: DataItem) => DataType;
+}
+
export abstract class DataType {
private static DEFAULT_ENCODING_RULES = { optimize: false, annotate: false } as EncodingRules;
private static DEFAULT_DECODING_RULES = { structsAsObjects: false } as DecodingRules;
private dataItem: DataItem;
+ private factory: DataTypeFactory;
- constructor(dataItem: DataItem) {
+ constructor(dataItem: DataItem, factory: DataTypeFactory) {
this.dataItem = dataItem;
+ this.factory = factory;
}
public getDataItem(): DataItem {
return this.dataItem;
}
+ public getFactory(): DataTypeFactory {
+ return this.factory;
+ }
+
public encode(value: any, rules?: EncodingRules, selector?: string): string {
const rules_ = rules ? rules : DataType.DEFAULT_ENCODING_RULES;
const calldata = new Calldata(rules_);
@@ -45,8 +56,8 @@ export abstract class DataType {
export abstract class PayloadDataType extends DataType {
protected hasConstantSize: boolean;
- public constructor(dataItem: DataItem, hasConstantSize: boolean) {
- super(dataItem);
+ public constructor(dataItem: DataItem, factory: DataTypeFactory, hasConstantSize: boolean) {
+ super(dataItem, factory);
this.hasConstantSize = hasConstantSize;
}
@@ -78,8 +89,8 @@ export abstract class DependentDataType extends DataType {
protected dependency: DataType;
protected parent: DataType;
- public constructor(dataItem: DataItem, dependency: DataType, parent: DataType) {
- super(dataItem);
+ public constructor(dataItem: DataItem, factory: DataTypeFactory, dependency: DataType, parent: DataType) {
+ super(dataItem, factory);
this.dependency = dependency;
this.parent = parent;
}
@@ -125,8 +136,8 @@ export abstract class MemberDataType extends DataType {
protected arrayElementType: string | undefined;
- public constructor(dataItem: DataItem, isArray: boolean = false, arrayLength?: number, arrayElementType?: string) {
- super(dataItem);
+ public constructor(dataItem: DataItem, factory: DataTypeFactory, isArray: boolean = false, arrayLength?: number, arrayElementType?: string) {
+ super(dataItem, factory);
this.memberMap = {};
this.members = [];
this.isArray = isArray;
@@ -156,7 +167,7 @@ export abstract class MemberDataType extends DataType {
if (components !== undefined) {
childDataItem.components = components;
}
- const child = DataTypeFactory.create(childDataItem, this);
+ const child = this.getFactory().create(childDataItem, this);
memberMap[memberItem.name] = members.length;
members.push(child);
});
@@ -177,7 +188,7 @@ export abstract class MemberDataType extends DataType {
if (components !== undefined) {
childDataItem.components = components;
}
- const child = DataTypeFactory.create(childDataItem, this);
+ const child = this.getFactory().create(childDataItem, this);
memberMap[idx.toString(10)] = members.length;
members.push(child);
});
@@ -309,46 +320,3 @@ export abstract class MemberDataType extends DataType {
return isStatic;
}
}
-
-export interface DataTypeFactoryImpl {
- create: (dataItem: DataItem, parentDataType: DataType) => DataType;
- mapDataItemToDataType: (dataItem: DataItem) => DataType;
-}
-
-export class DataTypeFactory {
- private static instance: DataTypeFactory;
- private provider: DataTypeFactoryImpl | undefined;
-
- private constructor() { }
-
- private static getInstance(): DataTypeFactory {
- if (!DataTypeFactory.instance) {
- DataTypeFactory.instance = new DataTypeFactory();
- }
- return DataTypeFactory.instance;
- }
-
- public static setImpl(provider: DataTypeFactoryImpl) {
- const instance = DataTypeFactory.getInstance();
- if (instance.provider !== undefined) {
- throw new Error(`Tried to set implementation more than once`);
- }
- DataTypeFactory.getInstance().provider = provider;
- }
-
- public static create(dataItem: DataItem, parentDataType: DataType): DataType {
- const instance = DataTypeFactory.getInstance();
- if (instance.provider === undefined) {
- throw new Error(`Tried to create before implementation is set`);
- }
- return instance.provider.create(dataItem, parentDataType);
- }
-
- public static mapDataItemToDataType(dataItem: DataItem): DataType {
- const instance = DataTypeFactory.getInstance();
- if (instance.provider === undefined) {
- throw new Error(`Tried to create before implementation is set`);
- }
- return instance.provider.mapDataItemToDataType(dataItem);
- }
-} \ No newline at end of file
diff --git a/packages/order-utils/test/abi/evm_data_types.ts b/packages/order-utils/test/abi/evm_data_types.ts
index aff4bc991..bb7c1d81d 100644
--- a/packages/order-utils/test/abi/evm_data_types.ts
+++ b/packages/order-utils/test/abi/evm_data_types.ts
@@ -1,4 +1,4 @@
-import { DataType, DataTypeFactory, DataTypeFactoryImpl, PayloadDataType, DependentDataType, MemberDataType } from './data_type';
+import { DataType, DataTypeFactory, PayloadDataType, DependentDataType, MemberDataType } from './data_type';
import { DecodingRules, EncodingRules } from './calldata';
@@ -22,7 +22,7 @@ export class Address extends PayloadDataType {
private static SIZE_KNOWN_AT_COMPILE_TIME: boolean = true;
constructor(dataItem: DataItem) {
- super(dataItem, Address.SIZE_KNOWN_AT_COMPILE_TIME);
+ super(dataItem, EvmDataTypeFactory.getInstance(), Address.SIZE_KNOWN_AT_COMPILE_TIME);
if (!Address.matchGrammar(dataItem.type)) {
throw new Error(`Tried to instantiate Address with bad input: ${dataItem}`);
}
@@ -54,7 +54,7 @@ export class Bool extends PayloadDataType {
private static SIZE_KNOWN_AT_COMPILE_TIME: boolean = true;
constructor(dataItem: DataItem) {
- super(dataItem, Bool.SIZE_KNOWN_AT_COMPILE_TIME);
+ super(dataItem, EvmDataTypeFactory.getInstance(), Bool.SIZE_KNOWN_AT_COMPILE_TIME);
if (!Bool.matchGrammar(dataItem.type)) {
throw new Error(`Tried to instantiate Bool with bad input: ${dataItem}`);
}
@@ -94,7 +94,7 @@ abstract class Number extends PayloadDataType {
width: number = Number.DEFAULT_WIDTH;
constructor(dataItem: DataItem, matcher: RegExp) {
- super(dataItem, Number.SIZE_KNOWN_AT_COMPILE_TIME);
+ super(dataItem, EvmDataTypeFactory.getInstance(), Number.SIZE_KNOWN_AT_COMPILE_TIME);
const matches = matcher.exec(dataItem.type);
if (matches === null) {
throw new Error(`Tried to instantiate Number with bad input: ${dataItem}`);
@@ -243,7 +243,7 @@ export class Byte extends PayloadDataType {
width: number = Byte.DEFAULT_WIDTH;
constructor(dataItem: DataItem) {
- super(dataItem, Byte.SIZE_KNOWN_AT_COMPILE_TIME);
+ super(dataItem, EvmDataTypeFactory.getInstance(), Byte.SIZE_KNOWN_AT_COMPILE_TIME);
const matches = Byte.matcher.exec(dataItem.type);
if (!Byte.matchGrammar(dataItem.type)) {
throw new Error(`Tried to instantiate Byte with bad input: ${dataItem}`);
@@ -297,7 +297,7 @@ export class Bytes extends PayloadDataType {
length: BigNumber = Bytes.UNDEFINED_LENGTH;
constructor(dataItem: DataItem) {
- super(dataItem, Bytes.SIZE_KNOWN_AT_COMPILE_TIME);
+ super(dataItem, EvmDataTypeFactory.getInstance(), Bytes.SIZE_KNOWN_AT_COMPILE_TIME);
if (!Bytes.matchGrammar(dataItem.type)) {
throw new Error(`Tried to instantiate Bytes with bad input: ${dataItem}`);
}
@@ -343,7 +343,7 @@ export class Bytes extends PayloadDataType {
export class SolString extends PayloadDataType {
private static SIZE_KNOWN_AT_COMPILE_TIME: boolean = false;
constructor(dataItem: DataItem) {
- super(dataItem, SolString.SIZE_KNOWN_AT_COMPILE_TIME);
+ super(dataItem, EvmDataTypeFactory.getInstance(), SolString.SIZE_KNOWN_AT_COMPILE_TIME);
if (!SolString.matchGrammar(dataItem.type)) {
throw new Error(`Tried to instantiate String with bad input: ${dataItem}`);
}
@@ -383,7 +383,7 @@ export class Pointer extends DependentDataType {
constructor(destDataType: DataType, parentDataType: DataType) {
const destDataItem = destDataType.getDataItem();
const dataItem = { name: `ptr<${destDataItem.name}>`, type: `ptr<${destDataItem.type}>` } as DataItem;
- super(dataItem, destDataType, parentDataType);
+ super(dataItem, EvmDataTypeFactory.getInstance(), destDataType, parentDataType);
}
public getSignature(): string {
@@ -395,7 +395,7 @@ export class Tuple extends MemberDataType {
private tupleSignature: string;
constructor(dataItem: DataItem) {
- super(dataItem);
+ super(dataItem, EvmDataTypeFactory.getInstance());
if (!Tuple.matchGrammar(dataItem.type)) {
throw new Error(`Tried to instantiate Tuple with bad input: ${dataItem}`);
}
@@ -430,7 +430,7 @@ export class SolArray extends MemberDataType {
const isArray = true;
const arrayElementType = matches[1];
const arrayLength = (matches[2] === '') ? undefined : parseInt(matches[2], 10);
- super(dataItem, isArray, arrayLength, arrayElementType);
+ super(dataItem, EvmDataTypeFactory.getInstance(), isArray, arrayLength, arrayElementType);
this.elementType = arrayElementType;
this.arraySignature = this.computeSignature();
}
@@ -444,7 +444,7 @@ export class SolArray extends MemberDataType {
if (components !== undefined) {
dataItem.components = components;
}
- const elementDataType = DataTypeFactory.mapDataItemToDataType(dataItem);
+ const elementDataType = this.getFactory().mapDataItemToDataType(dataItem);
const type = elementDataType.getSignature();
if (this.arrayLength === undefined) {
return `${type}[]`;
@@ -470,7 +470,7 @@ export class Method extends MemberDataType {
public selector: string;
constructor(abi: MethodAbi) {
- super({ type: 'method', name: abi.name, components: abi.inputs });
+ super({ type: 'method', name: abi.name, components: abi.inputs }, EvmDataTypeFactory.getInstance());
this.methodSignature = this.computeSignature();
this.selector = this.methodSelector = this.computeSelector();
@@ -510,7 +510,17 @@ export class Method extends MemberDataType {
}
}
-export class EvmDataTypeFactoryImpl implements DataTypeFactoryImpl {
+export class EvmDataTypeFactory implements DataTypeFactory {
+ private static instance: DataTypeFactory;
+
+ private constructor() { }
+
+ public static getInstance(): DataTypeFactory {
+ if (!EvmDataTypeFactory.instance) {
+ EvmDataTypeFactory.instance = new EvmDataTypeFactory();
+ }
+ return EvmDataTypeFactory.instance;
+ }
public mapDataItemToDataType(dataItem: DataItem): DataType {
if (SolArray.matchGrammar(dataItem.type)) return new SolArray(dataItem);
diff --git a/packages/order-utils/test/abi_encoder_test.ts b/packages/order-utils/test/abi_encoder_test.ts
index 8ae23a222..295311acc 100644
--- a/packages/order-utils/test/abi_encoder_test.ts
+++ b/packages/order-utils/test/abi_encoder_test.ts
@@ -19,8 +19,6 @@ import * as AbiEncoder from './abi/abi_encoder';
import * as AbiSamples from './abi_samples';
import { Calldata } from './abi/calldata';
-AbiEncoder.DataTypeFactory.setImpl(new AbiEncoder.EvmDataTypeFactoryImpl());
-
chaiSetup.configure();
const expect = chai.expect;
@@ -56,7 +54,7 @@ describe.only('ABI Encoder', () => {
console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true }), '\n', '*'.repeat(100));
});
- it.only('Should point array elements to a duplicated value from another parameter', async () => {
+ it('Should point array elements to a duplicated value from another parameter', async () => {
const method = new AbiEncoder.Method(AbiSamples.optimizerAbi2);
const stringArray = [
"Test String",