Skip to content

Commit 381608a

Browse files
committed
proposal: mapping token for banana, vx, genkai and change stable node GV
1 parent 111de60 commit 381608a

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
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
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
import {IBridgeManager} from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol";
5+
6+
contract Migration__ChangeGV_StableNode_Config {
7+
address constant _stableNodeBridgeOperator = address(0x564DcB855Eb360826f27D1Eb9c57cbbe6C76F50F);
8+
address constant _stableNodeGovernor = address(0x3C583c0c97646a73843aE57b93f33e1995C8DC80);
9+
10+
function _removeStableNodeGovernorAddress() internal pure returns (bytes memory) {
11+
address[] memory bridgeOperator = new address[](1);
12+
bridgeOperator[0] = _stableNodeBridgeOperator;
13+
14+
// function removeBridgeOperators(
15+
// address[] calldata bridgeOperators
16+
// )
17+
18+
return abi.encodeCall(IBridgeManager.removeBridgeOperators, (bridgeOperator));
19+
}
20+
21+
function _addStableNodeGovernorAddress() internal pure returns (bytes memory) {
22+
uint96[] memory voteWeight = new uint96[](1);
23+
address[] memory governor = new address[](1);
24+
address[] memory bridgeOperator = new address[](1);
25+
26+
voteWeight[0] = 100;
27+
governor[0] = _stableNodeGovernor;
28+
bridgeOperator[0] = _stableNodeBridgeOperator;
29+
30+
// function addBridgeOperators(
31+
// uint96[] calldata voteWeights,
32+
// address[] calldata governors,
33+
// address[] calldata bridgeOperators
34+
// )
35+
36+
return abi.encodeCall(IBridgeManager.addBridgeOperators, (voteWeight, governor, bridgeOperator));
37+
}
38+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
contract Migration__MapToken_Banana_Config {
5+
address constant _bananaRoninToken = address(0x1a89ecd466a23e98f07111b0510a2D6c1cd5E400);
6+
address constant _bananaMainchainToken = address(0x94e496474F1725f1c1824cB5BDb92d7691A4F03a);
7+
8+
// The decimal of BANANA token is 18
9+
uint256 constant _highTierThreshold = 100_000 ether;
10+
uint256 constant _lockedThreshold = 600_000 ether;
11+
// The MAX_PERCENTAGE is 100_0000
12+
uint256 constant _unlockFeePercentages = 10; // 0.001%. Max percentage is 1e6 so 10 is 0.001% (`10 / 1e6 = 0.001 * 100`)
13+
uint256 constant _dailyWithdrawalLimit = 500_000 ether;
14+
15+
uint256 constant _bananaMinThreshold = 10 ether;
16+
17+
address internal _governor = 0xe880802580a1fbdeF67ACe39D1B21c5b2C74f059; // TODO: replace by address of the SV governor
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
contract Migration__MapToken_Genkai_Config {
5+
address constant _genkaiRoninToken = address(0x1F7c16FCe4fC894143aFB5545Bf04f676bf7DCf3);
6+
address constant _genkaiMainchainToken = address(0x1F7c16FCe4fC894143aFB5545Bf04f676bf7DCf3);
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
contract Migration__MapToken_Vx_Config {
5+
address constant _VxRoninToken = address(0x241A81fC0d6692707DAd2B5025a3a7CF2CF25aCF);
6+
address constant _VxMainchainToken = address(0x7EA3Cca10668B8346aeC0bf1844A49e995527c8B);
7+
}

0 commit comments

Comments
 (0)