When user creates a new DAO using the function MembershipFactory:createNewDaoMembership that creates a new TransparentUpgradeableProxy and the owner of that TransparentUpgradeableProxy is set as proxyAdmin , this proxy admin is also a ProxyAdmin contract , so it will block the upgrading functionality.
User can create a new DAO by calling the function MembershipFactory:createNewDaoMembership() and the parameter for the owner of this contract is passed as proxyAdmin which is a Openzeppelin's ProxyAdmin contract getting created in the constructor of the MembershipFactory contract with owner of that ProxyAdmin as the msg.sender.
If we look at the TransparentUpgradeableProxy constructor, using the initialOwner parameter the new ProxyAdmin is deployed, which is the owner of the TransparentUpgradeableProxy.
So let me explain this complex scenario,
=> Transparent Upgradeable Proxy which sets the admin as ProxyAdmin1 and the admin of the ProxyAdmin1 is ProxyAdmin2 and the owner or the admin of the ProxyAdmin2 is the deployer of the contract MembershipFactory.
So if user wanted to upgrade the implementation contract the call should be go like this
Deployer => ProxyAdmin2 => ProxyAdmin1 => Transparent Upgradeable Proxy
But this call is impossible as there is no way to call ProxyAdmin1 from ProxyAdmin2 contract as ProxyAdmin1 has only 1 function that is
And the function signature passed to the proxy is very different from the function signature used here , function called is upgradeToAndCall with 2 parameters while in ProxyAdmin the function upgradeToAndCall is taking 3 parameters so this call will not be made hence upgradation will not be able to take place.
TransparentUpgradeableProxy will not work breaking the core functionality of the protocol
Manually
Don't pass ProxyAdmin contract while initializing new TransparentUpgradeableProxy contract.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.