Skip to content

Commit

Permalink
script: add mainnet proposal
Browse files Browse the repository at this point in the history
  • Loading branch information
nxqbao committed Jul 26, 2024
1 parent 3d2d429 commit 75d51da
Show file tree
Hide file tree
Showing 8 changed files with 261 additions and 202 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,39 +25,37 @@ import "@ronin/script/contracts/RoninBridgeManagerDeploy.s.sol";

import "../Migration.s.sol";

contract Migration__20240716_DeployRoninBridgeManagerHelper is Migration {
abstract contract Migration__20240716_DeployRoninBridgeManagerHelper is Migration {
using LibProxy for *;

RoninBridgeManager _newRoninBridgeManager;

function _deployRoninBridgeManager() internal returns (RoninBridgeManager) {
address currRoninBridgeManager = config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key());
console.log(currRoninBridgeManager);
console.log("Current Ronin Bridge Manager:", currRoninBridgeManager);

ISharedArgument.SharedParameter memory param;

param.roninBridgeManager.num = 7;
param.roninBridgeManager.denom = 10;
param.roninBridgeManager.roninChainId = block.chainid;
param.roninBridgeManager.expiryDuration = 60 * 60 * 24 * 14; // 14 days
param.roninBridgeManager.bridgeContract = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key());
param.roninBridgeManager.bridgeOperators = new address[](4);
param.roninBridgeManager.bridgeOperators[0] = 0x2e82D2b56f858f79DeeF11B160bFC4631873da2B;
param.roninBridgeManager.bridgeOperators[1] = 0xBcb61783dd2403FE8cC9B89B27B1A9Bb03d040Cb;
param.roninBridgeManager.bridgeOperators[2] = 0xB266Bf53Cf7EAc4E2065A404598DCB0E15E9462c;
param.roninBridgeManager.bridgeOperators[3] = 0xcc5Fc5B6c8595F56306Da736F6CD02eD9141C84A;

param.roninBridgeManager.governors = new address[](4);
param.roninBridgeManager.governors[0] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa;
param.roninBridgeManager.governors[1] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26;
param.roninBridgeManager.governors[2] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9;
param.roninBridgeManager.governors[3] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F;

param.roninBridgeManager.voteWeights = new uint96[](4);
param.roninBridgeManager.voteWeights[0] = 100;
param.roninBridgeManager.voteWeights[1] = 100;
param.roninBridgeManager.voteWeights[2] = 100;
param.roninBridgeManager.voteWeights[3] = 100;
{
(address[] memory currGovernors, address[] memory currOperators, uint96[] memory currWeights) = RoninBridgeManager(currRoninBridgeManager).getFullBridgeOperatorInfos();

param.roninBridgeManager.num = 7;
param.roninBridgeManager.denom = 10;
param.roninBridgeManager.roninChainId = block.chainid;
param.roninBridgeManager.expiryDuration = 60 * 60 * 24 * 14; // 14 days
param.roninBridgeManager.bridgeContract = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key());

uint totalCurrGovernors = currGovernors.length;
param.roninBridgeManager.bridgeOperators = new address[](totalCurrGovernors);
param.roninBridgeManager.governors = new address[](totalCurrGovernors);
param.roninBridgeManager.voteWeights = new uint96[](totalCurrGovernors);

for (uint i = 0; i < totalCurrGovernors; i++) {
param.roninBridgeManager.bridgeOperators[i] = currOperators[i];
param.roninBridgeManager.governors[i] = currGovernors[i];
param.roninBridgeManager.voteWeights[i] = currWeights[i];
}
}

param.roninBridgeManager.targetOptions = new GlobalProposal.TargetOption[](5);
param.roninBridgeManager.targetOptions[0] = GlobalProposal.TargetOption.GatewayContract;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import { console2 as console } from "forge-std/console2.sol";
import { ISharedArgument } from "../interfaces/ISharedArgument.sol";
import { Migration } from "../Migration.s.sol";
import { Contract } from "../utils/Contract.sol";
import { WBTC } from "src/tokens/erc20/WBTC.sol";

abstract contract Migration__20240716_DeployWBTC_Helper is Migration {
function _deployWBTC() internal {
WBTC instance = WBTC(_deployImmutable(Contract.WBTC.key()));
console.log("WBTC deployed at:", address(instance));
}
}
10 changes: 7 additions & 3 deletions script/20240716-upgrade-v3.2.0-mainnet/20240716-helper.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ struct LegacyProposalDetail {
}

contract Migration__20240716_Helper is Migration {
address internal _governor;
address internal _proposer;
address[] internal _voters;

RoninBridgeManager internal _currRoninBridgeManager;

function _helperProposeForCurrentNetwork(LegacyProposalDetail memory proposal) internal {
vm.broadcast(_governor);
vm.broadcast(_proposer);
address(_currRoninBridgeManager).call(
abi.encodeWithSignature(
"proposeProposalForCurrentNetwork(uint256,address[],uint256[],bytes[],uint256[],uint8)",
Expand All @@ -37,7 +37,11 @@ contract Migration__20240716_Helper is Migration {

function _helperVoteForCurrentNetwork(LegacyProposalDetail memory proposal) internal {
for (uint i; i < _voters.length - 1; ++i) {
vm.broadcast(_voters[i]);
if (_voters[i] == _proposer) {
continue;
}

vm.prank(_voters[i]);
address(_currRoninBridgeManager).call{ gas: (proposal.targets.length + 1) * 1_000_000 }(
abi.encodeWithSignature(
"castProposalVoteForCurrentNetwork((uint256,uint256,uint256,address[],uint256[],bytes[],uint256[]),uint8)", proposal, Ballot.VoteType.For
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import { Migration } from "../Migration.s.sol";
import { Contract } from "../utils/Contract.sol";
import { WBTC } from "src/tokens/erc20/WBTC.sol";

contract Migration__20240716_P1_1_DeployWBTC is Migration {
import "./20240716-deploy-wbtc-helper.s.sol";

contract Migration__20240716_P1_1_DeployWBTC is Migration__20240716_DeployWBTC_Helper {
function _defaultArguments() internal virtual override returns (bytes memory) {
ISharedArgument.WBTCParam memory param = config.sharedArguments().wbtc;
return abi.encode(param.gateway, param.pauser);
}

function run() public returns (WBTC instance) {
instance = WBTC(_deployImmutable(Contract.WBTC.key()));
_deployWBTC();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { console2 } from "forge-std/console2.sol";
import { StdStyle } from "forge-std/StdStyle.sol";
import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol";
import { IMainchainGatewayV3 } from "@ronin/contracts/interfaces/IMainchainGatewayV3.sol";
import { IRoninGatewayV3 } from "@ronin/contracts/interfaces/IRoninGatewayV3.sol";
import { MinimumWithdrawal } from "@ronin/contracts/extensions/MinimumWithdrawal.sol";
import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol";
import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol";
import { Contract } from "../utils/Contract.sol";
Expand All @@ -24,8 +26,9 @@ import "@ronin/script/contracts/RoninBridgeManagerDeploy.s.sol";
import { DefaultContract } from "@fdk/utils/DefaultContract.sol";
import "./20240716-deploy-bridge-manager-helper.s.sol";
import "./20240716-helper.s.sol";
import "./wbtc-threshold.s.sol";

contract Migration__20240716_P2_UpgradeBridgeRoninchain is Migration__20240716_Helper, Migration__20240716_DeployRoninBridgeManagerHelper {
contract Migration__20240716_P2_UpgradeBridgeRoninchain is Migration__20240716_Helper, Migration__20240716_DeployRoninBridgeManagerHelper, Migration__MapToken_WBTC_Threshold {
ISharedArgument.SharedParameter _param;

function setUp() public virtual override {
Expand All @@ -34,91 +37,20 @@ contract Migration__20240716_P2_UpgradeBridgeRoninchain is Migration__20240716_H

function run() public virtual onlyOn(DefaultNetwork.RoninMainnet.key()) {
_currRoninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key()));
_newRoninBridgeManager = RoninBridgeManager(0x8AaAD4782890eb879A0fC132A6AdF9E5eE708faF);
_newRoninBridgeManager = _deployRoninBridgeManager();

_governor = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa;
_voters.push(0xb033ba62EC622dC54D0ABFE0254e79692147CA26);
_voters.push(0x087D08e3ba42e64E3948962dd1371F906D1278b9);
_voters.push(0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F);
_proposer = 0xe880802580a1fbdeF67ACe39D1B21c5b2C74f059;

(address[] memory currGovernors,,) = _currRoninBridgeManager.getFullBridgeOperatorInfos();
for (uint i = 0; i < currGovernors.length; i++) {
_voters.push(currGovernors[i]);
}

_changeAdminOfEnforcer();
_upgradeBridgeRoninchain();

config.setAddress(network(), Contract.RoninBridgeManager.key(), address(_newRoninBridgeManager));
}

function _changeAdminOfEnforcer() private {
RoninBridgeManager roninGA = RoninBridgeManager(0x53Ea388CB72081A3a397114a43741e7987815896);
address pauseEnforcerProxy = config.getAddressFromCurrentNetwork(Contract.RoninPauseEnforcer.key());

uint256 expiredTime = block.timestamp + 14 days;
uint N = 1;
address[] memory targets = new address[](N);
uint256[] memory values = new uint256[](N);
bytes[] memory calldatas = new bytes[](N);
uint256[] memory gasAmounts = new uint256[](N);

targets[0] = pauseEnforcerProxy;
calldatas[0] = abi.encodeWithSignature("changeAdmin(address)", address(_currRoninBridgeManager));
gasAmounts[0] = 1_000_000;

// LegacyProposalDetail memory proposal;
// proposal.nonce = roninGA.round(block.chainid) + 1;
// proposal.chainId = block.chainid;
// proposal.expiryTimestamp = expiredTime;
// proposal.targets = targets;
// proposal.values = values;
// proposal.calldatas = calldatas;
// proposal.gasAmounts = gasAmounts;

address gaGovernor = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F;
address[] memory gaVoters = new address[](3);
gaVoters[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9;
gaVoters[1] = 0x06f8Af58F656B507918d91B0B6F8B89bfCC556f9;
gaVoters[2] = 0xe1100401454B5f850b09f3b92cE7f071C5F1CEF4;

// vm.broadcast(gaGovernor);
// address(roninGA).call(
// abi.encodeWithSignature(
// "proposeProposalForCurrentNetwork(uint256,address[],uint256[],bytes[],uint256[],uint8)",
// // proposal.chainId,
// proposal.expiryTimestamp,
// proposal.targets,
// proposal.values,
// proposal.calldatas,
// proposal.gasAmounts,
// Ballot.VoteType.For
// )
// );

// for (uint i; i < gaVoters.length; ++i) {
// vm.broadcast(gaVoters[i]);
// address(roninGA).call{gas: 10_000_000}(
// abi.encodeWithSignature(
// "castProposalVoteForCurrentNetwork((uint256,uint256,uint256,address[],uint256[],bytes[],uint256[]),uint8)", proposal, Ballot.VoteType.For
// )
// );
// }

// ((45, 2021, 1714451658 [1.714e9], [0x1aD54D61F47acBcBA99fb6540A1694EB2F47AB95], [0], [0x8f283970000000000000000000000000b0507f2f22697022ecb25963a00d3d076dac5753], [1000000 [1e6]]), 0)

LegacyProposalDetail memory proposal;
proposal.nonce = 45;
proposal.chainId = 2021;
proposal.expiryTimestamp = 1714451658;
proposal.targets = targets;
proposal.values = values;
proposal.calldatas = calldatas;
proposal.gasAmounts = gasAmounts;

vm.broadcast(gaVoters[2]);
address(roninGA).call{ gas: 10_000_000 }(
abi.encodeWithSignature(
"castProposalVoteForCurrentNetwork((uint256,uint256,uint256,address[],uint256[],bytes[],uint256[]),uint8)", proposal, Ballot.VoteType.For
)
);
}

function _upgradeBridgeRoninchain() private {
address bridgeRewardLogic = _deployLogic(Contract.BridgeReward.key());
address bridgeSlashLogic = _deployLogic(Contract.BridgeSlash.key());
Expand All @@ -129,58 +61,93 @@ contract Migration__20240716_P2_UpgradeBridgeRoninchain is Migration__20240716_H
address bridgeRewardProxy = config.getAddressFromCurrentNetwork(Contract.BridgeReward.key());
address bridgeSlashProxy = config.getAddressFromCurrentNetwork(Contract.BridgeSlash.key());
address bridgeTrackingProxy = config.getAddressFromCurrentNetwork(Contract.BridgeTracking.key());
address pauseEnforcerProxy = config.getAddressFromCurrentNetwork(Contract.RoninPauseEnforcer.key());
// address pauseEnforcerProxy = config.getAddressFromCurrentNetwork(Contract.RoninPauseEnforcer.key());
address roninGatewayV3Proxy = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key());

ISharedArgument.SharedParameter memory param;
param.roninBridgeManager.callbackRegisters = new address[](1);
param.roninBridgeManager.callbackRegisters[0] = config.getAddressFromCurrentNetwork(Contract.BridgeSlash.key());

uint N = 17;
uint N = 16;
address[] memory targets = new address[](N);
uint256[] memory values = new uint256[](N);
bytes[] memory calldatas = new bytes[](N);
uint256[] memory gasAmounts = new uint256[](N);

targets[0] = bridgeRewardProxy;
targets[1] = bridgeSlashProxy;
targets[2] = bridgeTrackingProxy;
targets[3] = roninGatewayV3Proxy;
targets[4] = pauseEnforcerProxy;
targets[5] = bridgeRewardProxy;
targets[6] = bridgeSlashProxy;
targets[7] = bridgeTrackingProxy;
targets[8] = roninGatewayV3Proxy;
targets[9] = bridgeRewardProxy;
targets[10] = bridgeSlashProxy;
targets[11] = bridgeTrackingProxy;
targets[12] = roninGatewayV3Proxy;
targets[13] = pauseEnforcerProxy;
targets[14] = address(_newRoninBridgeManager);
targets[15] = address(_newRoninBridgeManager);

calldatas[0] = abi.encodeWithSignature("upgradeToAndCall(address,bytes)", bridgeRewardLogic, abi.encodeWithSelector(BridgeReward.initializeV2.selector));
calldatas[1] = abi.encodeWithSignature("upgradeTo(address)", bridgeSlashLogic);
calldatas[2] = abi.encodeWithSignature("upgradeTo(address)", bridgeTrackingLogic);
calldatas[3] = abi.encodeWithSignature("upgradeTo(address)", roninGatewayV3Logic);
calldatas[4] = abi.encodeWithSignature("upgradeTo(address)", pauseEnforcerLogic);
calldatas[5] =
uint cCount;

targets[cCount] = bridgeRewardProxy;
calldatas[cCount++] = abi.encodeWithSignature("upgradeToAndCall(address,bytes)", bridgeRewardLogic, abi.encodeWithSelector(BridgeReward.initializeV2.selector));

targets[cCount] = bridgeSlashProxy;
calldatas[cCount++] = abi.encodeWithSignature("upgradeTo(address)", bridgeSlashLogic);

targets[cCount] = bridgeTrackingProxy;
calldatas[cCount++] = abi.encodeWithSignature("upgradeTo(address)", bridgeTrackingLogic);

targets[cCount] = roninGatewayV3Proxy;
calldatas[cCount++] = abi.encodeWithSignature("upgradeTo(address)", roninGatewayV3Logic);

targets[cCount] = bridgeRewardProxy;
calldatas[cCount++] =
abi.encodeWithSignature("functionDelegateCall(bytes)", (abi.encodeWithSignature("setContract(uint8,address)", 11, address(_newRoninBridgeManager))));
calldatas[6] =

targets[cCount] = bridgeSlashProxy;
calldatas[cCount++] =
abi.encodeWithSignature("functionDelegateCall(bytes)", (abi.encodeWithSignature("setContract(uint8,address)", 11, address(_newRoninBridgeManager))));
calldatas[7] =

targets[cCount] = bridgeTrackingProxy;
calldatas[cCount++] =
abi.encodeWithSignature("functionDelegateCall(bytes)", (abi.encodeWithSignature("setContract(uint8,address)", 11, address(_newRoninBridgeManager))));
calldatas[8] =

targets[cCount] = roninGatewayV3Proxy;
calldatas[cCount++] =
abi.encodeWithSignature("functionDelegateCall(bytes)", (abi.encodeWithSignature("setContract(uint8,address)", 11, address(_newRoninBridgeManager))));
calldatas[9] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));
calldatas[10] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));
calldatas[11] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));
calldatas[12] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));
calldatas[13] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));
calldatas[14] = abi.encodeWithSignature(

{
address[] memory roninTokens = new address[](1);
address[] memory mainchainTokens = new address[](1);
uint256[] memory chainIds = new uint256[](1);
TokenStandard[] memory standards = new TokenStandard[](1);

roninTokens[0] = _wbtcRoninToken;
mainchainTokens[0] = _wbtcMainchainToken;
chainIds[0] = config.getNetworkData(config.getCompanionNetwork(network())).chainId;
standards[0] = TokenStandard.ERC20;

address[] memory mainchainTokensToSetMinThreshold = new address[](1);
uint256[] memory minThresholds = new uint256[](1);
mainchainTokensToSetMinThreshold[0] = _wbtcMainchainToken;
minThresholds[0] = _wbtcMinThreshold;

targets[cCount] = roninGatewayV3Proxy;
calldatas[cCount++] = abi.encodeWithSignature("functionDelegateCall(bytes)", abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)));

targets[cCount] = roninGatewayV3Proxy;
calldatas[cCount++] = abi.encodeWithSignature("functionDelegateCall(bytes)", abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (mainchainTokensToSetMinThreshold, minThresholds)));
}

targets[cCount] = bridgeRewardProxy;
calldatas[cCount++] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));

targets[cCount] = bridgeSlashProxy;
calldatas[cCount++] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));

targets[cCount] = bridgeTrackingProxy;
calldatas[cCount++] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));

targets[cCount] = roninGatewayV3Proxy;
calldatas[cCount++] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));

targets[cCount] = address(_newRoninBridgeManager);
calldatas[cCount++] = abi.encodeWithSignature(
"functionDelegateCall(bytes)", (abi.encodeWithSignature("registerCallbacks(address[])", param.roninBridgeManager.callbackRegisters))
);
calldatas[15] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));

targets[cCount] = address(_newRoninBridgeManager);
calldatas[cCount++] = abi.encodeWithSignature("changeAdmin(address)", address(_newRoninBridgeManager));

assertEq(cCount, N);

for (uint i; i < N; ++i) {
gasAmounts[i] = 1_000_000;
Expand Down
Loading

0 comments on commit 75d51da

Please sign in to comment.