7

Is it possible to create a function in Solidity that would call an arbitrary function on an arbitrary contract with all the parameters?

In JavaScript I would write something like this

function callArbitrary(contract, func, params){
    contract[func](params);
}

is there a solidity version of that?

1 Answer 1

7

This is generally not recommended if you're not sure what you are doing, since it can open a lot of security holes, and it is best to only call contracts that are known beforehand.

That said, the technique looks like this:

address myContract = 0xabcdef....;
myContract.call.gas(msg.gas-3000).value(1 ether)(bytes4(sha3("myFunction(uint256,bytes32,string)")), 42, 0xabc, "hello")

Essentially, you use the call method of an address, then use the gas and value properties to add gas and value (you may ommit the value if it is 0). Then you pass in the first 4 bytes of the sha3 hash of the function you wish to call.

5
  • thank you for the answer. But is the second line correct? it looks like it should be myContract.call
    – Micha Roon
    Sep 30, 2016 at 6:52
  • Nice catch, yes it should Sep 30, 2016 at 11:29
  • I do not think this is really the answer: In this answer the parameters need to be known at compile time (since you explicitly pass them as 42, 0xabc, "hello" but even having them as variables you need to know the number of parameters and their types). I guess there should be a way to simply pass arbitrary callData (as bytes?) but I cant figure out how to do that.
    – SCBuergel
    May 4, 2017 at 9:45
  • 1
    You're right, this isn't a fully general answer, but I think it's a bit more clear than just passing in a bytes containing all of the calldata. If you want a fully general proxy, you can take a look at the uport proxy May 4, 2017 at 14:57
  • @TjadenHess do you have an example of serializing the data for this proxy function? May 3, 2018 at 0:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.