delegate_call.sol 878 B

123456789101112131415161718192021222324252627282930313233
  1. // https://solidity-by-example.org/delegatecall/
  2. // SPDX-License-Identifier: MIT
  3. // pragma solidity ^0.8.17;
  4. // NOTE: Deploy this contract first
  5. contract Delegatee {
  6. // NOTE: storage layout must be the same as contract Delegator
  7. uint public num;
  8. address public sender;
  9. uint public value;
  10. function setVars(uint _num) public payable {
  11. num = _num;
  12. sender = msg.sender;
  13. value = msg.value;
  14. }
  15. }
  16. contract Delegator {
  17. uint public num;
  18. address public sender;
  19. uint public value;
  20. function setVars(address _contract, uint _num) public payable {
  21. // Delegatee's storage is set, Delegator is not modified.
  22. (bool success, bytes memory data) = _contract.delegatecall(
  23. abi.encodeWithSignature("setVars(uint256)", _num)
  24. );
  25. require(success);
  26. require(data.length == 0);
  27. }
  28. }