Please look into the following 3 contracts:
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.7;
contract implementationProxy {
uint public a;
uint public b;
address owner;
address implementation;
constructor() {
owner = msg.sender;
}
function implementationAdd(address _add) external {
require(msg.sender == owner, "Not allowed");
implementation = _add;
}
fallback() payable external {
implementation.delegatecall(msg.data);
}
}
contract Implementation {
uint public a;
uint public b;
function setVar(uint _a, uint _b) external {
a= _a;
b= _b;
}
function add() external view returns (uint) {
return a+b;
}
}
contract User {
function varChange(address _add, uint _a, uint _b) external {
_add.call(
abi.encodeWithSelector(
bytes4(keccak256("setVar(uint256, uint256)")), _a, _b
)
);
}
}
implementationProxy
has a function implementationAdd(address _add)
that takes input of deployed Implementation
contract.
The User
contract calls a function that triggers fallback in implementationProxy
(the address _add
in varChange()
is of implementationProxy
)
So ideally the state variables a and b must change in implementationProxy
as it delegates call to Implementation
. But the state variables are unchanged.
Can anyone help me find out my mistake please?