From 95aaf9f0bae0d27d721e22cc7a65acc000047415 Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Fri, 26 Mar 2021 14:11:06 +0100 Subject: [PATCH 1/9] Start with Maker resolver --- contracts/protocols/reflexer.sol | 276 +++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 contracts/protocols/reflexer.sol diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol new file mode 100644 index 0000000..3dcddce --- /dev/null +++ b/contracts/protocols/reflexer.sol @@ -0,0 +1,276 @@ +/** + *Submitted for verification at Etherscan.io on 2020-07-29 +*/ + +pragma solidity ^0.6.0; +pragma experimental ABIEncoderV2; + +interface ManagerLike { + function ilks(uint) external view returns (bytes32); + function owns(uint) external view returns (address); + function urns(uint) external view returns (address); + function vat() external view returns (address); +} + +interface CdpsLike { + function getCdpsAsc(address, address) external view returns (uint[] memory, address[] memory, bytes32[] memory); +} + +interface VatLike { + function ilks(bytes32) external view returns (uint, uint, uint, uint, uint); + function dai(address) external view returns (uint); + function urns(bytes32, address) external view returns (uint, uint); + function gem(bytes32, address) external view returns (uint); +} + +interface JugLike { + function ilks(bytes32) external view returns (uint, uint); + function base() external view returns (uint); +} + +interface PotLike { + function dsr() external view returns (uint); + function pie(address) external view returns (uint); + function chi() external view returns (uint); +} + +interface SpotLike { + function ilks(bytes32) external view returns (PipLike, uint); +} + +interface PipLike { + function peek() external view returns (bytes32, bool); +} + +interface InstaMcdAddress { + function manager() external view returns (address); + function vat() external view returns (address); + function jug() external view returns (address); + function spot() external view returns (address); + function pot() external view returns (address); + function getCdps() external view returns (address); +} + + +contract DSMath { + + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x, "math-not-safe"); + } + + function sub(uint x, uint y) internal pure returns (uint z) { + z = x - y <= x ? x - y : 0; + } + + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x, "math-not-safe"); + } + + uint constant WAD = 10 ** 18; + uint constant RAY = 10 ** 27; + + function rmul(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, y), RAY / 2) / RAY; + } + + function wmul(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, y), WAD / 2) / WAD; + } + + function rdiv(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, RAY), y / 2) / y; + } + + function wdiv(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, WAD), y / 2) / y; + } + +} + + +contract Helpers is DSMath { + /** + * @dev get MakerDAO MCD Address contract + */ + function getMcdAddresses() public pure returns (address) { + return 0xF23196DF1C440345DE07feFbe556a5eF0dcD29F0; + } + + struct VaultData { + uint id; + address owner; + string colType; + uint collateral; + uint art; + uint debt; + uint liquidatedCol; + uint borrowRate; + uint colPrice; + uint liquidationRatio; + address vaultAddress; + } + + struct ColInfo { + uint borrowRate; + uint price; + uint liquidationRatio; + uint debtCelling; + uint totalDebt; + } + + /** + * @dev Convert String to bytes32. + */ + function stringToBytes32(string memory str) internal pure returns (bytes32 result) { + require(bytes(str).length != 0, "String-Empty"); + // solium-disable-next-line security/no-inline-assembly + assembly { + result := mload(add(str, 32)) + } + } + + /** + * @dev Convert bytes32 to String. + */ + function bytes32ToString(bytes32 _bytes32) internal pure returns (string memory) { + bytes32 _temp; + uint count; + for (uint256 i; i < 32; i++) { + _temp = _bytes32[i]; + if( _temp != bytes32(0)) { + count += 1; + } + } + bytes memory bytesArray = new bytes(count); + for (uint256 i; i < count; i++) { + bytesArray[i] = (_bytes32[i]); + } + return (string(bytesArray)); + } + + + function getFee(bytes32 ilk) internal view returns (uint fee) { + address jug = InstaMcdAddress(getMcdAddresses()).jug(); + (uint duty,) = JugLike(jug).ilks(ilk); + uint base = JugLike(jug).base(); + fee = add(duty, base); + } + + function getColPrice(bytes32 ilk) internal view returns (uint price) { + address spot = InstaMcdAddress(getMcdAddresses()).spot(); + address vat = InstaMcdAddress(getMcdAddresses()).vat(); + (, uint mat) = SpotLike(spot).ilks(ilk); + (,,uint spotPrice,,) = VatLike(vat).ilks(ilk); + price = rmul(mat, spotPrice); + } + + function getColRatio(bytes32 ilk) internal view returns (uint ratio) { + address spot = InstaMcdAddress(getMcdAddresses()).spot(); + (, ratio) = SpotLike(spot).ilks(ilk); + } + + function getDebtCeiling(bytes32 ilk) internal view returns (uint debtCeiling, uint totalDebt) { + address vat = InstaMcdAddress(getMcdAddresses()).vat(); + (uint totalArt,uint rate,,uint debtCeilingRad,) = VatLike(vat).ilks(ilk); + debtCeiling = debtCeilingRad / 10 ** 45; + totalDebt = rmul(totalArt, rate); + } +} + + +contract VaultResolver is Helpers { + function getVaults(address owner) external view returns (VaultData[] memory) { + address manager = InstaMcdAddress(getMcdAddresses()).manager(); + address cdpManger = InstaMcdAddress(getMcdAddresses()).getCdps(); + + (uint[] memory ids, address[] memory urns, bytes32[] memory ilks) = CdpsLike(cdpManger).getCdpsAsc(manager, owner); + VaultData[] memory vaults = new VaultData[](ids.length); + + for (uint i = 0; i < ids.length; i++) { + (uint ink, uint art) = VatLike(ManagerLike(manager).vat()).urns(ilks[i], urns[i]); + (,uint rate, uint priceMargin,,) = VatLike(ManagerLike(manager).vat()).ilks(ilks[i]); + uint mat = getColRatio(ilks[i]); + + vaults[i] = VaultData( + ids[i], + owner, + bytes32ToString(ilks[i]), + ink, + art, + rmul(art,rate), + VatLike(ManagerLike(manager).vat()).gem(ilks[i], urns[i]), + getFee(ilks[i]), + rmul(priceMargin, mat), + mat, + urns[i] + ); + } + return vaults; + } + + function getVaultById(uint id) external view returns (VaultData memory) { + address manager = InstaMcdAddress(getMcdAddresses()).manager(); + address urn = ManagerLike(manager).urns(id); + bytes32 ilk = ManagerLike(manager).ilks(id); + + (uint ink, uint art) = VatLike(ManagerLike(manager).vat()).urns(ilk, urn); + (,uint rate, uint priceMargin,,) = VatLike(ManagerLike(manager).vat()).ilks(ilk); + + uint mat = getColRatio(ilk); + + uint feeRate = getFee(ilk); + VaultData memory vault = VaultData( + id, + ManagerLike(manager).owns(id), + bytes32ToString(ilk), + ink, + art, + rmul(art,rate), + VatLike(ManagerLike(manager).vat()).gem(ilk, urn), + feeRate, + rmul(priceMargin, mat), + mat, + urn + ); + return vault; + } + + function getColInfo(string[] memory name) public view returns (ColInfo[] memory) { + ColInfo[] memory colInfo = new ColInfo[](name.length); + + for (uint i = 0; i < name.length; i++) { + bytes32 ilk = stringToBytes32(name[i]); + (uint debtCeiling, uint totalDebt) = getDebtCeiling(ilk); + colInfo[i] = ColInfo( + getFee(ilk), + getColPrice(ilk), + getColRatio(ilk), + debtCeiling, + totalDebt + ); + } + return colInfo; + } + +} + + +contract DSRResolver is VaultResolver { + function getDsrRate() public view returns (uint dsr) { + address pot = InstaMcdAddress(getMcdAddresses()).pot(); + dsr = PotLike(pot).dsr(); + } + + function getDaiPosition(address owner) external view returns (uint amt, uint dsr) { + address pot = InstaMcdAddress(getMcdAddresses()).pot(); + uint chi = PotLike(pot).chi(); + uint pie = PotLike(pot).pie(owner); + amt = rmul(pie,chi); + dsr = getDsrRate(); + } +} + + +contract InstaMakerResolver is DSRResolver { + string public constant name = "Maker-Resolver-v1.2"; +} \ No newline at end of file From d649cb68b7dc0e82871a1717bc70e899c0662d28 Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Fri, 26 Mar 2021 14:34:54 +0100 Subject: [PATCH 2/9] Renaming, Maker -> Reflexer --- contracts/protocols/reflexer.sol | 209 +++++++++++++++---------------- 1 file changed, 99 insertions(+), 110 deletions(-) diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol index 3dcddce..7bed96d 100644 --- a/contracts/protocols/reflexer.sol +++ b/contracts/protocols/reflexer.sol @@ -6,49 +6,45 @@ pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface ManagerLike { - function ilks(uint) external view returns (bytes32); - function owns(uint) external view returns (address); - function urns(uint) external view returns (address); - function vat() external view returns (address); + function collateralTypes(uint) external view returns (bytes32); + function ownsSAFE(uint) external view returns (address); + function safes(uint) external view returns (address); + function safeEngine() external view returns (address); } -interface CdpsLike { - function getCdpsAsc(address, address) external view returns (uint[] memory, address[] memory, bytes32[] memory); +interface GetSafesLike { + function getSafesAsc(address, address) external view returns (uint[] memory, address[] memory, bytes32[] memory); } -interface VatLike { - function ilks(bytes32) external view returns (uint, uint, uint, uint, uint); - function dai(address) external view returns (uint); - function urns(bytes32, address) external view returns (uint, uint); - function gem(bytes32, address) external view returns (uint); +interface SAFEEngineLike { + function collateralTypes(bytes32) external view returns (uint, uint, uint, uint, uint); + function coinBalance(address) external view returns (uint); + function safes(bytes32, address) external view returns (uint, uint); + function tokenCollateral(bytes32, address) external view returns (uint); } -interface JugLike { - function ilks(bytes32) external view returns (uint, uint); - function base() external view returns (uint); +interface TaxCollectorLike { + function collateralTypes(bytes32) external view returns (uint, uint); + function globalStabilityFee() external view returns (uint); } -interface PotLike { - function dsr() external view returns (uint); - function pie(address) external view returns (uint); - function chi() external view returns (uint); +interface OracleRelayerLike { + function collateralTypes(bytes32) external view returns (OracleLike, uint, uint); + function redemptionRate() external view returns (uint); + } -interface SpotLike { - function ilks(bytes32) external view returns (PipLike, uint); +interface OracleLike { + function getResultWithValidity() external view returns (bytes32, bool); } -interface PipLike { - function peek() external view returns (bytes32, bool); -} - -interface InstaMcdAddress { +interface InstaReflexerAddress { function manager() external view returns (address); - function vat() external view returns (address); - function jug() external view returns (address); - function spot() external view returns (address); + function safeEngine() external view returns (address); + function taxCollector() external view returns (address); + function oracleRelayer() external view returns (address); + function GetSafes() external view returns (address); function pot() external view returns (address); - function getCdps() external view returns (address); } @@ -92,22 +88,23 @@ contract Helpers is DSMath { /** * @dev get MakerDAO MCD Address contract */ - function getMcdAddresses() public pure returns (address) { - return 0xF23196DF1C440345DE07feFbe556a5eF0dcD29F0; + function getReflexerAddresses() public pure returns (address) { + // TODO: Set the actual Reflexer address getter contract + return 0x0000000000000000000000000000000000000000; } - struct VaultData { + struct SafeData { uint id; address owner; string colType; uint collateral; - uint art; uint debt; + uint adjustedDebt; uint liquidatedCol; uint borrowRate; uint colPrice; uint liquidationRatio; - address vaultAddress; + address safeAddress; } struct ColInfo { @@ -149,102 +146,102 @@ contract Helpers is DSMath { } - function getFee(bytes32 ilk) internal view returns (uint fee) { - address jug = InstaMcdAddress(getMcdAddresses()).jug(); - (uint duty,) = JugLike(jug).ilks(ilk); - uint base = JugLike(jug).base(); - fee = add(duty, base); + function getFee(bytes32 collateralType) internal view returns (uint fee) { + address taxCollector = InstaReflexerAddress(getReflexerAddresses()).taxCollector(); + (uint stabilityFee,) = TaxCollectorLike(taxCollector).collateralTypes(collateralType); + uint globalStabilityFee = TaxCollectorLike(taxCollector).globalStabilityFee(); + fee = add(stabilityFee, globalStabilityFee); } - function getColPrice(bytes32 ilk) internal view returns (uint price) { - address spot = InstaMcdAddress(getMcdAddresses()).spot(); - address vat = InstaMcdAddress(getMcdAddresses()).vat(); - (, uint mat) = SpotLike(spot).ilks(ilk); - (,,uint spotPrice,,) = VatLike(vat).ilks(ilk); - price = rmul(mat, spotPrice); + function getColPrice(bytes32 collateralType) internal view returns (uint price) { + address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); + address safeEngine = InstaReflexerAddress(getReflexerAddresses()).safeEngine(); + (, uint safetyCRatio,) = OracleRelayerLike(oracleRelayer).collateralTypes(collateralType); + (,,uint spotPrice,,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType); + price = rmul(safetyCRatio, spotPrice); } - function getColRatio(bytes32 ilk) internal view returns (uint ratio) { - address spot = InstaMcdAddress(getMcdAddresses()).spot(); - (, ratio) = SpotLike(spot).ilks(ilk); + function getColRatio(bytes32 collateralType) internal view returns (uint ratio) { + address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); + (, ratio,) = OracleRelayerLike(oracleRelayer).collateralTypes(collateralType); } - function getDebtCeiling(bytes32 ilk) internal view returns (uint debtCeiling, uint totalDebt) { - address vat = InstaMcdAddress(getMcdAddresses()).vat(); - (uint totalArt,uint rate,,uint debtCeilingRad,) = VatLike(vat).ilks(ilk); + function getDebtCeiling(bytes32 collateralType) internal view returns (uint debtCeiling, uint totalDebt) { + address safeEngine = InstaReflexerAddress(getReflexerAddresses()).safeEngine(); + (uint globalDebt,uint rate,,uint debtCeilingRad,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType); debtCeiling = debtCeilingRad / 10 ** 45; - totalDebt = rmul(totalArt, rate); + totalDebt = rmul(globalDebt, rate); } } -contract VaultResolver is Helpers { - function getVaults(address owner) external view returns (VaultData[] memory) { - address manager = InstaMcdAddress(getMcdAddresses()).manager(); - address cdpManger = InstaMcdAddress(getMcdAddresses()).getCdps(); +contract SafeResolver is Helpers { + function getSafes(address owner) external view returns (SafeData[] memory) { + address manager = InstaReflexerAddress(getReflexerAddresses()).manager(); + address safeManger = InstaReflexerAddress(getReflexerAddresses()).GetSafes(); - (uint[] memory ids, address[] memory urns, bytes32[] memory ilks) = CdpsLike(cdpManger).getCdpsAsc(manager, owner); - VaultData[] memory vaults = new VaultData[](ids.length); + (uint[] memory ids, address[] memory handlers, bytes32[] memory collateralTypes) = GetSafesLike(safeManger).getSafesAsc(manager, owner); + SafeData[] memory safes = new SafeData[](ids.length); for (uint i = 0; i < ids.length; i++) { - (uint ink, uint art) = VatLike(ManagerLike(manager).vat()).urns(ilks[i], urns[i]); - (,uint rate, uint priceMargin,,) = VatLike(ManagerLike(manager).vat()).ilks(ilks[i]); - uint mat = getColRatio(ilks[i]); + (uint collateral, uint debt) = SAFEEngineLike(ManagerLike(manager).safeEngine()).safes(collateralTypes[i], handlers[i]); + (,uint rate, uint priceMargin,,) = SAFEEngineLike(ManagerLike(manager).safeEngine()).collateralTypes(collateralTypes[i]); + uint safetyCRatio = getColRatio(collateralTypes[i]); - vaults[i] = VaultData( + safes[i] = SafeData( ids[i], owner, - bytes32ToString(ilks[i]), - ink, - art, - rmul(art,rate), - VatLike(ManagerLike(manager).vat()).gem(ilks[i], urns[i]), - getFee(ilks[i]), - rmul(priceMargin, mat), - mat, - urns[i] + bytes32ToString(collateralTypes[i]), + collateral, + debt, + rmul(debt,rate), + SAFEEngineLike(ManagerLike(manager).safeEngine()).tokenCollateral(collateralTypes[i], handlers[i]), + getFee(collateralTypes[i]), + rmul(priceMargin, safetyCRatio), + safetyCRatio, + handlers[i] ); } - return vaults; + return safes; } - function getVaultById(uint id) external view returns (VaultData memory) { - address manager = InstaMcdAddress(getMcdAddresses()).manager(); - address urn = ManagerLike(manager).urns(id); - bytes32 ilk = ManagerLike(manager).ilks(id); + function getSafeById(uint id) external view returns (SafeData memory) { + address manager = InstaReflexerAddress(getReflexerAddresses()).manager(); + address handler = ManagerLike(manager).safes(id); + bytes32 collateralType = ManagerLike(manager).collateralTypes(id); - (uint ink, uint art) = VatLike(ManagerLike(manager).vat()).urns(ilk, urn); - (,uint rate, uint priceMargin,,) = VatLike(ManagerLike(manager).vat()).ilks(ilk); + (uint collateral, uint debt) = SAFEEngineLike(ManagerLike(manager).safeEngine()).safes(collateralType, handler); + (,uint rate, uint priceMargin,,) = SAFEEngineLike(ManagerLike(manager).safeEngine()).collateralTypes(collateralType); - uint mat = getColRatio(ilk); + uint safetyCRatio = getColRatio(collateralType); - uint feeRate = getFee(ilk); - VaultData memory vault = VaultData( + uint feeRate = getFee(collateralType); + SafeData memory safe = SafeData( id, - ManagerLike(manager).owns(id), - bytes32ToString(ilk), - ink, - art, - rmul(art,rate), - VatLike(ManagerLike(manager).vat()).gem(ilk, urn), + ManagerLike(manager).ownsSAFE(id), + bytes32ToString(collateralType), + collateral, + debt, + rmul(debt,rate), + SAFEEngineLike(ManagerLike(manager).safeEngine()).tokenCollateral(collateralType, handler), feeRate, - rmul(priceMargin, mat), - mat, - urn + rmul(priceMargin, safetyCRatio), + safetyCRatio, + handler ); - return vault; + return safe; } function getColInfo(string[] memory name) public view returns (ColInfo[] memory) { ColInfo[] memory colInfo = new ColInfo[](name.length); for (uint i = 0; i < name.length; i++) { - bytes32 ilk = stringToBytes32(name[i]); - (uint debtCeiling, uint totalDebt) = getDebtCeiling(ilk); + bytes32 collateralType = stringToBytes32(name[i]); + (uint debtCeiling, uint totalDebt) = getDebtCeiling(collateralType); colInfo[i] = ColInfo( - getFee(ilk), - getColPrice(ilk), - getColRatio(ilk), + getFee(collateralType), + getColPrice(collateralType), + getColRatio(collateralType), debtCeiling, totalDebt ); @@ -255,22 +252,14 @@ contract VaultResolver is Helpers { } -contract DSRResolver is VaultResolver { - function getDsrRate() public view returns (uint dsr) { - address pot = InstaMcdAddress(getMcdAddresses()).pot(); - dsr = PotLike(pot).dsr(); - } - - function getDaiPosition(address owner) external view returns (uint amt, uint dsr) { - address pot = InstaMcdAddress(getMcdAddresses()).pot(); - uint chi = PotLike(pot).chi(); - uint pie = PotLike(pot).pie(owner); - amt = rmul(pie,chi); - dsr = getDsrRate(); +contract RedemptionRateResolver is SafeResolver { + function getRedemtpionRate() external view returns (uint redemptionRate) { + address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); + redemptionRate = OracleRelayerLike(oracleRelayer).redemptionRate(); } } -contract InstaMakerResolver is DSRResolver { - string public constant name = "Maker-Resolver-v1.2"; +contract InstaReflexerResolver is RedemptionRateResolver { + string public constant name = "Reflexer-Resolver-v1"; } \ No newline at end of file From 65e4af8e7efedca142ec34951dae51694b565e05 Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Fri, 26 Mar 2021 14:49:59 +0100 Subject: [PATCH 3/9] Forgot to remove the pot --- contracts/protocols/reflexer.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol index 7bed96d..e767ac9 100644 --- a/contracts/protocols/reflexer.sol +++ b/contracts/protocols/reflexer.sol @@ -44,7 +44,6 @@ interface InstaReflexerAddress { function taxCollector() external view returns (address); function oracleRelayer() external view returns (address); function GetSafes() external view returns (address); - function pot() external view returns (address); } From 5404fbec277ee10bc94d8c6b6f2b56eb25078fee Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Fri, 26 Mar 2021 15:43:47 +0100 Subject: [PATCH 4/9] Typo --- contracts/protocols/reflexer.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol index e767ac9..269fe05 100644 --- a/contracts/protocols/reflexer.sol +++ b/contracts/protocols/reflexer.sol @@ -252,7 +252,7 @@ contract SafeResolver is Helpers { contract RedemptionRateResolver is SafeResolver { - function getRedemtpionRate() external view returns (uint redemptionRate) { + function getRedemptionRate() external view returns (uint redemptionRate) { address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); redemptionRate = OracleRelayerLike(oracleRelayer).redemptionRate(); } From 529a5549bc111deb23ca57d7b58b3c1a844ef064 Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Fri, 26 Mar 2021 16:57:25 +0100 Subject: [PATCH 5/9] Hardcode addresses in a struct --- contracts/protocols/reflexer.sol | 55 +++++++++++++++++--------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol index 269fe05..3f8d8bd 100644 --- a/contracts/protocols/reflexer.sol +++ b/contracts/protocols/reflexer.sol @@ -38,15 +38,6 @@ interface OracleLike { function getResultWithValidity() external view returns (bytes32, bool); } -interface InstaReflexerAddress { - function manager() external view returns (address); - function safeEngine() external view returns (address); - function taxCollector() external view returns (address); - function oracleRelayer() external view returns (address); - function GetSafes() external view returns (address); -} - - contract DSMath { function add(uint x, uint y) internal pure returns (uint z) { @@ -84,13 +75,6 @@ contract DSMath { contract Helpers is DSMath { - /** - * @dev get MakerDAO MCD Address contract - */ - function getReflexerAddresses() public pure returns (address) { - // TODO: Set the actual Reflexer address getter contract - return 0x0000000000000000000000000000000000000000; - } struct SafeData { uint id; @@ -114,6 +98,27 @@ contract Helpers is DSMath { uint totalDebt; } + struct ReflexerAddress { + address manager; + address safeEngine; + address taxCollector; + address oracleRelayer; + address getSafes; + } + + /** + * @dev get Reflexer Address contract + */ + function getReflexerAddresses() public pure returns (ReflexerAddress memory) { + return ReflexerAddress( + 0xEfe0B4cA532769a3AE758fD82E1426a03A94F185, // manager + 0xCC88a9d330da1133Df3A7bD823B95e52511A6962, // safeEngine + 0xcDB05aEda142a1B0D6044C09C64e4226c1a281EB, // taxCollector + 0x4ed9C0dCa0479bC64d8f4EB3007126D5791f7851, // oracleRelayer + 0xdf4BC9aA98cC8eCd90Ba2BEe73aD4a1a9C8d202B // getSafes + ); + } + /** * @dev Convert String to bytes32. */ @@ -146,27 +151,27 @@ contract Helpers is DSMath { function getFee(bytes32 collateralType) internal view returns (uint fee) { - address taxCollector = InstaReflexerAddress(getReflexerAddresses()).taxCollector(); + address taxCollector = getReflexerAddresses().taxCollector; (uint stabilityFee,) = TaxCollectorLike(taxCollector).collateralTypes(collateralType); uint globalStabilityFee = TaxCollectorLike(taxCollector).globalStabilityFee(); fee = add(stabilityFee, globalStabilityFee); } function getColPrice(bytes32 collateralType) internal view returns (uint price) { - address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); - address safeEngine = InstaReflexerAddress(getReflexerAddresses()).safeEngine(); + address oracleRelayer = getReflexerAddresses().oracleRelayer; + address safeEngine = getReflexerAddresses().safeEngine; (, uint safetyCRatio,) = OracleRelayerLike(oracleRelayer).collateralTypes(collateralType); (,,uint spotPrice,,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType); price = rmul(safetyCRatio, spotPrice); } function getColRatio(bytes32 collateralType) internal view returns (uint ratio) { - address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); + address oracleRelayer = getReflexerAddresses().oracleRelayer; (, ratio,) = OracleRelayerLike(oracleRelayer).collateralTypes(collateralType); } function getDebtCeiling(bytes32 collateralType) internal view returns (uint debtCeiling, uint totalDebt) { - address safeEngine = InstaReflexerAddress(getReflexerAddresses()).safeEngine(); + address safeEngine = getReflexerAddresses().safeEngine; (uint globalDebt,uint rate,,uint debtCeilingRad,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType); debtCeiling = debtCeilingRad / 10 ** 45; totalDebt = rmul(globalDebt, rate); @@ -176,8 +181,8 @@ contract Helpers is DSMath { contract SafeResolver is Helpers { function getSafes(address owner) external view returns (SafeData[] memory) { - address manager = InstaReflexerAddress(getReflexerAddresses()).manager(); - address safeManger = InstaReflexerAddress(getReflexerAddresses()).GetSafes(); + address manager = getReflexerAddresses().manager; + address safeManger = getReflexerAddresses().getSafes; (uint[] memory ids, address[] memory handlers, bytes32[] memory collateralTypes) = GetSafesLike(safeManger).getSafesAsc(manager, owner); SafeData[] memory safes = new SafeData[](ids.length); @@ -205,7 +210,7 @@ contract SafeResolver is Helpers { } function getSafeById(uint id) external view returns (SafeData memory) { - address manager = InstaReflexerAddress(getReflexerAddresses()).manager(); + address manager = getReflexerAddresses().manager; address handler = ManagerLike(manager).safes(id); bytes32 collateralType = ManagerLike(manager).collateralTypes(id); @@ -253,7 +258,7 @@ contract SafeResolver is Helpers { contract RedemptionRateResolver is SafeResolver { function getRedemptionRate() external view returns (uint redemptionRate) { - address oracleRelayer = InstaReflexerAddress(getReflexerAddresses()).oracleRelayer(); + address oracleRelayer = getReflexerAddresses().oracleRelayer; redemptionRate = OracleRelayerLike(oracleRelayer).redemptionRate(); } } From 1228afdf97edeb6473c3a64d247c9c7907b0a3e9 Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Fri, 26 Mar 2021 17:00:13 +0100 Subject: [PATCH 6/9] typo --- contracts/protocols/reflexer.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol index 3f8d8bd..0b54366 100644 --- a/contracts/protocols/reflexer.sol +++ b/contracts/protocols/reflexer.sol @@ -98,7 +98,7 @@ contract Helpers is DSMath { uint totalDebt; } - struct ReflexerAddress { + struct ReflexerAddresses { address manager; address safeEngine; address taxCollector; @@ -109,8 +109,8 @@ contract Helpers is DSMath { /** * @dev get Reflexer Address contract */ - function getReflexerAddresses() public pure returns (ReflexerAddress memory) { - return ReflexerAddress( + function getReflexerAddresses() public pure returns (ReflexerAddresses memory) { + return ReflexerAddresses( 0xEfe0B4cA532769a3AE758fD82E1426a03A94F185, // manager 0xCC88a9d330da1133Df3A7bD823B95e52511A6962, // safeEngine 0xcDB05aEda142a1B0D6044C09C64e4226c1a281EB, // taxCollector From d52d1263f2d5573d0b050ac7ca42c439ae026d0a Mon Sep 17 00:00:00 2001 From: Mubaris NK Date: Sun, 28 Mar 2021 16:14:29 +0530 Subject: [PATCH 7/9] Add user stable borrow rate --- contracts/protocols/aave_v2.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/protocols/aave_v2.sol b/contracts/protocols/aave_v2.sol index c480c12..f1a9e7d 100644 --- a/contracts/protocols/aave_v2.sol +++ b/contracts/protocols/aave_v2.sol @@ -152,6 +152,7 @@ contract AaveHelpers is DSMath { uint variableBorrowBalance; uint supplyRate; uint stableBorrowRate; + uint userStableBorrowRate; uint variableBorrowRate; bool isCollateral; AaveTokenData aaveTokenData; @@ -230,7 +231,9 @@ contract AaveHelpers is DSMath { tokenData.supplyBalance, tokenData.stableBorrowBalance, tokenData.variableBorrowBalance, - ,,,,, + ,, + tokenData.userStableBorrowRate, + ,, tokenData.isCollateral ) = aaveData.getUserReserveData(token, user); From cbd562acc1eaf26207a2e435b3e2d4c4ba138356 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 29 Mar 2021 03:48:29 +0530 Subject: [PATCH 8/9] Updated aave v2 resolver version --- contracts/protocols/aave_v2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/protocols/aave_v2.sol b/contracts/protocols/aave_v2.sol index f1a9e7d..2cf4595 100644 --- a/contracts/protocols/aave_v2.sol +++ b/contracts/protocols/aave_v2.sol @@ -303,5 +303,5 @@ contract Resolver is AaveHelpers { } contract InstaAaveV2Resolver is Resolver { - string public constant name = "AaveV2-Resolver-v1.3"; + string public constant name = "AaveV2-Resolver-v1.4"; } From 7bbf613c5f817e45bc24a5f648d46fc64517f498 Mon Sep 17 00:00:00 2001 From: Guillaume Felley Date: Mon, 29 Mar 2021 11:19:39 +0200 Subject: [PATCH 9/9] Add the debt floor to collateral info --- contracts/protocols/reflexer.sol | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/contracts/protocols/reflexer.sol b/contracts/protocols/reflexer.sol index 0b54366..0f03393 100644 --- a/contracts/protocols/reflexer.sol +++ b/contracts/protocols/reflexer.sol @@ -94,7 +94,8 @@ contract Helpers is DSMath { uint borrowRate; uint price; uint liquidationRatio; - uint debtCelling; + uint debtCeiling; + uint debtFloor; uint totalDebt; } @@ -170,10 +171,11 @@ contract Helpers is DSMath { (, ratio,) = OracleRelayerLike(oracleRelayer).collateralTypes(collateralType); } - function getDebtCeiling(bytes32 collateralType) internal view returns (uint debtCeiling, uint totalDebt) { + function getDebtState(bytes32 collateralType) internal view returns (uint debtCeiling, uint debtFloor, uint totalDebt) { address safeEngine = getReflexerAddresses().safeEngine; - (uint globalDebt,uint rate,,uint debtCeilingRad,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType); + (uint globalDebt,uint rate,,uint debtCeilingRad, uint debtFloorRad) = SAFEEngineLike(safeEngine).collateralTypes(collateralType); debtCeiling = debtCeilingRad / 10 ** 45; + debtFloor = debtFloorRad / 10 ** 45; totalDebt = rmul(globalDebt, rate); } } @@ -241,12 +243,13 @@ contract SafeResolver is Helpers { for (uint i = 0; i < name.length; i++) { bytes32 collateralType = stringToBytes32(name[i]); - (uint debtCeiling, uint totalDebt) = getDebtCeiling(collateralType); + (uint debtCeiling, uint debtFloor, uint totalDebt) = getDebtState(collateralType); colInfo[i] = ColInfo( getFee(collateralType), getColPrice(collateralType), getColRatio(collateralType), debtCeiling, + debtFloor, totalDebt ); }