diff --git a/logs/contract-code-sizes.log b/logs/contract-code-sizes.log index 7676c56b..9737cf43 100644 --- a/logs/contract-code-sizes.log +++ b/logs/contract-code-sizes.log @@ -1,236 +1,191 @@ -13 | address bridgeRewardLogic = _deployLogic(Contract.BridgeReward.key()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - -Warning (2072): Unused local variable. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-3-deploy-all-contract-roninchain.sol:14:5: - | -14 | address bridgeSlashLogic = _deployLogic(Contract.BridgeSlash.key()); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - -Warning (2072): Unused local variable. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-3-deploy-all-contract-roninchain.sol:15:5: - | -15 | address bridgeTrackingLogic = _deployLogic(Contract.BridgeTracking.key()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Warning (2072): Unused local variable. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-3-deploy-all-contract-roninchain.sol:16:5: - | -16 | address pauseEnforcerLogic = _deployLogic(Contract.RoninPauseEnforcer.key()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Warning (2072): Unused local variable. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-3-deploy-all-contract-roninchain.sol:17:5: - | -17 | address roninGatewayV3Logic = _deployLogic(Contract.RoninGatewayV3.key()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Warning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-4-deploy-all-contract-roninchain.sol:20:34: - | -20 | function run() public returns (WBTC instance) { - | ^^^^^^^^^^^^^ - -Warning (2072): Unused local variable. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-4-deploy-all-contract-roninchain.sol:82:5: - | -82 | address wethUnwrapper = new MainchainWethUnwrapperDeploy().overrideArgs(abi.encode(weth)).run(); - | ^^^^^^^^^^^^^^^^^^^^^ - -Warning (2072): Unused local variable. - --> script/20240716-upgrade-v3.2.0-mainnet/20240716-p1-4-deploy-all-contract-roninchain.sol:86:5: - | -86 | address mainchainGatewayV3Logic = _deployLogic(Contract.MainchainGatewayV3.key()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:17:5: - | -17 | function bound(SD1x18 x, SD1x18 min, SD1x18 max) internal view returns (SD1x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:27:5: - | -27 | function bound(SD1x18 x, int64 min, SD1x18 max) internal view returns (SD1x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:37:5: - | -37 | function bound(SD1x18 x, SD1x18 min, int64 max) internal view returns (SD1x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:47:5: - | -47 | function bound(SD1x18 x, int64 min, int64 max) internal view returns (SD1x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:61:5: - | -61 | function bound(SD59x18 x, SD59x18 min, SD59x18 max) internal view returns (SD59x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:71:5: - | -71 | function bound(SD59x18 x, int256 min, SD59x18 max) internal view returns (SD59x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:81:5: - | -81 | function bound(SD59x18 x, SD59x18 min, int256 max) internal view returns (SD59x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:91:5: - | -91 | function bound(SD59x18 x, int256 min, int256 max) internal view returns (SD59x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:105:5: - | -105 | function bound(UD2x18 x, UD2x18 min, UD2x18 max) internal view returns (UD2x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:115:5: - | -115 | function bound(UD2x18 x, uint64 min, UD2x18 max) internal view returns (UD2x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:125:5: - | -125 | function bound(UD2x18 x, UD2x18 min, uint64 max) internal view returns (UD2x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:135:5: - | -135 | function bound(UD2x18 x, uint64 min, uint64 max) internal view returns (UD2x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:149:5: - | -149 | function bound(UD60x18 x, UD60x18 min, UD60x18 max) internal view returns (UD60x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:159:5: - | -159 | function bound(UD60x18 x, uint256 min, UD60x18 max) internal view returns (UD60x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:169:5: - | -169 | function bound(UD60x18 x, UD60x18 min, uint256 max) internal view returns (UD60x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - -Warning (2018): Function state mutability can be restricted to pure - --> lib/prb-math/test/utils/Utils.sol:179:5: - | -179 | function bound(UD60x18 x, uint256 min, uint256 max) internal view returns (UD60x18 result) { - | ^ (Relevant source part starts here and spans across multiple lines). - | Contract | Runtime Size (B) | Initcode Size (B) | Runtime Margin (B) | Initcode Margin (B) | -|-------------------------------------------------|------------------|-------------------|--------------------|---------------------| -| Address | 85 | 135 | 24,491 | 49,017 | -| AddressArrayUtils | 85 | 135 | 24,491 | 49,017 | -| Ballot | 85 | 135 | 24,491 | 49,017 | -| BaseGeneralConfig | 28,233 | 39,372 | -3,657 | 9,780 | -| BridgeOperatorsBallot | 164 | 214 | 24,412 | 48,938 | -| BridgeReward | 6,090 | 6,324 | 18,486 | 42,828 | -| BridgeRewardHarness | 6,635 | 6,881 | 17,941 | 42,271 | -| BridgeSlash | 5,383 | 5,597 | 19,193 | 43,555 | -| BridgeTracking | 6,709 | 6,950 | 17,867 | 42,202 | -| ECDSA | 85 | 135 | 24,491 | 49,017 | -| ERC1155 | 4,854 | 5,479 | 19,722 | 43,673 | -| ERC1155Holder | 939 | 967 | 23,637 | 48,185 | -| ERC1155PresetMinterPauser | 10,275 | 11,309 | 14,301 | 37,843 | -| ERC1967Proxy | 170 | 1,214 | 24,406 | 47,938 | -| ERC20 | 2,138 | 2,827 | 22,438 | 46,325 | -| ERC20PresetMinterPauser | 6,256 | 7,365 | 18,320 | 41,787 | -| ERC721 | 4,289 | 4,977 | 20,287 | 44,175 | -| EnumerableSet | 85 | 135 | 24,491 | 49,017 | -| ErrorHandler | 85 | 135 | 24,491 | 49,017 | -| GeneralConfig | 32,335 | 47,829 | -7,759 | 1,323 | -| GlobalProposal | 85 | 135 | 24,491 | 49,017 | -| HasBridgeDeprecated | 62 | 88 | 24,514 | 49,064 | -| HasValidatorDeprecated | 62 | 88 | 24,514 | 49,064 | -| IsolatedGovernance | 85 | 135 | 24,491 | 49,017 | -| JSONParserLib | 85 | 135 | 24,491 | 49,017 | -| LibArray | 85 | 135 | 24,491 | 49,017 | -| LibArtifact | 85 | 135 | 24,491 | 49,017 | -| LibCompanionNetwork | 85 | 135 | 24,491 | 49,017 | -| LibDeploy | 85 | 135 | 24,491 | 49,017 | -| LibErrorHandler | 85 | 135 | 24,491 | 49,017 | -| LibProposal | 85 | 135 | 24,491 | 49,017 | -| LibProxy | 85 | 135 | 24,491 | 49,017 | -| LibRandom | 85 | 135 | 24,491 | 49,017 | -| LibRequestBatch | 85 | 135 | 24,491 | 49,017 | -| LibSharedAddress | 85 | 135 | 24,491 | 49,017 | -| LibStorage | 85 | 135 | 24,491 | 49,017 | -| LibString | 85 | 135 | 24,491 | 49,017 | -| LibTUint256Slot | 85 | 135 | 24,491 | 49,017 | -| LibTimeWarper | 85 | 135 | 24,491 | 49,017 | -| LibTokenInfo | 164 | 214 | 24,412 | 48,938 | -| LibTokenInfoBatch | 85 | 135 | 24,491 | 49,017 | -| LibTokenOwner | 164 | 214 | 24,412 | 48,938 | -| MainchainBridgeManager | 20,517 | 20,742 | 4,059 | 28,410 | -| MainchainGatewayBatcher | 4,051 | 4,276 | 20,525 | 44,876 | -| MainchainGatewayV3 | 23,579 | 23,816 | 997 | 25,336 | -| MainchainGatewayV3_initialize | 25,293 | 25,530 | -717 | 23,622 | -| Math | 85 | 135 | 24,491 | 49,017 | -| MockBridge | 1,254 | 1,282 | 23,322 | 47,870 | -| MockBridgeManager | 2,614 | 2,642 | 21,962 | 46,510 | -| MockBridgeReward | 6,780 | 7,026 | 17,796 | 42,126 | -| MockBridgeSlash | 5,755 | 5,980 | 18,821 | 43,172 | -| MockBridgeTracking | 1,860 | 1,888 | 22,716 | 47,264 | -| MockDiscardEther | 137 | 163 | 24,439 | 48,989 | -| MockERC1155 | 5,888 | 6,515 | 18,688 | 42,637 | -| MockERC20 | 2,404 | 3,097 | 22,172 | 46,055 | -| MockERC721 | 4,663 | 5,355 | 19,913 | 43,797 | -| MockGatewayForTracking | 1,583 | 1,885 | 22,993 | 47,267 | -| MockRoninBridgeManager | 24,326 | 24,551 | 250 | 24,601 | -| MockRoninGatewayV3Extended | 24,133 | 24,370 | 443 | 24,782 | -| MockSLP | 2,403 | 2,877 | 22,173 | 46,275 | -| MockTUint256Slot | 2,619 | 2,647 | 21,957 | 46,505 | -| MockUSDC | 2,404 | 2,869 | 22,172 | 46,283 | -| MockValidatorContract_OnlyTiming_ForHardhatTest | 1,026 | 1,110 | 23,550 | 48,042 | -| MockValidatorSet_ForFoundryTest | 165 | 191 | 24,411 | 48,961 | -| MockWrappedToken | 2,169 | 2,870 | 22,407 | 46,282 | -| PRBMathUtils | 62 | 88 | 24,514 | 49,064 | -| PauseEnforcer | 3,995 | 4,953 | 20,581 | 44,199 | -| Proposal | 85 | 135 | 24,491 | 49,017 | -| RoninBridgeManager | 24,326 | 24,551 | 250 | 24,601 | -| RoninBridgeManagerConstructor | 14,743 | 14,968 | 9,833 | 34,184 | -| RoninGatewayV3 | 23,867 | 24,104 | 709 | 25,048 | -| RoninGatewayV3_initialize | 24,623 | 24,860 | -47 | 24,292 | -| RoninMockERC1155 | 8,696 | 9,657 | 15,880 | 39,495 | -| SafeERC20 | 85 | 135 | 24,491 | 49,017 | -| StdStyle | 85 | 135 | 24,491 | 49,017 | -| StorageSlot | 85 | 135 | 24,491 | 49,017 | -| Strings | 85 | 135 | 24,491 | 49,017 | -| Transfer | 164 | 214 | 24,412 | 48,938 | -| TransparentProxyOZv4_9_5 | 2,151 | 3,523 | 22,425 | 45,629 | -| TransparentProxyV2 | 2,339 | 3,711 | 22,237 | 45,441 | -| TransparentUpgradeableProxy | 2,031 | 3,385 | 22,545 | 45,767 | -| TransparentUpgradeableProxyV2 | 2,320 | 3,680 | 22,256 | 45,472 | -| Uint96ArrayUtils | 85 | 135 | 24,491 | 49,017 | -| WBTC | 6,462 | 8,108 | 18,114 | 41,044 | -| WBTC_Sepolia | 2,138 | 2,901 | 22,438 | 46,251 | -| WethUnwrapper | 1,185 | 1,384 | 23,391 | 47,768 | -| console | 85 | 135 | 24,491 | 49,017 | -| safeconsole | 85 | 135 | 24,491 | 49,017 | -| stdJson | 85 | 135 | 24,491 | 49,017 | -| stdMath | 85 | 135 | 24,491 | 49,017 | -| stdStorage | 85 | 135 | 24,491 | 49,017 | -| stdStorageSafe | 85 | 135 | 24,491 | 49,017 | ++===================================================================================================================================+ +| Address | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| AddressArrayUtils | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| Ballot | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| BaseGeneralConfig | 28,233 | 39,372 | -3,657 | 9,780 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| BridgeOperatorsBallot | 164 | 214 | 24,412 | 48,938 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| BridgeReward | 6,090 | 6,324 | 18,486 | 42,828 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| BridgeRewardHarness | 6,635 | 6,881 | 17,941 | 42,271 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| BridgeSlash | 5,383 | 5,597 | 19,193 | 43,555 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| BridgeTracking | 6,709 | 6,950 | 17,867 | 42,202 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ECDSA | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC1155 | 4,854 | 5,479 | 19,722 | 43,673 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC1155Holder | 939 | 967 | 23,637 | 48,185 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC1155PresetMinterPauser | 10,275 | 11,309 | 14,301 | 37,843 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC1967Proxy | 170 | 1,214 | 24,406 | 47,938 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC20 | 2,138 | 2,827 | 22,438 | 46,325 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC20PresetMinterPauser | 6,256 | 7,365 | 18,320 | 41,787 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ERC721 | 4,289 | 4,977 | 20,287 | 44,175 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| EnumerableSet | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| ErrorHandler | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| GeneralConfig | 32,555 | 48,269 | -7,979 | 883 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| GlobalProposal | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| HasBridgeDeprecated | 62 | 88 | 24,514 | 49,064 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| HasValidatorDeprecated | 62 | 88 | 24,514 | 49,064 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| IsolatedGovernance | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| JSONParserLib | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibArray | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibArtifact | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibCompanionNetwork | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibDeploy | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibErrorHandler | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibProposal | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibProxy | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibRandom | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibRequestBatch | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibSharedAddress | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibStorage | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibString | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibTUint256Slot | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibTimeWarper | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibTokenInfo | 164 | 214 | 24,412 | 48,938 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibTokenInfoBatch | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| LibTokenOwner | 164 | 214 | 24,412 | 48,938 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MainchainBridgeManager | 20,517 | 20,742 | 4,059 | 28,410 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MainchainGatewayBatcher | 4,051 | 4,276 | 20,525 | 44,876 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MainchainGatewayV3 | 23,751 | 23,988 | 825 | 25,164 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MainchainGatewayV3_initialize | 25,465 | 25,702 | -889 | 23,450 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| Math | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockBridge | 1,254 | 1,282 | 23,322 | 47,870 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockBridgeManager | 2,614 | 2,642 | 21,962 | 46,510 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockBridgeReward | 6,780 | 7,026 | 17,796 | 42,126 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockBridgeSlash | 5,755 | 5,980 | 18,821 | 43,172 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockBridgeTracking | 1,860 | 1,888 | 22,716 | 47,264 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockCCIPPoolMultiLane | 1,371 | 1,503 | 23,205 | 47,649 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockCCIPPoolSingleLane | 1,160 | 1,291 | 23,416 | 47,861 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockDiscardEther | 137 | 163 | 24,439 | 48,989 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockERC1155 | 5,888 | 6,515 | 18,688 | 42,637 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockERC20 | 2,404 | 3,097 | 22,172 | 46,055 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockERC721 | 4,663 | 5,355 | 19,913 | 43,797 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockGatewayForTracking | 1,583 | 1,885 | 22,993 | 47,267 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockRoninBridgeManager | 24,326 | 24,551 | 250 | 24,601 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockRoninGatewayV3Extended | 24,324 | 24,561 | 252 | 24,591 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockSLP | 2,403 | 2,877 | 22,173 | 46,275 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockTUint256Slot | 2,619 | 2,647 | 21,957 | 46,505 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockUSDC | 2,404 | 2,869 | 22,172 | 46,283 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockValidatorContract_OnlyTiming_ForHardhatTest | 1,026 | 1,110 | 23,550 | 48,042 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockValidatorSet_ForFoundryTest | 165 | 191 | 24,411 | 48,961 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| MockWrappedToken | 2,169 | 2,870 | 22,407 | 46,282 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| PRBMathUtils | 62 | 88 | 24,514 | 49,064 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| PauseEnforcer | 3,995 | 4,953 | 20,581 | 44,199 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| Proposal | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| RoninBridgeManager | 24,326 | 24,551 | 250 | 24,601 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| RoninBridgeManagerConstructor | 14,743 | 14,968 | 9,833 | 34,184 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| RoninGatewayV3 | 24,048 | 24,285 | 528 | 24,867 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| RoninGatewayV3_initialize | 24,804 | 25,041 | -228 | 24,111 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| RoninMockERC1155 | 8,696 | 9,657 | 15,880 | 39,495 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| SafeERC20 | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| StdStyle | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| StorageSlot | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| Strings | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| Transfer | 164 | 214 | 24,412 | 48,938 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| TransparentProxyOZv4_9_5 | 2,151 | 3,523 | 22,425 | 45,629 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| TransparentProxyV2 | 2,339 | 3,711 | 22,237 | 45,441 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| TransparentUpgradeableProxy | 2,031 | 3,385 | 22,545 | 45,767 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| TransparentUpgradeableProxyV2 | 2,320 | 3,680 | 22,256 | 45,472 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| Uint96ArrayUtils | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| WBTC | 6,462 | 8,108 | 18,114 | 41,044 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| WBTC_Sepolia | 2,138 | 2,901 | 22,438 | 46,251 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| WethUnwrapper | 1,185 | 1,384 | 23,391 | 47,768 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| console | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| safeconsole | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| stdJson | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| stdMath | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| stdStorage | 85 | 135 | 24,491 | 49,017 | +|-------------------------------------------------+------------------+-------------------+--------------------+---------------------| +| stdStorageSafe | 85 | 135 | 24,491 | 49,017 | +╰-------------------------------------------------+------------------+-------------------+--------------------+---------------------╯ diff --git a/logs/storage/MockCCIPPoolMultiLane.sol:MockCCIPPoolMultiLane.log b/logs/storage/MockCCIPPoolMultiLane.sol:MockCCIPPoolMultiLane.log new file mode 100644 index 00000000..ef2c7c13 --- /dev/null +++ b/logs/storage/MockCCIPPoolMultiLane.sol:MockCCIPPoolMultiLane.log @@ -0,0 +1 @@ +test/mocks/MockCCIPPoolMultiLane.sol:MockCCIPPoolMultiLane:s_lockedTokensByChainSelector (storage_slot: 0) (offset: 0) (type: mapping(uint64 => uint256)) (numberOfBytes: 32) \ No newline at end of file diff --git a/script/20240403-deploy-sepolia/deploy-sepolia.s.sol b/script/20240403-deploy-sepolia/deploy-sepolia.s.sol index 0954a811..681cde92 100644 --- a/script/20240403-deploy-sepolia/deploy-sepolia.s.sol +++ b/script/20240403-deploy-sepolia/deploy-sepolia.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.19; import { ISharedArgument } from "script/interfaces/ISharedArgument.sol"; import { LibSharedAddress } from "@fdk/libraries/LibSharedAddress.sol"; import { TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; -import { IMainchainGatewayV3 } from "@ronin/contracts/interfaces/IMainchainGatewayV3.sol"; +import { IMainchainGatewayV3 } from "script/interfaces/IMainchainGatewayV3.sol"; import { IPauseEnforcer } from "script/interfaces/IPauseEnforcer.sol"; import { Proposal } from "@ronin/contracts/libraries/Proposal.sol"; import { Ballot } from "@ronin/contracts/libraries/Ballot.sol"; diff --git a/script/GeneralConfig.sol b/script/GeneralConfig.sol index e76fa0cd..9a03bafa 100644 --- a/script/GeneralConfig.sol +++ b/script/GeneralConfig.sol @@ -20,7 +20,9 @@ contract GeneralConfig is BaseGeneralConfig, Utils { setNetworkInfo(Network.RoninDevnet.data()); } - function getCompanionNetwork(TNetwork network) public view virtual returns (TNetwork companionNetwork) { + function getCompanionNetwork( + TNetwork network + ) public view virtual returns (TNetwork companionNetwork) { if (network == DefaultNetwork.RoninMainnet.key()) return Network.EthMainnet.key(); if (network == Network.EthMainnet.key()) return DefaultNetwork.RoninMainnet.key(); if (network == DefaultNetwork.RoninTestnet.key()) return Network.Sepolia.key(); @@ -34,7 +36,9 @@ contract GeneralConfig is BaseGeneralConfig, Utils { return _localNetwork; } - function setLocalNetwork(IGeneralConfigExtended.LocalNetwork network) public virtual { + function setLocalNetwork( + IGeneralConfigExtended.LocalNetwork network + ) public virtual { _localNetwork = network; } @@ -81,9 +85,13 @@ contract GeneralConfig is BaseGeneralConfig, Utils { TNetwork currNetwork = getCurrentNetwork(); if (currNetwork == Network.Sepolia.key()) _contractNameMap[Contract.WBTC.key()] = "WBTC_Sepolia"; + if (currNetwork == DefaultNetwork.LocalHost.key()) _contractNameMap[Contract.MainchainGatewayV3.key()] = "MainchainGatewayV3_initialize"; + if (currNetwork == DefaultNetwork.LocalHost.key()) _contractNameMap[Contract.RoninGatewayV3.key()] = "RoninGatewayV3_initialize"; } - function _mapContractName(Contract contractEnum) internal { + function _mapContractName( + Contract contractEnum + ) internal { _contractNameMap[contractEnum.key()] = contractEnum.name(); } diff --git a/script/Migration.s.sol b/script/Migration.s.sol index 44fe5455..183855f6 100644 --- a/script/Migration.s.sol +++ b/script/Migration.s.sol @@ -76,7 +76,8 @@ contract Migration is BaseMigration, Utils, SignatureConsumer { param.test.governorPKs = governorPKs; // Mainchain Gateway Pause Enforcer - param.mainchainPauseEnforcer.admin = 0x968D0Cd7343f711216817E617d3f92a23dC91c07; + param.mainchainPauseEnforcer.admin = new address[](1); + param.mainchainPauseEnforcer.admin[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07; param.mainchainPauseEnforcer.sentries = wrapAddress(0x8Ed0c5B427688f2Bd945509199CAa4741C81aFFe); // Gnosis Sepolia // Mainchain Gateway V3 @@ -161,7 +162,8 @@ contract Migration is BaseMigration, Utils, SignatureConsumer { // Bridge Tracking // Ronin Gateway Pause Enforcer - param.roninPauseEnforcer.admin = makeAddr("pause-enforcer-admin"); + param.roninPauseEnforcer.admin = new address[](1); + param.roninPauseEnforcer.admin[0] = makeAddr("pause-enforcer-admin"); param.roninPauseEnforcer.sentries = wrapAddress(makeAddr("pause-enforcer-sentry")); // Ronin Gateway V3 @@ -182,7 +184,8 @@ contract Migration is BaseMigration, Utils, SignatureConsumer { param.roninBridgeManager.targets = targets; // Mainchain Gateway Pause Enforcer - param.mainchainPauseEnforcer.admin = makeAddr("pause-enforcer-admin"); + param.mainchainPauseEnforcer.admin = new address[](1); + param.mainchainPauseEnforcer.admin[0] = makeAddr("pause-enforcer-admin"); param.mainchainPauseEnforcer.sentries = wrapAddress(makeAddr("pause-enforcer-sentry")); // Mainchain Gateway V3 @@ -313,7 +316,9 @@ contract Migration is BaseMigration, Utils, SignatureConsumer { } } - function _deployLogic(TContract contractType) internal virtual override returns (address payable logic) { + function _deployLogic( + TContract contractType + ) internal virtual override returns (address payable logic) { logic = _deployLogic(contractType, EMPTY_ARGS); } diff --git a/script/contracts/MainchainGatewayV3Deploy.s.sol b/script/contracts/MainchainGatewayV3Deploy.s.sol index 00e149b1..5d82e06d 100644 --- a/script/contracts/MainchainGatewayV3Deploy.s.sol +++ b/script/contracts/MainchainGatewayV3Deploy.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { IMainchainGatewayV3 } from "@ronin/contracts/interfaces/IMainchainGatewayV3.sol"; +import { IMainchainGatewayV3 } from "script/interfaces/IMainchainGatewayV3.sol"; import { Contract } from "../utils/Contract.sol"; import { ISharedArgument } from "../interfaces/ISharedArgument.sol"; import { Migration } from "../Migration.s.sol"; diff --git a/script/contracts/MainchainPauseEnforcerDeploy.s.sol b/script/contracts/MainchainPauseEnforcerDeploy.s.sol index de178fd2..15eff076 100644 --- a/script/contracts/MainchainPauseEnforcerDeploy.s.sol +++ b/script/contracts/MainchainPauseEnforcerDeploy.s.sol @@ -8,6 +8,6 @@ import { Migration } from "../Migration.s.sol"; contract MainchainPauseEnforcerDeploy is Migration { function run() public virtual returns (IPauseEnforcer) { - return IPauseEnforcer(_deployProxy(Contract.MainchainPauseEnforcer.key(), EMPTY_ARGS)); + return IPauseEnforcer(_deployImmutable(Contract.MainchainPauseEnforcer.key())); } } diff --git a/script/contracts/RoninGatewayV3Deploy.s.sol b/script/contracts/RoninGatewayV3Deploy.s.sol index 1b11048d..cd779df9 100644 --- a/script/contracts/RoninGatewayV3Deploy.s.sol +++ b/script/contracts/RoninGatewayV3Deploy.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { IRoninGatewayV3 } from "@ronin/contracts/interfaces/IRoninGatewayV3.sol"; +import { IRoninGatewayV3 } from "script/interfaces/IRoninGatewayV3.sol"; import { IWETH } from "src/interfaces/IWETH.sol"; import { Contract } from "../utils/Contract.sol"; import { ISharedArgument } from "../interfaces/ISharedArgument.sol"; diff --git a/script/contracts/RoninPauseEnforcerDeploy.s.sol b/script/contracts/RoninPauseEnforcerDeploy.s.sol index 89e73da6..8f7b3579 100644 --- a/script/contracts/RoninPauseEnforcerDeploy.s.sol +++ b/script/contracts/RoninPauseEnforcerDeploy.s.sol @@ -8,6 +8,6 @@ import { Migration } from "../Migration.s.sol"; contract RoninPauseEnforcerDeploy is Migration { function run() public virtual returns (IPauseEnforcer) { - return IPauseEnforcer(_deployProxy(Contract.RoninPauseEnforcer.key(), EMPTY_ARGS)); + return IPauseEnforcer(_deployImmutable(Contract.RoninPauseEnforcer.key())); } } diff --git a/script/interfaces/IMainchainGatewayV3.sol b/script/interfaces/IMainchainGatewayV3.sol new file mode 100644 index 00000000..3cf4bd55 --- /dev/null +++ b/script/interfaces/IMainchainGatewayV3.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.27; + +import { TokenOwner } from "src/libraries/LibTokenOwner.sol"; +import { TokenInfo, TokenStandard, Transfer } from "src/libraries/Transfer.sol"; +import { MappedTokenConsumer } from "src/interfaces/consumers/MappedTokenConsumer.sol"; +import { VoteStatusConsumer } from "src/interfaces/consumers/VoteStatusConsumer.sol"; +import { ContractType } from "src/utils/ContractType.sol"; +import { RoleAccess } from "src/utils/RoleAccess.sol"; +import { SignatureConsumer } from "src/interfaces/consumers/SignatureConsumer.sol"; + +interface IMainchainGatewayV3 { + error ErrContractTypeNotFound(ContractType contractType); + error ErrERC1155MintingFailed(); + error ErrERC20MintingFailed(); + error ErrERC721MintingFailed(); + error ErrEmptyArray(); + error ErrInvalidChainId(bytes4 msgSig, uint256 actual, uint256 expected); + error ErrInvalidInfo(); + error ErrInvalidOrder(bytes4 msgSig); + error ErrInvalidPercentage(); + error ErrInvalidReceipt(); + error ErrInvalidReceiptKind(); + error ErrInvalidRequest(); + error ErrInvalidSigner(address signer, uint256 weight, SignatureConsumer.Signature sig); + error ErrInvalidThreshold(bytes4 msgSig); + error ErrInvalidTokenStandard(); + error ErrLengthMismatch(bytes4 msgSig); + error ErrNotWhitelistedToken(address token); + error ErrNullHighTierVoteWeightProvided(bytes4 msgSig); + error ErrNullMinVoteWeightProvided(bytes4 msgSig); + error ErrNullTotalWeightProvided(bytes4 msgSig); + error ErrQueryForApprovedWithdrawal(); + error ErrQueryForInsufficientVoteWeight(); + error ErrQueryForProcessedWithdrawal(); + error ErrReachedDailyWithdrawalLimit(); + error ErrRestricted(bytes4 fnSig, TokenStandard standard); + error ErrTokenCouldNotTransfer(TokenInfo tokenInfo, address to, address token); + error ErrTokenCouldNotTransferFrom(TokenInfo tokenInfo, address from, address to, address token); + error ErrUnauthorized(bytes4 msgSig, RoleAccess expectedRole); + error ErrUnexpectedInternalCall(bytes4 msgSig, ContractType expectedContractType, address actual); + error ErrUnsupportedStandard(); + error ErrUnsupportedToken(); + error ErrWhitelistWrappedTokenInstead(); + error ErrZeroCodeContract(address addr); + + event ContractUpdated(ContractType indexed contractType, address indexed addr); + event DailyWithdrawalLimitsUpdated(address[] tokens, uint256[] limits); + event DepositRequested(bytes32 receiptHash, Transfer.Receipt receipt); + event HighTierThresholdsUpdated(address[] tokens, uint256[] thresholds); + event HighTierVoteWeightThresholdUpdated( + uint256 indexed nonce, uint256 indexed numerator, uint256 indexed denominator, uint256 previousNumerator, uint256 previousDenominator + ); + event Initialized(uint8 version); + event LockedThresholdsUpdated(address[] tokens, uint256[] thresholds); + event Paused(address account); + event Restricted(address indexed by, bytes4 indexed fnSig, uint8 enumBitmap); + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + event ThresholdUpdated(uint256 indexed nonce, uint256 indexed numerator, uint256 indexed denominator, uint256 previousNumerator, uint256 previousDenominator); + event TokenMapped(address[] mainchainTokens, address[] roninTokens, TokenStandard[] standards); + event UnRestricted(address indexed by, bytes4 indexed fnSig); + event UnlockFeePercentagesUpdated(address[] tokens, uint256[] percentages); + event Unpaused(address account); + event WhitelistUpdated(address indexed by, address[] tokens, address[] recipients, uint64[] remoteChainSelectors); + event WithdrawalLocked(bytes32 receiptHash, Transfer.Receipt receipt); + event WithdrawalUnlocked(bytes32 receiptHash, Transfer.Receipt receipt); + event Withdrew(bytes32 receiptHash, Transfer.Receipt receipt); + event WrappedNativeTokenContractUpdated(address weth); + + receive() external payable; + + function DEFAULT_ADMIN_ROLE() external view returns (bytes32); + function DOMAIN_SEPARATOR() external view returns (bytes32); + function WITHDRAWAL_UNLOCKER_ROLE() external view returns (bytes32); + function _MAX_PERCENTAGE() external view returns (uint256); + function checkHighTierVoteWeightThreshold( + uint256 _voteWeight + ) external view returns (bool); + function checkThreshold( + uint256 _voteWeight + ) external view returns (bool); + function dailyWithdrawalLimit( + address + ) external view returns (uint256); + function depositCount() external view returns (uint256); + function emergencyPauser() external view returns (address); + function getContract( + ContractType contractType + ) external view returns (address contract_); + function getHighTierVoteWeightThreshold() external view returns (uint256, uint256); + function getRoleAdmin( + bytes32 role + ) external view returns (bytes32); + function getRoleMember(bytes32 role, uint256 index) external view returns (address); + function getRoleMemberCount( + bytes32 role + ) external view returns (uint256); + function getRoninToken( + address mainchainToken + ) external view returns (MappedTokenConsumer.MappedToken memory token); + function getThreshold() external view returns (uint256 num_, uint256 denom_); + function getWhitelistedAddresses( + address[] memory tokens + ) external view returns (address[] memory whitelisteds); + function grantRole(bytes32 role, address account) external; + function hasRole(bytes32 role, address account) external view returns (bool); + function highTierThreshold( + address + ) external view returns (uint256); + function initializeV5(address migrator, address newEmergencyPauser) external; + function lastDateSynced( + address + ) external view returns (uint256); + function lastSyncedWithdrawal( + address + ) external view returns (uint256); + function lockedThreshold( + address + ) external view returns (uint256); + function mapTokens(address[] memory _mainchainTokens, address[] memory _roninTokens, TokenStandard[] memory _standards) external; + function mapTokensAndThresholds( + address[] memory _mainchainTokens, + address[] memory _roninTokens, + TokenStandard[] memory _standards, + uint256[][4] memory _thresholds + ) external; + function migrateERC20(address[] memory tokens, uint256[] memory amounts) external; + function migrateERC721(address[] memory tokens, uint256[] memory ids) external; + function minimumVoteWeight() external view returns (uint256); + function nonce() external view returns (uint256); + function onBridgeOperatorsAdded(address[] memory operators, uint96[] memory weights, bool[] memory addeds) external returns (bytes4); + function onBridgeOperatorsRemoved(address[] memory operators, bool[] memory removeds) external returns (bytes4); + function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) external returns (bytes4); + function onERC1155Received(address, address, uint256, uint256, bytes memory) external returns (bytes4); + function pause() external; + function paused() external view returns (bool); + function reachedWithdrawalLimit(address _token, uint256 _quantity) external view returns (bool); + function renounceRole(bytes32 role, address account) external; + function requestDepositFor( + Transfer.Request memory _request + ) external payable; + function restrict(bytes4 fnSig, uint8 enumBitmap) external; + function restricted(bytes4 fnSig, TokenStandard standard) external view returns (bool yes); + function revokeRole(bytes32 role, address account) external; + function roninChainId() external view returns (uint256); + function setContract(ContractType contractType, address addr) external; + function setDailyWithdrawalLimits(address[] memory _tokens, uint256[] memory _limits) external; + function setEmergencyPauser( + address _addr + ) external; + function setHighTierThresholds(address[] memory _tokens, uint256[] memory _thresholds) external; + function setHighTierVoteWeightThreshold(uint256 _numerator, uint256 _denominator) external returns (uint256 _previousNum, uint256 _previousDenom); + function setLockedThresholds(address[] memory _tokens, uint256[] memory _thresholds) external; + function setThreshold(uint256 num, uint256 denom) external; + function setUnlockFeePercentages(address[] memory _tokens, uint256[] memory _percentages) external; + function setWrappedNativeTokenContract( + address _wrappedToken + ) external; + function submitWithdrawal(Transfer.Receipt memory _receipt, SignatureConsumer.Signature[] memory _signatures) external returns (bool _locked); + function supportsInterface( + bytes4 interfaceId + ) external view returns (bool); + function unlockFeePercentages( + address + ) external view returns (uint256); + function unlockWithdrawal( + Transfer.Receipt memory receipt + ) external; + function unpause() external; + function whitelist(address[] memory tokens, address[] memory recipients, uint64[] memory remoteChainSelectors) external; + function withdrawalHash( + uint256 + ) external view returns (bytes32); + function withdrawalLocked( + uint256 + ) external view returns (bool); + function wrappedNativeToken() external view returns (address); +} diff --git a/script/interfaces/IPauseEnforcer.sol b/script/interfaces/IPauseEnforcer.sol index ecc1d30b..90d56a6e 100644 --- a/script/interfaces/IPauseEnforcer.sol +++ b/script/interfaces/IPauseEnforcer.sol @@ -16,20 +16,33 @@ interface IPauseEnforcer { function DEFAULT_ADMIN_ROLE() external view returns (bytes32); function SENTRY_ROLE() external view returns (bytes32); - function changeTarget(address _target) external; + function changeTarget( + address _target + ) external; function emergency() external view returns (bool); - function getRoleAdmin(bytes32 role) external view returns (bytes32); + function getRoleAdmin( + bytes32 role + ) external view returns (bytes32); function getRoleMember(bytes32 role, uint256 index) external view returns (address); - function getRoleMemberCount(bytes32 role) external view returns (uint256); + function getRoleMemberCount( + bytes32 role + ) external view returns (uint256); function grantRole(bytes32 role, address account) external; - function grantSentry(address _sentry) external; + function grantSentry( + address _sentry + ) external; function hasRole(bytes32 role, address account) external view returns (bool); function initialize(address _target, address _admin, address[] memory _sentries) external; function renounceRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; - function revokeSentry(address _sentry) external; - function supportsInterface(bytes4 interfaceId) external view returns (bool); + function revokeSentry( + address _sentry + ) external; + function supportsInterface( + bytes4 interfaceId + ) external view returns (bool); function target() external view returns (address); function triggerPause() external; function triggerUnpause() external; + function triggerRestrict(bytes4 fnSig, uint8 enumBitmap) external; } diff --git a/script/interfaces/IRoninGatewayV3.sol b/script/interfaces/IRoninGatewayV3.sol new file mode 100644 index 00000000..57998168 --- /dev/null +++ b/script/interfaces/IRoninGatewayV3.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.27; + +import { TokenOwner } from "src/libraries/LibTokenOwner.sol"; +import { TokenInfo, TokenStandard, Transfer } from "src/libraries/Transfer.sol"; +import { MappedTokenConsumer } from "src/interfaces/consumers/MappedTokenConsumer.sol"; +import { VoteStatusConsumer } from "src/interfaces/consumers/VoteStatusConsumer.sol"; +import { ContractType } from "src/utils/ContractType.sol"; +import { RoleAccess } from "src/utils/RoleAccess.sol"; + +interface IRoninGatewayV3 { + error ErrAlreadyVoted(address voter); + error ErrContractTypeNotFound(ContractType contractType); + error ErrERC1155MintingFailed(); + error ErrERC20MintingFailed(); + error ErrERC721MintingFailed(); + error ErrEmptyArray(); + error ErrInvalidChainId(bytes4 msgSig, uint256 actual, uint256 expected); + error ErrInvalidInfo(); + error ErrInvalidReceipt(); + error ErrInvalidReceiptKind(); + error ErrInvalidRequest(); + error ErrInvalidThreshold(bytes4 msgSig); + error ErrInvalidTokenStandard(); + error ErrInvalidTrustedThreshold(); + error ErrLengthMismatch(bytes4 msgSig); + error ErrNotWhitelistedToken(address token); + error ErrNullMinVoteWeightProvided(bytes4 msgSig); + error ErrQueryForTooSmallQuantity(); + error ErrRestricted(bytes4 fnSig, TokenStandard standard); + error ErrTokenCouldNotTransfer(TokenInfo tokenInfo, address to, address token); + error ErrTokenCouldNotTransferFrom(TokenInfo tokenInfo, address from, address to, address token); + error ErrUnauthorized(bytes4 msgSig, RoleAccess expectedRole); + error ErrUnsupportedStandard(); + error ErrUnsupportedToken(); + error ErrWhitelistWrappedTokenInstead(); + error ErrWithdrawalsMigrated(); + error ErrWithdrawnOnMainchainAlready(); + error ErrZeroCodeContract(address addr); + + event ContractUpdated(ContractType indexed contractType, address indexed addr); + event DepositVoted(address indexed bridgeOperator, uint256 indexed id, uint256 indexed chainId, bytes32 receiptHash); + event Deposited(bytes32 receiptHash, Transfer.Receipt receipt); + event Initialized(uint8 version); + event MainchainWithdrew(bytes32 receiptHash, Transfer.Receipt receipt); + event MinimumThresholdsUpdated(address[] tokens, uint256[] threshold); + event Paused(address account); + event Restricted(address indexed by, bytes4 indexed fnSig, uint8 stdBitmap); + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + event ThresholdUpdated(uint256 indexed nonce, uint256 indexed numerator, uint256 indexed denominator, uint256 previousNumerator, uint256 previousDenominator); + event TokenMapped(address[] roninTokens, address[] mainchainTokens, uint256[] chainIds, TokenStandard[] standards); + event TokenUnmapped(address[] roninTokens, uint256[] chainIds); + event TrustedThresholdUpdated( + uint256 indexed nonce, uint256 indexed numerator, uint256 indexed denominator, uint256 previousNumerator, uint256 previousDenominator + ); + event UnRestricted(address indexed by, bytes4 indexed fnSig); + event Unpaused(address account); + event WhitelistUpdated(address indexed by, address[] tokens, address[] recipients, uint64[] remoteChainSelectors); + event WithdrawalRequested(bytes32 receiptHash, Transfer.Receipt); + event WithdrawalSignaturesRequested(bytes32 receiptHash, Transfer.Receipt); + + receive() external payable; + + function DEFAULT_ADMIN_ROLE() external view returns (bytes32); + function bulkRequestWithdrawalFor(Transfer.Request[] memory requests, uint256 chainId) external; + function bulkSubmitWithdrawalSignatures(uint256[] memory withdrawals, bytes[] memory signatures) external; + function checkThreshold( + uint256 _voteWeight + ) external view returns (bool); + function depositFor( + Transfer.Receipt memory _receipt + ) external; + function depositVote(uint256, uint256) external view returns (VoteStatusConsumer.VoteStatus status, bytes32 finalHash, uint256 expiredAt, uint256 createdAt); + function depositVoted(uint256 _chainId, uint256 _depositId, address _voter) external view returns (bool); + function emergencyPauser() external view returns (address); + function getContract( + ContractType contractType + ) external view returns (address contract_); + function getMainchainToken(address _roninToken, uint256 _chainId) external view returns (MappedTokenConsumer.MappedToken memory _token); + function getRoleAdmin( + bytes32 role + ) external view returns (bytes32); + function getRoleMember(bytes32 role, uint256 index) external view returns (address); + function getRoleMemberCount( + bytes32 role + ) external view returns (uint256); + function getThreshold() external view returns (uint256 num_, uint256 denom_); + function getTrustedThreshold() external view returns (uint256 trustedNum_, uint256 trustedDenom_); + function getWhitelistedAddresses( + address[] memory tokens + ) external view returns (address[] memory whitelisteds); + function getWithdrawalSignatures(uint256 withdrawalId, address[] memory operators) external view returns (bytes[] memory _signatures); + function grantRole(bytes32 role, address account) external; + function hasRole(bytes32 role, address account) external view returns (bool); + function initializeV4(address migrator, address newEmergencyPauser) external; + function mainchainWithdrew( + uint256 _withdrawalId + ) external view returns (bool); + function mainchainWithdrewVote( + uint256 + ) external view returns (VoteStatusConsumer.VoteStatus status, bytes32 finalHash, uint256 expiredAt, uint256 createdAt); + function mainchainWithdrewVoted(uint256 _withdrawalId, address _voter) external view returns (bool); + function mapTokens(address[] memory _roninTokens, address[] memory _mainchainTokens, uint256[] memory _chainIds, TokenStandard[] memory _standards) external; + function mapTokensWithMinThresholds( + address[] memory roninTokens_, + address[] memory mainchainTokens_, + uint256[] memory chainIds_, + TokenStandard[] memory standards_, + uint256[] memory minimumThresholds_ + ) external; + function migrateERC20(address[] memory tokens, uint256[] memory amounts) external; + function migrateERC721(address[] memory tokens, uint256[] memory ids) external; + function minimumThreshold( + address mainchainToken + ) external view returns (uint256); + function minimumVoteWeight() external view returns (uint256); + function nonce() external view returns (uint256); + function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) external returns (bytes4); + function onERC1155Received(address, address, uint256, uint256, bytes memory) external returns (bytes4); + function pause() external; + function paused() external view returns (bool); + function renounceRole(bytes32 role, address account) external; + function requestWithdrawalFor(Transfer.Request memory _request, uint256 _chainId) external; + function requestWithdrawalSignatures( + uint256 _withdrawalId + ) external; + function restrict(bytes4 fnSig, uint8 enumBitmap) external; + function restricted(bytes4 fnSig, TokenStandard standard) external view returns (bool yes); + function revokeRole(bytes32 role, address account) external; + function setContract(ContractType contractType, address addr) external; + function setEmergencyPauser( + address _addr + ) external; + function setMinimumThresholds(address[] memory mainchainTokens_, uint256[] memory thresholds_) external; + function setThreshold(uint256 _numerator, uint256 _denominator) external; + function setTrustedThreshold(uint256 _trustedNumerator, uint256 _trustedDenominator) external returns (uint256, uint256); + function supportsInterface( + bytes4 interfaceId + ) external view returns (bool); + function tryBulkAcknowledgeMainchainWithdrew( + uint256[] memory _withdrawalIds + ) external returns (bool[] memory _executedReceipts); + function tryBulkDepositFor( + Transfer.Receipt[] memory receipts + ) external returns (bool[] memory _executedReceipts); + function unmapTokens(address[] memory roninTokens_, uint256[] memory chainIds_) external; + function unpause() external; + function whitelist(address[] memory tokens, address[] memory recipients, uint64[] memory remoteChainSelectors) external; + function withdrawal( + uint256 + ) external view returns (uint256 id, Transfer.Kind kind, TokenOwner memory mainchain, TokenOwner memory ronin, TokenInfo memory info); + function withdrawalCount() external view returns (uint256); + function withdrawalStatVote( + uint256 + ) external view returns (VoteStatusConsumer.VoteStatus status, bytes32 finalHash, uint256 expiredAt, uint256 createdAt); + function wrappedNativeToken() external view returns (address); +} diff --git a/script/interfaces/ISharedArgument.sol b/script/interfaces/ISharedArgument.sol index a2864b31..3cbbcbcc 100644 --- a/script/interfaces/ISharedArgument.sol +++ b/script/interfaces/ISharedArgument.sol @@ -80,7 +80,7 @@ interface ISharedArgument is IGeneralConfigExtended { struct PauseEnforcerParam { address target; - address admin; + address[] admin; address[] sentries; } diff --git a/test/bridge/integration/BaseIntegration.t.sol b/test/bridge/integration/BaseIntegration.t.sol index 44d3a154..c15dc3db 100644 --- a/test/bridge/integration/BaseIntegration.t.sol +++ b/test/bridge/integration/BaseIntegration.t.sol @@ -10,11 +10,11 @@ import { GeneralConfig } from "script/GeneralConfig.sol"; import { Network } from "script/utils/Network.sol"; import { IRoninBridgeManager } from "script/interfaces/IRoninBridgeManager.sol"; -import { IRoninGatewayV3 } from "@ronin/contracts/ronin/gateway/RoninGatewayV3.sol"; +import { IRoninGatewayV3 } from "script/interfaces/IRoninGatewayV3.sol"; import { IBridgeTracking } from "@ronin/contracts/ronin/gateway/BridgeTracking.sol"; import { IBridgeSlash } from "@ronin/contracts/ronin/gateway/BridgeSlash.sol"; import { IBridgeReward } from "@ronin/contracts/ronin/gateway/BridgeReward.sol"; -import { IMainchainGatewayV3 } from "@ronin/contracts/mainchain/MainchainGatewayV3.sol"; +import { IMainchainGatewayV3 } from "script/interfaces/IMainchainGatewayV3.sol"; import { IMainchainGatewayBatcher } from "script/interfaces/IMainchainGatewayBatcher.sol"; import { IMainchainBridgeManager } from "script/interfaces/IMainchainBridgeManager.sol"; @@ -37,6 +37,7 @@ import { GlobalCoreGovernance } from "@ronin/contracts/extensions/sequential-gov import { IBridgeManager } from "@ronin/contracts/interfaces/bridge/IBridgeManager.sol"; import { IHasContracts } from "@ronin/contracts/interfaces/collections/IHasContracts.sol"; import { IBridgeManagerCallbackRegister } from "@ronin/contracts/interfaces/bridge/IBridgeManagerCallbackRegister.sol"; +import { IPauseEnforcer } from "script/interfaces/IPauseEnforcer.sol"; import { ContractType } from "@ronin/contracts/utils/ContractType.sol"; import { TransparentUpgradeableProxyV2 } from "@ronin/contracts/extensions/TransparentUpgradeableProxyV2.sol"; import { MockValidatorContract_OnlyTiming_ForHardhatTest } from "@ronin/contracts/mocks/ronin/MockValidatorContract_OnlyTiming_ForHardhatTest.sol"; @@ -150,7 +151,9 @@ contract BaseIntegration_Test is Base_Test { _bridgeTracking = new BridgeTrackingDeploy().run(); _bridgeSlash = new BridgeSlashDeploy().run(); _bridgeReward = new BridgeRewardDeploy().run(); - _roninPauseEnforcer = new RoninPauseEnforcerDeploy().run(); + _param = ISharedArgument(LibSharedAddress.CONFIG).sharedArguments(); + ISharedArgument.PauseEnforcerParam memory param = _param.roninPauseEnforcer; + _roninPauseEnforcer = IPauseEnforcer(new RoninPauseEnforcerDeploy().overrideArgs(abi.encode(address(_roninGatewayV3), param.admin, param.sentries)).run()); _roninBridgeManager = new RoninBridgeManagerDeploy().run(); _roninWeth = new WETHDeploy().run(); @@ -163,7 +166,6 @@ contract BaseIntegration_Test is Base_Test { _roninMockERC20 = new MockERC20("MockERC20", "ME2"); _roninMockPoisonERC20 = new MockPoisonERC20("MockPoisonERC20", "MPE2"); - _param = ISharedArgument(LibSharedAddress.CONFIG).sharedArguments(); _roninProposalUtils = new RoninBridgeAdminUtils(block.chainid, _param.test.governorPKs, _roninBridgeManager, _param.roninBridgeManager.governors[0]); _validatorSet = new MockValidatorContract_OnlyTiming_ForHardhatTest(_param.test.numberOfBlocksInEpoch); @@ -173,10 +175,13 @@ contract BaseIntegration_Test is Base_Test { } function _deployContractsOnMainchain() internal { - _mainchainPauseEnforcer = new MainchainPauseEnforcerDeploy().run(); _mainchainGatewayV3 = new MainchainGatewayV3Deploy().run(); _mainchainBridgeManager = new MainchainBridgeManagerDeploy().run(); + ISharedArgument.PauseEnforcerParam memory param = _param.mainchainPauseEnforcer; + _mainchainPauseEnforcer = + IPauseEnforcer(new MainchainPauseEnforcerDeploy().overrideArgs(abi.encode(address(_mainchainGatewayV3), param.admin, param.sentries)).run()); + _mainchainWeth = new WETHDeploy().run(); _mainchainAxs = new AXSDeploy().run(); _mainchainSlp = new SLPDeploy().run(); @@ -189,7 +194,6 @@ contract BaseIntegration_Test is Base_Test { bytes memory args = abi.encode(_mainchainWeth); _mainchainWethUnwrapper = new MainchainWethUnwrapperDeploy().runWithArgs(args); - _param = ISharedArgument(LibSharedAddress.CONFIG).sharedArguments(); _mainchainProposalUtils = new MainchainBridgeAdminUtils(block.chainid, _param.test.governorPKs, _mainchainBridgeManager, _param.mainchainBridgeManager.governors[0]); @@ -208,13 +212,13 @@ contract BaseIntegration_Test is Base_Test { _bridgeTrackingInitialize(); _bridgeSlashInitialize(); - _roninPauseEnforcerInitialize(); + // _roninPauseEnforcerInitialize(); _roninGatewayV3Initialize(); _constructForRoninBridgeManager(); } function _initializeMainchain() internal { - _mainchainPauseEnforcerInitialize(); + // _mainchainPauseEnforcerInitialize(); _mainchainBridgeManagerInitialize(); _constructForMainchainBridgeManager(); _mainchainGatewayV3Initialize(); @@ -322,23 +326,25 @@ contract BaseIntegration_Test is Base_Test { (bool success,) = address(_roninGatewayV3).call( abi.encodeWithSignature( - "initialize(address,uint256,uint256,uint256,uint256,address[],address[][2],uint256[][2],uint8[])", + "initialize(address,uint256,uint256,uint256,uint256,address[][2],uint256[][2],uint8[],address,address)", param.roleSetter, param.numerator, param.denominator, param.trustedNumerator, param.trustedDenominator, - param.withdrawalMigrators, param.packedAddresses, param.packedNumbers, - param.standards + param.standards, + _roninBridgeManager, + _bridgeTracking ) ); require(success, "RoninGatewayV3 initialize failed"); - (success,) = address(_roninGatewayV3).call(abi.encodeWithSignature("initializeV2()")); - require(success, "RoninGatewayV3 initializeV2 failed"); - (success,) = address(_roninGatewayV3).call(abi.encodeWithSignature("initializeV3(address)", _roninBridgeManager)); - require(success, "RoninGatewayV3 initializeV3 failed"); + // (success,) = + // address(_roninGatewayV3).call(abi.encodeWithSignature("initializeV4(address,address,address)", _roninWron, makeAddr("migrator"), _roninPauseEnforcer)); + // require(success, "RoninGatewayV3 initializeV4 failed"); + // (success,) = address(_roninGatewayV3).call(abi.encodeWithSignature("initializeV3(address)", _roninBridgeManager)); + // require(success, "RoninGatewayV3 initializeV3 failed"); } function _constructForRoninBridgeManager() internal { @@ -602,7 +608,7 @@ contract BaseIntegration_Test is Base_Test { (bool success,) = address(_mainchainGatewayV3).call( abi.encodeWithSignature( - "initialize(address,address,uint256,uint256,uint256,uint256,address[][3],uint256[][4],uint8[])", + "initialize(address,address,uint256,uint256,uint256,uint256,address[][3],uint256[][4],uint8[],address)", param.roleSetter, IWETH(param.wrappedToken), block.chainid, @@ -611,16 +617,17 @@ contract BaseIntegration_Test is Base_Test { param.denominator, param.addresses, param.thresholds, - param.standards + param.standards, + _mainchainBridgeManager ) ); require(success, "MainchainGatewayV3 initialize failed"); - (success,) = address(_mainchainGatewayV3).call(abi.encodeWithSignature("initializeV2(address)", _mainchainBridgeManager)); - require(success, "MainchainGatewayV3 initializeV2 failed"); - (success,) = address(_mainchainGatewayV3).call(abi.encodeWithSignature("initializeV3()")); - require(success, "MainchainGatewayV3 initializeV3 failed"); - (success,) = address(_mainchainGatewayV3).call(abi.encodeWithSignature("initializeV4(address)", _mainchainWethUnwrapper)); - require(success, "MainchainGatewayV3 initializeV4 failed"); + // (success,) = address(_mainchainGatewayV3).call(abi.encodeWithSignature("initializeV5(address,address)", makeAddr("migrator"), _mainchainPauseEnforcer)); + // require(success, "MainchainGatewayV3 initializeV2 failed"); + // (success,) = address(_mainchainGatewayV3).call(abi.encodeWithSignature("initializeV3()")); + // require(success, "MainchainGatewayV3 initializeV5 failed"); + // (success,) = address(_mainchainGatewayV3).call(abi.encodeWithSignature("initializeV4(address)", _mainchainWethUnwrapper)); + // require(success, "MainchainGatewayV3 initializeV4 failed"); } function _mainchainPauseEnforcerInitialize() internal { diff --git a/test/bridge/integration/asset-migration/GatewayV3.AssetMigration.t.sol b/test/bridge/integration/asset-migration/GatewayV3.AssetMigration.t.sol new file mode 100644 index 00000000..85dc315d --- /dev/null +++ b/test/bridge/integration/asset-migration/GatewayV3.AssetMigration.t.sol @@ -0,0 +1,287 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../BaseIntegration.t.sol"; +import { LibProxy } from "@fdk/libraries/LibProxy.sol"; +import { MockCCIPPoolSingleLane } from "test/mocks/MockCCIPPoolSingleLane.sol"; +import { MockCCIPPoolMultiLane } from "test/mocks/MockCCIPPoolMultiLane.sol"; + +contract GatewayV3_AssetMigration is BaseIntegration_Test { + address internal _pauseEnforcer; + address internal _migrator; + + address[] internal _ronTokens; + address[] internal _ronRecipients; + uint64[] internal _ronRemoteChainSelectors; + + address[] internal _ethTokens; + address[] internal _ethRecipients; + uint64[] internal _ethRemoteChainSelectors; + + bytes32 internal constant _MIGRATOR_ROLE = keccak256("MIGRATOR_ROLE"); + + function setUp() public virtual override { + super.setUp(); + + _pauseEnforcer = makeAddr("pause-enforcer"); + _migrator = makeAddr("migrator"); + + _initialize(); + } + + function _initialize() internal { + (bool success,) = address(_roninGatewayV3).call( + abi.encodeWithSignature( + "initializeV4(address,address,address[],address[],uint64[])", _migrator, _pauseEnforcer, _ronTokens, _ronRecipients, _ronRemoteChainSelectors + ) + ); + + require(success, "GatewayV3_AssetMigration: failed to initialize V4"); + + (success,) = address(_mainchainGatewayV3).call( + abi.encodeWithSignature( + "initializeV5(address,address,address[],address[],uint64[])", _migrator, _pauseEnforcer, _ethTokens, _ethRecipients, _ethRemoteChainSelectors + ) + ); + + require(success, "GatewayV3_AssetMigration: failed to initialize V5"); + } + + function testConcrete_RevertIf_Whitelisted_IsEOA() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_roninWeth); + whitelists[0] = makeAddr("alice"); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1000 ether; + + deal(address(_roninWeth), address(_roninGatewayV3), 1000 ether); + + vm.expectRevert(); + vm.prank(_migrator); + _roninGatewayV3.migrateERC20(tokens, amounts); + } + + function testConcrete_RevertIf_Whitelist_NullRemoteChainSelectors_But_WhitelistedSpender_IsMultiLane() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_roninWeth); + whitelists[0] = address(new MockCCIPPoolMultiLane(address(_roninWeth))); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1000 ether; + + deal(address(_roninWeth), address(_roninGatewayV3), 1000 ether); + + vm.expectRevert(); + vm.prank(_migrator); + _roninGatewayV3.migrateERC20(tokens, amounts); + } + + function testConcrete_RevertIf_Whitelist_RemoteChainSelectors_But_WhitelistedSpender_IsSingleLane() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_roninWeth); + whitelists[0] = address(new MockCCIPPoolSingleLane(address(_roninWeth))); + remoteChainSelectors[0] = uint64(uint256(keccak256("remote-chain-selector"))); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1000 ether; + + deal(address(_roninWeth), address(_roninGatewayV3), 1000 ether); + + vm.expectRevert(); + vm.prank(_migrator); + _roninGatewayV3.migrateERC20(tokens, amounts); + } + + function testConcrete_AutoWrap_If_Migrate_Native_MultiLane() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_mainchainWeth); + whitelists[0] = address(new MockCCIPPoolMultiLane(address(_mainchainWeth))); + remoteChainSelectors[0] = uint64(uint256(keccak256("remote-chain-selector"))); + + address admin = LibProxy.getProxyAdmin(address(_mainchainGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_mainchainGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + vm.deal(address(_mainchainGatewayV3), 1000 ether); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1000 ether; + tokens[0] = address(0x0); + + vm.prank(_migrator); + _mainchainGatewayV3.migrateERC20(new address[](1), amounts); + } + + function testConcrete_CanMigrate_IfWhitelisted_SingleLane() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_roninWeth); + whitelists[0] = address(new MockCCIPPoolSingleLane(address(_roninWeth))); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + deal(address(_roninWeth), address(_roninGatewayV3), 1000 ether); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1000 ether; + + vm.prank(_migrator); + _roninGatewayV3.migrateERC20(tokens, amounts); + } + + function testConcrete_RevertIf_MigrateNative_RoninGatewayV3() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_roninWron); + whitelists[0] = makeAddr("whitelist"); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + uint256[] memory amounts = new uint256[](1); + tokens[0] = address(0x0); + amounts[0] = 1000 ether; + + vm.prank(_migrator); + vm.expectRevert("Not implemented"); + _roninGatewayV3.migrateERC20(tokens, amounts); + } + + function testConcrete_validConfig() external { + assertEq(_roninGatewayV3.emergencyPauser(), _pauseEnforcer, "GatewayV3_AssetMigration: invalid emergency pauser"); + assertEq(_roninGatewayV3.getRoleMemberCount(_MIGRATOR_ROLE), 1, "GatewayV3_AssetMigration: invalid migrator count"); + assertEq(_roninGatewayV3.hasRole(_MIGRATOR_ROLE, _migrator), true, "GatewayV3_AssetMigration: invalid migrator role"); + } + + function testConcrete_RevertIf_WhitelistNativeToken() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(0x0); + whitelists[0] = makeAddr("whitelist"); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + vm.expectRevert(IRoninGatewayV3.ErrWhitelistWrappedTokenInstead.selector); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + } + + function testConcrete_RevertIf_DeWhitelist_MultiLane() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = address(_roninWeth); + whitelists[0] = address(new MockCCIPPoolMultiLane(address(_roninWeth))); + remoteChainSelectors[0] = uint64(uint256(keccak256("remote-chain-selector"))); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + deal(address(_roninWeth), address(_roninGatewayV3), 1000 ether); + + uint256[] memory amounts = new uint256[](1); + amounts[0] = 100 ether; + + vm.prank(_migrator); + _roninGatewayV3.migrateERC20(tokens, amounts); + + // De-whitelist + whitelists[0] = address(0x0); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + vm.prank(_migrator); + vm.expectRevert(abi.encodeWithSelector(IRoninGatewayV3.ErrNotWhitelistedToken.selector, tokens[0])); + _roninGatewayV3.migrateERC20(tokens, amounts); + } + + function testConcrete_Admin_Can_Whitelist() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = makeAddr("token"); + whitelists[0] = makeAddr("whitelist"); + + address admin = LibProxy.getProxyAdmin(address(_roninGatewayV3)); + vm.prank(admin); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + assertEq(_roninGatewayV3.getWhitelistedAddresses(tokens)[0], whitelists[0], "GatewayV3_AssetMigration: invalid whitelist address"); + } + + function testConcrete_RevertIf_NotAdmin_Whitelist() external { + address[] memory tokens = new address[](1); + address[] memory whitelists = new address[](1); + uint64[] memory remoteChainSelectors = new uint64[](1); + + tokens[0] = makeAddr("token"); + whitelists[0] = makeAddr("whitelist"); + + address admin = _migrator; + vm.prank(admin); + vm.expectRevert(); + TransparentUpgradeableProxyV2(payable(address(_roninGatewayV3))).functionDelegateCall( + abi.encodeCall(IRoninGatewayV3.whitelist, (tokens, whitelists, remoteChainSelectors)) + ); + + vm.prank(admin); + vm.expectRevert(); + _roninGatewayV3.whitelist(tokens, whitelists, remoteChainSelectors); + } +} diff --git a/test/bridge/integration/mainchain-gateway/requestDepositFor.Batch.MainchainGatewayV3.t.sol b/test/bridge/integration/mainchain-gateway/requestDepositFor.Batch.MainchainGatewayV3.t.sol index 290f0d7b..7cc0eb06 100644 --- a/test/bridge/integration/mainchain-gateway/requestDepositFor.Batch.MainchainGatewayV3.t.sol +++ b/test/bridge/integration/mainchain-gateway/requestDepositFor.Batch.MainchainGatewayV3.t.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.19; import { console } from "forge-std/console.sol"; import { Transfer as LibTransfer } from "@ronin/contracts/libraries/Transfer.sol"; -import "@ronin/contracts/libraries/LibRequestBatch.sol"; -import "@ronin/contracts/libraries/LibTokenInfoBatch.sol"; +import { RequestBatch, LibRequestBatch } from "@ronin/contracts/libraries/LibRequestBatch.sol"; +import { LibTokenInfoBatch } from "@ronin/contracts/libraries/LibTokenInfoBatch.sol"; import "../BaseIntegration.t.sol"; diff --git a/test/bridge/integration/mainchain-gateway/submitWithdrawal.MainchainGatewayV3.t.sol b/test/bridge/integration/mainchain-gateway/submitWithdrawal.MainchainGatewayV3.t.sol index caa3ef71..3720489f 100644 --- a/test/bridge/integration/mainchain-gateway/submitWithdrawal.MainchainGatewayV3.t.sol +++ b/test/bridge/integration/mainchain-gateway/submitWithdrawal.MainchainGatewayV3.t.sol @@ -5,7 +5,7 @@ import { console } from "forge-std/console.sol"; import { Transfer as LibTransfer } from "@ronin/contracts/libraries/Transfer.sol"; import { LibTokenInfo, TokenInfo, TokenStandard } from "@ronin/contracts/libraries/LibTokenInfo.sol"; import { SignatureConsumer } from "@ronin/contracts/interfaces/consumers/SignatureConsumer.sol"; -import { IMainchainGatewayV3 } from "@ronin/contracts/interfaces/IMainchainGatewayV3.sol"; +import { IMainchainGatewayV3 } from "script/interfaces/IMainchainGatewayV3.sol"; import "../BaseIntegration.t.sol"; interface IERC721 { diff --git a/test/bridge/integration/pause-enforcer/accessControl.PauseEnforcer.t.sol b/test/bridge/integration/pause-enforcer/accessControl.PauseEnforcer.t.sol index d4d6dbd9..162e9ce3 100644 --- a/test/bridge/integration/pause-enforcer/accessControl.PauseEnforcer.t.sol +++ b/test/bridge/integration/pause-enforcer/accessControl.PauseEnforcer.t.sol @@ -12,7 +12,7 @@ contract AccessControl_PauseEnforcer_Test is BaseIntegration_Test { function test_changeAdmin_OfPauseEnforcer() public { address newEnforcerAdmin = makeAddr("new-enforcer-admin"); - vm.prank(_param.roninPauseEnforcer.admin); + vm.prank(_param.roninPauseEnforcer.admin[0]); _roninPauseEnforcer.grantRole(0x0, newEnforcerAdmin); assertEq(_roninPauseEnforcer.hasRole(0x0, newEnforcerAdmin), true); @@ -22,11 +22,11 @@ contract AccessControl_PauseEnforcer_Test is BaseIntegration_Test { function test_renounceAdminRole_PreviousAdmin() public { test_changeAdmin_OfPauseEnforcer(); - assertEq(_roninPauseEnforcer.hasRole(0x0, _param.roninPauseEnforcer.admin), true); + assertEq(_roninPauseEnforcer.hasRole(0x0, _param.roninPauseEnforcer.admin[0]), true); - vm.prank(_param.roninPauseEnforcer.admin); - _roninPauseEnforcer.renounceRole(0x0, _param.roninPauseEnforcer.admin); + vm.prank(_param.roninPauseEnforcer.admin[0]); + _roninPauseEnforcer.renounceRole(0x0, _param.roninPauseEnforcer.admin[0]); - assertEq(_roninPauseEnforcer.hasRole(0x0, _param.roninPauseEnforcer.admin), false); + assertEq(_roninPauseEnforcer.hasRole(0x0, _param.roninPauseEnforcer.admin[0]), false); } } diff --git a/test/bridge/integration/pause-enforcer/emergencyAction.PauseEnforcer.t.sol b/test/bridge/integration/pause-enforcer/emergencyAction.PauseEnforcer.t.sol index f84b332a..74a7521f 100644 --- a/test/bridge/integration/pause-enforcer/emergencyAction.PauseEnforcer.t.sol +++ b/test/bridge/integration/pause-enforcer/emergencyAction.PauseEnforcer.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.19; import { Transfer } from "@ronin/contracts/libraries/Transfer.sol"; import { GatewayV3 } from "@ronin/contracts/extensions/GatewayV3.sol"; import { LibTokenOwner, TokenOwner } from "@ronin/contracts/libraries/LibTokenOwner.sol"; +import { FunctionRestrictable } from "@ronin/contracts/extensions/FunctionRestrictable.sol"; import "../BaseIntegration.t.sol"; contract EmergencyAction_PauseEnforcer_Test is BaseIntegration_Test { @@ -56,6 +57,163 @@ contract EmergencyAction_PauseEnforcer_Test is BaseIntegration_Test { assertEq(IPauseTarget(address(_roninGatewayV3)).paused(), false); } + function test_RevertWhen_Restrict_ERC20() public { + vm.prank(_param.roninPauseEnforcer.sentries[0]); + uint8 enumBitmap = uint8(1 << uint8(TokenStandard.ERC20)); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + Transfer.Request memory request = Transfer.Request({ + recipientAddr: makeAddr("recipient"), + tokenAddr: address(_roninWeth), + info: TokenInfo({ erc: TokenStandard.ERC20, id: 0, quantity: 100 }) + }); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC20)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + } + + function test_RevertWhen_Restrict_MultipleStandard() public { + vm.prank(_param.roninPauseEnforcer.sentries[0]); + uint8 enumBitmap = uint8(1 << uint8(TokenStandard.ERC20)) | uint8(1 << uint8(TokenStandard.ERC721)); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + Transfer.Request memory request = Transfer.Request({ + recipientAddr: makeAddr("recipient"), + tokenAddr: address(_roninWeth), + info: TokenInfo({ erc: TokenStandard.ERC20, id: 0, quantity: 100 }) + }); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC20)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC721; + request.info.quantity = 0; + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC721)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + } + + function test_SuccessWhen_Restrict_MultipleStandards_Then_Unrestrict_SomeStandards() public { + vm.prank(_param.roninPauseEnforcer.sentries[0]); + uint8 enumBitmap = uint8(1 << uint8(TokenStandard.ERC20)) | uint8(1 << uint8(TokenStandard.ERC721)); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + Transfer.Request memory request = Transfer.Request({ + recipientAddr: makeAddr("recipient"), + tokenAddr: address(_roninWeth), + info: TokenInfo({ erc: TokenStandard.ERC20, id: 0, quantity: 100 }) + }); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC20)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC721; + request.info.quantity = 0; + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC721)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + vm.prank(_param.roninPauseEnforcer.sentries[0]); + enumBitmap = uint8(1 << uint8(TokenStandard.ERC721)); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC721)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC20; + request.info.quantity = 100; + + deal(address(_roninWeth), address(this), 100); + _roninWeth.approve(address(_roninGatewayV3), 100); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + } + + function test_SuccessWhen_Restrict_Then_Unrestrict() public { + vm.prank(_param.roninPauseEnforcer.sentries[0]); + uint8 enumBitmap = uint8(1 << uint8(TokenStandard.ERC20)); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + Transfer.Request memory request = Transfer.Request({ + recipientAddr: makeAddr("recipient"), + tokenAddr: address(_roninWeth), + info: TokenInfo({ erc: TokenStandard.ERC20, id: 0, quantity: 100 }) + }); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC20)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + deal(address(_roninWeth), address(this), 100); + _roninWeth.approve(address(_roninGatewayV3), 100); + + vm.prank(_param.roninPauseEnforcer.sentries[0]); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, 0); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + } + + function test_RevertWhen_Restrict_AllStandard() public { + vm.prank(_param.roninPauseEnforcer.sentries[0]); + uint8 enumBitmap = uint8(1 << uint8(TokenStandard.ERC20)) | uint8(1 << uint8(TokenStandard.ERC721)) | uint8(1 << uint8(TokenStandard.ERC1155)); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + Transfer.Request memory request = Transfer.Request({ + recipientAddr: makeAddr("recipient"), + tokenAddr: address(_roninWeth), + info: TokenInfo({ erc: TokenStandard.ERC20, id: 0, quantity: 100 }) + }); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC20)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC721; + request.info.quantity = 0; + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC721)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC1155; + request.info.quantity = 100; + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC1155)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + enumBitmap = type(uint8).max; + vm.prank(_param.roninPauseEnforcer.sentries[0]); + _roninPauseEnforcer.triggerRestrict(IRoninGatewayV3.requestWithdrawalFor.selector, enumBitmap); + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC20)); + + request.info.erc = TokenStandard.ERC20; + request.info.quantity = 100; + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC721; + request.info.quantity = 0; + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC721)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + + request.info.erc = TokenStandard.ERC1155; + request.info.quantity = 100; + + vm.expectRevert(abi.encodeWithSelector(FunctionRestrictable.ErrRestricted.selector, IRoninGatewayV3.requestWithdrawalFor.selector, TokenStandard.ERC1155)); + + _roninGatewayV3.requestWithdrawalFor(request, block.chainid); + } + // Emergency pause & emergency unpause > Should the gateway can be interacted after unpause function test_InteractWithGateway_AfterUnpause() public { test_EmergencyUnpause_RoninGatewayV3(); diff --git a/test/mocks/MockCCIPPoolMultiLane.sol b/test/mocks/MockCCIPPoolMultiLane.sol new file mode 100644 index 00000000..72d80a9a --- /dev/null +++ b/test/mocks/MockCCIPPoolMultiLane.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.17 <0.9.0; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract MockCCIPPoolMultiLane { + using SafeERC20 for IERC20; + + event LiquidityAdded(address indexed provider, uint256 indexed amount); + + IERC20 public immutable i_token; + + mapping(uint64 => uint256) public s_lockedTokensByChainSelector; + + constructor( + address token + ) { + i_token = IERC20(token); + } + + function provideLiquidity(uint64 remoteChainSelector, uint256 amount) external { + s_lockedTokensByChainSelector[remoteChainSelector] += amount; + + i_token.safeTransferFrom(msg.sender, address(this), amount); + + emit LiquidityAdded(msg.sender, amount); + } +} diff --git a/test/mocks/MockCCIPPoolSingleLane.sol b/test/mocks/MockCCIPPoolSingleLane.sol new file mode 100644 index 00000000..4182ea4b --- /dev/null +++ b/test/mocks/MockCCIPPoolSingleLane.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.17 <0.9.0; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract MockCCIPPoolSingleLane { + using SafeERC20 for IERC20; + + event LiquidityAdded(address indexed provider, uint256 indexed amount); + + IERC20 public immutable i_token; + + constructor( + address token + ) { + i_token = IERC20(token); + } + + function provideLiquidity( + uint256 amount + ) external { + i_token.safeTransferFrom(msg.sender, address(this), amount); + emit LiquidityAdded(msg.sender, amount); + } +}