From 1600820deab0636d37a9a50025576a75ae8feeec Mon Sep 17 00:00:00 2001 From: Greg Hysen Date: Thu, 8 Nov 2018 06:37:25 -0800 Subject: static array abi tests --- packages/order-utils/test/abi_encoder_test.ts | 131 ++++++++++++++++++-------- 1 file changed, 90 insertions(+), 41 deletions(-) diff --git a/packages/order-utils/test/abi_encoder_test.ts b/packages/order-utils/test/abi_encoder_test.ts index 95b6630ee..b27dc4793 100644 --- a/packages/order-utils/test/abi_encoder_test.ts +++ b/packages/order-utils/test/abi_encoder_test.ts @@ -72,6 +72,21 @@ const tupleAbi = { type: 'function', } as MethodAbi; +const staticArrayAbi = { + constant: false, + inputs: [ + { + name: 'someStaticArray', + type: 'uint8[3]', + } + ], + name: 'simpleFunction', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', +} as MethodAbi; + const crazyAbi = { constant: false, inputs: [ @@ -86,7 +101,7 @@ const crazyAbi = { { name: 'someInt32', type: 'int32', - },*/ + }, { name: 'someByte', type: 'byte', @@ -102,7 +117,7 @@ const crazyAbi = { { name: 'someString', type: 'string', - }, + },*/ /*{ name: 'someAddress', type: 'address', @@ -112,12 +127,10 @@ const crazyAbi = { type: 'bool', },*/ - /* - { name: 'someStaticArray', type: 'uint8[3]', - }, + } /* { name: 'someStaticArrayWithDynamicMembers', type: 'string[2]', @@ -195,7 +208,7 @@ const crazyAbi = { type: 'address', }, ], - },*/ + },*/, ], name: 'simpleFunction', outputs: [], @@ -520,6 +533,7 @@ namespace AbiEncoder { public abstract assignValue(value: any): void; public abstract getSignature(): string; + public abstract isStatic(): boolean; } export abstract class StaticDataType extends DataType { @@ -550,6 +564,10 @@ namespace AbiEncoder { return `address`; } + public isStatic(): boolean { + return true; + } + public static matchGrammar(type: string): boolean { return type === 'address'; } @@ -572,6 +590,10 @@ namespace AbiEncoder { return 'bool'; } + public isStatic(): boolean { + return true; + } + public static matchGrammar(type: string): boolean { return type === 'bool'; } @@ -634,6 +656,10 @@ namespace AbiEncoder { this.assignHexValue(encodedValue); } + public isStatic(): boolean { + return true; + } + public abstract getMaxValue(): BigNumber; public abstract getMinValue(): BigNumber; } @@ -715,7 +741,7 @@ namespace AbiEncoder { if (valueBuf.byteLength > this.width) { throw new Error( `Tried to assign ${value} (${ - valueBuf.byteLength + valueBuf.byteLength } bytes), which exceeds max bytes that can be stored in a ${this.getSignature()}`, ); } else if (value.length % 2 !== 0) { @@ -734,6 +760,10 @@ namespace AbiEncoder { return `bytes${this.width}`; } + public isStatic(): boolean { + return true; + } + public static matchGrammar(type: string): boolean { return this.matcher.test(type); } @@ -771,6 +801,10 @@ namespace AbiEncoder { return 'bytes'; } + public isStatic(): boolean { + return false; + } + public static matchGrammar(type: string): boolean { return type === 'bytes'; } @@ -797,6 +831,10 @@ namespace AbiEncoder { return 'string'; } + public isStatic(): boolean { + return false; + } + public static matchGrammar(type: string): boolean { return type === 'string'; } @@ -807,6 +845,7 @@ namespace AbiEncoder { static UNDEFINED_LENGTH = new BigNumber(-1); length: BigNumber = SolArray.UNDEFINED_LENGTH; type: string = '[undefined]'; + isLengthDefined: boolean; constructor(dataItem: DataItem) { super(dataItem); @@ -825,10 +864,12 @@ namespace AbiEncoder { if (matches[2] === '') { this.type = matches[1]; this.length = SolArray.UNDEFINED_LENGTH; + this.isLengthDefined = false; return; } // Parse out array type/length and construct children + this.isLengthDefined = true; this.type = matches[1]; this.length = new BigNumber(matches[2], 10); if (this.length.lessThan(0)) { @@ -873,6 +914,10 @@ namespace AbiEncoder { } public getHexValue(): string { + if (this.isLengthDefined) { + return '0x'; + } + const lengthBufUnpadded = ethUtil.toBuffer(`0x${this.length.toString(16)}`); const lengthBuf = ethUtil.setLengthLeft(lengthBufUnpadded, 32); let valueBuf = lengthBuf; @@ -888,6 +933,10 @@ namespace AbiEncoder { return valueHex; } + public isStatic(): boolean { + return this.isLengthDefined; + } + public static matchGrammar(type: string): boolean { return this.matcher.test(type); } @@ -1003,6 +1052,10 @@ namespace AbiEncoder { return signature; } + public isStatic(): boolean { + return false; // @TODO: True in every case or only when dynamic data? + } + public static matchGrammar(type: string): boolean { return type === 'tuple'; } @@ -1057,6 +1110,10 @@ namespace AbiEncoder { return this.destDataType.getSignature(); } + public isStatic(): boolean { + return true; + } + public encodeToCalldata(calldata: Calldata): void { throw 2; } @@ -1084,9 +1141,9 @@ namespace AbiEncoder { public static create(dataItem: DataItem, parentDataType: DataType): DataType { const dataType = DataTypeFactory.mapDataItemToDataType(dataItem); - if (dataType instanceof StaticDataType) { + if (dataType.isStatic()) { return dataType; - } else if (dataType instanceof DynamicDataType) { + } else { const pointer = new Pointer(dataType, parentDataType); return pointer; } @@ -1178,6 +1235,10 @@ namespace AbiEncoder { return this.getHexValue(); } + public isStatic(): boolean { + return true; + } + /* encodeOptimized(args: any[]): string { const calldata = new Memory(); @@ -1214,36 +1275,13 @@ namespace AbiEncoder { describe.only('ABI Encoder', () => { describe.only('Just a Greg, Eh', () => { - it.skip('Crazy ABI', async () => { - const method = new AbiEncoder.Method(crazyAbi); + it.only('Crazy ABI', async () => { + const method = new AbiEncoder.Method(staticArrayAbi); console.log(method.getSignature()); - /* - (uint256 b,int256 c,int32 d, - bytes1 e,bytes32 f, - bytes g,string h,address i,bool j,uint8[3] k,string[2] l,bytes[] m, string[][] n, O o,P p, P[]) + const args = [[new BigNumber(127), new BigNumber(14), new BigNumber(54)]]; - struct P { - uint256 a; - string b; - string[] c; - bytes d; - address e; - }*/ - - const args = [ - /*new BigNumber(437829473), // b - new BigNumber(-437829473), // c - new BigNumber(-14), // d*/ - '0xaf', // e (bytes1) - '0x0001020304050607080911121314151617181920212223242526272829303132', // f (bytes32) - '0x616161616161616161616161616161616161616161616161616161616161616161616161616161611114f324567838475647382938475677448899338457668899002020202020', // g - 'My first name is Greg and my last name is Hysen, what do ya know!', // h - ]; const a2 = [ - /*'0xe41d2489571d322189246dafa5ebde1f4699f498', // i - true, // j*/ - [new BigNumber(127), new BigNumber(14), new BigNumber(54)], // k [ 'the little piping piper piped a piping pipper papper', 'the kid knows how to write poems, what can I say -- I guess theres a lot I could say to try to fill this line with a lot of text.', @@ -1330,11 +1368,10 @@ describe.only('ABI Encoder', () => { console.log('*'.repeat(40)); console.log(JSON.stringify(args)); - /*const expectedCalldata = - '0x89771c30af00000000000000000000000000000000000000000000000000000000000000000102030405060708091112131415161718192021222324252627282930313200000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000047616161616161616161616161616161616161616161616161616161616161616161616161616161611114f3245678384756473829384756774488993384576688990020202020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d79206669727374206e616d65206973204772656720616e64206d79206c617374206e616d6520697320487973656e2c207768617420646f207961206b6e6f772100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000163874563783498732482743928742389723894723984700000000000000000000000000000000000000000000000000000000000000000000000000000000006e72834723982374239847239847298472489274987489742847289472394874987498478743294237434923473298472398423748923748923748923472389472894789474893742894728947389427498237432987423894723894732894723894372498237498237428934723980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027283473298473248923749238742398742398472894729843278942374982374892374892743982000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000b736f6d6520737472696e670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013736f6d6520616e6f7468657220737472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024746865726520617265206a75737420746f6f206d616e7920737472696e6773757020696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002079616c6c2067686f6e6e61206d616b65206d65206c6f7365206d79206d696e640000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ac511500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf5763d5ec63d500600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498000000000000000000000000000000000000000000000000000000000000004e616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a6b73646873616a6b646873616a6b646861646a6b617368646a6b73616468616a6b646873616a6b64687361646a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f7484848484848484848484848484848484848384757687980943399445858584893209100000000000000000000000000000000000000000000000000000000'; - */ + const expectedCalldata = + '0xf68ade72000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036'; - //expect(calldata).to.be.equal(expectedCalldata); + expect(calldata).to.be.equal(expectedCalldata); /*const calldata = method.encode([{ someUint: new BigNumber(5), someStr: 'five' }]); console.log(method.getSignature()); @@ -1346,8 +1383,20 @@ describe.only('ABI Encoder', () => { expect(calldata).to.be.equal(expectedCalldata);*/ }); - it.only('Simple ABI 2', async () => { - const method = new AbiEncoder.Method(crazyAbi); + it.only('Static Array ABI', async () => { + const method = new AbiEncoder.Method(staticArrayAbi); + const args = [[new BigNumber(127), new BigNumber(14), new BigNumber(54)]]; + const calldata = method.encode(args); + console.log(calldata); + console.log('*'.repeat(40)); + console.log(JSON.stringify(args)); + const expectedCalldata = + '0xf68ade72000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036'; + expect(calldata).to.be.equal(expectedCalldata); + }); + + it('Simple ABI 2', async () => { + const method = new AbiEncoder.Method(simpleAbi2); const args = [ '0xaf', // e (bytes1) -- cgit v1.2.3