From 05a5349b6445f5d62e28c1635fa364e9065f6416 Mon Sep 17 00:00:00 2001 From: Samyak Date: Sat, 23 Mar 2019 00:47:59 +0530 Subject: [PATCH] kyber.sol completed --- contracts/ProxyLogics/dex.sol | 2 +- contracts/ProxyLogics/kyber.sol | 58 +++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/contracts/ProxyLogics/dex.sol b/contracts/ProxyLogics/dex.sol index 8590cbb..f205ec4 100644 --- a/contracts/ProxyLogics/dex.sol +++ b/contracts/ProxyLogics/dex.sol @@ -40,7 +40,7 @@ interface UniswapExchange { function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256 tokens_bought); function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256 eth_sold); // Trade ERC20 to ETH - function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_tokens, uint256 deadline, address recipient) external returns (uint256 eth_bought); + function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256 eth_bought); function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256 tokens_sold); // Trade ERC20 to ERC20 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); diff --git a/contracts/ProxyLogics/kyber.sol b/contracts/ProxyLogics/kyber.sol index cfb1530..70ac403 100644 --- a/contracts/ProxyLogics/kyber.sol +++ b/contracts/ProxyLogics/kyber.sol @@ -5,6 +5,7 @@ import "./safemath.sol"; interface IERC20 { function balanceOf(address who) external view returns (uint256); + function allowance(address _owner, address _spender) 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); @@ -34,12 +35,7 @@ contract Registry { } } - -contract Trade is Registry { - - using SafeMath for uint; - - event KyberTrade(address src, uint srcAmt, address dest, uint destAmt, address beneficiary, uint minConversionRate, address affiliate); +contract helper is Registry { function _getToken( address trader, @@ -60,19 +56,43 @@ contract Trade is Registry { } } + // approve to Kyber Proxy contract + function _approveKyber(address token) internal returns (bool) { + address kyberProxy = _getAddress("kyber"); + IERC20 tokenFunctions = IERC20(token); + return tokenFunctions.approve(kyberProxy, uint(0-1)); + } + + // Check Allowance to Kyber Proxy contract + function _allowanceKyber(address token) internal view returns (uint) { + address kyberProxy = _getAddress("kyber"); + IERC20 tokenFunctions = IERC20(token); + return tokenFunctions.allowance(address(this), kyberProxy); + } + + // Check allowance, if not approve + function _allowanceApproveKyber(address token) internal returns (bool) { + uint allowanceGiven = _allowanceKyber(token); + if (allowanceGiven == 0) { + return _approveKyber(token); + } else { + return true; + } + } +} + + +contract Trade is helper { + + using SafeMath for uint; + + event KyberTrade(address src, uint srcAmt, address dest, uint destAmt, address beneficiary, uint minConversionRate, address affiliate); function getExpectedRateKyber(address src, address dest, uint srcAmt) public view returns (uint, uint) { Kyber kyberFunctions = Kyber(_getAddress("kyber")); return kyberFunctions.getExpectedRate(src, dest, srcAmt); } - function approveKyber(address[] memory tokenArr) public { - address kyberProxy = _getAddress("kyber"); - for (uint i = 0; i < tokenArr.length; i++) { - IERC20 tokenFunctions = IERC20(tokenArr[i]); - tokenFunctions.approve(kyberProxy, 2 ** 256 - 1); - } - } /** * @title Kyber's trade when token to sell Amount fixed @@ -95,6 +115,10 @@ contract Trade is Registry { eth ); + if (src != eth) { + _allowanceApproveKyber(src); + } + // Interacting with Kyber Proxy Contract Kyber kyberFunctions = Kyber(_getAddress("kyber")); tokensBought = kyberFunctions.trade.value(ethQty)( @@ -117,6 +141,7 @@ contract Trade is Registry { address dest, // token to buy uint destAmt // minimum slippage rate ) public payable returns (uint tokensBought) { + address eth = _getAddress("eth"); uint ethQty = _getToken( msg.sender, @@ -125,6 +150,10 @@ contract Trade is Registry { eth ); + if (src != eth) { + _allowanceApproveKyber(src); + } + // Interacting with Kyber Proxy Contract Kyber kyberFunctions = Kyber(_getAddress("kyber")); tokensBought = kyberFunctions.trade.value(ethQty)( @@ -133,7 +162,7 @@ contract Trade is Registry { dest, msg.sender, destAmt, - destAmt, + destAmt - 1, _getAddress("admin") ); @@ -157,6 +186,7 @@ contract Trade is Registry { contract InstaKyber is Trade { + constructor(address rAddr) public { addressRegistry = rAddr; }