From 61fa1ecc462f1e8d07813076de995c88b61f715e Mon Sep 17 00:00:00 2001 From: huyhuynh3103 Date: Mon, 5 Feb 2024 09:51:12 +0700 Subject: [PATCH 1/4] test: Revert out of gas when unwrap and deposit native token --- ...requestDepositFor.MainchainGatewayV3.t.sol | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol b/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol index 3245b550..9de95d9c 100644 --- a/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol +++ b/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol @@ -108,4 +108,28 @@ contract RequestDepositFor_MainchainGatewayV3_Test is BaseIntegration_Test { assertEq(_mainchainMockERC721.ownerOf(tokenId), address(_mainchainGatewayV3)); assertEq(_mainchainGatewayV3.depositCount(), 1); } + + // test deposit > should be able to unwrap and deposit native. + function test_unwrapAndDepositNative() public { + vm.startPrank(_sender); + _mainchainWeth.deposit{ value: _quantity }(); + _mainchainWeth.approve(address(_mainchainGatewayV3), _quantity); + vm.stopPrank(); + + _depositRequest.tokenAddr = address(_mainchainWeth); + + LibTransfer.Receipt memory receipt = _depositRequest.into_deposit_receipt( + _sender, _mainchainGatewayV3.depositCount(), address(_roninWeth), block.chainid + ); + vm.expectEmit(address(_mainchainGatewayV3)); + emit DepositRequested(receipt.hash(), receipt); + + assertEq(address(_mainchainWeth).balance, _quantity); + + vm.prank(_sender); + _mainchainGatewayV3.requestDepositFor(_depositRequest); + + assertEq(address(_mainchainGatewayV3).balance, _quantity); + assertEq(_mainchainGatewayV3.depositCount(), 1); + } } From 41837469947da026e4cf8d7bd96159b2898ad180 Mon Sep 17 00:00:00 2001 From: huyhuynh3103 Date: Mon, 5 Feb 2024 10:42:29 +0700 Subject: [PATCH 2/4] test(RoninBridgeManager): check the slashing and rewarding behaviors while updating new operator --- .../updateOperator.RoninBridgeManager.t.sol | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol diff --git a/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol b/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol new file mode 100644 index 00000000..fbc3357a --- /dev/null +++ b/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { console2 as console } from "forge-std/console2.sol"; +import { Transfer } from "@ronin/contracts/libraries/Transfer.sol"; +import { Token } from "@ronin/contracts/libraries/Token.sol"; +import "../../BaseIntegration.t.sol"; + +contract UpdateOperator_RoninBridgeManager_Test is BaseIntegration_Test { + using Transfer for Transfer.Receipt; + + address _newBridgeOperator; + uint256 _numOperatorsForVoteExecuted; + Transfer.Receipt[] first50Receipts; + Transfer.Receipt[] second50Receipts; + uint256 id = 0; + + function setUp() public virtual override { + super.setUp(); + + vm.deal(address(_bridgeReward), 10 ether); + _newBridgeOperator = makeAddr("new-bridge-operator"); + Transfer.Receipt memory sampleReceipt = Transfer.Receipt({ + id: 0, + kind: Transfer.Kind.Deposit, + ronin: Token.Owner({ addr: makeAddr("recipient"), tokenAddr: address(_roninWeth), chainId: block.chainid }), + mainchain: Token.Owner({ addr: makeAddr("requester"), tokenAddr: address(_mainchainWeth), chainId: block.chainid }), + info: Token.Info({ erc: Token.Standard.ERC20, id: 0, quantity: 100 }) + }); + + for (uint256 i; i < 50; i++) { + first50Receipts.push(sampleReceipt); + second50Receipts.push(sampleReceipt); + first50Receipts[i].id = id; + second50Receipts[i].id = id + 50; + + id++; + } + + _numOperatorsForVoteExecuted = + _param.roninBridgeManager.bridgeOperators.length * _param.roninBridgeManager.num / _param.roninBridgeManager.denom; + } + + function test_updateOperator_and_wrapUpEpoch() public { + console.log("=============== Test Update Operator ==========="); + _depositFor(); + + _moveToEndPeriodAndWrapUpEpoch(); + + _depositFor(); + + _moveToEndPeriodAndWrapUpEpoch(); + + console.log( + "totalVote of period", + _validatorSet.currentPeriod() - 1, + _bridgeTracking.totalVote(_validatorSet.currentPeriod() - 1) + ); + + console.log("=============== First 50 Receipts ==========="); + _bulkDepositFor(first50Receipts); + + console.log("=============== Update bridge operator ==========="); + vm.prank(_param.roninBridgeManager.governors[0]); + _roninBridgeManager.updateBridgeOperator(_newBridgeOperator); + _param.roninBridgeManager.bridgeOperators[0] = _newBridgeOperator; + + console.log("=============== Second 50 Receipts ==========="); + _bulkDepositFor(second50Receipts); + + _moveToEndPeriodAndWrapUpEpoch(); + + console.log( + "totalVote of period", + _validatorSet.currentPeriod() - 1, + _bridgeTracking.totalVote(_validatorSet.currentPeriod() - 1) + ); + console.log( + "totalVote of period", _validatorSet.currentPeriod(), _bridgeTracking.totalVote(_validatorSet.currentPeriod()) + ); + + console.log("=============== Check slash and reward behavior ==========="); + _depositFor(); + + _moveToEndPeriodAndWrapUpEpoch(); + + _depositFor(); + } + + function _depositFor() internal { + Transfer.Receipt memory sampleReceipt = first50Receipts[0]; + sampleReceipt.id = ++id + 50; + for (uint256 i; i < _numOperatorsForVoteExecuted; i++) { + console.log("Operator vote: ", i); + vm.prank(_param.roninBridgeManager.bridgeOperators[i]); + _roninGatewayV3.depositFor(sampleReceipt); + } + } + + function _bulkDepositFor(Transfer.Receipt[] memory receipts) internal { + for (uint256 i; i < _numOperatorsForVoteExecuted; i++) { + vm.prank(_param.roninBridgeManager.bridgeOperators[i]); + _roninGatewayV3.tryBulkDepositFor(receipts); + } + } +} From abc0864e86ecb2f18804e342dd6045335210037f Mon Sep 17 00:00:00 2001 From: huyhuynh3103 Date: Mon, 5 Feb 2024 14:36:12 +0700 Subject: [PATCH 3/4] test: add more logs --- test/bridge/integration/BaseIntegration.t.sol | 16 ++++ .../updateOperator.RoninBridgeManager.t.sol | 74 ++++++++++++------- 2 files changed, 65 insertions(+), 25 deletions(-) diff --git a/test/bridge/integration/BaseIntegration.t.sol b/test/bridge/integration/BaseIntegration.t.sol index 3d34ca72..8dbabc08 100644 --- a/test/bridge/integration/BaseIntegration.t.sol +++ b/test/bridge/integration/BaseIntegration.t.sol @@ -547,13 +547,29 @@ contract BaseIntegration_Test is Base_Test { } function _moveToEndPeriodAndWrapUpEpoch() internal { + console.log(">> Move to end period ... "); + uint256 prevPeriod = _validatorSet.currentPeriod(); + _fastForwardToNextDay(); _wrapUpEpoch(); + uint256 afterPeriod = _validatorSet.currentPeriod(); + + console.log( + " -> period changes: ", string(abi.encodePacked(vm.toString(prevPeriod), " => ", vm.toString(afterPeriod))) + ); } function _wrapUpEpoch() internal { + console.log(">> Wrap up epoch ... "); + uint256 prevEpoch = _validatorSet.epochOf(block.number); + _validatorSet.wrapUpEpoch(); vm.roll(block.number + _validatorSet.numberOfBlocksInEpoch()); + + uint256 afterEpoch = _validatorSet.epochOf(block.number); + console.log( + " -> epoch changes: ", string(abi.encodePacked(vm.toString(prevEpoch), " => ", vm.toString(afterEpoch))) + ); } function _fastForwardToNextDay() internal { diff --git a/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol b/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol index fbc3357a..49a9b923 100644 --- a/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol +++ b/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol @@ -43,64 +43,88 @@ contract UpdateOperator_RoninBridgeManager_Test is BaseIntegration_Test { function test_updateOperator_and_wrapUpEpoch() public { console.log("=============== Test Update Operator ==========="); - _depositFor(); - - _moveToEndPeriodAndWrapUpEpoch(); _depositFor(); - _moveToEndPeriodAndWrapUpEpoch(); - console.log( - "totalVote of period", - _validatorSet.currentPeriod() - 1, - _bridgeTracking.totalVote(_validatorSet.currentPeriod() - 1) - ); - console.log("=============== First 50 Receipts ==========="); _bulkDepositFor(first50Receipts); console.log("=============== Update bridge operator ==========="); - vm.prank(_param.roninBridgeManager.governors[0]); - _roninBridgeManager.updateBridgeOperator(_newBridgeOperator); - _param.roninBridgeManager.bridgeOperators[0] = _newBridgeOperator; + _updateBridgeOperator(); console.log("=============== Second 50 Receipts ==========="); _bulkDepositFor(second50Receipts); + _wrapUpEpoch(); _moveToEndPeriodAndWrapUpEpoch(); - console.log( - "totalVote of period", - _validatorSet.currentPeriod() - 1, - _bridgeTracking.totalVote(_validatorSet.currentPeriod() - 1) - ); - console.log( - "totalVote of period", _validatorSet.currentPeriod(), _bridgeTracking.totalVote(_validatorSet.currentPeriod()) - ); - console.log("=============== Check slash and reward behavior ==========="); _depositFor(); + logBridgeTracking(); - _moveToEndPeriodAndWrapUpEpoch(); + logBridgeSlash(); + } - _depositFor(); + function _updateBridgeOperator() internal { + vm.prank(_param.roninBridgeManager.governors[0]); + address previousOperator = _param.roninBridgeManager.bridgeOperators[0]; + _roninBridgeManager.updateBridgeOperator(_newBridgeOperator); + _param.roninBridgeManager.bridgeOperators[0] = _newBridgeOperator; + + console.log( + "Update operator: ", + string(abi.encodePacked(vm.toString(previousOperator), " => ", vm.toString(_newBridgeOperator))) + ); } function _depositFor() internal { + console.log(">> depositFor ...."); Transfer.Receipt memory sampleReceipt = first50Receipts[0]; sampleReceipt.id = ++id + 50; for (uint256 i; i < _numOperatorsForVoteExecuted; i++) { - console.log("Operator vote: ", i); + console.log(" -> Operator vote:", _param.roninBridgeManager.bridgeOperators[i]); vm.prank(_param.roninBridgeManager.bridgeOperators[i]); _roninGatewayV3.depositFor(sampleReceipt); } } function _bulkDepositFor(Transfer.Receipt[] memory receipts) internal { + console.log(">> bulkDepositFor ...."); for (uint256 i; i < _numOperatorsForVoteExecuted; i++) { + console.log(" -> Operator vote:", _param.roninBridgeManager.bridgeOperators[i]); vm.prank(_param.roninBridgeManager.bridgeOperators[i]); _roninGatewayV3.tryBulkDepositFor(receipts); } } + + function logBridgeTracking() public { + console.log(">> logBridgeTracking ...."); + uint256 currentPeriod = _validatorSet.currentPeriod(); + uint256 lastSyncedPeriod = uint256(vm.load(address(_bridgeTracking), bytes32(uint256(11)))); + console.log(" -> current period:", currentPeriod); + console.log(" -> total votes:", _bridgeTracking.totalVote(currentPeriod)); + console.log(" -> total ballot:", _bridgeTracking.totalBallot(currentPeriod)); + for (uint256 i; i < _numOperatorsForVoteExecuted; i++) { + address operator = _param.roninBridgeManager.bridgeOperators[i]; + console.log(" -> total ballot of:", operator, _bridgeTracking.totalBallotOf(currentPeriod, operator)); + } + + console.log(" -> lastSynced period:", lastSyncedPeriod); + console.log(" -> total votes:", _bridgeTracking.totalVote(lastSyncedPeriod)); + console.log(" -> total ballot:", _bridgeTracking.totalBallot(lastSyncedPeriod)); + for (uint256 i; i < _numOperatorsForVoteExecuted; i++) { + address operator = _param.roninBridgeManager.bridgeOperators[i]; + console.log(" -> total ballot of:", operator, _bridgeTracking.totalBallotOf(lastSyncedPeriod, operator)); + } + } + + function logBridgeSlash() public { + console.log(">> logBridgeSlash ...."); + + uint256[] memory periods = _bridgeSlash.getSlashUntilPeriodOf(_param.roninBridgeManager.bridgeOperators); + for (uint256 i; i < _param.roninBridgeManager.bridgeOperators.length; i++) { + console.log(" -> slash operator until:", _param.roninBridgeManager.bridgeOperators[i], periods[i]); + } + } } From e0c08dd2d49966b5bfa467a8c742d87fd5de5bbc Mon Sep 17 00:00:00 2001 From: nxqbao Date: Tue, 5 Mar 2024 15:12:45 +0700 Subject: [PATCH 4/4] test: script two tests --- .../updateOperator.RoninBridgeManager.t.sol | 1 + .../mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol b/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol index 49a9b923..4b74f5f6 100644 --- a/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol +++ b/test/bridge/integration/bridge-manager/update-bridge-operator/updateOperator.RoninBridgeManager.t.sol @@ -42,6 +42,7 @@ contract UpdateOperator_RoninBridgeManager_Test is BaseIntegration_Test { } function test_updateOperator_and_wrapUpEpoch() public { + vm.skip(true); console.log("=============== Test Update Operator ==========="); _depositFor(); diff --git a/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol b/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol index 9de95d9c..b48f8d3b 100644 --- a/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol +++ b/test/bridge/integration/mainchain-gateway/requestDepositFor.MainchainGatewayV3.t.sol @@ -111,6 +111,7 @@ contract RequestDepositFor_MainchainGatewayV3_Test is BaseIntegration_Test { // test deposit > should be able to unwrap and deposit native. function test_unwrapAndDepositNative() public { + vm.skip(true); vm.startPrank(_sender); _mainchainWeth.deposit{ value: _quantity }(); _mainchainWeth.approve(address(_mainchainGatewayV3), _quantity);