proposal-22-governance-and-.../test/TestProxyUpdated.sol

117 lines
5.4 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import { MockProposal } from "./MockProposal.sol";
import { console2 } from "@forge-std/console2.sol";
import { GovernancePatchUpgrade } from "@root/v4-patch/GovernancePatchUpgrade.sol";
contract TestProxyUpdating is MockProposal {
function isContract(address _addr) private view returns (bool) {
uint32 size;
assembly {
size := extcodesize(_addr)
}
return (size > 0);
}
function getAddressFromSlot(address _contract, bytes32 slot) internal view returns (address) {
bytes32 slotData = vm.load(_contract, slot);
return address(uint256(slotData));
}
function getUpgradeableProxyImplementationAddress(address proxy) internal view returns (address) {
bytes32 proxyImplementationSlot = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);
return getAddressFromSlot(proxy, proxyImplementationSlot);
}
function getRelayerRegistryImplementationAddress() internal view returns (address) {
return getUpgradeableProxyImplementationAddress(getRelayerRegistryProxyAddress());
}
function getStakingImplementationAddress() internal view returns (address) {
return getUpgradeableProxyImplementationAddress(getStakingProxyAddress());
}
function testGovernanceStakingProxyUpdated() public {
address stakingProxyAddressBeforeExecution = getStakingProxyAddress();
console2.log("Staking proxy address before proposal execution: %s", stakingProxyAddressBeforeExecution);
createAndExecuteProposal();
address stakingProxyAddressAfterExecution = getStakingProxyAddress();
console2.log("Staking proxy address after proposal execution: %s", stakingProxyAddressAfterExecution);
require(stakingProxyAddressBeforeExecution != stakingProxyAddressAfterExecution, "Staking proxy address didn't changed");
require(isContract(stakingProxyAddressAfterExecution));
}
function testGovernanceStakingImplementationUpdated() public {
address stakingImplementationAddressBeforeExecution = getStakingImplementationAddress();
console2.log("Staking implementation address before proposal execution: %s", stakingImplementationAddressBeforeExecution);
createAndExecuteProposal();
address stakingImplementationAddressAfterExecution = getStakingImplementationAddress();
console2.log("Staking implementation address after proposal execution: %s", stakingImplementationAddressAfterExecution);
require(
stakingImplementationAddressBeforeExecution != stakingImplementationAddressAfterExecution,
"Staking implementation address didn't changed"
);
require(isContract(stakingImplementationAddressAfterExecution));
}
function testRelayerRegistryImplementationUpdated() public {
address relayerRegistryImplementationAddressBeforeExecution = getRelayerRegistryImplementationAddress();
console2.log(
"Relayer registry implementation address before proposal execution: %s", relayerRegistryImplementationAddressBeforeExecution
);
createAndExecuteProposal();
address relayerRegistryImplementationAddressAfterExecution = getRelayerRegistryImplementationAddress();
console2.log(
"Relayer registry implementation address after proposal execution: %s", relayerRegistryImplementationAddressAfterExecution
);
require(
relayerRegistryImplementationAddressBeforeExecution != relayerRegistryImplementationAddressAfterExecution,
"Relayer registry implementation address didn't changed"
);
require(isContract(relayerRegistryImplementationAddressAfterExecution));
}
function testGovernanceImplementationUpdated() public {
address governanceImplementationAddressBeforeExecution = getUpgradeableProxyImplementationAddress(_governanceAddress);
console2.log("Governance implementation address before proposal execution: %s", governanceImplementationAddressBeforeExecution);
createAndExecuteProposal();
address governanceImplementationAddressAfterExecution = getUpgradeableProxyImplementationAddress(_governanceAddress);
console2.log("Governance implementation address after proposal execution: %s", governanceImplementationAddressAfterExecution);
require(
governanceImplementationAddressBeforeExecution != governanceImplementationAddressAfterExecution,
"Governance implementation address didn't changed"
);
require(isContract(governanceImplementationAddressAfterExecution));
}
function testRelayerRegistryProxyNotUpdated() public {
address relayerRegistryProxyAddressBeforeExecution = getRelayerRegistryProxyAddress();
console2.log("Relayer registry proxy before proposal execution: %s", relayerRegistryProxyAddressBeforeExecution);
createAndExecuteProposal();
address relayerRegistryProxyAddressAfterExecution = getRelayerRegistryProxyAddress();
console2.log("Relayer registry proxyafter proposal execution: %s", relayerRegistryProxyAddressAfterExecution);
require(
relayerRegistryProxyAddressBeforeExecution == relayerRegistryProxyAddressAfterExecution,
"Relayer registry proxy address changed"
);
}
}