diff --git a/contracts/v2/DAI2ETH.sol b/contracts/v2/DAI2ETH.sol index e69de29..59f088f 100644 --- a/contracts/v2/DAI2ETH.sol +++ b/contracts/v2/DAI2ETH.sol @@ -0,0 +1,106 @@ +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 {} + +} \ No newline at end of file diff --git a/contracts/v2/LeverageCDP.sol b/contracts/v2/LeverageCDP.sol index 7080dd8..aa323cd 100644 --- a/contracts/v2/LeverageCDP.sol +++ b/contracts/v2/LeverageCDP.sol @@ -1,5 +1,6 @@ pragma solidity 0.4.24; + library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { @@ -52,7 +53,6 @@ interface Swap { contract Registry { - address public addressRegistry; modifier onlyAdmin() { require( @@ -61,12 +61,10 @@ contract Registry { ); _; } - function getAddress(string name) internal view returns(address) { AddressRegistry addrReg = AddressRegistry(addressRegistry); return addrReg.getAddr(name); } - }