InstaContract/contracts/v2/DAI2ETH.sol
2019-01-27 04:59:17 +05:30

105 lines
2.5 KiB
Solidity

pragma solidity ^0.4.24;
interface IERC20 {
function balanceOf(address who) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
}
interface AddressRegistry {
function getAddr(string name) external view returns(address);
}
interface Kyber {
function trade(
address src,
uint srcAmount,
address dest,
address destAddress,
uint maxDestAmount,
uint minConversionRate,
address walletId
) external payable returns (uint);
function getExpectedRate(
address src,
address dest,
uint srcQty
) external view returns (uint, uint);
}
contract Registry {
address public addressRegistry;
modifier onlyAdmin() {
require(
msg.sender == getAddress("admin"),
"Permission Denied"
);
_;
}
function getAddress(string name) internal view returns(address) {
AddressRegistry addrReg = AddressRegistry(addressRegistry);
return addrReg.getAddr(name);
}
}
contract Trade is Registry {
event KyberTrade(
address src,
uint srcAmt,
address dest,
uint destAmt,
address beneficiary,
uint minConversionRate,
address affiliate
);
function approveDAIKyber() public {
IERC20 tokenFunctions = IERC20(getAddress("dai"));
tokenFunctions.approve(getAddress("kyber"), 2**255);
}
function expectedETH(uint srcDAI) public view returns (uint, uint) {
Kyber kyberFunctions = Kyber(getAddress("kyber"));
return kyberFunctions.getExpectedRate(getAddress("dai"), getAddress("eth"), srcDAI);
}
function dai2eth(uint srcDAI) public payable returns (uint destAmt) {
address src = getAddress("dai");
address dest = getAddress("eth");
uint minConversionRate;
(, minConversionRate) = expectedETH(srcDAI);
// Interacting with Kyber Proxy Contract
Kyber kyberFunctions = Kyber(getAddress("kyber"));
destAmt = kyberFunctions.trade.value(msg.value)(
src,
srcDAI,
dest,
msg.sender,
2**255,
minConversionRate,
getAddress("admin")
);
emit KyberTrade(
src, srcDAI, dest, destAmt, msg.sender, minConversionRate, getAddress("admin")
);
}
}
contract DAI2ETH is Trade {
constructor(address rAddr) public {
addressRegistry = rAddr;
approveDAIKyber();
}
function () public payable {}
}