mirror of
https://github.com/Instadapp/InstaContract.git
synced 2024-07-29 22:47:45 +00:00
Restructured kyber integration code.
This commit is contained in:
parent
3ac321bace
commit
7b65b2c384
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
> Smart Contracts powering Moat Fund
|
> Smart Contracts powering Moat Fund
|
||||||
|
|
||||||
### Show some :heart:
|
### Support
|
||||||
[](https://github.com/MoatNetwork/MoatContract) [](https://github.com/MoatNetwork/MoatContract/fork) [](https://github.com/MoatNetwork/MoatContract) [](https://github.com/MoatNetwork/MoatContract)
|
[](https://github.com/MoatNetwork/MoatContract) [](https://github.com/MoatNetwork/MoatContract/fork) [](https://github.com/MoatNetwork/MoatContract) [](https://github.com/MoatNetwork/MoatContract)
|
||||||
|
|
||||||
## This project uses:
|
## This project uses:
|
||||||
|
|
|
@ -4,7 +4,7 @@ pragma solidity ^0.4.24;
|
||||||
contract AddressRegistry {
|
contract AddressRegistry {
|
||||||
|
|
||||||
event AddressSet(string name, address addr);
|
event AddressSet(string name, address addr);
|
||||||
mapping(bytes32 => address) public registry;
|
mapping(bytes32 => address) registry;
|
||||||
|
|
||||||
constructor() public {
|
constructor() public {
|
||||||
registry[keccak256(abi.encodePacked("admin"))] = msg.sender;
|
registry[keccak256(abi.encodePacked("admin"))] = msg.sender;
|
||||||
|
|
|
@ -1,7 +1,37 @@
|
||||||
pragma solidity ^0.4.24;
|
pragma solidity ^0.4.24;
|
||||||
|
|
||||||
import "openzeppelin-solidity/contracts/math/SafeMath.sol";
|
// import "openzeppelin-solidity/contracts/math/SafeMath.sol";
|
||||||
import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
|
// import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
|
||||||
|
|
||||||
|
interface IERC20 {
|
||||||
|
function totalSupply() 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 approve(address spender, uint256 value)
|
||||||
|
external returns (bool);
|
||||||
|
|
||||||
|
function transferFrom(address from, address to, uint256 value)
|
||||||
|
external returns (bool);
|
||||||
|
|
||||||
|
event Transfer(
|
||||||
|
address indexed from,
|
||||||
|
address indexed to,
|
||||||
|
uint256 value
|
||||||
|
);
|
||||||
|
|
||||||
|
event Approval(
|
||||||
|
address indexed owner,
|
||||||
|
address indexed spender,
|
||||||
|
uint256 value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
interface AddressRegistry {
|
interface AddressRegistry {
|
||||||
|
@ -18,6 +48,12 @@ interface Kyber {
|
||||||
uint minConversionRate,
|
uint minConversionRate,
|
||||||
address walletId
|
address walletId
|
||||||
) external payable returns (uint);
|
) external payable returns (uint);
|
||||||
|
|
||||||
|
function getExpectedRate(
|
||||||
|
address src,
|
||||||
|
address dest,
|
||||||
|
uint srcQty
|
||||||
|
) external view returns (uint, uint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +68,7 @@ contract Registry {
|
||||||
_;
|
_;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAddress(string name) internal view returns(address addr) {
|
function getAddress(string name) internal view returns(address) {
|
||||||
AddressRegistry addrReg = AddressRegistry(addressRegistry);
|
AddressRegistry addrReg = AddressRegistry(addressRegistry);
|
||||||
return addrReg.getAddr(name);
|
return addrReg.getAddr(name);
|
||||||
}
|
}
|
||||||
|
@ -42,6 +78,9 @@ contract Registry {
|
||||||
|
|
||||||
contract Trade is Registry {
|
contract Trade is Registry {
|
||||||
|
|
||||||
|
// using SafeMath for uint;
|
||||||
|
// using SafeMath for uint256;
|
||||||
|
|
||||||
uint public fees;
|
uint public fees;
|
||||||
|
|
||||||
event KyberTrade(
|
event KyberTrade(
|
||||||
|
@ -50,35 +89,45 @@ contract Trade is Registry {
|
||||||
address dest,
|
address dest,
|
||||||
uint destAmt,
|
uint destAmt,
|
||||||
address beneficiary,
|
address beneficiary,
|
||||||
uint fees,
|
uint feecut,
|
||||||
uint slipRate,
|
uint minConversionRate,
|
||||||
address affiliate
|
address affiliate
|
||||||
);
|
);
|
||||||
|
|
||||||
// ropsten network
|
|
||||||
address public kyberAddr = 0x818E6FECD516Ecc3849DAf6845e3EC868087B755;
|
|
||||||
address public eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
|
|
||||||
|
|
||||||
function executeTrade(
|
function executeTrade(
|
||||||
address src,
|
address src,
|
||||||
address dest,
|
address dest,
|
||||||
uint srcAmt,
|
uint srcAmt,
|
||||||
uint slipRate
|
uint minConversionRate
|
||||||
) public payable returns (uint destAmt)
|
) public payable returns (uint destAmt)
|
||||||
{
|
{
|
||||||
|
address protocolAdmin = getAddress("admin");
|
||||||
|
uint sellQty = srcAmt;
|
||||||
|
uint feecut;
|
||||||
|
if (fees > 0) {
|
||||||
|
feecut = srcAmt / fees;
|
||||||
|
sellQty = srcAmt - feecut;
|
||||||
|
}
|
||||||
|
|
||||||
fetchToken(src, srcAmt);
|
// fetch token & deduct fees
|
||||||
uint feecut = deductFees(src, srcAmt);
|
IERC20 tokenFunctions = IERC20(src);
|
||||||
|
if (src == getAddress("eth")) {
|
||||||
|
require(msg.value == srcAmt, "Invalid Operation");
|
||||||
|
if (feecut > 0) {protocolAdmin.transfer(feecut);}
|
||||||
|
} else {
|
||||||
|
tokenFunctions.transferFrom(msg.sender, address(this), srcAmt);
|
||||||
|
if (feecut > 0) {tokenFunctions.transfer(protocolAdmin, feecut);}
|
||||||
|
}
|
||||||
|
|
||||||
Kyber kyberFunctions = Kyber(kyberAddr);
|
Kyber kyberFunctions = Kyber(getAddress("kyber"));
|
||||||
destAmt = kyberFunctions.trade.value(msg.value)(
|
destAmt = kyberFunctions.trade.value(sellQty)(
|
||||||
src,
|
src,
|
||||||
srcAmt - feecut,
|
sellQty,
|
||||||
dest,
|
dest,
|
||||||
msg.sender,
|
msg.sender,
|
||||||
2**256 - 1,
|
2**256 - 1,
|
||||||
slipRate,
|
minConversionRate,
|
||||||
getAddress("admin")
|
protocolAdmin
|
||||||
);
|
);
|
||||||
|
|
||||||
emit KyberTrade(
|
emit KyberTrade(
|
||||||
|
@ -88,32 +137,26 @@ contract Trade is Registry {
|
||||||
destAmt,
|
destAmt,
|
||||||
msg.sender,
|
msg.sender,
|
||||||
feecut,
|
feecut,
|
||||||
slipRate,
|
minConversionRate,
|
||||||
getAddress("admin")
|
protocolAdmin
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetchToken(address src, uint srcAmt) internal {
|
function getExpectedPrice(
|
||||||
if (src != eth) {
|
address src,
|
||||||
IERC20 tokenFunctions = IERC20(src);
|
address dest,
|
||||||
tokenFunctions.transferFrom(msg.sender, address(this), srcAmt);
|
uint srcAmt
|
||||||
}
|
) public view returns (uint, uint) {
|
||||||
|
Kyber kyberFunctions = Kyber(getAddress("kyber"));
|
||||||
|
return kyberFunctions.getExpectedRate(
|
||||||
|
src,
|
||||||
|
dest,
|
||||||
|
srcAmt
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function deductFees(address src, uint volume) internal returns(uint brokerage) {
|
function approveKyber(address[] tokenArr) public {
|
||||||
if (fees > 0) {
|
|
||||||
brokerage = volume / fees;
|
|
||||||
if (src == eth) {
|
|
||||||
getAddress("admin").transfer(brokerage);
|
|
||||||
} else {
|
|
||||||
IERC20 tokenFunctions = IERC20(src);
|
|
||||||
tokenFunctions.transfer(getAddress("admin"), brokerage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function allowKyber(address[] tokenArr) public {
|
|
||||||
for (uint i = 0; i < tokenArr.length; i++) {
|
for (uint i = 0; i < tokenArr.length; i++) {
|
||||||
IERC20 tokenFunctions = IERC20(tokenArr[i]);
|
IERC20 tokenFunctions = IERC20(tokenArr[i]);
|
||||||
tokenFunctions.approve(getAddress("kyber"), 2**256 - 1);
|
tokenFunctions.approve(getAddress("kyber"), 2**256 - 1);
|
||||||
|
@ -132,7 +175,7 @@ contract MoatKyber is Trade {
|
||||||
function () public payable {}
|
function () public payable {}
|
||||||
|
|
||||||
function collectAsset(address tokenAddress, uint amount) public onlyAdmin {
|
function collectAsset(address tokenAddress, uint amount) public onlyAdmin {
|
||||||
if (tokenAddress == eth) {
|
if (tokenAddress == getAddress("eth")) {
|
||||||
msg.sender.transfer(amount);
|
msg.sender.transfer(amount);
|
||||||
} else {
|
} else {
|
||||||
IERC20 tokenFunctions = IERC20(tokenAddress);
|
IERC20 tokenFunctions = IERC20(tokenAddress);
|
||||||
|
|
|
@ -20,6 +20,10 @@ interface MakerCDP {
|
||||||
function per() external view returns (uint ray);
|
function per() external view returns (uint ray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface PriceInterface {
|
||||||
|
function peek() public view returns (bytes32, bool);
|
||||||
|
}
|
||||||
|
|
||||||
interface WETHFace {
|
interface WETHFace {
|
||||||
function deposit() external payable;
|
function deposit() external payable;
|
||||||
function withdraw(uint wad) external;
|
function withdraw(uint wad) external;
|
||||||
|
@ -37,7 +41,7 @@ contract Registry {
|
||||||
_;
|
_;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAddress(string name) internal view returns(address addr) {
|
function getAddress(string name) internal view returns(address) {
|
||||||
AddressRegistry addrReg = AddressRegistry(addressRegistry);
|
AddressRegistry addrReg = AddressRegistry(addressRegistry);
|
||||||
return addrReg.getAddr(name);
|
return addrReg.getAddr(name);
|
||||||
}
|
}
|
||||||
|
@ -46,6 +50,10 @@ contract Registry {
|
||||||
|
|
||||||
|
|
||||||
contract GlobalVar is Registry {
|
contract GlobalVar is Registry {
|
||||||
|
|
||||||
|
using SafeMath for uint;
|
||||||
|
using SafeMath for uint256;
|
||||||
|
|
||||||
// kovan network
|
// kovan network
|
||||||
address public weth = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;
|
address public weth = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;
|
||||||
address public peth = 0xf4d791139cE033Ad35DB2B2201435fAd668B1b64;
|
address public peth = 0xf4d791139cE033Ad35DB2B2201435fAd668B1b64;
|
||||||
|
@ -53,6 +61,7 @@ contract GlobalVar is Registry {
|
||||||
address public dai = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
|
address public dai = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
|
||||||
address public eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
|
address public eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
|
||||||
|
|
||||||
|
address public pricefeed = 0xA944bd4b25C9F186A846fd5668941AA3d3B8425F;
|
||||||
address public cdpAddr = 0xa71937147b55Deb8a530C7229C442Fd3F31b7db2;
|
address public cdpAddr = 0xa71937147b55Deb8a530C7229C442Fd3F31b7db2;
|
||||||
MakerCDP loanMaster = MakerCDP(cdpAddr);
|
MakerCDP loanMaster = MakerCDP(cdpAddr);
|
||||||
|
|
||||||
|
@ -161,6 +170,15 @@ contract BorrowTasks is RepayLoan {
|
||||||
cdps[msg.sender] = blankCDP;
|
cdps[msg.sender] = blankCDP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getETHRate() public view returns (uint ethprice) {
|
||||||
|
PriceInterface ethRate = PriceInterface(pricefeed);
|
||||||
|
(ethprice, ) = uint(ethRate.peek()) / 10**18;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCDPID(address borrower) public view returns (uint) {
|
||||||
|
return uint(cdps[borrower]);
|
||||||
|
}
|
||||||
|
|
||||||
function approveERC20() public {
|
function approveERC20() public {
|
||||||
IERC20 wethTkn = IERC20(weth);
|
IERC20 wethTkn = IERC20(weth);
|
||||||
wethTkn.approve(cdpAddr, 2**256 - 1);
|
wethTkn.approve(cdpAddr, 2**256 - 1);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user