From 1cb344aa7b0355dadd8d95774111986fa4219d47 Mon Sep 17 00:00:00 2001 From: Anton Kovalchuk Date: Tue, 13 Feb 2024 11:23:11 +0100 Subject: [PATCH] fix evetns + formating --- contracts/optimism/L1ERC20TokenBridge.sol | 102 ++++++++++++++---- contracts/optimism/L2ERC20TokenBridge.sol | 62 +++++++++-- test/optimism/L1ERC20TokenBridge.unit.test.ts | 10 +- .../bridging-rebase.integration.test.ts | 8 +- 4 files changed, 140 insertions(+), 42 deletions(-) diff --git a/contracts/optimism/L1ERC20TokenBridge.sol b/contracts/optimism/L1ERC20TokenBridge.sol index 61cdb73a..be7852ed 100644 --- a/contracts/optimism/L1ERC20TokenBridge.sol +++ b/contracts/optimism/L1ERC20TokenBridge.sol @@ -116,12 +116,28 @@ contract L1ERC20TokenBridge is onlyFromCrossDomainAccount(L2_TOKEN_BRIDGE) { if (isRebasableTokenFlow(l1Token_, l2Token_)) { - uint256 stETHAmount = IERC20Wrapper(L1_TOKEN_NON_REBASABLE).unwrap(amount_); - IERC20(L1_TOKEN_REBASABLE).safeTransfer(to_, stETHAmount); - emit ERC20WithdrawalFinalized(l1Token_, l2Token_, from_, to_, amount_, data_); + uint256 rebasableTokenAmount = IERC20Wrapper(L1_TOKEN_NON_REBASABLE).unwrap(amount_); + IERC20(L1_TOKEN_REBASABLE).safeTransfer(to_, rebasableTokenAmount); + + emit ERC20WithdrawalFinalized( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + from_, + to_, + rebasableTokenAmount, + data_ + ); } else if (isNonRebasableTokenFlow(l1Token_, l2Token_)) { IERC20(L1_TOKEN_NON_REBASABLE).safeTransfer(to_, amount_); - emit ERC20WithdrawalFinalized(l1Token_, l2Token_, from_, to_, amount_, data_); + + emit ERC20WithdrawalFinalized( + L1_TOKEN_NON_REBASABLE, + L2_TOKEN_NON_REBASABLE, + from_, + to_, + amount_, + data_ + ); } } @@ -134,31 +150,81 @@ contract L1ERC20TokenBridge is bytes memory data_ ) internal { if (isRebasableTokenFlow(l1Token_, l2Token_)) { - DepositData memory depositData = DepositData({ rate: uint96(L1_TOKEN_NON_REBASABLE_ADAPTER.tokenRate()), timestamp: uint40(block.timestamp), data: data_ }); - bytes memory encodedDepositData = encodeDepositData(depositData); if (amount_ == 0) { - _initiateERC20Deposit(l1Token_, l2Token_, msg.sender, to_, amount_, l2Gas_, encodedDepositData); + _initiateERC20Deposit( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + msg.sender, + to_, + 0, + l2Gas_, + encodedDepositData + ); + + emit ERC20DepositInitiated( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + msg.sender, + to_, + 0, + encodedDepositData + ); + return; } - // maybe loosing 1 wei for stETH. Check another method IERC20(L1_TOKEN_REBASABLE).safeTransferFrom(msg.sender, address(this), amount_); - if(!IERC20(L1_TOKEN_REBASABLE).approve(L1_TOKEN_NON_REBASABLE, amount_)) revert ErrorRebasableTokenApprove(); + if(!IERC20(L1_TOKEN_REBASABLE).approve(L1_TOKEN_NON_REBASABLE, amount_)) { + revert ErrorRebasableTokenApprove(); + } + uint256 nonRebasableTokenAmount = IERC20Wrapper(L1_TOKEN_NON_REBASABLE).wrap(amount_); - // when 1 wei wasnt't transfer, can this wrap be failed? - uint256 wstETHAmount = IERC20Wrapper(L1_TOKEN_NON_REBASABLE).wrap(amount_); - _initiateERC20Deposit(L1_TOKEN_REBASABLE, L2_TOKEN_REBASABLE, msg.sender, to_, wstETHAmount, l2Gas_, encodedDepositData); + _initiateERC20Deposit( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + msg.sender, + to_, + nonRebasableTokenAmount, + l2Gas_, + encodedDepositData + ); + emit ERC20DepositInitiated( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + msg.sender, + to_, + amount_, + encodedDepositData + ); } else if (isNonRebasableTokenFlow(l1Token_, l2Token_)) { IERC20(L1_TOKEN_NON_REBASABLE).safeTransferFrom(msg.sender, address(this), amount_); - _initiateERC20Deposit(L1_TOKEN_NON_REBASABLE, L2_TOKEN_NON_REBASABLE, msg.sender, to_, amount_, l2Gas_, data_); + + _initiateERC20Deposit( + L1_TOKEN_NON_REBASABLE, + L2_TOKEN_NON_REBASABLE, + msg.sender, + to_, + amount_, + l2Gas_, + data_ + ); + + emit ERC20DepositInitiated( + L1_TOKEN_NON_REBASABLE, + L2_TOKEN_NON_REBASABLE, + msg.sender, + to_, + amount_, + data_ + ); } } @@ -180,7 +246,6 @@ contract L1ERC20TokenBridge is uint32 l2Gas_, bytes memory data_ ) internal { - bytes memory message = abi.encodeWithSelector( IL2ERC20Bridge.finalizeDeposit.selector, l1Token_, @@ -192,15 +257,6 @@ contract L1ERC20TokenBridge is ); sendCrossDomainMessage(L2_TOKEN_BRIDGE, l2Gas_, message); - - emit ERC20DepositInitiated( - l1Token_, - l2Token_, - from_, - to_, - amount_, - data_ - ); } error ErrorSenderNotEOA(); diff --git a/contracts/optimism/L2ERC20TokenBridge.sol b/contracts/optimism/L2ERC20TokenBridge.sol index ae195718..cb8cc58f 100644 --- a/contracts/optimism/L2ERC20TokenBridge.sol +++ b/contracts/optimism/L2ERC20TokenBridge.sol @@ -97,12 +97,28 @@ contract L2ERC20TokenBridge is DepositData memory depositData = decodeDepositData(data_); ITokenRateOracle tokenRateOracle = ERC20Rebasable(L2_TOKEN_REBASABLE).TOKEN_RATE_ORACLE(); tokenRateOracle.updateRate(depositData.rate, depositData.timestamp); + ERC20Rebasable(L2_TOKEN_REBASABLE).mintShares(to_, amount_); + uint256 rebasableTokenAmount = ERC20Rebasable(L2_TOKEN_REBASABLE).getTokensByShares(amount_); - emit DepositFinalized(l1Token_, l2Token_, from_, to_, rebasableTokenAmount, depositData.data); + emit DepositFinalized( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + from_, + to_, + rebasableTokenAmount, + depositData.data + ); } else if (isNonRebasableTokenFlow(l1Token_, l2Token_)) { IERC20Bridged(L2_TOKEN_NON_REBASABLE).bridgeMint(to_, amount_); - emit DepositFinalized(l1Token_, l2Token_, from_, to_, amount_, data_); + emit DepositFinalized( + L1_TOKEN_NON_REBASABLE, + L2_TOKEN_NON_REBASABLE, + from_, + to_, + amount_, + data_ + ); } } @@ -114,19 +130,46 @@ contract L2ERC20TokenBridge is bytes calldata data_ ) internal { if (l2Token_ == L2_TOKEN_REBASABLE) { - - // TODO: maybe loosing 1 wei here as well uint256 shares = ERC20Rebasable(L2_TOKEN_REBASABLE).getSharesByTokens(amount_); ERC20Rebasable(L2_TOKEN_REBASABLE).burnShares(msg.sender, shares); - _initiateWithdrawal(L1_TOKEN_REBASABLE, L2_TOKEN_REBASABLE, msg.sender, to_, shares, l1Gas_, data_); - emit WithdrawalInitiated(L1_TOKEN_REBASABLE, L2_TOKEN_REBASABLE, msg.sender, to_, amount_, data_); + _initiateWithdrawal( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + msg.sender, + to_, + shares, + l1Gas_, + data_ + ); + emit WithdrawalInitiated( + L1_TOKEN_REBASABLE, + L2_TOKEN_REBASABLE, + msg.sender, + to_, + amount_, + data_ + ); } else if (l2Token_ == L2_TOKEN_NON_REBASABLE) { - IERC20Bridged(L2_TOKEN_NON_REBASABLE).bridgeBurn(msg.sender, amount_); - _initiateWithdrawal(L1_TOKEN_NON_REBASABLE, L2_TOKEN_NON_REBASABLE, msg.sender, to_, amount_, l1Gas_, data_); - emit WithdrawalInitiated(L1_TOKEN_NON_REBASABLE, L2_TOKEN_NON_REBASABLE, msg.sender, to_, amount_, data_); + _initiateWithdrawal( + L1_TOKEN_NON_REBASABLE, + L2_TOKEN_NON_REBASABLE, + msg.sender, + to_, + amount_, + l1Gas_, + data_ + ); + emit WithdrawalInitiated( + L1_TOKEN_NON_REBASABLE, + L2_TOKEN_NON_REBASABLE, + msg.sender, + to_, + amount_, + data_ + ); } } @@ -148,7 +191,6 @@ contract L2ERC20TokenBridge is uint32 l1Gas_, bytes memory data_ ) internal { - bytes memory message = abi.encodeWithSelector( IL1ERC20Bridge.finalizeERC20Withdrawal.selector, l1Token_, diff --git a/test/optimism/L1ERC20TokenBridge.unit.test.ts b/test/optimism/L1ERC20TokenBridge.unit.test.ts index 05236679..e89ecc8e 100644 --- a/test/optimism/L1ERC20TokenBridge.unit.test.ts +++ b/test/optimism/L1ERC20TokenBridge.unit.test.ts @@ -222,7 +222,7 @@ unit("Optimism :: L1ERC20TokenBridge", ctxFactory) l2TokenRebasable.address, deployer.address, deployer.address, - amountWrapped, + amount, dataToReceive, ]); @@ -474,8 +474,8 @@ unit("Optimism :: L1ERC20TokenBridge", ctxFactory) const bridgeBalanceBefore = await l1TokenNonRebasable.balanceOf(l1TokenBridge.address); const tx = await l1TokenBridge.depositERC20To( - l1TokenRebasable.address, - l2TokenRebasable.address, + l1TokenRebasable.address, + l2TokenRebasable.address, recipient.address, amount, l2Gas, @@ -490,7 +490,7 @@ unit("Optimism :: L1ERC20TokenBridge", ctxFactory) l2TokenRebasable.address, deployer.address, recipient.address, - amountWrapped, + amount, dataToReceive, ]); @@ -790,7 +790,7 @@ unit("Optimism :: L1ERC20TokenBridge", ctxFactory) l2TokenRebasable.address, deployer.address, recipient.address, - amount, + amountUnwrapped, data, ]); diff --git a/test/optimism/bridging-rebase.integration.test.ts b/test/optimism/bridging-rebase.integration.test.ts index 757f6188..1ec08c0a 100644 --- a/test/optimism/bridging-rebase.integration.test.ts +++ b/test/optimism/bridging-rebase.integration.test.ts @@ -359,7 +359,7 @@ scenario("Optimism :: Bridging integration test", ctxFactory) l2TokenRebasable.address, tokenHolderA.address, tokenHolderA.address, - depositAmountNonRebasable, + depositAmountRebasable, dataToSend, ]); @@ -546,7 +546,7 @@ scenario("Optimism :: Bridging integration test", ctxFactory) l2TokenRebasable.address, tokenHolderA.address, tokenHolderA.address, - withdrawalAmountNonRebasable, + withdrawalAmountRebasable, "0x", ]); @@ -609,7 +609,7 @@ scenario("Optimism :: Bridging integration test", ctxFactory) l2TokenRebasable.address, tokenHolderA.address, tokenHolderB.address, - depositAmountNonRebasable, + depositAmountRebasable, dataToSend, ]); @@ -813,7 +813,7 @@ scenario("Optimism :: Bridging integration test", ctxFactory) l2TokenRebasable.address, tokenHolderB.address, tokenHolderA.address, - withdrawalAmountNonRebasable, + withdrawalAmountRebasable, "0x", ]);