@@ -172,7 +172,7 @@ contract UniswapIncentive is IUniswapIncentive, UniRef {
172172 "UniswapIncentive: Price already at or above peg "
173173 );
174174
175- Decimal.D256 memory incentive = _calculateBuyIncentiveMultiplier (deviation, weight);
175+ Decimal.D256 memory incentive = _calculateBuyIncentiveMultiplier (deviation, deviation, weight);
176176 Decimal.D256 memory penalty = _calculateSellPenaltyMultiplier (deviation);
177177 return incentive.equals (penalty);
178178 }
@@ -214,7 +214,7 @@ contract UniswapIncentive is IUniswapIncentive, UniRef {
214214 }
215215
216216 Decimal.D256 memory multiplier =
217- _calculateBuyIncentiveMultiplier (initialDeviation, weight);
217+ _calculateBuyIncentiveMultiplier (initialDeviation, finalDeviation, weight);
218218 incentive = multiplier.mul (incentivizedAmount).asUint256 ();
219219 return (incentive, weight, initialDeviation, finalDeviation);
220220 }
@@ -254,7 +254,7 @@ contract UniswapIncentive is IUniswapIncentive, UniRef {
254254 }
255255
256256 Decimal.D256 memory multiplier =
257- _calculateSellPenaltyMultiplier ( finalDeviation);
257+ _calculateIntegratedSellPenaltyMultiplier (initialDeviation, finalDeviation);
258258 penalty = multiplier.mul (incentivizedAmount).asUint256 ();
259259 return (penalty, initialDeviation, finalDeviation);
260260 }
@@ -303,13 +303,14 @@ contract UniswapIncentive is IUniswapIncentive, UniRef {
303303 }
304304
305305 function _calculateBuyIncentiveMultiplier (
306- Decimal.D256 memory deviation ,
306+ Decimal.D256 memory initialDeviation ,
307+ Decimal.D256 memory finalDeviation ,
307308 uint32 weight
308309 ) internal pure returns (Decimal.D256 memory ) {
309310 Decimal.D256 memory correspondingPenalty =
310- _calculateSellPenaltyMultiplier (deviation);
311+ _calculateIntegratedSellPenaltyMultiplier (finalDeviation, initialDeviation); // flip direction
311312 Decimal.D256 memory buyMultiplier =
312- deviation .mul (uint256 (weight)).div (
313+ initialDeviation .mul (uint256 (weight)).div (
313314 uint256 (TIME_WEIGHT_GRANULARITY)
314315 );
315316
@@ -320,6 +321,28 @@ contract UniswapIncentive is IUniswapIncentive, UniRef {
320321 return buyMultiplier;
321322 }
322323
324+ // The sell penalty smoothed over the curve
325+ function _calculateIntegratedSellPenaltyMultiplier (Decimal.D256 memory initialDeviation , Decimal.D256 memory finalDeviation )
326+ internal
327+ pure
328+ returns (Decimal.D256 memory )
329+ {
330+ if (initialDeviation.equals (finalDeviation)) {
331+ return _calculateSellPenaltyMultiplier (initialDeviation);
332+ }
333+ Decimal.D256 memory numerator = _sellPenaltyBound (finalDeviation).sub (_sellPenaltyBound (initialDeviation));
334+ Decimal.D256 memory denominator = finalDeviation.sub (initialDeviation);
335+ return numerator.div (denominator);
336+ }
337+
338+ function _sellPenaltyBound (Decimal.D256 memory deviation )
339+ internal
340+ pure
341+ returns (Decimal.D256 memory )
342+ {
343+ return deviation.pow (3 ).mul (33 );
344+ }
345+
323346 function _calculateSellPenaltyMultiplier (Decimal.D256 memory deviation )
324347 internal
325348 pure
0 commit comments