pragma solidity ^0.8.20;
contract ContractCall {
address public owner;
uint256 public num;
address public lib;
constructor() {
owner = msg.sender;
}
function setLibAddress(address _Lib) public {
lib = _Lib;
}
function nowOwner() public view returns (address) {
return owner;
}
function callDelegate(uint256 _num) public payable returns (bool)
{
(bool success, ) = lib.delegatecall(abi.encodeWithSignature("changeOwner(uint256)", _num));
return success;
}
}
pragma solidity ^0.8.20;
contract ChangeOwner {
address public owner;
uint256 public num;
function changeOwner(uint256 _num) public {
owner = msg.sender;
num = _num;
}
}
각각 deploy 후 setLibAddress에 ChangeOwner 컨트랙트의 주소를 넣고 callDelegate를 호출하면 num 및 owner가 변경된다.
주의할 점은 변수의 순서가 일치하여야 한다.
만약 아래와 같이 코딩했다면, ContractCall의 owner에는 num, num에는 owner가 저장된다.
contract ContractCall {
address public owner;
uint256 public num;
address public lib;
contract ChangeOwner {
uint256 public num;
address public owner;