kyber.sol completed

This commit is contained in:
Samyak 2019-03-23 00:47:59 +05:30
parent a3938aec80
commit 05a5349b64
2 changed files with 45 additions and 15 deletions

View File

@ -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);

View File

@ -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;
}