mirror of
https://github.com/Instadapp/smart-contract.git
synced 2024-07-29 22:08:07 +00:00
Fixed bugs and code refactor
This commit is contained in:
parent
240879da9f
commit
fa6295dbff
|
@ -106,40 +106,40 @@ interface ManagerLike {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface InstaMcdAddress {
|
interface InstaMcdAddress {
|
||||||
function manager() external returns (address);
|
function manager() external view returns (address);
|
||||||
function dai() external returns (address);
|
function dai() external view returns (address);
|
||||||
function daiJoin() external returns (address);
|
function daiJoin() external view returns (address);
|
||||||
function vat() external returns (address);
|
function vat() external view returns (address);
|
||||||
function jug() external returns (address);
|
function jug() external view returns (address);
|
||||||
function cat() external returns (address);
|
function cat() external view returns (address);
|
||||||
function gov() external returns (address);
|
function gov() external view returns (address);
|
||||||
function adm() external returns (address);
|
function adm() external view returns (address);
|
||||||
function vow() external returns (address);
|
function vow() external view returns (address);
|
||||||
function spot() external returns (address);
|
function spot() external view returns (address);
|
||||||
function pot() external returns (address);
|
function pot() external view returns (address);
|
||||||
function esm() external returns (address);
|
function esm() external view returns (address);
|
||||||
function mcdFlap() external returns (address);
|
function mcdFlap() external view returns (address);
|
||||||
function mcdFlop() external returns (address);
|
function mcdFlop() external view returns (address);
|
||||||
function mcdDeploy() external returns (address);
|
function mcdDeploy() external view returns (address);
|
||||||
function mcdEnd() external returns (address);
|
function mcdEnd() external view returns (address);
|
||||||
function proxyActions() external returns (address);
|
function proxyActions() external view returns (address);
|
||||||
function proxyActionsEnd() external returns (address);
|
function proxyActionsEnd() external view returns (address);
|
||||||
function proxyActionsDsr() external returns (address);
|
function proxyActionsDsr() external view returns (address);
|
||||||
function getCdps() external returns (address);
|
function getCdps() external view returns (address);
|
||||||
function saiTub() external returns (address);
|
function saiTub() external view returns (address);
|
||||||
function weth() external returns (address);
|
function weth() external view returns (address);
|
||||||
function bat() external returns (address);
|
function bat() external view returns (address);
|
||||||
function sai() external returns (address);
|
function sai() external view returns (address);
|
||||||
function ethAJoin() external returns (address);
|
function ethAJoin() external view returns (address);
|
||||||
function ethAFlip() external returns (address);
|
function ethAFlip() external view returns (address);
|
||||||
function batAJoin() external returns (address);
|
function batAJoin() external view returns (address);
|
||||||
function batAFlip() external returns (address);
|
function batAFlip() external view returns (address);
|
||||||
function ethPip() external returns (address);
|
function ethPip() external view returns (address);
|
||||||
function batAPip() external returns (address);
|
function batAPip() external view returns (address);
|
||||||
function saiJoin() external returns (address);
|
function saiJoin() external view returns (address);
|
||||||
function saiFlip() external returns (address);
|
function saiFlip() external view returns (address);
|
||||||
function saiPip() external returns (address);
|
function saiPip() external view returns (address);
|
||||||
function migration() external returns (address payable);
|
function migration() external view returns (address payable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ contract Helpers is DSMath {
|
||||||
* @dev get MakerDAO MCD Address contract
|
* @dev get MakerDAO MCD Address contract
|
||||||
*/
|
*/
|
||||||
function getMcdAddresses() public pure returns (address mcd) {
|
function getMcdAddresses() public pure returns (address mcd) {
|
||||||
mcd = 0x448a5065aeBB8E423F0896E6c5D525C040f59af3; // Check Thrilok - add addr at time of deploy
|
mcd = 0x5092b94F61b1aa54969C67b58695a6fB15D70645;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -377,19 +377,14 @@ contract MKRSwapper is LiquidityResolver {
|
||||||
|
|
||||||
contract SCDResolver is MKRSwapper {
|
contract SCDResolver is MKRSwapper {
|
||||||
|
|
||||||
function getFeeOfCdp(bytes32 cup, uint _wad) internal returns (uint feeAmt) {
|
function getFeeOfCdp(bytes32 cup, uint _wad) internal returns (uint mkrFee) {
|
||||||
TubInterface tub = TubInterface(getSaiTubAddress());
|
TubInterface tub = TubInterface(getSaiTubAddress());
|
||||||
|
|
||||||
(bytes32 val, bool ok) = tub.pep().peek();
|
(bytes32 val, bool ok) = tub.pep().peek();
|
||||||
address mkr = InstaMcdAddress(getMcdAddresses()).gov();
|
|
||||||
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
|
||||||
uint mkrFee = rdiv(tub.rap(cup), tub.tab(cup));
|
mkrFee = rdiv(tub.rap(cup), tub.tab(cup));
|
||||||
mkrFee = rmul(_wad, mkrFee);
|
mkrFee = rmul(_wad, mkrFee);
|
||||||
mkrFee = wdiv(mkrFee, uint(val));
|
mkrFee = wdiv(mkrFee, uint(val));
|
||||||
// convert mkr amount into sai amount
|
|
||||||
feeAmt = OtcInterface(getOtcAddress()).getPayAmount(getSaiAddress(), mkr, mkrFee);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -413,7 +408,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) {
|
||||||
swapToMkr(payFeeWith, mkrFee); //otc
|
swapToMkr(payFeeWith, mkrFee); //otc or uniswap
|
||||||
} 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");
|
||||||
}
|
}
|
||||||
|
@ -477,7 +472,7 @@ contract MCDResolver is SCDResolver {
|
||||||
swapToMkr(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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -511,14 +506,14 @@ contract MigrateHelper is MCDResolver {
|
||||||
bytes32 cup,
|
bytes32 cup,
|
||||||
uint toConvert,
|
uint toConvert,
|
||||||
address payFeeWith,
|
address payFeeWith,
|
||||||
address daiJoin
|
address saiJoin
|
||||||
) internal returns (uint _wad, uint _ink, uint maxConvert)
|
) internal returns (uint _wad, uint _ink, uint maxConvert)
|
||||||
{
|
{
|
||||||
// Set ratio according to user.
|
// Set ratio according to user.
|
||||||
TubInterface tub = TubInterface(getSaiTubAddress());
|
TubInterface tub = TubInterface(getSaiTubAddress());
|
||||||
|
|
||||||
maxConvert = toConvert;
|
maxConvert = toConvert;
|
||||||
uint saiBal = tub.sai().balanceOf(daiJoin);
|
uint saiBal = tub.sai().balanceOf(saiJoin);
|
||||||
uint _wadTotal = tub.tab(cup);
|
uint _wadTotal = tub.tab(cup);
|
||||||
|
|
||||||
uint feeAmt = 0;
|
uint feeAmt = 0;
|
||||||
|
@ -528,18 +523,21 @@ contract MigrateHelper is MCDResolver {
|
||||||
|
|
||||||
// if migration is by debt method, Add fee(SAI) to _wad
|
// if migration is by debt method, Add fee(SAI) to _wad
|
||||||
if (payFeeWith == getSaiAddress()) {
|
if (payFeeWith == getSaiAddress()) {
|
||||||
feeAmt = getFeeOfCdp(cup, _wad);
|
uint mkrAmt = getFeeOfCdp(cup, _wad);
|
||||||
|
(, feeAmt) = getBestMkrSwap(getSaiAddress(), mkrAmt);
|
||||||
_wad = add(_wad, feeAmt);
|
_wad = add(_wad, feeAmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
//if sai_join has enough sai to migrate.
|
//if sai_join has enough sai to migrate.
|
||||||
if (saiBal < _wad) {
|
if (saiBal < _wad) {
|
||||||
// set saiBal as wad amount And sub feeAmt(feeAmt > 0, when its debt method).
|
// set saiBal as wad amount And sub feeAmt(feeAmt > 0, when its debt method).
|
||||||
_wad = sub(saiBal, add(feeAmt, 100000));
|
_wad = sub(saiBal, 100000);
|
||||||
// set new convert ratio according to sai_join balance.
|
// set new convert ratio according to sai_join balance.
|
||||||
maxConvert = sub(wdiv(saiBal, _wadTotal), 100);
|
maxConvert = sub(wdiv(saiBal, sub(_wad, feeAmt)), 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ink according to maxConvert ratio.
|
// ink according to maxConvert ratio.
|
||||||
|
_wad = sub(_wad, feeAmt);
|
||||||
_ink = wmul(tub.ink(cup), maxConvert);
|
_ink = wmul(tub.ink(cup), maxConvert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -555,7 +553,11 @@ contract MigrateHelper is MCDResolver {
|
||||||
uint initialPoolBal = sub(getPoolAddress().balance, 10000000000);
|
uint initialPoolBal = sub(getPoolAddress().balance, 10000000000);
|
||||||
|
|
||||||
// Check if the split fee is paid by debt from the cdp.
|
// Check if the split fee is paid by debt from the cdp.
|
||||||
uint _wadForDebt = payFeeWith == getSaiAddress() ? add(_wad, getFeeOfCdp(scdCup, _wad)) : _wad;
|
uint _wadForDebt = _wad;
|
||||||
|
if (payFeeWith == getSaiAddress()) {
|
||||||
|
(, uint feeAmt) = getBestMkrSwap(getSaiAddress(), getFeeOfCdp(scdCup, _wad));
|
||||||
|
_wadForDebt = add(_wadForDebt, feeAmt);
|
||||||
|
}
|
||||||
|
|
||||||
//fetch liquidity from InstaDApp Pool.
|
//fetch liquidity from InstaDApp Pool.
|
||||||
getLiquidity(_wadForDebt);
|
getLiquidity(_wadForDebt);
|
||||||
|
@ -573,20 +575,22 @@ contract MigrateHelper is MCDResolver {
|
||||||
assert(finalPoolBal >= initialPoolBal);
|
assert(finalPoolBal >= initialPoolBal);
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawDebtForFee(bytes32 cup) internal {
|
function migrateWholeCdp(bytes32 cup, address payfeeWith) internal returns (uint newMcdCdp) {
|
||||||
// draw more SAI for debt method and 100% convert.
|
if (payfeeWith == getSaiAddress()) {
|
||||||
uint _wad = TubInterface(getSaiTubAddress()).tab(cup);
|
// draw more SAI for debt method and 100% convert.
|
||||||
uint fee = getFeeOfCdp(cup, _wad);
|
uint _wad = TubInterface(getSaiTubAddress()).tab(cup);
|
||||||
// draw fee amt.
|
(, uint fee) = getBestMkrSwap(getSaiAddress(), getFeeOfCdp(cup, _wad));
|
||||||
draw(cup, fee);
|
// draw fee amt.
|
||||||
|
draw(cup, fee);
|
||||||
|
}
|
||||||
|
newMcdCdp = migrateToMCD(cup, payfeeWith);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
contract MigrateResolver is MigrateHelper {
|
contract MigrateResolver is MigrateHelper {
|
||||||
|
|
||||||
event LogMigrate(uint scdCdp, uint toConvert, address payFeeWith, uint mcdCdp, uint newMcdCdp);
|
event LogMigrate(uint scdCdp, uint toConvert, uint coll, uint debt, address payFeeWith, uint mcdCdp, uint newMcdCdp);
|
||||||
event LogMigrateWithDebt(uint scdCdp, uint toConvert, address payFeeWith, uint mcdCdp, uint newMcdCdp);
|
|
||||||
|
|
||||||
function migrate(
|
function migrate(
|
||||||
uint scdCDP,
|
uint scdCDP,
|
||||||
|
@ -597,20 +601,19 @@ contract MigrateResolver is MigrateHelper {
|
||||||
{
|
{
|
||||||
bytes32 scdCup = bytes32(scdCDP);
|
bytes32 scdCup = bytes32(scdCDP);
|
||||||
uint maxConvert = toConvert;
|
uint maxConvert = toConvert;
|
||||||
|
uint _wad;
|
||||||
|
uint _ink;
|
||||||
|
//set split amount according to toConvert and dai_join balance and decrease the ratio if needed.
|
||||||
|
(_wad, _ink, maxConvert) = setSplitAmount(
|
||||||
|
scdCup,
|
||||||
|
toConvert,
|
||||||
|
payFeeWith,
|
||||||
|
InstaMcdAddress(getMcdAddresses()).saiJoin());
|
||||||
|
|
||||||
if (toConvert < 10**18) {
|
if (maxConvert < 10**18) {
|
||||||
//new cdp for spliting assets.
|
//new cdp for spliting assets.
|
||||||
bytes32 splitCup = TubInterface(getSaiTubAddress()).open();
|
bytes32 splitCup = TubInterface(getSaiTubAddress()).open();
|
||||||
|
|
||||||
//set split amount according to toConvert and dai_join balance.
|
|
||||||
uint _wad;
|
|
||||||
uint _ink;
|
|
||||||
(_wad, _ink, maxConvert) = setSplitAmount(
|
|
||||||
scdCup,
|
|
||||||
toConvert,
|
|
||||||
payFeeWith,
|
|
||||||
InstaMcdAddress(getMcdAddresses()).saiJoin());
|
|
||||||
|
|
||||||
//split the assets into split cdp.
|
//split the assets into split cdp.
|
||||||
splitCdp(
|
splitCdp(
|
||||||
scdCup,
|
scdCup,
|
||||||
|
@ -623,13 +626,8 @@ contract MigrateResolver is MigrateHelper {
|
||||||
//migrate the split cdp.
|
//migrate the split cdp.
|
||||||
newMcdCdp = migrateToMCD(splitCup, payFeeWith);
|
newMcdCdp = migrateToMCD(splitCup, payFeeWith);
|
||||||
} else {
|
} else {
|
||||||
//migrate the scd cdp.
|
//migrate the scd cdp and check if fee is paid by debt.
|
||||||
newMcdCdp = migrateToMCD(scdCup, payFeeWith);
|
newMcdCdp = migrateWholeCdp(scdCup, payFeeWith);
|
||||||
}
|
|
||||||
|
|
||||||
//Transfer if any ETH leftover.
|
|
||||||
if (address(this).balance > 0) { // Check Thrilok - Can remove at time of production
|
|
||||||
msg.sender.transfer(address(this).balance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//merge the already existing mcd cdp with the new migrated cdp.
|
//merge the already existing mcd cdp with the new migrated cdp.
|
||||||
|
@ -641,67 +639,8 @@ contract MigrateResolver is MigrateHelper {
|
||||||
emit LogMigrate(
|
emit LogMigrate(
|
||||||
uint(scdCup),
|
uint(scdCup),
|
||||||
maxConvert,
|
maxConvert,
|
||||||
payFeeWith,
|
_ink,
|
||||||
mergeCDP,
|
_wad,
|
||||||
newMcdCdp
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function migrateWithDebt(
|
|
||||||
uint scdCDP,
|
|
||||||
uint mergeCDP,
|
|
||||||
uint toConvert,
|
|
||||||
address payFeeWith
|
|
||||||
) external payable returns (uint newMcdCdp)
|
|
||||||
{
|
|
||||||
bytes32 scdCup = bytes32(scdCDP);
|
|
||||||
uint maxConvert = toConvert;
|
|
||||||
|
|
||||||
if (toConvert < 10**18) {
|
|
||||||
//new cdp for spliting assets.
|
|
||||||
bytes32 splitCup = TubInterface(getSaiTubAddress()).open();
|
|
||||||
|
|
||||||
//set split amount according to toConvert, feeAmt and dai_join balance.
|
|
||||||
uint _wad;
|
|
||||||
uint _ink;
|
|
||||||
(_wad, _ink, maxConvert) = setSplitAmount(
|
|
||||||
scdCup,
|
|
||||||
toConvert,
|
|
||||||
payFeeWith,
|
|
||||||
InstaMcdAddress(getMcdAddresses()).saiJoin());
|
|
||||||
|
|
||||||
//split the assets into split cdp.
|
|
||||||
splitCdp(
|
|
||||||
scdCup,
|
|
||||||
splitCup,
|
|
||||||
_wad,
|
|
||||||
_ink,
|
|
||||||
payFeeWith
|
|
||||||
);
|
|
||||||
|
|
||||||
//migrate the split cdp.
|
|
||||||
newMcdCdp = migrateToMCD(splitCup, payFeeWith);
|
|
||||||
} else {
|
|
||||||
// draw extra SAI for paying fee.
|
|
||||||
drawDebtForFee(scdCup);
|
|
||||||
//migrate the scd cdp.
|
|
||||||
newMcdCdp = migrateToMCD(scdCup, payFeeWith);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Transfer if any ETH leftover.
|
|
||||||
if (address(this).balance > 0) { // Check Thrilok - Can remove at time of production
|
|
||||||
msg.sender.transfer(address(this).balance);
|
|
||||||
}
|
|
||||||
|
|
||||||
//merge the already existing mcd cdp with the new migrated cdp.
|
|
||||||
if (mergeCDP != 0) {
|
|
||||||
shiftCDP(newMcdCdp, mergeCDP);
|
|
||||||
giveCDP(newMcdCdp, getGiveAddress());
|
|
||||||
}
|
|
||||||
|
|
||||||
emit LogMigrateWithDebt(
|
|
||||||
uint(scdCup),
|
|
||||||
maxConvert,
|
|
||||||
payFeeWith,
|
payFeeWith,
|
||||||
mergeCDP,
|
mergeCDP,
|
||||||
newMcdCdp
|
newMcdCdp
|
||||||
|
|
Loading…
Reference in New Issue
Block a user