diff --git a/contracts/mainnet/connectors/socket/events.sol b/contracts/mainnet/connectors/socket/events.sol index 5669be85..2e35e168 100644 --- a/contracts/mainnet/connectors/socket/events.sol +++ b/contracts/mainnet/connectors/socket/events.sol @@ -3,11 +3,11 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; contract Events { - event LogSocketBridge ( - address token, - uint256 amount, - uint256 sourceChain, - uint256 targetChain, - address recipient - ); -} \ No newline at end of file + event LogSocketBridge( + address token, + uint256 amount, + uint256 sourceChain, + uint256 targetChain, + address recipient + ); +} diff --git a/contracts/mainnet/connectors/socket/helpers.sol b/contracts/mainnet/connectors/socket/helpers.sol new file mode 100644 index 00000000..066620fd --- /dev/null +++ b/contracts/mainnet/connectors/socket/helpers.sol @@ -0,0 +1,33 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.6; +pragma experimental ABIEncoderV2; + +import "./interface.sol"; +import { Basic } from "../../common/basic.sol"; +import { TokenInterface } from "../../common/interfaces.sol"; + +contract Helpers is Basic { + address internal immutable registry = + 0xc30141B657f4216252dc59Af2e7CdB9D8792e1B0; + + function _socketBridge(bytes memory _txData, uint256 _nativeTokenAmt) + internal + returns (bool _success) + { + (_success, ) = registry.call{ value: _nativeTokenAmt }(_txData); + } + + /** + * @dev Gets Allowance target from registry. + * @param _route route number + */ + function getAllowanceTarget(uint256 _route) + internal + view + returns (address _allowanceTarget) + { + RouteData memory data = ISocketRegistry(registry).routes(_route); + _allowanceTarget = data.route; + require(_allowanceTarget != address(0), "allowanceTarget-not-valid"); + } +} diff --git a/contracts/mainnet/connectors/socket/interface.sol b/contracts/mainnet/connectors/socket/interface.sol index 4c9de510..94884556 100644 --- a/contracts/mainnet/connectors/socket/interface.sol +++ b/contracts/mainnet/connectors/socket/interface.sol @@ -2,13 +2,12 @@ pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; -interface ISocketRegistry { - - struct RouteData { - address route; - bool isEnabled; - bool isMiddleware; - } - - function routes(uint256) external view returns(RouteData memory); +struct RouteData { + address route; + bool isEnabled; + bool isMiddleware; +} + +interface ISocketRegistry { + function routes(uint256) external view returns (RouteData memory); } diff --git a/contracts/mainnet/connectors/socket/main.sol b/contracts/mainnet/connectors/socket/main.sol index ed0c6f45..a062b6f0 100644 --- a/contracts/mainnet/connectors/socket/main.sol +++ b/contracts/mainnet/connectors/socket/main.sol @@ -7,46 +7,10 @@ pragma experimental ABIEncoderV2; * @dev Multi-chain Bridge Aggregator. */ -import { Basic } from "../../common/basic.sol"; -import { TokenInterface } from "../../common/interfaces.sol"; import "./events.sol"; -import "./interface.sol"; +import "./helpers.sol"; -abstract contract SocketConnectorBridge is Basic { - address constant registry = 0xc30141B657f4216252dc59Af2e7CdB9D8792e1B0; - - /** - * @dev socket API bridge handler - * @param _txData - contains data returned from socket build-tx API. Struct defined in interfaces.sol - * @param _ethAmt - Eth to bridge for .value() - */ - function socketBridge(bytes memory _txData, uint256 _ethAmt) - internal - returns (bool _success) - { - (_success, ) = registry.call{ value: _ethAmt }(_txData); - require(_success, "Socket-swap-failed"); - } -} - -abstract contract SocketConnectorResolver is SocketConnectorBridge { - /** - * @dev Gets Allowance target from registry. - * @param _route route number - */ - function getAllowanceTarget(uint256 _route) - internal - view - returns (address _allowanceTarget) - { - ISocketRegistry.RouteData memory data = ISocketRegistry(registry) - .routes(_route); - require(data.route != address(0), "allowanceTarget-not-valid"); - return data.route; - } -} - -abstract contract SocketConnector is SocketConnectorResolver { +abstract contract SocketResolver is Helpers { /** * @dev Bridge Token. * @notice Bridge Token on Socket. @@ -69,16 +33,22 @@ abstract contract SocketConnector is SocketConnectorResolver { payable returns (string memory _eventName, bytes memory _eventParam) { - uint256 _ethAmt; + bool isNative = _token == ethAddr; + uint256 nativeTokenAmt; - if (_token == ethAddr) { - _ethAmt = _amount; + if (isNative) { + _amount = _amount == uint256(-1) ? address(this).balance : _amount; + nativeTokenAmt = _amount; } else { - TokenInterface _tokenContract = TokenInterface(_token); - _tokenContract.approve(getAllowanceTarget(_route), _amount); + TokenInterface tokenContract = TokenInterface(_token); + + _amount = _amount == uint256(-1) + ? tokenContract.balanceOf(address(this)) + : _amount; + tokenContract.approve(getAllowanceTarget(_route), _amount); } - socketBridge(_txData, _ethAmt); + require(_socketBridge(_txData, nativeTokenAmt), "Socket-swap-failed"); uint256 _sourceChain; assembly { @@ -96,6 +66,6 @@ abstract contract SocketConnector is SocketConnectorResolver { } } -contract ConnectV2Socket is SocketConnector { +contract ConnectV2Socket is SocketResolver { string public constant name = "Socket-v1.0"; }