Skip to content

Commit

Permalink
Merge pull request #29 from axieinfinity/implement-feature/migrate-ha…
Browse files Browse the repository at this point in the history
…rdhat-test/write-integration-test

feat(migrate-hardhat-test): implement `write-integration-test`
  • Loading branch information
nxqbao committed Mar 5, 2024
2 parents 4a3400d + e0c08dd commit b037428
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 0 deletions.
16 changes: 16 additions & 0 deletions test/bridge/integration/BaseIntegration.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// 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 {
vm.skip(true);
console.log("=============== Test Update Operator ===========");

_depositFor();
_moveToEndPeriodAndWrapUpEpoch();

console.log("=============== First 50 Receipts ===========");
_bulkDepositFor(first50Receipts);

console.log("=============== Update bridge operator ===========");
_updateBridgeOperator();

console.log("=============== Second 50 Receipts ===========");
_bulkDepositFor(second50Receipts);
_wrapUpEpoch();

_moveToEndPeriodAndWrapUpEpoch();

console.log("=============== Check slash and reward behavior ===========");
_depositFor();
logBridgeTracking();

logBridgeSlash();
}

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:", _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]);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,29 @@ 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.skip(true);
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);
}
}

0 comments on commit b037428

Please sign in to comment.