I'm currently deploying a transparent upgradeable proxy using hardhat deploy and OZ upgrades based on this comment. At the end of the deploy script, I'm transferring ownership of the ProxyAdmin to a guardian address:
await proxy.connect(deployer).grantRole(DEFAULT_ADMIN_ROLE, guardian.address); //Give admin role to guardian
await proxy.connect(guardian).revokeRole(DEFAULT_ADMIN_ROLE, deployer.address); //Revoke admin role from deployer
await upgrades.admin.transferProxyAdminOwnership(guardian.address); //Give Proxy Admin Ownership to guardian
However, when I try to transfer admin ownership again for test purposes:
I am getting the following error: 'Ownable: caller is not the owner'. I had a similar error when upgrading contracts with the new ProxyAdmin, but I fixed it using this solution. Unfortunately, I'm not sure how to apply that solution towards updating the ProxyAdmin. Any help is much appreciated!
When you call
upgrades.admin.transferProxyAdminOwnership(newOwner), that calls
transferOwnership(newOwner) to transfer the ownership of the ProxyAdmin contract itself, in your case from the deployer to
So to transfer the ownership a second time, you would need to use the
guardian account to invoke the
Gotcha. So in this case, I would have to directly use the instance of ProxyAdmin like:
const proxyAdminInstance = await upgrades.admin.getInstance();
Instead of just calling upgrades.admin.transferProxyAdminOwnership(Alice.address) a second time. Is there not a way to specify a different "from account" (instead of deployer) in the upgrades transferProxyAdminOwnership itself?
Is there not a way to specify a different "from account" (instead of deployer) in the upgrades transferProxyAdminOwnership itself?
There isn't, but
upgrades.transferProxyAdminOwnership is mainly doing the same thing as what you mentioned anyways.