Merge pull request #366 from 0xProject/fix/abi_decoder_colision

Fix an exception when a signature collision happens
This commit is contained in:
Leonid
2018-02-05 21:56:04 +01:00
committed by GitHub
3 changed files with 24 additions and 10 deletions

View File

@@ -1,8 +1,9 @@
# CHANGELOG
## v0.x.0 - _TBD, 2018_
## v0.x.x - _TBD, 2018_
* Add `zeroEx.etherToken.getContractAddressIfExists` (#350)
* Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields (#366)
## v0.31.1 - _February 1, 2018_

View File

@@ -1,6 +1,10 @@
# CHANGELOG
## v0.x.x - _TBD, 2018_
* Fix a bug related to event signature collisions (argument indexes aren't included in event signatures) in the abi_decoder. The decoder used to throw on unknown events with identical signatures as a known event (except indexes). (#366)
## v0.2.0 - _January 17, 2018_
* Add `onError` parameter to `intervalUtils.setAsyncExcludingInterval` (#312)
* Add `intervalUtils.setInterval` (#312)
* Add `onError` parameter to `intervalUtils.setAsyncExcludingInterval` (#312)
* Add `intervalUtils.setInterval` (#312)

View File

@@ -18,7 +18,7 @@ export class AbiDecoder {
return `0x${formatted}`;
}
constructor(abiArrays: Web3.AbiDefinition[][]) {
_.map(abiArrays, this._addABI.bind(this));
_.forEach(abiArrays, this._addABI.bind(this));
}
// This method can only decode logs from the 0x & ERC20 smart contracts
public tryToDecodeLogOrNoop<ArgsType>(log: Web3.LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
@@ -36,9 +36,14 @@ export class AbiDecoder {
const dataTypes = _.map(nonIndexedInputs, input => input.type);
const decodedData = SolidityCoder.decodeParams(dataTypes, logData.slice('0x'.length));
_.map(event.inputs, (param: Web3.EventParameter) => {
let failedToDecode = false;
_.forEach(event.inputs, (param: Web3.EventParameter) => {
// Indexed parameters are stored in topics. Non-indexed ones in decodedData
let value: BigNumber | string = param.indexed ? log.topics[topicsIndex++] : decodedData[dataIndex++];
if (_.isUndefined(value)) {
failedToDecode = true;
return;
}
if (param.type === SolidityTypes.Address) {
value = AbiDecoder._padZeros(new BigNumber(value).toString(16));
} else if (
@@ -51,11 +56,15 @@ export class AbiDecoder {
decodedParams[param.name] = value;
});
return {
...log,
event: event.name,
args: decodedParams,
};
if (failedToDecode) {
return log;
} else {
return {
...log,
event: event.name,
args: decodedParams,
};
}
}
private _addABI(abiArray: Web3.AbiDefinition[]): void {
_.map(abiArray, (abi: Web3.AbiDefinition) => {