From 1573735ef4450d52cdfb00747a095127d3d734c3 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 30 Apr 2024 20:51:53 +0800 Subject: [PATCH] fix(protocol): remove L1/gov/ in favor of Aragon's (#16933) --- .../contracts/L1/gov/TaikoGovernor.sol | 164 ------------- .../L1/gov/TaikoTimelockController.sol | 27 --- .../script/AddSGXVerifierInstances.s.sol | 21 +- .../script/AuthorizeTaikoForMultihop.s.sol | 14 +- .../script/SetRemoteBridgeSuites.s.sol | 13 +- .../upgrade/UpgradeAddressManager.s.sol | 6 +- .../upgrade/UpgradeAssignmentHook.s.sol | 6 +- .../script/upgrade/UpgradeBridge.s.sol | 6 +- .../script/upgrade/UpgradeERC1155Vault.s.sol | 6 +- .../script/upgrade/UpgradeERC20Vault.s.sol | 6 +- .../script/upgrade/UpgradeERC721Vault.s.sol | 6 +- .../upgrade/UpgradeGuardianProver.s.sol | 6 +- .../script/upgrade/UpgradeScript.s.sol | 19 +- .../script/upgrade/UpgradeSignalService.s.sol | 6 +- .../script/upgrade/UpgradeTaikoGovernor.s.sol | 17 -- .../script/upgrade/UpgradeTaikoL1.s.sol | 6 +- .../script/upgrade/UpgradeTierProvider.s.sol | 38 +-- .../upgrade/UpgradeTimelockController.s.sol | 17 -- .../protocol/test/L1/gov/TaikoGovernor.t.sol | 222 ------------------ 19 files changed, 23 insertions(+), 583 deletions(-) delete mode 100644 packages/protocol/contracts/L1/gov/TaikoGovernor.sol delete mode 100644 packages/protocol/contracts/L1/gov/TaikoTimelockController.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeTaikoGovernor.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeTimelockController.s.sol delete mode 100644 packages/protocol/test/L1/gov/TaikoGovernor.t.sol diff --git a/packages/protocol/contracts/L1/gov/TaikoGovernor.sol b/packages/protocol/contracts/L1/gov/TaikoGovernor.sol deleted file mode 100644 index b8a0082b980..00000000000 --- a/packages/protocol/contracts/L1/gov/TaikoGovernor.sol +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import - "@openzeppelin/contracts-upgradeable/governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol"; -import - "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import - "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorSettingsUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; - -/// @title TaikoGovernor -/// @custom:security-contact security@taiko.xyz -contract TaikoGovernor is - Ownable2StepUpgradeable, - GovernorCompatibilityBravoUpgradeable, - GovernorSettingsUpgradeable, - GovernorVotesQuorumFractionUpgradeable, - GovernorTimelockControlUpgradeable -{ - uint256[50] private __gap; - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _token The Taiko token. - /// @param _timelock The timelock contract address. - function init( - address _owner, - IVotesUpgradeable _token, - TimelockControllerUpgradeable _timelock - ) - external - initializer - { - _transferOwnership(_owner == address(0) ? msg.sender : _owner); - __Governor_init("TaikoGovernor"); - __GovernorVotes_init(_token); - __GovernorSettings_init(7200, 50_400, 100_000 ether); // Values respectively: 1day, 1week, - // 0.01% of Taiko Token; - __GovernorVotesQuorumFraction_init(4); - __GovernorTimelockControl_init(_timelock); - } - - /// @dev See {IGovernor-propose} - function propose( - address[] memory _targets, - uint256[] memory _values, - bytes[] memory _calldatas, - string memory _description - ) - public - override(IGovernorUpgradeable, GovernorUpgradeable, GovernorCompatibilityBravoUpgradeable) - returns (uint256) - { - return super.propose(_targets, _values, _calldatas, _description); - } - - /// @dev See {GovernorUpgradeable-supportsInterface} - function supportsInterface(bytes4 _interfaceId) - public - view - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable, IERC165Upgradeable) - returns (bool) - { - return super.supportsInterface(_interfaceId); - } - - /// @dev See {GovernorUpgradeable-state} - function state(uint256 _proposalId) - public - view - override(IGovernorUpgradeable, GovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (ProposalState) - { - return super.state(_proposalId); - } - - /// @notice How long after a proposal is created should voting power be fixed. A - /// large voting delay gives users time to unstake tokens if necessary. - /// @return The duration of the voting delay. - function votingDelay() - public - view - override(IGovernorUpgradeable, GovernorSettingsUpgradeable) - returns (uint256) - { - return super.votingDelay(); - } - - /// @notice How long does a proposal remain open to votes. - /// @return The duration of the voting period. - function votingPeriod() - public - view - override(IGovernorUpgradeable, GovernorSettingsUpgradeable) - returns (uint256) - { - return super.votingPeriod(); - } - - /// @notice The number of votes required in order for a voter to become a proposer. - /// @return The number of votes required. - function proposalThreshold() - public - view - override(GovernorUpgradeable, GovernorSettingsUpgradeable) - returns (uint256) - { - return super.proposalThreshold(); - } - - /// @dev Cancel a proposal with GovernorBravo logic. - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) - public - virtual - override(IGovernorUpgradeable, GovernorUpgradeable, GovernorCompatibilityBravoUpgradeable) - returns (uint256) - { - return GovernorCompatibilityBravoUpgradeable.cancel( - targets, values, calldatas, descriptionHash - ); - } - - function _execute( - uint256 _proposalId, - address[] memory _targets, - uint256[] memory _values, - bytes[] memory _calldatas, - bytes32 _descriptionHash - ) - internal - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) - { - return super._execute(_proposalId, _targets, _values, _calldatas, _descriptionHash); - } - - function _cancel( - address[] memory _targets, - uint256[] memory _values, - bytes[] memory _calldatas, - bytes32 _descriptionHash - ) - internal - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (uint256) - { - return super._cancel(_targets, _values, _calldatas, _descriptionHash); - } - - function _executor() - internal - view - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (address) - { - return super._executor(); - } -} diff --git a/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol b/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol deleted file mode 100644 index 0b1b9cbe2a3..00000000000 --- a/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol"; -import "../../common/EssentialContract.sol"; - -/// @title TaikoTimelockController -/// @custom:security-contact security@taiko.xyz -contract TaikoTimelockController is EssentialContract, TimelockControllerUpgradeable { - uint256[50] private __gap; - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _minDelay The minimal delay. - function init(address _owner, uint256 _minDelay) external initializer { - __Essential_init(_owner); - address[] memory nil = new address[](0); - __TimelockController_init(_minDelay, nil, nil, owner()); - } - - /// @dev Gets the minimum delay for an operation to become valid, allows the admin to get around - /// of the min delay. - /// @return The minimum delay. - function getMinDelay() public view override returns (uint256) { - return hasRole(TIMELOCK_ADMIN_ROLE, msg.sender) ? 0 : super.getMinDelay(); - } -} diff --git a/packages/protocol/script/AddSGXVerifierInstances.s.sol b/packages/protocol/script/AddSGXVerifierInstances.s.sol index de8c02d4ad1..a4abb02152f 100644 --- a/packages/protocol/script/AddSGXVerifierInstances.s.sol +++ b/packages/protocol/script/AddSGXVerifierInstances.s.sol @@ -2,12 +2,10 @@ pragma solidity 0.8.24; import "../test/DeployCapability.sol"; -import "../contracts/L1/gov/TaikoTimelockController.sol"; import "../contracts/verifiers/SgxVerifier.sol"; contract AddSGXVerifierInstances is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public timelockAddress = vm.envAddress("TIMELOCK_ADDRESS"); address public sgxVerifier = vm.envAddress("SGX_VERIFIER"); address[] public instances = vm.envAddress("INSTANCES", ","); @@ -16,27 +14,14 @@ contract AddSGXVerifierInstances is DeployCapability { vm.startBroadcast(privateKey); - updateInstancesByTimelock(timelockAddress); - - vm.stopBroadcast(); - } - - function updateInstancesByTimelock(address timelock) internal { - bytes32 salt = bytes32(block.timestamp); - - bytes memory payload = - abi.encodeWithSelector(bytes4(keccak256("addInstances(address[])")), instances); - - TaikoTimelockController timelockController = TaikoTimelockController(payable(timelock)); - - timelockController.schedule(sgxVerifier, 0, payload, bytes32(0), salt, 0); - - timelockController.execute(sgxVerifier, 0, payload, bytes32(0), salt); + SgxVerifier(sgxVerifier).addInstances(instances); for (uint256 i; i < instances.length; ++i) { console2.log("New instance added:"); console2.log("index: ", i); console2.log("instance: ", instances[0]); } + + vm.stopBroadcast(); } } diff --git a/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol b/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol index 5929e4e0ac3..322d83de801 100644 --- a/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol +++ b/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol @@ -2,13 +2,11 @@ pragma solidity 0.8.24; import "../test/DeployCapability.sol"; -import "../contracts/L1/gov/TaikoTimelockController.sol"; import "../contracts/signal/SignalService.sol"; contract AuthorizeTaikoForMultihop is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); address public sharedSignalService = vm.envAddress("SHARED_SIGNAL_SERVICE"); - address public timelockAddress = vm.envAddress("TIMELOCK_ADDRESS"); // TaikoL1 and TaikoL2 contracts address[] public taikoContracts = vm.envAddress("TAIKO_CONTRACTS", ","); @@ -16,18 +14,8 @@ contract AuthorizeTaikoForMultihop is DeployCapability { require(taikoContracts.length != 0, "invalid taiko contracts"); vm.startBroadcast(privateKey); - for (uint256 i; i < taikoContracts.length; ++i) { - bytes32 salt = bytes32(block.timestamp); - - bytes memory payload = - abi.encodeCall(SignalService.authorize, (taikoContracts[i], true)); - - TaikoTimelockController timelock = TaikoTimelockController(payable(timelockAddress)); - - timelock.schedule(sharedSignalService, 0, payload, bytes32(0), salt, 0); - - timelock.execute(sharedSignalService, 0, payload, bytes32(0), salt); + SignalService(sharedSignalService).authorize(taikoContracts[i], true); } vm.stopBroadcast(); diff --git a/packages/protocol/script/SetRemoteBridgeSuites.s.sol b/packages/protocol/script/SetRemoteBridgeSuites.s.sol index ff19ac02b58..a851ff77152 100644 --- a/packages/protocol/script/SetRemoteBridgeSuites.s.sol +++ b/packages/protocol/script/SetRemoteBridgeSuites.s.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.24; import "../test/DeployCapability.sol"; -import "../contracts/L1/gov/TaikoTimelockController.sol"; contract SetRemoteBridgeSuites is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); @@ -75,17 +74,7 @@ contract SetRemoteBridgeSuites is DeployCapability { ) internal { - bytes32 salt = bytes32(block.timestamp); - - bytes memory payload = - abi.encodeCall(AddressManager.setAddress, (chainId, bytes32(bytes(name)), addr)); - - TaikoTimelockController timelock = TaikoTimelockController(payable(timelockAddress)); - - timelock.schedule(registerTo, 0, payload, bytes32(0), salt, 0); - - timelock.execute(registerTo, 0, payload, bytes32(0), salt); - + AddressManager(registerTo).setAddress(chainId, bytes32(bytes(name)), addr); console2.log("> ", name, "@", registerTo); console2.log("\t addr : ", addr); } diff --git a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol b/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol index 829ff2590ef..c62a98e6035 100644 --- a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol +++ b/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeAddressManager is UpgradeScript { function run() external setUp { - console2.log("upgrading AddressManager"); - AddressManager newAddressManager = new AddressManager(); - upgrade(address(newAddressManager)); - - console2.log("upgraded AddressManager to", address(newAddressManager)); + upgrade("AddressManager", address(new AddressManager())); } } diff --git a/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol b/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol index f48779bf9b5..6532fd8278a 100644 --- a/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol +++ b/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeAssignmentHook is UpgradeScript { function run() external setUp { - console2.log("upgrading AssignmentHook"); - AssignmentHook newAssignmentHook = new AssignmentHook(); - upgrade(address(newAssignmentHook)); - - console2.log("upgraded AssignmentHook to", address(newAssignmentHook)); + upgrade("AssignmentHook", address(new AssignmentHook())); } } diff --git a/packages/protocol/script/upgrade/UpgradeBridge.s.sol b/packages/protocol/script/upgrade/UpgradeBridge.s.sol index 9c1ac14e6ee..37459f216e8 100644 --- a/packages/protocol/script/upgrade/UpgradeBridge.s.sol +++ b/packages/protocol/script/upgrade/UpgradeBridge.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeBridge is UpgradeScript { function run() external setUp { - console2.log("upgrading bridge"); - Bridge newBridge = new Bridge(); - upgrade(address(newBridge)); - - console2.log("upgraded bridge to", address(newBridge)); + upgrade("Bridge", address(new Bridge())); } } diff --git a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol index c819962080f..5813f4e58cc 100644 --- a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol +++ b/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeERC1155Vault is UpgradeScript { function run() external setUp { - console2.log("upgrading ERC1155Vault"); - ERC1155Vault newERC1155Vault = new ERC1155Vault(); - upgrade(address(newERC1155Vault)); - - console2.log("upgraded ERC1155Vault to", address(newERC1155Vault)); + upgrade("ERC1155Vault", address(new ERC1155Vault())); } } diff --git a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol index f4672413587..33a65c20e02 100644 --- a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol +++ b/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeERC20Vault is UpgradeScript { function run() external setUp { - console2.log("upgrading ERC20Vault"); - ERC20Vault newERC20Vault = new ERC20Vault(); - upgrade(address(newERC20Vault)); - - console2.log("upgraded ERC20Vault to", address(newERC20Vault)); + upgrade("ERC20Vault", address(new ERC20Vault())); } } diff --git a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol index 406773cec6c..84cbdcaf9eb 100644 --- a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol +++ b/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeERC721Vault is UpgradeScript { function run() external setUp { - console2.log("upgrading ERC721Vault"); - ERC721Vault newERC721Vault = new ERC721Vault(); - upgrade(address(newERC721Vault)); - - console2.log("upgraded ERC721Vault to", address(newERC721Vault)); + upgrade("ERC721Vault", address(new ERC721Vault())); } } diff --git a/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol b/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol index cce9a7136bb..e86523e49d0 100644 --- a/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol +++ b/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeGuardianProver is UpgradeScript { function run() external setUp { - console2.log("upgrading GuardianProver"); - GuardianProver newGuardianProver = new GuardianProver(); - upgrade(address(newGuardianProver)); - - console2.log("upgraded GuardianProver to", address(newGuardianProver)); + upgrade("GuardianProver", address(new GuardianProver())); } } diff --git a/packages/protocol/script/upgrade/UpgradeScript.s.sol b/packages/protocol/script/upgrade/UpgradeScript.s.sol index fa6d833290e..3a5d70c18e1 100644 --- a/packages/protocol/script/upgrade/UpgradeScript.s.sol +++ b/packages/protocol/script/upgrade/UpgradeScript.s.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.24; -import "../../contracts/L1/gov/TaikoTimelockController.sol"; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import "forge-std/src/console2.sol"; @@ -9,20 +8,15 @@ import "forge-std/src/Script.sol"; contract UpgradeScript is Script { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public timelockAddress = vm.envAddress("TIMELOCK_ADDRESS"); address public proxyAddress = vm.envAddress("PROXY_ADDRESS"); UUPSUpgradeable proxy; - TaikoTimelockController timelock; modifier setUp() { require(privateKey != 0, "PRIVATE_KEY not set"); require(proxyAddress != address(0), "PROXY_ADDRESS not set"); - require(timelockAddress != address(0), "TIMELOCK_ADDRESS not set"); proxy = UUPSUpgradeable(payable(proxyAddress)); - timelock = TaikoTimelockController(payable(timelockAddress)); - vm.startBroadcast(privateKey); _; @@ -30,14 +24,9 @@ contract UpgradeScript is Script { vm.stopBroadcast(); } - function upgrade(address newImpl) public { - bytes32 salt = bytes32(block.timestamp); - - bytes memory payload = - abi.encodeWithSelector(bytes4(keccak256("upgradeTo(address)")), newImpl); - - timelock.schedule(address(proxy), 0, payload, bytes32(0), salt, 0); - - timelock.execute(address(proxy), 0, payload, bytes32(0), salt); + function upgrade(string memory name, address newImpl) public { + console2.log("Upgrading", name, proxyAddress); + proxy.upgradeTo(newImpl); + console2.log("Upgraded", proxyAddress, "to", newImpl); } } diff --git a/packages/protocol/script/upgrade/UpgradeSignalService.s.sol b/packages/protocol/script/upgrade/UpgradeSignalService.s.sol index 0f5271865a3..258b8a8add5 100644 --- a/packages/protocol/script/upgrade/UpgradeSignalService.s.sol +++ b/packages/protocol/script/upgrade/UpgradeSignalService.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeSignalService is UpgradeScript { function run() external setUp { - console2.log("upgrading SignalService"); - SignalService newSignalService = new SignalService(); - upgrade(address(newSignalService)); - - console2.log("upgraded SignalService to", address(newSignalService)); + upgrade("SignalService", address(new SignalService())); } } diff --git a/packages/protocol/script/upgrade/UpgradeTaikoGovernor.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoGovernor.s.sol deleted file mode 100644 index 18cf211336e..00000000000 --- a/packages/protocol/script/upgrade/UpgradeTaikoGovernor.s.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/gov/TaikoGovernor.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeTaikoGovernor is UpgradeScript { - function run() external setUp { - console2.log("upgrading TaikoGovernor"); - TaikoGovernor newTaikoGovernor = new TaikoGovernor(); - upgrade(address(newTaikoGovernor)); - - console2.log("upgraded TaikoGovernor to", address(newTaikoGovernor)); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol index b142466aca1..6f9b7bfd5be 100644 --- a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol +++ b/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol @@ -8,10 +8,6 @@ import "./UpgradeScript.s.sol"; contract UpgradeTaikoL1 is UpgradeScript { function run() external setUp { - console2.log("upgrading TaikoL1"); - TaikoL1 newTaikoL1 = new TaikoL1(); - upgrade(address(newTaikoL1)); - - console2.log("upgraded TaikoL1 to", address(newTaikoL1)); + upgrade("TaikoL1", address(new TaikoL1())); } } diff --git a/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol b/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol index 2d9082876c8..0908967e2c5 100644 --- a/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol +++ b/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol @@ -2,47 +2,19 @@ pragma solidity 0.8.24; import "../../test/DeployCapability.sol"; -import "../../contracts/L1/gov/TaikoTimelockController.sol"; import "../../contracts/L1/tiers/ITierProvider.sol"; import "../../contracts/L1/tiers/TierProviderV1.sol"; contract UpgradeTierProvider is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public timelockAddress = vm.envAddress("TIMELOCK_ADDRESS"); - address public addressManagerAddress = vm.envAddress("ADDRESS_MANAGER_ADDRESS"); + address public addressManager = vm.envAddress("ADDRESS_MANAGER_ADDRESS"); function run() external { vm.startBroadcast(privateKey); - - ITierProvider newTierProvider = new TierProviderV1(); - - registerByTimelock( - addressManagerAddress, "tier_provider", address(newTierProvider), uint64(block.chainid) - ); - + address impl = address(new TierProviderV1()); + AddressManager(addressManager).setAddress(uint64(block.chainid), "tier_provider", impl); vm.stopBroadcast(); - } - - function registerByTimelock( - address registerTo, - string memory name, - address addr, - uint64 chainId - ) - internal - { - bytes32 salt = bytes32(block.timestamp); - - bytes memory payload = - abi.encodeCall(AddressManager.setAddress, (chainId, bytes32(bytes(name)), addr)); - - TaikoTimelockController timelock = TaikoTimelockController(payable(timelockAddress)); - - timelock.schedule(registerTo, 0, payload, bytes32(0), salt, 0); - - timelock.execute(registerTo, 0, payload, bytes32(0), salt); - - console2.log("> ", name, "@", registerTo); - console2.log("\t addr : ", addr); + console2.log("> tier_provider@", addressManager); + console2.log("\t addr : ", impl); } } diff --git a/packages/protocol/script/upgrade/UpgradeTimelockController.s.sol b/packages/protocol/script/upgrade/UpgradeTimelockController.s.sol deleted file mode 100644 index 2dc1430f806..00000000000 --- a/packages/protocol/script/upgrade/UpgradeTimelockController.s.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/gov/TaikoTimelockController.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeTaikoTimelockController is UpgradeScript { - function run() external setUp { - console2.log("upgrading TaikoTimelockController"); - TaikoTimelockController newTaikoTimelockController = new TaikoTimelockController(); - upgrade(address(newTaikoTimelockController)); - - console2.log("upgraded TaikoTimelockController to", address(newTaikoTimelockController)); - } -} diff --git a/packages/protocol/test/L1/gov/TaikoGovernor.t.sol b/packages/protocol/test/L1/gov/TaikoGovernor.t.sol deleted file mode 100644 index e9a42b57de1..00000000000 --- a/packages/protocol/test/L1/gov/TaikoGovernor.t.sol +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoL1TestBase.sol"; -import "../../../contracts/L1/gov/TaikoGovernor.sol"; -import "../../../contracts/L1/gov/TaikoTimelockController.sol"; -import "@openzeppelin/contracts/governance/IGovernor.sol"; -import "@openzeppelin/contracts/governance/TimelockController.sol"; - -/// @author Kirk Baird -contract TestTaikoGovernor is TaikoL1TestBase { - TaikoGovernor public taikoGovernor; - TaikoTimelockController public taikoTimelockController; - - function deployTaikoL1() internal override returns (TaikoL1) { - return - TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); - } - - function setUp() public override { - // Call the TaikoL1TestBase setUp() - super.setUp(); - - // deploy TaikoTimelockController - taikoTimelockController = TaikoTimelockController( - payable(address(new ERC1967Proxy(address(new TaikoTimelockController()), ""))) - ); - - // init TaikoTimelockController - uint256 minDelay = 0.5 days; - taikoTimelockController.init(address(0), minDelay); - - // deploy TaikoGovernor - - taikoGovernor = - TaikoGovernor(payable(address(new ERC1967Proxy(address(new TaikoGovernor()), "")))); - - // init TaikoGovernor - taikoGovernor.init(address(0), tko, taikoTimelockController); - // Alice delegate voting power to self - vm.startPrank(Alice); - tko.delegate(Alice); - vm.stopPrank(); - - address owner = taikoTimelockController.owner(); - vm.startPrank(owner); - // Owner set access controls for timelock controller - taikoTimelockController.grantRole( - taikoTimelockController.PROPOSER_ROLE(), address(taikoGovernor) - ); - taikoTimelockController.grantRole( - taikoTimelockController.EXECUTOR_ROLE(), address(taikoGovernor) - ); - taikoTimelockController.grantRole( - taikoTimelockController.CANCELLER_ROLE(), address(taikoGovernor) - ); - - // Owner delegate voting power to self - tko.delegate(owner); - - // Transfer Alice double the proposal threshold worth of tokens - uint256 proposalThreshold = taikoGovernor.proposalThreshold(); - tko.transfer(Alice, proposalThreshold * 2); - tko.transfer(Bob, proposalThreshold * 5); - vm.roll(block.number + 1); // increase block number to help facilitate snapshots in - // TaikoToken - - vm.stopPrank(); - } - - function test_init() public { - // GovernorVotesQuorumFractionUpgradeable - assertEq(taikoGovernor.quorumNumerator(), 4, "Incorrect initial quorum numerator"); - assertEq( - taikoGovernor.quorumNumerator(block.number), - 4, - "Incorrect initial block quorum numerator" - ); - assertEq(taikoGovernor.quorumDenominator(), 100, "Incorrect quorum denominator"); - - // GovernorUpgradeable - assertEq(taikoGovernor.name(), "TaikoGovernor", "Incorrect name"); - assertEq(taikoGovernor.version(), "1", "Incorrect version"); - - // GovernorVotesUpgradeable - assertEq(address(taikoGovernor.token()), address(tko), "Incorrect token"); - - // GovernorCompatibilityBravoUpgradeable - assertEq( - taikoGovernor.COUNTING_MODE(), "support=bravo&quorum=bravo", "Incorrect counting mode" - ); - - // GovernorTimelockControlUpgradeable - assertEq(taikoGovernor.timelock(), address(taikoTimelockController), "Incorrect timelock"); - - // Interfaces - assertEq( - taikoGovernor.supportsInterface(type(IGovernorTimelockUpgradeable).interfaceId), - true, - "Incorrect supports interface" - ); - assertEq( - taikoGovernor.supportsInterface(type(IERC1155ReceiverUpgradeable).interfaceId), - true, - "Incorrect supports interface" - ); - - // TaikoGovernor - assertEq(taikoGovernor.votingDelay(), 7200, "Incorrect voting delay"); - assertEq(taikoGovernor.votingPeriod(), 50_400, "Incorrect voting period"); - assertEq(taikoGovernor.proposalThreshold(), 100_000 ether, "Incorrect proposal threshold"); - } - - // Tests `propose()` - function test_propose() public { - // Parameters for `TaikoGovernor.propose()` - address[] memory targets = new address[](1); - targets[0] = Alice; - - uint256[] memory values = new uint256[](1); - values[0] = 1 ether; - - bytes[] memory calldatas = new bytes[](1); - - string memory description = "Send alice an ether"; - - address proposer = Alice; - vm.startPrank(proposer); - - // Prepare for event emission - uint256 startBlock = block.number + taikoGovernor.votingDelay(); - uint256 endBlock = startBlock + taikoGovernor.votingPeriod(); - uint256 calculatedProposalId = - taikoGovernor.hashProposal(targets, values, calldatas, keccak256(bytes(description))); - - vm.expectEmit(true, true, true, true); - emit IGovernor.ProposalCreated( - calculatedProposalId, - Alice, - targets, - values, - new string[](targets.length), - calldatas, - startBlock, - endBlock, - description - ); - - // `propose()` - uint256 proposalId = taikoGovernor.propose(targets, values, calldatas, description); - vm.stopPrank(); - - // Validate proposal - assertEq(proposalId, calculatedProposalId, "Proposal does not have the correct ID"); - assertEq( - taikoGovernor.state(proposalId) == IGovernorUpgradeable.ProposalState.Pending, - true, - "Incorrect proposal state" - ); - assertEq( - taikoGovernor.proposalSnapshot(proposalId), startBlock, "Incorrect proposal snapshot" - ); - assertEq( - taikoGovernor.proposalDeadline(proposalId), endBlock, "Incorrect proposal deadline" - ); - } - - // Tests `castVote()`, `queue()` and `execute()` - function test_execute() public { - // Parameters for `propose()` - address proposer = Alice; - address[] memory targets = new address[](1); - targets[0] = Alice; - uint256[] memory values = new uint256[](1); - values[0] = 1 ether; - bytes[] memory calldatas = new bytes[](1); - string memory description = "Send alice an ether"; - bytes32 descriptionHash = keccak256(bytes(description)); - - // Send the values to the timelock controller for execute - (bool success,) = address(taikoTimelockController).call{ value: values[0] }(""); - - assertEq(success, true, "Transfer funds unsuccessful"); - - // `propose()` - vm.startPrank(proposer); - uint256 proposalId = taikoGovernor.propose(targets, values, calldatas, description); - vm.stopPrank(); - - // Skip to voting start - uint256 startBlock = taikoGovernor.proposalSnapshot(proposalId); - vm.roll(startBlock + 1); - - // `castVote()` - vm.startPrank(tko.owner()); - taikoGovernor.castVote(proposalId, 1); // 1 = for - - // Skip to voting end - uint256 endBlock = taikoGovernor.proposalDeadline(proposalId); - vm.roll(endBlock + 1); - - // `queue()` successful proposal - taikoGovernor.queue(proposalId); - - // Skip delay amount of time - uint256 eta = taikoGovernor.proposalEta(proposalId); - vm.warp(eta + 1); - - // Prepare execute event - bytes32 timelockId = taikoTimelockController.hashOperationBatch( - targets, values, calldatas, 0, descriptionHash - ); - vm.expectEmit(true, true, true, true); - emit TimelockController.CallExecuted(timelockId, 0, targets[0], values[0], calldatas[0]); - - // `execute()` - // taikoGovernor.execute(targets, values, calldatas, descriptionHash); - taikoGovernor.execute(proposalId); - - vm.stopPrank(); - } -}