mirror of
https://github.com/Instadapp/dsa-polygon-migration.git
synced 2024-07-29 22:27:58 +00:00
added checkRatio
This commit is contained in:
parent
c209376152
commit
0e13bfa0d1
|
@ -11,7 +11,7 @@ contract Variables {
|
||||||
|
|
||||||
// This will be used to have debt/collateral ratio always 20% less than liquidation
|
// This will be used to have debt/collateral ratio always 20% less than liquidation
|
||||||
// TODO: Is this number correct for it?
|
// TODO: Is this number correct for it?
|
||||||
uint public safeRatioGap = 200000000000000000; // 20%? 2e17
|
uint public safeRatioGap = 800000000000000000; // 20%? 2e17
|
||||||
|
|
||||||
// TODO: Add function for flash deposits and withdraw
|
// TODO: Add function for flash deposits and withdraw
|
||||||
mapping(address => mapping(address => uint)) flashDeposits; // Flash deposits of particular token
|
mapping(address => mapping(address => uint)) flashDeposits; // Flash deposits of particular token
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
pragma solidity >=0.7.0;
|
pragma solidity ^0.7.0;
|
||||||
pragma experimental ABIEncoderV2;
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
import { DSMath } from "../../common/math.sol";
|
import { DSMath } from "../../common/math.sol";
|
||||||
import { Stores } from "../../common/stores-mainnet.sol";
|
import { Stores } from "../../common/stores-mainnet.sol";
|
||||||
|
|
||||||
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
||||||
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
||||||
|
|
||||||
|
@ -14,7 +13,9 @@ import {
|
||||||
AaveDataProviderInterface,
|
AaveDataProviderInterface,
|
||||||
AaveInterface,
|
AaveInterface,
|
||||||
ATokenInterface,
|
ATokenInterface,
|
||||||
StateSenderInterface
|
StateSenderInterface,
|
||||||
|
AavePriceOracle,
|
||||||
|
ChainLinkInterface
|
||||||
} from "./interfaces.sol";
|
} from "./interfaces.sol";
|
||||||
|
|
||||||
abstract contract Helpers is DSMath, Stores, Variables {
|
abstract contract Helpers is DSMath, Stores, Variables {
|
||||||
|
@ -104,8 +105,45 @@ abstract contract Helpers is DSMath, Stores, Variables {
|
||||||
require(isOk, "position-at-risk");
|
require(isOk, "position-at-risk");
|
||||||
}
|
}
|
||||||
|
|
||||||
function _checkRatio(AaveData memory data) public returns (bool isOk) {
|
function getTokensPrices(address[] memory tokens) internal view returns(uint[] memory tokenPricesInEth) {
|
||||||
// TODO: @mubaris Check the debt/collateral ratio should be less than "safeRatioGap" from Liquidation of that particular user assets
|
tokenPricesInEth = AavePriceOracle(aaveProvider.getPriceOracle()).getAssetsPrices(tokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liquidation threshold
|
||||||
|
function getTokenLt(address[] memory tokens) internal view returns (uint[] memory decimals, uint[] memory tokenLts) {
|
||||||
|
for (uint i = 0; i < tokens.length; i++) {
|
||||||
|
(decimals[i],,tokenLts[i],,,,,,,) = aaveData.getReserveConfigurationData(tokens[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertTo18(uint amount, uint decimal) internal returns (uint) {
|
||||||
|
return amount * (10 ** (18 - decimal)); // TODO: verify this
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: need to verify this throughly
|
||||||
|
/*
|
||||||
|
* Checks the position to migrate should have a safe gap from liquidation
|
||||||
|
*/
|
||||||
|
function _checkRatio(AaveData memory data) public {
|
||||||
|
uint[] memory supplyTokenPrices = getTokensPrices(data.supplyTokens);
|
||||||
|
(uint[] memory supplyDecimals, uint[] memory supplyLts) = getTokenLt(data.supplyTokens);
|
||||||
|
|
||||||
|
uint[] memory borrowTokenPrices = getTokensPrices(data.borrowTokens);
|
||||||
|
(uint[] memory borrowDecimals,) = getTokenLt(data.borrowTokens);
|
||||||
|
uint netSupply;
|
||||||
|
uint netBorrow;
|
||||||
|
uint liquidation;
|
||||||
|
for (uint i = 0; i < data.supplyTokens.length; i++) {
|
||||||
|
uint _amt = wmul(convertTo18(data.supplyAmts[i], supplyDecimals[i]), supplyTokenPrices[i]);
|
||||||
|
netSupply += _amt;
|
||||||
|
liquidation += (_amt * supplyLts[i]) / 10000; // convert the number 8000 to 0.8
|
||||||
|
}
|
||||||
|
for (uint i = 0; i < data.borrowTokens.length; i++) {
|
||||||
|
uint _amt = wmul(convertTo18(data.borrowAmts[i], borrowDecimals[i]), borrowTokenPrices[i]);
|
||||||
|
netBorrow += _amt;
|
||||||
|
}
|
||||||
|
uint _dif = wmul(netSupply, sub(1e18, safeRatioGap));
|
||||||
|
require(netBorrow < sub(liquidation, _dif), "position-is-risky-to-migrate");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -25,6 +25,7 @@ interface AaveInterface {
|
||||||
|
|
||||||
interface AaveLendingPoolProviderInterface {
|
interface AaveLendingPoolProviderInterface {
|
||||||
function getLendingPool() external view returns (address);
|
function getLendingPool() external view returns (address);
|
||||||
|
function getPriceOracle() external view returns (address);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aave Protocol Data Provider
|
// Aave Protocol Data Provider
|
||||||
|
@ -82,4 +83,16 @@ interface IndexInterface {
|
||||||
|
|
||||||
interface FlashloanInterface {
|
interface FlashloanInterface {
|
||||||
function initiateFlashLoan(bytes memory data, uint ethAmt) external;
|
function initiateFlashLoan(bytes memory data, uint ethAmt) external;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AavePriceOracle {
|
||||||
|
function getAssetPrice(address _asset) external view returns(uint256);
|
||||||
|
function getAssetsPrices(address[] calldata _assets) external view returns(uint256[] memory);
|
||||||
|
function getSourceOfAsset(address _asset) external view returns(uint256);
|
||||||
|
function getFallbackOracle() external view returns(uint256);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ChainLinkInterface {
|
||||||
|
function latestAnswer() external view returns (int256);
|
||||||
|
function decimals() external view returns (uint256);
|
||||||
}
|
}
|
|
@ -209,8 +209,7 @@ contract MigrateResolver is LiquidityResolver {
|
||||||
data.borrowAmts = totalBorrows;
|
data.borrowAmts = totalBorrows;
|
||||||
|
|
||||||
// Checks the amount that user is trying to migrate is 20% below the Liquidation
|
// Checks the amount that user is trying to migrate is 20% below the Liquidation
|
||||||
bool isOk = _checkRatio(data);
|
_checkRatio(data);
|
||||||
require(isOk, "position-risky-to-migrate");
|
|
||||||
|
|
||||||
if (ethAmt > 0) {
|
if (ethAmt > 0) {
|
||||||
aave.withdraw(wethAddr, ethAmt, address(this));
|
aave.withdraw(wethAddr, ethAmt, address(this));
|
||||||
|
|
|
@ -27,6 +27,11 @@ contract Variables {
|
||||||
address[] borrowTokens;
|
address[] borrowTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TokenPrice {
|
||||||
|
uint priceInEth;
|
||||||
|
uint priceInUsd;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Aave referal code
|
* @dev Aave referal code
|
||||||
*/
|
*/
|
||||||
|
@ -37,7 +42,7 @@ contract Variables {
|
||||||
|
|
||||||
// This will be used to have debt/collateral ratio always 20% less than liquidation
|
// This will be used to have debt/collateral ratio always 20% less than liquidation
|
||||||
// TODO: Is this number correct for it?
|
// TODO: Is this number correct for it?
|
||||||
uint public safeRatioGap = 80000000000000000; // 20%?
|
uint public safeRatioGap = 800000000000000000; // 20%?
|
||||||
uint public fee = 998000000000000000; // 0.2% (99.8%) on collateral? TODO: Is this right?
|
uint public fee = 998000000000000000; // 0.2% (99.8%) on collateral? TODO: Is this right?
|
||||||
// TODO: Set by construtor?
|
// TODO: Set by construtor?
|
||||||
mapping(address => bool) public isSupportedToken;
|
mapping(address => bool) public isSupportedToken;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user