From 5e391cef819de94ef5806231bdaed5089a942074 Mon Sep 17 00:00:00 2001 From: Michael Zhou Date: Fri, 25 Mar 2022 19:09:46 +0800 Subject: [PATCH 1/2] Make burnFrom() callable from non-bridge addresses This makes it compatible with OpenZeppelin's burnFrom() if called by an address that is not a whitelisted bridge. --- contracts/pegged/tokens/MultiBridgeToken.sol | 16 +++++++++------- contracts/pegged/tokens/SingleBridgeToken.sol | 6 +++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/contracts/pegged/tokens/MultiBridgeToken.sol b/contracts/pegged/tokens/MultiBridgeToken.sol index cc1e6ff0a..cfe6d1800 100644 --- a/contracts/pegged/tokens/MultiBridgeToken.sol +++ b/contracts/pegged/tokens/MultiBridgeToken.sol @@ -51,7 +51,7 @@ contract MultiBridgeToken is ERC20, Ownable { } /** - * @notice Burns tokens from an address. Decreases total amount minted by the calling bridge. + * @notice Burns tokens from an address. Decreases total amount minted if called by a bridge. * Alternative to {burnFrom} for compatibility with some bridge implementations. * See {_burnFrom}. * @param _from The address to burn tokens from. @@ -62,7 +62,7 @@ contract MultiBridgeToken is ERC20, Ownable { } /** - * @notice Burns tokens from an address. Decreases total amount minted by the calling bridge. + * @notice Burns tokens from an address. Decreases total amount minted if called by a bridge. * See {_burnFrom}. * @param _from The address to burn tokens from. * @param _amount The amount to burn. @@ -72,16 +72,18 @@ contract MultiBridgeToken is ERC20, Ownable { } /** - * @dev Burns tokens from an address. Decreases total amount minted by the calling bridge. + * @dev Burns tokens from an address, deducting from the caller's allowance. Decreases total amount minted if called + * by a bridge. * @param _from The address to burn tokens from. * @param _amount The amount to burn. */ function _burnFrom(address _from, uint256 _amount) internal returns (bool) { Supply storage b = bridges[msg.sender]; - require(b.cap > 0, "invalid caller"); - require(b.total >= _amount, "exceeds bridge minted amount"); - unchecked { - b.total -= _amount; + if (b.cap > 0 || b.total > 0) { + require(b.total >= _amount, "exceeds bridge minted amount"); + unchecked { + b.total -= _amount; + } } _spendAllowance(_from, msg.sender, _amount); _burn(_from, _amount); diff --git a/contracts/pegged/tokens/SingleBridgeToken.sol b/contracts/pegged/tokens/SingleBridgeToken.sol index b74b78c51..a306b64a7 100644 --- a/contracts/pegged/tokens/SingleBridgeToken.sol +++ b/contracts/pegged/tokens/SingleBridgeToken.sol @@ -56,7 +56,7 @@ contract SingleBridgeToken is ERC20, Ownable { * @param _from The address to burn tokens from. * @param _amount The amount to burn. */ - function burn(address _from, uint256 _amount) external onlyBridge returns (bool) { + function burn(address _from, uint256 _amount) external returns (bool) { return _burnFrom(_from, _amount); } @@ -66,12 +66,12 @@ contract SingleBridgeToken is ERC20, Ownable { * @param _from The address to burn tokens from. * @param _amount The amount to burn. */ - function burnFrom(address _from, uint256 _amount) external onlyBridge returns (bool) { + function burnFrom(address _from, uint256 _amount) external returns (bool) { return _burnFrom(_from, _amount); } /** - * @dev Burns tokens from an address. + * @dev Burns tokens from an address, deducting from the caller's allowance. * @param _from The address to burn tokens from. * @param _amount The amount to burn. */ From 772ac0304d521857e1007b3ffe9f2daf5046005f Mon Sep 17 00:00:00 2001 From: Vladislav <81467635+grGred@users.noreply.github.com> Date: Fri, 25 Mar 2022 22:28:36 +0300 Subject: [PATCH 2/2] Add swap token to native, directSend fix --- contracts/message/apps/TransferSwap.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/message/apps/TransferSwap.sol b/contracts/message/apps/TransferSwap.sol index a3abe3c35..63288069b 100644 --- a/contracts/message/apps/TransferSwap.sol +++ b/contracts/message/apps/TransferSwap.sol @@ -111,7 +111,8 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp { SwapInfo calldata _srcSwap, SwapInfo calldata _dstSwap, uint32 _maxBridgeSlippage, - uint64 _nonce + uint64 _nonce, + bool _nativeOut ) external payable onlyEOA { IERC20(_srcSwap.path[0]).safeTransferFrom(msg.sender, address(this), _amountIn); _transferWithSwap( @@ -122,7 +123,7 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp { _dstSwap, _maxBridgeSlippage, _nonce, - false, + _nativeOut, msg.value ); } @@ -169,7 +170,7 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp { } if (_dstChainId == chainId) { - _directSend(_receiver, _amountIn, chainId, _srcSwap, _nonce, srcTokenOut, srcAmtOut); + _directSend(msg.sender, _amountIn, chainId, _srcSwap, _nonce, srcTokenOut, srcAmtOut); } else { _crossChainTransferWithSwap( _receiver,