Merge pull request #366 from 0xProject/fix/abi_decoder_colision
Fix an exception when a signature collision happens
This commit is contained in:
@@ -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_
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user