Commit d5b890fb authored by yann300's avatar yann300

refactor calldata decoding & fix nested array decoding

parent f8be36a5
...@@ -52,27 +52,45 @@ export class RefType { ...@@ -52,27 +52,45 @@ export class RefType {
offset = parseInt(offset, 16) offset = parseInt(offset, 16)
return this.decodeFromMemoryInternal(offset, memory, cursor) return this.decodeFromMemoryInternal(offset, memory, cursor)
} else if (this.isInCallData()) { } else if (this.isInCallData()) {
calldata = calldata.length > 0 ? calldata[0] : '0x' return this._decodeFromCallData(variableDetails, calldata)
const ethersAbi = new ethers.utils.Interface(variableDetails.abi) } else {
const fnSign = calldata.substr(0, 10) return { error: '<decoding failed - no decoder for ' + this.location + '>', type: this.typeName }
const decodedData = ethersAbi.decodeFunctionData(ethersAbi.getFunction(fnSign), calldata) }
let decodedValue = decodedData[variableDetails.name] }
const isArray = Array.isArray(decodedValue)
if (isArray) { _decodeFromCallData (variableDetails, calldata) {
decodedValue = decodedValue.map((el) => { calldata = calldata.length > 0 ? calldata[0] : '0x'
return { const ethersAbi = new ethers.utils.Interface(variableDetails.abi)
value: el.toString(), const fnSign = calldata.substr(0, 10)
type: this.underlyingType.typeName 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 { return {
length: Array.isArray(decodedValue) ? '0x' + decodedValue.length.toString(16) : undefined, length: value.length.toString(16),
value: decodedValue, value: value,
type: this.typeName type: type.typeName
} }
} else { } else {
return { error: '<decoding failed - no decoder for ' + this.location + '>', type: this.typeName } return {
value: value.toString(),
type: type.underlyingType.typeName
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment