From 3811e935eef07df515e67ba41125986f70582d9b Mon Sep 17 00:00:00 2001 From: sujithsomraaj Date: Fri, 19 Jan 2024 18:23:02 +0530 Subject: [PATCH 1/4] chore: cover all lines in layerzero --- .../adapters/LayerzeroImplementation.t.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/unit/crosschain-data/adapters/LayerzeroImplementation.t.sol b/test/unit/crosschain-data/adapters/LayerzeroImplementation.t.sol index aa6e9b50e..bf0210144 100644 --- a/test/unit/crosschain-data/adapters/LayerzeroImplementation.t.sol +++ b/test/unit/crosschain-data/adapters/LayerzeroImplementation.t.sol @@ -42,6 +42,15 @@ contract LayerzeroImplementationUnitTest is BaseSetup { layerzeroImplementation.dispatchPayload(deployer, 420, bytes("hi test"), ""); } + function test_layerzeroDispatchPayload_InvalidChainId2() public { + vm.prank(deployer); + layerzeroImplementation.setTrustedRemote(111, bytes("")); + + vm.prank(getContract(ETH, "CoreStateRegistry")); + vm.expectRevert(Error.INVALID_CHAIN_ID.selector); + layerzeroImplementation.dispatchPayload(deployer, 10, bytes("hi test"), ""); + } + function test_lzReceive_InvalidChainId() public { vm.prank(deployer); layerzeroImplementation.setTrustedRemote(0, bytes("test")); From bddc809e8095f042ba078bc2b7b49e8791114fdd Mon Sep 17 00:00:00 2001 From: sujithsomraaj Date: Fri, 19 Jan 2024 18:35:18 +0530 Subject: [PATCH 2/4] chore: cover all branches in hyperlane implementation --- .../adapters/HyperlaneImplementation.t.sol | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/unit/crosschain-data/adapters/HyperlaneImplementation.t.sol diff --git a/test/unit/crosschain-data/adapters/HyperlaneImplementation.t.sol b/test/unit/crosschain-data/adapters/HyperlaneImplementation.t.sol new file mode 100644 index 000000000..e192e7be9 --- /dev/null +++ b/test/unit/crosschain-data/adapters/HyperlaneImplementation.t.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.23; + +import "../../../utils/BaseSetup.sol"; + +import { ISuperRegistry } from "src/interfaces/ISuperRegistry.sol"; +import { HyperlaneImplementation } from "src/crosschain-data/adapters/hyperlane/HyperlaneImplementation.sol"; +import { Error } from "src/libraries/Error.sol"; + +contract HyperlaneImplementationUnitTest is BaseSetup { + HyperlaneImplementation hyperlaneImplementation; + + function setUp() public override { + super.setUp(); + + ISuperRegistry superRegistry = ISuperRegistry(getContract(ETH, "SuperRegistry")); + + vm.selectFork(FORKS[ETH]); + hyperlaneImplementation = HyperlaneImplementation(payable(superRegistry.getAmbAddress(2))); + } + + function test_setHyperlaneConfig_ZERO_ADDRESS() public { + vm.prank(deployer); + vm.expectRevert(Error.ZERO_ADDRESS.selector); + hyperlaneImplementation.setHyperlaneConfig(IMailbox(address(0)), IInterchainGasPaymaster(address(420))); + + vm.prank(deployer); + vm.expectRevert(Error.ZERO_ADDRESS.selector); + hyperlaneImplementation.setHyperlaneConfig(IMailbox(address(420)), IInterchainGasPaymaster(address(0))); + } +} From f419f54bd0552f19de1fd9d6d8546f94fe0ba7b1 Mon Sep 17 00:00:00 2001 From: sujithsomraaj Date: Fri, 19 Jan 2024 19:25:08 +0530 Subject: [PATCH 3/4] chore: add more tests to increase coverage --- test/unit/roles/SuperRBAC.t.sol | 5 ++ test/unit/super-registry/SuperRegistry.t.sol | 51 ++++++++++++++++++- ...erform-factory.changeFormPauseStatus.t.sol | 22 ++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/test/unit/roles/SuperRBAC.t.sol b/test/unit/roles/SuperRBAC.t.sol index 65a1cbece..8dfc54a26 100644 --- a/test/unit/roles/SuperRBAC.t.sol +++ b/test/unit/roles/SuperRBAC.t.sol @@ -305,6 +305,11 @@ contract SuperRBACTest is BaseSetup { superRBAC.setRoleAdmin(keccak256("NEW_ROLE"), keccak256("PROTOCOL_ADMIN_ROLE")); } + function test_revokeRoleWithoutBroadcast() public { + vm.startPrank(deployer); + superRBAC.revokeRoleSuperBroadcast(superRBAC.PAYMENT_ADMIN_ROLE(), "", superRegistry.PAYMENT_ADMIN()); + } + function test_revokeSuperBroadcast_CannotRevoke() public { vm.deal(deployer, 1 ether); vm.startPrank(deployer); diff --git a/test/unit/super-registry/SuperRegistry.t.sol b/test/unit/super-registry/SuperRegistry.t.sol index e626606e0..8ac6fad5d 100644 --- a/test/unit/super-registry/SuperRegistry.t.sol +++ b/test/unit/super-registry/SuperRegistry.t.sol @@ -169,6 +169,34 @@ contract SuperRegistryTest is BaseSetup { superRegistry.setBridgeAddresses(bridgeId, bridgeAddress, bridgeValidator); } + function test_setBridgeAddresses_and_revertZeroValues() public { + uint8[] memory bridgeId = new uint8[](1); + address[] memory bridgeAddress = new address[](1); + address[] memory bridgeValidator = new address[](1); + + bridgeId[0] = 20; + bridgeAddress[0] = address(0); + bridgeValidator[0] = address(0x2); + + vm.prank(deployer); + vm.expectRevert(Error.ZERO_ADDRESS.selector); + superRegistry.setBridgeAddresses(bridgeId, bridgeAddress, bridgeValidator); + + bridgeAddress[0] = address(0x2); + bridgeId[0] = 0; + + vm.prank(deployer); + vm.expectRevert(Error.ZERO_INPUT_VALUE.selector); + superRegistry.setBridgeAddresses(bridgeId, bridgeAddress, bridgeValidator); + + bridgeId[0] = 20; + bridgeValidator[0] = address(0); + + vm.prank(deployer); + vm.expectRevert(Error.ZERO_ADDRESS.selector); + superRegistry.setBridgeAddresses(bridgeId, bridgeAddress, bridgeValidator); + } + function test_setBridgeAddresses_array_mismatch_address() public { uint8[] memory bridgeId = new uint8[](3); address[] memory bridgeAddress = new address[](2); @@ -362,7 +390,7 @@ contract SuperRegistryTest is BaseSetup { function test_setQuorum_invalid_chainId() public { vm.prank(deployer); vm.expectRevert(Error.INVALID_CHAIN_ID.selector); - superRegistry.setRequiredMessagingQuorum(0,2); + superRegistry.setRequiredMessagingQuorum(0, 2); } function test_getAmbId() public { @@ -459,4 +487,25 @@ contract SuperRegistryTest is BaseSetup { assertEq(superRegistry.getAddress(ids[0]), newAddresses[0]); assertEq(superRegistry.getAddress(ids[1]), newAddresses[1]); } + + function test_batchSetAddress_ArrayLengthMismatch() public { + vm.selectFork(FORKS[ETH]); + + // Define ids, newAddresses, and chainIds + bytes32[] memory ids = new bytes32[](2); + ids[0] = keccak256(abi.encodePacked("id1")); + ids[1] = keccak256(abi.encodePacked("id2")); + + address[] memory newAddresses = new address[](1); + newAddresses[0] = address(0x123); + + uint64[] memory chainIds = new uint64[](2); + chainIds[0] = 1; + chainIds[1] = 1; + + // Call batchSetAddress + vm.prank(deployer); + vm.expectRevert(Error.ARRAY_LENGTH_MISMATCH.selector); + superRegistry.batchSetAddress(ids, newAddresses, chainIds); + } } diff --git a/test/unit/superform-factory/superform-factory.changeFormPauseStatus.t.sol b/test/unit/superform-factory/superform-factory.changeFormPauseStatus.t.sol index 702867f2c..540409681 100644 --- a/test/unit/superform-factory/superform-factory.changeFormPauseStatus.t.sol +++ b/test/unit/superform-factory/superform-factory.changeFormPauseStatus.t.sol @@ -69,6 +69,28 @@ contract SuperformFactoryChangePauseTest is BaseSetup { assertEq(status, true); } + function test_changeFormImplementationPauseStatusNoBroadcastRevertCase() public { + vm.startPrank(deployer); + + vm.selectFork(FORKS[chainId]); + + address superRegistry = getContract(chainId, "SuperRegistry"); + + /// @dev Deploying Forms + address formImplementation1 = address(new ERC4626Form(superRegistry)); + uint32 formImplementationId = 0; + + // Deploying Forms Using AddImplementation. Not Testing Reverts As Already Tested + SuperformFactory(getContract(chainId, "SuperformFactory")).addFormImplementation( + formImplementation1, formImplementationId, 1 + ); + + vm.expectRevert(Error.MSG_VALUE_NOT_ZERO.selector); + SuperformFactory(getContract(chainId, "SuperformFactory")).changeFormImplementationPauseStatus{ value: 1 ether }( + formImplementationId, ISuperformFactory.PauseStatus.PAUSED, "" + ); + } + function test_revert_changeFormImplementationPauseStatus_INVALID_FORM_ID() public { vm.startPrank(deployer); From b40231eb65cd788bc8b69bed5b298491de172dfc Mon Sep 17 00:00:00 2001 From: sujithsomraaj Date: Fri, 19 Jan 2024 19:46:17 +0530 Subject: [PATCH 4/4] chore: add tests for zero collateral withdrawals --- .../superform-form.ERC4626Form.t.sol | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/test/unit/superform-forms/superform-form.ERC4626Form.t.sol b/test/unit/superform-forms/superform-form.ERC4626Form.t.sol index 39af9ad88..766f68bbe 100644 --- a/test/unit/superform-forms/superform-form.ERC4626Form.t.sol +++ b/test/unit/superform-forms/superform-form.ERC4626Form.t.sol @@ -631,6 +631,58 @@ contract SuperformERC4626FormTest is ProtocolActions { SuperformRouter(payable(router)).singleDirectSingleVaultWithdraw(req); } + function test_superformDirectWithdrawZeroCollateral() public { + vm.selectFork(FORKS[ETH]); + vm.startPrank(deployer); + + address superRegistry = getContract(chainId, "SuperRegistry"); + + /// @dev Deploying Forms + address formImplementation = address(new ERC4626Form(superRegistry)); + uint32 formImplementationId = 0; + + VaultMockFailedWithdraw vault = + new VaultMockFailedWithdraw(IERC20(getContract(ETH, "DAI")), "Mock Vault", "Mock"); + + // Deploying Forms Using AddImplementation. Not Testing Reverts As Already Tested + SuperformFactory(getContract(chainId, "SuperformFactory")).addFormImplementation( + formImplementation, formImplementationId, 1 + ); + /// @dev Creating superform using formImplementationId and failed deposit vault + (uint256 superformId,) = SuperformFactory(getContract(chainId, "SuperformFactory")).createSuperform( + formImplementationId, address(vault) + ); + + vm.stopPrank(); + address router = getContract(ETH, "SuperformRouter"); + vm.startPrank(router); + SuperPositions(getContract(ETH, "SuperPositions")).mintSingle(deployer, superformId, 1e18); + vm.stopPrank(); + + vm.startPrank(deployer); + /// @dev superform data with 1e18 final amount + SingleVaultSFData memory data = SingleVaultSFData( + superformId, + 1, + 1, + 10_000, + LiqRequest("", getContract(ETH, "DAI"), address(0), 1, ETH, 0), + "", + false, + false, + receiverAddress, + receiverAddress, + "" + ); + + SingleDirectSingleVaultStateReq memory req = SingleDirectSingleVaultStateReq(data); + + SuperPositions(getContract(ETH, "SuperPositions")).setApprovalForAll(router, true); + + vm.expectRevert(Error.WITHDRAW_ZERO_COLLATERAL.selector); + SuperformRouter(payable(router)).singleDirectSingleVaultWithdraw(req); + } + function test_superformXChainWithdrawalWithoutUpdatingTxData() public { /// @dev prank deposits (just mint super-shares) _successfulDeposit(false);