Merge pull request #1582 from 0xProject/fix/utils/abiDecodeNullAsFalse

Decode NULL as False in Abi Encoder
This commit is contained in:
Fabio B 2019-02-05 10:32:00 +00:00 committed by GitHub
commit b2f35057a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 1 deletions

View File

@ -1,4 +1,13 @@
[ [
{
"version": "4.0.1",
"changes": [
{
"note": "ABI Decode NULL as False",
"pr": 1582
}
]
},
{ {
"version": "4.0.0", "version": "4.0.0",
"changes": [ "changes": [

View File

@ -36,7 +36,8 @@ export class BoolDataType extends AbstractBlobDataType {
public decodeValue(calldata: RawCalldata): boolean { public decodeValue(calldata: RawCalldata): boolean {
const valueBuf = calldata.popWord(); const valueBuf = calldata.popWord();
const valueHex = ethUtil.bufferToHex(valueBuf); const valueHex = ethUtil.bufferToHex(valueBuf);
const valueNumber = new BigNumber(valueHex, constants.HEX_BASE); // Hack @hysz: there are some cases where `false` is encoded as 0x instead of 0x0.
const valueNumber = valueHex === '0x' ? new BigNumber(0) : new BigNumber(valueHex, constants.HEX_BASE);
if (!(valueNumber.isEqualTo(0) || valueNumber.isEqualTo(1))) { if (!(valueNumber.isEqualTo(0) || valueNumber.isEqualTo(1))) {
throw new Error(`Failed to decode boolean. Expected 0x0 or 0x1, got ${valueHex}`); throw new Error(`Failed to decode boolean. Expected 0x0 or 0x1, got ${valueHex}`);
} }

View File

@ -489,6 +489,24 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => {
const argsEncodedFromSignature = dataTypeFromSignature.encode(args); const argsEncodedFromSignature = dataTypeFromSignature.encode(args);
expect(argsEncodedFromSignature).to.be.deep.equal(expectedEncodedArgs); expect(argsEncodedFromSignature).to.be.deep.equal(expectedEncodedArgs);
}); });
it('Null should decode as False', async () => {
// Hack @hysz: there are some cases where `false` is encoded as 0x instead of 0x0.
// Create DataType object
const testDataItem = { name: 'Boolean', type: 'bool' };
const dataType = new AbiEncoder.Bool(testDataItem);
// Construct args to be encoded
const args = false;
// Encode Args and validate result
const encodedArgs = '0x';
const expectedEncodedArgs = '0x0000000000000000000000000000000000000000000000000000000000000000';
// Decode Encoded Args and validate result
const decodedArgs = dataType.decode(encodedArgs);
expect(decodedArgs).to.be.deep.equal(args);
// Validate signature
const dataTypeFromSignature = AbiEncoder.create(dataType.getSignature(true));
const argsEncodedFromSignature = dataTypeFromSignature.encode(args);
expect(argsEncodedFromSignature).to.be.deep.equal(expectedEncodedArgs);
});
}); });
describe('Integer', () => { describe('Integer', () => {