UNPKG

@defi-wonderland/keep3r-v2

Version:

The Keep3r Network is a decentralized network for projects that need external devops, and for external teams to find keeper jobs

534 lines (533 loc) 20.8 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for contracts/Keep3rHelper.sol</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../prettify.css" /> <link rel="stylesheet" href="../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../index.html">all files</a> / <a href="index.html">contracts/</a> Keep3rHelper.sol </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">0% </span> <span class="quiet">Statements</span> <span class='fraction'>0/34</span> </div> <div class='fl pad1y space-right2'> <span class="strong">0% </span> <span class="quiet">Branches</span> <span class='fraction'>0/8</span> </div> <div class='fl pad1y space-right2'> <span class="strong">0% </span> <span class="quiet">Functions</span> <span class='fraction'>0/12</span> </div> <div class='fl pad1y space-right2'> <span class="strong">0% </span> <span class="quiet">Lines</span> <span class='fraction'>0/34</span> </div> </div> </div> <div class='status-line low'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// SPDX-License-Identifier: MIT &nbsp; /* &nbsp; Coded for The Keep3r Network with ♥ by &nbsp; ██████╗░███████╗███████╗██╗  ░██╗░░░░░░░██╗░█████╗░███╗░░██╗██████╗░███████╗██████╗░██╗░░░░░░█████╗░███╗░░██╗██████╗░ ██╔══██╗██╔════╝██╔════╝██║  ░██║░░██╗░░██║██╔══██╗████╗░██║██╔══██╗██╔════╝██╔══██╗██║░░░░░██╔══██╗████╗░██║██╔══██╗ ██║░░██║█████╗░░█████╗░░██║  ░╚██╗████╗██╔╝██║░░██║██╔██╗██║██║░░██║█████╗░░██████╔╝██║░░░░░███████║██╔██╗██║██║░░██║ ██║░░██║██╔══╝░░██╔══╝░░██║  ░░████╔═████║░██║░░██║██║╚████║██║░░██║██╔══╝░░██╔══██╗██║░░░░░██╔══██║██║╚████║██║░░██║ ██████╔╝███████╗██║░░░░░██║  ░░╚██╔╝░╚██╔╝░╚█████╔╝██║░╚███║██████╔╝███████╗██║░░██║███████╗██║░░██║██║░╚███║██████╔╝ ╚═════╝░╚══════╝╚═╝░░░░░╚═╝  ░░░╚═╝░░░╚═╝░░░╚════╝░╚═╝░░╚══╝╚═════╝░╚══════╝╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝╚═╝░░╚══╝╚═════╝░ &nbsp; https://defi.sucks &nbsp; */ &nbsp; pragma solidity &gt;=0.8.7 &lt;0.9.0; &nbsp; import './libraries/FullMath.sol'; import './libraries/TickMath.sol'; import '../interfaces/IKeep3r.sol'; import '../interfaces/external/IKeep3rV1.sol'; import '../interfaces/IKeep3rHelper.sol'; &nbsp; import '@openzeppelin/contracts/utils/math/Math.sol'; import '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol'; &nbsp; contract Keep3rHelper is IKeep3rHelper { address public immutable keep3rV2; &nbsp; <span class="fstat-no" title="function not covered" > constructor(address _keep3rV2) {</span> <span class="cstat-no" title="statement not covered" > keep3rV2 = _keep3rV2</span>; } &nbsp; /// @inheritdoc IKeep3rHelper address public constant override KP3R = 0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44; &nbsp; /// @inheritdoc IKeep3rHelper address public constant override KP3R_WETH_POOL = 0x11B7a6bc0259ed6Cf9DB8F499988F9eCc7167bf5; &nbsp; /// @inheritdoc IKeep3rHelper uint256 public constant override MIN = 11_000; &nbsp; /// @inheritdoc IKeep3rHelper uint256 public constant override MAX = 12_000; &nbsp; /// @inheritdoc IKeep3rHelper uint256 public constant override BOOST_BASE = 10_000; &nbsp; /// @inheritdoc IKeep3rHelper uint256 public constant override TARGETBOND = 200 ether; &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function quote(uint256 _eth) public view override returns (uint256 _amountOut) {</span> <span class="cstat-no" title="statement not covered" > bool _isKP3RToken0 = isKP3RToken0(KP3R_WETH_POOL);</span> <span class="cstat-no" title="statement not covered" > int56 _tickDifference = IKeep3r(keep3rV2).observeLiquidity(KP3R_WETH_POOL).difference;</span> <span class="cstat-no" title="statement not covered" > _tickDifference = _isKP3RToken0 ? _tickDifference : -_tickDifference</span>; <span class="cstat-no" title="statement not covered" > uint256 _tickInterval = IKeep3r(keep3rV2).rewardPeriodTime();</span> <span class="cstat-no" title="statement not covered" > _amountOut = getQuoteAtTick(uint128(_eth), _tickDifference, _tickInterval)</span>; } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function bonds(address _keeper) public view override returns (uint256 _amountBonded) {</span> <span class="cstat-no" title="statement not covered" > return IKeep3r(keep3rV2).bonds(_keeper, KP3R);</span> } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function getRewardAmountFor(address _keeper, uint256 _gasUsed) public view override returns (uint256 _kp3r) {</span> <span class="cstat-no" title="statement not covered" > uint256 _boost = getRewardBoostFor(bonds(_keeper));</span> <span class="cstat-no" title="statement not covered" > _kp3r = quote((_gasUsed * _boost) / BOOST_BASE)</span>; } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function getRewardAmount(uint256 _gasUsed) external view override returns (uint256 _amount) {</span> // solhint-disable-next-line avoid-tx-origin <span class="cstat-no" title="statement not covered" > return getRewardAmountFor(tx.origin, _gasUsed);</span> } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function getRewardBoostFor(uint256 _bonds) public view override returns (uint256 _rewardBoost) {</span> <span class="cstat-no" title="statement not covered" > _bonds = Math.min(_bonds, TARGETBOND)</span>; <span class="cstat-no" title="statement not covered" > uint256 _cap = Math.max(MIN, MIN + ((MAX - MIN) * _bonds) / TARGETBOND);</span> <span class="cstat-no" title="statement not covered" > _rewardBoost = _cap * _getBasefee()</span>; } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function getPoolTokens(address _pool) public view override returns (address _token0, address _token1) {</span> <span class="cstat-no" title="statement not covered" > return (IUniswapV3Pool(_pool).token0(), IUniswapV3Pool(_pool).token1());</span> } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function isKP3RToken0(address _pool) public view override returns (bool _isKP3RToken0) {</span> <span class="cstat-no" title="statement not covered" > address _token0;</span> <span class="cstat-no" title="statement not covered" > address _token1;</span> <span class="cstat-no" title="statement not covered" > (_token0, _token1) = getPoolTokens(_pool)</span>; <span class="cstat-no" title="statement not covered" > if (_token0 == KP3R) {</span> <span class="cstat-no" title="statement not covered" > return true;</span> } else <span class="cstat-no" title="statement not covered" >if (_token1 != KP3R) {</span> revert LiquidityPairInvalid(); } } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function observe(address _pool, uint32[] memory _secondsAgo)</span> public view override returns ( int56 _tickCumulative1, int56 _tickCumulative2, bool _success ) { <span class="cstat-no" title="statement not covered" > try IUniswapV3Pool(_pool).observe(_secondsAgo) returns (int56[] memory _uniswapResponse, uint160[] memory) {</span> <span class="cstat-no" title="statement not covered" > _tickCumulative1 = _uniswapResponse[0]</span>; <span class="cstat-no" title="statement not covered" > if (_uniswapResponse.length &gt; 1) {</span> <span class="cstat-no" title="statement not covered" > _tickCumulative2 = _uniswapResponse[1]</span>; } <span class="cstat-no" title="statement not covered" > _success = true</span>; } catch (bytes memory) {} } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function getKP3RsAtTick(</span> uint256 _liquidityAmount, int56 _tickDifference, uint256 _timeInterval ) public pure override returns (uint256 _kp3rAmount) { <span class="cstat-no" title="statement not covered" > uint160 sqrtRatioX96 = TickMath.getSqrtRatioAtTick(int24(_tickDifference / int256(_timeInterval)));</span> <span class="cstat-no" title="statement not covered" > _kp3rAmount = FullMath.mulDiv(1 &lt;&lt; 96, _liquidityAmount, sqrtRatioX96)</span>; } &nbsp; /// @inheritdoc IKeep3rHelper <span class="fstat-no" title="function not covered" > function getQuoteAtTick(</span> uint128 _baseAmount, int56 _tickDifference, uint256 _timeInterval ) public pure override returns (uint256 _quoteAmount) { <span class="cstat-no" title="statement not covered" > uint160 sqrtRatioX96 = TickMath.getSqrtRatioAtTick(int24(_tickDifference / int256(_timeInterval)));</span> &nbsp; <span class="cstat-no" title="statement not covered" > if (sqrtRatioX96 &lt;= type(uint128).max) {</span> <span class="cstat-no" title="statement not covered" > uint256 ratioX192 = uint256(sqrtRatioX96) * sqrtRatioX96;</span> <span class="cstat-no" title="statement not covered" > _quoteAmount = FullMath.mulDiv(1 &lt;&lt; 192, _baseAmount, ratioX192)</span>; } else { <span class="cstat-no" title="statement not covered" > uint256 ratioX128 = FullMath.mulDiv(sqrtRatioX96, sqrtRatioX96, 1 &lt;&lt; 64);</span> <span class="cstat-no" title="statement not covered" > _quoteAmount = FullMath.mulDiv(1 &lt;&lt; 128, _baseAmount, ratioX128)</span>; } } &nbsp; /// @notice Gets the block's base fee /// @return _baseFee The block's basefee <span class="fstat-no" title="function not covered" > function _getBasefee() internal view virtual returns (uint256 _baseFee) {</span> <span class="cstat-no" title="statement not covered" > return block.basefee;</span> } } &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri May 20 2022 12:16:04 GMT+0200 (Central European Summer Time) </div> </div> <script src="../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../sorter.js"></script> </body> </html>