aboutsummaryrefslogtreecommitdiffstats
path: root/packages/utils/test
diff options
context:
space:
mode:
authorGreg Hysen <greg.hysen@gmail.com>2018-11-20 06:35:40 +0800
committerGreg Hysen <greg.hysen@gmail.com>2018-11-29 08:38:10 +0800
commit67dd062a2f6a936cad18ff81afac398cd6a1ab97 (patch)
tree1f9a7402e662bc90c6cf493f571db137ce008b0b /packages/utils/test
parent0c0bcb44d3ef6d68c9c7c05be25641ef57a7287a (diff)
downloaddexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.tar
dexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.tar.gz
dexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.tar.bz2
dexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.tar.lz
dexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.tar.xz
dexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.tar.zst
dexon-sol-tools-67dd062a2f6a936cad18ff81afac398cd6a1ab97.zip
Cleaning up optimizer tests
Diffstat (limited to 'packages/utils/test')
-rw-r--r--packages/utils/test/abi_encoder_test.ts1085
-rw-r--r--packages/utils/test/abi_samples.ts73
2 files changed, 589 insertions, 569 deletions
diff --git a/packages/utils/test/abi_encoder_test.ts b/packages/utils/test/abi_encoder_test.ts
index 6d0d0c390..9925abcc3 100644
--- a/packages/utils/test/abi_encoder_test.ts
+++ b/packages/utils/test/abi_encoder_test.ts
@@ -12,273 +12,188 @@ const expect = chai.expect;
describe.only('ABI Encoder', () => {
describe('Optimizer', () => {
- it('Should reuse duplicated strings in string array', async () => {
- const method = new AbiEncoder.Method(AbiSamples.GAbi);
-
- const args = [
- {
- a: new BigNumber(5),
- e: '0x616161',
- b: 'aaa',
- f: '0xe41d2489571d322189246dafa5ebde1f4699f498'
- }
- ]
-
- // Verify optimized calldata is expected
- const optimizedCalldata = method.encode(args, { optimize: true });
- //const expectedOptimizedCalldata = '0x13e751a900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000b5465737420537472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5465737420537472696e67203200000000000000000000000000000000000000';
- //expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
-
- // Verify args decode properly
- const decodedArgs = method.decode(optimizedCalldata);
- const decodedArgsJson = JSON.stringify(decodedArgs);
- const argsJson = JSON.stringify(args);
- //expect(decodedArgsJson).to.be.equal(argsJson);
-
- console.log(method.getSignature());
- console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true, annotate: true }), '\n', '*'.repeat(100));
- console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true }), '\n', '*'.repeat(100));
-
- });
-
- it('Should reuse duplicated strings in string array', async () => {
+ it('Should reuse duplicate strings in string array', async () => {
+ // Description:
+ // There are two unique values in the array `strings`.
+ // There should exist only one copy of each string in the optimized calldata.
+ // In unoptimized calldata, two copies of each string will be created.
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.stringAbi);
- const strings = [
- "Test String",
- "Test String 2",
- "Test String",
- "Test String 2",
- ];
+ const strings = ['Test String', 'Test String 2', 'Test String', 'Test String 2'];
const args = [strings];
-
- // Verify optimized calldata is expected
+ // Validate calldata
const optimizedCalldata = method.encode(args, { optimize: true });
- const expectedOptimizedCalldata = '0x13e751a900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000b5465737420537472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5465737420537472696e67203200000000000000000000000000000000000000';
+ const expectedOptimizedCalldata =
+ '0x13e751a900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000b5465737420537472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5465737420537472696e67203200000000000000000000000000000000000000';
expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
-
- // Verify args decode properly
+ // Validate decoding
const decodedArgs = method.decode(optimizedCalldata);
const decodedArgsJson = JSON.stringify(decodedArgs);
const argsJson = JSON.stringify(args);
expect(decodedArgsJson).to.be.equal(argsJson);
-
- console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true, annotate: true }), '\n', '*'.repeat(100));
- console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true }), '\n', '*'.repeat(100));
});
-
- it('Should point array elements to a duplicated value from another parameter', async () => {
+ it('Should point array elements to a duplicate value from another parameter', async () => {
+ // Description:
+ // There are two unique values in the array `strings`.
+ // The value "Test String" appears three times in this array.
+ // There should exist only one copy of this string in the optimized calldata.
+ // In unoptimized calldata, "Test String" would be written three times.
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.optimizerAbi2);
- const stringArray = [
- "Test String",
- "Test String",
- "Test String",
- "Test String 2",
- ];
+ const strings = ['Test String', 'Test String', 'Test String', 'Test String 2'];
const string = 'Test String';
- const args = [stringArray, string];
-
- // Verify optimized calldata is expected
+ const args = [strings, string];
+ // Validate calldata
const optimizedCalldata = method.encode(args, { optimize: true });
- const expectedOptimizedCalldata = '0xe0e0d34900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d5465737420537472696e67203200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5465737420537472696e67000000000000000000000000000000000000000000';
+ const expectedOptimizedCalldata =
+ '0xe0e0d34900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d5465737420537472696e67203200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5465737420537472696e67000000000000000000000000000000000000000000';
expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
-
- // Verify args decode properly
+ // Validate decoding
const decodedArgs = method.decode(optimizedCalldata);
const decodedArgsJson = JSON.stringify(decodedArgs);
const argsJson = JSON.stringify(args);
expect(decodedArgsJson).to.be.equal(argsJson);
-
- console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true, annotate: true }), '\n', '*'.repeat(100));
- console.log('*'.repeat(100), '\n', method.encode(args, { optimize: true }), '\n', '*'.repeat(100));
});
-
-
- it('Optimizer #3 (tuple should point to array)', async () => {
+ it('Dynamic Array of uints should point to Dynamic Array of Tuple(Uint)s', async () => {
+ // Description:
+ // There are two dynamic arrays, one of uint's and one of tuples.
+ // Each tuple is simply a wrapper for a uint - tuple := {key: uintValue}
+ // While the elements of these arrays have different types, they
+ // have the same representation in calldata.
+ // That is, a `uint` and a `tuple{uint}` both consume exactly one word of calldata.
+ // In the optimized calldata, only the elements of one array should be included.
+ // Both arrays will then point to the same set of elements.
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.optimizerAbi3);
- const uint8Array = [
- new BigNumber(100),
- new BigNumber(150),
- new BigNumber(200),
- new BigNumber(225),
- ];
+ const uint8Array = [new BigNumber(100), new BigNumber(150), new BigNumber(200), new BigNumber(225)];
const uintTupleArray = [[uint8Array[0]], [uint8Array[1]], [uint8Array[2]], [uint8Array[3]]];
const args = [uint8Array, uintTupleArray];
-
-
- const TEST = method.encode(args, { optimize: true, annotate: true });
- console.log('*'.repeat(50), ' ENCODED DATA ', TEST);
-
+ // Validata calldata
const optimizedCalldata = method.encode(args, { optimize: true });
-
- console.log(`OPTIMIZED CALLDATA == '${optimizedCalldata}'`);
+ const expectedOptimizedCalldata =
+ '0x5b5c78fd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000e1';
+ expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
+ // Validate decoding
const decodedArgs = method.decode(optimizedCalldata);
const decodedArgsJson = JSON.stringify(decodedArgs);
const argsJson = JSON.stringify(args);
- console.log(JSON.stringify(decodedArgs));
expect(decodedArgsJson).to.be.equal(argsJson);
});
-
- it('Optimizer #4 (Expect no optimization)', async () => {
- const method = new AbiEncoder.Method(AbiSamples.optimizerAbi4);
- const uint8Array = [
- new BigNumber(100),
- new BigNumber(150),
- new BigNumber(200),
- new BigNumber(225),
- ];
- const uintTupleArray = [[uint8Array[0]], [uint8Array[1]], [uint8Array[2]], [uint8Array[3]]];
- const args = [uint8Array, uintTupleArray];
-
-
- const TEST = method.encode(args, { optimize: true, annotate: true });
- console.log('*'.repeat(50), ' ENCODED DATA ', TEST);
-
+ it('Duplicate Dynamic Arrays', async () => {
+ // Description:
+ // Two dynamic arrays with the same values.
+ // In the optimized calldata, only one set of elements should be included.
+ // Both arrays should point to this set.
+ // Generate calldata
+ const method = new AbiEncoder.Method(AbiSamples.optimizerAbi5);
+ const array1 = [new BigNumber(100), new BigNumber(150)];
+ const array2 = [array1[0], array1[1]];
+ const args = [array1, array2];
+ // Validata calldata
const optimizedCalldata = method.encode(args, { optimize: true });
-
- console.log(`OPTIMIZED CALLDATA == '${optimizedCalldata}'`);
+ const expectedOptimizedCalldata =
+ '0x7bc4226e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000096';
+ expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
+ // Validate decoding
const decodedArgs = method.decode(optimizedCalldata);
const decodedArgsJson = JSON.stringify(decodedArgs);
const argsJson = JSON.stringify(args);
- console.log(JSON.stringify(decodedArgs));
expect(decodedArgsJson).to.be.equal(argsJson);
});
- });
- describe.only('ABI Tests at Method Level', () => {
- it('Crazy ABI', async () => {
- const method = new AbiEncoder.Method(AbiSamples.crazyAbi);
- console.log(method.getSignature());
-
- const someStaticArray = [new BigNumber(127), new BigNumber(14), new BigNumber(54)];
- const someStaticArrayWithDynamicMembers = [
- '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.',
- ];
- const someDynamicArrayWithDynamicMembers = [
- '0x38745637834987324827439287423897238947239847',
- '0x7283472398237423984723984729847248927498748974284728947239487498749847874329423743492347329847239842374892374892374892347238947289478947489374289472894738942749823743298742389472389473289472389437249823749823742893472398',
- '0x283473298473248923749238742398742398472894729843278942374982374892374892743982',
- ];
- const some2DArray = [
- [
- 'some string',
- 'some another string',
- 'there are just too many stringsup in',
- 'here',
- 'yall ghonna make me lose my mind',
- ],
- [
- '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.',
- ],
- [],
- ];
- const someTuple = {
- someUint32: new BigNumber(4037824789),
- someStr: '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.'
- };
- const someTupleWithDynamicTypes = {
- someUint: new BigNumber(4024789),
- someStr: 'akdhjasjkdhasjkldshdjahdkjsahdajksdhsajkdhsajkdhadjkashdjksadhajkdhsajkdhsadjk',
- someBytes: '0x29384723894723843743289742389472398473289472348927489274894738427428947389facdea',
- someAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
- };
- const someTupleWithDynamicTypes2 = {
- someUint: new BigNumber(9024789),
- someStr: 'ksdhsajkdhsajkdhadjkashdjksadhajkdhsajkdhsadjkakdhjasjkdhasjkldshdjahdkjsahdaj',
- someBytes: '0x29384723894398473289472348927489272384374328974238947274894738427428947389facde1',
- someAddress: '0x746dafa5ebde1f4699f4981d3221892e41d24895',
- };
- const someTupleWithDynamicTypes3 = {
- someUint: new BigNumber(1024789),
- someStr: 'sdhsajkdhsajkdhadjkashdjakdhjasjkdhasjkldshdjahdkjsahdajkksadhajkdhsajkdhsadjk',
- someBytes: '0x38947238437432829384729742389472398473289472348927489274894738427428947389facdef',
- someAddress: '0x89571d322189e415ebde1f4699f498d24246dafa',
- };
- const someArrayOfTuplesWithDynamicTypes = [someTupleWithDynamicTypes2, someTupleWithDynamicTypes3];
-
- const args = {
- someStaticArray: someStaticArray,
- someStaticArrayWithDynamicMembers: someStaticArrayWithDynamicMembers,
- someDynamicArrayWithDynamicMembers: someDynamicArrayWithDynamicMembers,
- some2DArray: some2DArray,
- someTuple: someTuple,
- someTupleWithDynamicTypes: someTupleWithDynamicTypes,
- someArrayOfTuplesWithDynamicTypes: someArrayOfTuplesWithDynamicTypes
- };
-
- const calldata = method.encode(args);
- console.log(calldata);
-
- console.log('*'.repeat(40));
- console.log(JSON.stringify(args));
- console.log(method.getSignature());
-
- const expectedCalldata = '0x4b49031c000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000163874563783498732482743928742389723894723984700000000000000000000000000000000000000000000000000000000000000000000000000000000006e72834723982374239847239847298472489274987489742847289472394874987498478743294237434923473298472398423748923748923748923472389472894789474893742894728947389427498237432987423894723894732894723894372498237498237428934723980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027283473298473248923749238742398742398472894729843278942374982374892374892743982000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000b736f6d6520737472696e670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013736f6d6520616e6f7468657220737472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024746865726520617265206a75737420746f6f206d616e7920737472696e6773757020696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002079616c6c2067686f6e6e61206d616b65206d65206c6f7365206d79206d696e640000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ac511500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d69d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498000000000000000000000000000000000000000000000000000000000000004e616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a6b73646873616a6b646873616a6b646861646a6b617368646a6b73616468616a6b646873616a6b64687361646a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829384723894723843743289742389472398473289472348927489274894738427428947389facdea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000089b51500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000746dafa5ebde1f4699f4981d3221892e41d24895000000000000000000000000000000000000000000000000000000000000004e6b73646873616a6b646873616a6b646861646a6b617368646a6b73616468616a6b646873616a6b64687361646a6b616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829384723894398473289472348927489272384374328974238947274894738427428947389facde100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa3150000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000089571d322189e415ebde1f4699f498d24246dafa000000000000000000000000000000000000000000000000000000000000004e73646873616a6b646873616a6b646861646a6b617368646a616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a6b6b73616468616a6b646873616a6b64687361646a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002838947238437432829384729742389472398473289472348927489274894738427428947389facdef000000000000000000000000000000000000000000000000';
- //const expectedCalldata = '0x30e1f844000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000960000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000163874563783498732482743928742389723894723984700000000000000000000000000000000000000000000000000000000000000000000000000000000006e72834723982374239847239847298472489274987489742847289472394874987498478743294237434923473298472398423748923748923748923472389472894789474893742894728947389427498237432987423894723894732894723894372498237498237428934723980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027283473298473248923749238742398742398472894729843278942374982374892374892743982000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000b736f6d6520737472696e670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013736f6d6520616e6f7468657220737472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024746865726520617265206a75737420746f6f206d616e7920737472696e6773757020696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002079616c6c2067686f6e6e61206d616b65206d65206c6f7365206d79206d696e640000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ac511500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf5763d5ec63d500600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498000000000000000000000000000000000000000000000000000000000000004e616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a6b73646873616a6b646873616a6b646861646a6b617368646a6b73616468616a6b646873616a6b64687361646a6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f7484848484848484848484848484848484848384757687980943399445858584893209100000000000000000000000000000000000000000000000000000000';
- expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
- const expectedDecodedValueJson = JSON.stringify(args);
- const decodedValue = method.decode(calldata, { structsAsObjects: true });
- const decodedValueJson = JSON.stringify(decodedValue);
- console.log(`DECODED`, '*'.repeat(200), '\n', decodedValueJson);
- expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
+ /*
+ it.only('Duplicate Static Arrays', async () => {
+ // Description:
+ // Two dynamic arrays with the same values.
+ // In the optimized calldata, only one set of elements should be included.
+ // Both arrays should point to this set.
+ // Generate calldata
+ const method = new AbiEncoder.Method(AbiSamples.optimizerAbi5);
+ const array1 = [new BigNumber(100), new BigNumber(150)];
+ const array2 = [array1[0], array1[1]];
+ const args = [array1, array2];
+ // Validata calldata
+ const optimizedCalldata = method.encode(args, { optimize: true });
+ const expectedOptimizedCalldata =
+ '0x7bc4226e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000096';
+ expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
+ // Validate decoding
+ const decodedArgs = method.decode(optimizedCalldata);
+ const decodedArgsJson = JSON.stringify(decodedArgs);
+ const argsJson = JSON.stringify(args);
+ expect(decodedArgsJson).to.be.equal(argsJson);
});
- it('Crazy ABI #1', async () => {
- const method = new AbiEncoder.Method(AbiSamples.crazyAbi1);
-
- const args = [
- new BigNumber(256745454),
- new BigNumber(-256745454),
- new BigNumber(434244),
- '0x43',
- '0x0001020304050607080911121314151617181920212223242526272829303132',
- '0x0001020304050607080911121314151617181920212223242526272829303132080911121314151617181920212223242526272829303132',
- 'Little peter piper piped a piping pepper pot',
- '0xe41d2489571d322189246dafa5ebde1f4699f498',
- true
- ];
-
- const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x312d4d42000000000000000000000000000000000000000000000000000000000f4d9feefffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b26012000000000000000000000000000000000000000000000000000000000006a0444300000000000000000000000000000000000000000000000000000000000000000102030405060708091112131415161718192021222324252627282930313200000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4980000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003800010203040506070809111213141516171819202122232425262728293031320809111213141516171819202122232425262728293031320000000000000000000000000000000000000000000000000000000000000000000000000000002c4c6974746c65207065746572207069706572207069706564206120706970696e672070657070657220706f740000000000000000000000000000000000000000';
- expect(calldata).to.be.equal(expectedCalldata);
+ it.only('Duplicate Tuples', async () => {
+ // Description:
+ // Two dynamic arrays with the same values.
+ // In the optimized calldata, only one set of elements should be included.
+ // Both arrays should point to this set.
+ // Generate calldata
+ const method = new AbiEncoder.Method(AbiSamples.optimizerAbi5);
+ const array1 = [new BigNumber(100), new BigNumber(150)];
+ const array2 = [array1[0], array1[1]];
+ const args = [array1, array2];
+ // Validata calldata
+ const optimizedCalldata = method.encode(args, { optimize: true });
+ const expectedOptimizedCalldata =
+ '0x7bc4226e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000096';
+ expect(optimizedCalldata).to.be.equal(expectedOptimizedCalldata);
+ // Validate decoding
+ const decodedArgs = method.decode(optimizedCalldata);
+ const decodedArgsJson = JSON.stringify(decodedArgs);
+ const argsJson = JSON.stringify(args);
+ expect(decodedArgsJson).to.be.equal(argsJson);
+ });*/
- // Test decoding
- const expectedDecodedValueJson = JSON.stringify(args);
- const decodedValue = method.decode(calldata);
- const decodedValueJson = JSON.stringify(decodedValue);
- expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
+ it('Static Array of static types should not be optimized', async () => {
+ // Generate calldata
+ const method = new AbiEncoder.Method(AbiSamples.optimizerAbi4);
+ const uint8Array = [new BigNumber(100), new BigNumber(150), new BigNumber(200), new BigNumber(225)];
+ const uintTupleArray = [[uint8Array[0]], [uint8Array[1]], [uint8Array[2]], [uint8Array[3]]];
+ const args = [uint8Array, uintTupleArray];
+ // Validate calldata
+ const optimizedCalldata = method.encode(args, { optimize: true });
+ const unoptimizedCalldata = method.encode(args);
+ expect(optimizedCalldata).to.be.equal(unoptimizedCalldata);
+ // Validate decoding
+ const decodedArgs = method.decode(optimizedCalldata);
+ const decodedArgsJson = JSON.stringify(decodedArgs);
+ const argsJson = JSON.stringify(args);
+ expect(decodedArgsJson).to.be.equal(argsJson);
});
+ // Todo: Unfixed array points to fixed array
+ // Todo: Unfixed to unfixed array
+ // Todo: Duplicate tuples
+ });
+ describe('Method ABIs', () => {
it('Types with default widths', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.typesWithDefaultWidthsAbi);
- console.log(method);
- const args = [new BigNumber(1), new BigNumber(-1), '0x56', [new BigNumber(1)], [new BigNumber(-1)], ['0x56']];
+ const args = [
+ new BigNumber(1),
+ new BigNumber(-1),
+ '0x56',
+ [new BigNumber(1)],
+ [new BigNumber(-1)],
+ ['0x56'],
+ ];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x09f2b0c30000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000015600000000000000000000000000000000000000000000000000000000000000';
+ // Validate calldata
+ const expectedCalldata =
+ '0x09f2b0c30000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000015600000000000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Array of Static Tuples (Array has defined length)', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.arrayOfStaticTuplesWithDefinedLengthAbi);
-
let value = 0;
const arrayOfTuples = [];
for (let i = 0; i < 8; ++i) {
@@ -286,23 +201,19 @@ describe.only('ABI Encoder', () => {
}
const args = [arrayOfTuples];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x9eb20969000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010';
+ // Validate calldata
+ const expectedCalldata =
+ '0x9eb20969000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Array of Static Tuples (Array has dynamic length)', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.arrayOfStaticTuplesWithDynamicLengthAbi);
-
let value = 0;
const arrayOfTuples = [];
for (let i = 0; i < 8; ++i) {
@@ -310,316 +221,352 @@ describe.only('ABI Encoder', () => {
}
const args = [arrayOfTuples];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x63275d6e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010';
+ // Validate calldata
+ const expectedCalldata =
+ '0x63275d6e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Array of Dynamic Tuples (Array has defined length)', async () => {
+ // Generate Calldata
const method = new AbiEncoder.Method(AbiSamples.arrayOfDynamicTuplesWithDefinedLengthAbi);
-
let value = 0;
const arrayOfTuples = [];
for (let i = 0; i < 8; ++i) {
- arrayOfTuples.push([new BigNumber(++value), (new BigNumber(++value)).toString()]);
+ arrayOfTuples.push([new BigNumber(++value), new BigNumber(++value).toString()]);
}
const args = [arrayOfTuples];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0xdeedb00f00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023136000000000000000000000000000000000000000000000000000000000000';
+ // Validate calldata
+ const expectedCalldata =
+ '0xdeedb00f00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023136000000000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Array of Dynamic Tuples (Array has dynamic length)', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.arrayOfDynamicTuplesWithUndefinedLengthAbi);
-
let value = 0;
const arrayOfTuples = [];
for (let i = 0; i < 8; ++i) {
- arrayOfTuples.push([new BigNumber(++value), (new BigNumber(++value)).toString()]);
+ arrayOfTuples.push([new BigNumber(++value), new BigNumber(++value).toString()]);
}
const args = [arrayOfTuples];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x60c847fb000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023136000000000000000000000000000000000000000000000000000000000000';
+ // Validate calldata
+ const expectedCalldata =
+ '0x60c847fb000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000023136000000000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Multidimensional Arrays / Static Members', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.multiDimensionalArraysStaticTypeAbi);
-
// Eight 3-dimensional arrays of uint8[2][2][2]
let value = 0;
const args = [];
for (let i = 0; i < 8; ++i) {
- args.push(
+ args.push([
[
- [
- [new BigNumber(++value), new BigNumber(++value)],
- [new BigNumber(++value), new BigNumber(++value)],
- ],
- [
- [new BigNumber(++value), new BigNumber(++value)],
- [new BigNumber(++value), new BigNumber(++value)],
- ]
- ]
- );
+ [new BigNumber(++value), new BigNumber(++value)],
+ [new BigNumber(++value), new BigNumber(++value)],
+ ],
+ [
+ [new BigNumber(++value), new BigNumber(++value)],
+ [new BigNumber(++value), new BigNumber(++value)],
+ ],
+ ]);
}
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0xc2f47d6f00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000038'; expect(calldata).to.be.equal(expectedCalldata);
+ // Validate calldata
+ const expectedCalldata =
+ '0xc2f47d6f00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000038';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ expect(calldata).to.be.equal(expectedCalldata);
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Multidimensional Arrays / Dynamic Members', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.multiDimensionalArraysDynamicTypeAbi);
-
// Eight 3-dimensional arrays of string[2][2][2]
let value = 0;
const args = [];
for (let i = 0; i < 4; ++i) {
- args.push(
+ args.push([
[
- [
- [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
- [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
- ],
- [
- [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
- [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
- ]
- ]
- );
+ [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
+ [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
+ ],
+ [
+ [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
+ [new BigNumber(++value).toString(), new BigNumber(++value).toString()],
+ ],
+ ]);
}
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(method.getSignature());
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x81534ebd0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000013300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000137000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000139000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002313000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000023131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000231320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002313300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000231350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002313600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000231370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002313800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000023139000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000023231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002323300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000232350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002323600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000232370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002323800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002323900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002333100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023332000000000000000000000000000000000000000000000000000000000000';
+ // Validate calldata
+ const expectedCalldata =
+ '0x81534ebd0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000013300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000137000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000139000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002313000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000023131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000231320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002313300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000231350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002313600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000231370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002313800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000023139000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000023231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002323300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000232350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002323600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000232370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002323800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002323900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002333100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023332000000000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
- it('Fixed Lenfgth Array / Dynamic Members', async () => {
+ it('Fixed Length Array / Dynamic Members', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.staticArrayDynamicMembersAbi);
- const args = [["Brave", "New", "World"]];
+ const args = [['Brave', 'New', 'World']];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(JSON.stringify(args));
+ // Validate calldata
const expectedCalldata =
'0x243a6e6e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000005427261766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e657700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005576f726c64000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
- it('Fixed Lenfgth Array / Dynamic Members', async () => {
+ it('Fixed Length Array / Dynamic Members', async () => {
+ // Generaet calldata
const method = new AbiEncoder.Method(AbiSamples.staticArrayDynamicMembersAbi);
- const args = [["Brave", "New", "World"]];
+ const args = [['Brave', 'New', 'World']];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(JSON.stringify(args));
+ // Validate calldata
const expectedCalldata =
'0x243a6e6e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000005427261766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e657700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005576f726c64000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Unfixed Length Array / Dynamic Members ABI', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.dynamicArrayDynamicMembersAbi);
- const args = [["Brave", "New", "World"]];
+ const args = [['Brave', 'New', 'World']];
const calldata = method.encode(args);
- console.log(calldata);
- console.log('*'.repeat(40));
- console.log(JSON.stringify(args));
- const expectedCalldata = '0x13e751a900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000005427261766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e657700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005576f726c64000000000000000000000000000000000000000000000000000000';
+ // Validate calldata
+ const expectedCalldata =
+ '0x13e751a900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000005427261766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e657700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005576f726c64000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Unfixed Length Array / Static Members ABI', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.dynamicArrayStaticMembersAbi);
const args = [[new BigNumber(127), new BigNumber(14), new BigNumber(54)]];
const calldata = method.encode(args);
- const expectedCalldata = '0x4fc8a83300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036';
+ // Validate calldata
+ const expectedCalldata =
+ '0x4fc8a83300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
-
it('Fixed Length Array / Static Members ABI', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.staticArrayAbi);
const args = [[new BigNumber(127), new BigNumber(14), new BigNumber(54)]];
const calldata = method.encode(args);
+ // Validate calldata
const expectedCalldata =
'0xf68ade72000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
- const expectedDecodedValueJson = JSON.stringify(args);
- const decodedValue = method.decode(calldata);
- const decodedValueJson = JSON.stringify(decodedValue);
- expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
- });
-
-
- it('Simple ABI 2', async () => {
- const method = new AbiEncoder.Method(AbiSamples.simpleAbi2);
-
- const args = [
- '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 calldata = method.encode(args);
- const expectedCalldata =
- '0x7ac2bd96af000000000000000000000000000000000000000000000000000000000000000001020304050607080911121314151617181920212223242526272829303132000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000047616161616161616161616161616161616161616161616161616161616161616161616161616161611114f3245678384756473829384756774488993384576688990020202020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d79206669727374206e616d65206973204772656720616e64206d79206c617374206e616d6520697320487973656e2c207768617420646f207961206b6e6f772100000000000000000000000000000000000000000000000000000000000000';
- expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Array ABI', async () => {
+ // Generate calldata
const method = new AbiEncoder.Method(AbiSamples.stringAbi);
- console.log(method);
const args = [['five', 'six', 'seven']];
const calldata = method.encode(args);
- console.log(method.getSignature());
- console.log(method.selector);
-
- console.log(calldata);
+ // Validate calldata
const expectedCalldata =
'0x13e751a900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373697800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005736576656e000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Static Tuple', async () => {
+ // Generate calldata
// This is dynamic because it has dynamic members
const method = new AbiEncoder.Method(AbiSamples.staticTupleAbi);
const args = [[new BigNumber(5), new BigNumber(10), new BigNumber(15), false]];
const calldata = method.encode(args);
- console.log(method.getSignature());
- console.log(method.selector);
-
- console.log(calldata);
- const expectedCalldata = '0xa9125e150000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000';
+ // Validate calldata
+ const expectedCalldata =
+ '0xa9125e150000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Dynamic Tuple (Array input)', async () => {
+ // Generate calldata
// This is dynamic because it has dynamic members
const method = new AbiEncoder.Method(AbiSamples.dynamicTupleAbi);
const args = [[new BigNumber(5), 'five']];
const calldata = method.encode(args);
- console.log(method.getSignature());
- console.log(method.selector);
-
- console.log(calldata);
+ // Validate calldata
const expectedCalldata =
'0x5b998f3500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
-
- // Test decoding
+ // Validate decoding
const expectedDecodedValueJson = JSON.stringify(args);
const decodedValue = method.decode(calldata);
const decodedValueJson = JSON.stringify(decodedValue);
expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
-
it('Dynamic Tuple (Object input)', async () => {
+ // Generate Calldata
// This is dynamic because it has dynamic members
const method = new AbiEncoder.Method(AbiSamples.dynamicTupleAbi);
- const calldata = method.encode([{ someUint: new BigNumber(5), someStr: 'five' }]);
- console.log(method.getSignature());
- console.log(method.selector);
-
- console.log(calldata);
+ const args = [[new BigNumber(5), 'five']];
+ const calldata = method.encode(args);
+ // Validate calldata
const expectedCalldata =
'0x5b998f3500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000';
expect(calldata).to.be.equal(expectedCalldata);
+ // Validate decoding
+ const expectedDecodedValueJson = JSON.stringify(args);
+ const decodedValue = method.decode(calldata);
+ const decodedValueJson = JSON.stringify(decodedValue);
+ expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
+ });
+ it('Large, Flat ABI', async () => {
+ // Construct calldata
+ const method = new AbiEncoder.Method(AbiSamples.largeFlatAbi);
+ const args = [
+ new BigNumber(256745454),
+ new BigNumber(-256745454),
+ new BigNumber(434244),
+ '0x43',
+ '0x0001020304050607080911121314151617181920212223242526272829303132',
+ '0x0001020304050607080911121314151617181920212223242526272829303132080911121314151617181920212223242526272829303132',
+ 'Little peter piper piped a piping pepper pot',
+ '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ true,
+ ];
+ // Validate calldata
+ const calldata = method.encode(args);
+ const expectedCalldata =
+ '0x312d4d42000000000000000000000000000000000000000000000000000000000f4d9feefffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b26012000000000000000000000000000000000000000000000000000000000006a0444300000000000000000000000000000000000000000000000000000000000000000102030405060708091112131415161718192021222324252627282930313200000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4980000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003800010203040506070809111213141516171819202122232425262728293031320809111213141516171819202122232425262728293031320000000000000000000000000000000000000000000000000000000000000000000000000000002c4c6974746c65207065746572207069706572207069706564206120706970696e672070657070657220706f740000000000000000000000000000000000000000';
+ expect(calldata).to.be.equal(expectedCalldata);
+ // Validate decoding
+ const expectedDecodedValueJson = JSON.stringify(args);
+ const decodedValue = method.decode(calldata);
+ const decodedValueJson = JSON.stringify(decodedValue);
+ expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
+ });
+ it('Large, Nested ABI', async () => {
+ // Construct Calldata
+ const method = new AbiEncoder.Method(AbiSamples.largeNestedAbi);
+ const someStaticArray = [new BigNumber(127), new BigNumber(14), new BigNumber(54)];
+ const someStaticArrayWithDynamicMembers = [
+ '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.',
+ ];
+ const someDynamicArrayWithDynamicMembers = [
+ '0x38745637834987324827439287423897238947239847',
+ '0x7283472398237423984723984729847248927498748974284728947239487498749847874329423743492347329847239842374892374892374892347238947289478947489374289472894738942749823743298742389472389473289472389437249823749823742893472398',
+ '0x283473298473248923749238742398742398472894729843278942374982374892374892743982',
+ ];
+ const some2DArray = [
+ [
+ 'some string',
+ 'some another string',
+ 'there are just too many stringsup in',
+ 'here',
+ 'yall ghonna make me lose my mind',
+ ],
+ [
+ '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.',
+ ],
+ [],
+ ];
+ const someTuple = {
+ someUint32: new BigNumber(4037824789),
+ someStr:
+ '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.',
+ };
+ const someTupleWithDynamicTypes = {
+ someUint: new BigNumber(4024789),
+ someStr: 'akdhjasjkdhasjkldshdjahdkjsahdajksdhsajkdhsajkdhadjkashdjksadhajkdhsajkdhsadjk',
+ someBytes: '0x29384723894723843743289742389472398473289472348927489274894738427428947389facdea',
+ someAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ };
+ const someTupleWithDynamicTypes2 = {
+ someUint: new BigNumber(9024789),
+ someStr: 'ksdhsajkdhsajkdhadjkashdjksadhajkdhsajkdhsadjkakdhjasjkdhasjkldshdjahdkjsahdaj',
+ someBytes: '0x29384723894398473289472348927489272384374328974238947274894738427428947389facde1',
+ someAddress: '0x746dafa5ebde1f4699f4981d3221892e41d24895',
+ };
+ const someTupleWithDynamicTypes3 = {
+ someUint: new BigNumber(1024789),
+ someStr: 'sdhsajkdhsajkdhadjkashdjakdhjasjkdhasjkldshdjahdkjsahdajkksadhajkdhsajkdhsadjk',
+ someBytes: '0x38947238437432829384729742389472398473289472348927489274894738427428947389facdef',
+ someAddress: '0x89571d322189e415ebde1f4699f498d24246dafa',
+ };
+ const someArrayOfTuplesWithDynamicTypes = [someTupleWithDynamicTypes2, someTupleWithDynamicTypes3];
+ const args = {
+ someStaticArray: someStaticArray,
+ someStaticArrayWithDynamicMembers: someStaticArrayWithDynamicMembers,
+ someDynamicArrayWithDynamicMembers: someDynamicArrayWithDynamicMembers,
+ some2DArray: some2DArray,
+ someTuple: someTuple,
+ someTupleWithDynamicTypes: someTupleWithDynamicTypes,
+ someArrayOfTuplesWithDynamicTypes: someArrayOfTuplesWithDynamicTypes,
+ };
+ const calldata = method.encode(args);
+ // Validate calldata
+ const expectedCalldata =
+ '0x4b49031c000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000163874563783498732482743928742389723894723984700000000000000000000000000000000000000000000000000000000000000000000000000000000006e72834723982374239847239847298472489274987489742847289472394874987498478743294237434923473298472398423748923748923748923472389472894789474893742894728947389427498237432987423894723894732894723894372498237498237428934723980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027283473298473248923749238742398742398472894729843278942374982374892374892743982000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000b736f6d6520737472696e670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013736f6d6520616e6f7468657220737472696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024746865726520617265206a75737420746f6f206d616e7920737472696e6773757020696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002079616c6c2067686f6e6e61206d616b65206d65206c6f7365206d79206d696e640000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000034746865206c6974746c6520706970696e67207069706572207069706564206120706970696e6720706970706572207061707065720000000000000000000000000000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ac511500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000081746865206b6964206b6e6f777320686f7720746f20777269746520706f656d732c20776861742063616e204920736179202d2d2049206775657373207468657265732061206c6f74204920636f756c642073617920746f2074727920746f2066696c6c2074686973206c696e6520776974682061206c6f74206f6620746578742e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d69d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498000000000000000000000000000000000000000000000000000000000000004e616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a6b73646873616a6b646873616a6b646861646a6b617368646a6b73616468616a6b646873616a6b64687361646a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829384723894723843743289742389472398473289472348927489274894738427428947389facdea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000089b51500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000746dafa5ebde1f4699f4981d3221892e41d24895000000000000000000000000000000000000000000000000000000000000004e6b73646873616a6b646873616a6b646861646a6b617368646a6b73616468616a6b646873616a6b64687361646a6b616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829384723894398473289472348927489272384374328974238947274894738427428947389facde100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa3150000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000089571d322189e415ebde1f4699f498d24246dafa000000000000000000000000000000000000000000000000000000000000004e73646873616a6b646873616a6b646861646a6b617368646a616b64686a61736a6b646861736a6b6c647368646a6168646b6a73616864616a6b6b73616468616a6b646873616a6b64687361646a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002838947238437432829384729742389472398473289472348927489274894738427428947389facdef000000000000000000000000000000000000000000000000';
+ expect(calldata).to.be.equal(expectedCalldata);
+ // Validate decoding
+ const expectedDecodedValueJson = JSON.stringify(args);
+ const decodedValue = method.decode(calldata, { structsAsObjects: true });
+ const decodedValueJson = JSON.stringify(decodedValue);
+ expect(decodedValueJson).to.be.equal(expectedDecodedValueJson);
});
+ // @TODO: Test Nested Tuples (Not Supported on )
+
it.skip('Nested Tuples', async () => {
// Couldn't get nested tuples to work with Remix
// This is dynamic because it has dynamic members
@@ -628,8 +575,8 @@ describe.only('ABI Encoder', () => {
someUint32: new BigNumber(30472),
nestedTuple: {
someUint: new BigNumber('48384725243211555532'),
- someAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498'
- }
+ someAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ },
};
const secondTuple = {
someUint: new BigNumber(2984237422),
@@ -640,50 +587,47 @@ describe.only('ABI Encoder', () => {
someUint: new BigNumber(234324),
someStr: 'Im also a short string -- oops I just got loooooooooooooooooonger!',
someBytes: '0x23847287fff3472984723498ff23487324987aaa237438911873429472ba',
- someAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498'
- }
+ someAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ },
},
someBytes: '0x2834y3947289423u489aaaff4783924739847489',
someAddress: '0xe41d2489571d322189246dafa5ebde1f4699afaf',
};
const thirdTuple = {
- 'someUint': new BigNumber(37422),
- 'someStr': 'This into the next word of memory. string will exceed 256 bits, so it will spill.',
- 'nestedTuple': {
+ someUint: new BigNumber(37422),
+ someStr: 'This into the next word of memory. string will exceed 256 bits, so it will spill.',
+ nestedTuple: {
someUint32: new BigNumber(23999222),
- 'secondNestedTuple': {
- 'someUint': new BigNumber(324),
- 'someStr': 'Im also a short st',
- 'someBytes': '0x723498ff2348732498723847287fff3472984aaa237438911873429472ba',
- 'someAddress': '0x46dafa5ebde1f4699f498e41d2489571d3221892'
- }
+ secondNestedTuple: {
+ someUint: new BigNumber(324),
+ someStr: 'Im also a short st',
+ someBytes: '0x723498ff2348732498723847287fff3472984aaa237438911873429472ba',
+ someAddress: '0x46dafa5ebde1f4699f498e41d2489571d3221892',
+ },
},
- 'someBytes': '0x947289423u489aaaff472834y383924739847489',
- 'someAddress': '0x46dafa5ebde1f46e41d2489571d322189299afaf',
+ someBytes: '0x947289423u489aaaff472834y383924739847489',
+ someAddress: '0x46dafa5ebde1f46e41d2489571d322189299afaf',
};
const fourthTuple = {
- 'someUint': new BigNumber(222283488822),
- 'someStr': 'exceed 256 bits, so it will spill into the. This string will next word of memory.',
- 'nestedTuple': {
+ someUint: new BigNumber(222283488822),
+ someStr: 'exceed 256 bits, so it will spill into the. This string will next word of memory.',
+ nestedTuple: {
someUint32: new BigNumber(2300),
- 'secondNestedTuple': {
- 'someUint': new BigNumber(343224),
- 'someStr': 'The alphabet backwards is arguably easier to say if thats the way you learned the first time.',
- 'someBytes': '0x87324987aaa23743891187323847287fff3472984723498ff234429472ba',
- 'someAddress': '0x71d322189246dafa5ebe41d24895de1f4699f498'
- }
+ secondNestedTuple: {
+ someUint: new BigNumber(343224),
+ someStr:
+ 'The alphabet backwards is arguably easier to say if thats the way you learned the first time.',
+ someBytes: '0x87324987aaa23743891187323847287fff3472984723498ff234429472ba',
+ someAddress: '0x71d322189246dafa5ebe41d24895de1f4699f498',
+ },
},
- 'someBytes': '0x2783924739847488343947289423u489aaaff490',
- 'someAddress': '0xebde1d322189246dafa1f4699afafe41d2489575',
+ someBytes: '0x2783924739847488343947289423u489aaaff490',
+ someAddress: '0xebde1d322189246dafa1f4699afafe41d2489575',
};
- const args = [
- [firstTuple],
- [secondTuple, thirdTuple, fourthTuple]
- ];
+ const args = [[firstTuple], [secondTuple, thirdTuple, fourthTuple]];
console.log('*'.repeat(250), method, '*'.repeat(250));
-
const calldata = method.encode(args);
console.log(method.getSignature());
console.log(method.selector);
@@ -693,37 +637,9 @@ describe.only('ABI Encoder', () => {
const expectedCalldata = '0x';
expect(calldata).to.be.equal(expectedCalldata);
});
-
- it.skip('Object ABI (Object input - Missing Key)', async () => {
- const method = new AbiEncoder.Method(AbiSamples.dynamicTupleAbi);
- const calldata = method.encode([{ someUint: new BigNumber(5) }]);
- console.log(method.getSignature());
- console.log(method.selector);
-
- console.log(calldata);
- const expectedCalldata =
- '0x5b998f3500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000';
-
- // @TODO: Figure out how to catch throw
- expect(calldata).to.be.equal(expectedCalldata);
- });
-
- it.skip('Object ABI (Object input - Too Many Keys)', async () => {
- const method = new AbiEncoder.Method(AbiSamples.dynamicTupleAbi);
- const calldata = method.encode([{ someUint: new BigNumber(5), someStr: 'five', unwantedKey: 14 }]);
- console.log(method.getSignature());
- console.log(method.selector);
-
- console.log(calldata);
- const expectedCalldata =
- '0x5b998f3500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000';
-
- // @TODO: Figure out how to catch throw
- expect(calldata).to.be.equal(expectedCalldata);
- });
});
- describe.only('Array', () => {
+ describe('Array', () => {
it('Fixed size; Static elements', async () => {
// Create DataType object
const testDataItem = { name: 'testArray', type: 'int[2]' };
@@ -732,7 +648,8 @@ describe.only('ABI Encoder', () => {
const args = [new BigNumber(5), new BigNumber(6)];
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006';
+ const expectedEncodedArgs =
+ '0x00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -740,7 +657,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Dynamic size; Static elements', async () => {
// Create DataType object
const testDataItem = { name: 'testArray', type: 'int[]' };
@@ -749,7 +665,8 @@ describe.only('ABI Encoder', () => {
const args = [new BigNumber(5), new BigNumber(6)];
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006';
+ const expectedEncodedArgs =
+ '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -757,16 +674,16 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Fixed size; Dynamic elements', async () => {
// Create DataType object
const testDataItem = { name: 'testArray', type: 'string[2]' };
const dataType = new AbiEncoder.SolArray(testDataItem);
// Construct args to be encoded
- const args = ["Hello", "world"];
+ const args = ['Hello', 'world'];
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005776f726c64000000000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005776f726c64000000000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -774,16 +691,16 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Dynamic size; Dynamic elements', async () => {
// Create DataType object
const testDataItem = { name: 'testArray', type: 'string[]' };
const dataType = new AbiEncoder.SolArray(testDataItem);
// Construct args to be encoded
- const args = ["Hello", "world"];
+ const args = ['Hello', 'world'];
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005776f726c64000000000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005776f726c64000000000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -791,21 +708,56 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
- // @TODO: Add test that fails if we pass in the wrong number of elements
- // @TODO: Add test that fails if we pass in an element of incorrecrt type
+ it('Static size; Too Few Elements', async () => {
+ // Create DataType object
+ const testDataItem = { name: 'testArray', type: 'string[3]' };
+ const dataType = new AbiEncoder.SolArray(testDataItem);
+ // Construct args to be encoded
+ const args = ['Hello', 'world'];
+ // Encode Args and validate result
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw('Expected array of 3 elements, but got array of length 2');
+ });
+ it('Static size; Too Many Elements', async () => {
+ // Create DataType object
+ const testDataItem = { name: 'testArray', type: 'string[1]' };
+ const dataType = new AbiEncoder.SolArray(testDataItem);
+ // Construct args to be encoded
+ const args = ['Hello', 'world'];
+ // Encode Args and validate result
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw('Expected array of 1 elements, but got array of length 2');
+ });
+ it('Element Type Mismatch', async () => {
+ // Create DataType object
+ const testDataItem = { name: 'testArray', type: 'uint[]' };
+ const dataType = new AbiEncoder.SolArray(testDataItem);
+ // Construct args to be encoded
+ const args = [new BigNumber(1), 'Bad Argument'];
+ // Encode Args and validate result
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
+ });
});
- describe.only('Tuple', () => {
+ describe('Tuple', () => {
it('Static elements only', async () => {
// Create DataType object
- const testDataItem = { name: 'Tuple', type: 'tuple', components: [{ name: 'field_1', type: 'int32' }, { name: 'field_2', type: 'bool' }] };
+ const testDataItem = {
+ name: 'Tuple',
+ type: 'tuple',
+ components: [{ name: 'field_1', type: 'int32' }, { name: 'field_2', type: 'bool' }],
+ };
const dataType = new AbiEncoder.Tuple(testDataItem);
// Construct args to be encoded
const args = { field_1: new BigNumber(-5), field_2: true };
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000000000000000000000000000000000000000000000000000000000000001';
+ const expectedEncodedArgs =
+ '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000000000000000000000000000000000000000000000000000000000000001';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodingRules = { structsAsObjects: true } as DecodingRules;
@@ -814,16 +766,20 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Dynamic elements only', async () => {
// Create DataType object
- const testDataItem = { name: 'Tuple', type: 'tuple', components: [{ name: 'field_1', type: 'string' }, { name: 'field_2', type: 'bytes' }] };
+ const testDataItem = {
+ name: 'Tuple',
+ type: 'tuple',
+ components: [{ name: 'field_1', type: 'string' }, { name: 'field_2', type: 'bytes' }],
+ };
const dataType = new AbiEncoder.Tuple(testDataItem);
// Construct args to be encoded
- const args = { field_1: "Hello, World!", field_2: '0xabcdef0123456789' };
+ const args = { field_1: 'Hello, World!', field_2: '0xabcdef0123456789' };
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20576f726c6421000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abcdef0123456789000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20576f726c6421000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abcdef0123456789000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodingRules = { structsAsObjects: true } as DecodingRules;
@@ -832,16 +788,30 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Static and dynamic elements mixed', async () => {
// Create DataType object
- const testDataItem = { name: 'Tuple', type: 'tuple', components: [{ name: 'field_1', type: 'int32' }, { name: 'field_2', type: 'string' }, { name: 'field_3', type: 'bool' }, { name: 'field_4', type: 'bytes' }] };
+ const testDataItem = {
+ name: 'Tuple',
+ type: 'tuple',
+ components: [
+ { name: 'field_1', type: 'int32' },
+ { name: 'field_2', type: 'string' },
+ { name: 'field_3', type: 'bool' },
+ { name: 'field_4', type: 'bytes' },
+ ],
+ };
const dataType = new AbiEncoder.Tuple(testDataItem);
// Construct args to be encoded
- const args = { field_1: new BigNumber(-5), field_2: "Hello, World!", field_3: true, field_4: '0xabcdef0123456789' };
+ const args = {
+ field_1: new BigNumber(-5),
+ field_2: 'Hello, World!',
+ field_3: true,
+ field_4: '0xabcdef0123456789',
+ };
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20576f726c6421000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abcdef0123456789000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20576f726c6421000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abcdef0123456789000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodingRules = { structsAsObjects: true } as DecodingRules;
@@ -850,12 +820,39 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
- // @TODO: Add test that fails if we pass in the wrong number of elements
- // @TODO: Add test that fails if we pass in arguments in wrong order
+ it('Missing Key', async () => {
+ // Create DataType object
+ const testDataItem = {
+ name: 'Tuple',
+ type: 'tuple',
+ components: [{ name: 'field_1', type: 'int32' }, { name: 'field_2', type: 'bool' }],
+ };
+ const dataType = new AbiEncoder.Tuple(testDataItem);
+ // Construct args to be encoded
+ const args = { field_1: new BigNumber(-5) };
+ // Encode Args and validate result
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw('Could not assign tuple to object: missing keys field_2');
+ });
+ it('Bad Key', async () => {
+ // Create DataType object
+ const testDataItem = {
+ name: 'Tuple',
+ type: 'tuple',
+ components: [{ name: 'field_1', type: 'int32' }, { name: 'field_2', type: 'bool' }],
+ };
+ const dataType = new AbiEncoder.Tuple(testDataItem);
+ // Construct args to be encoded
+ const args = { unknown_field: new BigNumber(-5) };
+ // Encode Args and validate result
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw("Could not assign tuple to object: unrecognized key 'unknown_field' in object Tuple");
+ });
});
- describe.only('Address', () => {
+ describe('Address', () => {
it('Valid Address', async () => {
// Create DataType object
const testDataItem = { name: 'Address', type: 'address' };
@@ -872,7 +869,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Invalid Address - input is not valid hex', async () => {
// Create DataType object
const testDataItem = { name: 'Address', type: 'address' };
@@ -880,9 +876,10 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = 'e4';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw(AbiEncoder.Address.ERROR_MESSAGE_ADDRESS_MUST_START_WITH_0X);
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw(AbiEncoder.Address.ERROR_MESSAGE_ADDRESS_MUST_START_WITH_0X);
});
-
it('Invalid Address - input is not 20 bytes', async () => {
// Create DataType object
const testDataItem = { name: 'Address', type: 'address' };
@@ -890,11 +887,13 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '0xe4';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw(AbiEncoder.Address.ERROR_MESSAGE_ADDRESS_MUST_BE_20_BYTES);
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw(AbiEncoder.Address.ERROR_MESSAGE_ADDRESS_MUST_BE_20_BYTES);
});
});
- describe.only('Bool', () => {
+ describe('Bool', () => {
it('True', async () => {
// Create DataType object
const testDataItem = { name: 'Boolean', type: 'bool' };
@@ -911,7 +910,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('False', async () => {
// Create DataType object
const testDataItem = { name: 'Boolean', type: 'bool' };
@@ -930,7 +928,7 @@ describe.only('ABI Encoder', () => {
});
});
- describe.only('Integer', () => {
+ describe('Integer', () => {
it('Int256 - Positive Base Case', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (256)', type: 'int' };
@@ -947,7 +945,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int256 - Negative Base Case', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (256)', type: 'int' };
@@ -964,13 +961,12 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int256 - Positive Value', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (256)', type: 'int' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const max256BitInteger = (new BigNumber(2)).pow(255).minus(1);
+ const max256BitInteger = new BigNumber(2).pow(255).minus(1);
const args = max256BitInteger;
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
@@ -982,13 +978,12 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int256 - Negative Value', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (256)', type: 'int' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const min256BitInteger = (new BigNumber(2)).pow(255).times(-1);
+ const min256BitInteger = new BigNumber(2).pow(255).times(-1);
const args = min256BitInteger;
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
@@ -1000,29 +995,30 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int256 - Value too large', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (256)', type: 'int' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const max256BitInteger = (new BigNumber(2)).pow(255).minus(1);
+ const max256BitInteger = new BigNumber(2).pow(255).minus(1);
const args = max256BitInteger.plus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
-
it('Int256 - Value too small', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (256)', type: 'int' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const min256BitInteger = (new BigNumber(2)).pow(255).times(-1);
+ const min256BitInteger = new BigNumber(2).pow(255).times(-1);
const args = min256BitInteger.minus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
-
it('Int32 - Positive Base Case', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (32)', type: 'int32' };
@@ -1039,7 +1035,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int32 - Negative Base Case', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (32)', type: 'int32' };
@@ -1056,13 +1051,12 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int32 - Positive Value', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (32)', type: 'int32' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const max32BitInteger = (new BigNumber(2)).pow(31).minus(1);
+ const max32BitInteger = new BigNumber(2).pow(31).minus(1);
const args = max32BitInteger;
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
@@ -1074,13 +1068,12 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int32 - Negative Value', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (32)', type: 'int32' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const min32BitInteger = (new BigNumber(2)).pow(31).times(-1);
+ const min32BitInteger = new BigNumber(2).pow(31).times(-1);
const args = min32BitInteger;
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
@@ -1092,31 +1085,33 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Int32 - Value too large', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (32)', type: 'int32' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const max32BitInteger = (new BigNumber(2)).pow(31).minus(1);
+ const max32BitInteger = new BigNumber(2).pow(31).minus(1);
const args = max32BitInteger.plus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
-
it('Int32 - Value too small', async () => {
// Create DataType object
const testDataItem = { name: 'Integer (32)', type: 'int32' };
const dataType = new AbiEncoder.Int(testDataItem);
// Construct args to be encoded
- const min32BitInteger = (new BigNumber(2)).pow(31).times(-1);
+ const min32BitInteger = new BigNumber(2).pow(31).times(-1);
const args = min32BitInteger.minus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
});
- describe.only('Unsigned Integer', () => {
+ describe('Unsigned Integer', () => {
it('UInt256 - Positive Base Case', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (256)', type: 'uint' };
@@ -1133,13 +1128,12 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('UInt256 - Positive Value', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (256)', type: 'uint' };
const dataType = new AbiEncoder.UInt(testDataItem);
// Construct args to be encoded
- const max256BitUnsignedInteger = (new BigNumber(2)).pow(256).minus(1);
+ const max256BitUnsignedInteger = new BigNumber(2).pow(256).minus(1);
const args = max256BitUnsignedInteger;
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
@@ -1151,7 +1145,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('UInt256 - Zero Value', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (256)', type: 'uint' };
@@ -1169,29 +1162,30 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('UInt256 - Value too large', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (256)', type: 'uint' };
const dataType = new AbiEncoder.UInt(testDataItem);
// Construct args to be encoded
- const max256BitUnsignedInteger = (new BigNumber(2)).pow(256).minus(1);
+ const max256BitUnsignedInteger = new BigNumber(2).pow(256).minus(1);
const args = max256BitUnsignedInteger.plus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
-
it('UInt256 - Value too small', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (256)', type: 'uint' };
const dataType = new AbiEncoder.UInt(testDataItem);
// Construct args to be encoded
- const min256BitUnsignedInteger = new BigNumber(0)
+ const min256BitUnsignedInteger = new BigNumber(0);
const args = min256BitUnsignedInteger.minus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
-
it('UInt32 - Positive Base Case', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (32)', type: 'uint32' };
@@ -1208,13 +1202,12 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('UInt32 - Positive Value', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (32)', type: 'uint32' };
const dataType = new AbiEncoder.UInt(testDataItem);
// Construct args to be encoded
- const max32BitUnsignedInteger = (new BigNumber(2)).pow(32).minus(1);
+ const max32BitUnsignedInteger = new BigNumber(2).pow(32).minus(1);
const args = max32BitUnsignedInteger;
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
@@ -1226,7 +1219,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('UInt32 - Zero Value', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (32)', type: 'uint32' };
@@ -1244,18 +1236,18 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('UInt32 - Value too large', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (32)', type: 'uint32' };
const dataType = new AbiEncoder.UInt(testDataItem);
// Construct args to be encoded
- const max32BitUnsignedInteger = (new BigNumber(2)).pow(32).minus(1);
+ const max32BitUnsignedInteger = new BigNumber(2).pow(32).minus(1);
const args = max32BitUnsignedInteger.plus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
-
it('UInt32 - Value too small', async () => {
// Create DataType object
const testDataItem = { name: 'Unsigned Integer (32)', type: 'uint32' };
@@ -1264,11 +1256,13 @@ describe.only('ABI Encoder', () => {
const min32BitUnsignedInteger = new BigNumber(0);
const args = min32BitUnsignedInteger.minus(1);
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw();
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw();
});
});
- describe.only('Static Bytes', () => {
+ describe('Static Bytes', () => {
it('Single Byte (byte)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Byte', type: 'byte' };
@@ -1285,7 +1279,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Single Byte (bytes1)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes1', type: 'bytes1' };
@@ -1302,7 +1295,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('4 Bytes (bytes4)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes4', type: 'bytes4' };
@@ -1319,7 +1311,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('4 Bytes (bytes4); Encoder must pad input', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes4', type: 'bytes4' };
@@ -1338,7 +1329,6 @@ describe.only('ABI Encoder', () => {
const paddedArgsAsJson = JSON.stringify(paddedArgs);
expect(decodedArgsAsJson).to.be.equal(paddedArgsAsJson);
});
-
it('32 Bytes (bytes32)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes32', type: 'bytes32' };
@@ -1355,7 +1345,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('32 Bytes (bytes32); Encoder must pad input', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes32', type: 'bytes32' };
@@ -1374,7 +1363,6 @@ describe.only('ABI Encoder', () => {
const paddedArgsAsJson = JSON.stringify(paddedArgs);
expect(decodedArgsAsJson).to.be.equal(paddedArgsAsJson);
});
-
it('Should throw when pass in too many bytes (bytes4)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes4', type: 'bytes4' };
@@ -1382,9 +1370,12 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '0x0102030405';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw('Tried to assign 0x0102030405 (5 bytes), which exceeds max bytes that can be stored in a bytes4');
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw(
+ 'Tried to assign 0x0102030405 (5 bytes), which exceeds max bytes that can be stored in a bytes4',
+ );
});
-
it('Should throw when pass in too many bytes (bytes32)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes32', type: 'bytes32' };
@@ -1392,9 +1383,12 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '0x010203040506070809101112131415161718192021222324252627282930313233';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw('Tried to assign 0x010203040506070809101112131415161718192021222324252627282930313233 (33 bytes), which exceeds max bytes that can be stored in a bytes32');
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw(
+ 'Tried to assign 0x010203040506070809101112131415161718192021222324252627282930313233 (33 bytes), which exceeds max bytes that can be stored in a bytes32',
+ );
});
-
it('Should throw when pass in bad hex (no 0x prefix)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes32', type: 'bytes32' };
@@ -1402,9 +1396,10 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '0102030405060708091011121314151617181920212223242526272829303132';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw("Tried to encode non-hex value. Value must inlcude '0x' prefix.");
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw("Tried to encode non-hex value. Value must inlcude '0x' prefix.");
});
-
it('Should throw when pass in bad hex (include a half-byte)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes32', type: 'bytes32' };
@@ -1412,11 +1407,13 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '0x010';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw('Tried to assign 0x010, which is contains a half-byte. Use full bytes only.');
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw('Tried to assign 0x010, which is contains a half-byte. Use full bytes only.');
});
});
- describe.only('Dynamic Bytes Dynamic', () => {
+ describe('Dynamic Bytes', () => {
it('Fits into one EVM word', async () => {
// Create DataType object
const testDataItem = { name: 'Dynamic Bytes', type: 'bytes' };
@@ -1426,7 +1423,8 @@ describe.only('ABI Encoder', () => {
const args = '0x1a18bf61';
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x00000000000000000000000000000000000000000000000000000000000000041a18bf6100000000000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x00000000000000000000000000000000000000000000000000000000000000041a18bf6100000000000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -1434,7 +1432,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Spans multiple EVM words', async () => {
// Create DataType object
const testDataItem = { name: 'Dynamic Bytes', type: 'bytes' };
@@ -1444,7 +1441,8 @@ describe.only('ABI Encoder', () => {
const args = '0x' + '61'.repeat(40);
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x000000000000000000000000000000000000000000000000000000000000002861616161616161616161616161616161616161616161616161616161616161616161616161616161000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x000000000000000000000000000000000000000000000000000000000000002861616161616161616161616161616161616161616161616161616161616161616161616161616161000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -1452,7 +1450,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Input as Buffer', async () => {
// Create DataType object
const testDataItem = { name: 'Dynamic Bytes', type: 'bytes' };
@@ -1463,7 +1460,8 @@ describe.only('ABI Encoder', () => {
const argsAsBuffer = ethUtil.toBuffer(args);
// Encode Args and validate result
const encodedArgs = dataType.encode(argsAsBuffer);
- const expectedEncodedArgs = '0x00000000000000000000000000000000000000000000000000000000000000041a18bf6100000000000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x00000000000000000000000000000000000000000000000000000000000000041a18bf6100000000000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -1471,7 +1469,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Should throw when pass in bad hex (no 0x prefix)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes', type: 'bytes' };
@@ -1479,9 +1476,10 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '01';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw("Tried to encode non-hex value. Value must inlcude '0x' prefix. Got '01'");
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw("Tried to encode non-hex value. Value must inlcude '0x' prefix. Got '01'");
});
-
it('Should throw when pass in bad hex (include a half-byte)', async () => {
// Create DataType object
const testDataItem = { name: 'Static Bytes', type: 'bytes' };
@@ -1489,11 +1487,13 @@ describe.only('ABI Encoder', () => {
// Construct args to be encoded
const args = '0x010';
// Encode Args and validate result
- expect(() => { dataType.encode(args) }).to.throw('Tried to assign 0x010, which is contains a half-byte. Use full bytes only.');
+ expect(() => {
+ dataType.encode(args);
+ }).to.throw('Tried to assign 0x010, which is contains a half-byte. Use full bytes only.');
});
});
- describe.only('String', () => {
+ describe('String', () => {
it('Fits into one EVM word', async () => {
// Create DataType object
const testDataItem = { name: 'String', type: 'string' };
@@ -1503,7 +1503,8 @@ describe.only('ABI Encoder', () => {
const args = 'five';
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x00000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x00000000000000000000000000000000000000000000000000000000000000046669766500000000000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -1511,7 +1512,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('Spans multiple EVM words', async () => {
// Create DataType object
const testDataItem = { name: 'String', type: 'string' };
@@ -1521,7 +1521,8 @@ describe.only('ABI Encoder', () => {
const args = 'a'.repeat(40);
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x000000000000000000000000000000000000000000000000000000000000002861616161616161616161616161616161616161616161616161616161616161616161616161616161000000000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x000000000000000000000000000000000000000000000000000000000000002861616161616161616161616161616161616161616161616161616161616161616161616161616161000000000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
@@ -1529,7 +1530,6 @@ describe.only('ABI Encoder', () => {
const argsAsJson = JSON.stringify(args);
expect(decodedArgsAsJson).to.be.equal(argsAsJson);
});
-
it('String that begins with 0x prefix', async () => {
// Create DataType object
const testDataItem = { name: 'String', type: 'string' };
@@ -1539,7 +1539,8 @@ describe.only('ABI Encoder', () => {
const args = '0x' + 'a'.repeat(40);
// Encode Args and validate result
const encodedArgs = dataType.encode(args);
- const expectedEncodedArgs = '0x000000000000000000000000000000000000000000000000000000000000002a30786161616161616161616161616161616161616161616161616161616161616161616161616161616100000000000000000000000000000000000000000000';
+ const expectedEncodedArgs =
+ '0x000000000000000000000000000000000000000000000000000000000000002a30786161616161616161616161616161616161616161616161616161616161616161616161616161616100000000000000000000000000000000000000000000';
expect(encodedArgs).to.be.equal(expectedEncodedArgs);
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
diff --git a/packages/utils/test/abi_samples.ts b/packages/utils/test/abi_samples.ts
index aa38711cd..806ad1700 100644
--- a/packages/utils/test/abi_samples.ts
+++ b/packages/utils/test/abi_samples.ts
@@ -34,32 +34,32 @@ export const stringAbi = {
type: 'function',
} as MethodAbi;
-
export const GAbi = {
constant: false,
inputs: [
{
- components: [{
- name: 'a',
- type: 'uint256',
- },
- {
- name: 'b',
- type: 'string',
- },
- {
- name: 'e',
- type: 'bytes',
- },
- {
- name: 'f',
- type: 'address',
- }],
+ components: [
+ {
+ name: 'a',
+ type: 'uint256',
+ },
+ {
+ name: 'b',
+ type: 'string',
+ },
+ {
+ name: 'e',
+ type: 'bytes',
+ },
+ {
+ name: 'f',
+ type: 'address',
+ },
+ ],
name: 'f',
type: 'tuple',
-
- }
+ },
],
name: 'simpleFunction',
outputs: [],
@@ -137,6 +137,25 @@ export const optimizerAbi4 = {
type: 'function',
} as MethodAbi;
+export const optimizerAbi5 = {
+ constant: false,
+ inputs: [
+ {
+ name: 'array1',
+ type: 'uint8[]',
+ },
+ {
+ name: 'array2',
+ type: 'uint8[]',
+ },
+ ],
+ name: 'simpleFunction',
+ outputs: [],
+ payable: false,
+ stateMutability: 'nonpayable',
+ type: 'function',
+} as MethodAbi;
+
export const typesWithDefaultWidthsAbi = {
constant: false,
inputs: [
@@ -456,7 +475,7 @@ export const staticArrayAbi = {
{
name: 'someStaticArray',
type: 'uint8[3]',
- }
+ },
],
name: 'simpleFunction',
outputs: [],
@@ -471,7 +490,7 @@ export const staticArrayDynamicMembersAbi = {
{
name: 'someStaticArray',
type: 'string[3]',
- }
+ },
],
name: 'simpleFunction',
outputs: [],
@@ -486,7 +505,7 @@ export const dynamicArrayDynamicMembersAbi = {
{
name: 'someStaticArray',
type: 'string[]',
- }
+ },
],
name: 'simpleFunction',
outputs: [],
@@ -501,7 +520,7 @@ export const dynamicArrayStaticMembersAbi = {
{
name: 'someStaticArray',
type: 'uint8[]',
- }
+ },
],
name: 'simpleFunction',
outputs: [],
@@ -510,7 +529,7 @@ export const dynamicArrayStaticMembersAbi = {
type: 'function',
} as MethodAbi;
-export const crazyAbi1 = {
+export const largeFlatAbi = {
constant: false,
inputs: [
{
@@ -557,7 +576,7 @@ export const crazyAbi1 = {
type: 'function',
} as MethodAbi;
-export const crazyAbi = {
+export const largeNestedAbi = {
constant: false,
inputs: [
{
@@ -641,7 +660,7 @@ export const crazyAbi = {
type: 'address',
},
],
- }
+ },
],
name: 'simpleFunction',
outputs: [],
@@ -730,7 +749,7 @@ export const nestedTuples = {
type: 'address',
},
],
- }
+ },
],
name: 'simpleFunction',
outputs: [],