To create an upgradeable contract I have to use multiple proxies. The contract applies to Proxy A, then Proxy A applies to Proxy B. But delegatecall doesn't work in this case.
The simplified code of my contracts:
pragma solidity ^0.4.24;
contract A {
uint256 public value = 100;
function mul() public {
value *= 2;
}
}
contract B {
uint256 public value = 200;
address a;
constructor(address _a) {
a = _a;
}
function delegate() public {
a.delegatecall(bytes4(keccak256("mul()")));
}
}
contract C {
uint256 public value = 500;
address b;
constructor(address _b) {
b = _b;
}
function delegate() public {
b.delegatecall(bytes4(keccak256("delegate()")));
}
}
delegate()
function works only if it called at contract B
Thanks!