From b5e07ce3697369eca038f89a3059ea403840038e Mon Sep 17 00:00:00 2001 From: tringuyenskymavis Date: Fri, 5 Jul 2024 18:00:33 +0700 Subject: [PATCH] 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