mirror of
https://github.com/Instadapp/smart-contract.git
synced 2024-07-29 22:08:07 +00:00
bugs fixing
This commit is contained in:
parent
af6332ba1a
commit
1971321441
|
|
@ -245,6 +245,45 @@ contract Helper is DSMath {
|
||||||
cup = bytes32(cdpNum);
|
cup = bytes32(cdpNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
contract MakerHelper is Helper {
|
||||||
|
|
||||||
|
event LogOpen(uint cdpNum, address owner);
|
||||||
|
event LogLock(uint cdpNum, uint amtETH, uint amtPETH, address owner);
|
||||||
|
event LogFree(uint cdpNum, uint amtETH, uint amtPETH, address owner);
|
||||||
|
event LogDraw(uint cdpNum, uint amtDAI, address owner);
|
||||||
|
event LogWipe(uint cdpNum, uint daiAmt, uint mkrFee, uint daiFee, address owner);
|
||||||
|
event LogShut(uint cdpNum);
|
||||||
|
|
||||||
|
function setMakerAllowance(TokenInterface _token, address _spender) internal {
|
||||||
|
if (_token.allowance(address(this), _spender) != uint(-1)) {
|
||||||
|
_token.approve(_spender, uint(-1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCDPStats(bytes32 cup) public view returns (uint ethCol, uint daiDebt) {
|
||||||
|
TubInterface tub = TubInterface(getSaiTubAddress());
|
||||||
|
(, uint pethCol, uint debt,) = tub.cups(cup);
|
||||||
|
ethCol = rmul(pethCol, tub.per()); // get ETH col from PETH col
|
||||||
|
daiDebt = debt;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMakerRatio(bytes32 cup, uint ethCol, uint daiDebt) public view returns (uint ratio) {
|
||||||
|
(uint makerCol, uint makerDebt) = getCDPStats(cup);
|
||||||
|
makerCol += ethCol;
|
||||||
|
makerDebt += daiDebt;
|
||||||
|
uint usdPerEth = uint(MakerOracleInterface(getOracleAddress()).read());
|
||||||
|
uint makerColInUSD = wmul(makerCol, usdPerEth);
|
||||||
|
ratio = wdiv(makerDebt, makerColInUSD);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
contract CompoundHelper is MakerHelper {
|
||||||
|
|
||||||
function getCompRatio(address user) public returns (uint totalSupply, uint totalBorrow, uint maxBorrow, uint ratio) {
|
function getCompRatio(address user) public returns (uint totalSupply, uint totalBorrow, uint maxBorrow, uint ratio) {
|
||||||
BridgeInterface bridgeContract = BridgeInterface(getBridgeAddress());
|
BridgeInterface bridgeContract = BridgeInterface(getBridgeAddress());
|
||||||
uint arrLength = bridgeContract.cArrLength();
|
uint arrLength = bridgeContract.cArrLength();
|
||||||
|
|
@ -265,41 +304,51 @@ contract Helper is DSMath {
|
||||||
ratio = wdiv(totalBorrow, totalSupply);
|
ratio = wdiv(totalBorrow, totalSupply);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
event LogMint(address erc20, address cErc20, uint tokenAmt, address owner);
|
||||||
|
event LogRedeem(address erc20, address cErc20, uint tokenAmt, address owner);
|
||||||
|
event LogBorrow(address erc20, address cErc20, uint tokenAmt, address owner);
|
||||||
|
event LogRepay(address erc20, address cErc20, uint tokenAmt, address owner);
|
||||||
|
|
||||||
|
function getCompoundStats(address user) public returns (uint ethColFree, uint daiDebt, uint totalSupply, uint totalBorrow, uint maxBorrow, uint daiInEth) {
|
||||||
contract MakerHelper is Helper {
|
CTokenInterface cEthContract = CTokenInterface(getCETHAddress());
|
||||||
|
CERC20Interface cDaiContract = CERC20Interface(getCDAIAddress());
|
||||||
event LogOpen(uint cdpNum, address owner);
|
uint cEthBal = cEthContract.balanceOf(user);
|
||||||
event LogLock(uint cdpNum, uint amtETH, uint amtPETH, address owner);
|
uint cEthExchangeRate = cEthContract.exchangeRateCurrent();
|
||||||
event LogFree(uint cdpNum, uint amtETH, uint amtPETH, address owner);
|
uint ethCol = wmul(cEthBal, cEthExchangeRate);
|
||||||
event LogDraw(uint cdpNum, uint amtDAI, address owner);
|
ethCol = wdiv(ethCol, cEthExchangeRate) <= cEthBal ? ethCol : ethCol - 1;
|
||||||
event LogWipe(uint cdpNum, uint daiAmt, uint mkrFee, uint daiFee, address owner);
|
daiDebt = cDaiContract.borrowBalanceCurrent(user);
|
||||||
event LogShut(uint cdpNum);
|
daiInEth = CompOracleInterface(getCompOracleAddress()).getUnderlyingPrice(getCDAIAddress());
|
||||||
|
uint compRatio;
|
||||||
function setMakerAllowance(TokenInterface _token, address _spender) private {
|
(totalSupply, totalBorrow, maxBorrow, compRatio) = getCompRatio(user);
|
||||||
if (_token.allowance(address(this), _spender) != uint(-1)) {
|
ethColFree = wdiv(wmul(daiDebt, daiInEth), compRatio);
|
||||||
_token.approve(_spender, uint(-1));
|
if (ethColFree > ethCol) {
|
||||||
|
ethColFree = ethCol;
|
||||||
|
daiDebt = wdiv(wmul(ethColFree, compRatio), daiInEth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMakerRatio(bytes32 cup, uint ethCol, uint daiDebt) internal view returns (uint ratio) {
|
function enterMarket(address cErc20) internal {
|
||||||
(uint makerCol, uint makerDebt) = getCDPStats(cup);
|
ComptrollerInterface troller = ComptrollerInterface(getComptrollerAddress());
|
||||||
makerCol += ethCol;
|
address[] memory markets = troller.getAssetsIn(address(this));
|
||||||
makerDebt += daiDebt;
|
bool isEntered = false;
|
||||||
uint usdPerEth = uint(MakerOracleInterface(getOracleAddress()).read());
|
for (uint i = 0; i < markets.length; i++) {
|
||||||
uint makerColInUSD = wmul(makerCol, usdPerEth);
|
if (markets[i] == cErc20) {
|
||||||
ratio = wdiv(makerDebt, makerColInUSD);
|
isEntered = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isEntered) {
|
||||||
|
address[] memory toEnter = new address[](1);
|
||||||
|
toEnter[0] = cErc20;
|
||||||
|
troller.enterMarkets(toEnter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCDPStats(bytes32 cup) internal view returns (uint ethCol, uint daiDebt) {
|
}
|
||||||
TubInterface tub = TubInterface(getSaiTubAddress());
|
|
||||||
(, uint pethCol, uint debt,) = tub.cups(cup);
|
|
||||||
ethCol = rmul(pethCol, tub.per()); // get ETH col from PETH col
|
|
||||||
daiDebt = debt;
|
|
||||||
}
|
|
||||||
|
|
||||||
function open() internal returns (bytes32) {
|
|
||||||
|
contract MakerResolver is CompoundHelper {
|
||||||
|
|
||||||
|
function open() internal returns (bytes32) {
|
||||||
bytes32 cup = TubInterface(getSaiTubAddress()).open();
|
bytes32 cup = TubInterface(getSaiTubAddress()).open();
|
||||||
emit LogOpen(uint(cup), address(this));
|
emit LogOpen(uint(cup), address(this));
|
||||||
return cup;
|
return cup;
|
||||||
|
|
@ -368,7 +417,8 @@ contract MakerHelper is Helper {
|
||||||
TubInterface tub = TubInterface(getSaiTubAddress());
|
TubInterface tub = TubInterface(getSaiTubAddress());
|
||||||
|
|
||||||
tub.draw(cup, _wad);
|
tub.draw(cup, _wad);
|
||||||
setApproval(getDAIAddress(), _wad, getBridgeAddress());
|
TokenInterface dai = tub.sai();
|
||||||
|
setMakerAllowance(dai, getBridgeAddress());
|
||||||
BridgeInterface(getBridgeAddress()).transferBackDAI(_wad);
|
BridgeInterface(getBridgeAddress()).transferBackDAI(_wad);
|
||||||
|
|
||||||
emit LogDraw(uint(cup), _wad, address(this));
|
emit LogDraw(uint(cup), _wad, address(this));
|
||||||
|
|
@ -398,12 +448,13 @@ contract MakerHelper is Helper {
|
||||||
uint daiFeeAmt = daiEx.getTokenToEthOutputPrice(mkrEx.getEthToTokenOutputPrice(mkrFee));
|
uint daiFeeAmt = daiEx.getTokenToEthOutputPrice(mkrEx.getEthToTokenOutputPrice(mkrFee));
|
||||||
daiAmt = add(_wad, daiFeeAmt);
|
daiAmt = add(_wad, daiFeeAmt);
|
||||||
|
|
||||||
|
// compound final status and get DAI from bridge
|
||||||
uint daiCompOracle = CompOracleInterface(getCompOracleAddress()).getUnderlyingPrice(getCDAIAddress()); // DAI in ETH
|
uint daiCompOracle = CompOracleInterface(getCompOracleAddress()).getUnderlyingPrice(getCDAIAddress()); // DAI in ETH
|
||||||
uint debtInEth = wmul(daiAmt, daiCompOracle);
|
uint debtInEth = wmul(daiAmt, daiCompOracle);
|
||||||
if (ethCol == 0) {
|
if (ethCol == 0) {
|
||||||
(ethCol,) = getCDPStats(cup);
|
(ethCol,) = getCDPStats(cup);
|
||||||
}
|
}
|
||||||
(uint totalSupply, uint totalBorrow, uint maxBorrow,) = getCompRatio(address(this));
|
(, uint totalBorrow, uint maxBorrow,) = getCompRatio(address(this));
|
||||||
totalBorrow += debtInEth;
|
totalBorrow += debtInEth;
|
||||||
maxBorrow += wmul(ethCol, 750000000000000000);
|
maxBorrow += wmul(ethCol, 750000000000000000);
|
||||||
require(totalBorrow < maxBorrow, "Compound will liquidate");
|
require(totalBorrow < maxBorrow, "Compound will liquidate");
|
||||||
|
|
@ -451,48 +502,7 @@ contract MakerHelper is Helper {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
contract CompoundHelper is MakerHelper {
|
contract CompoundResolver is MakerResolver {
|
||||||
|
|
||||||
event LogMint(address erc20, address cErc20, uint tokenAmt, address owner);
|
|
||||||
event LogRedeem(address erc20, address cErc20, uint tokenAmt, address owner);
|
|
||||||
event LogBorrow(address erc20, address cErc20, uint tokenAmt, address owner);
|
|
||||||
event LogRepay(address erc20, address cErc20, uint tokenAmt, address owner);
|
|
||||||
|
|
||||||
function getCompoundStats(address user) public returns (uint ethCol, uint daiDebt, uint totalSupply, uint totalBorrow, uint maxBorrow, uint daiInEth) {
|
|
||||||
CTokenInterface cEthContract = CTokenInterface(getCETHAddress());
|
|
||||||
CERC20Interface cDaiContract = CERC20Interface(getCDAIAddress());
|
|
||||||
uint cEthBal = cEthContract.balanceOf(user);
|
|
||||||
uint cEthExchangeRate = cEthContract.exchangeRateCurrent();
|
|
||||||
ethCol = wmul(cEthBal, cEthExchangeRate);
|
|
||||||
ethCol = wdiv(ethCol, cEthExchangeRate) <= cEthBal ? ethCol : ethCol - 1;
|
|
||||||
daiDebt = cDaiContract.borrowBalanceCurrent(user);
|
|
||||||
daiInEth = CompOracleInterface(getCompOracleAddress()).getUnderlyingPrice(getCDAIAddress());
|
|
||||||
uint compRatio;
|
|
||||||
(totalSupply, totalBorrow, maxBorrow, compRatio) = getCompRatio(user);
|
|
||||||
uint ethColFree = wdiv(wmul(daiDebt, daiInEth), compRatio);
|
|
||||||
if (ethColFree > ethCol) {
|
|
||||||
ethColFree = ethCol;
|
|
||||||
daiDebt = wdiv(wmul(ethColFree, compRatio), daiInEth);
|
|
||||||
}
|
|
||||||
// uint usdPerEth = uint(MakerOracleInterface(getOracleAddress()).read());
|
|
||||||
// uint ethInUSD = wmul(ethCol, usdPerEth);
|
|
||||||
}
|
|
||||||
|
|
||||||
function enterMarket(address cErc20) internal {
|
|
||||||
ComptrollerInterface troller = ComptrollerInterface(getComptrollerAddress());
|
|
||||||
address[] memory markets = troller.getAssetsIn(address(this));
|
|
||||||
bool isEntered = false;
|
|
||||||
for (uint i = 0; i < markets.length; i++) {
|
|
||||||
if (markets[i] == cErc20) {
|
|
||||||
isEntered = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isEntered) {
|
|
||||||
address[] memory toEnter = new address[](1);
|
|
||||||
toEnter[0] = cErc20;
|
|
||||||
troller.enterMarkets(toEnter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Deposit ETH and mint Compound Tokens
|
* @dev Deposit ETH and mint Compound Tokens
|
||||||
|
|
@ -512,14 +522,14 @@ contract CompoundHelper is MakerHelper {
|
||||||
/**
|
/**
|
||||||
* @dev borrow ETH/ERC20
|
* @dev borrow ETH/ERC20
|
||||||
*/
|
*/
|
||||||
function borrowDAIComp(address erc20, address cErc20, uint tokenAmt) internal {
|
function borrowDAIComp(uint tokenAmt) internal {
|
||||||
enterMarket(cErc20);
|
enterMarket(getCDAIAddress());
|
||||||
require(CTokenInterface(cErc20).borrow(tokenAmt) == 0, "got collateral?");
|
require(CTokenInterface(getCDAIAddress()).borrow(tokenAmt) == 0, "got collateral?");
|
||||||
setApproval(erc20, tokenAmt, getBridgeAddress());
|
setApproval(getDAIAddress(), tokenAmt, getBridgeAddress());
|
||||||
BridgeInterface(getBridgeAddress()).transferBackDAI(tokenAmt);
|
BridgeInterface(getBridgeAddress()).transferBackDAI(tokenAmt);
|
||||||
emit LogBorrow(
|
emit LogBorrow(
|
||||||
erc20,
|
getDAIAddress(),
|
||||||
cErc20,
|
getCDAIAddress(),
|
||||||
tokenAmt,
|
tokenAmt,
|
||||||
address(this)
|
address(this)
|
||||||
);
|
);
|
||||||
|
|
@ -560,7 +570,7 @@ contract CompoundHelper is MakerHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
contract Bridge is CompoundHelper {
|
contract Bridge is CompoundResolver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev convert Maker CDP into Compound Collateral
|
* @dev convert Maker CDP into Compound Collateral
|
||||||
|
|
@ -580,7 +590,7 @@ contract Bridge is CompoundHelper {
|
||||||
daiAmt = shut(cup);
|
daiAmt = shut(cup);
|
||||||
}
|
}
|
||||||
mintCEth(ethFree);
|
mintCEth(ethFree);
|
||||||
borrowDAIComp(getDAIAddress(), getCDAIAddress(), daiAmt);
|
borrowDAIComp(daiAmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -592,7 +602,12 @@ contract Bridge is CompoundHelper {
|
||||||
bytes32 cup = bytes32(cdpId);
|
bytes32 cup = bytes32(cdpId);
|
||||||
if (cdpId == 0) {
|
if (cdpId == 0) {
|
||||||
cup = open();
|
cup = open();
|
||||||
|
} else {
|
||||||
|
TubInterface tub = TubInterface(getSaiTubAddress());
|
||||||
|
(address lad,,,) = tub.cups(cup);
|
||||||
|
require(lad == address(this), "cup-not-owned");
|
||||||
}
|
}
|
||||||
|
|
||||||
(uint ethCol, uint daiDebt,, uint totalBorrow, uint maxBorrow, uint daiInEth) = getCompoundStats(address(this));
|
(uint ethCol, uint daiDebt,, uint totalBorrow, uint maxBorrow, uint daiInEth) = getCompoundStats(address(this));
|
||||||
uint ethFree = ethCol;
|
uint ethFree = ethCol;
|
||||||
uint daiAmt = daiDebt;
|
uint daiAmt = daiDebt;
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,7 @@ contract CTokens is Helper {
|
||||||
cTokenAddr.push(setCToken);
|
cTokenAddr.push(setCToken);
|
||||||
cArrLength++;
|
cArrLength++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -183,6 +184,8 @@ contract MakerCompBridge is Bridge {
|
||||||
addCToken(0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407, 600000000000000000);
|
addCToken(0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407, 600000000000000000);
|
||||||
isAdmin[0x7284a8451d9a0e7Dc62B3a71C0593eA2eC5c5638] = true;
|
isAdmin[0x7284a8451d9a0e7Dc62B3a71C0593eA2eC5c5638] = true;
|
||||||
isAdmin[0xa7615CD307F323172331865181DC8b80a2834324] = true;
|
isAdmin[0xa7615CD307F323172331865181DC8b80a2834324] = true;
|
||||||
|
setApproval(daiAdd, 10**30, cDaiAdd);
|
||||||
|
setApproval(cDaiAdd, 10**30, cDaiAdd);
|
||||||
version = _version;
|
version = _version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user