From b1ebe44d9b6c113db03cc57697ac8b1548307b49 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Fri, 22 Jan 2021 15:08:13 +0530 Subject: [PATCH] Added compound and maker power resolver --- contracts/powerResolver/compound.sol | 89 +++++++++++++ contracts/powerResolver/makerDao.sol | 185 +++++++++++++++++++++++++++ 2 files changed, 274 insertions(+) create mode 100644 contracts/powerResolver/compound.sol create mode 100644 contracts/powerResolver/makerDao.sol diff --git a/contracts/powerResolver/compound.sol b/contracts/powerResolver/compound.sol new file mode 100644 index 0000000..700b621 --- /dev/null +++ b/contracts/powerResolver/compound.sol @@ -0,0 +1,89 @@ +pragma solidity ^0.6.0; +pragma experimental ABIEncoderV2; + +interface CTokenInterface { + function exchangeRateStored() external view returns (uint); + function borrowBalanceStored(address) external view returns (uint); + + function balanceOf(address) external view returns (uint); +} + +interface ListInterface { + function accounts() external view returns (uint64); + function accountID(address) external view returns (uint64); + function accountAddr(uint64) external view returns (address); +} + +contract Helpers { + + struct CompData { + uint balanceOfUser; + uint borrowBalanceStoredUser; + } + struct data { + address user; + CompData[] tokensData; + } + + struct datas { + CompData[] tokensData; + } +} + + +contract Resolver is Helpers { + + function getDSAWallets(uint len) public view returns(address[] memory) { + address[] memory wallets = new address[](len); + ListInterface list = ListInterface(0x4c8a1BEb8a87765788946D6B19C6C6355194AbEb); + uint _len = len == 0 ? uint(list.accounts()) : len; + for (uint i = 0; i < _len; i++) { + wallets[i] = list.accountAddr(uint64(i+1)); + } + return wallets; + } + + function getCompoundData(address owner, address[] memory cAddress) public view returns (CompData[] memory) { + CompData[] memory tokensData = new CompData[](cAddress.length); + for (uint i = 0; i < cAddress.length; i++) { + CTokenInterface cToken = CTokenInterface(cAddress[i]); + tokensData[i] = CompData( + cToken.balanceOf(owner), + cToken.borrowBalanceStored(owner) + ); + } + + return tokensData; + } + + function getCompoundDataByToken(address[] memory owners, address cAddress) public view returns (CompData[] memory) { + CompData[] memory tokensData = new CompData[](owners.length); + CTokenInterface cToken = CTokenInterface(cAddress); + for (uint i = 0; i < owners.length; i++) { + tokensData[i] = CompData( + cToken.balanceOf(owners[i]), + cToken.borrowBalanceStored(owners[i]) + ); + } + + return tokensData; + } + + function getPosition( + address[] memory owners, + address[] memory cAddress + ) + public + view + returns (datas[] memory) + { + datas[] memory _data = new datas[](cAddress.length); + for (uint i = 0; i < cAddress.length; i++) { + _data[i] = datas( + getCompoundDataByToken(owners, cAddress[i]) + ); + } + return _data; + } + +} diff --git a/contracts/powerResolver/makerDao.sol b/contracts/powerResolver/makerDao.sol new file mode 100644 index 0000000..f343347 --- /dev/null +++ b/contracts/powerResolver/makerDao.sol @@ -0,0 +1,185 @@ +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; + bytes32 colType; + uint collateral; + uint art; + } + + struct VaultIds { + address owner; + uint[] id; + } + + struct ColInfo { + uint price; + uint rate; + bytes32 ilk; + } + + /** + * @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)) + } + } + + function getColPrice(bytes32 ilk) internal view returns (uint price, uint rate) { + address spot = InstaMcdAddress(getMcdAddresses()).spot(); + address vat = InstaMcdAddress(getMcdAddresses()).vat(); + (, uint mat) = SpotLike(spot).ilks(ilk); + (,uint _rate,uint spotPrice,,) = VatLike(vat).ilks(ilk); + rate = _rate; + price = rmul(mat, spotPrice); + } +} + + +contract VaultResolver is Helpers { + function getVaultByIds(uint[] calldata ids) external view returns (VaultData[] memory) { + address manager = InstaMcdAddress(getMcdAddresses()).manager(); + VatLike vat = VatLike(ManagerLike(manager).vat()); + uint len = ids.length; + VaultData[] memory vaults = new VaultData[](len); + for (uint i = 0; i < len; i++) { + address urn = ManagerLike(manager).urns(ids[i]); + bytes32 ilk = ManagerLike(manager).ilks(ids[i]); + (uint ink, uint art) = vat.urns(ilk, urn); + vaults[i] = VaultData( + ids[i], + ilk, + ink, + art + ); + } + return vaults; + } + + function getIds(address[] calldata owners) external view returns (VaultIds[] memory) { + address manager = InstaMcdAddress(getMcdAddresses()).manager(); + address cdpManger = InstaMcdAddress(getMcdAddresses()).getCdps(); + uint len = owners.length; + VaultIds[] memory vaultIds = new VaultIds[](len); + for (uint i = 0; i < len; i++) { + (uint[] memory ids,,) = CdpsLike(cdpManger).getCdpsAsc(manager, owners[i]); + vaultIds[i] = VaultIds( + owners[i], + ids + ); + } + return vaultIds; + } + + 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 price, uint rate) = getColPrice(ilk); + colInfo[i] = ColInfo( + price, + rate, + ilk + ); + } + return colInfo; + } + +}