mirror of
				https://github.com/Instadapp/smart-contract.git
				synced 2024-07-29 22:08:07 +00:00 
			
		
		
		
	kyber.sol completed
This commit is contained in:
		
							parent
							
								
									a3938aec80
								
							
						
					
					
						commit
						05a5349b64
					
				|  | @ -40,7 +40,7 @@ interface UniswapExchange { | ||||||
|     function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256  tokens_bought); |     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); |     function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256  eth_sold); | ||||||
|     // Trade ERC20 to ETH |     // 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); |     function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256  tokens_sold); | ||||||
|     // Trade ERC20 to ERC20 |     // 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); |     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); | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ import "./safemath.sol"; | ||||||
| 
 | 
 | ||||||
| interface IERC20 { | interface IERC20 { | ||||||
|     function balanceOf(address who) external view returns (uint256); |     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 transfer(address to, uint256 value) external returns (bool); | ||||||
|     function approve(address spender, 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); |     function transferFrom(address from, address to, uint256 value) external returns (bool); | ||||||
|  | @ -34,12 +35,7 @@ contract Registry { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | contract helper is 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); |  | ||||||
| 
 | 
 | ||||||
|     function _getToken( |     function _getToken( | ||||||
|         address trader, |         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) { |     function getExpectedRateKyber(address src, address dest, uint srcAmt) public view returns (uint, uint) { | ||||||
|         Kyber kyberFunctions = Kyber(_getAddress("kyber")); |         Kyber kyberFunctions = Kyber(_getAddress("kyber")); | ||||||
|         return kyberFunctions.getExpectedRate(src, dest, srcAmt); |         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 |      * @title Kyber's trade when token to sell Amount fixed | ||||||
|  | @ -95,6 +115,10 @@ contract Trade is Registry { | ||||||
|             eth |             eth | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|  |         if (src != eth) { | ||||||
|  |             _allowanceApproveKyber(src); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         // Interacting with Kyber Proxy Contract |         // Interacting with Kyber Proxy Contract | ||||||
|         Kyber kyberFunctions = Kyber(_getAddress("kyber")); |         Kyber kyberFunctions = Kyber(_getAddress("kyber")); | ||||||
|         tokensBought = kyberFunctions.trade.value(ethQty)( |         tokensBought = kyberFunctions.trade.value(ethQty)( | ||||||
|  | @ -117,6 +141,7 @@ contract Trade is Registry { | ||||||
|         address dest, // token to buy |         address dest, // token to buy | ||||||
|         uint destAmt // minimum slippage rate |         uint destAmt // minimum slippage rate | ||||||
|     ) public payable returns (uint tokensBought) { |     ) public payable returns (uint tokensBought) { | ||||||
|  | 
 | ||||||
|         address eth = _getAddress("eth"); |         address eth = _getAddress("eth"); | ||||||
|         uint ethQty = _getToken( |         uint ethQty = _getToken( | ||||||
|             msg.sender, |             msg.sender, | ||||||
|  | @ -125,6 +150,10 @@ contract Trade is Registry { | ||||||
|             eth |             eth | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|  |         if (src != eth) { | ||||||
|  |             _allowanceApproveKyber(src); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         // Interacting with Kyber Proxy Contract |         // Interacting with Kyber Proxy Contract | ||||||
|         Kyber kyberFunctions = Kyber(_getAddress("kyber")); |         Kyber kyberFunctions = Kyber(_getAddress("kyber")); | ||||||
|         tokensBought = kyberFunctions.trade.value(ethQty)( |         tokensBought = kyberFunctions.trade.value(ethQty)( | ||||||
|  | @ -133,7 +162,7 @@ contract Trade is Registry { | ||||||
|             dest, |             dest, | ||||||
|             msg.sender, |             msg.sender, | ||||||
|             destAmt, |             destAmt, | ||||||
|             destAmt, |             destAmt - 1, | ||||||
|             _getAddress("admin") |             _getAddress("admin") | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|  | @ -157,6 +186,7 @@ contract Trade is Registry { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| contract InstaKyber is Trade { | contract InstaKyber is Trade { | ||||||
|  | 
 | ||||||
|     constructor(address rAddr) public { |     constructor(address rAddr) public { | ||||||
|         addressRegistry = rAddr; |         addressRegistry = rAddr; | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Samyak
						Samyak