diff --git a/contracts/ProxyLogics/kyber.sol b/contracts/ProxyLogics/kyber.sol index 80c705e..47709a1 100644 --- a/contracts/ProxyLogics/kyber.sol +++ b/contracts/ProxyLogics/kyber.sol @@ -1,23 +1,7 @@ pragma solidity 0.5.0; -library SafeMath { - function mul(uint256 a, uint256 b) internal pure returns (uint256) { - if (a == 0) { - return 0; - } - uint256 c = a * b; - require(c / a == b, "Assertion Failed"); - return c; - } - - function div(uint256 a, uint256 b) internal pure returns (uint256) { - require(b > 0, "Assertion Failed"); - uint256 c = a / b; - return c; - } - -} +import "./safemath.sol"; interface IERC20 { function balanceOf(address who) external view returns (uint256); @@ -60,8 +44,8 @@ contract Registry { contract Trade is Registry { + using SafeMath for uint; - using SafeMath for uint256; event KyberTrade(address src, uint srcAmt, address dest, uint destAmt, address beneficiary, uint minConversionRate, address affiliate); diff --git a/contracts/ProxyLogics/safemath.sol b/contracts/ProxyLogics/safemath.sol new file mode 100644 index 0000000..e641f10 --- /dev/null +++ b/contracts/ProxyLogics/safemath.sol @@ -0,0 +1,32 @@ +pragma solidity 0.5.0; + + +library SafeMath { + + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + if (a == 0) { + return 0; + } + uint256 c = a * b; + require(c / a == b, "Assertion Failed"); + return c; + } + + function div(uint256 a, uint256 b) internal pure returns (uint256) { + require(b > 0, "Assertion Failed"); + uint256 c = a / b; + return c; + } + + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + assert(b <= a); + return a - b; + } + + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + assert(c >= a); + return c; + } + +} diff --git a/contracts/ProxyLogics/uniswap.sol b/contracts/ProxyLogics/uniswap.sol new file mode 100644 index 0000000..651cd60 --- /dev/null +++ b/contracts/ProxyLogics/uniswap.sol @@ -0,0 +1,74 @@ +pragma solidity 0.5.0; + + +import "./safemath.sol"; + +interface IERC20 { + function balanceOf(address who) external view returns (uint256); + function transfer(address to, uint256 value) external returns (bool); + function approve(address spender, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); +} + +interface AddressRegistry { + function getAddr(string calldata name) external view returns (address); +} + +interface UniswapFactoryInterface { + // Get Exchange and Token Info + function getExchange(address token) external view returns (address exchange); + function getToken(address exchange) external view returns (address token); +} + +// Solidity Interface +interface UniswapExchange { + // Address of ERC20 token sold on this exchange + function tokenAddress() external view returns (address token); + // Address of Uniswap Factory + function factoryAddress() external view returns (address factory); + // Get Prices + function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought); + function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold); + function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought); + function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold); + // Trade ETH to ERC20 + function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought); + function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256 tokens_bought); + function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256 eth_sold); + function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256 eth_sold); + // Trade ERC20 to ETH + function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256 eth_bought); + function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_tokens, uint256 deadline, address recipient) external returns (uint256 eth_bought); + function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256 tokens_sold); + function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256 tokens_sold); + // Trade ERC20 to ERC20 + function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256 tokens_bought); + function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_bought); + function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256 tokens_sold); + function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_sold); + // Trade ERC20 to Custom Pool + function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256 tokens_bought); + function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_bought); + function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256 tokens_sold); + function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_sold); +} + + +contract Registry { + address public addressRegistry; + modifier onlyAdmin() { + require(msg.sender == getAddress("admin"), "Permission Denied"); + _; + } + function getAddress(string memory name) internal view returns (address) { + AddressRegistry addrReg = AddressRegistry(addressRegistry); + return addrReg.getAddr(name); + } + +} + +contract Trade is Registry { + + using SafeMath for uint; + +} \ No newline at end of file diff --git a/contracts/ProxyLogics/uniswapPool.sol b/contracts/ProxyLogics/uniswapPool.sol new file mode 100644 index 0000000..ece65bd --- /dev/null +++ b/contracts/ProxyLogics/uniswapPool.sol @@ -0,0 +1,29 @@ +pragma solidity 0.5.0; + + +interface UniswapFactoryInterface { + // Get Exchange and Token Info + function getExchange(address token) external view returns (address exchange); + function getToken(address exchange) external view returns (address token); +} + +// Solidity Interface + +interface UniswapPool { + // Address of ERC20 token sold on this exchange + function tokenAddress() external view returns (address token); + // Address of Uniswap Factory + function factoryAddress() external view returns (address factory); + // Provide Liquidity + function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256); + function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256); + // ERC20 comaptibility for liquidity tokens + function name() external returns (bytes32); + function symbol() external returns (bytes32); + function decimals() external returns (uint256); + function transfer(address _to, uint256 _value) external returns (bool); + function transferFrom(address _from, address _to, uint256 value) external returns (bool); + function approve(address _spender, uint256 _value) external returns (bool); + function allowance(address _owner, address _spender) external view returns (uint256); + function balanceOf(address _owner) external view returns (uint256); +}