diff options
author | fragosti <francesco.agosti93@gmail.com> | 2018-08-21 03:01:58 +0800 |
---|---|---|
committer | fragosti <francesco.agosti93@gmail.com> | 2018-08-21 03:01:58 +0800 |
commit | cabce8cb674e937a566e8a821e3959076390f603 (patch) | |
tree | 085b13d8d39c78ae6b5b58157ad73ca5efea544f /packages/utils/src/abi_decoder.ts | |
parent | 44cc5e45cc3a3ed7db2691a287500e5d61a2d0c1 (diff) | |
parent | 756787c61fff9c6b463fbbd69b48210dafe62004 (diff) | |
download | dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.tar dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.tar.gz dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.tar.bz2 dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.tar.lz dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.tar.xz dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.tar.zst dexon-sol-tools-cabce8cb674e937a566e8a821e3959076390f603.zip |
Merge branch 'development' of https://github.com/0xProject/0x-monorepo into feature/connect/sra-api-v2
Diffstat (limited to 'packages/utils/src/abi_decoder.ts')
-rw-r--r-- | packages/utils/src/abi_decoder.ts | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/packages/utils/src/abi_decoder.ts b/packages/utils/src/abi_decoder.ts index 7f93e746e..cc05321ab 100644 --- a/packages/utils/src/abi_decoder.ts +++ b/packages/utils/src/abi_decoder.ts @@ -16,17 +16,18 @@ import { addressUtils } from './address_utils'; import { BigNumber } from './configured_bignumber'; export class AbiDecoder { - private readonly _methodIds: { [signatureHash: string]: EventAbi } = {}; + private readonly _methodIds: { [signatureHash: string]: { [numIndexedArgs: number]: EventAbi } } = {}; constructor(abiArrays: AbiDefinition[][]) { _.forEach(abiArrays, this.addABI.bind(this)); } // This method can only decode logs from the 0x & ERC20 smart contracts public tryToDecodeLogOrNoop<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog { const methodId = log.topics[0]; - const event = this._methodIds[methodId]; - if (_.isUndefined(event)) { + const numIndexedArgs = log.topics.length - 1; + if (_.isUndefined(this._methodIds[methodId]) || _.isUndefined(this._methodIds[methodId][numIndexedArgs])) { return log; } + const event = this._methodIds[methodId][numIndexedArgs]; const ethersInterface = new ethers.Interface([event]); const decodedParams: DecodedLogArgs = {}; let topicsIndex = 1; @@ -45,7 +46,6 @@ export class AbiDecoder { } throw error; } - let didFailToDecode = false; _.forEach(event.inputs, (param: EventParameter, i: number) => { // Indexed parameters are stored in topics. Non-indexed ones in decodedData @@ -83,7 +83,11 @@ export class AbiDecoder { _.map(abiArray, (abi: AbiDefinition) => { if (abi.type === AbiType.Event) { const topic = ethersInterface.events[abi.name].topics[0]; - this._methodIds[topic] = abi; + const numIndexedArgs = _.reduce(abi.inputs, (sum, input) => (input.indexed ? sum + 1 : sum), 0); + this._methodIds[topic] = { + ...this._methodIds[topic], + [numIndexedArgs]: abi, + }; } }); } |