mirror of
https://github.com/Instadapp/smart-contract.git
synced 2024-07-29 22:08:07 +00:00
added Uniswap & Oasis for MKR swap
This commit is contained in:
parent
f5baa10836
commit
a96a82907b
|
@ -244,6 +244,20 @@ contract Helpers is DSMath {
|
||||||
addr = 0xc679857761beE860f5Ec4B3368dFE9752580B096;
|
addr = 0xc679857761beE860f5Ec4B3368dFE9752580B096;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev get uniswap MKR exchange
|
||||||
|
*/
|
||||||
|
function getUniswapMKRExchange() public pure returns (address ume) {
|
||||||
|
ume = 0x2C4Bd064b998838076fa341A83d007FC2FA50957;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev get uniswap MKR exchange
|
||||||
|
*/
|
||||||
|
function getUniFactoryAddr() public pure returns (address ufa) {
|
||||||
|
ufa = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev setting allowance if required
|
* @dev setting allowance if required
|
||||||
*/
|
*/
|
||||||
|
@ -284,25 +298,80 @@ contract LiquidityResolver is Helpers {
|
||||||
|
|
||||||
contract MKRSwapper is LiquidityResolver {
|
contract MKRSwapper is LiquidityResolver {
|
||||||
|
|
||||||
function swapToMkrOtc(address tokenAddr, uint govFee) internal {
|
function getBestMkrSwap(address srcTknAddr, uint destMkrAmt) public view returns(uint bestEx, uint srcAmt) {
|
||||||
TokenInterface mkr = TubInterface(getSaiTubAddress()).gov();
|
uint oasisPrice = getOasisSwap(srcTknAddr, destMkrAmt);
|
||||||
uint payAmt = OtcInterface(getOtcAddress()).getPayAmount(tokenAddr, address(mkr), govFee);
|
uint uniswapPrice = getUniswapSwap(srcTknAddr, destMkrAmt);
|
||||||
if (tokenAddr == getETHAddress()) {
|
srcAmt = oasisPrice < uniswapPrice ? oasisPrice : uniswapPrice;
|
||||||
TokenInterface weth = TokenInterface(getWETHAddress());
|
bestEx = oasisPrice < uniswapPrice ? 0 : 1; // if 0 then use Oasis for Swap, if 1 then use Uniswap
|
||||||
weth.deposit.value(payAmt)();
|
|
||||||
} else if (tokenAddr != getSaiAddress() && tokenAddr != getDaiAddress()) {
|
|
||||||
require(TokenInterface(tokenAddr).transferFrom(msg.sender, address(this), payAmt), "Tranfer-failed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setApproval(tokenAddr, payAmt, getOtcAddress());
|
function getOasisSwap(address tokenAddr, uint destMkrAmt) internal view returns(uint srcAmt) {
|
||||||
|
TokenInterface mkr = TubInterface(getSaiTubAddress()).gov();
|
||||||
|
address srcTknAddr = tokenAddr == getETHAddress() ? getWETHAddress() : tokenAddr;
|
||||||
|
srcAmt = OtcInterface(getOtcAddress()).getPayAmount(srcTknAddr, address(mkr), destMkrAmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getUniswapSwap(address srcTknAddr, uint destMkrAmt) internal view returns(uint srcAmt) {
|
||||||
|
UniswapExchange mkrEx = UniswapExchange(getUniswapMKRExchange());
|
||||||
|
if (srcTknAddr == getETHAddress()) {
|
||||||
|
srcAmt = mkrEx.getEthToTokenOutputPrice(destMkrAmt);
|
||||||
|
} else {
|
||||||
|
address buyTknExAddr = UniswapFactoryInterface(getUniFactoryAddr()).getExchange(srcTknAddr);
|
||||||
|
UniswapExchange buyTknEx = UniswapExchange(buyTknExAddr);
|
||||||
|
srcAmt = buyTknEx.getTokenToEthOutputPrice(mkrEx.getEthToTokenOutputPrice(destMkrAmt)); //Check thrilok is this correct
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function swapToMkr(address tokenAddr, uint govFee) internal {
|
||||||
|
(uint bestEx, uint srcAmt) = getBestMkrSwap(tokenAddr, govFee);
|
||||||
|
if (bestEx == 0) {
|
||||||
|
swapToMkrOtc(tokenAddr, srcAmt, govFee);
|
||||||
|
} else {
|
||||||
|
swapToMkrUniswap(tokenAddr, srcAmt, govFee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function swapToMkrOtc(address tokenAddr, uint srcAmt, uint govFee) internal {
|
||||||
|
address mkr = InstaMcdAddress(getMcdAddresses()).gov();
|
||||||
|
address srcTknAddr = tokenAddr == getETHAddress() ? getWETHAddress() : tokenAddr;
|
||||||
|
if (srcTknAddr == getWETHAddress()) {
|
||||||
|
TokenInterface weth = TokenInterface(getWETHAddress());
|
||||||
|
weth.deposit.value(srcAmt)();
|
||||||
|
} else if (srcTknAddr != getSaiAddress() && srcTknAddr != getDaiAddress()) {
|
||||||
|
require(TokenInterface(srcTknAddr).transferFrom(msg.sender, address(this), srcAmt), "Tranfer-failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
setApproval(srcTknAddr, srcAmt, getOtcAddress());
|
||||||
OtcInterface(getOtcAddress()).buyAllAmount(
|
OtcInterface(getOtcAddress()).buyAllAmount(
|
||||||
address(mkr),
|
mkr,
|
||||||
govFee,
|
govFee,
|
||||||
tokenAddr,
|
srcTknAddr,
|
||||||
payAmt
|
srcAmt
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function swapToMkrUniswap(address tokenAddr, uint srcAmt, uint govFee) internal {
|
||||||
|
UniswapExchange mkrEx = UniswapExchange(getUniswapMKRExchange());
|
||||||
|
address mkr = InstaMcdAddress(getMcdAddresses()).gov();
|
||||||
|
|
||||||
|
if (tokenAddr == getETHAddress()) {
|
||||||
|
mkrEx.ethToTokenSwapOutput.value(srcAmt)(govFee, uint(1899063809));
|
||||||
|
} else {
|
||||||
|
address buyTknExAddr = UniswapFactoryInterface(getUniFactoryAddr()).getExchange(tokenAddr);
|
||||||
|
UniswapExchange buyTknEx = UniswapExchange(buyTknExAddr);
|
||||||
|
require(TokenInterface(tokenAddr).transferFrom(msg.sender, address(this), srcAmt), "not-approved-yet");
|
||||||
|
setApproval(tokenAddr, srcAmt, buyTknExAddr);
|
||||||
|
buyTknEx.tokenToTokenSwapOutput(
|
||||||
|
govFee,
|
||||||
|
srcAmt,
|
||||||
|
uint(999000000000000000000),
|
||||||
|
uint(1899063809), // 6th March 2030 GMT // no logic
|
||||||
|
mkr
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -312,7 +381,7 @@ contract SCDResolver is MKRSwapper {
|
||||||
TubInterface tub = TubInterface(getSaiTubAddress());
|
TubInterface tub = TubInterface(getSaiTubAddress());
|
||||||
|
|
||||||
(bytes32 val, bool ok) = tub.pep().peek();
|
(bytes32 val, bool ok) = tub.pep().peek();
|
||||||
TokenInterface mkr = TubInterface(getSaiTubAddress()).gov();
|
address mkr = InstaMcdAddress(getMcdAddresses()).gov();
|
||||||
feeAmt = 0;
|
feeAmt = 0;
|
||||||
if (ok && val != 0) {
|
if (ok && val != 0) {
|
||||||
// MKR required for wipe = Stability fees accrued in Dai / MKRUSD value
|
// MKR required for wipe = Stability fees accrued in Dai / MKRUSD value
|
||||||
|
@ -320,7 +389,7 @@ contract SCDResolver is MKRSwapper {
|
||||||
mkrFee = rmul(_wad, mkrFee);
|
mkrFee = rmul(_wad, mkrFee);
|
||||||
mkrFee = wdiv(mkrFee, uint(val));
|
mkrFee = wdiv(mkrFee, uint(val));
|
||||||
// convert mkr amount into sai amount
|
// convert mkr amount into sai amount
|
||||||
feeAmt = OtcInterface(getOtcAddress()).getPayAmount(getSaiAddress(), address(mkr), mkrFee);
|
feeAmt = OtcInterface(getOtcAddress()).getPayAmount(getSaiAddress(), mkr, mkrFee);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -344,7 +413,7 @@ contract SCDResolver is MKRSwapper {
|
||||||
uint mkrFee = getFeeOfCdp(cup, _wad);
|
uint mkrFee = getFeeOfCdp(cup, _wad);
|
||||||
|
|
||||||
if (payFeeWith != address(mkr) && mkrFee > 0) {
|
if (payFeeWith != address(mkr) && mkrFee > 0) {
|
||||||
swapToMkrOtc(payFeeWith, mkrFee); //otc
|
swapToMkr(payFeeWith, mkrFee); //otc
|
||||||
} else if (payFeeWith == address(mkr) && mkrFee > 0) {
|
} else if (payFeeWith == address(mkr) && mkrFee > 0) {
|
||||||
require(TokenInterface(address(mkr)).transferFrom(msg.sender, address(this), mkrFee), "Tranfer-failed");
|
require(TokenInterface(address(mkr)).transferFrom(msg.sender, address(this), mkrFee), "Tranfer-failed");
|
||||||
}
|
}
|
||||||
|
@ -405,7 +474,7 @@ contract MCDResolver is SCDResolver {
|
||||||
uint govFee = wdiv(tub.rap(cup), uint(val));
|
uint govFee = wdiv(tub.rap(cup), uint(val));
|
||||||
if (govFee > 0) {
|
if (govFee > 0) {
|
||||||
if (payGem != address(0)) {
|
if (payGem != address(0)) {
|
||||||
swapToMkrOtc(payGem, govFee);
|
swapToMkr(payGem, govFee);
|
||||||
require(tub.gov().transfer(address(scdMcdMigration), govFee), "transfer-failed");
|
require(tub.gov().transfer(address(scdMcdMigration), govFee), "transfer-failed");
|
||||||
} else {
|
} else {
|
||||||
require(tub.gov().transferFrom(msg.sender, address(scdMcdMigration), govFee), "transfer-failed"); // Check Thrilok - is it working => We can directly transfer MKR to address(scdMcdMigration). Right?
|
require(tub.gov().transferFrom(msg.sender, address(scdMcdMigration), govFee), "transfer-failed"); // Check Thrilok - is it working => We can directly transfer MKR to address(scdMcdMigration). Right?
|
||||||
|
|
Loading…
Reference in New Issue
Block a user