|
| 1 | +// SPDX-License-Identifier: MIT |
| 2 | +pragma solidity ^0.8.19; |
| 3 | + |
| 4 | +import {console2} from "forge-std/console2.sol"; |
| 5 | +import {StdStyle} from "forge-std/StdStyle.sol"; |
| 6 | +import {BaseMigration} from "foundry-deployment-kit/BaseMigration.s.sol"; |
| 7 | + |
| 8 | +import {RoninBridgeManager} from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol"; |
| 9 | +import {IRoninGatewayV3} from "@ronin/contracts/interfaces/IRoninGatewayV3.sol"; |
| 10 | +import {MinimumWithdrawal} from "@ronin/contracts/extensions/MinimumWithdrawal.sol"; |
| 11 | +import {Token} from "@ronin/contracts/libraries/Token.sol"; |
| 12 | +import {Ballot} from "@ronin/contracts/libraries/Ballot.sol"; |
| 13 | +import {GlobalProposal} from "@ronin/contracts/libraries/GlobalProposal.sol"; |
| 14 | +import {Proposal} from "@ronin/contracts/libraries/Proposal.sol"; |
| 15 | + |
| 16 | +import {Contract} from "../utils/Contract.sol"; |
| 17 | +import {BridgeMigration} from "../BridgeMigration.sol"; |
| 18 | +import {Network} from "../utils/Network.sol"; |
| 19 | +import {Contract} from "../utils/Contract.sol"; |
| 20 | +import {IGeneralConfigExtended} from "../IGeneralConfigExtended.sol"; |
| 21 | + |
| 22 | +import "forge-std/console2.sol"; |
| 23 | + |
| 24 | +import "./maptoken-banana-configs.s.sol"; |
| 25 | +import "./maptoken-genkai-configs.s.sol"; |
| 26 | +import "./maptoken-vx-configs.s.sol"; |
| 27 | +import "./changeGV-stablenode-config.s.sol"; |
| 28 | + |
| 29 | +contract Migration__20240206_MapTokenBananaRoninChain is |
| 30 | + BridgeMigration, |
| 31 | + Migration__MapToken_Banana_Config, |
| 32 | + Migration__MapToken_Vx_Config, |
| 33 | + Migration__MapToken_Genkai_Config, |
| 34 | + Migration__ChangeGV_StableNode_Config |
| 35 | +{ |
| 36 | + RoninBridgeManager internal _roninBridgeManager; |
| 37 | + address internal _roninGatewayV3; |
| 38 | + |
| 39 | + function setUp() public override { |
| 40 | + super.setUp(); |
| 41 | + _roninBridgeManager = RoninBridgeManager(_config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key())); |
| 42 | + _roninGatewayV3 = _config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key()); |
| 43 | + } |
| 44 | + |
| 45 | + function _cheatWeightOperator(address gov) internal { |
| 46 | + bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3)); |
| 47 | + bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $); |
| 48 | + |
| 49 | + uint256 totalWeight = _roninBridgeManager.getTotalWeight(); |
| 50 | + bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight))); |
| 51 | + vm.store(address(_roninBridgeManager), $, newOpAndWeight); |
| 52 | + } |
| 53 | + |
| 54 | + function run() public { |
| 55 | + address[] memory roninTokens = new address[](3); |
| 56 | + address[] memory mainchainTokens = new address[](3); |
| 57 | + uint256[] memory chainIds = new uint256[](3); |
| 58 | + Token.Standard[] memory standards = new Token.Standard[](3); |
| 59 | + |
| 60 | + uint256 expiredTime = block.timestamp + 10 days; |
| 61 | + address[] memory targets = new address[](4); |
| 62 | + uint256[] memory values = new uint256[](4); |
| 63 | + bytes[] memory calldatas = new bytes[](4); |
| 64 | + uint256[] memory gasAmounts = new uint256[](4); |
| 65 | + |
| 66 | + // ============= MAP NEW BANANA, VX, GENKAI TOKEN =========== |
| 67 | + |
| 68 | + roninTokens[0] = _bananaRoninToken; |
| 69 | + mainchainTokens[0] = _bananaMainchainToken; |
| 70 | + chainIds[0] = _config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).chainId(); |
| 71 | + standards[0] = Token.Standard.ERC20; |
| 72 | + |
| 73 | + roninTokens[1] = _VxRoninToken; |
| 74 | + mainchainTokens[1] = _VxMainchainToken; |
| 75 | + chainIds[1] = _config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).chainId(); |
| 76 | + standards[1] = Token.Standard.ERC721; |
| 77 | + |
| 78 | + roninTokens[2] = _genkaiRoninToken; |
| 79 | + mainchainTokens[2] = _genkaiMainchainToken; |
| 80 | + chainIds[2] = _config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).chainId(); |
| 81 | + standards[2] = Token.Standard.ERC721; |
| 82 | + |
| 83 | + // function mapTokens( |
| 84 | + // address[] calldata _roninTokens, |
| 85 | + // address[] calldata _mainchainTokens, |
| 86 | + // uint256[] calldata chainIds, |
| 87 | + // Token.Standard[] calldata _standards |
| 88 | + // ) |
| 89 | + bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (roninTokens, mainchainTokens, chainIds, standards)); |
| 90 | + bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); |
| 91 | + |
| 92 | + targets[0] = _roninGatewayV3; |
| 93 | + values[0] = 0; |
| 94 | + calldatas[0] = proxyData; |
| 95 | + gasAmounts[0] = 1_000_000; |
| 96 | + |
| 97 | + // ============= SET MIN THRESHOLD FOR BANANA ============ |
| 98 | + // function setMinimumThresholds( |
| 99 | + // address[] calldata _tokens, |
| 100 | + // uint256[] calldata _thresholds |
| 101 | + // ); |
| 102 | + address[] memory mainchainTokensToSetMinThreshold = new address[](1); |
| 103 | + uint256[] memory minThresholds = new uint256[](1); |
| 104 | + |
| 105 | + mainchainTokensToSetMinThreshold[0] = _bananaMainchainToken; |
| 106 | + minThresholds[0] = _bananaMinThreshold; |
| 107 | + |
| 108 | + innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (mainchainTokensToSetMinThreshold, minThresholds)); |
| 109 | + proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData); |
| 110 | + |
| 111 | + targets[1] = _roninGatewayV3; |
| 112 | + values[1] = 0; |
| 113 | + calldatas[1] = proxyData; |
| 114 | + gasAmounts[1] = 1_000_000; |
| 115 | + |
| 116 | + // =============== AXIE CHAT UPDATE =========== |
| 117 | + targets[2] = address(_roninBridgeManager); |
| 118 | + values[2] = 0; |
| 119 | + calldatas[2] = _removeStableNodeGovernorAddress(); |
| 120 | + gasAmounts[2] = 1_000_000; |
| 121 | + |
| 122 | + targets[3] = address(_roninBridgeManager); |
| 123 | + values[3] = 0; |
| 124 | + calldatas[3] = _addStableNodeGovernorAddress(); |
| 125 | + gasAmounts[3] = 1_000_000; |
| 126 | + |
| 127 | + // ================ VERIFY AND EXECUTE PROPOSAL =============== |
| 128 | + |
| 129 | + _verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts); |
| 130 | + |
| 131 | + vm.broadcast(_governor); |
| 132 | + _roninBridgeManager.propose(block.chainid, expiredTime, targets, values, calldatas, gasAmounts); |
| 133 | + |
| 134 | + |
| 135 | + // ============= LOCAL SIMULATION ================== |
| 136 | + _cheatWeightOperator(_governor); |
| 137 | + |
| 138 | + Proposal.ProposalDetail memory cheatingProposal; |
| 139 | + cheatingProposal.nonce = 3; |
| 140 | + cheatingProposal.chainId = block.chainid; |
| 141 | + cheatingProposal.expiryTimestamp = expiredTime; |
| 142 | + cheatingProposal.targets = targets; |
| 143 | + cheatingProposal.values = values; |
| 144 | + cheatingProposal.calldatas = calldatas; |
| 145 | + cheatingProposal.gasAmounts = gasAmounts; |
| 146 | + |
| 147 | + Ballot.VoteType cheatingSupport = Ballot.VoteType.For; |
| 148 | + |
| 149 | + vm.prank(_governor); |
| 150 | + _roninBridgeManager.castProposalVoteForCurrentNetwork(cheatingProposal, cheatingSupport); |
| 151 | + } |
| 152 | +} |
| 153 | + |
| 154 | +// ./run.sh script/20240206-maptoken-banana/20240206-maptoken-banana-roninchain.s.sol -f ronin-mainnet --fork-block-number 31791206 -vvvv |
0 commit comments