Merge pull request #2899 from ethereum/fix_scenario_tuple

fix resolving function abi with tuple
pull/5370/head
bunsenstraat 2 years ago committed by GitHub
commit 078f3ce37e
  1. 24
      libs/remix-lib/src/execution/txHelper.ts
  2. 15
      libs/remix-lib/test/txHelper.ts

@ -102,17 +102,25 @@ export function extractSize (type) {
return size ? size[2] : ''
}
export function getFunctionLiner (fn, detailTuple: boolean = true) {
/*
if detailsTuple is True, this will return something like fnName((uint, string))
if detailsTuple is False, this will return something like fnName(tuple)
*/
return fn.name + '(' + fn.inputs.map((value) => {
if (detailTuple && value.components) {
const fullType = makeFullTypeDefinition(value)
return fullType.replace(/tuple/g, '') // return of makeFullTypeDefinition might contain `tuple`, need to remove it cause `methodIdentifier` (fnName) does not include `tuple` keyword
} else {
return value.type
}
}).join(',') + ')'
}
export function getFunction (abi, fnName) {
for (let i = 0; i < abi.length; i++) {
const fn = abi[i]
if (fn.type === 'function' && fnName === fn.name + '(' + fn.inputs.map((value) => {
if (value.components) {
const fullType = makeFullTypeDefinition(value)
return fullType.replace(/tuple/g, '') // return of makeFullTypeDefinition might contain `tuple`, need to remove it cause `methodIdentifier` (fnName) does not include `tuple` keyword
} else {
return value.type
}
}).join(',') + ')') {
if (fn.type === 'function' && (fnName === getFunctionLiner(fn, true) || fnName === getFunctionLiner(fn, false))) {
return fn
}
}

@ -3,7 +3,7 @@ import tape from 'tape'
import * as txHelper from '../src/execution/txHelper'
tape('getFunction', function (st) {
st.plan(6)
st.plan(11)
let fn = txHelper.getFunction(JSON.parse(abi), 'o((address,uint256))')
st.equal(fn.name, 'o')
@ -21,6 +21,17 @@ tape('getFunction', function (st) {
fn = txHelper.getReceiveInterface(JSON.parse(abi))
st.equal(fn.type, 'receive')
fn = txHelper.getFunction(testTupleAbi, 'setUser(tuple)') // some compiler version might resolve to tuple.
st.equal(fn.name, 'setUser')
st.equal(fn.inputs[0].type, 'tuple')
st.equal(fn.inputs[0].name, 'user')
fn = txHelper.getFunctionLiner(testTupleAbi[0], true)
st.equal(fn, 'setUser((string,uint256))')
fn = txHelper.getFunctionLiner(testTupleAbi[0], false)
st.equal(fn, 'setUser(tuple)')
})
const abi = `[
@ -153,3 +164,5 @@ const abi = `[
"type": "receive"
}
]`
const testTupleAbi = [{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"age","type":"uint256"}],"internalType":"struct Example.User","name":"user","type":"tuple"}],"name":"setUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userByAddress","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"age","type":"uint256"}],"stateMutability":"view","type":"function"}]

Loading…
Cancel
Save