From b566caa7ff8b9e93b03f7dd5138240c146d2288e Mon Sep 17 00:00:00 2001 From: Benjamin Patch Date: Tue, 24 Oct 2023 10:27:29 +1100 Subject: [PATCH] cleanup --- script/DeployChildContracts.s.sol | 1 - script/InitializeChildContracts.s.sol | 2 +- script/InitializeRootContracts.s.sol | 2 +- src/root/RootERC20Bridge.sol | 30 ++++++----- test/integration/root/RootERC20Bridge.t.sol | 3 +- test/unit/root/RootERC20Bridge.t.sol | 55 ++++++++++++++------- test/utils.t.sol | 17 +++++-- 7 files changed, 68 insertions(+), 42 deletions(-) diff --git a/script/DeployChildContracts.s.sol b/script/DeployChildContracts.s.sol index 0ce202f9..9bf20df8 100644 --- a/script/DeployChildContracts.s.sol +++ b/script/DeployChildContracts.s.sol @@ -20,7 +20,6 @@ contract DeployChildContracts is Script { vm.createSelectFork(childRpcUrl); vm.startBroadcast(deployerPrivateKey); - // new ChildERC20(); ChildERC20 childTokenTemplate = new ChildERC20(); childTokenTemplate.initialize(address(123), "TEMPLATE", "TPT", 18); diff --git a/script/InitializeChildContracts.s.sol b/script/InitializeChildContracts.s.sol index 098ebcc5..59b7bdf7 100644 --- a/script/InitializeChildContracts.s.sol +++ b/script/InitializeChildContracts.s.sol @@ -34,7 +34,7 @@ contract InitializeChildContracts is Script { vm.startBroadcast(deployerPrivateKey); childERC20Bridge.initialize( - address(childAxelarBridgeAdaptor), rootBridgeAdaptorString , childTokenTemplate, rootChainName, rootIMXToken + address(childAxelarBridgeAdaptor), rootBridgeAdaptorString, childTokenTemplate, rootChainName, rootIMXToken ); childAxelarBridgeAdaptor.setRootBridgeAdaptor(); diff --git a/script/InitializeRootContracts.s.sol b/script/InitializeRootContracts.s.sol index 79455394..0878c6b9 100644 --- a/script/InitializeRootContracts.s.sol +++ b/script/InitializeRootContracts.s.sol @@ -27,7 +27,7 @@ contract InitializeRootContracts is Script { string[] memory checksumInputs = Utils.getChecksumInputs(childBridgeAdaptor); bytes memory checksumOutput = vm.ffi(checksumInputs); string memory childBridgeAdaptorChecksum = string(Utils.removeZeroByteValues(checksumOutput)); - address childETHToken = vm.envAddress("CHILD_ETH_ADDRESS"); + address childETHToken = vm.envAddress("CHILD_ETH_ADDRESS"); /** * INITIALIZE ROOT CHAIN CONTRACTS */ diff --git a/src/root/RootERC20Bridge.sol b/src/root/RootERC20Bridge.sol index fd099021..1c95f010 100644 --- a/src/root/RootERC20Bridge.sol +++ b/src/root/RootERC20Bridge.sol @@ -61,18 +61,14 @@ contract RootERC20Bridge is address newRootBridgeAdaptor, address newChildERC20Bridge, string memory newChildBridgeAdaptor, - address newChildTokenTemplate, + address newChildTokenTemplate, address newRootIMXToken, - address newChildETHToken) - public - initializer - { - if (newRootBridgeAdaptor == address(0) - || newChildERC20Bridge == address(0) - || newChildTokenTemplate == address(0) - || newRootIMXToken == address(0) - || newChildETHToken == address(0)) - { + address newChildETHToken + ) public initializer { + if ( + newRootBridgeAdaptor == address(0) || newChildERC20Bridge == address(0) + || newChildTokenTemplate == address(0) || newRootIMXToken == address(0) || newChildETHToken == address(0) + ) { revert ZeroAddress(); } if (bytes(newChildBridgeAdaptor).length == 0) { @@ -97,11 +93,13 @@ contract RootERC20Bridge is return _mapToken(rootToken); } - function depositETH(uint256 amount) external payable { //override removed? + function depositETH(uint256 amount) external payable { + //override removed? _depositETH(msg.sender, amount); } - function depositToETH(address receiver, uint256 amount) external payable { //override removed? + function depositToETH(address receiver, uint256 amount) external payable { + //override removed? _depositETH(receiver, amount); } @@ -111,7 +109,7 @@ contract RootERC20Bridge is } uint256 expectedBalance = address(this).balance - (msg.value - amount); - + _deposit(IERC20Metadata(NATIVE_TOKEN), receiver, amount); // invariant check to ensure that the root native balance has increased by the amount deposited @@ -188,7 +186,7 @@ contract RootERC20Bridge is // TODO We can call _mapToken here, but ordering in the GMP is not guaranteed. // Therefore, we need to decide how to handle this and it may be a UI decision to wait until map token message is executed on child chain. // Discuss this, and add this decision to the design doc. - if (address(rootToken) != NATIVE_TOKEN) { + if (address(rootToken) != NATIVE_TOKEN) { if (address(rootToken) != rootIMXToken) { childToken = rootTokenToChildToken[address(rootToken)]; if (childToken == address(0)) { @@ -201,7 +199,7 @@ contract RootERC20Bridge is } else { feeAmount = msg.value - amount; } - + // Deposit sig, root token address, depositor, receiver, amount bytes memory payload = abi.encode(DEPOSIT_SIG, rootToken, msg.sender, receiver, amount); // TODO investigate using delegatecall to keep the axelar message sender as the bridge contract, since adaptor can change. diff --git a/test/integration/root/RootERC20Bridge.t.sol b/test/integration/root/RootERC20Bridge.t.sol index 78254172..fdee9777 100644 --- a/test/integration/root/RootERC20Bridge.t.sol +++ b/test/integration/root/RootERC20Bridge.t.sol @@ -101,7 +101,8 @@ contract RootERC20BridgeIntegrationTest is Test, IRootERC20BridgeEvents, IRootAx string memory childBridgeAdaptorString = Strings.toHexString(CHILD_BRIDGE_ADAPTOR); // (address childToken, bytes memory predictedPayload) = // setupDeposit(token, rootBridge, gasPrice, tokenAmount, true); - (address childToken, bytes memory predictedPayload) = setupDeposit(token, rootBridge, mapTokenFee, depositFee, tokenAmount, true); + (address childToken, bytes memory predictedPayload) = + setupDeposit(token, rootBridge, mapTokenFee, depositFee, tokenAmount, true); vm.expectEmit(address(axelarAdaptor)); emit MapTokenAxelarMessage(CHILD_CHAIN_NAME, childBridgeAdaptorString, predictedPayload); diff --git a/test/unit/root/RootERC20Bridge.t.sol b/test/unit/root/RootERC20Bridge.t.sol index 221b7f4d..d12653ea 100644 --- a/test/unit/root/RootERC20Bridge.t.sol +++ b/test/unit/root/RootERC20Bridge.t.sol @@ -44,7 +44,14 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid mockAxelarAdaptor = new MockAdaptor(); // The specific ERC20 token template does not matter for these unit tests - rootBridge.initialize(address(mockAxelarAdaptor), CHILD_BRIDGE, CHILD_BRIDGE_ADAPTOR_STRING, address(token), IMX_TOKEN, CHILD_ETH_TOKEN); + rootBridge.initialize( + address(mockAxelarAdaptor), + CHILD_BRIDGE, + CHILD_BRIDGE_ADAPTOR_STRING, + address(token), + IMX_TOKEN, + CHILD_ETH_TOKEN + ); } /** @@ -59,7 +66,14 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid function test_RevertIfInitializeTwice() public { vm.expectRevert("Initializable: contract is already initialized"); - rootBridge.initialize(address(mockAxelarAdaptor), CHILD_BRIDGE, CHILD_BRIDGE_ADAPTOR_STRING, address(token), IMX_TOKEN, CHILD_ETH_TOKEN); + rootBridge.initialize( + address(mockAxelarAdaptor), + CHILD_BRIDGE, + CHILD_BRIDGE_ADAPTOR_STRING, + address(token), + IMX_TOKEN, + CHILD_ETH_TOKEN + ); } function test_RevertIf_InitializeWithAZeroAddressRootAdapter() public { @@ -119,7 +133,6 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid } function test_mapToken_CallsAdaptor() public { - bytes memory payload = abi.encode(rootBridge.MAP_TOKEN_SIG(), token, token.name(), token.symbol(), token.decimals()); @@ -202,7 +215,8 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid function test_depositETHCallsSendMessage() public { uint256 amount = 1000; - (, bytes memory predictedPayload) = setupDeposit(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, false); + (, bytes memory predictedPayload) = + setupDeposit(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, false); vm.expectCall( address(mockAxelarAdaptor), @@ -210,7 +224,7 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid abi.encodeWithSelector(mockAxelarAdaptor.sendMessage.selector, predictedPayload, address(this)) ); - rootBridge.depositETH{value: amount+depositFee}(amount); + rootBridge.depositETH{value: amount + depositFee}(amount); } function test_depositETHEmitsNativeDepositEvent() public { @@ -219,7 +233,7 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid vm.expectEmit(); emit NativeDeposit(NATIVE_TOKEN, CHILD_ETH_TOKEN, address(this), address(this), amount); - rootBridge.depositETH{value: amount+depositFee}(amount); + rootBridge.depositETH{value: amount + depositFee}(amount); } function test_RevertIf_depositETHInsufficientValue() public { @@ -227,43 +241,49 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid setupDeposit(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, false); vm.expectRevert(InsufficientValue.selector); - rootBridge.depositETH{value: (amount/2)+depositFee}(amount); + rootBridge.depositETH{value: (amount / 2) + depositFee}(amount); } - /** + /** * DEPOSIT TO ETH */ function test_depositToETHCallsSendMessage() public { uint256 amount = 1000; address receiver = address(12345); - (, bytes memory predictedPayload) = setupDepositTo(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, receiver, false); + (, bytes memory predictedPayload) = setupDepositTo( + ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, receiver, false + ); vm.expectCall( address(mockAxelarAdaptor), depositFee, abi.encodeWithSelector(mockAxelarAdaptor.sendMessage.selector, predictedPayload, address(this)) ); - rootBridge.depositToETH{value: amount+depositFee}(receiver, amount); + rootBridge.depositToETH{value: amount + depositFee}(receiver, amount); } function test_depositToETHEmitsNativeDepositEvent() public { uint256 amount = 1000; address receiver = address(12345); - setupDepositTo(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, receiver, false); + setupDepositTo( + ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, receiver, false + ); vm.expectEmit(); emit NativeDeposit(NATIVE_TOKEN, CHILD_ETH_TOKEN, address(this), receiver, amount); - rootBridge.depositToETH{value: amount+depositFee}(receiver, amount); + rootBridge.depositToETH{value: amount + depositFee}(receiver, amount); } function test_RevertIf_depositToETHInsufficientValue() public { uint256 amount = 1000; address receiver = address(12345); - setupDepositTo(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, receiver, false); + setupDepositTo( + ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, receiver, false + ); vm.expectRevert(InsufficientValue.selector); - rootBridge.depositToETH{value: (amount/2)+depositFee}(receiver, amount); + rootBridge.depositToETH{value: (amount / 2) + depositFee}(receiver, amount); } /** @@ -275,7 +295,7 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid setupDeposit(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, false); vm.expectRevert(ZeroAmount.selector); - rootBridge.depositETH{value: amount+depositFee}(amount); + rootBridge.depositETH{value: amount + depositFee}(amount); } function test_RevertIf_depositToETHAmountIsZero() public { @@ -285,7 +305,7 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid setupDeposit(ERC20PresetMinterPauser(NATIVE_TOKEN), rootBridge, mapTokenFee, depositFee, amount, false); vm.expectRevert(ZeroAmount.selector); - rootBridge.depositToETH{value: amount+depositFee}(receiver, amount); + rootBridge.depositToETH{value: amount + depositFee}(receiver, amount); } function test_RevertIf_depositAmountIsZero() public { @@ -407,7 +427,8 @@ contract RootERC20BridgeUnitTest is Test, IRootERC20BridgeEvents, IRootERC20Brid uint256 amount = 100; address receiver = address(12345); - (, bytes memory predictedPayload) = setupDepositTo(token, rootBridge, mapTokenFee, depositFee, amount, receiver, true); + (, bytes memory predictedPayload) = + setupDepositTo(token, rootBridge, mapTokenFee, depositFee, amount, receiver, true); vm.expectCall( address(mockAxelarAdaptor), diff --git a/test/utils.t.sol b/test/utils.t.sol index 3dfb6db0..00f94590 100644 --- a/test/utils.t.sol +++ b/test/utils.t.sol @@ -13,13 +13,13 @@ import {IChildERC20, ChildERC20} from "../src/child/ChildERC20.sol"; import {RootAxelarBridgeAdaptor} from "../src/root/RootAxelarBridgeAdaptor.sol"; contract Utils is Test { - function integrationSetup( address childBridge, address childBridgeAdaptor, string memory childBridgeName, address imxTokenAddress, - address ethTokenAddress) + address ethTokenAddress + ) public returns ( ERC20PresetMinterPauser token, @@ -43,7 +43,14 @@ contract Utils is Test { address(axelarGasService) ); - rootBridge.initialize(address(axelarAdaptor), childBridge, Strings.toHexString(childBridgeAdaptor), address(token), imxTokenAddress, ethTokenAddress); + rootBridge.initialize( + address(axelarAdaptor), + childBridge, + Strings.toHexString(childBridgeAdaptor), + address(token), + imxTokenAddress, + ethTokenAddress + ); axelarAdaptor.setChildBridgeAdaptor(); } @@ -84,12 +91,12 @@ contract Utils is Test { childToken = rootBridge.mapToken{value: mapTokenFee}(token); } if (address(token) == address(0xeee)) { - vm.deal(to, tokenAmount+depositFee); + vm.deal(to, tokenAmount + depositFee); } else { token.mint(address(this), tokenAmount); token.approve(address(rootBridge), tokenAmount); } - + return (childToken, predictedPayload); }