From ff619492ee74cee744f71a762b165d2563336870 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 26 Jun 2024 15:46:37 +0700 Subject: [PATCH 01/15] script: mapping Anima token --- .../20240626-maptoken-anima-mainchain.s.sol | 20 +++ ...0240626-maptoken-anima-ronin-testnet.s.sol | 21 +++ .../base-maptoken.s.sol | 20 +++ .../caller-configs.s.sol | 6 + .../maptoken-anima-configs.s.sol | 18 +++ .../factory-maptoken-mainchain-testnet.s.sol | 150 ++++++++++++++++++ 6 files changed, 235 insertions(+) create mode 100644 script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol create mode 100644 script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol create mode 100644 script/20240626-maptoken-anima/base-maptoken.s.sol create mode 100644 script/20240626-maptoken-anima/caller-configs.s.sol create mode 100644 script/20240626-maptoken-anima/maptoken-anima-configs.s.sol create mode 100644 script/factories/factory-maptoken-mainchain-testnet.s.sol diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol new file mode 100644 index 00000000..e39b80e1 --- /dev/null +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../factories/factory-maptoken-mainchain-testnet.s.sol"; +import "./base-maptoken.s.sol"; + +contract Migration__20240308_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain_Testnet { + function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain_Testnet) returns (address) { + return Base__MapToken._initCaller(); + } + + function _initTokenList() internal override(Base__MapToken, Factory__MapTokensMainchain_Testnet) returns (uint256 totalToken, MapTokenInfo[] memory infos) { + return Base__MapToken._initTokenList(); + } + + function run() public override { + console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network + super.run(); + } +} diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol new file mode 100644 index 00000000..bf3356b0 --- /dev/null +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { console2 } from "forge-std/console2.sol"; +import "../factories/factory-maptoken-roninchain.s.sol"; +import "./base-maptoken.s.sol"; + +contract Migration__20240308_MapTokenAnimaRoninchain is Base__MapToken, Factory__MapTokensRoninchain { + function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { + return Base__MapToken._initCaller(); + } + + function _initTokenList() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (uint256 totalToken, MapTokenInfo[] memory infos) { + return Base__MapToken._initTokenList(); + } + + function run() public override { + console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network + super.run(); + } +} diff --git a/script/20240626-maptoken-anima/base-maptoken.s.sol b/script/20240626-maptoken-anima/base-maptoken.s.sol new file mode 100644 index 00000000..82565522 --- /dev/null +++ b/script/20240626-maptoken-anima/base-maptoken.s.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "forge-std/console2.sol"; + +import "./caller-configs.s.sol"; +import "./maptoken-anima-configs.s.sol"; + +contract Base__MapToken is Migration__Caller_Config, Migration__MapToken_Anima_Config { + function _initCaller() internal virtual returns (address) { + return SM_GOVERNOR; + } + + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos) { + totalToken = 1; + + infos = new MapTokenInfo[](totalToken); + infos[0] = _animaInfo; + } +} diff --git a/script/20240626-maptoken-anima/caller-configs.s.sol b/script/20240626-maptoken-anima/caller-configs.s.sol new file mode 100644 index 00000000..1e3428d5 --- /dev/null +++ b/script/20240626-maptoken-anima/caller-configs.s.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +contract Migration__Caller_Config { + address internal SM_GOVERNOR = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; // TODO: replace by address of the SV governor +} diff --git a/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol b/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol new file mode 100644 index 00000000..d59329bd --- /dev/null +++ b/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; + +contract Migration__MapToken_Anima_Config { + MapTokenInfo _animaInfo; + + constructor() { + _animaInfo.roninToken = address(0x9F6a5cDc477e9f667d60424bFdb4E82089d9d72c); + _animaInfo.mainchainToken = address(0xEd52E203D2D44FAaEA0D9fB6A40220A63c743c80); + _animaInfo.minThreshold = 100 ether; + _animaInfo.highTierThreshold = 20_000_000 ether; + _animaInfo.lockedThreshold = 100_000_000 ether; + _animaInfo.dailyWithdrawalLimit = 50_000_000 ether; + _animaInfo.unlockFeePercentages = 10; // 0.001%. Max percentage is 100_0000, so 10 is 0.001% (`10 / 1e6 = 0.001 * 100`) + } +} diff --git a/script/factories/factory-maptoken-mainchain-testnet.s.sol b/script/factories/factory-maptoken-mainchain-testnet.s.sol new file mode 100644 index 00000000..d16ce76f --- /dev/null +++ b/script/factories/factory-maptoken-mainchain-testnet.s.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +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 { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; +import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; +import { Contract } from "../utils/Contract.sol"; +import { Migration } from "../Migration.s.sol"; +import "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import { Network } from "../utils/Network.sol"; +import { Contract } from "../utils/Contract.sol"; +import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; +import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; +import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; +import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; + +abstract contract Factory__MapTokensMainchain_Testnet is Migration { + using LibCompanionNetwork for *; + + address internal _mainchainGatewayV3; + address internal _mainchainBridgeManager; + address private _governor; + MainchainBridgeAdminUtils _mainchainProposalUtils; + + function setUp() public override { + super.setUp(); + + _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; + _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; + _governor = _initCaller(); + } + + function _initCaller() internal virtual returns (address); + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + + function run() public virtual { + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + + address[] memory mainchainTokens = new address[](N); + address[] memory roninTokens = new address[](N); + TokenStandard[] memory standards = new TokenStandard[](N); + uint256[][4] memory thresholds; + thresholds[0] = new uint256[](N); + thresholds[1] = new uint256[](N); + thresholds[2] = new uint256[](N); + thresholds[3] = new uint256[](N); + + uint256 expiredTime = block.timestamp + 14 days; + address[] memory targets = new address[](1); + uint256[] memory values = new uint256[](1); + bytes[] memory calldatas = new bytes[](1); + uint256[] memory gasAmounts = new uint256[](1); + + // ================ ERC-20 ====================== + + for (uint256 i; i < N; ++i) { + mainchainTokens[i] = tokenInfos[i].mainchainToken; + roninTokens[i] = tokenInfos[i].roninToken; + standards[i] = TokenStandard.ERC20; + thresholds[0][i] = tokenInfos[i].highTierThreshold; + thresholds[1][i] = tokenInfos[i].lockedThreshold; + thresholds[2][i] = tokenInfos[i].unlockFeePercentages; + thresholds[3][i] = tokenInfos[i].dailyWithdrawalLimit; + } + + // function mapTokensAndThresholds( + // address[] calldata _mainchainTokens, + // address[] calldata _roninTokens, + // TokenStandard[] calldata _standards, + // uint256[][4] calldata _thresholds + // ) + + bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); + + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[0] = _mainchainGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + // TODO: Replace with real governors, this is for local simulation only. + uint256[] memory governorPKs = new uint256[](4); + governorPKs[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + governorPKs[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; + governorPKs[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; + governorPKs[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + + address[] memory governors = new address[](4); + governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; + governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; + governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + + // ================ Cheat Storage =============== + + + bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); + + //cheat governors addresses + for (uint256 i; i < 4; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); + } + //after cheat + for (uint256 i; i < 4; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); + + assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); + } + + //cheat governors weights + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + for (uint256 i; i < 4; ++i) { + address key = governors[i]; + bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); + vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); + } + bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); + + // ================ VERIFY AND EXECUTE PROPOSAL =============== + _mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, governorPKs, MainchainBridgeManager(_mainchainBridgeManager), governors[0]); + + Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ + nonce: MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: address(0), + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + + Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](4); + supports_[0] = Ballot.VoteType.For; + supports_[1] = Ballot.VoteType.For; + supports_[2] = Ballot.VoteType.For; + supports_[3] = Ballot.VoteType.For; + + SignatureConsumer.Signature[] memory signatures = _mainchainProposalUtils.generateSignatures(proposal, governorPKs); + vm.broadcast(governors[0]); + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); + } +} From 95b746119b46262eebf255a26ca7e7bf4f6c5fa4 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 26 Jun 2024 16:37:31 +0700 Subject: [PATCH 02/15] script: add factory script for ronin-testnet --- ...0240626-maptoken-anima-ronin-testnet.s.sol | 8 +- .../factory-maptoken-ronin-testnet.s.sol | 141 ++++++++++++++++++ 2 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 script/factories/factory-maptoken-ronin-testnet.s.sol diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index bf3356b0..3a10a2d9 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -2,15 +2,15 @@ pragma solidity ^0.8.19; import { console2 } from "forge-std/console2.sol"; -import "../factories/factory-maptoken-roninchain.s.sol"; +import "../factories/factory-maptoken-ronin-testnet.s.sol"; import "./base-maptoken.s.sol"; -contract Migration__20240308_MapTokenAnimaRoninchain is Base__MapToken, Factory__MapTokensRoninchain { - function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { +contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRoninTestnet { + function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninTestnet) returns (address) { return Base__MapToken._initCaller(); } - function _initTokenList() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (uint256 totalToken, MapTokenInfo[] memory infos) { + function _initTokenList() internal override(Base__MapToken, Factory__MapTokensRoninTestnet) returns (uint256 totalToken, MapTokenInfo[] memory infos) { return Base__MapToken._initTokenList(); } diff --git a/script/factories/factory-maptoken-ronin-testnet.s.sol b/script/factories/factory-maptoken-ronin-testnet.s.sol new file mode 100644 index 00000000..710c5747 --- /dev/null +++ b/script/factories/factory-maptoken-ronin-testnet.s.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { console2 } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; + +import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; +import { IRoninGatewayV3 } from "@ronin/contracts/interfaces/IRoninGatewayV3.sol"; +import { MinimumWithdrawal } from "@ronin/contracts/extensions/MinimumWithdrawal.sol"; +import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; +import { Ballot } from "@ronin/contracts/libraries/Ballot.sol"; +import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; + +import { Contract } from "../utils/Contract.sol"; +import { Migration } from "../Migration.s.sol"; +import { Network } from "../utils/Network.sol"; +import { Contract } from "../utils/Contract.sol"; +import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; + +import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; + +abstract contract Factory__MapTokensRoninTestnet is Migration { + using LibCompanionNetwork for *; + + RoninBridgeManager internal _roninBridgeManager; + address internal _roninGatewayV3; + address private _governor; + + function setUp() public override { + super.setUp(); + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); + + _governor = _initCaller(); + _cheatWeightOperator(_governor); + } + + function _cheatWeightOperator(address gov) internal { + bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); + bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); + + uint256 totalWeight = _roninBridgeManager.getTotalWeight(); + bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight))); + vm.store(address(_roninBridgeManager), $, newOpAndWeight); + } + + function _initCaller() internal virtual returns (address); + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + + function run() public virtual { + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + + address[] memory roninTokens = new address[](N); + address[] memory mainchainTokens = new address[](N); + uint256[] memory chainIds = new uint256[](N); + TokenStandard[] memory standards = new TokenStandard[](N); + + uint256 expiredTime = block.timestamp + 14 days; + address[] memory targets = new address[](2); + uint256[] memory values = new uint256[](2); + bytes[] memory calldatas = new bytes[](2); + uint256[] memory gasAmounts = new uint256[](2); + + // ============= MAP TOKENS =========== + + for (uint256 i; i < N; ++i) { + roninTokens[i] = tokenInfos[i].roninToken; + mainchainTokens[i] = tokenInfos[i].mainchainToken; + chainIds[i] = network().companionChainId(); + standards[i] = TokenStandard.ERC20; + } + + // function mapTokens( + // address[] calldata _roninTokens, + // address[] calldata _mainchainTokens, + // uint256[] calldata chainIds, + // TokenStandard[] calldata _standards + // ) + bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[0] = _roninGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + // ============= SET MIN THRESHOLD ============ + // function setMinimumThresholds( + // address[] calldata _tokens, + // uint256[] calldata _thresholds + // ); + address[] memory roninTokensToSetMinThreshold = new address[](N); + uint256[] memory minThresholds = new uint256[](N); + + for (uint256 i; i < N; ++i) { + roninTokensToSetMinThreshold[i] = tokenInfos[i].roninToken; + minThresholds[i] = tokenInfos[i].minThreshold; + } + + innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[1] = _roninGatewayV3; + values[1] = 0; + calldatas[1] = proxyData; + gasAmounts[1] = 1_000_000; + + // ================ VERIFY AND EXECUTE PROPOSAL =============== + // LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); + + Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ + nonce: 2, + chainId: 2021, + expiryTimestamp: expiredTime, + executor: 0x0000000000000000000000000000000000000000, + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + + address[] memory governors = new address[](4); + governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + + // _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); + + vm.broadcast(_governor); + _roninBridgeManager.propose(block.chainid, expiredTime, address(0), targets, values, calldatas, gasAmounts); + vm.broadcast(governors[0]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + vm.broadcast(governors[1]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + vm.broadcast(governors[2]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + } +} From c84234a324dec8ee4768a8ddff131d2a90bc67dd Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Thu, 27 Jun 2024 11:12:24 +0700 Subject: [PATCH 03/15] chore: refactor factory script --- .../20240626-maptoken-anima-mainchain.s.sol | 95 ++++++++++- ...0240626-maptoken-anima-ronin-testnet.s.sol | 45 +++++- .../factory-maptoken-mainchain-testnet.s.sol | 150 ------------------ .../factory-maptoken-mainchain.s.sol | 57 ++++--- .../factory-maptoken-ronin-testnet.s.sol | 141 ---------------- .../factory-maptoken-roninchain.s.sol | 76 +++++---- 6 files changed, 213 insertions(+), 351 deletions(-) delete mode 100644 script/factories/factory-maptoken-mainchain-testnet.s.sol delete mode 100644 script/factories/factory-maptoken-ronin-testnet.s.sol diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index e39b80e1..ba079049 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -1,18 +1,105 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import "../factories/factory-maptoken-mainchain-testnet.s.sol"; +import "../factories/factory-maptoken-mainchain.s.sol"; import "./base-maptoken.s.sol"; +import "@ronin/contracts/libraries/Ballot.sol"; -contract Migration__20240308_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain_Testnet { - function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain_Testnet) returns (address) { +import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; +import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; + +contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain { + uint256[] private _governorPKs; + address[] private _governors; + MainchainBridgeAdminUtils _mainchainProposalUtils; + + function setUp() public virtual override { + _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; + _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; + } + + function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (address) { return Base__MapToken._initCaller(); } - function _initTokenList() internal override(Base__MapToken, Factory__MapTokensMainchain_Testnet) returns (uint256 totalToken, MapTokenInfo[] memory infos) { + function _initTokenList() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (uint256 totalToken, MapTokenInfo[] memory infos) { return Base__MapToken._initTokenList(); } + function _cheatStorage() internal { + // TODO: Replace with real governors, this is for local simulation only. + _governorPKs = new uint256[](4); + _governorPKs[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + _governorPKs[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; + _governorPKs[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; + _governorPKs[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + + _governors = new address[](4); + _governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + _governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; + _governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; + _governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + + // ================ Cheat Storage =============== + + bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); + + //cheat governors addresses + for (uint256 i; i < 4; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(_governors[i])))); + } + //after cheat + for (uint256 i; i < 4; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); + + assertEq(afterCheatData, bytes32(uint256(uint160(_governors[i])))); + } + + //cheat governors weights + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + for (uint256 i; i < 4; ++i) { + address key = _governors[i]; + bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); + vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); + } + bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); + } + + function _verifyAndExecuteProposal() internal virtual override { + (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); + _cheatStorage(); + + // uint256 chainId = network().companionChainId(); + uint256 expiredTime = block.timestamp + 14 days; + _mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); + + Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ + nonce: MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: address(0), + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + console2.log("preparing..."); + + Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](4); + supports_[0] = Ballot.VoteType.For; + supports_[1] = Ballot.VoteType.For; + supports_[2] = Ballot.VoteType.For; + supports_[3] = Ballot.VoteType.For; + + SignatureConsumer.Signature[] memory signatures = _mainchainProposalUtils.generateSignatures(proposal, _governorPKs); + vm.broadcast(_governors[0]); + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); + } + function run() public override { console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network super.run(); diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index 3a10a2d9..8c73a539 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -2,18 +2,55 @@ pragma solidity ^0.8.19; import { console2 } from "forge-std/console2.sol"; -import "../factories/factory-maptoken-ronin-testnet.s.sol"; +import "../factories/factory-maptoken-roninchain.s.sol"; import "./base-maptoken.s.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; -contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRoninTestnet { - function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninTestnet) returns (address) { +contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRoninchain { + function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { return Base__MapToken._initCaller(); } - function _initTokenList() internal override(Base__MapToken, Factory__MapTokensRoninTestnet) returns (uint256 totalToken, MapTokenInfo[] memory infos) { + function _initTokenList() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (uint256 totalToken, MapTokenInfo[] memory infos) { return Base__MapToken._initTokenList(); } + function _verifyAndExecuteProposal() internal virtual override { + // ================ VERIFY AND EXECUTE PROPOSAL =============== + // LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); + (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); + + uint256 expiredTime = block.timestamp + 14 days; + + Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ + nonce: 2, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: 0x0000000000000000000000000000000000000000, + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + + address[] memory governors = new address[](4); + governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + + // _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); + + vm.broadcast(governors[0]); + _roninBridgeManager.propose(block.chainid, expiredTime, address(0), targets, values, calldatas, gasAmounts); + vm.broadcast(governors[0]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + vm.broadcast(governors[1]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + vm.broadcast(governors[2]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + } + function run() public override { console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network super.run(); diff --git a/script/factories/factory-maptoken-mainchain-testnet.s.sol b/script/factories/factory-maptoken-mainchain-testnet.s.sol deleted file mode 100644 index d16ce76f..00000000 --- a/script/factories/factory-maptoken-mainchain-testnet.s.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -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 { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; -import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; -import { Contract } from "../utils/Contract.sol"; -import { Migration } from "../Migration.s.sol"; -import "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; -import { Network } from "../utils/Network.sol"; -import { Contract } from "../utils/Contract.sol"; -import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; -import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; -import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; -import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; -import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; - -abstract contract Factory__MapTokensMainchain_Testnet is Migration { - using LibCompanionNetwork for *; - - address internal _mainchainGatewayV3; - address internal _mainchainBridgeManager; - address private _governor; - MainchainBridgeAdminUtils _mainchainProposalUtils; - - function setUp() public override { - super.setUp(); - - _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; - _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; - _governor = _initCaller(); - } - - function _initCaller() internal virtual returns (address); - function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - - function run() public virtual { - (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - - address[] memory mainchainTokens = new address[](N); - address[] memory roninTokens = new address[](N); - TokenStandard[] memory standards = new TokenStandard[](N); - uint256[][4] memory thresholds; - thresholds[0] = new uint256[](N); - thresholds[1] = new uint256[](N); - thresholds[2] = new uint256[](N); - thresholds[3] = new uint256[](N); - - uint256 expiredTime = block.timestamp + 14 days; - address[] memory targets = new address[](1); - uint256[] memory values = new uint256[](1); - bytes[] memory calldatas = new bytes[](1); - uint256[] memory gasAmounts = new uint256[](1); - - // ================ ERC-20 ====================== - - for (uint256 i; i < N; ++i) { - mainchainTokens[i] = tokenInfos[i].mainchainToken; - roninTokens[i] = tokenInfos[i].roninToken; - standards[i] = TokenStandard.ERC20; - thresholds[0][i] = tokenInfos[i].highTierThreshold; - thresholds[1][i] = tokenInfos[i].lockedThreshold; - thresholds[2][i] = tokenInfos[i].unlockFeePercentages; - thresholds[3][i] = tokenInfos[i].dailyWithdrawalLimit; - } - - // function mapTokensAndThresholds( - // address[] calldata _mainchainTokens, - // address[] calldata _roninTokens, - // TokenStandard[] calldata _standards, - // uint256[][4] calldata _thresholds - // ) - - bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); - - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[0] = _mainchainGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - - // TODO: Replace with real governors, this is for local simulation only. - uint256[] memory governorPKs = new uint256[](4); - governorPKs[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; - governorPKs[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; - governorPKs[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; - governorPKs[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; - - address[] memory governors = new address[](4); - governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; - governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; - governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; - - // ================ Cheat Storage =============== - - - bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); - - //cheat governors addresses - for (uint256 i; i < 4; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); - } - //after cheat - for (uint256 i; i < 4; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); - - assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); - } - - //cheat governors weights - bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - for (uint256 i; i < 4; ++i) { - address key = governors[i]; - bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); - vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); - } - bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); - - // ================ VERIFY AND EXECUTE PROPOSAL =============== - _mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, governorPKs, MainchainBridgeManager(_mainchainBridgeManager), governors[0]); - - Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ - nonce: MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1, - chainId: block.chainid, - expiryTimestamp: expiredTime, - executor: address(0), - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - - Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](4); - supports_[0] = Ballot.VoteType.For; - supports_[1] = Ballot.VoteType.For; - supports_[2] = Ballot.VoteType.For; - supports_[3] = Ballot.VoteType.For; - - SignatureConsumer.Signature[] memory signatures = _mainchainProposalUtils.generateSignatures(proposal, governorPKs); - vm.broadcast(governors[0]); - MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); - } -} diff --git a/script/factories/factory-maptoken-mainchain.s.sol b/script/factories/factory-maptoken-mainchain.s.sol index fa0f4d7e..ea5a12de 100644 --- a/script/factories/factory-maptoken-mainchain.s.sol +++ b/script/factories/factory-maptoken-mainchain.s.sol @@ -24,7 +24,7 @@ abstract contract Factory__MapTokensMainchain is Migration { address internal _mainchainBridgeManager; address private _governor; - function setUp() public override { + function setUp() public virtual override { super.setUp(); _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); @@ -37,26 +37,27 @@ abstract contract Factory__MapTokensMainchain is Migration { function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function run() public virtual { + function _prepareMapTokensAndThresholds() + internal + returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) + { + // function mapTokensAndThresholds( + // address[] calldata _mainchainTokens, + // address[] calldata _roninTokens, + // TokenStandard.ERC20[] calldata _standards, + // uint256[][4] calldata _thresholds + // ) (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - address[] memory mainchainTokens = new address[](N); - address[] memory roninTokens = new address[](N); - TokenStandard[] memory standards = new TokenStandard[](N); - uint256[][4] memory thresholds; + mainchainTokens = new address[](N); + roninTokens = new address[](N); + standards = new TokenStandard[](N); + thresholds[0] = new uint256[](N); thresholds[1] = new uint256[](N); thresholds[2] = new uint256[](N); thresholds[3] = new uint256[](N); - uint256 expiredTime = block.timestamp + 14 days; - address[] memory targets = new address[](1); - uint256[] memory values = new uint256[](1); - bytes[] memory calldatas = new bytes[](1); - uint256[] memory gasAmounts = new uint256[](1); - - // ================ APERIOS AND YGG ERC-20 ====================== - for (uint256 i; i < N; ++i) { mainchainTokens[i] = tokenInfos[i].mainchainToken; roninTokens[i] = tokenInfos[i].roninToken; @@ -66,30 +67,36 @@ abstract contract Factory__MapTokensMainchain is Migration { thresholds[2][i] = tokenInfos[i].unlockFeePercentages; thresholds[3][i] = tokenInfos[i].dailyWithdrawalLimit; } + } - // function mapTokensAndThresholds( - // address[] calldata _mainchainTokens, - // address[] calldata _roninTokens, - // TokenStandard[] calldata _standards, - // uint256[][4] calldata _thresholds - // ) - + function _prepareProposal() internal returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) { + (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = + _prepareMapTokensAndThresholds(); bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + targets = new address[](1); + values = new uint256[](1); + calldatas = new bytes[](1); + gasAmounts = new uint256[](1); + targets[0] = _mainchainGatewayV3; values[0] = 0; calldatas[0] = proxyData; gasAmounts[0] = 1_000_000; + } - // ================ VERIFY AND EXECUTE PROPOSAL =============== - - // _verifyMainchainProposalGasAmount(targets, values, calldatas, gasAmounts); + function _verifyAndExecuteProposal() internal virtual { + (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); uint256 chainId = network().companionChainId(); + uint256 expiredTime = block.timestamp + 14 days; vm.broadcast(_governor); _roninBridgeManager.propose(chainId, expiredTime, address(0), targets, values, calldatas, gasAmounts); } + + function run() public virtual { + _verifyAndExecuteProposal(); + } } diff --git a/script/factories/factory-maptoken-ronin-testnet.s.sol b/script/factories/factory-maptoken-ronin-testnet.s.sol deleted file mode 100644 index 710c5747..00000000 --- a/script/factories/factory-maptoken-ronin-testnet.s.sol +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -import { console2 } from "forge-std/console2.sol"; -import { StdStyle } from "forge-std/StdStyle.sol"; - -import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; -import { IRoninGatewayV3 } from "@ronin/contracts/interfaces/IRoninGatewayV3.sol"; -import { MinimumWithdrawal } from "@ronin/contracts/extensions/MinimumWithdrawal.sol"; -import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; -import { Ballot } from "@ronin/contracts/libraries/Ballot.sol"; -import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; -import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; - -import { Contract } from "../utils/Contract.sol"; -import { Migration } from "../Migration.s.sol"; -import { Network } from "../utils/Network.sol"; -import { Contract } from "../utils/Contract.sol"; -import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; - -import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; -import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; - -abstract contract Factory__MapTokensRoninTestnet is Migration { - using LibCompanionNetwork for *; - - RoninBridgeManager internal _roninBridgeManager; - address internal _roninGatewayV3; - address private _governor; - - function setUp() public override { - super.setUp(); - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); - _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); - - _governor = _initCaller(); - _cheatWeightOperator(_governor); - } - - function _cheatWeightOperator(address gov) internal { - bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); - bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); - - uint256 totalWeight = _roninBridgeManager.getTotalWeight(); - bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight))); - vm.store(address(_roninBridgeManager), $, newOpAndWeight); - } - - function _initCaller() internal virtual returns (address); - function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - - function run() public virtual { - (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - - address[] memory roninTokens = new address[](N); - address[] memory mainchainTokens = new address[](N); - uint256[] memory chainIds = new uint256[](N); - TokenStandard[] memory standards = new TokenStandard[](N); - - uint256 expiredTime = block.timestamp + 14 days; - address[] memory targets = new address[](2); - uint256[] memory values = new uint256[](2); - bytes[] memory calldatas = new bytes[](2); - uint256[] memory gasAmounts = new uint256[](2); - - // ============= MAP TOKENS =========== - - for (uint256 i; i < N; ++i) { - roninTokens[i] = tokenInfos[i].roninToken; - mainchainTokens[i] = tokenInfos[i].mainchainToken; - chainIds[i] = network().companionChainId(); - standards[i] = TokenStandard.ERC20; - } - - // function mapTokens( - // address[] calldata _roninTokens, - // address[] calldata _mainchainTokens, - // uint256[] calldata chainIds, - // TokenStandard[] calldata _standards - // ) - bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[0] = _roninGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - - // ============= SET MIN THRESHOLD ============ - // function setMinimumThresholds( - // address[] calldata _tokens, - // uint256[] calldata _thresholds - // ); - address[] memory roninTokensToSetMinThreshold = new address[](N); - uint256[] memory minThresholds = new uint256[](N); - - for (uint256 i; i < N; ++i) { - roninTokensToSetMinThreshold[i] = tokenInfos[i].roninToken; - minThresholds[i] = tokenInfos[i].minThreshold; - } - - innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); - proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[1] = _roninGatewayV3; - values[1] = 0; - calldatas[1] = proxyData; - gasAmounts[1] = 1_000_000; - - // ================ VERIFY AND EXECUTE PROPOSAL =============== - // LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); - - Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ - nonce: 2, - chainId: 2021, - expiryTimestamp: expiredTime, - executor: 0x0000000000000000000000000000000000000000, - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - - address[] memory governors = new address[](4); - governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; - - // _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); - - vm.broadcast(_governor); - _roninBridgeManager.propose(block.chainid, expiredTime, address(0), targets, values, calldatas, gasAmounts); - vm.broadcast(governors[0]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - vm.broadcast(governors[1]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - vm.broadcast(governors[2]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - } -} diff --git a/script/factories/factory-maptoken-roninchain.s.sol b/script/factories/factory-maptoken-roninchain.s.sol index 6fb30cd8..0354745e 100644 --- a/script/factories/factory-maptoken-roninchain.s.sol +++ b/script/factories/factory-maptoken-roninchain.s.sol @@ -48,19 +48,22 @@ abstract contract Factory__MapTokensRoninchain is Migration { function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function run() public virtual { + function _prepareMapToken() + internal + returns (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) + { + // function mapTokens( + // address[] calldata _roninTokens, + // address[] calldata _mainchainTokens, + // uint256[] calldata chainIds, + // TokenStandard[] calldata _standards + // ) (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - address[] memory roninTokens = new address[](N); - address[] memory mainchainTokens = new address[](N); - uint256[] memory chainIds = new uint256[](N); - TokenStandard[] memory standards = new TokenStandard[](N); - - uint256 expiredTime = block.timestamp + 14 days; - address[] memory targets = new address[](2); - uint256[] memory values = new uint256[](2); - bytes[] memory calldatas = new bytes[](2); - uint256[] memory gasAmounts = new uint256[](2); + roninTokens = new address[](N); + mainchainTokens = new address[](N); + chainIds = new uint256[](N); + standards = new TokenStandard[](N); // ============= MAP TOKENS =========== @@ -70,33 +73,41 @@ abstract contract Factory__MapTokensRoninchain is Migration { chainIds[i] = network().companionChainId(); standards[i] = TokenStandard.ERC20; } + } - // function mapTokens( - // address[] calldata _roninTokens, - // address[] calldata _mainchainTokens, - // uint256[] calldata chainIds, - // TokenStandard[] calldata _standards - // ) - bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[0] = _roninGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; + function _prepareSetMinThreshold() internal returns (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) { + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); // ============= SET MIN THRESHOLD ============ // function setMinimumThresholds( // address[] calldata _tokens, // uint256[] calldata _thresholds // ); - address[] memory roninTokensToSetMinThreshold = new address[](N); - uint256[] memory minThresholds = new uint256[](N); + roninTokensToSetMinThreshold = new address[](N); + minThresholds = new uint256[](N); for (uint256 i; i < N; ++i) { roninTokensToSetMinThreshold[i] = tokenInfos[i].roninToken; minThresholds[i] = tokenInfos[i].minThreshold; } + } + + function _prepareProposal() internal returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) { + (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapToken(); + (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); + + targets = new address[](2); + values = new uint256[](2); + calldatas = new bytes[](2); + gasAmounts = new uint256[](2); + + bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[0] = _roninGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); @@ -105,12 +116,23 @@ abstract contract Factory__MapTokensRoninchain is Migration { values[1] = 0; calldatas[1] = proxyData; gasAmounts[1] = 1_000_000; + } + function _verifyAndExecuteProposal() internal virtual { // ================ VERIFY AND EXECUTE PROPOSAL =============== // _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); + (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); + + uint256 chainId = network().companionChainId(); + uint256 expiredTime = block.timestamp + 14 days; + vm.broadcast(_governor); - _roninBridgeManager.propose(block.chainid, expiredTime, address(0), targets, values, calldatas, gasAmounts); + _roninBridgeManager.propose(chainId, expiredTime, address(0), targets, values, calldatas, gasAmounts); + } + + function run() public virtual { + _verifyAndExecuteProposal(); } } From 09c5b1b899bc5e662509b65f8b5be1d24e08e074 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Fri, 28 Jun 2024 10:29:34 +0700 Subject: [PATCH 04/15] chore: refactor code --- .../20240626-maptoken-anima-mainchain.s.sol | 92 +++--------- ...0240626-maptoken-anima-ronin-testnet.s.sol | 45 ++---- .../factory-maptoken-mainchain.s.sol | 133 +++++++++++++---- .../factory-maptoken-roninchain.s.sol | 136 +++++++++++------- 4 files changed, 215 insertions(+), 191 deletions(-) diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index ba079049..5ae85a9e 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -4,20 +4,31 @@ pragma solidity ^0.8.19; import "../factories/factory-maptoken-mainchain.s.sol"; import "./base-maptoken.s.sol"; import "@ronin/contracts/libraries/Ballot.sol"; - +import { console2 } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain { - uint256[] private _governorPKs; - address[] private _governors; MainchainBridgeAdminUtils _mainchainProposalUtils; function setUp() public virtual override { _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; + + _governorPKs = new uint256[](4); + _governorPKs[3] = 0x0; + _governorPKs[2] = 0x0; + _governorPKs[0] = 0x0; + _governorPKs[1] = 0x0; + + _governors = new address[](4); + _governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + _governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + _governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + _governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; } function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (address) { @@ -28,80 +39,9 @@ contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__ return Base__MapToken._initTokenList(); } - function _cheatStorage() internal { - // TODO: Replace with real governors, this is for local simulation only. - _governorPKs = new uint256[](4); - _governorPKs[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; - _governorPKs[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; - _governorPKs[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; - _governorPKs[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; - - _governors = new address[](4); - _governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - _governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; - _governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; - _governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; - - // ================ Cheat Storage =============== - - bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); - - //cheat governors addresses - for (uint256 i; i < 4; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(_governors[i])))); - } - //after cheat - for (uint256 i; i < 4; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); - - assertEq(afterCheatData, bytes32(uint256(uint160(_governors[i])))); - } - - //cheat governors weights - bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - for (uint256 i; i < 4; ++i) { - address key = _governors[i]; - bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); - vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); - } - bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); - } - - function _verifyAndExecuteProposal() internal virtual override { - (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); - _cheatStorage(); - - // uint256 chainId = network().companionChainId(); - uint256 expiredTime = block.timestamp + 14 days; - _mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); - - Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ - nonce: MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1, - chainId: block.chainid, - expiryTimestamp: expiredTime, - executor: address(0), - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - console2.log("preparing..."); - - Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](4); - supports_[0] = Ballot.VoteType.For; - supports_[1] = Ballot.VoteType.For; - supports_[2] = Ballot.VoteType.For; - supports_[3] = Ballot.VoteType.For; - - SignatureConsumer.Signature[] memory signatures = _mainchainProposalUtils.generateSignatures(proposal, _governorPKs); - vm.broadcast(_governors[0]); - MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); - } - function run() public override { console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network - super.run(); + // _cheatStorage(_governors); + _relayProposal(); } } diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index 8c73a539..0ca3a3ea 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -7,6 +7,15 @@ import "./base-maptoken.s.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRoninchain { + function setUp() public virtual override { + super.setUp(); + _governors = new address[](4); + _governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + _governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + _governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + _governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + } + function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { return Base__MapToken._initCaller(); } @@ -15,42 +24,6 @@ contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factor return Base__MapToken._initTokenList(); } - function _verifyAndExecuteProposal() internal virtual override { - // ================ VERIFY AND EXECUTE PROPOSAL =============== - // LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); - (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); - - uint256 expiredTime = block.timestamp + 14 days; - - Proposal.ProposalDetail memory proposal = Proposal.ProposalDetail({ - nonce: 2, - chainId: block.chainid, - expiryTimestamp: expiredTime, - executor: 0x0000000000000000000000000000000000000000, - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - - address[] memory governors = new address[](4); - governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; - - // _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); - - vm.broadcast(governors[0]); - _roninBridgeManager.propose(block.chainid, expiredTime, address(0), targets, values, calldatas, gasAmounts); - vm.broadcast(governors[0]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - vm.broadcast(governors[1]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - vm.broadcast(governors[2]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - } - function run() public override { console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network super.run(); diff --git a/script/factories/factory-maptoken-mainchain.s.sol b/script/factories/factory-maptoken-mainchain.s.sol index ea5a12de..9748226f 100644 --- a/script/factories/factory-maptoken-mainchain.s.sol +++ b/script/factories/factory-maptoken-mainchain.s.sol @@ -1,20 +1,25 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import "@ronin/contracts/libraries/Ballot.sol"; 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 { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; import { Contract } from "../utils/Contract.sol"; import { Migration } from "../Migration.s.sol"; -import { Network } from "../utils/Network.sol"; +import { Network, TNetwork } from "../utils/Network.sol"; import { Contract } from "../utils/Contract.sol"; import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; - +import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; abstract contract Factory__MapTokensMainchain is Migration { using LibCompanionNetwork for *; @@ -22,7 +27,9 @@ abstract contract Factory__MapTokensMainchain is Migration { RoninBridgeManager internal _roninBridgeManager; address internal _mainchainGatewayV3; address internal _mainchainBridgeManager; - address private _governor; + address internal _governor; + address[] internal _governors; + uint256[] internal _governorPKs; function setUp() public virtual override { super.setUp(); @@ -34,9 +41,80 @@ abstract contract Factory__MapTokensMainchain is Migration { _governor = _initCaller(); } + function run() public virtual { + _proposeProposal(); + } + function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + function _proposeProposal() internal virtual { + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + + vm.broadcast(_governor); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + } + + function _relayProposal() internal { + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + + MainchainBridgeAdminUtils mainchainProposalUtils = + new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); + + Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](_governors.length); + require(_governors.length > 0 && _governors.length == _governorPKs.length, "Invalid governors information"); + + for (uint256 i; i < _governors.length; ++i) { + supports_[i] = Ballot.VoteType.For; + } + + SignatureConsumer.Signature[] memory signatures = mainchainProposalUtils.generateSignatures(proposal, _governorPKs); + vm.broadcast(_governors[0]); + + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); + } + + function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { + (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = + _prepareMapTokensAndThresholds(); + bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + uint256 expiredTime = block.timestamp + 14 days; + address[] memory targets = new address[](1); + uint256[] memory values = new uint256[](1); + bytes[] memory calldatas = new bytes[](1); + uint256[] memory gasAmounts = new uint256[](1); + + targets[0] = _mainchainGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + uint256 nonce = (block.chainid == 2021 || block.chainid == 2020) ? 0 : MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1; + + // Verify gas when call from mainchain. + LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); + + // // Verify gas when call from ronin. + // (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); + // address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); + // LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); + + proposal = Proposal.ProposalDetail({ + nonce: nonce, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: address(0), + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + } + function _prepareMapTokensAndThresholds() internal returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) @@ -69,34 +147,31 @@ abstract contract Factory__MapTokensMainchain is Migration { } } - function _prepareProposal() internal returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) { - (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = - _prepareMapTokensAndThresholds(); - bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets = new address[](1); - values = new uint256[](1); - calldatas = new bytes[](1); - gasAmounts = new uint256[](1); - - targets[0] = _mainchainGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - } - - function _verifyAndExecuteProposal() internal virtual { - (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); + function _cheatStorage(address[] memory governors) internal { + // ================ Cheat Storage =============== - uint256 chainId = network().companionChainId(); - uint256 expiredTime = block.timestamp + 14 days; + bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); + uint256 length = governors.length; + //cheat governors addresses + for (uint256 i; i < length; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); + } + //after cheat + for (uint256 i; i < length; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); - vm.broadcast(_governor); - _roninBridgeManager.propose(chainId, expiredTime, address(0), targets, values, calldatas, gasAmounts); - } + assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); + } - function run() public virtual { - _verifyAndExecuteProposal(); + //cheat governors weights + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + for (uint256 i; i < length; ++i) { + address key = governors[i]; + bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); + vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); + } + bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); } } diff --git a/script/factories/factory-maptoken-roninchain.s.sol b/script/factories/factory-maptoken-roninchain.s.sol index 0354745e..ee26346b 100644 --- a/script/factories/factory-maptoken-roninchain.s.sol +++ b/script/factories/factory-maptoken-roninchain.s.sol @@ -10,13 +10,13 @@ import { MinimumWithdrawal } from "@ronin/contracts/extensions/MinimumWithdrawal import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; import { Ballot } from "@ronin/contracts/libraries/Ballot.sol"; import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; - +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Contract } from "../utils/Contract.sol"; import { Migration } from "../Migration.s.sol"; import { Network } from "../utils/Network.sol"; import { Contract } from "../utils/Contract.sol"; import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; - +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; @@ -26,14 +26,97 @@ abstract contract Factory__MapTokensRoninchain is Migration { RoninBridgeManager internal _roninBridgeManager; address internal _roninGatewayV3; address private _governor; + address[] internal _governors; - function setUp() public override { + function setUp() public virtual override { super.setUp(); _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); _governor = _initCaller(); _cheatWeightOperator(_governor); + + _governors = new address[](4); + _governors[3] = address(0); + _governors[2] = address(0); + _governors[0] = address(0); + _governors[1] = address(0); + } + + function run() public virtual { + _proposeAndCastVoteForProposal(); + } + + function _initCaller() internal virtual returns (address); + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + + function _proposeAndCastVoteForProposal() internal { + Proposal.ProposalDetail memory proposal = _proposeProposal(); + + uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); + uint256 sumVoteWeight; + uint256 amountGovernorsNeedToVote; + + for (uint256 i; i < _governors.length; ++i) { + sumVoteWeight += _roninBridgeManager.getGovernorWeight(_governors[i]); + amountGovernorsNeedToVote++; + if (sumVoteWeight >= minVoteWeight) break; + } + require(sumVoteWeight > 0 && amountGovernorsNeedToVote > 0); + + for (uint256 i; i < amountGovernorsNeedToVote; ++i) { + vm.broadcast(_governors[i]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + } + } + + function _proposeProposal() internal virtual returns (Proposal.ProposalDetail memory proposal) { + proposal = _createAndVerifyProposal(); + + vm.broadcast(_governor); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + } + + function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { + (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapToken(); + (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); + + address[] memory targets = new address[](2); + uint256[] memory values = new uint256[](2); + bytes[] memory calldatas = new bytes[](2); + uint256[] memory gasAmounts = new uint256[](2); + + bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + uint256 expiredTime = block.timestamp + 14 days; + targets[0] = _roninGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[1] = _roninGatewayV3; + values[1] = 0; + calldatas[1] = proxyData; + gasAmounts[1] = 1_000_000; + + LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); + + proposal = Proposal.ProposalDetail({ + nonce: RoninBridgeManager(_roninBridgeManager).round(2021) + 1, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: 0x0000000000000000000000000000000000000000, + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); } function _cheatWeightOperator(address gov) internal { @@ -45,9 +128,6 @@ abstract contract Factory__MapTokensRoninchain is Migration { vm.store(address(_roninBridgeManager), $, newOpAndWeight); } - function _initCaller() internal virtual returns (address); - function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function _prepareMapToken() internal returns (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) @@ -91,48 +171,4 @@ abstract contract Factory__MapTokensRoninchain is Migration { minThresholds[i] = tokenInfos[i].minThreshold; } } - - function _prepareProposal() internal returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) { - (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapToken(); - (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); - - targets = new address[](2); - values = new uint256[](2); - calldatas = new bytes[](2); - gasAmounts = new uint256[](2); - - bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[0] = _roninGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - - innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); - proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[1] = _roninGatewayV3; - values[1] = 0; - calldatas[1] = proxyData; - gasAmounts[1] = 1_000_000; - } - - function _verifyAndExecuteProposal() internal virtual { - // ================ VERIFY AND EXECUTE PROPOSAL =============== - - // _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); - - (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, uint256[] memory gasAmounts) = _prepareProposal(); - - uint256 chainId = network().companionChainId(); - uint256 expiredTime = block.timestamp + 14 days; - - vm.broadcast(_governor); - _roninBridgeManager.propose(chainId, expiredTime, address(0), targets, values, calldatas, gasAmounts); - } - - function run() public virtual { - _verifyAndExecuteProposal(); - } } From ada6b24cbc0725734568804cdb849314630213ad Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Mon, 1 Jul 2024 15:51:28 +0700 Subject: [PATCH 05/15] chore: refactor factory and map anima token script --- .../20240626-maptoken-anima-mainchain.s.sol | 38 +++++++++---------- ...0240626-maptoken-anima-ronin-testnet.s.sol | 20 +++++----- .../factory-maptoken-mainchain.s.sol | 25 ++++++------ .../factory-maptoken-roninchain.s.sol | 24 ++++++------ 4 files changed, 49 insertions(+), 58 deletions(-) diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index 5ae85a9e..c9c7d6de 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -14,23 +14,6 @@ import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBrid contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain { MainchainBridgeAdminUtils _mainchainProposalUtils; - function setUp() public virtual override { - _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; - _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; - - _governorPKs = new uint256[](4); - _governorPKs[3] = 0x0; - _governorPKs[2] = 0x0; - _governorPKs[0] = 0x0; - _governorPKs[1] = 0x0; - - _governors = new address[](4); - _governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - _governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - _governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - _governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; - } - function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (address) { return Base__MapToken._initCaller(); } @@ -40,8 +23,23 @@ contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__ } function run() public override { - console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network - // _cheatStorage(_governors); - _relayProposal(); + _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; + _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; + + _governorPKs = new uint256[](4); + _governorPKs[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + _governorPKs[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; + _governorPKs[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; + _governorPKs[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + _governors = new address[](4); + _governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + _governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; + _governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; + _governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + + _cheatStorage(_governors); + _relayProposal(proposal); } } diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index 0ca3a3ea..53aa0a18 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -7,15 +7,6 @@ import "./base-maptoken.s.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRoninchain { - function setUp() public virtual override { - super.setUp(); - _governors = new address[](4); - _governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - _governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - _governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - _governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; - } - function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { return Base__MapToken._initCaller(); } @@ -25,7 +16,14 @@ contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factor } function run() public override { - console2.log("nonce", vm.getNonce(SM_GOVERNOR)); // Log nonce for workaround of nonce increase when switch network - super.run(); + _governors = new address[](4); + _governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + _governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + _governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + _governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + + _proposeAndExecute(proposal); } } diff --git a/script/factories/factory-maptoken-mainchain.s.sol b/script/factories/factory-maptoken-mainchain.s.sol index 9748226f..18cb6b6b 100644 --- a/script/factories/factory-maptoken-mainchain.s.sol +++ b/script/factories/factory-maptoken-mainchain.s.sol @@ -12,7 +12,6 @@ import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibToken import { Contract } from "../utils/Contract.sol"; import { Migration } from "../Migration.s.sol"; import { Network, TNetwork } from "../utils/Network.sol"; -import { Contract } from "../utils/Contract.sol"; import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; @@ -31,35 +30,33 @@ abstract contract Factory__MapTokensMainchain is Migration { address[] internal _governors; uint256[] internal _governorPKs; - function setUp() public virtual override { + function setUp() public override { super.setUp(); - - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); - _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); - _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); + if (block.chainid == 2020 || block.chainid == 2021) { + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); + _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); + } _governor = _initCaller(); } function run() public virtual { - _proposeProposal(); + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + _propose(proposal); } function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function _proposeProposal() internal virtual { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - + function _propose(Proposal.ProposalDetail memory proposal) internal virtual { vm.broadcast(_governor); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts ); } - function _relayProposal() internal { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - + function _relayProposal(Proposal.ProposalDetail memory proposal) internal { MainchainBridgeAdminUtils mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); @@ -71,8 +68,8 @@ abstract contract Factory__MapTokensMainchain is Migration { } SignatureConsumer.Signature[] memory signatures = mainchainProposalUtils.generateSignatures(proposal, _governorPKs); - vm.broadcast(_governors[0]); + vm.broadcast(_governors[0]); MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); } diff --git a/script/factories/factory-maptoken-roninchain.s.sol b/script/factories/factory-maptoken-roninchain.s.sol index ee26346b..9cc636c2 100644 --- a/script/factories/factory-maptoken-roninchain.s.sol +++ b/script/factories/factory-maptoken-roninchain.s.sol @@ -35,23 +35,20 @@ abstract contract Factory__MapTokensRoninchain is Migration { _governor = _initCaller(); _cheatWeightOperator(_governor); - - _governors = new address[](4); - _governors[3] = address(0); - _governors[2] = address(0); - _governors[0] = address(0); - _governors[1] = address(0); } function run() public virtual { - _proposeAndCastVoteForProposal(); + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + _propose(proposal); } function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function _proposeAndCastVoteForProposal() internal { - Proposal.ProposalDetail memory proposal = _proposeProposal(); + function _proposeAndExecute(Proposal.ProposalDetail memory proposal) internal { + proposal.executor = _governors[0]; + + _propose(proposal); uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); uint256 sumVoteWeight; @@ -68,11 +65,12 @@ abstract contract Factory__MapTokensRoninchain is Migration { vm.broadcast(_governors[i]); _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); } - } - function _proposeProposal() internal virtual returns (Proposal.ProposalDetail memory proposal) { - proposal = _createAndVerifyProposal(); + vm.broadcast(_governors[0]); + _roninBridgeManager.execute{ gas: 2_000_000 }(proposal); + } + function _propose(Proposal.ProposalDetail memory proposal) internal virtual { vm.broadcast(_governor); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts @@ -111,7 +109,7 @@ abstract contract Factory__MapTokensRoninchain is Migration { nonce: RoninBridgeManager(_roninBridgeManager).round(2021) + 1, chainId: block.chainid, expiryTimestamp: expiredTime, - executor: 0x0000000000000000000000000000000000000000, + executor: address(0), targets: targets, values: values, calldatas: calldatas, From 6c27f978c33455959e64b38a5ef9d07ff862dc0f Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Mon, 1 Jul 2024 17:23:30 +0700 Subject: [PATCH 06/15] script: refactor scripts --- .../20240626-maptoken-anima-mainchain.s.sol | 29 +++++++++++-------- ...0240626-maptoken-anima-ronin-testnet.s.sol | 13 +++++---- .../factory-maptoken-mainchain.s.sol | 23 +++++++++++---- .../factory-maptoken-roninchain.s.sol | 1 - 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index c9c7d6de..7e165396 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -26,20 +26,25 @@ contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__ _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; - _governorPKs = new uint256[](4); - _governorPKs[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; - _governorPKs[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; - _governorPKs[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; - _governorPKs[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; - _governors = new address[](4); - _governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - _governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; - _governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; - _governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + uint256[] memory governorsPkMemory = new uint256[](4); + governorsPkMemory[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + governorsPkMemory[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; + governorsPkMemory[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; + governorsPkMemory[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + + address[] memory governorsMemory = new address[](4); + governorsMemory[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + governorsMemory[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; + governorsMemory[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; + governorsMemory[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + + for (uint256 i; i < 4; ++i) { + _governors.push(governorsMemory[i]); + _governorPKs.push(governorsPkMemory[i]); + } Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - - _cheatStorage(_governors); + _cheatStorage(governorsMemory); _relayProposal(proposal); } } diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index 53aa0a18..347f05fc 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -16,11 +16,14 @@ contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factor } function run() public override { - _governors = new address[](4); - _governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - _governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - _governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - _governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + address[] memory governorsMemory = new address[](4); + governorsMemory[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + governorsMemory[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + governorsMemory[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + governorsMemory[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + for (uint256 i; i < 4; ++i) { + _governors.push(governorsMemory[i]); + } Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); diff --git a/script/factories/factory-maptoken-mainchain.s.sol b/script/factories/factory-maptoken-mainchain.s.sol index 18cb6b6b..9cc7f660 100644 --- a/script/factories/factory-maptoken-mainchain.s.sol +++ b/script/factories/factory-maptoken-mainchain.s.sol @@ -69,8 +69,13 @@ abstract contract Factory__MapTokensMainchain is Migration { SignatureConsumer.Signature[] memory signatures = mainchainProposalUtils.generateSignatures(proposal, _governorPKs); + uint256 gasAmounts = 1_000_000; + for (uint256 i; i < proposal.gasAmounts.length; ++i) { + gasAmounts += proposal.gasAmounts[i]; + } + vm.broadcast(_governors[0]); - MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: 2_000_000 }(proposal, supports_, signatures); + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, supports_, signatures); } function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { @@ -90,8 +95,6 @@ abstract contract Factory__MapTokensMainchain is Migration { calldatas[0] = proxyData; gasAmounts[0] = 1_000_000; - uint256 nonce = (block.chainid == 2021 || block.chainid == 2020) ? 0 : MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1; - // Verify gas when call from mainchain. LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); @@ -100,9 +103,19 @@ abstract contract Factory__MapTokensMainchain is Migration { // address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); // LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); + uint256 chainId; + uint256 nonce; + if (block.chainid == 2020 || block.chainid == 2021) { + nonce = 0; + (chainId,) = network().companionNetworkData(); + } else { + nonce = MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1; + chainId = block.chainid; + } + proposal = Proposal.ProposalDetail({ nonce: nonce, - chainId: block.chainid, + chainId: chainId, expiryTimestamp: expiredTime, executor: address(0), targets: targets, @@ -145,8 +158,6 @@ abstract contract Factory__MapTokensMainchain is Migration { } function _cheatStorage(address[] memory governors) internal { - // ================ Cheat Storage =============== - bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); uint256 length = governors.length; //cheat governors addresses diff --git a/script/factories/factory-maptoken-roninchain.s.sol b/script/factories/factory-maptoken-roninchain.s.sol index 9cc636c2..35f92d42 100644 --- a/script/factories/factory-maptoken-roninchain.s.sol +++ b/script/factories/factory-maptoken-roninchain.s.sol @@ -47,7 +47,6 @@ abstract contract Factory__MapTokensRoninchain is Migration { function _proposeAndExecute(Proposal.ProposalDetail memory proposal) internal { proposal.executor = _governors[0]; - _propose(proposal); uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); From a7a19f1806a6344f8c0695f5493409808b95f268 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Tue, 2 Jul 2024 17:11:44 +0700 Subject: [PATCH 07/15] script: minor refactor --- .../20240626-maptoken-anima-mainchain.s.sol | 34 ++-- ...0240626-maptoken-anima-ronin-testnet.s.sol | 21 +-- .../base-maptoken.s.sol | 11 +- .../governors-configs.s.sol | 20 +++ .../factory-maptoken-mainchain-ethereum.s.sol | 29 ++++ .../factory-maptoken-mainchain-sepolia.s.sol | 40 +++++ .../factory-maptoken-mainchain.s.sol | 160 +++++++++++++++++ .../factory-maptoken-ronin-mainnet.s.sol | 28 +++ .../factory-maptoken-ronin-testnet.s.sol | 34 ++++ .../factory-maptoken-roninchain.s.sol | 163 ++++++++++++++++++ 10 files changed, 501 insertions(+), 39 deletions(-) create mode 100644 script/20240626-maptoken-anima/governors-configs.s.sol create mode 100644 script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol create mode 100644 script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol create mode 100644 script/factories/mainchain/factory-maptoken-mainchain.s.sol create mode 100644 script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol create mode 100644 script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol create mode 100644 script/factories/roninchain/factory-maptoken-roninchain.s.sol diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index 7e165396..f85a5e6b 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import "../factories/factory-maptoken-mainchain.s.sol"; +import "../factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol"; import "./base-maptoken.s.sol"; import "@ronin/contracts/libraries/Ballot.sol"; import { console2 } from "forge-std/console2.sol"; @@ -11,7 +11,7 @@ import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/Signatu import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; -contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain { +contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchainSepolia { MainchainBridgeAdminUtils _mainchainProposalUtils; function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (address) { @@ -22,29 +22,15 @@ contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__ return Base__MapToken._initTokenList(); } - function run() public override { - _mainchainGatewayV3 = 0x06855f31dF1d3D25cE486CF09dB49bDa535D2a9e; - _mainchainBridgeManager = 0x603075B625cc2cf69FbB3546C6acC2451FE792AF; - - uint256[] memory governorsPkMemory = new uint256[](4); - governorsPkMemory[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; - governorsPkMemory[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; - governorsPkMemory[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; - governorsPkMemory[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; - - address[] memory governorsMemory = new address[](4); - governorsMemory[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - governorsMemory[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; - governorsMemory[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; - governorsMemory[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + function _initGovernors() internal override(Base__MapToken, Factory__MapTokensMainchainSepolia) returns (address[] memory) { + return Base__MapToken._initGovernors(); + } - for (uint256 i; i < 4; ++i) { - _governors.push(governorsMemory[i]); - _governorPKs.push(governorsPkMemory[i]); - } + function _initGovernorPKs() internal override(Base__MapToken, Factory__MapTokensMainchainSepolia) returns (uint256[] memory) { + return Base__MapToken._initGovernorPKs(); + } - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - _cheatStorage(governorsMemory); - _relayProposal(proposal); + function run() public override { + super.run(); } } diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index 347f05fc..e2c9185a 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -2,11 +2,11 @@ pragma solidity ^0.8.19; import { console2 } from "forge-std/console2.sol"; -import "../factories/factory-maptoken-roninchain.s.sol"; +import "../factories/roninchain/factory-maptoken-ronin-testnet.s.sol"; import "./base-maptoken.s.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; -contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRoninchain { +contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factory__MapTokensRonin_Testnet { function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { return Base__MapToken._initCaller(); } @@ -15,18 +15,11 @@ contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factor return Base__MapToken._initTokenList(); } - function run() public override { - address[] memory governorsMemory = new address[](4); - governorsMemory[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - governorsMemory[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - governorsMemory[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - governorsMemory[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; - for (uint256 i; i < 4; ++i) { - _governors.push(governorsMemory[i]); - } - - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + function _initGovernors() internal override(Base__MapToken, Factory__MapTokensRonin_Testnet) returns (address[] memory) { + return Base__MapToken._initGovernors(); + } - _proposeAndExecute(proposal); + function run() public override { + super.run(); } } diff --git a/script/20240626-maptoken-anima/base-maptoken.s.sol b/script/20240626-maptoken-anima/base-maptoken.s.sol index 82565522..aca143de 100644 --- a/script/20240626-maptoken-anima/base-maptoken.s.sol +++ b/script/20240626-maptoken-anima/base-maptoken.s.sol @@ -5,12 +5,21 @@ import "forge-std/console2.sol"; import "./caller-configs.s.sol"; import "./maptoken-anima-configs.s.sol"; +import "./governors-configs.s.sol"; -contract Base__MapToken is Migration__Caller_Config, Migration__MapToken_Anima_Config { +contract Base__MapToken is Migration__Caller_Config, Migration__MapToken_Anima_Config, Migration__Governors_Config { function _initCaller() internal virtual returns (address) { return SM_GOVERNOR; } + function _initGovernors() internal virtual returns (address[] memory) { + return governors; + } + + function _initGovernorPKs() internal virtual returns (uint256[] memory) { + return governorPks; + } + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos) { totalToken = 1; diff --git a/script/20240626-maptoken-anima/governors-configs.s.sol b/script/20240626-maptoken-anima/governors-configs.s.sol new file mode 100644 index 00000000..09877741 --- /dev/null +++ b/script/20240626-maptoken-anima/governors-configs.s.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +contract Migration__Governors_Config { + address[] internal governors = new address[](4); + uint256[] internal governorPks = new uint256[](4); + + constructor() { + // TODO: replace by address of the testnet governors + governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + // TODO: replace by private key of the testnet governors + governorPks[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + governorPks[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; + governorPks[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; + governorPks[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + } +} diff --git a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol new file mode 100644 index 00000000..e2ddec08 --- /dev/null +++ b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import "./factory-maptoken-mainchain.s.sol"; + +abstract contract Factory__MapTokensMainchainEthereum is Factory__MapTokensMainchain { + using LibCompanionNetwork for *; + + function setUp() public override { + super.setUp(); + + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); + _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); + + _governor = _initCaller(); + } + + function run() public virtual override { + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(block.chainid, 0); + _propose(proposal); + } +} diff --git a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol new file mode 100644 index 00000000..a680f573 --- /dev/null +++ b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; +import { console2 } from "forge-std/console2.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import "./factory-maptoken-mainchain.s.sol"; + +abstract contract Factory__MapTokensMainchainSepolia is Factory__MapTokensMainchain { + using LibCompanionNetwork for *; + + function setUp() public override { + super.setUp(); + _mainchainGatewayV3 = config.getAddressFromCurrentNetwork(Contract.MainchainGatewayV3.key()); + _mainchainBridgeManager = config.getAddressFromCurrentNetwork(Contract.MainchainBridgeManager.key()); + } + + function _initGovernorPKs() internal virtual returns (uint256[] memory); + function _initGovernors() internal virtual returns (address[] memory); + + function run() public virtual override { + address[] memory governorsM = _initGovernors(); + uint256[] memory governorsPksM = _initGovernorPKs(); + + for (uint256 i; i < governorsM.length; ++i) { + _governors.push(governorsM[i]); + _governorPKs.push(governorsPksM[i]); + } + _cheatStorage(_governors); + + uint256 chainId = block.chainid; + uint256 nonce = MainchainBridgeManager(_mainchainBridgeManager).round(chainId) + 1; + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(chainId, nonce); + _relayProposal(proposal); + } +} diff --git a/script/factories/mainchain/factory-maptoken-mainchain.s.sol b/script/factories/mainchain/factory-maptoken-mainchain.s.sol new file mode 100644 index 00000000..667a64d4 --- /dev/null +++ b/script/factories/mainchain/factory-maptoken-mainchain.s.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@ronin/contracts/libraries/Ballot.sol"; +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 { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { Migration } from "../../Migration.s.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; +import { IGeneralConfigExtended } from "../../interfaces/IGeneralConfigExtended.sol"; +import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; +import { MapTokenInfo } from "../../libraries/MapTokenInfo.sol"; +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; + +abstract contract Factory__MapTokensMainchain is Migration { + using LibCompanionNetwork for *; + + RoninBridgeManager internal _roninBridgeManager; + address internal _mainchainGatewayV3; + address internal _mainchainBridgeManager; + address internal _governor; + address[] internal _governors; + uint256[] internal _governorPKs; + + function run() public virtual; + function _initCaller() internal virtual returns (address); + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + + function _propose(Proposal.ProposalDetail memory proposal) internal virtual { + vm.broadcast(_governor); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + } + + function _relayProposal(Proposal.ProposalDetail memory proposal) internal { + MainchainBridgeAdminUtils mainchainProposalUtils = + new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); + + Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](_governors.length); + require(_governors.length > 0 && _governors.length == _governorPKs.length, "Invalid governors information"); + + for (uint256 i; i < _governors.length; ++i) { + supports_[i] = Ballot.VoteType.For; + } + + SignatureConsumer.Signature[] memory signatures = mainchainProposalUtils.generateSignatures(proposal, _governorPKs); + + uint256 gasAmounts = 1_000_000; + for (uint256 i; i < proposal.gasAmounts.length; ++i) { + gasAmounts += proposal.gasAmounts[i]; + } + + vm.broadcast(_governors[0]); + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, supports_, signatures); + } + + function _createAndVerifyProposal(uint256 chainId, uint256 nonce) internal returns (Proposal.ProposalDetail memory proposal) { + (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = + _prepareMapTokensAndThresholds(); + bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + uint256 expiredTime = block.timestamp + 14 days; + address[] memory targets = new address[](1); + uint256[] memory values = new uint256[](1); + bytes[] memory calldatas = new bytes[](1); + uint256[] memory gasAmounts = new uint256[](1); + + targets[0] = _mainchainGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + // Verify gas when call from mainchain. + LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); + + // // Verify gas when call from ronin. + // (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); + // address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); + // LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); + + proposal = Proposal.ProposalDetail({ + nonce: nonce, + chainId: chainId, + expiryTimestamp: expiredTime, + executor: address(0), + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + } + + function _prepareMapTokensAndThresholds() + internal + returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) + { + // function mapTokensAndThresholds( + // address[] calldata _mainchainTokens, + // address[] calldata _roninTokens, + // TokenStandard.ERC20[] calldata _standards, + // uint256[][4] calldata _thresholds + // ) + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + + mainchainTokens = new address[](N); + roninTokens = new address[](N); + standards = new TokenStandard[](N); + + thresholds[0] = new uint256[](N); + thresholds[1] = new uint256[](N); + thresholds[2] = new uint256[](N); + thresholds[3] = new uint256[](N); + + for (uint256 i; i < N; ++i) { + mainchainTokens[i] = tokenInfos[i].mainchainToken; + roninTokens[i] = tokenInfos[i].roninToken; + standards[i] = TokenStandard.ERC20; + thresholds[0][i] = tokenInfos[i].highTierThreshold; + thresholds[1][i] = tokenInfos[i].lockedThreshold; + thresholds[2][i] = tokenInfos[i].unlockFeePercentages; + thresholds[3][i] = tokenInfos[i].dailyWithdrawalLimit; + } + } + + function _cheatStorage(address[] memory governors) internal { + bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); + uint256 length = governors.length; + //cheat governors addresses + for (uint256 i; i < length; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); + } + //after cheat + for (uint256 i; i < length; ++i) { + bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); + bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); + + assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); + } + + //cheat governors weights + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + for (uint256 i; i < length; ++i) { + address key = governors[i]; + bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); + vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); + } + bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); + } +} diff --git a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol new file mode 100644 index 00000000..3be12de4 --- /dev/null +++ b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol @@ -0,0 +1,28 @@ +pragma solidity ^0.8.19; + +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; +import { console2 } from "forge-std/console2.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import "./factory-maptoken-roninchain.s.sol"; + +abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchain { + using LibCompanionNetwork for *; + + function setUp() public override { + super.setUp(); + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); + _governor = _initCaller(); + } + + function _initGovernors() internal virtual returns (address[] memory); + + function run() public virtual override { + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + _propose(proposal); + } +} diff --git a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol new file mode 100644 index 00000000..28d58f06 --- /dev/null +++ b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.8.19; + +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; +import { console2 } from "forge-std/console2.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import "./factory-maptoken-roninchain.s.sol"; + +abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchain { + using LibCompanionNetwork for *; + + function setUp() public override { + super.setUp(); + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); + _governor = _initCaller(); + } + + function _initGovernors() internal virtual returns (address[] memory); + + function run() public virtual override { + address[] memory governorsM = _initGovernors(); + + for (uint256 i; i < governorsM.length; ++i) { + _governors.push(governorsM[i]); + } + + Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + _proposeAndExecute(proposal); + } +} diff --git a/script/factories/roninchain/factory-maptoken-roninchain.s.sol b/script/factories/roninchain/factory-maptoken-roninchain.s.sol new file mode 100644 index 00000000..581f6d61 --- /dev/null +++ b/script/factories/roninchain/factory-maptoken-roninchain.s.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { console2 } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; + +import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; +import { IRoninGatewayV3 } from "@ronin/contracts/interfaces/IRoninGatewayV3.sol"; +import { MinimumWithdrawal } from "@ronin/contracts/extensions/MinimumWithdrawal.sol"; +import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; +import { Ballot } from "@ronin/contracts/libraries/Ballot.sol"; +import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { Migration } from "../../Migration.s.sol"; +import { Network } from "../../utils/Network.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { IGeneralConfigExtended } from "../../interfaces/IGeneralConfigExtended.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { MapTokenInfo } from "../../libraries/MapTokenInfo.sol"; +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; + +abstract contract Factory__MapTokensRoninchain is Migration { + using LibCompanionNetwork for *; + + RoninBridgeManager internal _roninBridgeManager; + address internal _roninGatewayV3; + address internal _governor; + address[] internal _governors; + + function run() public virtual; + function _initCaller() internal virtual returns (address); + function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + + function _proposeAndExecute(Proposal.ProposalDetail memory proposal) internal { + proposal.executor = _governors[0]; + _propose(proposal); + + uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); + uint256 sumVoteWeight; + uint256 numberGovernorsNeedToVote; + + for (uint256 i; i < _governors.length; ++i) { + sumVoteWeight += _roninBridgeManager.getGovernorWeight(_governors[i]); + numberGovernorsNeedToVote++; + if (sumVoteWeight >= minVoteWeight) break; + } + require(sumVoteWeight > 0 && numberGovernorsNeedToVote > 0); + + for (uint256 i; i < numberGovernorsNeedToVote; ++i) { + vm.broadcast(_governors[i]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + } + + uint256 gasAmounts = 1_000_000; + for (uint256 i; i < proposal.gasAmounts.length; ++i) { + gasAmounts += proposal.gasAmounts[i]; + } + + vm.broadcast(_governors[0]); + _roninBridgeManager.execute{ gas: gasAmounts }(proposal); + } + + function _propose(Proposal.ProposalDetail memory proposal) internal virtual { + vm.broadcast(_governor); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + } + + function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { + (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapToken(); + (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); + + address[] memory targets = new address[](2); + uint256[] memory values = new uint256[](2); + bytes[] memory calldatas = new bytes[](2); + uint256[] memory gasAmounts = new uint256[](2); + + bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + uint256 expiredTime = block.timestamp + 14 days; + targets[0] = _roninGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[1] = _roninGatewayV3; + values[1] = 0; + calldatas[1] = proxyData; + gasAmounts[1] = 1_000_000; + + LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); + + proposal = Proposal.ProposalDetail({ + nonce: RoninBridgeManager(_roninBridgeManager).round(2021) + 1, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: address(0), + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + } + + function _cheatWeightOperator(address gov) internal { + bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); + bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); + + uint256 totalWeight = _roninBridgeManager.getTotalWeight(); + bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight))); + vm.store(address(_roninBridgeManager), $, newOpAndWeight); + } + + function _prepareMapToken() + internal + returns (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) + { + // function mapTokens( + // address[] calldata _roninTokens, + // address[] calldata _mainchainTokens, + // uint256[] calldata chainIds, + // TokenStandard[] calldata _standards + // ) + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + + roninTokens = new address[](N); + mainchainTokens = new address[](N); + chainIds = new uint256[](N); + standards = new TokenStandard[](N); + + // ============= MAP TOKENS =========== + + for (uint256 i; i < N; ++i) { + roninTokens[i] = tokenInfos[i].roninToken; + mainchainTokens[i] = tokenInfos[i].mainchainToken; + chainIds[i] = network().companionChainId(); + standards[i] = TokenStandard.ERC20; + } + } + + function _prepareSetMinThreshold() internal returns (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) { + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + + // ============= SET MIN THRESHOLD ============ + // function setMinimumThresholds( + // address[] calldata _tokens, + // uint256[] calldata _thresholds + // ); + roninTokensToSetMinThreshold = new address[](N); + minThresholds = new uint256[](N); + + for (uint256 i; i < N; ++i) { + roninTokensToSetMinThreshold[i] = tokenInfos[i].roninToken; + minThresholds[i] = tokenInfos[i].minThreshold; + } + } +} From 015948bc00647dc2a0a7005c9aa5424fbe454e10 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 3 Jul 2024 11:32:25 +0700 Subject: [PATCH 08/15] chore: restructure factories scripts --- .../governors-configs.s.sol | 8 +- .../factory-maptoken-mainchain.s.sol | 185 ------------------ .../factory-maptoken-roninchain.s.sol | 171 ---------------- .../factory-maptoken-ronin-mainnet.s.sol | 4 +- 4 files changed, 5 insertions(+), 363 deletions(-) delete mode 100644 script/factories/factory-maptoken-mainchain.s.sol delete mode 100644 script/factories/factory-maptoken-roninchain.s.sol diff --git a/script/20240626-maptoken-anima/governors-configs.s.sol b/script/20240626-maptoken-anima/governors-configs.s.sol index 09877741..04241b3d 100644 --- a/script/20240626-maptoken-anima/governors-configs.s.sol +++ b/script/20240626-maptoken-anima/governors-configs.s.sol @@ -7,10 +7,10 @@ contract Migration__Governors_Config { constructor() { // TODO: replace by address of the testnet governors - governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; - governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; - governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; - governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; + governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; + governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; + governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; // TODO: replace by private key of the testnet governors governorPks[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; governorPks[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; diff --git a/script/factories/factory-maptoken-mainchain.s.sol b/script/factories/factory-maptoken-mainchain.s.sol deleted file mode 100644 index 9cc7f660..00000000 --- a/script/factories/factory-maptoken-mainchain.s.sol +++ /dev/null @@ -1,185 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -import "@ronin/contracts/libraries/Ballot.sol"; -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 { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; -import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; -import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; -import { Contract } from "../utils/Contract.sol"; -import { Migration } from "../Migration.s.sol"; -import { Network, TNetwork } from "../utils/Network.sol"; -import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; -import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; -import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; -import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; -import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; -import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; -import { LibProposal } from "script/shared/libraries/LibProposal.sol"; - -abstract contract Factory__MapTokensMainchain is Migration { - using LibCompanionNetwork for *; - - RoninBridgeManager internal _roninBridgeManager; - address internal _mainchainGatewayV3; - address internal _mainchainBridgeManager; - address internal _governor; - address[] internal _governors; - uint256[] internal _governorPKs; - - function setUp() public override { - super.setUp(); - if (block.chainid == 2020 || block.chainid == 2021) { - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); - _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); - _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); - } - - _governor = _initCaller(); - } - - function run() public virtual { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - _propose(proposal); - } - - function _initCaller() internal virtual returns (address); - function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - - function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - vm.broadcast(_governor); - _roninBridgeManager.propose( - proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts - ); - } - - function _relayProposal(Proposal.ProposalDetail memory proposal) internal { - MainchainBridgeAdminUtils mainchainProposalUtils = - new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); - - Ballot.VoteType[] memory supports_ = new Ballot.VoteType[](_governors.length); - require(_governors.length > 0 && _governors.length == _governorPKs.length, "Invalid governors information"); - - for (uint256 i; i < _governors.length; ++i) { - supports_[i] = Ballot.VoteType.For; - } - - SignatureConsumer.Signature[] memory signatures = mainchainProposalUtils.generateSignatures(proposal, _governorPKs); - - uint256 gasAmounts = 1_000_000; - for (uint256 i; i < proposal.gasAmounts.length; ++i) { - gasAmounts += proposal.gasAmounts[i]; - } - - vm.broadcast(_governors[0]); - MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, supports_, signatures); - } - - function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { - (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = - _prepareMapTokensAndThresholds(); - bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - uint256 expiredTime = block.timestamp + 14 days; - address[] memory targets = new address[](1); - uint256[] memory values = new uint256[](1); - bytes[] memory calldatas = new bytes[](1); - uint256[] memory gasAmounts = new uint256[](1); - - targets[0] = _mainchainGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - - // Verify gas when call from mainchain. - LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); - - // // Verify gas when call from ronin. - // (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); - // address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); - // LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); - - uint256 chainId; - uint256 nonce; - if (block.chainid == 2020 || block.chainid == 2021) { - nonce = 0; - (chainId,) = network().companionNetworkData(); - } else { - nonce = MainchainBridgeManager(_mainchainBridgeManager).round(11155111) + 1; - chainId = block.chainid; - } - - proposal = Proposal.ProposalDetail({ - nonce: nonce, - chainId: chainId, - expiryTimestamp: expiredTime, - executor: address(0), - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - } - - function _prepareMapTokensAndThresholds() - internal - returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) - { - // function mapTokensAndThresholds( - // address[] calldata _mainchainTokens, - // address[] calldata _roninTokens, - // TokenStandard.ERC20[] calldata _standards, - // uint256[][4] calldata _thresholds - // ) - (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - - mainchainTokens = new address[](N); - roninTokens = new address[](N); - standards = new TokenStandard[](N); - - thresholds[0] = new uint256[](N); - thresholds[1] = new uint256[](N); - thresholds[2] = new uint256[](N); - thresholds[3] = new uint256[](N); - - for (uint256 i; i < N; ++i) { - mainchainTokens[i] = tokenInfos[i].mainchainToken; - roninTokens[i] = tokenInfos[i].roninToken; - standards[i] = TokenStandard.ERC20; - thresholds[0][i] = tokenInfos[i].highTierThreshold; - thresholds[1][i] = tokenInfos[i].lockedThreshold; - thresholds[2][i] = tokenInfos[i].unlockFeePercentages; - thresholds[3][i] = tokenInfos[i].dailyWithdrawalLimit; - } - } - - function _cheatStorage(address[] memory governors) internal { - bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); - uint256 length = governors.length; - //cheat governors addresses - for (uint256 i; i < length; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); - } - //after cheat - for (uint256 i; i < length; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); - - assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); - } - - //cheat governors weights - bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - for (uint256 i; i < length; ++i) { - address key = governors[i]; - bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); - vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); - } - bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); - } -} diff --git a/script/factories/factory-maptoken-roninchain.s.sol b/script/factories/factory-maptoken-roninchain.s.sol deleted file mode 100644 index 35f92d42..00000000 --- a/script/factories/factory-maptoken-roninchain.s.sol +++ /dev/null @@ -1,171 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -import { console2 } from "forge-std/console2.sol"; -import { StdStyle } from "forge-std/StdStyle.sol"; - -import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; -import { IRoninGatewayV3 } from "@ronin/contracts/interfaces/IRoninGatewayV3.sol"; -import { MinimumWithdrawal } from "@ronin/contracts/extensions/MinimumWithdrawal.sol"; -import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; -import { Ballot } from "@ronin/contracts/libraries/Ballot.sol"; -import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol"; -import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; -import { Contract } from "../utils/Contract.sol"; -import { Migration } from "../Migration.s.sol"; -import { Network } from "../utils/Network.sol"; -import { Contract } from "../utils/Contract.sol"; -import { IGeneralConfigExtended } from "../interfaces/IGeneralConfigExtended.sol"; -import { LibProposal } from "script/shared/libraries/LibProposal.sol"; -import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; -import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; - -abstract contract Factory__MapTokensRoninchain is Migration { - using LibCompanionNetwork for *; - - RoninBridgeManager internal _roninBridgeManager; - address internal _roninGatewayV3; - address private _governor; - address[] internal _governors; - - function setUp() public virtual override { - super.setUp(); - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); - _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); - - _governor = _initCaller(); - _cheatWeightOperator(_governor); - } - - function run() public virtual { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - _propose(proposal); - } - - function _initCaller() internal virtual returns (address); - function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - - function _proposeAndExecute(Proposal.ProposalDetail memory proposal) internal { - proposal.executor = _governors[0]; - _propose(proposal); - - uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); - uint256 sumVoteWeight; - uint256 amountGovernorsNeedToVote; - - for (uint256 i; i < _governors.length; ++i) { - sumVoteWeight += _roninBridgeManager.getGovernorWeight(_governors[i]); - amountGovernorsNeedToVote++; - if (sumVoteWeight >= minVoteWeight) break; - } - require(sumVoteWeight > 0 && amountGovernorsNeedToVote > 0); - - for (uint256 i; i < amountGovernorsNeedToVote; ++i) { - vm.broadcast(_governors[i]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - } - - vm.broadcast(_governors[0]); - _roninBridgeManager.execute{ gas: 2_000_000 }(proposal); - } - - function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - vm.broadcast(_governor); - _roninBridgeManager.propose( - proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts - ); - } - - function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { - (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapToken(); - (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); - - address[] memory targets = new address[](2); - uint256[] memory values = new uint256[](2); - bytes[] memory calldatas = new bytes[](2); - uint256[] memory gasAmounts = new uint256[](2); - - bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - uint256 expiredTime = block.timestamp + 14 days; - targets[0] = _roninGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - - innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); - proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[1] = _roninGatewayV3; - values[1] = 0; - calldatas[1] = proxyData; - gasAmounts[1] = 1_000_000; - - LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); - - proposal = Proposal.ProposalDetail({ - nonce: RoninBridgeManager(_roninBridgeManager).round(2021) + 1, - chainId: block.chainid, - expiryTimestamp: expiredTime, - executor: address(0), - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - } - - function _cheatWeightOperator(address gov) internal { - bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); - bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); - - uint256 totalWeight = _roninBridgeManager.getTotalWeight(); - bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight))); - vm.store(address(_roninBridgeManager), $, newOpAndWeight); - } - - function _prepareMapToken() - internal - returns (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) - { - // function mapTokens( - // address[] calldata _roninTokens, - // address[] calldata _mainchainTokens, - // uint256[] calldata chainIds, - // TokenStandard[] calldata _standards - // ) - (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - - roninTokens = new address[](N); - mainchainTokens = new address[](N); - chainIds = new uint256[](N); - standards = new TokenStandard[](N); - - // ============= MAP TOKENS =========== - - for (uint256 i; i < N; ++i) { - roninTokens[i] = tokenInfos[i].roninToken; - mainchainTokens[i] = tokenInfos[i].mainchainToken; - chainIds[i] = network().companionChainId(); - standards[i] = TokenStandard.ERC20; - } - } - - function _prepareSetMinThreshold() internal returns (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) { - (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); - - // ============= SET MIN THRESHOLD ============ - // function setMinimumThresholds( - // address[] calldata _tokens, - // uint256[] calldata _thresholds - // ); - roninTokensToSetMinThreshold = new address[](N); - minThresholds = new uint256[](N); - - for (uint256 i; i < N; ++i) { - roninTokensToSetMinThreshold[i] = tokenInfos[i].roninToken; - minThresholds[i] = tokenInfos[i].minThreshold; - } - } -} diff --git a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol index 3be12de4..b3896b82 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol @@ -9,7 +9,7 @@ import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-roninchain.s.sol"; -abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchain { +abstract contract Factory__MapTokensRonin_Mainnet is Factory__MapTokensRoninchain { using LibCompanionNetwork for *; function setUp() public override { @@ -19,8 +19,6 @@ abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchai _governor = _initCaller(); } - function _initGovernors() internal virtual returns (address[] memory); - function run() public virtual override { Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); _propose(proposal); From b5e07ce3697369eca038f89a3059ea403840038e Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Fri, 5 Jul 2024 18:00:33 +0700 Subject: [PATCH 09/15] chore: resolve Bao's comments --- .../20240308-maptoken-aperios-mainchain.s.sol | 4 +- ...20240308-maptoken-aperios-roninchain.s.sol | 4 +- .../20240626-maptoken-anima-mainchain.s.sol | 29 ++++- ...0240626-maptoken-anima-ronin-testnet.s.sol | 2 +- .../governors-configs.s.sol | 16 +-- .../maptoken-anima-configs.s.sol | 2 + .../factory-maptoken-mainchain-ethereum.s.sol | 6 +- .../factory-maptoken-mainchain-sepolia.s.sol | 42 +++++-- .../factory-maptoken-mainchain.s.sol | 93 ++++++++++---- .../factory-maptoken-ronin-mainnet.s.sol | 4 +- .../factory-maptoken-ronin-testnet.s.sol | 12 +- .../factory-maptoken-roninchain.s.sol | 117 +++++++++++------- script/libraries/MapTokenInfo.sol | 4 + 13 files changed, 222 insertions(+), 113 deletions(-) diff --git a/script/20240308-maptoken-aperios/20240308-maptoken-aperios-mainchain.s.sol b/script/20240308-maptoken-aperios/20240308-maptoken-aperios-mainchain.s.sol index 57cf4462..b5fc25a7 100644 --- a/script/20240308-maptoken-aperios/20240308-maptoken-aperios-mainchain.s.sol +++ b/script/20240308-maptoken-aperios/20240308-maptoken-aperios-mainchain.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import "../factories/factory-maptoken-mainchain.s.sol"; +import "../factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol"; import "./base-maptoken.s.sol"; -contract Migration__20240308_MapTokenAperiosMainchain is Base__MapToken, Factory__MapTokensMainchain { +contract Migration__20240308_MapTokenAperiosMainchain is Base__MapToken, Factory__MapTokensMainchain_Ethereum { function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (address) { return Base__MapToken._initCaller(); } diff --git a/script/20240308-maptoken-aperios/20240308-maptoken-aperios-roninchain.s.sol b/script/20240308-maptoken-aperios/20240308-maptoken-aperios-roninchain.s.sol index ff54faad..212ee7f0 100644 --- a/script/20240308-maptoken-aperios/20240308-maptoken-aperios-roninchain.s.sol +++ b/script/20240308-maptoken-aperios/20240308-maptoken-aperios-roninchain.s.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.19; import { console2 } from "forge-std/console2.sol"; -import "../factories/factory-maptoken-roninchain.s.sol"; +import "../factories/roninchain/factory-maptoken-ronin-mainnet.s.sol"; import "./base-maptoken.s.sol"; -contract Migration__20240308_MapTokenAperiosRoninchain is Base__MapToken, Factory__MapTokensRoninchain { +contract Migration__20240308_MapTokenAperiosRoninchain is Base__MapToken, Factory__MapTokensRonin_Mainnet { function _initCaller() internal override(Base__MapToken, Factory__MapTokensRoninchain) returns (address) { return Base__MapToken._initCaller(); } diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index f85a5e6b..6bc8e51f 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -4,33 +4,52 @@ pragma solidity ^0.8.19; import "../factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol"; import "./base-maptoken.s.sol"; import "@ronin/contracts/libraries/Ballot.sol"; -import { console2 } from "forge-std/console2.sol"; import { StdStyle } from "forge-std/StdStyle.sol"; import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; -contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchainSepolia { +contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__MapTokensMainchain_Sepolia { MainchainBridgeAdminUtils _mainchainProposalUtils; function _initCaller() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (address) { return Base__MapToken._initCaller(); } + function _isLocalSimulation() internal override returns (bool) { + return true; + } + + function _initLocalGovernors() internal override returns (address[] memory governors) { + governors = new address[](4); + governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; + governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; + governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + } + + function _initLocalGovernorPKs() internal override returns (uint256[] memory governorsPks) { + governorsPks = new uint256[](4); + governorsPks[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + governorsPks[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; + governorsPks[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; + governorsPks[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + } + function _initTokenList() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (uint256 totalToken, MapTokenInfo[] memory infos) { return Base__MapToken._initTokenList(); } - function _initGovernors() internal override(Base__MapToken, Factory__MapTokensMainchainSepolia) returns (address[] memory) { + function _initGovernors() internal override(Base__MapToken, Factory__MapTokensMainchain_Sepolia) returns (address[] memory) { return Base__MapToken._initGovernors(); } - function _initGovernorPKs() internal override(Base__MapToken, Factory__MapTokensMainchainSepolia) returns (uint256[] memory) { + function _initGovernorPKs() internal override(Base__MapToken, Factory__MapTokensMainchain_Sepolia) returns (uint256[] memory) { return Base__MapToken._initGovernorPKs(); } function run() public override { - super.run(); + Factory__MapTokensMainchain_Sepolia.run(); } } diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol index e2c9185a..3d6bf393 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-ronin-testnet.s.sol @@ -20,6 +20,6 @@ contract Migration__20242606_MapTokenAnimaRoninTestnet is Base__MapToken, Factor } function run() public override { - super.run(); + Factory__MapTokensRonin_Testnet.run(); } } diff --git a/script/20240626-maptoken-anima/governors-configs.s.sol b/script/20240626-maptoken-anima/governors-configs.s.sol index 04241b3d..2e729f5a 100644 --- a/script/20240626-maptoken-anima/governors-configs.s.sol +++ b/script/20240626-maptoken-anima/governors-configs.s.sol @@ -7,14 +7,14 @@ contract Migration__Governors_Config { constructor() { // TODO: replace by address of the testnet governors - governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; - governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; - governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + governors[3] = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; + governors[2] = 0xb033ba62EC622dC54D0ABFE0254e79692147CA26; + governors[0] = 0x087D08e3ba42e64E3948962dd1371F906D1278b9; + governors[1] = 0x52ec2e6BBcE45AfFF8955Da6410bb13812F4289F; // TODO: replace by private key of the testnet governors - governorPks[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; - governorPks[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; - governorPks[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; - governorPks[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; + governorPks[3] = 0x0; + governorPks[2] = 0x0; + governorPks[0] = 0x0; + governorPks[1] = 0x0; } } diff --git a/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol b/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol index d59329bd..b86ba82e 100644 --- a/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol +++ b/script/20240626-maptoken-anima/maptoken-anima-configs.s.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import { MapTokenInfo } from "../libraries/MapTokenInfo.sol"; +import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; contract Migration__MapToken_Anima_Config { MapTokenInfo _animaInfo; @@ -9,6 +10,7 @@ contract Migration__MapToken_Anima_Config { constructor() { _animaInfo.roninToken = address(0x9F6a5cDc477e9f667d60424bFdb4E82089d9d72c); _animaInfo.mainchainToken = address(0xEd52E203D2D44FAaEA0D9fB6A40220A63c743c80); + _animaInfo.standard = TokenStandard.ERC20; _animaInfo.minThreshold = 100 ether; _animaInfo.highTierThreshold = 20_000_000 ether; _animaInfo.lockedThreshold = 100_000_000 ether; diff --git a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol index e2ddec08..8c2fe2a8 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol @@ -9,7 +9,7 @@ import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-mainchain.s.sol"; -abstract contract Factory__MapTokensMainchainEthereum is Factory__MapTokensMainchain { +abstract contract Factory__MapTokensMainchain_Ethereum is Factory__MapTokensMainchain { using LibCompanionNetwork for *; function setUp() public override { @@ -19,11 +19,11 @@ abstract contract Factory__MapTokensMainchainEthereum is Factory__MapTokensMainc _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); - _governor = _initCaller(); + _specifiedCaller = _initCaller(); } function run() public virtual override { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(block.chainid, 0); + Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnMainchain(network().companionChainId(), 0); _propose(proposal); } } diff --git a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol index a680f573..2a14272a 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol @@ -1,40 +1,58 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; import { Network, TNetwork } from "../../utils/Network.sol"; -import { console2 } from "forge-std/console2.sol"; +import { console2 as console } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; import { LibProposal } from "script/shared/libraries/LibProposal.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-mainchain.s.sol"; -abstract contract Factory__MapTokensMainchainSepolia is Factory__MapTokensMainchain { - using LibCompanionNetwork for *; - +abstract contract Factory__MapTokensMainchain_Sepolia is Factory__MapTokensMainchain { function setUp() public override { super.setUp(); _mainchainGatewayV3 = config.getAddressFromCurrentNetwork(Contract.MainchainGatewayV3.key()); _mainchainBridgeManager = config.getAddressFromCurrentNetwork(Contract.MainchainBridgeManager.key()); } + function _isLocalSimulation() internal virtual returns (bool); function _initGovernorPKs() internal virtual returns (uint256[] memory); function _initGovernors() internal virtual returns (address[] memory); + function _initLocalGovernorPKs() internal virtual returns (uint256[] memory) { + require(_isLocalSimulation(), "Not in local simulation mode"); + revert("_initLocalGovernorPKs() must be implemented for local simulation"); + } + + function _initLocalGovernors() internal virtual returns (address[] memory) { + require(_isLocalSimulation(), "Not in local simulation mode"); + revert("_initLocalGovernors() must be implemented for local simulation"); + } + function run() public virtual override { - address[] memory governorsM = _initGovernors(); - uint256[] memory governorsPksM = _initGovernorPKs(); + address[] memory mGovernors; + uint256[] memory mGovernorsPk; + + if (_isLocalSimulation()) { + mGovernors = _initLocalGovernors(); + mGovernorsPk = _initLocalGovernorPKs(); + + _cheatLocalReplaceGovernors(mGovernors); + } else { + mGovernors = _initGovernors(); + mGovernorsPk = _initGovernorPKs(); + } - for (uint256 i; i < governorsM.length; ++i) { - _governors.push(governorsM[i]); - _governorPKs.push(governorsPksM[i]); + for (uint256 i; i < mGovernors.length; ++i) { + _governors.push(mGovernors[i]); + _governorPKs.push(mGovernorsPk[i]); } - _cheatStorage(_governors); uint256 chainId = block.chainid; uint256 nonce = MainchainBridgeManager(_mainchainBridgeManager).round(chainId) + 1; - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(chainId, nonce); + Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnMainchain(chainId, nonce); _relayProposal(proposal); } } diff --git a/script/factories/mainchain/factory-maptoken-mainchain.s.sol b/script/factories/mainchain/factory-maptoken-mainchain.s.sol index 667a64d4..caf34e11 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.19; import "@ronin/contracts/libraries/Ballot.sol"; -import { console2 } from "forge-std/console2.sol"; +import { console2 as console } 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"; @@ -26,7 +26,7 @@ abstract contract Factory__MapTokensMainchain is Migration { RoninBridgeManager internal _roninBridgeManager; address internal _mainchainGatewayV3; address internal _mainchainBridgeManager; - address internal _governor; + address internal _specifiedCaller; address[] internal _governors; uint256[] internal _governorPKs; @@ -35,7 +35,7 @@ abstract contract Factory__MapTokensMainchain is Migration { function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - vm.broadcast(_governor); + vm.broadcast(_specifiedCaller); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts ); @@ -63,11 +63,25 @@ abstract contract Factory__MapTokensMainchain is Migration { MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, supports_, signatures); } - function _createAndVerifyProposal(uint256 chainId, uint256 nonce) internal returns (Proposal.ProposalDetail memory proposal) { - (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = - _prepareMapTokensAndThresholds(); - bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + function _createAndVerifyProposalOnMainchain(uint256 chainId, uint256 nonce) internal returns (Proposal.ProposalDetail memory proposal) { + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + require(tokenInfos.length > 0, "Number of tokens required to map cannot be 0."); + + bytes memory innerData; + bytes memory proxyData; + + if (tokenInfos[0].standard == TokenStandard.ERC20) { + (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) = + _prepareMapTokensAndThresholds(N, tokenInfos); + + innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (mainchainTokens, roninTokens, standards, thresholds)); + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + } else { + (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards) = _prepareMapTokens(N, tokenInfos); + + innerData = abi.encodeCall(IMainchainGatewayV3.mapTokens, (mainchainTokens, roninTokens, standards)); + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + } uint256 expiredTime = block.timestamp + 14 days; address[] memory targets = new address[](1); @@ -80,13 +94,15 @@ abstract contract Factory__MapTokensMainchain is Migration { calldatas[0] = proxyData; gasAmounts[0] = 1_000_000; - // Verify gas when call from mainchain. - LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); - - // // Verify gas when call from ronin. - // (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); - // address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); - // LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); + if (block.chainid == 2020) { + // Verify gas when call from ronin. + (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); + address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); + LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); + } else { + // Verify gas when call from mainchain. + LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); + } proposal = Proposal.ProposalDetail({ nonce: nonce, @@ -100,17 +116,16 @@ abstract contract Factory__MapTokensMainchain is Migration { }); } - function _prepareMapTokensAndThresholds() - internal - returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) - { + function _prepareMapTokensAndThresholds( + uint256 N, + MapTokenInfo[] memory tokenInfos + ) internal returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards, uint256[][4] memory thresholds) { // function mapTokensAndThresholds( // address[] calldata _mainchainTokens, // address[] calldata _roninTokens, // TokenStandard.ERC20[] calldata _standards, // uint256[][4] calldata _thresholds // ) - (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); mainchainTokens = new address[](N); roninTokens = new address[](N); @@ -124,7 +139,8 @@ abstract contract Factory__MapTokensMainchain is Migration { for (uint256 i; i < N; ++i) { mainchainTokens[i] = tokenInfos[i].mainchainToken; roninTokens[i] = tokenInfos[i].roninToken; - standards[i] = TokenStandard.ERC20; + standards[i] = tokenInfos[i].standard; + thresholds[0][i] = tokenInfos[i].highTierThreshold; thresholds[1][i] = tokenInfos[i].lockedThreshold; thresholds[2][i] = tokenInfos[i].unlockFeePercentages; @@ -132,15 +148,39 @@ abstract contract Factory__MapTokensMainchain is Migration { } } - function _cheatStorage(address[] memory governors) internal { - bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300)); + function _prepareMapTokens( + uint256 N, + MapTokenInfo[] memory tokenInfos + ) internal returns (address[] memory mainchainTokens, address[] memory roninTokens, TokenStandard[] memory standards) { + // function mapTokens( + // address[] calldata _mainchainTokens, + // address[] calldata _roninTokens, + // TokenStandard[] calldata _standards + // ); + + mainchainTokens = new address[](N); + roninTokens = new address[](N); + standards = new TokenStandard[](N); + + for (uint256 i; i < N; ++i) { + mainchainTokens[i] = tokenInfos[i].mainchainToken; + roninTokens[i] = tokenInfos[i].roninToken; + standards[i] = tokenInfos[i].standard; + } + } + + function _cheatLocalReplaceGovernors(address[] memory governors) internal { + bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc3830)); + console.logBytes32(governorsSlot); uint256 length = governors.length; - //cheat governors addresses + + // Cheat governors addresses. for (uint256 i; i < length; ++i) { bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); } - //after cheat + + // Check if cheat successfully. for (uint256 i; i < length; ++i) { bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); @@ -148,13 +188,12 @@ abstract contract Factory__MapTokensMainchain is Migration { assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); } - //cheat governors weights + // Cheat governors weights. bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); for (uint256 i; i < length; ++i) { address key = governors[i]; bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); } - bytes32 governorsWeightData = vm.load(_mainchainBridgeManager, keccak256(abi.encode(0x087D08e3ba42e64E3948962dd1371F906D1278b9, governorsWeightSlot))); } } diff --git a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol index b3896b82..aa0ece3d 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol @@ -16,11 +16,11 @@ abstract contract Factory__MapTokensRonin_Mainnet is Factory__MapTokensRoninchai super.setUp(); _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); - _governor = _initCaller(); + _specifiedCaller = _initCaller(); } function run() public virtual override { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); + Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnRonin(); _propose(proposal); } } diff --git a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol index 28d58f06..ea5a4df4 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol @@ -16,19 +16,19 @@ abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchai super.setUp(); _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); - _governor = _initCaller(); + _specifiedCaller = _initCaller(); } function _initGovernors() internal virtual returns (address[] memory); function run() public virtual override { - address[] memory governorsM = _initGovernors(); + address[] memory mGovernors = _initGovernors(); - for (uint256 i; i < governorsM.length; ++i) { - _governors.push(governorsM[i]); + for (uint256 i; i < mGovernors.length; ++i) { + _governors.push(mGovernors[i]); } - Proposal.ProposalDetail memory proposal = _createAndVerifyProposal(); - _proposeAndExecute(proposal); + Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnRonin(); + _proposeAndExecuteProposal(proposal); } } diff --git a/script/factories/roninchain/factory-maptoken-roninchain.s.sol b/script/factories/roninchain/factory-maptoken-roninchain.s.sol index 581f6d61..fcbd42cf 100644 --- a/script/factories/roninchain/factory-maptoken-roninchain.s.sol +++ b/script/factories/roninchain/factory-maptoken-roninchain.s.sol @@ -25,17 +25,84 @@ abstract contract Factory__MapTokensRoninchain is Migration { RoninBridgeManager internal _roninBridgeManager; address internal _roninGatewayV3; - address internal _governor; + address internal _specifiedCaller; address[] internal _governors; function run() public virtual; function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function _proposeAndExecute(Proposal.ProposalDetail memory proposal) internal { + function _proposeAndExecuteProposal(Proposal.ProposalDetail memory proposal) internal { proposal.executor = _governors[0]; _propose(proposal); + _executeProposal(proposal); + } + + function _createAndVerifyProposalOnRonin() internal returns (Proposal.ProposalDetail memory proposal) { + (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); + + (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapTokens(); + + // Assume that all tokens have the same standard. + TokenStandard tokenStandard = standards[0]; + + address[] memory targets; + uint256[] memory values; + bytes[] memory calldatas; + uint256[] memory gasAmounts; + + targets = new address[](1); + values = new uint256[](1); + calldatas = new bytes[](1); + gasAmounts = new uint256[](1); + + bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + uint256 expiredTime = block.timestamp + 14 days; + targets[0] = _roninGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + if (tokenStandard == TokenStandard.ERC20) { + targets = new address[](2); + values = new uint256[](2); + calldatas = new bytes[](2); + gasAmounts = new uint256[](2); + + uint256 expiredTime = block.timestamp + 14 days; + targets[0] = _roninGatewayV3; + values[0] = 0; + calldatas[0] = proxyData; + gasAmounts[0] = 1_000_000; + + (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); + + innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); + + targets[1] = _roninGatewayV3; + values[1] = 0; + calldatas[1] = proxyData; + gasAmounts[1] = 1_000_000; + } + + LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); + + proposal = Proposal.ProposalDetail({ + nonce: RoninBridgeManager(_roninBridgeManager).round(block.chainid) + 1, + chainId: block.chainid, + expiryTimestamp: expiredTime, + executor: address(0), + targets: targets, + values: values, + calldatas: calldatas, + gasAmounts: gasAmounts + }); + } + + function _executeProposal(Proposal.ProposalDetail memory proposal) internal { uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); uint256 sumVoteWeight; uint256 numberGovernorsNeedToVote; @@ -62,52 +129,12 @@ abstract contract Factory__MapTokensRoninchain is Migration { } function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - vm.broadcast(_governor); + vm.broadcast(_specifiedCaller); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts ); } - function _createAndVerifyProposal() internal returns (Proposal.ProposalDetail memory proposal) { - (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) = _prepareMapToken(); - (address[] memory roninTokensToSetMinThreshold, uint256[] memory minThresholds) = _prepareSetMinThreshold(); - - address[] memory targets = new address[](2); - uint256[] memory values = new uint256[](2); - bytes[] memory calldatas = new bytes[](2); - uint256[] memory gasAmounts = new uint256[](2); - - bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); - bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - uint256 expiredTime = block.timestamp + 14 days; - targets[0] = _roninGatewayV3; - values[0] = 0; - calldatas[0] = proxyData; - gasAmounts[0] = 1_000_000; - - innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (roninTokensToSetMinThreshold, minThresholds)); - proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); - - targets[1] = _roninGatewayV3; - values[1] = 0; - calldatas[1] = proxyData; - gasAmounts[1] = 1_000_000; - - LibProposal.verifyProposalGasAmount(address(_roninBridgeManager), targets, values, calldatas, gasAmounts); - - proposal = Proposal.ProposalDetail({ - nonce: RoninBridgeManager(_roninBridgeManager).round(2021) + 1, - chainId: block.chainid, - expiryTimestamp: expiredTime, - executor: address(0), - targets: targets, - values: values, - calldatas: calldatas, - gasAmounts: gasAmounts - }); - } - function _cheatWeightOperator(address gov) internal { bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); @@ -117,7 +144,7 @@ abstract contract Factory__MapTokensRoninchain is Migration { vm.store(address(_roninBridgeManager), $, newOpAndWeight); } - function _prepareMapToken() + function _prepareMapTokens() internal returns (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) { @@ -140,7 +167,7 @@ abstract contract Factory__MapTokensRoninchain is Migration { roninTokens[i] = tokenInfos[i].roninToken; mainchainTokens[i] = tokenInfos[i].mainchainToken; chainIds[i] = network().companionChainId(); - standards[i] = TokenStandard.ERC20; + standards[i] = tokenInfos[i].standard; } } diff --git a/script/libraries/MapTokenInfo.sol b/script/libraries/MapTokenInfo.sol index fc7edbf6..3ca87af7 100644 --- a/script/libraries/MapTokenInfo.sol +++ b/script/libraries/MapTokenInfo.sol @@ -1,9 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import { LibTokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; + struct MapTokenInfo { address roninToken; address mainchainToken; + TokenStandard standard; + // This properties is used for ERC20 only. // Config on mainchain uint256 minThreshold; // Config on ronin chain From 4f04068b211bd38cfa4cc85b88b5ff1fa76ab055 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 10 Jul 2024 10:47:12 +0700 Subject: [PATCH 10/15] script: supports local simulation for factories scripts --- .../20240626-maptoken-anima-mainchain.s.sol | 20 --- .../factory-maptoken-mainchain-ethereum.s.sol | 4 +- .../factory-maptoken-mainchain-sepolia.s.sol | 24 +--- .../factory-maptoken-mainchain.s.sol | 101 ++++++++++----- .../factory-maptoken-roninchain.s.sol | 119 +++++++++++------- 5 files changed, 152 insertions(+), 116 deletions(-) diff --git a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol index 6bc8e51f..4584161c 100644 --- a/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol +++ b/script/20240626-maptoken-anima/20240626-maptoken-anima-mainchain.s.sol @@ -17,26 +17,6 @@ contract Migration__20242606_MapTokenAnimaMainchain is Base__MapToken, Factory__ return Base__MapToken._initCaller(); } - function _isLocalSimulation() internal override returns (bool) { - return true; - } - - function _initLocalGovernors() internal override returns (address[] memory governors) { - governors = new address[](4); - governors[3] = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - governors[2] = 0x90F79bf6EB2c4f870365E785982E1f101E93b906; - governors[0] = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; - governors[1] = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; - } - - function _initLocalGovernorPKs() internal override returns (uint256[] memory governorsPks) { - governorsPks = new uint256[](4); - governorsPks[3] = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; - governorsPks[2] = 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6; - governorsPks[0] = 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a; - governorsPks[1] = 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d; - } - function _initTokenList() internal override(Base__MapToken, Factory__MapTokensMainchain) returns (uint256 totalToken, MapTokenInfo[] memory infos) { return Base__MapToken._initTokenList(); } diff --git a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol index 8c2fe2a8..f377f856 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol @@ -23,7 +23,9 @@ abstract contract Factory__MapTokensMainchain_Ethereum is Factory__MapTokensMain } function run() public virtual override { - Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnMainchain(network().companionChainId(), 0); + uint256 chainId = network().companionChainId(); + uint256 nonce = _roninBridgeManager.round(chainId) + 1; + Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnMainchain(chainId, nonce); _propose(proposal); } } diff --git a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol index 2a14272a..b5939faa 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol @@ -15,35 +15,19 @@ abstract contract Factory__MapTokensMainchain_Sepolia is Factory__MapTokensMainc super.setUp(); _mainchainGatewayV3 = config.getAddressFromCurrentNetwork(Contract.MainchainGatewayV3.key()); _mainchainBridgeManager = config.getAddressFromCurrentNetwork(Contract.MainchainBridgeManager.key()); + + _specifiedCaller = _initCaller(); } - function _isLocalSimulation() internal virtual returns (bool); function _initGovernorPKs() internal virtual returns (uint256[] memory); function _initGovernors() internal virtual returns (address[] memory); - function _initLocalGovernorPKs() internal virtual returns (uint256[] memory) { - require(_isLocalSimulation(), "Not in local simulation mode"); - revert("_initLocalGovernorPKs() must be implemented for local simulation"); - } - - function _initLocalGovernors() internal virtual returns (address[] memory) { - require(_isLocalSimulation(), "Not in local simulation mode"); - revert("_initLocalGovernors() must be implemented for local simulation"); - } - function run() public virtual override { address[] memory mGovernors; uint256[] memory mGovernorsPk; - if (_isLocalSimulation()) { - mGovernors = _initLocalGovernors(); - mGovernorsPk = _initLocalGovernorPKs(); - - _cheatLocalReplaceGovernors(mGovernors); - } else { - mGovernors = _initGovernors(); - mGovernorsPk = _initGovernorPKs(); - } + mGovernors = _initGovernors(); + mGovernorsPk = _initGovernorPKs(); for (uint256 i; i < mGovernors.length; ++i) { _governors.push(mGovernors[i]); diff --git a/script/factories/mainchain/factory-maptoken-mainchain.s.sol b/script/factories/mainchain/factory-maptoken-mainchain.s.sol index caf34e11..670a43bd 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain.s.sol @@ -19,6 +19,8 @@ import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork import { MainchainBridgeAdminUtils } from "test/helpers/MainchainBridgeAdminUtils.t.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; +import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol"; abstract contract Factory__MapTokensMainchain is Migration { using LibCompanionNetwork for *; @@ -35,6 +37,8 @@ abstract contract Factory__MapTokensMainchain is Migration { function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); function _propose(Proposal.ProposalDetail memory proposal) internal virtual { + _simulateProposeAndRelayProposal(proposal); + vm.broadcast(_specifiedCaller); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts @@ -42,6 +46,8 @@ abstract contract Factory__MapTokensMainchain is Migration { } function _relayProposal(Proposal.ProposalDetail memory proposal) internal { + _simulateProposeAndRelayProposal(proposal); + MainchainBridgeAdminUtils mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); @@ -59,10 +65,69 @@ abstract contract Factory__MapTokensMainchain is Migration { gasAmounts += proposal.gasAmounts[i]; } - vm.broadcast(_governors[0]); + vm.broadcast(_specifiedCaller); MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, supports_, signatures); } + function _simulateProposeAndRelayProposal(Proposal.ProposalDetail memory proposal) internal { + uint256 snapshot = vm.snapshot(); + (address cheatingGov, uint256 cheatingGovPk) = makeAddrAndKey("Governor"); + + Ballot.VoteType[] memory cheatingSupports = new Ballot.VoteType[](1); + uint256[] memory cheatingPks = new uint256[](1); + + cheatingSupports[0] = Ballot.VoteType.For; + cheatingPks[0] = cheatingGovPk; + + uint256 gasAmounts = 1_000_000; + for (uint256 i; i < proposal.gasAmounts.length; ++i) { + gasAmounts += proposal.gasAmounts[i]; + } + + vm.startPrank(cheatingGov); + if (block.chainid == 2020 || block.chainid == 2021) { + _cheatWeightOperator(address(_roninBridgeManager), cheatingGov); + + SignatureConsumer.Signature[] memory cheatingSignatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); + + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + _roninBridgeManager.castProposalBySignatures(proposal, cheatingSupports, cheatingSignatures); + + TNetwork currentNetwork = network(); + config.createFork(network().companionNetwork()); + config.switchTo(network().companionNetwork()); + _cheatWeightOperator(address(_mainchainBridgeManager), cheatingGov); + + // Handle wrong proposal nonce on testnet. + proposal.nonce = MainchainBridgeManager(_mainchainBridgeManager).round(block.chainid) + 1; + SignatureConsumer.Signature[] memory signatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); + + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, signatures); + config.switchTo(currentNetwork); + } else { + _cheatWeightOperator(address(_mainchainBridgeManager), cheatingGov); + SignatureConsumer.Signature[] memory signatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, signatures); + } + vm.stopPrank(); + + vm.revertTo(snapshot); + } + + function _cheatWeightOperator(address manager, address gov) internal { + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + + bytes32 $ = keccak256(abi.encode(gov, governorsWeightSlot)); + bytes32 opAndWeight = vm.load(manager, $); + + uint256 totalWeight = IBridgeManager(manager).getTotalWeight(); + bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(totalWeight))); + vm.store(manager, $, newOpAndWeight); + IBridgeManager(manager).getGovernorWeight(gov); + } + function _createAndVerifyProposalOnMainchain(uint256 chainId, uint256 nonce) internal returns (Proposal.ProposalDetail memory proposal) { (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); require(tokenInfos.length > 0, "Number of tokens required to map cannot be 0."); @@ -94,13 +159,13 @@ abstract contract Factory__MapTokensMainchain is Migration { calldatas[0] = proxyData; gasAmounts[0] = 1_000_000; - if (block.chainid == 2020) { - // Verify gas when call from ronin. + if (block.chainid == 2020 || block.chainid == 2021) { + // Verify gas amount for ronin targets. (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); LibProposal.verifyMainchainProposalGasAmount(companionNetwork, companionManager, targets, values, calldatas, gasAmounts); } else { - // Verify gas when call from mainchain. + // Verify gas amount for mainchain targets. LibProposal.verifyProposalGasAmount(address(_mainchainBridgeManager), targets, values, calldatas, gasAmounts); } @@ -168,32 +233,4 @@ abstract contract Factory__MapTokensMainchain is Migration { standards[i] = tokenInfos[i].standard; } } - - function _cheatLocalReplaceGovernors(address[] memory governors) internal { - bytes32 governorsSlot = keccak256(abi.encode(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc3830)); - console.logBytes32(governorsSlot); - uint256 length = governors.length; - - // Cheat governors addresses. - for (uint256 i; i < length; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - vm.store(_mainchainBridgeManager, governorSlotId, bytes32(uint256(uint160(governors[i])))); - } - - // Check if cheat successfully. - for (uint256 i; i < length; ++i) { - bytes32 governorSlotId = bytes32(uint256(governorsSlot) + uint256(i)); - bytes32 afterCheatData = vm.load(_mainchainBridgeManager, bytes32(uint256(governorsSlot) + uint256(i))); - - assertEq(afterCheatData, bytes32(uint256(uint160(governors[i])))); - } - - // Cheat governors weights. - bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - for (uint256 i; i < length; ++i) { - address key = governors[i]; - bytes32 valueSlot = keccak256(abi.encode(key, governorsWeightSlot)); - vm.store(_mainchainBridgeManager, valueSlot, bytes32(uint256(uint96(100)))); - } - } } diff --git a/script/factories/roninchain/factory-maptoken-roninchain.s.sol b/script/factories/roninchain/factory-maptoken-roninchain.s.sol index fcbd42cf..9243a698 100644 --- a/script/factories/roninchain/factory-maptoken-roninchain.s.sol +++ b/script/factories/roninchain/factory-maptoken-roninchain.s.sol @@ -32,12 +32,87 @@ abstract contract Factory__MapTokensRoninchain is Migration { function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); + function _propose(Proposal.ProposalDetail memory proposal) internal virtual { + _simulateProposeAndExecuteProposal(proposal); + + vm.broadcast(_specifiedCaller); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + } + function _proposeAndExecuteProposal(Proposal.ProposalDetail memory proposal) internal { - proposal.executor = _governors[0]; + proposal.executor = _specifiedCaller; _propose(proposal); _executeProposal(proposal); } + function _executeProposal(Proposal.ProposalDetail memory proposal) internal { + uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); + uint256 sumVoteWeight; + uint256 numberGovernorsNeedToVote; + + for (uint256 i; i < _governors.length; ++i) { + sumVoteWeight += _roninBridgeManager.getGovernorWeight(_governors[i]); + numberGovernorsNeedToVote++; + if (sumVoteWeight >= minVoteWeight) break; + } + require(sumVoteWeight > 0 && numberGovernorsNeedToVote > 0); + + for (uint256 i; i < numberGovernorsNeedToVote; ++i) { + vm.broadcast(_governors[i]); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); + } + + uint256 gasAmounts = 1_000_000; + for (uint256 i; i < proposal.gasAmounts.length; ++i) { + gasAmounts += proposal.gasAmounts[i]; + } + + vm.broadcast(_specifiedCaller); + _roninBridgeManager.execute{ gas: gasAmounts }(proposal); + } + + function _simulateProposeAndExecuteProposal(Proposal.ProposalDetail memory proposal) internal { + Proposal.ProposalDetail memory cheatingProposal = proposal; + Ballot.VoteType cheatingSupport = Ballot.VoteType.For; + uint256 snapshot = vm.snapshot(); + address cheatingGov = makeAddr("Governor"); + _cheatWeightOperator(cheatingGov); + + vm.startPrank(cheatingGov); + _roninBridgeManager.propose( + cheatingProposal.chainId, + cheatingProposal.expiryTimestamp, + cheatingProposal.executor, + cheatingProposal.targets, + cheatingProposal.values, + cheatingProposal.calldatas, + cheatingProposal.gasAmounts + ); + _roninBridgeManager.castProposalVoteForCurrentNetwork(cheatingProposal, cheatingSupport); + vm.stopPrank(); + + if (cheatingProposal.executor != address(0)) { + vm.prank(cheatingProposal.executor); + _roninBridgeManager.execute(proposal); + } + + vm.revertTo(snapshot); + } + + function _cheatWeightOperator(address gov) internal { + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + + bytes32 $ = keccak256(abi.encode(gov, governorsWeightSlot)); + bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); + + uint256 totalWeight = _roninBridgeManager.getTotalWeight(); + bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(totalWeight))); + vm.store(address(_roninBridgeManager), $, newOpAndWeight); + _roninBridgeManager.getGovernorWeight(gov); + } + function _createAndVerifyProposalOnRonin() internal returns (Proposal.ProposalDetail memory proposal) { (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); @@ -102,48 +177,6 @@ abstract contract Factory__MapTokensRoninchain is Migration { }); } - function _executeProposal(Proposal.ProposalDetail memory proposal) internal { - uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); - uint256 sumVoteWeight; - uint256 numberGovernorsNeedToVote; - - for (uint256 i; i < _governors.length; ++i) { - sumVoteWeight += _roninBridgeManager.getGovernorWeight(_governors[i]); - numberGovernorsNeedToVote++; - if (sumVoteWeight >= minVoteWeight) break; - } - require(sumVoteWeight > 0 && numberGovernorsNeedToVote > 0); - - for (uint256 i; i < numberGovernorsNeedToVote; ++i) { - vm.broadcast(_governors[i]); - _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, Ballot.VoteType.For); - } - - uint256 gasAmounts = 1_000_000; - for (uint256 i; i < proposal.gasAmounts.length; ++i) { - gasAmounts += proposal.gasAmounts[i]; - } - - vm.broadcast(_governors[0]); - _roninBridgeManager.execute{ gas: gasAmounts }(proposal); - } - - function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - vm.broadcast(_specifiedCaller); - _roninBridgeManager.propose( - proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts - ); - } - - function _cheatWeightOperator(address gov) internal { - bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); - bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); - - uint256 totalWeight = _roninBridgeManager.getTotalWeight(); - bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight))); - vm.store(address(_roninBridgeManager), $, newOpAndWeight); - } - function _prepareMapTokens() internal returns (address[] memory roninTokens, address[] memory mainchainTokens, uint256[] memory chainIds, TokenStandard[] memory standards) From 1c6916ca891edd884a17dc1b08518c9734cf9f89 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 10 Jul 2024 11:26:42 +0700 Subject: [PATCH 11/15] script: fix duplicate code --- .../mainchain/factory-maptoken-mainchain-ethereum.s.sol | 3 --- .../mainchain/factory-maptoken-mainchain-sepolia.s.sol | 2 -- .../factories/mainchain/factory-maptoken-mainchain.s.sol | 5 +++++ .../roninchain/factory-maptoken-ronin-mainnet.s.sol | 7 ------- .../roninchain/factory-maptoken-ronin-testnet.s.sol | 7 ------- .../factories/roninchain/factory-maptoken-roninchain.s.sol | 7 +++++++ 6 files changed, 12 insertions(+), 19 deletions(-) diff --git a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol index f377f856..0ca9a94a 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol @@ -14,12 +14,9 @@ abstract contract Factory__MapTokensMainchain_Ethereum is Factory__MapTokensMain function setUp() public override { super.setUp(); - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); - - _specifiedCaller = _initCaller(); } function run() public virtual override { diff --git a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol index b5939faa..2734c860 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol @@ -15,8 +15,6 @@ abstract contract Factory__MapTokensMainchain_Sepolia is Factory__MapTokensMainc super.setUp(); _mainchainGatewayV3 = config.getAddressFromCurrentNetwork(Contract.MainchainGatewayV3.key()); _mainchainBridgeManager = config.getAddressFromCurrentNetwork(Contract.MainchainBridgeManager.key()); - - _specifiedCaller = _initCaller(); } function _initGovernorPKs() internal virtual returns (uint256[] memory); diff --git a/script/factories/mainchain/factory-maptoken-mainchain.s.sol b/script/factories/mainchain/factory-maptoken-mainchain.s.sol index 670a43bd..2a47ee0f 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain.s.sol @@ -32,6 +32,11 @@ abstract contract Factory__MapTokensMainchain is Migration { address[] internal _governors; uint256[] internal _governorPKs; + function setUp() public virtual override { + super.setUp(); + _specifiedCaller = _initCaller(); + } + function run() public virtual; function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); diff --git a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol index aa0ece3d..dc85edeb 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol @@ -12,13 +12,6 @@ import "./factory-maptoken-roninchain.s.sol"; abstract contract Factory__MapTokensRonin_Mainnet is Factory__MapTokensRoninchain { using LibCompanionNetwork for *; - function setUp() public override { - super.setUp(); - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); - _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); - _specifiedCaller = _initCaller(); - } - function run() public virtual override { Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnRonin(); _propose(proposal); diff --git a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol index ea5a4df4..0932126f 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol @@ -12,13 +12,6 @@ import "./factory-maptoken-roninchain.s.sol"; abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchain { using LibCompanionNetwork for *; - function setUp() public override { - super.setUp(); - _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); - _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); - _specifiedCaller = _initCaller(); - } - function _initGovernors() internal virtual returns (address[] memory); function run() public virtual override { diff --git a/script/factories/roninchain/factory-maptoken-roninchain.s.sol b/script/factories/roninchain/factory-maptoken-roninchain.s.sol index 9243a698..13f2436c 100644 --- a/script/factories/roninchain/factory-maptoken-roninchain.s.sol +++ b/script/factories/roninchain/factory-maptoken-roninchain.s.sol @@ -28,6 +28,13 @@ abstract contract Factory__MapTokensRoninchain is Migration { address internal _specifiedCaller; address[] internal _governors; + function setUp() public virtual override { + super.setUp(); + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); + _specifiedCaller = _initCaller(); + } + function run() public virtual; function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); From 5448b5af766b2c722d51b58da679bdfb8b8311d7 Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Tue, 23 Jul 2024 23:09:14 +0700 Subject: [PATCH 12/15] script: organize factories folder and add more simulation script --- .../caller-configs.s.sol | 2 +- .../factory-maptoken-mainchain-ethereum.s.sol | 3 + .../factory-maptoken-mainchain-sepolia.s.sol | 4 + .../factory-maptoken-mainchain.s.sol | 64 +------------- .../factory-maptoken-ronin-mainnet.s.sol | 3 + .../factory-maptoken-ronin-testnet.s.sol | 3 + .../factory-maptoken-roninchain.s.sol | 42 --------- .../factory-maptoken-simulation-base.s.sol | 36 ++++++++ ...actory-maptoken-simulation-mainchain.s.sol | 88 +++++++++++++++++++ ...ctory-maptoken-simulation-roninchain.s.sol | 45 ++++++++++ 10 files changed, 184 insertions(+), 106 deletions(-) create mode 100644 script/factories/simulation/factory-maptoken-simulation-base.s.sol create mode 100644 script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol create mode 100644 script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol diff --git a/script/20240308-maptoken-aperios/caller-configs.s.sol b/script/20240308-maptoken-aperios/caller-configs.s.sol index d1fad437..1e3428d5 100644 --- a/script/20240308-maptoken-aperios/caller-configs.s.sol +++ b/script/20240308-maptoken-aperios/caller-configs.s.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.19; contract Migration__Caller_Config { - address internal SM_GOVERNOR = 0xe880802580a1fbdeF67ACe39D1B21c5b2C74f059; // TODO: replace by address of the SV governor + address internal SM_GOVERNOR = 0xd24D87DDc1917165435b306aAC68D99e0F49A3Fa; // TODO: replace by address of the SV governor } diff --git a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol index 0ca9a94a..7238de33 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-ethereum.s.sol @@ -8,6 +8,7 @@ import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-mainchain.s.sol"; +import "../simulation/factory-maptoken-simulation-mainchain.s.sol"; abstract contract Factory__MapTokensMainchain_Ethereum is Factory__MapTokensMainchain { using LibCompanionNetwork for *; @@ -23,6 +24,8 @@ abstract contract Factory__MapTokensMainchain_Ethereum is Factory__MapTokensMain uint256 chainId = network().companionChainId(); uint256 nonce = _roninBridgeManager.round(chainId) + 1; Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnMainchain(chainId, nonce); + // Simulate relay proposal + new Factory__MapTokensSimulation_Mainchain().simulate(proposal); _propose(proposal); } } diff --git a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol index 2734c860..63266612 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain-sepolia.s.sol @@ -9,6 +9,7 @@ import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-mainchain.s.sol"; +import "../simulation/factory-maptoken-simulation-mainchain.s.sol"; abstract contract Factory__MapTokensMainchain_Sepolia is Factory__MapTokensMainchain { function setUp() public override { @@ -34,7 +35,10 @@ abstract contract Factory__MapTokensMainchain_Sepolia is Factory__MapTokensMainc uint256 chainId = block.chainid; uint256 nonce = MainchainBridgeManager(_mainchainBridgeManager).round(chainId) + 1; + Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnMainchain(chainId, nonce); + // Simulate relay proposal + new Factory__MapTokensSimulation_Mainchain().simulate(proposal); _relayProposal(proposal); } } diff --git a/script/factories/mainchain/factory-maptoken-mainchain.s.sol b/script/factories/mainchain/factory-maptoken-mainchain.s.sol index 2a47ee0f..53ae7a9b 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain.s.sol @@ -21,6 +21,7 @@ import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBrid import { LibProposal } from "script/shared/libraries/LibProposal.sol"; import { Network, TNetwork } from "../../utils/Network.sol"; import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol"; +import { DefaultNetwork } from "@fdk/utils/DefaultNetwork.sol"; abstract contract Factory__MapTokensMainchain is Migration { using LibCompanionNetwork for *; @@ -42,8 +43,6 @@ abstract contract Factory__MapTokensMainchain is Migration { function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - _simulateProposeAndRelayProposal(proposal); - vm.broadcast(_specifiedCaller); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts @@ -51,8 +50,6 @@ abstract contract Factory__MapTokensMainchain is Migration { } function _relayProposal(Proposal.ProposalDetail memory proposal) internal { - _simulateProposeAndRelayProposal(proposal); - MainchainBridgeAdminUtils mainchainProposalUtils = new MainchainBridgeAdminUtils(2021, _governorPKs, MainchainBridgeManager(_mainchainBridgeManager), _governors[0]); @@ -74,65 +71,6 @@ abstract contract Factory__MapTokensMainchain is Migration { MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, supports_, signatures); } - function _simulateProposeAndRelayProposal(Proposal.ProposalDetail memory proposal) internal { - uint256 snapshot = vm.snapshot(); - (address cheatingGov, uint256 cheatingGovPk) = makeAddrAndKey("Governor"); - - Ballot.VoteType[] memory cheatingSupports = new Ballot.VoteType[](1); - uint256[] memory cheatingPks = new uint256[](1); - - cheatingSupports[0] = Ballot.VoteType.For; - cheatingPks[0] = cheatingGovPk; - - uint256 gasAmounts = 1_000_000; - for (uint256 i; i < proposal.gasAmounts.length; ++i) { - gasAmounts += proposal.gasAmounts[i]; - } - - vm.startPrank(cheatingGov); - if (block.chainid == 2020 || block.chainid == 2021) { - _cheatWeightOperator(address(_roninBridgeManager), cheatingGov); - - SignatureConsumer.Signature[] memory cheatingSignatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); - - _roninBridgeManager.propose( - proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts - ); - _roninBridgeManager.castProposalBySignatures(proposal, cheatingSupports, cheatingSignatures); - - TNetwork currentNetwork = network(); - config.createFork(network().companionNetwork()); - config.switchTo(network().companionNetwork()); - _cheatWeightOperator(address(_mainchainBridgeManager), cheatingGov); - - // Handle wrong proposal nonce on testnet. - proposal.nonce = MainchainBridgeManager(_mainchainBridgeManager).round(block.chainid) + 1; - SignatureConsumer.Signature[] memory signatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); - - MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, signatures); - config.switchTo(currentNetwork); - } else { - _cheatWeightOperator(address(_mainchainBridgeManager), cheatingGov); - SignatureConsumer.Signature[] memory signatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); - MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, signatures); - } - vm.stopPrank(); - - vm.revertTo(snapshot); - } - - function _cheatWeightOperator(address manager, address gov) internal { - bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - - bytes32 $ = keccak256(abi.encode(gov, governorsWeightSlot)); - bytes32 opAndWeight = vm.load(manager, $); - - uint256 totalWeight = IBridgeManager(manager).getTotalWeight(); - bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(totalWeight))); - vm.store(manager, $, newOpAndWeight); - IBridgeManager(manager).getGovernorWeight(gov); - } - function _createAndVerifyProposalOnMainchain(uint256 chainId, uint256 nonce) internal returns (Proposal.ProposalDetail memory proposal) { (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); require(tokenInfos.length > 0, "Number of tokens required to map cannot be 0."); diff --git a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol index dc85edeb..bafcb28a 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-mainnet.s.sol @@ -8,12 +8,15 @@ import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-roninchain.s.sol"; +import "../simulation/factory-maptoken-simulation-roninchain.s.sol"; abstract contract Factory__MapTokensRonin_Mainnet is Factory__MapTokensRoninchain { using LibCompanionNetwork for *; function run() public virtual override { Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnRonin(); + // Simulate execute proposal + new Factory__MapTokensSimulation_Roninchain().simulate(proposal); _propose(proposal); } } diff --git a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol index 0932126f..01e71143 100644 --- a/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol +++ b/script/factories/roninchain/factory-maptoken-ronin-testnet.s.sol @@ -8,6 +8,7 @@ import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Contract } from "../../utils/Contract.sol"; import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; import "./factory-maptoken-roninchain.s.sol"; +import "../simulation/factory-maptoken-simulation-roninchain.s.sol"; abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchain { using LibCompanionNetwork for *; @@ -22,6 +23,8 @@ abstract contract Factory__MapTokensRonin_Testnet is Factory__MapTokensRoninchai } Proposal.ProposalDetail memory proposal = _createAndVerifyProposalOnRonin(); + // Simulate execute proposal + new Factory__MapTokensSimulation_Roninchain().simulate(proposal); _proposeAndExecuteProposal(proposal); } } diff --git a/script/factories/roninchain/factory-maptoken-roninchain.s.sol b/script/factories/roninchain/factory-maptoken-roninchain.s.sol index 13f2436c..b5d278e2 100644 --- a/script/factories/roninchain/factory-maptoken-roninchain.s.sol +++ b/script/factories/roninchain/factory-maptoken-roninchain.s.sol @@ -40,8 +40,6 @@ abstract contract Factory__MapTokensRoninchain is Migration { function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - _simulateProposeAndExecuteProposal(proposal); - vm.broadcast(_specifiedCaller); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts @@ -80,46 +78,6 @@ abstract contract Factory__MapTokensRoninchain is Migration { _roninBridgeManager.execute{ gas: gasAmounts }(proposal); } - function _simulateProposeAndExecuteProposal(Proposal.ProposalDetail memory proposal) internal { - Proposal.ProposalDetail memory cheatingProposal = proposal; - Ballot.VoteType cheatingSupport = Ballot.VoteType.For; - uint256 snapshot = vm.snapshot(); - address cheatingGov = makeAddr("Governor"); - _cheatWeightOperator(cheatingGov); - - vm.startPrank(cheatingGov); - _roninBridgeManager.propose( - cheatingProposal.chainId, - cheatingProposal.expiryTimestamp, - cheatingProposal.executor, - cheatingProposal.targets, - cheatingProposal.values, - cheatingProposal.calldatas, - cheatingProposal.gasAmounts - ); - _roninBridgeManager.castProposalVoteForCurrentNetwork(cheatingProposal, cheatingSupport); - vm.stopPrank(); - - if (cheatingProposal.executor != address(0)) { - vm.prank(cheatingProposal.executor); - _roninBridgeManager.execute(proposal); - } - - vm.revertTo(snapshot); - } - - function _cheatWeightOperator(address gov) internal { - bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - - bytes32 $ = keccak256(abi.encode(gov, governorsWeightSlot)); - bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); - - uint256 totalWeight = _roninBridgeManager.getTotalWeight(); - bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(totalWeight))); - vm.store(address(_roninBridgeManager), $, newOpAndWeight); - _roninBridgeManager.getGovernorWeight(gov); - } - function _createAndVerifyProposalOnRonin() internal returns (Proposal.ProposalDetail memory proposal) { (uint256 N, MapTokenInfo[] memory tokenInfos) = _initTokenList(); diff --git a/script/factories/simulation/factory-maptoken-simulation-base.s.sol b/script/factories/simulation/factory-maptoken-simulation-base.s.sol new file mode 100644 index 00000000..30b15747 --- /dev/null +++ b/script/factories/simulation/factory-maptoken-simulation-base.s.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { console2 } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; +import { Migration } from "../../Migration.s.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import "@ronin/contracts/libraries/Ballot.sol"; +import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol"; +import { DefaultNetwork } from "@fdk/utils/DefaultNetwork.sol"; + +abstract contract Factory__MapTokensSimulation_Base is Migration { + modifier inSimulation() { + uint256 snapshot = vm.snapshot(); + _; + vm.revertTo(snapshot); + } + + function simulate() public virtual { + _setUp(); + } + + function _setUp() internal virtual; + + function _cheatWeightOperator(IBridgeManager manager, address gov) internal virtual { + bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); + + bytes32 $ = keccak256(abi.encode(gov, governorsWeightSlot)); + bytes32 opAndWeight = vm.load(address(manager), $); + + uint256 totalWeight = manager.getTotalWeight(); + bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(totalWeight))); + vm.store(address(manager), $, newOpAndWeight); + manager.getGovernorWeight(gov); + } +} diff --git a/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol b/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol new file mode 100644 index 00000000..4c8ff74a --- /dev/null +++ b/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@ronin/contracts/libraries/Ballot.sol"; +import { console2 } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import "@ronin/contracts/libraries/Ballot.sol"; +import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol"; +import "./factory-maptoken-simulation-base.s.sol"; +import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { MainchainBridgeManager } from "@ronin/contracts/mainchain/MainchainBridgeManager.sol"; +import { DefaultNetwork } from "@fdk/utils/DefaultNetwork.sol"; +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; +import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; +import { LibProposal } from "script/shared/libraries/LibProposal.sol"; +import { Network, TNetwork } from "../../utils/Network.sol"; + +contract Factory__MapTokensSimulation_Mainchain is Factory__MapTokensSimulation_Base { + using LibCompanionNetwork for *; + + RoninBridgeManager internal _roninBridgeManager; + address internal _mainchainGatewayV3; + address internal _mainchainBridgeManager; + + function _setUp() internal override { + if (network() == DefaultNetwork.RoninMainnet.key() || network() == DefaultNetwork.RoninTestnet.key()) { + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _mainchainGatewayV3 = config.getAddress(network().companionNetwork(), Contract.MainchainGatewayV3.key()); + _mainchainBridgeManager = config.getAddress(network().companionNetwork(), Contract.MainchainBridgeManager.key()); + } else { + _mainchainGatewayV3 = config.getAddressFromCurrentNetwork(Contract.MainchainGatewayV3.key()); + _mainchainBridgeManager = config.getAddressFromCurrentNetwork(Contract.MainchainBridgeManager.key()); + } + } + + function simulate(Proposal.ProposalDetail memory proposal) public inSimulation { + super.simulate(); + + Ballot.VoteType[] memory cheatingSupports = new Ballot.VoteType[](1); + uint256[] memory cheatingPks = new uint256[](1); + (address cheatingGov, uint256 cheatingGovPk) = makeAddrAndKey("Governor"); + + cheatingSupports[0] = Ballot.VoteType.For; + cheatingPks[0] = cheatingGovPk; + SignatureConsumer.Signature[] memory cheatingSignatures = LibProposal.generateSignatures(proposal, cheatingPks, Ballot.VoteType.For); + + uint256 gasAmounts = 1_000_000; + for (uint256 i; i < proposal.gasAmounts.length; ++i) { + gasAmounts += proposal.gasAmounts[i]; + } + + vm.startPrank(cheatingGov); + if (network() == DefaultNetwork.RoninMainnet.key() || network() == DefaultNetwork.RoninTestnet.key()) { + _cheatWeightOperator(IBridgeManager(_roninBridgeManager), cheatingGov); + + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + _roninBridgeManager.castProposalBySignatures(proposal, cheatingSupports, cheatingSignatures); + + address mMainchainAdress = _mainchainBridgeManager; + TNetwork currentNetwork = network(); + config.createFork(network().companionNetwork()); + config.switchTo(network().companionNetwork()); + + // Handle wrong nonce on testnet + if (currentNetwork == DefaultNetwork.RoninTestnet.key()) { + uint256 roundSlot = 2; + bytes32 $ = keccak256(abi.encode(block.chainid, roundSlot)); + + bytes32 newNonce = bytes32(proposal.nonce - 1); + vm.store(address(mMainchainAdress), $, newNonce); + assertEq(MainchainBridgeManager(mMainchainAdress).round(block.chainid) + 1, proposal.nonce); + } + + _cheatWeightOperator(IBridgeManager(mMainchainAdress), cheatingGov); + MainchainBridgeManager(mMainchainAdress).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, cheatingSignatures); + + config.switchTo(currentNetwork); + } else { + _cheatWeightOperator(IBridgeManager(_mainchainBridgeManager), cheatingGov); + MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, cheatingSignatures); + } + vm.stopPrank(); + } +} diff --git a/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol b/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol new file mode 100644 index 00000000..cbeabe65 --- /dev/null +++ b/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { console2 } from "forge-std/console2.sol"; +import { StdStyle } from "forge-std/StdStyle.sol"; +import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; +import "@ronin/contracts/libraries/Ballot.sol"; +import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol"; +import "./factory-maptoken-simulation-base.s.sol"; +import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; +import { Contract } from "../../utils/Contract.sol"; +import { DefaultNetwork } from "@fdk/utils/DefaultNetwork.sol"; +import { LibCompanionNetwork } from "script/shared/libraries/LibCompanionNetwork.sol"; + +contract Factory__MapTokensSimulation_Roninchain is Factory__MapTokensSimulation_Base { + using LibCompanionNetwork for *; + + RoninBridgeManager internal _roninBridgeManager; + address internal _roninGatewayV3; + + function _setUp() internal override { + _roninBridgeManager = RoninBridgeManager(config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); + _roninGatewayV3 = config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); + } + + function simulate(Proposal.ProposalDetail memory proposal) public inSimulation { + super.simulate(); + + Ballot.VoteType cheatingSupport = Ballot.VoteType.For; + address cheatingGov = makeAddr("Governor"); + _cheatWeightOperator(IBridgeManager(_roninBridgeManager), cheatingGov); + + vm.startPrank(cheatingGov); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + _roninBridgeManager.castProposalVoteForCurrentNetwork(proposal, cheatingSupport); + vm.stopPrank(); + + if (proposal.executor != address(0)) { + vm.prank(proposal.executor); + _roninBridgeManager.execute(proposal); + } + } +} From 698ee6efef3a8953191afcd7b3f94b05d58d026a Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Tue, 23 Jul 2024 23:31:29 +0700 Subject: [PATCH 13/15] chore: rename func --- .../simulation/factory-maptoken-simulation-base.s.sol | 11 +++++------ .../factory-maptoken-simulation-mainchain.s.sol | 6 +++--- .../factory-maptoken-simulation-roninchain.s.sol | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/script/factories/simulation/factory-maptoken-simulation-base.s.sol b/script/factories/simulation/factory-maptoken-simulation-base.s.sol index 30b15747..f314fa1f 100644 --- a/script/factories/simulation/factory-maptoken-simulation-base.s.sol +++ b/script/factories/simulation/factory-maptoken-simulation-base.s.sol @@ -22,15 +22,14 @@ abstract contract Factory__MapTokensSimulation_Base is Migration { function _setUp() internal virtual; - function _cheatWeightOperator(IBridgeManager manager, address gov) internal virtual { + function _cheatWeightGovernor(IBridgeManager manager, address gov) internal virtual { bytes32 governorsWeightSlot = bytes32(uint256(0xc648703095712c0419b6431ae642c061f0a105ac2d7c3d9604061ef4ebc38300) + uint256(2)); - bytes32 $ = keccak256(abi.encode(gov, governorsWeightSlot)); - bytes32 opAndWeight = vm.load(address(manager), $); uint256 totalWeight = manager.getTotalWeight(); - bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(totalWeight))); - vm.store(address(manager), $, newOpAndWeight); - manager.getGovernorWeight(gov); + bytes32 newGovWeight = bytes32(uint256(totalWeight)); + + vm.store(address(manager), $, newGovWeight); + assert(manager.getGovernorWeight(gov) == totalWeight); } } diff --git a/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol b/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol index 4c8ff74a..1dc4254c 100644 --- a/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol +++ b/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol @@ -53,7 +53,7 @@ contract Factory__MapTokensSimulation_Mainchain is Factory__MapTokensSimulation_ vm.startPrank(cheatingGov); if (network() == DefaultNetwork.RoninMainnet.key() || network() == DefaultNetwork.RoninTestnet.key()) { - _cheatWeightOperator(IBridgeManager(_roninBridgeManager), cheatingGov); + _cheatWeightGovernor(IBridgeManager(_roninBridgeManager), cheatingGov); _roninBridgeManager.propose( proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts @@ -75,12 +75,12 @@ contract Factory__MapTokensSimulation_Mainchain is Factory__MapTokensSimulation_ assertEq(MainchainBridgeManager(mMainchainAdress).round(block.chainid) + 1, proposal.nonce); } - _cheatWeightOperator(IBridgeManager(mMainchainAdress), cheatingGov); + _cheatWeightGovernor(IBridgeManager(mMainchainAdress), cheatingGov); MainchainBridgeManager(mMainchainAdress).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, cheatingSignatures); config.switchTo(currentNetwork); } else { - _cheatWeightOperator(IBridgeManager(_mainchainBridgeManager), cheatingGov); + _cheatWeightGovernor(IBridgeManager(_mainchainBridgeManager), cheatingGov); MainchainBridgeManager(_mainchainBridgeManager).relayProposal{ gas: gasAmounts }(proposal, cheatingSupports, cheatingSignatures); } vm.stopPrank(); diff --git a/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol b/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol index cbeabe65..28afc7dc 100644 --- a/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol +++ b/script/factories/simulation/factory-maptoken-simulation-roninchain.s.sol @@ -28,7 +28,7 @@ contract Factory__MapTokensSimulation_Roninchain is Factory__MapTokensSimulation Ballot.VoteType cheatingSupport = Ballot.VoteType.For; address cheatingGov = makeAddr("Governor"); - _cheatWeightOperator(IBridgeManager(_roninBridgeManager), cheatingGov); + _cheatWeightGovernor(IBridgeManager(_roninBridgeManager), cheatingGov); vm.startPrank(cheatingGov); _roninBridgeManager.propose( From bd619670d7ea99d65f538f55e43b164d0d75ec8a Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 24 Jul 2024 17:32:10 +0700 Subject: [PATCH 14/15] chore: small fix --- script/factories/mainchain/factory-maptoken-mainchain.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/factories/mainchain/factory-maptoken-mainchain.s.sol b/script/factories/mainchain/factory-maptoken-mainchain.s.sol index 53ae7a9b..3bb2691e 100644 --- a/script/factories/mainchain/factory-maptoken-mainchain.s.sol +++ b/script/factories/mainchain/factory-maptoken-mainchain.s.sol @@ -102,7 +102,7 @@ abstract contract Factory__MapTokensMainchain is Migration { calldatas[0] = proxyData; gasAmounts[0] = 1_000_000; - if (block.chainid == 2020 || block.chainid == 2021) { + if (network() == DefaultNetwork.RoninMainnet.key() || network() == DefaultNetwork.RoninMainnet.key()) { // Verify gas amount for ronin targets. (uint256 companionChainId, TNetwork companionNetwork) = network().companionNetworkData(); address companionManager = config.getAddress(companionNetwork, Contract.MainchainBridgeManager.key()); From bfe920b9a66e007d703ea1a84f5f5b635843e9dd Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Wed, 24 Jul 2024 18:09:23 +0700 Subject: [PATCH 15/15] chore: minor fix --- .../roninchain/factory-maptoken-roninchain.s.sol | 14 +++++++------- .../factory-maptoken-simulation-mainchain.s.sol | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/script/factories/roninchain/factory-maptoken-roninchain.s.sol b/script/factories/roninchain/factory-maptoken-roninchain.s.sol index b5d278e2..47766a5c 100644 --- a/script/factories/roninchain/factory-maptoken-roninchain.s.sol +++ b/script/factories/roninchain/factory-maptoken-roninchain.s.sol @@ -39,19 +39,19 @@ abstract contract Factory__MapTokensRoninchain is Migration { function _initCaller() internal virtual returns (address); function _initTokenList() internal virtual returns (uint256 totalToken, MapTokenInfo[] memory infos); - function _propose(Proposal.ProposalDetail memory proposal) internal virtual { - vm.broadcast(_specifiedCaller); - _roninBridgeManager.propose( - proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts - ); - } - function _proposeAndExecuteProposal(Proposal.ProposalDetail memory proposal) internal { proposal.executor = _specifiedCaller; _propose(proposal); _executeProposal(proposal); } + function _propose(Proposal.ProposalDetail memory proposal) internal { + vm.broadcast(_specifiedCaller); + _roninBridgeManager.propose( + proposal.chainId, proposal.expiryTimestamp, proposal.executor, proposal.targets, proposal.values, proposal.calldatas, proposal.gasAmounts + ); + } + function _executeProposal(Proposal.ProposalDetail memory proposal) internal { uint256 minVoteWeight = _roninBridgeManager.minimumVoteWeight(); uint256 sumVoteWeight; diff --git a/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol b/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol index 1dc4254c..d402d27b 100644 --- a/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol +++ b/script/factories/simulation/factory-maptoken-simulation-mainchain.s.sol @@ -67,7 +67,7 @@ contract Factory__MapTokensSimulation_Mainchain is Factory__MapTokensSimulation_ // Handle wrong nonce on testnet if (currentNetwork == DefaultNetwork.RoninTestnet.key()) { - uint256 roundSlot = 2; + uint256 roundSlot = uint256(0x0000000000000000000000000000000000000000000000000000000000000002); bytes32 $ = keccak256(abi.encode(block.chainid, roundSlot)); bytes32 newNonce = bytes32(proposal.nonce - 1);