/ contracts / governance / ProtocolReader.sol
ProtocolReader.sol
  1  pragma solidity >=0.6.0;
  2  pragma experimental ABIEncoderV2;
  3  
  4  import "../deployment/Deployer.sol";
  5  import "../deployment/ManagedContract.sol";
  6  import "../interfaces/IProtocolSettings.sol";
  7  import "../interfaces/IOptionsExchange.sol";
  8  import "../interfaces/IERC20.sol";
  9  import "../interfaces/IGovernableLiquidityPool.sol";
 10  import "../interfaces/IProposalManager.sol";
 11  import "../interfaces/IProposalWrapper.sol";
 12  
 13  
 14  contract ProtocolReader is ManagedContract {
 15  
 16      IProtocolSettings private settings;
 17      IOptionsExchange private exchange;
 18      IProposalManager private proposalManager;
 19  
 20      struct poolData {
 21        string[] poolSymbols;
 22        address[] poolAddrs;
 23        uint[] poolApy;
 24        uint[] poolBalance;
 25        uint[] poolFreeBalance;
 26        uint[] userPoolBalance;
 27        uint[] userPoolUsdValue;
 28        uint[] poolMaturityDate;
 29        uint[] poolWithdrawalFee;
 30        string[] poolSymbolList;
 31      }
 32  
 33      struct poolPricesData {
 34        //address[] poolAddrs;
 35        uint[] poolBuyPrice;
 36        uint[] poolSellPrice;
 37        uint[] poolBuyPriceVolume;
 38        uint[] poolSellPriceVolume;
 39      }
 40  
 41      struct poolOptions {
 42        string[] poolSymbols;
 43        address[] poolAddrs;
 44        string[] poolOptionsRaw;
 45      }
 46  
 47      struct proposalData {
 48        address[] addr;
 49        address[] wrapperAddr;
 50        address[] govToken;
 51        IProposalWrapper.VoteType[] voteType;
 52        IProposalWrapper.Status[] status;
 53        bool[] isActive;
 54      }
 55  
 56      event IncentiveReward(address indexed from, uint value);
 57  
 58      function initialize(Deployer deployer) override internal {
 59          settings = IProtocolSettings(deployer.getContractAddress("ProtocolSettings"));
 60          exchange = IOptionsExchange(deployer.getContractAddress("OptionsExchange"));
 61          proposalManager = IProposalManager(deployer.getContractAddress("ProposalsManager"));
 62      }
 63  
 64      function listPoolsData(address account) external view returns (poolData memory){
 65        
 66        uint poolSymbolsMaxLen = exchange.totalPoolSymbols();
 67        poolData memory pd;
 68        pd.poolSymbols = new string[](poolSymbolsMaxLen);
 69        pd.poolAddrs = new address[](poolSymbolsMaxLen);
 70        pd.poolApy = new uint[](poolSymbolsMaxLen);
 71        pd.poolBalance = new uint[](poolSymbolsMaxLen);
 72        pd.poolFreeBalance = new uint[](poolSymbolsMaxLen);
 73        pd.userPoolBalance = new uint[](poolSymbolsMaxLen);
 74        pd.userPoolUsdValue = new uint[](poolSymbolsMaxLen);
 75        pd.poolMaturityDate = new uint[](poolSymbolsMaxLen);
 76        pd.poolWithdrawalFee = new uint[](poolSymbolsMaxLen);
 77        pd.poolSymbolList = new string[](poolSymbolsMaxLen);
 78  
 79  
 80        for (uint i=0; i < poolSymbolsMaxLen; i++) {
 81            string memory pSym = exchange.poolSymbols(i);
 82            pd.poolSymbols[i] = pSym;
 83            address poolAddr = exchange.getPoolAddress(pSym);
 84            pd.poolAddrs[i] = poolAddr;
 85            try IGovernableLiquidityPool(poolAddr).yield(365 * 24 * 60 * 60) returns (uint v) {
 86                pd.poolApy[i] = v;
 87            } catch (bytes memory /*lowLevelData*/) {
 88                pd.poolApy[i] = 0;
 89            }
 90            pd.poolBalance[i] = exchange.balanceOf(poolAddr);
 91            pd.userPoolBalance[i] = IERC20(poolAddr).balanceOf(account);
 92            try IGovernableLiquidityPool(poolAddr).valueOf(account) returns (uint v) {
 93                pd.userPoolUsdValue[i] = v;
 94            } catch (bytes memory /*lowLevelData*/) {
 95                pd.userPoolUsdValue[i] = 0;
 96            }
 97            pd.poolFreeBalance[i] = IGovernableLiquidityPool(poolAddr).calcFreeBalance();
 98            pd.poolMaturityDate[i] = IGovernableLiquidityPool(poolAddr).maturity();
 99            pd.poolWithdrawalFee[i] = IGovernableLiquidityPool(poolAddr).withdrawFee();
100            pd.poolSymbolList[i] = IGovernableLiquidityPool(poolAddr).listSymbols();
101        }
102  
103        return pd;
104      }
105  
106      function listPoolOptions() external view returns (poolOptions memory) {
107        uint poolSymbolsMaxLen = exchange.totalPoolSymbols();
108  
109        poolOptions memory po;
110        po.poolOptionsRaw = new string[](poolSymbolsMaxLen);
111        po.poolSymbols = new string[](poolSymbolsMaxLen);
112        po.poolAddrs = new address[](poolSymbolsMaxLen);
113  
114  
115        for(uint i=0; i< poolSymbolsMaxLen; i++) {
116          string memory pSym = exchange.poolSymbols(i);
117          po.poolSymbols[i] = pSym;
118          address poolAddr = exchange.getPoolAddress(pSym);
119          po.poolAddrs[i] = poolAddr;
120          po.poolOptionsRaw[i] = IGovernableLiquidityPool(poolAddr).listSymbols();
121  
122        }
123  
124        return po;
125      }
126  
127      function listPoolsPrices(string calldata optionSymbol, address[] calldata poolAddressList) external view returns (poolPricesData memory){
128        
129        poolPricesData memory ppd;
130        //ppd.poolAddrs = poolAddressList;
131        ppd.poolBuyPrice = new uint[](poolAddressList.length);
132        ppd.poolSellPrice = new uint[](poolAddressList.length);
133        ppd.poolBuyPriceVolume = new uint[](poolAddressList.length);
134        ppd.poolSellPriceVolume = new uint[](poolAddressList.length);
135  
136        for (uint i=0; i < poolAddressList.length; i++) {
137  
138            (ppd.poolBuyPrice[i], ppd.poolBuyPriceVolume[i]) = IGovernableLiquidityPool(poolAddressList[i]).queryBuy(optionSymbol, true);
139            (ppd.poolSellPrice[i], ppd.poolSellPriceVolume[i]) = IGovernableLiquidityPool(poolAddressList[i]).queryBuy(optionSymbol, false);
140        }
141  
142        return ppd;
143      }
144  
145      function listProposals() external view returns (proposalData memory) {
146        proposalData memory pd;
147        uint totalProposals = proposalManager.proposalCount();
148  
149        pd.addr = new address[](totalProposals);
150        pd.wrapperAddr = new address[](totalProposals);
151        pd.govToken = new address[](totalProposals);
152        pd.voteType = new IProposalWrapper.VoteType[](totalProposals);
153        pd.status = new IProposalWrapper.Status[](totalProposals);
154        pd.isActive = new bool[](totalProposals);
155  
156        for(uint i=1; i< totalProposals; i++){
157          pd.addr[i] = proposalManager.resolveProposal(i);
158          pd.wrapperAddr[i] = proposalManager.resolve(pd.addr[i]);
159          pd.govToken[i] = IProposalWrapper(pd.wrapperAddr[i]).getGovernanceToken();
160          pd.voteType[i] = IProposalWrapper(pd.wrapperAddr[i]).getVoteType();
161          pd.status[i] = IProposalWrapper(pd.wrapperAddr[i]).getStatus();
162          pd.isActive[i] = IProposalWrapper(pd.wrapperAddr[i]).isActive();
163        }
164        return pd;
165      }
166  }