From cd5a4ad55d93f7624bdc324e4474a707fbdaa393 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 17 May 2021 10:58:33 +0200 Subject: [PATCH] refactor calldata decoding & fix nested array decoding --- .../src/solidity-decoder/types/RefType.ts | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/libs/remix-debug/src/solidity-decoder/types/RefType.ts b/libs/remix-debug/src/solidity-decoder/types/RefType.ts index 031d52f295..dd9d0fc98a 100644 --- a/libs/remix-debug/src/solidity-decoder/types/RefType.ts +++ b/libs/remix-debug/src/solidity-decoder/types/RefType.ts @@ -52,27 +52,45 @@ export class RefType { offset = parseInt(offset, 16) return this.decodeFromMemoryInternal(offset, memory, cursor) } else if (this.isInCallData()) { - calldata = calldata.length > 0 ? calldata[0] : '0x' - const ethersAbi = new ethers.utils.Interface(variableDetails.abi) - const fnSign = calldata.substr(0, 10) - const decodedData = ethersAbi.decodeFunctionData(ethersAbi.getFunction(fnSign), calldata) - let decodedValue = decodedData[variableDetails.name] - const isArray = Array.isArray(decodedValue) - if (isArray) { - decodedValue = decodedValue.map((el) => { - return { - value: el.toString(), - type: this.underlyingType.typeName - } - }) - } + return this._decodeFromCallData(variableDetails, calldata) + } else { + return { error: '', type: this.typeName } + } + } + + _decodeFromCallData (variableDetails, calldata) { + calldata = calldata.length > 0 ? calldata[0] : '0x' + const ethersAbi = new ethers.utils.Interface(variableDetails.abi) + const fnSign = calldata.substr(0, 10) + const decodedData = ethersAbi.decodeFunctionData(ethersAbi.getFunction(fnSign), calldata) + let decodedValue = decodedData[variableDetails.name] + const isArray = Array.isArray(decodedValue) + if (isArray) { + return this._decodeCallDataArray(decodedValue, this) + } + return { + length: isArray ? '0x' + decodedValue.length.toString(16) : undefined, + value: decodedValue, + type: this.typeName + } + } + + _decodeCallDataArray (value, type) { + const isArray = Array.isArray(value) + if (isArray) { + value = value.map((el) => { + return this._decodeCallDataArray(el, this.underlyingType) + }) return { - length: Array.isArray(decodedValue) ? '0x' + decodedValue.length.toString(16) : undefined, - value: decodedValue, - type: this.typeName + length: value.length.toString(16), + value: value, + type: type.typeName } } else { - return { error: '', type: this.typeName } + return { + value: value.toString(), + type: type.underlyingType.typeName + } } }