2023-06-19 00:08:10 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< title > LCOV - lcov.info - proposals/CRVUSDInstancesProposal.sol< / title >
< link rel = "stylesheet" type = "text/css" href = "../gcov.css" >
< / head >
< body >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "title" > LCOV - code coverage report< / td > < / tr >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr >
< td width = "100%" >
< table cellpadding = 1 border = 0 width = "100%" >
< tr >
< td width = "10%" class = "headerItem" > Current view:< / td >
< td width = "35%" class = "headerValue" > < a href = "../index.html" > top level< / a > - < a href = "index.html" > proposals< / a > - CRVUSDInstancesProposal.sol< span style = "font-size: 80%;" > (source / < a href = "CRVUSDInstancesProposal.sol.func-sort-c.html" > functions< / a > )< / span > < / td >
< td width = "5%" > < / td >
< td width = "15%" > < / td >
< td width = "10%" class = "headerCovTableHead" > Hit< / td >
< td width = "10%" class = "headerCovTableHead" > Total< / td >
< td width = "15%" class = "headerCovTableHead" > Coverage< / td >
< / tr >
< tr >
< td class = "headerItem" > Test:< / td >
< td class = "headerValue" > lcov.info< / td >
< td > < / td >
< td class = "headerItem" > Lines:< / td >
< td class = "headerCovTableEntry" > 51< / td >
< td class = "headerCovTableEntry" > 51< / td >
< td class = "headerCovTableEntryHi" > 100.0 %< / td >
< / tr >
< tr >
< td class = "headerItem" > Date:< / td >
2023-06-20 21:04:29 +00:00
< td class = "headerValue" > 2023-06-20 21:04:08< / td >
2023-06-19 00:08:10 +00:00
< td > < / td >
< td class = "headerItem" > Functions:< / td >
< td class = "headerCovTableEntry" > 2< / td >
< td class = "headerCovTableEntry" > 2< / td >
< td class = "headerCovTableEntryHi" > 100.0 %< / td >
< / tr >
< tr >
< td class = "headerItem" > Legend:< / td >
< td class = "headerValueLeg" > Lines:
< span class = "coverLegendCov" > hit< / span >
< span class = "coverLegendNoCov" > not hit< / span >
< / td >
< td > < / td >
< / tr >
< tr > < td > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< / td >
< / tr >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< table cellpadding = 0 cellspacing = 0 border = 0 >
< tr >
< td > < br > < / td >
< / tr >
< tr >
< td >
< pre class = "sourceHeading" > Line data Source code< / pre >
< pre class = "source" >
< a name = "1" > < span class = "lineNum" > 1 < / span > : // SPDX-License-Identifier: MIT< / a >
< a name = "2" > < span class = "lineNum" > 2 < / span > : < / a >
< a name = "3" > < span class = "lineNum" > 3 < / span > : pragma solidity ^0.6.12;< / a >
< a name = "4" > < span class = "lineNum" > 4 < / span > : pragma experimental ABIEncoderV2;< / a >
< a name = "5" > < span class = "lineNum" > 5 < / span > : < / a >
< a name = "6" > < span class = "lineNum" > 6 < / span > : // OZ Imports< / a >
< a name = "7" > < span class = "lineNum" > 7 < / span > : < / a >
< a name = "8" > < span class = "lineNum" > 8 < / span > : import { AdminUpgradeableProxy } from " ../common/AdminUpgradeableProxy.sol" ;< / a >
< a name = "9" > < span class = "lineNum" > 9 < / span > : < / a >
< a name = "10" > < span class = "lineNum" > 10 < / span > : // Tornado imports< / a >
< a name = "11" > < span class = "lineNum" > 11 < / span > : < / a >
< a name = "12" > < span class = "lineNum" > 12 < / span > : import { ITornadoInstance } from " tornado-anonymity-mining/contracts/interfaces/ITornadoInstance.sol" ;< / a >
< a name = "13" > < span class = "lineNum" > 13 < / span > : < / a >
< a name = "14" > < span class = "lineNum" > 14 < / span > : // Local V2 imports< / a >
< a name = "15" > < span class = "lineNum" > 15 < / span > : < / a >
< a name = "16" > < span class = "lineNum" > 16 < / span > : import { FeeOracleManager } from " ../v2/FeeOracleManager.sol" ;< / a >
< a name = "17" > < span class = "lineNum" > 17 < / span > : < / a >
< a name = "18" > < span class = "lineNum" > 18 < / span > : import { InstanceRegistry } from " ../v2/InstanceRegistry.sol" ;< / a >
< a name = "19" > < span class = "lineNum" > 19 < / span > : < / a >
< a name = "20" > < span class = "lineNum" > 20 < / span > : import { CurveFeeOracle, ICurvePriceOracle, CurveChainedOracles } from " ../v2/CurveFeeOracle.sol" ;< / a >
< a name = "21" > < span class = "lineNum" > 21 < / span > : < / a >
< a name = "22" > < span class = "lineNum" > 22 < / span > : import { UniswapFeeOracle } from " ../v2/UniswapFeeOracle.sol" ;< / a >
< a name = "23" > < span class = "lineNum" > 23 < / span > : < / a >
< a name = "24" > < span class = "lineNum" > 24 < / span > : import { TornadoRouter } from " ../v2/TornadoRouter.sol" ;< / a >
< a name = "25" > < span class = "lineNum" > 25 < / span > : < / a >
< a name = "26" > < span class = "lineNum" > 26 < / span > : /**< / a >
< a name = "27" > < span class = "lineNum" > 27 < / span > : * @title CRVUSDInstancesProposal< / a >
< a name = "28" > < span class = "lineNum" > 28 < / span > : * @author AlienTornadosaurusHex< / a >
< a name = "29" > < span class = "lineNum" > 29 < / span > : * @notice Proposal to add crvUSD instances in 100, 1000, 10000, 100000, 1000000 denominations.< / a >
< a name = "30" > < span class = "lineNum" > 30 < / span > : */< / a >
< a name = "31" > < span class = "lineNum" > 31 < / span > : contract CRVUSDInstancesProposal {< / a >
< a name = "32" > < span class = "lineNum" > 32 < / span > : /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VARIABLES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */< / a >
< a name = "33" > < span class = "lineNum" > 33 < / span > : < / a >
< a name = "34" > < span class = "lineNum" > 34 < / span > : /* @dev The first Curve pool which is capable of being used as a safe oracle due to analytical EMA price */< / a >
< a name = "35" > < span class = "lineNum" > 35 < / span > : address public constant crvUSDUSDCStableswap2Pool = 0x4DEcE678ceceb27446b35C672dC7d61F30bAD69E;< / a >
< a name = "36" > < span class = "lineNum" > 36 < / span > : < / a >
< a name = "37" > < span class = "lineNum" > 37 < / span > : /* @dev The second Curve pool which is capable of being used as a safe oracle due to analytical EMA price */< / a >
< a name = "38" > < span class = "lineNum" > 38 < / span > : address public constant tricryptoUSDCPool = 0x7F86Bf177Dd4F3494b841a37e810A34dD56c829B;< / a >
< a name = "39" > < span class = "lineNum" > 39 < / span > : < / a >
< a name = "40" > < span class = "lineNum" > 40 < / span > : /* @dev The InstanceRegistry contract, for registering instances, proxy must be upgraded */< / a >
< a name = "41" > < span class = "lineNum" > 41 < / span > : InstanceRegistry public constant instanceRegistry =< / a >
< a name = "42" > < span class = "lineNum" > 42 < / span > : InstanceRegistry(0xB20c66C4DE72433F3cE747b58B86830c459CA911);< / a >
< a name = "43" > < span class = "lineNum" > 43 < / span > : < / a >
< a name = "44" > < span class = "lineNum" > 44 < / span > : /* @dev The FeeOracleManager contract, proxy must be upgraded */< / a >
< a name = "45" > < span class = "lineNum" > 45 < / span > : FeeOracleManager public constant feeOracleManager =< / a >
< a name = "46" > < span class = "lineNum" > 46 < / span > : FeeOracleManager(0x5f6c97C6AD7bdd0AE7E0Dd4ca33A4ED3fDabD4D7);< / a >
< a name = "47" > < span class = "lineNum" > 47 < / span > : < / a >
< a name = "48" > < span class = "lineNum" > 48 < / span > : /* @dev This is the Uniswap V3 Oracle which we will use for all of our traditional instances, but it will< / a >
< a name = "49" > < span class = "lineNum" > 49 < / span > : also help the Curve instances, the former must have been deployed with the address of this */< / a >
< a name = "50" > < span class = "lineNum" > 50 < / span > : UniswapFeeOracle public immutable uniswapFeeOracle;< / a >
< a name = "51" > < span class = "lineNum" > 51 < / span > : < / a >
< a name = "52" > < span class = "lineNum" > 52 < / span > : /* @dev This is the CurveFeeOracle contract which will be deployed beforehand and which will be able to< / a >
< a name = "53" > < span class = "lineNum" > 53 < / span > : use multiple Curve pools as oracles, at once. */< / a >
< a name = "54" > < span class = "lineNum" > 54 < / span > : CurveFeeOracle public immutable curveFeeOracle;< / a >
< a name = "55" > < span class = "lineNum" > 55 < / span > : < / a >
< a name = "56" > < span class = "lineNum" > 56 < / span > : /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LOGIC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */< / a >
< a name = "57" > < span class = "lineNum" > 57 < / span > : < / a >
< a name = "58" > < span class = "lineNum" > 58 < / span > : constructor(address _deployedCurveFeeOracleAddress, address _deployedUniswapFeeOracleAddress) public {< / a >
< a name = "59" > < span class = "lineNum" > 59 < / span > : curveFeeOracle = CurveFeeOracle(_deployedCurveFeeOracleAddress);< / a >
< a name = "60" > < span class = "lineNum" > 60 < / span > : uniswapFeeOracle = UniswapFeeOracle(_deployedUniswapFeeOracleAddress);< / a >
< a name = "61" > < span class = "lineNum" > 61 < / span > : }< / a >
< a name = "62" > < span class = "lineNum" > 62 < / span > : < / a >
< a name = "63" > < span class = "lineNum" > 63 < / span > : /**< / a >
< a name = "64" > < span class = "lineNum" > 64 < / span > : * @dev This function also executes further internal functions inlined below.< / a >
< a name = "65" > < span class = "lineNum" > 65 < / span > : */< / a >
< a name = "66" > < span class = "lineNum" > 66 < / span > : function executeProposal() external {< / a >
< a name = "67" > < span class = "lineNum" > 67 < / span > : // Load the deployed crvUSD instances< / a >
< a name = "68" > < span class = "lineNum" > 68 < / span > : < / a >
< a name = "69" > < span class = "lineNum" > 69 < / span > < span class = "lineCov" > 2 : ITornadoInstance cu100 = ITornadoInstance(0x913a73486Dc4AA3832A56d461542836C1eeB93be);< / span > < / a >
< a name = "70" > < span class = "lineNum" > 70 < / span > < span class = "lineCov" > 2 : ITornadoInstance cu1_000 = ITornadoInstance(0x5A6b3C829dB3e938C885000c6E93CF35E74876a4);< / span > < / a >
< a name = "71" > < span class = "lineNum" > 71 < / span > < span class = "lineCov" > 2 : ITornadoInstance cu10_000 = ITornadoInstance(0x49f173CDAB99a2C3800F1255393DF9B7a17B82Bb);< / span > < / a >
< a name = "72" > < span class = "lineNum" > 72 < / span > < span class = "lineCov" > 2 : ITornadoInstance cu100_000 = ITornadoInstance(0x4640Dffc9fD0B113B983e3A350b070a119CA143C);< / span > < / a >
< a name = "73" > < span class = "lineNum" > 73 < / span > < span class = "lineCov" > 2 : ITornadoInstance cu1_000_000 = ITornadoInstance(0xc4eA8Bd3Fd76f3c255395793B47F7c55aD59d991);< / span > < / a >
< a name = "74" > < span class = "lineNum" > 74 < / span > : < / a >
< a name = "75" > < span class = "lineNum" > 75 < / span > : // Ok, first add the Uniswap V3 Oracle to the contract< / a >
< a name = "76" > < span class = "lineNum" > 76 < / span > : < / a >
< a name = "77" > < span class = "lineNum" > 77 < / span > < span class = "lineCov" > 2 : curveFeeOracle.setUniswapFeeOracle(uniswapFeeOracle);< / span > < / a >
< a name = "78" > < span class = "lineNum" > 78 < / span > : < / a >
< a name = "79" > < span class = "lineNum" > 79 < / span > : // Then, add necessary oracles for the CRVUSD price, to the CurveFeeOracle< / a >
< a name = "80" > < span class = "lineNum" > 80 < / span > : < / a >
< a name = "81" > < span class = "lineNum" > 81 < / span > < span class = "lineCov" > 2 : _setCurveFeeChainedOracleForInstance(curveFeeOracle, cu100);< / span > < / a >
< a name = "82" > < span class = "lineNum" > 82 < / span > < span class = "lineCov" > 2 : _setCurveFeeChainedOracleForInstance(curveFeeOracle, cu1_000);< / span > < / a >
< a name = "83" > < span class = "lineNum" > 83 < / span > < span class = "lineCov" > 2 : _setCurveFeeChainedOracleForInstance(curveFeeOracle, cu10_000);< / span > < / a >
< a name = "84" > < span class = "lineNum" > 84 < / span > < span class = "lineCov" > 2 : _setCurveFeeChainedOracleForInstance(curveFeeOracle, cu100_000);< / span > < / a >
< a name = "85" > < span class = "lineNum" > 85 < / span > < span class = "lineCov" > 2 : _setCurveFeeChainedOracleForInstance(curveFeeOracle, cu1_000_000);< / span > < / a >
< a name = "86" > < span class = "lineNum" > 86 < / span > : < / a >
< a name = "87" > < span class = "lineNum" > 87 < / span > : // Then, add the instances to the InstanceRegistry< / a >
< a name = "88" > < span class = "lineNum" > 88 < / span > : < / a >
< a name = "89" > < span class = "lineNum" > 89 < / span > < span class = "lineCov" > 2 : instanceRegistry.addInstance(cu100);< / span > < / a >
< a name = "90" > < span class = "lineNum" > 90 < / span > < span class = "lineCov" > 2 : instanceRegistry.addInstance(cu1_000);< / span > < / a >
< a name = "91" > < span class = "lineNum" > 91 < / span > < span class = "lineCov" > 2 : instanceRegistry.addInstance(cu10_000);< / span > < / a >
< a name = "92" > < span class = "lineNum" > 92 < / span > < span class = "lineCov" > 2 : instanceRegistry.addInstance(cu100_000);< / span > < / a >
< a name = "93" > < span class = "lineNum" > 93 < / span > < span class = "lineCov" > 2 : instanceRegistry.addInstance(cu1_000_000);< / span > < / a >
< a name = "94" > < span class = "lineNum" > 94 < / span > : < / a >
< a name = "95" > < span class = "lineNum" > 95 < / span > : // Finally, set all necessary data in the FeeOracleManager< / a >
< a name = "96" > < span class = "lineNum" > 96 < / span > : < / a >
< a name = "97" > < span class = "lineNum" > 97 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeOracle(address(cu100), address(curveFeeOracle));< / span > < / a >
< a name = "98" > < span class = "lineNum" > 98 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeOracle(address(cu1_000), address(curveFeeOracle));< / span > < / a >
< a name = "99" > < span class = "lineNum" > 99 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeOracle(address(cu10_000), address(curveFeeOracle));< / span > < / a >
< a name = "100" > < span class = "lineNum" > 100 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeOracle(address(cu100_000), address(curveFeeOracle));< / span > < / a >
< a name = "101" > < span class = "lineNum" > 101 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeOracle(address(cu1_000_000), address(curveFeeOracle));< / span > < / a >
< a name = "102" > < span class = "lineNum" > 102 < / span > : < / a >
< a name = "103" > < span class = "lineNum" > 103 < / span > : // The fee will be 0.3 % for those pools for which it makes sense< / a >
< a name = "104" > < span class = "lineNum" > 104 < / span > : < / a >
< a name = "105" > < span class = "lineNum" > 105 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeePercentForInstance(cu100, 0);< / span > < / a >
< a name = "106" > < span class = "lineNum" > 106 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeePercentForInstance(cu1_000, 0);< / span > < / a >
< a name = "107" > < span class = "lineNum" > 107 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeePercentForInstance(cu10_000, 30);< / span > < / a >
< a name = "108" > < span class = "lineNum" > 108 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeePercentForInstance(cu100_000, 30);< / span > < / a >
< a name = "109" > < span class = "lineNum" > 109 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeePercentForInstance(cu1_000_000, 30);< / span > < / a >
< a name = "110" > < span class = "lineNum" > 110 < / span > : < / a >
< a name = "111" > < span class = "lineNum" > 111 < / span > : // Make the update interval 6 hours< / a >
< a name = "112" > < span class = "lineNum" > 112 < / span > : < / a >
< a name = "113" > < span class = "lineNum" > 113 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdateIntervalForInstance(cu100, 6 hours);< / span > < / a >
< a name = "114" > < span class = "lineNum" > 114 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdateIntervalForInstance(cu1_000, 6 hours);< / span > < / a >
< a name = "115" > < span class = "lineNum" > 115 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdateIntervalForInstance(cu10_000, 6 hours);< / span > < / a >
< a name = "116" > < span class = "lineNum" > 116 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdateIntervalForInstance(cu100_000, 6 hours);< / span > < / a >
< a name = "117" > < span class = "lineNum" > 117 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdateIntervalForInstance(cu1_000_000, 6 hours);< / span > < / a >
< a name = "118" > < span class = "lineNum" > 118 < / span > : < / a >
< a name = "119" > < span class = "lineNum" > 119 < / span > : // Update them all at the start< / a >
< a name = "120" > < span class = "lineNum" > 120 < / span > : < / a >
< a name = "121" > < span class = "lineNum" > 121 < / span > < span class = "lineCov" > 2 : address router = feeOracleManager.feeUpdaterAddress();< / span > < / a >
< a name = "122" > < span class = "lineNum" > 122 < / span > : < / a >
< a name = "123" > < span class = "lineNum" > 123 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdater(address(this));< / span > < / a >
< a name = "124" > < span class = "lineNum" > 124 < / span > : < / a >
< a name = "125" > < span class = "lineNum" > 125 < / span > < span class = "lineCov" > 2 : feeOracleManager.updateFee(cu100, false);< / span > < / a >
< a name = "126" > < span class = "lineNum" > 126 < / span > < span class = "lineCov" > 2 : feeOracleManager.updateFee(cu1_000, false);< / span > < / a >
< a name = "127" > < span class = "lineNum" > 127 < / span > < span class = "lineCov" > 2 : feeOracleManager.updateFee(cu10_000, false);< / span > < / a >
< a name = "128" > < span class = "lineNum" > 128 < / span > < span class = "lineCov" > 2 : feeOracleManager.updateFee(cu100_000, false);< / span > < / a >
< a name = "129" > < span class = "lineNum" > 129 < / span > < span class = "lineCov" > 2 : feeOracleManager.updateFee(cu1_000_000, false);< / span > < / a >
< a name = "130" > < span class = "lineNum" > 130 < / span > : < / a >
< a name = "131" > < span class = "lineNum" > 131 < / span > < span class = "lineCov" > 2 : feeOracleManager.setFeeUpdater(router);< / span > < / a >
< a name = "132" > < span class = "lineNum" > 132 < / span > : }< / a >
< a name = "133" > < span class = "lineNum" > 133 < / span > : < / a >
< a name = "134" > < span class = "lineNum" > 134 < / span > : /**< / a >
< a name = "135" > < span class = "lineNum" > 135 < / span > : * @dev This function adds pools as fee oracles to the main curve fee oracle contract. The oracles are< / a >
< a name = "136" > < span class = "lineNum" > 136 < / span > : * chained, this means that multiple pools can be used as one oracle using the library which can be found< / a >
< a name = "137" > < span class = "lineNum" > 137 < / span > : * in the contract file. This means:< / a >
< a name = "138" > < span class = "lineNum" > 138 < / span > : *< / a >
< a name = "139" > < span class = "lineNum" > 139 < / span > : * (...pool contracts as oracles) ===(`price_oracle`)===> CurveFeeOracle ===(`getFee()`)===> < / a >
< a name = "140" > < span class = "lineNum" > 140 < / span > : * FeeOracleManager ===(`instanceFeeWithUpdate`)===> RelayerRegistry< / a >
< a name = "141" > < span class = "lineNum" > 141 < / span > : */< / a >
< a name = "142" > < span class = "lineNum" > 142 < / span > : function _setCurveFeeChainedOracleForInstance(CurveFeeOracle _feeOracle, ITornadoInstance _instance)< / a >
< a name = "143" > < span class = "lineNum" > 143 < / span > : internal< / a >
< a name = "144" > < span class = "lineNum" > 144 < / span > : {< / a >
< a name = "145" > < span class = "lineNum" > 145 < / span > : // Add the oracles which are the USDC/CRVUSD stableswap and tricryptoUSDC pools< / a >
< a name = "146" > < span class = "lineNum" > 146 < / span > : < / a >
< a name = "147" > < span class = "lineNum" > 147 < / span > < span class = "lineCov" > 10 : ICurvePriceOracle[] memory _oracles = new ICurvePriceOracle[](2);< / span > < / a >
< a name = "148" > < span class = "lineNum" > 148 < / span > : < / a >
< a name = "149" > < span class = "lineNum" > 149 < / span > < span class = "lineCov" > 10 : _oracles[0] = ICurvePriceOracle(crvUSDUSDCStableswap2Pool);< / span > < / a >
< a name = "150" > < span class = "lineNum" > 150 < / span > < span class = "lineCov" > 10 : _oracles[1] = ICurvePriceOracle(tricryptoUSDCPool);< / span > < / a >
< a name = "151" > < span class = "lineNum" > 151 < / span > : < / a >
< a name = "152" > < span class = "lineNum" > 152 < / span > : // Add the selectors, so which functions to call because tricrypto pools supports getting prices for< / a >
< a name = "153" > < span class = "lineNum" > 153 < / span > : // multiple tokens, denominated in the first token, which is usually a stable< / a >
< a name = "154" > < span class = "lineNum" > 154 < / span > : < / a >
< a name = "155" > < span class = "lineNum" > 155 < / span > < span class = "lineCov" > 10 : bytes4[] memory _selectors = new bytes4[](2);< / span > < / a >
< a name = "156" > < span class = "lineNum" > 156 < / span > : < / a >
< a name = "157" > < span class = "lineNum" > 157 < / span > < span class = "lineCov" > 10 : _selectors[0] = CurveChainedOracles.PRICE_ORACLE_SELECTOR;< / span > < / a >
< a name = "158" > < span class = "lineNum" > 158 < / span > < span class = "lineCov" > 10 : _selectors[1] = CurveChainedOracles.PRICE_ORACLE_UINT256_SELECTOR;< / span > < / a >
< a name = "159" > < span class = "lineNum" > 159 < / span > : < / a >
< a name = "160" > < span class = "lineNum" > 160 < / span > : // Specify for the second that the ether price must be retrieved< / a >
< a name = "161" > < span class = "lineNum" > 161 < / span > : < / a >
< a name = "162" > < span class = "lineNum" > 162 < / span > < span class = "lineCov" > 10 : uint8[] memory _coins = new uint8[](2);< / span > < / a >
< a name = "163" > < span class = "lineNum" > 163 < / span > : < / a >
< a name = "164" > < span class = "lineNum" > 164 < / span > < span class = "lineCov" > 10 : _coins[1] = 1; // ETHER< / span > < / a >
< a name = "165" > < span class = "lineNum" > 165 < / span > : < / a >
< a name = "166" > < span class = "lineNum" > 166 < / span > : // In order to receive the CRVUSD price, its price in USDC must be read out (the USDC price in crvUSD< / a >
< a name = "167" > < span class = "lineNum" > 167 < / span > : // is worthless because we do not have a common denominator in the oracle then) and then the second< / a >
< a name = "168" > < span class = "lineNum" > 168 < / span > : // price must be inverted to receive the accurate ETH/CRVUSD price, meaning ETH per CRVUSD, which will< / a >
< a name = "169" > < span class = "lineNum" > 169 < / span > : // then be divided by ETH per TORN, and then (ETH/CRVUSD)/(ETH/TORN) = (ETH/CRVUSD)*(TORN/ETH) =< / a >
< a name = "170" > < span class = "lineNum" > 170 < / span > : // (TORN/CRVUSD) which is the price that the oracle should be supplying< / a >
< a name = "171" > < span class = "lineNum" > 171 < / span > : < / a >
< a name = "172" > < span class = "lineNum" > 172 < / span > < span class = "lineCov" > 10 : bool[] memory _invert = new bool[](2);< / span > < / a >
< a name = "173" > < span class = "lineNum" > 173 < / span > : < / a >
< a name = "174" > < span class = "lineNum" > 174 < / span > < span class = "lineCov" > 10 : _invert[0] = false; // DO NOT INVERT, PRICE IS CRVUSD IN USDC< / span > < / a >
< a name = "175" > < span class = "lineNum" > 175 < / span > < span class = "lineCov" > 10 : _invert[1] = true; // INVERT, PRICE IS ETH IN USDC, BUT WE NEED USDC IN ETH< / span > < / a >
< a name = "176" > < span class = "lineNum" > 176 < / span > : < / a >
< a name = "177" > < span class = "lineNum" > 177 < / span > : // (USDC/CRVUSD)*(ETH/USDC) = (ETH/CRVUSD)< / a >
< a name = "178" > < span class = "lineNum" > 178 < / span > : < / a >
< a name = "179" > < span class = "lineNum" > 179 < / span > < span class = "lineCov" > 10 : _feeOracle.modifyChainedOracleForInstance(< / span > < / a >
< a name = "180" > < span class = "lineNum" > 180 < / span > : _instance, _oracles, _selectors, _coins, _invert, " ETH/CRVUSD" < / a >
< a name = "181" > < span class = "lineNum" > 181 < / span > : );< / a >
< a name = "182" > < span class = "lineNum" > 182 < / span > : }< / a >
< a name = "183" > < span class = "lineNum" > 183 < / span > : }< / a >
< / pre >
< / td >
< / tr >
< / table >
< br >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr > < td class = "versionInfo" > Generated by: < a href = "https://github.com/linux-test-project/lcov" target = "_parent" > LCOV version 1.16< / a > < / td > < / tr >
< / table >
< br >
< / body >
< / html >