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

View File

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