aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/order-utils/test/abi_encoder_test.ts87
1 files changed, 58 insertions, 29 deletions
diff --git a/packages/order-utils/test/abi_encoder_test.ts b/packages/order-utils/test/abi_encoder_test.ts
index 926f7bc81..bed75b935 100644
--- a/packages/order-utils/test/abi_encoder_test.ts
+++ b/packages/order-utils/test/abi_encoder_test.ts
@@ -528,7 +528,7 @@ namespace AbiEncoder {
}
}
- export class Bytes extends StaticDataType {
+ export class Bytes extends DynamicDataType {
static UNDEFINED_LENGTH = new BigNumber(-1);
length: BigNumber = SolArray.UNDEFINED_LENGTH;
@@ -565,7 +565,7 @@ namespace AbiEncoder {
}
}
- export class SolString extends StaticDataType {
+ export class SolString extends DynamicDataType {
constructor(dataItem: DataItem) {
super(dataItem);
expect(SolString.matchGrammar(dataItem.type)).to.be.true();
@@ -591,42 +591,63 @@ namespace AbiEncoder {
}
}
- export class Tuple extends DynamicDataType {
+ export class SolArray extends DynamicDataType {
+ static matcher = RegExp('^(.+)\\[([0-9]d*)\\]$');
+ static UNDEFINED_LENGTH = new BigNumber(-1);
+ length: BigNumber = SolArray.UNDEFINED_LENGTH;
+ type: string = '[undefined]';
+
constructor(dataItem: DataItem) {
super(dataItem);
- expect(Tuple.matchGrammar(dataItem.type)).to.be.true();
+ const matches = SolArray.matcher.exec(dataItem.type);
+ expect(matches).to.be.not.null();
+ if (matches === null || matches.length !== 3) {
+ throw new Error(`Could not parse array: ${dataItem.type}`);
+ } else if (matches[1] === undefined) {
+ throw new Error(`Could not parse array type: ${dataItem.type}`);
+ } else if (matches[2] === undefined) {
+ // Parse out array type and length
+ this.type = matches[1];
+ this.length = new BigNumber(SolArray.UNDEFINED_LENGTH);
+ return;
+ }
+
+ // Parse out array type and length
+ this.type = matches[1];
+ this.length = new BigNumber(matches[2], 10);
+ if (this.length.lessThan(0)) {
+ throw new Error(`Bad array length: ${JSON.stringify(this.length)}`);
+ }
+
+ // Construct children
+ for (let idx = new BigNumber(0); idx.lessThan(this.length); idx = idx.plus(1)) {
+ const childDataItem = {
+ type: this.type,
+ name: `${this.getDataItem().name}[${idx.toString(10)}]`,
+ } as DataItem;
+ const child = DataTypeFactory.create(childDataItem);
+ this.children.push(child);
+ }
}
- public assignValue(value: string) {
+ public assignValue(value: any[]) {
//const hexValue = ethUtil.bufferToHex(new Buffer(value));
//this.assignHexValue(hexValue);
}
- public getSignature(): string {
- throw 1;
- }
-
- public encodeToCalldata(calldata: Calldata): void {
- throw 2;
+ public static matchGrammar(type: string): boolean {
+ return this.matcher.test(type);
}
- public static matchGrammar(type: string): boolean {
- return type === 'tuple';
+ public getSignature(): string {
+ return `${this.type}[${this.length}]`;
}
}
- export class SolArray extends DynamicDataType {
- static matcher = RegExp('^.+\\[([0-9]d*)\\]$');
- static UNDEFINED_LENGTH = new BigNumber(-1);
- length: BigNumber = SolArray.UNDEFINED_LENGTH;
-
+ export class Tuple extends DynamicDataType {
constructor(dataItem: DataItem) {
super(dataItem);
- const matches = SolArray.matcher.exec(dataItem.type);
- expect(matches).to.be.not.null();
- if (matches !== null && matches.length === 1) {
- this.length = new BigNumber(matches[1], 10);
- }
+ expect(Tuple.matchGrammar(dataItem.type)).to.be.true();
}
public assignValue(value: string) {
@@ -634,16 +655,16 @@ namespace AbiEncoder {
//this.assignHexValue(hexValue);
}
+ public getSignature(): string {
+ throw 1;
+ }
+
public encodeToCalldata(calldata: Calldata): void {
throw 2;
}
public static matchGrammar(type: string): boolean {
- return this.matcher.test(type);
- }
-
- public getSignature(): string {
- throw 1;
+ return type === 'tuple';
}
}
@@ -816,7 +837,15 @@ namespace AbiEncoder {
}
describe.only('ABI Encoder', () => {
- describe.only('Just a Greg, Eh', () => {
+ describe.only('Array', () => {
+ it('sample', async () => {
+ const testDataItem = { name: 'testArray', type: 'string[2]' };
+ const dataType = new AbiEncoder.SolArray(testDataItem);
+ console.log(JSON.stringify(dataType, null, 4));
+ });
+ });
+
+ describe('Just a Greg, Eh', () => {
it('Yessir', async () => {
const method = new AbiEncoder.Method(simpleAbi);
const calldata = method.encode([new BigNumber(5), 'five']);