Decode NULL as false
This commit is contained in:
		@@ -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": [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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}`);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user