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