mirror of
https://github.com/Instadapp/InstaContract.git
synced 2024-07-29 22:47:45 +00:00
106 lines
2.6 KiB
Solidity
106 lines
2.6 KiB
Solidity
pragma solidity ^0.4.24;
|
|
|
|
interface IERC20 {
|
|
function balanceOf(address who) external view returns (uint256);
|
|
// function transfer(address to, uint256 value) external returns (bool);
|
|
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 {}
|
|
|
|
} |