@@ -27,6 +27,12 @@ contract EnergyRedeemer is IEnergyRedeemer, Ownable {
2727 event Redeem (address to , uint256 energy , uint256 redeemed );
2828 event RampR (uint96 initialR , uint96 futureR , uint32 initialTime , uint32 futureTime );
2929
30+ /**
31+ * @param _pool address allowed to perform redemptions.
32+ * @param _rewardToken token address which energy is redeemed into.
33+ * @param _base constant redemption rate factor.
34+ * @param _r start value for dynamic part of redemption rate factor, 18 decimals.
35+ */
3036 constructor (address _pool , address _rewardToken , uint256 _base , uint96 _r ) {
3137 require (uint256 (_r) <= type (uint256 ).max / _base, "EnergyRedeemer: overflow " );
3238
@@ -36,6 +42,12 @@ contract EnergyRedeemer is IEnergyRedeemer, Ownable {
3642 (initialR, futureR, initialRTime, futureRTime) = (_r, _r, uint32 (block .timestamp ), uint32 (block .timestamp ));
3743 }
3844
45+ /**
46+ * @dev Starts changing the rewards multiplication factor R linearly over some time period.
47+ * Callable only by the contract owner.
48+ * @param _futureR target R value.
49+ * @param _duration time duration of R increase/decrease process.
50+ */
3951 function rampR (uint96 _futureR , uint32 _duration ) external onlyOwner {
4052 require (uint256 (_futureR) <= type (uint256 ).max / base, "EnergyRedeemer: overflow " );
4153
@@ -46,6 +58,12 @@ contract EnergyRedeemer is IEnergyRedeemer, Ownable {
4658 emit RampR (_initialR, _futureR, t, t + _duration);
4759 }
4860
61+ /**
62+ * @dev Redeems some amount of energy into the fungible token at the current exchange rate.
63+ * Callable only by the whitelisted pool address.
64+ * @param _to redeemed token receiver.
65+ * @param _energy amount of energy to exchange and redeem.
66+ */
4967 function redeem (address _to , uint256 _energy ) external {
5068 require (msg .sender == pool, "EnergyRedeemer: not authorized " );
5169
@@ -56,6 +74,11 @@ contract EnergyRedeemer is IEnergyRedeemer, Ownable {
5674 emit Redeem (_to, _energy, redeemAmount);
5775 }
5876
77+ /**
78+ * @dev Tells the current rewards multiplication factor R.
79+ * Takes into account latest rampR operation.
80+ * @return R.
81+ */
5982 function R () public view returns (uint96 ) {
6083 (uint96 _initialR , uint96 _futureR , uint32 _initialRTime , uint32 _futureRTime ) =
6184 (initialR, futureR, initialRTime, futureRTime);
@@ -71,6 +94,10 @@ contract EnergyRedeemer is IEnergyRedeemer, Ownable {
7194 return _futureR;
7295 }
7396
97+ /**
98+ * @dev Tells the current energy redemption rate based on the R value and information from the pool.
99+ * @return energy redemption rate (18 decimals).
100+ */
74101 function calculateRedemptionRate () public view returns (uint256 ) {
75102 IZkBobAccounting accounting = IZkBobPool (pool).accounting ();
76103
@@ -84,6 +111,10 @@ contract EnergyRedeemer is IEnergyRedeemer, Ownable {
84111 return rate;
85112 }
86113
114+ /**
115+ * @dev Tells the maximum amount of energy available for redemption at the current rate, given available balance.
116+ * @return maximum amount of energy this contract can redeem at the current rate.
117+ */
87118 function maxRedeemAmount () external view returns (uint256 ) {
88119 uint256 balance = IERC20 (rewardToken).balanceOf (address (this ));
89120 return balance * 1 ether / calculateRedemptionRate ();
0 commit comments