From ac1dba03a707345eddcb4db28333e287635944df Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 09:32:46 -0600 Subject: [PATCH 1/7] add deposit to functions --- src/bridge/ERC20Inbox.sol | 20 ++++++++++++++++---- src/bridge/IERC20Inbox.sol | 10 ++++++++++ src/bridge/IInbox.sol | 7 +++++++ src/bridge/Inbox.sol | 15 ++++++++++++--- src/mocks/InboxStub.sol | 3 +++ 5 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/bridge/ERC20Inbox.sol b/src/bridge/ERC20Inbox.sol index 303397f2..8db56cf7 100644 --- a/src/bridge/ERC20Inbox.sol +++ b/src/bridge/ERC20Inbox.sol @@ -54,10 +54,15 @@ contract ERC20Inbox is AbsInbox, IERC20Inbox { dest = AddressAliasHelper.applyL1ToL2Alias(msg.sender); } - uint256 amountToMintOnL2 = _fromNativeTo18Decimals(amount); - return _deliverMessage( - L1MessageType_ethDeposit, msg.sender, abi.encodePacked(dest, amountToMintOnL2), amount - ); + return _depositERC20(dest, amount); + } + + /// @inheritdoc IERC20Inbox + function depositERC20( + address to, + uint256 amount + ) public whenNotPaused onlyAllowed returns (uint256) { + return _depositERC20(to, amount); } /// @inheritdoc IERC20Inbox @@ -119,6 +124,13 @@ contract ERC20Inbox is AbsInbox, IERC20Inbox { return 0; } + function _depositERC20(address dest, uint256 amount) internal returns (uint256) { + uint256 amountToMintOnL2 = _fromNativeTo18Decimals(amount); + return _deliverMessage( + L1MessageType_ethDeposit, msg.sender, abi.encodePacked(dest, amountToMintOnL2), amount + ); + } + function _deliverToBridge( uint8 kind, address sender, diff --git a/src/bridge/IERC20Inbox.sol b/src/bridge/IERC20Inbox.sol index d13f159d..cba87c76 100644 --- a/src/bridge/IERC20Inbox.sol +++ b/src/bridge/IERC20Inbox.sol @@ -18,6 +18,16 @@ interface IERC20Inbox is IInboxBase { uint256 amount ) external returns (uint256); + /** + * @notice Deposit native token from L1 to L2 to the specified destination address. The destination is never aliased. + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + */ + function depositERC20( + address to, + uint256 amount + ) external returns (uint256); + /** * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts * @dev all tokenTotalFeeAmount will be deposited to callValueRefundAddress on L2 diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index cea3bea3..ebd6354f 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -70,6 +70,13 @@ interface IInbox is IInboxBase { */ function depositEth() external payable returns (uint256); + /** + * @notice Deposit eth from L1 to L2 to the specified destination address. The destination is never aliased. + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + */ + function depositEth(address destination) external payable returns (uint256); + /** * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts * @dev all msg.value will deposited to callValueRefundAddress on L2 diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 079a9f8a..7b076a65 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -208,9 +208,12 @@ contract Inbox is AbsInbox, IInbox { dest = AddressAliasHelper.applyL1ToL2Alias(msg.sender); } - return _deliverMessage( - L1MessageType_ethDeposit, msg.sender, abi.encodePacked(dest, msg.value), msg.value - ); + return _depositEth(dest); + } + + /// @inheritdoc IInbox + function depositEth(address to) external payable whenNotPaused onlyAllowed returns (uint256) { + return _depositEth(to); } /// @notice deprecated in favour of depositEth with no parameters @@ -314,6 +317,12 @@ contract Inbox is AbsInbox, IInbox { return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); } + function _depositEth(address dest) internal returns (uint256) { + return _deliverMessage( + L1MessageType_ethDeposit, msg.sender, abi.encodePacked(dest, msg.value), msg.value + ); + } + function _deliverToBridge( uint8 kind, address sender, diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index ca56de31..3c7b2552 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -181,6 +181,9 @@ contract InboxStub is IInboxBase, IInbox { function depositEth() external payable override returns (uint256) { revert("NOT_IMPLEMENTED"); } + function depositEth(address) external payable override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } function postUpgradeInit( IBridge _bridge From 4f8fc36783a17b8327ce1d781f48f9b64a7cb41e Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 09:48:04 -0600 Subject: [PATCH 2/7] eth tests --- test/foundry/Inbox.t.sol | 94 +++++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/test/foundry/Inbox.t.sol b/test/foundry/Inbox.t.sol index c557dec5..36573da3 100644 --- a/test/foundry/Inbox.t.sol +++ b/test/foundry/Inbox.t.sol @@ -37,19 +37,30 @@ contract InboxTest is AbsInboxTest { assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); } - function test_depositEth_FromEOA() public { + function _depositEth( + address sender, + address origin, + address to, + bool useTo, + address expectedDest, + uint256 expectedDelayedMessageCount + ) internal { uint256 depositAmount = 2 ether; uint256 bridgeEthBalanceBefore = address(bridge).balance; - uint256 userEthBalanceBefore = address(user).balance; + uint256 userEthBalanceBefore = address(sender).balance; // expect event vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + emit InboxMessageDelivered( + expectedDelayedMessageCount - 1, abi.encodePacked(expectedDest, depositAmount) + ); // deposit tokens -> tx.origin == msg.sender - vm.prank(user, user); - ethInbox.depositEth{value: depositAmount}(); + vm.prank(sender, origin); + useTo + ? ethInbox.depositEth{value: depositAmount}(to) + : ethInbox.depositEth{value: depositAmount}(); //// checks @@ -60,45 +71,58 @@ contract InboxTest is AbsInboxTest { "Invalid bridge eth balance" ); - uint256 userEthBalanceAfter = address(user).balance; + uint256 userEthBalanceAfter = address(sender).balance; assertEq( userEthBalanceBefore - userEthBalanceAfter, depositAmount, "Invalid user eth balance" ); - assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); - } - - function test_depositEth_FromContract() public { - uint256 depositAmount = 1.2 ether; - - uint256 bridgeEthBalanceBefore = address(bridge).balance; - uint256 userEthBalanceBefore = address(user).balance; - - // expect event - vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered( - 0, abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + assertEq( + bridge.delayedMessageCount(), + expectedDelayedMessageCount, + "Invalid delayed message count" ); + } - // deposit tokens -> tx.origin != msg.sender - vm.prank(user); - ethInbox.depositEth{value: depositAmount}(); - - //// checks + function test_depositEth_FromEOA() public { + _depositEth({ + sender: user, + origin: user, + to: address(0), + useTo: false, + expectedDest: user, + expectedDelayedMessageCount: 1 + }); + } - uint256 bridgeEthBalanceAfter = address(bridge).balance; - assertEq( - bridgeEthBalanceAfter - bridgeEthBalanceBefore, - depositAmount, - "Invalid bridge eth balance" - ); + function test_depositEth_FromContract() public { + _depositEth({ + sender: user, + origin: tx.origin, + to: address(0), + useTo: false, + expectedDest: AddressAliasHelper.applyL1ToL2Alias(user), + expectedDelayedMessageCount: 1 + }); + } - uint256 userEthBalanceAfter = address(user).balance; - assertEq( - userEthBalanceBefore - userEthBalanceAfter, depositAmount, "Invalid eth token balance" - ); + function test_depositEth_WithDest() public { + _depositEth({ + sender: user, + origin: user, + to: address(1234), + useTo: true, + expectedDest: address(1234), + expectedDelayedMessageCount: 1 + }); - assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + _depositEth({ + sender: user, + origin: tx.origin, + to: address(4321), + useTo: true, + expectedDest: address(4321), + expectedDelayedMessageCount: 2 + }); } function test_depositEth_revert_EthTransferFails() public { From a704e458bba2363580d4632cea0f7a95979df424 Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 13:38:00 -0600 Subject: [PATCH 3/7] refactor depositERC20 tests --- test/foundry/ERC20Inbox.t.sol | 328 ++++++++++------------------------ 1 file changed, 96 insertions(+), 232 deletions(-) diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol index b1879685..f290bc68 100644 --- a/test/foundry/ERC20Inbox.t.sol +++ b/test/foundry/ERC20Inbox.t.sol @@ -44,94 +44,58 @@ contract ERC20InboxTest is AbsInboxTest { assertEq(IERC20(nativeToken).allowance(address(inbox), address(bridge)), type(uint256).max); } - function test_depositERC20_FromEOA() public { - uint256 depositAmount = 300; - - uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); - uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); - uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); - - // approve inbox to fetch tokens - vm.prank(user); - nativeToken.approve(address(inbox), depositAmount); - - // expect event - vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); - - // deposit tokens -> tx.origin == msg.sender - vm.prank(user, user); - erc20Inbox.depositERC20(depositAmount); - - //// checks - - uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); - assertEq( - bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, - depositAmount, - "Invalid bridge token balance" - ); - - uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); - assertEq( - userTokenBalanceBefore - userTokenBalanceAfter, - depositAmount, - "Invalid user token balance" - ); - - uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); - assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); - } - - function test_depositERC20_FromEOA_LessThan18Decimals() public { - uint8 decimals = 6; - ERC20 _nativeToken = new ERC20_6Decimals(); - + function _depositERC20( + IERC20 _nativeToken, + uint256 decimals, + uint256 depositAmount, + address sender, + address origin, + address to, + bool useTo, + address expectedDest + ) internal { IERC20Bridge _bridge = IERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); IERC20Inbox _inbox = IERC20Inbox(TestUtil.deployProxy(address(new ERC20Inbox(MAX_DATA_SIZE)))); // init bridge and inbox - address _rollup = makeAddr("_rollup"); - _bridge.initialize(IOwnable(_rollup), address(_nativeToken)); - _inbox.initialize(_bridge, ISequencerInbox(makeAddr("_seqInbox"))); - vm.prank(_rollup); + { + address _rollup = makeAddr("_rollup"); + _bridge.initialize(IOwnable(_rollup), address(_nativeToken)); + _inbox.initialize(_bridge, ISequencerInbox(makeAddr("_seqInbox"))); + vm.prank(_rollup); + } _bridge.setDelayedInbox(address(_inbox), true); - // fund user account - ERC20_6Decimals(address(_nativeToken)).mint(user, 1000 * 10 ** decimals); - - uint256 depositAmount = 300 * 10 ** decimals; - uint256 bridgeTokenBalanceBefore = _nativeToken.balanceOf(address(_bridge)); - uint256 userTokenBalanceBefore = _nativeToken.balanceOf(address(user)); + uint256 userTokenBalanceBefore = _nativeToken.balanceOf(address(sender)); uint256 delayedMsgCountBefore = _bridge.delayedMessageCount(); // approve inbox to fetch tokens - vm.prank(user); + vm.prank(sender); _nativeToken.approve(address(_inbox), depositAmount); // expect event - uint256 expectedAmountToMintOnL2 = depositAmount * 10 ** (18 - decimals); + uint256 expectedAmountToMintOnL2 = decimals > 18 ? depositAmount / 10 ** (decimals - 18) : depositAmount * 10 ** (18 - decimals); vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered(0, abi.encodePacked(user, expectedAmountToMintOnL2)); + emit InboxMessageDelivered( + delayedMsgCountBefore, abi.encodePacked(expectedDest, expectedAmountToMintOnL2) + ); // deposit tokens -> tx.origin == msg.sender - vm.prank(user, user); - _inbox.depositERC20(depositAmount); + vm.prank(sender, origin); + useTo ? _inbox.depositERC20(to, depositAmount) : _inbox.depositERC20(depositAmount); //// checks - uint256 bridgeTokenBalanceAfter = _nativeToken.balanceOf(address(_bridge)); assertEq( - bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + _nativeToken.balanceOf(address(_bridge)) - bridgeTokenBalanceBefore, depositAmount, "Invalid bridge token balance" ); - uint256 userTokenBalanceAfter = _nativeToken.balanceOf(address(user)); assertEq( - userTokenBalanceBefore - userTokenBalanceAfter, + userTokenBalanceBefore - _nativeToken.balanceOf(address(sender)), depositAmount, "Invalid user token balance" ); @@ -140,192 +104,92 @@ contract ERC20InboxTest is AbsInboxTest { assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); } - function test_depositERC20_FromEOA_MoreThan18Decimals() public { - uint8 decimals = 20; - ERC20 _nativeToken = new ERC20_20Decimals(); - - IERC20Bridge _bridge = IERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); - IERC20Inbox _inbox = - IERC20Inbox(TestUtil.deployProxy(address(new ERC20Inbox(MAX_DATA_SIZE)))); - - // init bridge and inbox - address _rollup = makeAddr("_rollup"); - _bridge.initialize(IOwnable(_rollup), address(_nativeToken)); - _inbox.initialize(_bridge, ISequencerInbox(makeAddr("_seqInbox"))); - vm.prank(_rollup); - _bridge.setDelayedInbox(address(_inbox), true); - - // fund user account - ERC20_20Decimals(address(_nativeToken)).mint(user, 1000 * 10 ** decimals); - - uint256 depositAmount = 300 * 10 ** decimals; - - uint256 bridgeTokenBalanceBefore = _nativeToken.balanceOf(address(_bridge)); - uint256 userTokenBalanceBefore = _nativeToken.balanceOf(address(user)); - uint256 delayedMsgCountBefore = _bridge.delayedMessageCount(); - - // approve inbox to fetch tokens - vm.prank(user); - _nativeToken.approve(address(_inbox), depositAmount); - - // expect event - uint256 expectedAmountToMintOnL2 = depositAmount / (10 ** (decimals - 18)); - vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered(0, abi.encodePacked(user, expectedAmountToMintOnL2)); - - // deposit tokens -> tx.origin == msg.sender - vm.prank(user, user); - _inbox.depositERC20(depositAmount); - - //// checks - - uint256 bridgeTokenBalanceAfter = _nativeToken.balanceOf(address(_bridge)); - assertEq( - bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, - depositAmount, - "Invalid bridge token balance" - ); + function test_depositERC20_FromEOA() public { + _depositERC20({ + _nativeToken: nativeToken, + decimals: 18, + depositAmount: 300, + sender: user, + origin: user, + to: address(0), + useTo: false, + expectedDest: user + }); + } - uint256 userTokenBalanceAfter = _nativeToken.balanceOf(address(user)); - assertEq( - userTokenBalanceBefore - userTokenBalanceAfter, - depositAmount, - "Invalid user token balance" - ); + function test_depositERC20_FromEOA_LessThan18Decimals() public { + ERC20_6Decimals _nativeToken = new ERC20_6Decimals(); + _nativeToken.mint(user, 1000 * 10 ** 6); + _depositERC20({ + _nativeToken: _nativeToken, + decimals: 6, + depositAmount: 300 * 10 ** 6, + sender: user, + origin: user, + to: address(0), + useTo: false, + expectedDest: user + }); + } - uint256 delayedMsgCountAfter = _bridge.delayedMessageCount(); - assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + function test_depositERC20_FromEOA_MoreThan18Decimals() public { + ERC20_20Decimals _nativeToken = new ERC20_20Decimals(); + _nativeToken.mint(user, 1000 * 10 ** 20); + _depositERC20({ + _nativeToken: _nativeToken, + decimals: 20, + depositAmount: 300 * 10 ** 20, + sender: user, + origin: user, + to: address(0), + useTo: false, + expectedDest: user + }); } function test_depositERC20_FromEOA_NoDecimals() public { ERC20 _nativeToken = new ERC20NoDecimals(); - - IERC20Bridge _bridge = IERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); - IERC20Inbox _inbox = - IERC20Inbox(TestUtil.deployProxy(address(new ERC20Inbox(MAX_DATA_SIZE)))); - - // init bridge and inbox - address _rollup = makeAddr("_rollup"); - _bridge.initialize(IOwnable(_rollup), address(_nativeToken)); - _inbox.initialize(_bridge, ISequencerInbox(makeAddr("_seqInbox"))); - vm.prank(_rollup); - _bridge.setDelayedInbox(address(_inbox), true); - - // fund user account - ERC20NoDecimals(address(_nativeToken)).mint(user, 1000); - - uint256 depositAmount = 300; - - uint256 bridgeTokenBalanceBefore = _nativeToken.balanceOf(address(_bridge)); - uint256 userTokenBalanceBefore = _nativeToken.balanceOf(address(user)); - uint256 delayedMsgCountBefore = _bridge.delayedMessageCount(); - - // approve inbox to fetch tokens - vm.prank(user); - _nativeToken.approve(address(_inbox), depositAmount); - - // expect event - uint256 expectedAmountToMintOnL2 = depositAmount * 10 ** 18; - vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered(0, abi.encodePacked(user, expectedAmountToMintOnL2)); - - // deposit tokens -> tx.origin == msg.sender - vm.prank(user, user); - _inbox.depositERC20(depositAmount); - - //// checks - - uint256 bridgeTokenBalanceAfter = _nativeToken.balanceOf(address(_bridge)); - assertEq( - bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, - depositAmount, - "Invalid bridge token balance" - ); - - uint256 userTokenBalanceAfter = _nativeToken.balanceOf(address(user)); - assertEq( - userTokenBalanceBefore - userTokenBalanceAfter, - depositAmount, - "Invalid user token balance" - ); - - uint256 delayedMsgCountAfter = _bridge.delayedMessageCount(); - assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + ERC20PresetMinterPauser(address(_nativeToken)).mint(user, 1000); + _depositERC20({ + _nativeToken: _nativeToken, + decimals: 0, + depositAmount: 300, + sender: user, + origin: user, + to: address(0), + useTo: false, + expectedDest: user + }); } function test_depositERC20_FromEOA_InboxPrefunded() public { uint256 depositAmount = 300; - - uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); - uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); - uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); - // prefund inbox with native token amount needed to pay for fees ERC20PresetMinterPauser(address(nativeToken)).mint(address(inbox), depositAmount); - // expect event - vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); - - // deposit tokens -> tx.origin == msg.sender - vm.prank(user, user); - erc20Inbox.depositERC20(depositAmount); - - //// checks - - uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); - assertEq( - bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, - depositAmount, - "Invalid bridge token balance" - ); - - uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); - assertEq(userTokenBalanceBefore, userTokenBalanceAfter, "Invalid user token balance"); - - uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); - assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + _depositERC20({ + _nativeToken: nativeToken, + decimals: 18, + depositAmount: depositAmount, + sender: user, + origin: user, + to: address(0), + useTo: false, + expectedDest: user + }); } function test_depositERC20_FromContract() public { - uint256 depositAmount = 300; - - uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); - uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); - uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); - - // approve inbox to fetch tokens - vm.prank(user); - nativeToken.approve(address(inbox), depositAmount); - - // expect event - vm.expectEmit(true, true, true, true); - emit InboxMessageDelivered( - 0, abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) - ); - - // deposit tokens -> tx.origin != msg.sender - vm.prank(user); - erc20Inbox.depositERC20(depositAmount); - - //// checks - - uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); - assertEq( - bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, - depositAmount, - "Invalid bridge token balance" - ); - - uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); - assertEq( - userTokenBalanceBefore - userTokenBalanceAfter, - depositAmount, - "Invalid user token balance" - ); - - uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); - assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + _depositERC20({ + _nativeToken: nativeToken, + decimals: 18, + depositAmount: 300, + sender: user, + origin: tx.origin, + to: address(0), + useTo: false, + expectedDest: AddressAliasHelper.applyL1ToL2Alias(user) + }); } function test_depositERC20_revert_DepositAmountTooLarge() public { From 17f17412365f48d1c4c6cc52533a2ed0cf25ce2b Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 13:42:41 -0600 Subject: [PATCH 4/7] deposit erc20 to tests --- test/foundry/ERC20Inbox.t.sol | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol index f290bc68..999ad142 100644 --- a/test/foundry/ERC20Inbox.t.sol +++ b/test/foundry/ERC20Inbox.t.sol @@ -104,6 +104,30 @@ contract ERC20InboxTest is AbsInboxTest { assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); } + function test_depositERC20_WithDest() public { + _depositERC20({ + _nativeToken: nativeToken, + decimals: 18, + depositAmount: 300, + sender: user, + origin: user, + to: address(1234), + useTo: true, + expectedDest: address(1234) + }); + + _depositERC20({ + _nativeToken: nativeToken, + decimals: 18, + depositAmount: 300, + sender: user, + origin: tx.origin, + to: address(4321), + useTo: true, + expectedDest: address(4321) + }); + } + function test_depositERC20_FromEOA() public { _depositERC20({ _nativeToken: nativeToken, From b9adc38a1633c5c20c4f41e8c16c781a11706029 Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 14:10:39 -0600 Subject: [PATCH 5/7] fix signatures --- test/signatures/ERC20Inbox | 2 ++ test/signatures/Inbox | 2 ++ 2 files changed, 4 insertions(+) diff --git a/test/signatures/ERC20Inbox b/test/signatures/ERC20Inbox index 51081708..af9aa4db 100644 --- a/test/signatures/ERC20Inbox +++ b/test/signatures/ERC20Inbox @@ -10,6 +10,8 @@ |----------------------------------------------------------------------------------------------------+------------| | createRetryableTicket(address,uint256,uint256,address,address,uint256,uint256,uint256,bytes) | 549e8426 | |----------------------------------------------------------------------------------------------------+------------| +| depositERC20(address,uint256) | 97feb926 | +|----------------------------------------------------------------------------------------------------+------------| | depositERC20(uint256) | b79092fd | |----------------------------------------------------------------------------------------------------+------------| | getProxyAdmin() | 8b3240a0 | diff --git a/test/signatures/Inbox b/test/signatures/Inbox index 031e477a..48252330 100644 --- a/test/signatures/Inbox +++ b/test/signatures/Inbox @@ -14,6 +14,8 @@ |----------------------------------------------------------------------------------------------------------+------------| | depositEth() | 439370b1 | |----------------------------------------------------------------------------------------------------------+------------| +| depositEth(address) | ad9d4ba3 | +|----------------------------------------------------------------------------------------------------------+------------| | depositEth(uint256) | 0f4d14e9 | |----------------------------------------------------------------------------------------------------------+------------| | getProxyAdmin() | 8b3240a0 | From 3c3a426c14aebd4265bde74a3600e87089e5ccfd Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 14:11:44 -0600 Subject: [PATCH 6/7] fmt --- src/bridge/IERC20Inbox.sol | 5 +---- src/bridge/IInbox.sol | 4 +++- src/bridge/Inbox.sol | 8 ++++++-- src/mocks/InboxStub.sol | 5 ++++- test/foundry/ERC20Inbox.t.sol | 4 +++- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/bridge/IERC20Inbox.sol b/src/bridge/IERC20Inbox.sol index cba87c76..cde889ac 100644 --- a/src/bridge/IERC20Inbox.sol +++ b/src/bridge/IERC20Inbox.sol @@ -23,10 +23,7 @@ interface IERC20Inbox is IInboxBase { * @dev This does not trigger the fallback function when receiving in the L2 side. * Look into retryable tickets if you are interested in this functionality. */ - function depositERC20( - address to, - uint256 amount - ) external returns (uint256); + function depositERC20(address to, uint256 amount) external returns (uint256); /** * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index ebd6354f..75a21959 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -75,7 +75,9 @@ interface IInbox is IInboxBase { * @dev This does not trigger the fallback function when receiving in the L2 side. * Look into retryable tickets if you are interested in this functionality. */ - function depositEth(address destination) external payable returns (uint256); + function depositEth( + address destination + ) external payable returns (uint256); /** * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 7b076a65..b3144584 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -212,7 +212,9 @@ contract Inbox is AbsInbox, IInbox { } /// @inheritdoc IInbox - function depositEth(address to) external payable whenNotPaused onlyAllowed returns (uint256) { + function depositEth( + address to + ) external payable whenNotPaused onlyAllowed returns (uint256) { return _depositEth(to); } @@ -317,7 +319,9 @@ contract Inbox is AbsInbox, IInbox { return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); } - function _depositEth(address dest) internal returns (uint256) { + function _depositEth( + address dest + ) internal returns (uint256) { return _deliverMessage( L1MessageType_ethDeposit, msg.sender, abi.encodePacked(dest, msg.value), msg.value ); diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index 3c7b2552..2ebf8e15 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -181,7 +181,10 @@ contract InboxStub is IInboxBase, IInbox { function depositEth() external payable override returns (uint256) { revert("NOT_IMPLEMENTED"); } - function depositEth(address) external payable override returns (uint256) { + + function depositEth( + address + ) external payable override returns (uint256) { revert("NOT_IMPLEMENTED"); } diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol index 999ad142..d70c7f1e 100644 --- a/test/foundry/ERC20Inbox.t.sol +++ b/test/foundry/ERC20Inbox.t.sol @@ -76,7 +76,9 @@ contract ERC20InboxTest is AbsInboxTest { _nativeToken.approve(address(_inbox), depositAmount); // expect event - uint256 expectedAmountToMintOnL2 = decimals > 18 ? depositAmount / 10 ** (decimals - 18) : depositAmount * 10 ** (18 - decimals); + uint256 expectedAmountToMintOnL2 = decimals > 18 + ? depositAmount / 10 ** (decimals - 18) + : depositAmount * 10 ** (18 - decimals); vm.expectEmit(true, true, true, true); emit InboxMessageDelivered( delayedMsgCountBefore, abi.encodePacked(expectedDest, expectedAmountToMintOnL2) From d5dcb5f4ce5baa69ed5f5faeea5e6e2e8cdce3d8 Mon Sep 17 00:00:00 2001 From: Henry <11198460+godzillaba@users.noreply.github.com> Date: Fri, 30 May 2025 14:13:50 -0600 Subject: [PATCH 7/7] fix e2e --- test/e2e/orbitChain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/orbitChain.ts b/test/e2e/orbitChain.ts index 9fbe66a7..9f9b91d2 100644 --- a/test/e2e/orbitChain.ts +++ b/test/e2e/orbitChain.ts @@ -162,7 +162,7 @@ describe('Orbit Chain', () => { depositTx = await ERC20Inbox__factory.connect( l2Network.ethBridge.inbox, userL1Wallet - ).depositERC20(amountToDeposit) + )['depositERC20(uint256)'](amountToDeposit) } else { depositTx = await Inbox__factory.connect( l2Network.ethBridge.inbox,