Skip to content

Commit ff67b74

Browse files
committed
script: add proposal for mapping pixel token and update axie chat governor
1 parent 6692291 commit ff67b74

File tree

5 files changed

+461
-2
lines changed

5 files changed

+461
-2
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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+
import { RoninBridgeManager } from "@ronin/contracts/ronin/gateway/RoninBridgeManager.sol";
8+
import { IMainchainGatewayV3 } from "@ronin/contracts/interfaces/IMainchainGatewayV3.sol";
9+
import { GlobalProposal } from "@ronin/contracts/libraries/GlobalProposal.sol";
10+
import { Token } from "@ronin/contracts/libraries/Token.sol";
11+
import { Contract } from "../utils/Contract.sol";
12+
import { BridgeMigration } from "../BridgeMigration.sol";
13+
import { Network } from "../utils/Network.sol";
14+
import { Contract } from "../utils/Contract.sol";
15+
import { IGeneralConfigExtended } from "../IGeneralConfigExtended.sol";
16+
17+
import "./maptoken-pixel-configs.s.sol";
18+
import "./update-axiechat-config.s.sol";
19+
20+
contract Migration__20240131_MapTokenPixelMainchain is BridgeMigration, Migration__MapToken_Pixel_Config, Migration__Update_AxieChat_Config {
21+
RoninBridgeManager internal _roninBridgeManager;
22+
address internal _mainchainGatewayV3;
23+
address internal _mainchainBridgeManager;
24+
25+
function setUp() public override {
26+
super.setUp();
27+
28+
_roninBridgeManager = RoninBridgeManager(_config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key()));
29+
_mainchainGatewayV3 = _config.getAddress(
30+
_config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).key(),
31+
Contract.MainchainGatewayV3.key()
32+
);
33+
_mainchainBridgeManager = _config.getAddress(
34+
_config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).key(),
35+
Contract.MainchainBridgeManager.key()
36+
);
37+
}
38+
39+
function run() public {
40+
address[] memory mainchainTokens = new address[](1);
41+
address[] memory roninTokens = new address[](1);
42+
Token.Standard[] memory standards = new Token.Standard[](1);
43+
uint256[][4] memory thresholds;
44+
45+
uint256 expiredTime = block.timestamp + 10 days;
46+
address[] memory targets = new address[](4);
47+
uint256[] memory values = new uint256[](4);
48+
bytes[] memory calldatas = new bytes[](4);
49+
uint256[] memory gasAmounts = new uint256[](4);
50+
51+
// ================ PIXEL ERC-20 ======================
52+
53+
mainchainTokens[0] = _pixelMainchainToken;
54+
roninTokens[0] = _pixelRoninToken;
55+
standards[0] = Token.Standard.ERC20;
56+
// highTierThreshold
57+
thresholds[0] = new uint256[](1);
58+
thresholds[0][0] = _highTierThreshold;
59+
// lockedThreshold
60+
thresholds[1] = new uint256[](1);
61+
thresholds[1][0] = _lockedThreshold;
62+
// unlockFeePercentages
63+
thresholds[2] = new uint256[](1);
64+
thresholds[2][0] = _unlockFeePercentages;
65+
// dailyWithdrawalLimit
66+
thresholds[3] = new uint256[](1);
67+
thresholds[3][0] = _dailyWithdrawalLimit;
68+
69+
// function mapTokensAndThresholds(
70+
// address[] calldata _mainchainTokens,
71+
// address[] calldata _roninTokens,
72+
// Token.Standard[] calldata _standards,
73+
// uint256[][4] calldata _thresholds
74+
// )
75+
76+
bytes memory innerData = abi.encodeCall(IMainchainGatewayV3.mapTokensAndThresholds, (
77+
mainchainTokens,
78+
roninTokens,
79+
standards,
80+
thresholds
81+
));
82+
83+
bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData);
84+
85+
targets[0] = _mainchainGatewayV3;
86+
values[0] = 0;
87+
calldatas[0] = proxyData;
88+
gasAmounts[0] = 1_000_000;
89+
90+
// ================ FARMLAND ERC-20 ======================
91+
92+
mainchainTokens[0] = _farmlandMainchainToken;
93+
roninTokens[0] = _farmlandRoninToken;
94+
standards[0] = Token.Standard.ERC721;
95+
96+
// function mapTokens(
97+
// address[] calldata _mainchainTokens,
98+
// address[] calldata _roninTokens,
99+
// Token.Standard[] calldata _standards
100+
// ) external;
101+
102+
innerData = abi.encodeCall(IMainchainGatewayV3.mapTokens, (
103+
mainchainTokens,
104+
roninTokens,
105+
standards
106+
));
107+
108+
proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData);
109+
110+
targets[1] = _mainchainGatewayV3;
111+
values[1] = 0;
112+
calldatas[1] = proxyData;
113+
gasAmounts[1] = 1_000_000;
114+
115+
// =============== AXIE CHAT UPDATE ===========
116+
targets[2] = _mainchainBridgeManager;
117+
values[2] = 0;
118+
calldatas[2] = _addAxieChatGovernorAddress();
119+
gasAmounts[2] = 1_000_000;
120+
121+
targets[3] = _mainchainBridgeManager;
122+
values[3] = 0;
123+
calldatas[3] = _removeAxieChatGovernorAddress();
124+
gasAmounts[3] = 1_000_000;
125+
126+
// ================ VERIFY AND EXECUTE PROPOSAL ===============
127+
128+
_verifyMainchainProposalGasAmount(targets, values, calldatas, gasAmounts);
129+
130+
uint256 chainId = _config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).chainId();
131+
132+
vm.broadcast(_governor);
133+
_roninBridgeManager.propose(
134+
chainId,
135+
expiredTime,
136+
targets,
137+
values,
138+
calldatas,
139+
gasAmounts
140+
);
141+
}
142+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
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+
15+
import { Contract } from "../utils/Contract.sol";
16+
import { BridgeMigration } from "../BridgeMigration.sol";
17+
import { Network } from "../utils/Network.sol";
18+
import { Contract } from "../utils/Contract.sol";
19+
import { IGeneralConfigExtended } from "../IGeneralConfigExtended.sol";
20+
21+
import "forge-std/console2.sol";
22+
23+
import "./maptoken-pixel-configs.s.sol";
24+
import "./update-axiechat-config.s.sol";
25+
26+
contract Migration__20240131_MapTokenPixelRoninchain is BridgeMigration, Migration__MapToken_Pixel_Config, Migration__Update_AxieChat_Config {
27+
RoninBridgeManager internal _roninBridgeManager;
28+
address internal _roninGatewayV3;
29+
30+
function setUp() public override {
31+
super.setUp();
32+
_roninBridgeManager = RoninBridgeManager(_config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key()));
33+
_roninGatewayV3 = _config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key());
34+
}
35+
36+
function _cheatWeightOperator(address gov) internal {
37+
bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3));
38+
bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $);
39+
40+
uint256 totalWeight = _roninBridgeManager.getTotalWeight();
41+
bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight)));
42+
vm.store(address(_roninBridgeManager), $, newOpAndWeight);
43+
}
44+
45+
function run() public {
46+
_cheatWeightOperator(_governor);
47+
48+
address[] memory roninTokens = new address[](2);
49+
address[] memory mainchainTokens = new address[](2);
50+
uint256[] memory chainIds = new uint256[](2);
51+
Token.Standard[] memory standards = new Token.Standard[](2);
52+
53+
uint256 expiredTime = block.timestamp + 10 days;
54+
address[] memory targets = new address[](4);
55+
uint256[] memory values = new uint256[](4);
56+
bytes[] memory calldatas = new bytes[](4);
57+
uint256[] memory gasAmounts = new uint256[](4);
58+
59+
// ============= MAP PIXEL TOKEN ===========
60+
61+
roninTokens[0] = _pixelRoninToken;
62+
mainchainTokens[0] = _pixelMainchainToken;
63+
chainIds[0] = _config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).chainId();
64+
standards[0] = Token.Standard.ERC20;
65+
66+
roninTokens[1] = _farmlandRoninToken;
67+
mainchainTokens[1] = _farmlandMainchainToken;
68+
chainIds[1] = _config.getCompanionNetwork(_config.getNetworkByChainId(block.chainid)).chainId();
69+
standards[1] = Token.Standard.ERC721;
70+
71+
// function mapTokens(
72+
// address[] calldata _roninTokens,
73+
// address[] calldata _mainchainTokens,
74+
// uint256[] calldata chainIds,
75+
// Token.Standard[] calldata _standards
76+
// )
77+
bytes memory innerData = abi.encodeCall(IRoninGatewayV3.mapTokens, (
78+
roninTokens,
79+
mainchainTokens,
80+
chainIds,
81+
standards
82+
));
83+
bytes memory proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData);
84+
85+
targets[0] = _roninGatewayV3;
86+
values[0] = 0;
87+
calldatas[0] = proxyData;
88+
gasAmounts[0] = 1_000_000;
89+
90+
// ============= SET MIN THRESHOLD ============
91+
// function setMinimumThresholds(
92+
// address[] calldata _tokens,
93+
// uint256[] calldata _thresholds
94+
// );
95+
address[] memory mainchainTokensToSetMinThreshold = new address[](2);
96+
uint256[] memory minThresholds = new uint256[](2);
97+
98+
mainchainTokensToSetMinThreshold[0] = _pixelMainchainToken;
99+
minThresholds[0] = _minThreshold;
100+
101+
mainchainTokensToSetMinThreshold[1] = _aggMainchainToken;
102+
minThresholds[1] = _aggMinThreshold;
103+
104+
innerData = abi.encodeCall(MinimumWithdrawal.setMinimumThresholds, (
105+
mainchainTokensToSetMinThreshold,
106+
minThresholds
107+
));
108+
proxyData = abi.encodeWithSignature("functionDelegateCall(bytes)", innerData);
109+
110+
targets[1] = _roninGatewayV3;
111+
values[1] = 0;
112+
calldatas[1] = proxyData;
113+
gasAmounts[1] = 1_000_000;
114+
115+
// =============== AXIE CHAT UPDATE ===========
116+
targets[2] = address(_roninBridgeManager);
117+
values[2] = 0;
118+
calldatas[2] = _addAxieChatGovernorAddress();
119+
gasAmounts[2] = 1_000_000;
120+
121+
targets[3] = address(_roninBridgeManager);
122+
values[3] = 0;
123+
calldatas[3] = _removeAxieChatGovernorAddress();
124+
gasAmounts[3] = 1_000_000;
125+
126+
// ================ VERIFY AND EXECUTE PROPOSAL ===============
127+
128+
_verifyRoninProposalGasAmount(targets, values, calldatas, gasAmounts);
129+
130+
vm.broadcast(_governor);
131+
_roninBridgeManager.propose(
132+
block.chainid,
133+
expiredTime,
134+
targets,
135+
values,
136+
calldatas,
137+
gasAmounts
138+
);
139+
}
140+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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 { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol";
15+
import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol";
16+
17+
import { Contract } from "../utils/Contract.sol";
18+
import { BridgeMigration } from "../BridgeMigration.sol";
19+
import { Network } from "../utils/Network.sol";
20+
import { Contract } from "../utils/Contract.sol";
21+
import { IGeneralConfigExtended } from "../IGeneralConfigExtended.sol";
22+
23+
import "forge-std/console2.sol";
24+
25+
import "./maptoken-pixel-configs.s.sol";
26+
import "./update-axiechat-config.s.sol";
27+
28+
29+
contract Migration__20240131_MapTokenPixelRoninchain is BridgeMigration, Migration__MapToken_Pixel_Config, Migration__Update_AxieChat_Config {
30+
RoninBridgeManager internal _roninBridgeManager;
31+
address internal _roninGatewayV3;
32+
33+
address _cheatingGovernor;
34+
35+
function setUp() public override {
36+
super.setUp();
37+
_roninBridgeManager = RoninBridgeManager(_config.getAddressFromCurrentNetwork(Contract.RoninBridgeManager.key()));
38+
_roninGatewayV3 = _config.getAddressFromCurrentNetwork(Contract.RoninGatewayV3.key());
39+
40+
_cheatingGovernor = makeAddr("cheat-governor");
41+
}
42+
43+
function _cheatWeightGovernor(address gov) internal {
44+
bytes32 $ = keccak256(abi.encode(gov, 0x88547008e60f5748911f2e59feb3093b7e4c2e87b2dd69d61f112fcc932de8e3));
45+
bytes32 opAndWeight = vm.load(address(_roninBridgeManager), $);
46+
47+
uint256 totalWeight = _roninBridgeManager.getTotalWeight();
48+
bytes32 newOpAndWeight = bytes32((totalWeight << 160) + uint160(uint256(opAndWeight)));
49+
vm.store(address(_roninBridgeManager), $, newOpAndWeight);
50+
}
51+
52+
function run() public {
53+
_cheatWeightGovernor(_governor);
54+
_cheatWeightGovernor(_cheatingGovernor);
55+
56+
uint256 expiredTime = block.timestamp + 10 days;
57+
GlobalProposal.TargetOption[] memory targetOptions = new GlobalProposal.TargetOption[](2);
58+
uint256[] memory values = new uint256[](2);
59+
bytes[] memory calldatas = new bytes[](2);
60+
uint256[] memory gasAmounts = new uint256[](2);
61+
62+
targetOptions[0] = GlobalProposal.TargetOption.BridgeManager;
63+
values[0] = 0;
64+
calldatas[0] = _addAxieChatGovernorAddress();
65+
gasAmounts[0] = 1_000_000;
66+
67+
targetOptions[1] = GlobalProposal.TargetOption.BridgeManager;
68+
values[1] = 0;
69+
calldatas[1] = _removeAxieChatGovernorAddress();
70+
gasAmounts[1] = 1_000_000;
71+
72+
// ================ VERIFY AND EXECUTE PROPOSAL ===============
73+
74+
_verifyGlobalProposalGasAmount(targetOptions, values, calldatas, gasAmounts);
75+
76+
vm.broadcast(_governor);
77+
78+
// function proposeGlobal(
79+
// uint256 expiryTimestamp,
80+
// GlobalProposal.TargetOption[] calldata targetOptions,
81+
// uint256[] calldata values,
82+
// bytes[] calldata calldatas,
83+
// uint256[] calldata gasAmounts)
84+
_roninBridgeManager.proposeGlobal(
85+
expiredTime,
86+
targetOptions,
87+
values,
88+
calldatas,
89+
gasAmounts
90+
);
91+
}
92+
93+
94+
}

0 commit comments

Comments
 (0)