@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
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"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// SPDX-License-Identifier: MIT
/*
Coded for The Keep3r Network with ♥ by
██████╗░███████╗███████╗██╗ ░██╗░░░░░░░██╗░█████╗░███╗░░██╗██████╗░███████╗██████╗░██╗░░░░░░█████╗░███╗░░██╗██████╗░
██╔══██╗██╔════╝██╔════╝██║ ░██║░░██╗░░██║██╔══██╗████╗░██║██╔══██╗██╔════╝██╔══██╗██║░░░░░██╔══██╗████╗░██║██╔══██╗
██║░░██║█████╗░░█████╗░░██║ ░╚██╗████╗██╔╝██║░░██║██╔██╗██║██║░░██║█████╗░░██████╔╝██║░░░░░███████║██╔██╗██║██║░░██║
██║░░██║██╔══╝░░██╔══╝░░██║ ░░████╔═████║░██║░░██║██║╚████║██║░░██║██╔══╝░░██╔══██╗██║░░░░░██╔══██║██║╚████║██║░░██║
██████╔╝███████╗██║░░░░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝██║░╚███║██████╔╝███████╗██║░░██║███████╗██║░░██║██║░╚███║██████╔╝
╚═════╝░╚══════╝╚═╝░░░░░╚═╝ ░░░╚═╝░░░╚═╝░░░╚════╝░╚═╝░░╚══╝╚═════╝░╚══════╝╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝╚═╝░░╚══╝╚═════╝░
https://defi.sucks
*/
pragma solidity >=0.8.7 <0.9.0;
import './libraries/FullMath.sol';
import './libraries/TickMath.sol';
import '../interfaces/IKeep3r.sol';
import '../interfaces/external/IKeep3rV1.sol';
import '../interfaces/IKeep3rHelper.sol';
import '@openzeppelin/contracts/utils/math/Math.sol';
import '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';
contract Keep3rHelper is IKeep3rHelper {
address public immutable keep3rV2;
<span class="fstat-no" title="function not covered" > constructor(address _keep3rV2) {</span>
<span class="cstat-no" title="statement not covered" > keep3rV2 = _keep3rV2</span>;
}
/// @inheritdoc IKeep3rHelper
address public constant override KP3R = 0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44;
/// @inheritdoc IKeep3rHelper
address public constant override KP3R_WETH_POOL = 0x11B7a6bc0259ed6Cf9DB8F499988F9eCc7167bf5;
/// @inheritdoc IKeep3rHelper
uint256 public constant override MIN = 11_000;
/// @inheritdoc IKeep3rHelper
uint256 public constant override MAX = 12_000;
/// @inheritdoc IKeep3rHelper
uint256 public constant override BOOST_BASE = 10_000;
/// @inheritdoc IKeep3rHelper
uint256 public constant override TARGETBOND = 200 ether;
/// @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>;
}
/// @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>
}
/// @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>;
}
/// @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>
}
/// @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>;
}
/// @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>
}
/// @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();
}
}
/// @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 > 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) {}
}
/// @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 << 96, _liquidityAmount, sqrtRatioX96)</span>;
}
/// @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>
<span class="cstat-no" title="statement not covered" > if (sqrtRatioX96 <= 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 << 192, _baseAmount, ratioX192)</span>;
} else {
<span class="cstat-no" title="statement not covered" > uint256 ratioX128 = FullMath.mulDiv(sqrtRatioX96, sqrtRatioX96, 1 << 64);</span>
<span class="cstat-no" title="statement not covered" > _quoteAmount = FullMath.mulDiv(1 << 128, _baseAmount, ratioX128)</span>;
}
}
/// @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>
}
}
</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>