Skip to content

Commit 00f7a9b

Browse files
author
Joey Santoro
committed
smooth incentives
1 parent 4cb33ec commit 00f7a9b

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

contracts/token/UniswapIncentive.sol

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)