1

I am trying to make use of delegatecall function in solidity.

function delegateTokens(uint256 _value) returns (bool result) {
    tokens[msg.sender] = _value;
    return token.delegatecall(bytes4(sha3("transfer(address,uint256)")), address(this), _value);
}

There is no error thrown but values are not changed. Code is available at https://github.com/nirmalgupta/delegatecall steps to reproduce is also available there. Any help with this is appreciated.

7
  • Are you aware that if inside contract A you make a delegate call to B, you will modify A state but not B? In your code that delegatecall is modifyng the state of Custody contract and not the state of HumanStandardToken.
    – Ismael
    Commented Sep 25, 2017 at 5:14
  • whole idea of delegatecall is to make sure msg.sender not changed when call is made from A to B. So it should change state of B as if it was called by user who called contract A. By the way, neither contract A nor contract B is getting modified.
    – Nirmal
    Commented Sep 25, 2017 at 18:49
  • I'm afraid neither of the opcodes allow something like that ethereum.stackexchange.com/questions/3667/…
    – Ismael
    Commented Sep 25, 2017 at 19:05
  • Quote from the link says."// msg.sender is C if invoked by C.foo(). None of E's storage is updated". If you see my test code, I am making call as user1. This means msg.sender must be user1 in token.transfer call (which is correct). Then why mapping(address=>uint256) balances does not change for address user1? And if "None of E's storage is updated", then what is the use of delegatecall? This is something I am not able to understand.
    – Nirmal
    Commented Sep 25, 2017 at 23:58
  • In the test you call custody.delegateTokens(100, {from: user1});. Then we have in Custody.delegateTokens: this = custody.address and msg.sender = user1, and it delegatecalls to HumanStandardToken transfer method. In HumanStandardToken.transfer we have this = custody.address and msg.sender = user1. Delegatecall do not change this nor msg.sender.
    – Ismael
    Commented Sep 26, 2017 at 3:02

0

Your Answer

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

Browse other questions tagged or ask your own question.