Completed non tested MakerDAO integration (except Repay loan).

This commit is contained in:
Sowmayjain 2018-10-27 22:19:38 +05:30
parent ed5ef5e3d5
commit 3309ebb3ce
2 changed files with 78 additions and 38 deletions

View File

@ -11,6 +11,7 @@ interface token {
interface AddressRegistry { interface AddressRegistry {
function getAddr(string name) external returns(address); function getAddr(string name) external returns(address);
function isApprovedResolver(address user) external returns(bool);
} }
interface Resolver { interface Resolver {
@ -34,12 +35,17 @@ contract Registry {
address public registryAddress; address public registryAddress;
modifier onlyUserOrResolver(address trader) { modifier onlyUserOrResolver(address user) {
if (msg.sender != trader) { if (msg.sender != user) {
require( require(
msg.sender == getAddress("resolver"), msg.sender == getAddress("resolver"),
"Permission Denied" "Permission Denied"
); );
AddressRegistry aRegistry = AddressRegistry(registryAddress);
require(
aRegistry.isApprovedResolver(user),
"Resolver Not Approved"
);
} }
_; _;
} }
@ -75,6 +81,9 @@ contract Trade is Registry {
); );
address eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; address eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
// ropsten network
address kyberAddr = 0x818E6FECD516Ecc3849DAf6845e3EC868087B755;
function executeTrade( function executeTrade(
address trader, address trader,
@ -85,19 +94,15 @@ contract Trade is Registry {
) public payable onlyUserOrResolver(trader) returns (uint destAmt) ) public payable onlyUserOrResolver(trader) returns (uint destAmt)
{ {
if (src != eth) { fetchToken(trader, src, srcAmt);
token tokenFunctions = token(src);
tokenFunctions.transferFrom(msg.sender, address(this), srcAmt);
}
uint fees = deductFees(src, srcAmt); uint fees = deductFees(src, srcAmt);
Kyber kyberFunctions = Kyber(getAddress("kyber")); Kyber kyberFunctions = Kyber(kyberAddr);
destAmt = kyberFunctions.trade.value(msg.value)( destAmt = kyberFunctions.trade.value(msg.value)(
src, src,
srcAmt - fees, srcAmt - fees,
dest, dest,
msg.sender, trader,
2**256 - 1, 2**256 - 1,
slipRate, slipRate,
getAddress("admin") getAddress("admin")
@ -108,7 +113,7 @@ contract Trade is Registry {
srcAmt, srcAmt,
dest, dest,
destAmt, destAmt,
msg.sender, trader,
fees, fees,
slipRate, slipRate,
getAddress("admin") getAddress("admin")
@ -116,10 +121,18 @@ contract Trade is Registry {
} }
function deductFees(address src, uint volume) public returns(uint fees) { function fetchToken(address trader, address src, uint srcAmt) internal {
Resolver moatRes = Resolver(getAddress("kyber")); if (src != eth) {
fees = volume/moatRes.fees(); token tokenFunctions = token(src);
tokenFunctions.transferFrom(trader, address(this), srcAmt);
}
}
function deductFees(address src, uint volume) internal returns(uint fees) {
Resolver moatRes = Resolver(getAddress("resolver"));
fees = moatRes.fees();
if (fees > 0) { if (fees > 0) {
fees = volume / fees;
if (src == eth) { if (src == eth) {
getAddress("admin").transfer(fees); getAddress("admin").transfer(fees);
} else { } else {

View File

@ -15,6 +15,10 @@ interface AddressRegistry {
function isApprovedResolver(address user) external returns(bool); function isApprovedResolver(address user) external returns(bool);
} }
interface Resolver {
function fees() external returns(uint);
}
interface MakerCDP { interface MakerCDP {
function open() external returns (bytes32 cup); function open() external returns (bytes32 cup);
function join(uint wad) external; // Join PETH function join(uint wad) external; // Join PETH
@ -26,6 +30,7 @@ interface MakerCDP {
function wipe(bytes32 cup, uint wad) external; function wipe(bytes32 cup, uint wad) external;
function shut(bytes32 cup) external; function shut(bytes32 cup) external;
function bite(bytes32 cup) external; function bite(bytes32 cup) external;
function per() external returns (uint ray);
} }
interface WETHFace { interface WETHFace {
@ -37,7 +42,6 @@ interface WETHFace {
contract Registry { contract Registry {
address public registryAddress; address public registryAddress;
AddressRegistry aRegistry = AddressRegistry(registryAddress);
modifier onlyAdmin() { modifier onlyAdmin() {
require( require(
@ -47,7 +51,23 @@ contract Registry {
_; _;
} }
modifier onlyUserOrResolver(address user) {
if (msg.sender != user) {
require(
msg.sender == getAddress("resolver"),
"Permission Denied"
);
AddressRegistry aRegistry = AddressRegistry(registryAddress);
require(
aRegistry.isApprovedResolver(user),
"Resolver Not Approved"
);
}
_;
}
function getAddress(string name) internal view returns(address addr) { function getAddress(string name) internal view returns(address addr) {
AddressRegistry aRegistry = AddressRegistry(registryAddress);
addr = aRegistry.getAddr(name); addr = aRegistry.getAddr(name);
require(addr != address(0), "Invalid Address"); require(addr != address(0), "Invalid Address");
} }
@ -57,10 +77,11 @@ contract Registry {
contract GlobalVar is Registry { contract GlobalVar is Registry {
address public weth = 0xd0a1e359811322d97991e03f863a0c30c2cf029c; // kovan network
address public peth = 0xf4d791139ce033ad35db2b2201435fad668b1b64; address public weth = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;
address public mkr = 0xaaf64bfcc32d0f15873a02163e7e500671a4ffcd; address public peth = 0xf4d791139cE033Ad35DB2B2201435fAd668B1b64;
address public dai = 0xc4375b7de8af5a38a93548eb8453a498222c4ff2; address public mkr = 0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD;
address public dai = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
address public cdpAddr = 0xa71937147b55Deb8a530C7229C442Fd3F31b7db2; address public cdpAddr = 0xa71937147b55Deb8a530C7229C442Fd3F31b7db2;
MakerCDP loanMaster = MakerCDP(cdpAddr); MakerCDP loanMaster = MakerCDP(cdpAddr);
@ -110,43 +131,49 @@ contract BorrowTasks is GlobalVar {
contract Borrow is BorrowTasks { contract Borrow is BorrowTasks {
modifier securedResolver(address borrower) { event LockedETH(address borrower, uint lockETH, uint lockPETH);
if (borrower != msg.sender) { event LoanedDAI(address borrower, uint loanDAI, uint fees);
require(
msg.sender == getAddress("resolver"),
"Message sender is not MoatResolver."
);
require(
aRegistry.isApprovedResolver(borrower),
"MoatResolver is not approved by CDP user."
);
}
_;
}
function getLoan( function getLoan(
address borrower, address borrower,
uint lockETH, uint lockETH,
uint loanDAI uint loanDAI
) public securedResolver(borrower) returns (uint daiMinted, address daiAddr) ) public payable onlyUserOrResolver(borrower) returns (uint daiMinted)
{ {
if (borrowerCDPs[borrower] == 0x0000000000000000000000000000000000000000000000000000000000000000) { if (borrowerCDPs[borrower] == 0x0000000000000000000000000000000000000000000000000000000000000000) {
borrowerCDPs[borrower] = openCDP(); borrowerCDPs[borrower] = openCDP();
} }
if (lockETH != 0) { if (lockETH != 0) {
convertToWETH(lockETH); convertToWETH(lockETH);
convertToPETH(lockETH - lockETH/1000); convertToPETH(lockETH - ratioedETH(lockETH));
lockPETH(borrower, lockETH - lockETH/1000); lockPETH(borrower, lockETH - ratioedETH(lockETH));
// event for locking ETH emit LockedETH(borrower, lockETH, ratioedETH(lockETH));
} }
if (loanDAI != 0) { if (loanDAI != 0) {
loanMaster.draw(borrowerCDPs[borrower], loanDAI); loanMaster.draw(borrowerCDPs[borrower], loanDAI);
uint fees = deductFees(loanDAI);
token tokenFunctions = token(dai); token tokenFunctions = token(dai);
tokenFunctions.transfer(getAddress("resolver"), loanDAI); tokenFunctions.transfer(getAddress("resolver"), loanDAI - fees);
daiMinted = loanDAI; daiMinted = loanDAI;
// event for drawing DAI emit LoanedDAI(borrower, loanDAI, fees);
}
}
function ratioedETH(uint eth) internal returns (uint rETH) {
rETH = (eth * loanMaster.per()) / 10 ** 27;
}
function deductFees(uint volume) internal returns(uint fees) {
Resolver moatRes = Resolver(getAddress("resolver"));
fees = moatRes.fees();
if (fees > 0) {
fees = volume / fees;
token tokenFunctions = token(dai);
tokenFunctions.transfer(getAddress("admin"), fees);
} }
return (daiMinted, daiAddr);
} }
} }