Skip to content

Commit

Permalink
Hardcode grand prize draw frequency and precompute dependant variable…
Browse files Browse the repository at this point in the history
…s in a script
  • Loading branch information
Dylan DesRosier committed Jun 30, 2023
1 parent 9c9fd20 commit 4b09b09
Show file tree
Hide file tree
Showing 8 changed files with 221 additions and 374 deletions.
51 changes: 51 additions & 0 deletions script/generateConstants.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.17;

import { Script } from "forge-std/Script.sol";
import { console } from "forge-std/console.sol";
import { SD59x18 } from "prb-math/SD59x18.sol";

import { TierCalculationLib } from "src/libraries/TierCalculationLib.sol";

contract GenerateConstants is Script {
function run() public {
uint16 GRAND_PRIZE_PERIOD_DRAWS = 365;

console.log(
"/// @notice The number of draws that should statistically occur between grand prizes."
);
console.log(
"uint16 internal constant GRAND_PRIZE_PERIOD_DRAWS = %d;",
GRAND_PRIZE_PERIOD_DRAWS
);
console.log("\n");

uint8 MIN_TIERS = 2;
uint8 MAX_TIERS = 14;
// Precompute the prizes per draw
for (uint8 numTiers = MIN_TIERS; numTiers <= MAX_TIERS; numTiers++) {
console.log(
"uint32 internal constant ESTIMATED_PRIZES_PER_DRAW_FOR_%d_TIERS = %d;",
uint256(numTiers),
uint256(TierCalculationLib.estimatedClaimCount(numTiers, GRAND_PRIZE_PERIOD_DRAWS))
);
}

console.log("\n");
MIN_TIERS = 3;
MAX_TIERS = 16;
// Precompute the odds for each tier
for (uint8 numTiers = MIN_TIERS; numTiers <= MAX_TIERS; numTiers++) {
for (uint8 tier = 0; tier < numTiers; tier++) {
console.log(
"SD59x18 internal constant TIER_ODDS_%d_%d = SD59x18.wrap(%d);",
uint256(tier),
uint256(numTiers),
uint256(
SD59x18.unwrap(TierCalculationLib.getTierOdds(tier, numTiers, GRAND_PRIZE_PERIOD_DRAWS))
)
);
}
}
}
}
3 changes: 0 additions & 3 deletions src/PrizePool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ error CallerNotDrawManager(address caller, address drawManager);
* @param prizeToken The token to use for prizes
* @param twabController The Twab Controller to retrieve time-weighted average balances from
* @param drawManager The address of the draw manager for the prize pool
* @param grandPrizePeriodDraws The average number of draws between grand prizes. This determines the statistical frequency of grand prizes.
* @param drawPeriodSeconds The number of seconds between draws. E.g. a Prize Pool with a daily draw should have a draw period of 86400 seconds.
* @param firstDrawStartsAt The timestamp at which the first draw will start.
* @param numberOfTiers The number of tiers to start with. Must be greater than or equal to the minimum number of tiers.
Expand All @@ -105,7 +104,6 @@ struct ConstructorParams {
IERC20 prizeToken;
TwabController twabController;
address drawManager;
uint16 grandPrizePeriodDraws;
uint32 drawPeriodSeconds;
uint64 firstDrawStartsAt;
uint8 numberOfTiers;
Expand Down Expand Up @@ -237,7 +235,6 @@ contract PrizePool is TieredLiquidityDistributor {
ConstructorParams memory params
)
TieredLiquidityDistributor(
params.grandPrizePeriodDraws,
params.numberOfTiers,
params.tierShares,
params.canaryShares,
Expand Down
503 changes: 156 additions & 347 deletions src/abstract/TieredLiquidityDistributor.sol

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions test/PrizePool.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ contract PrizePoolTest is Test {
prizeToken,
twabController,
drawManager,
uint16(365),
drawPeriodSeconds,
lastCompletedDrawStartedAt,
uint8(3), // minimum number of tiers
Expand Down Expand Up @@ -447,7 +446,6 @@ contract PrizePoolTest is Test {
prizeToken,
twabController,
address(this),
uint16(365),
drawPeriodSeconds,
lastCompletedDrawStartedAt,
startingTiers, // higher number of tiers
Expand Down
21 changes: 12 additions & 9 deletions test/abstract/TieredLiquidityDistributor.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@ contract TieredLiquidityDistributorTest is Test {
uint8 reserveShares;

function setUp() external {
grandPrizePeriodDraws = 10;
numberOfTiers = 3;
tierShares = 100;
canaryShares = 10;
reserveShares = 10;

distributor = new TieredLiquidityDistributorWrapper(
grandPrizePeriodDraws,
numberOfTiers,
tierShares,
canaryShares,
Expand Down Expand Up @@ -151,28 +149,33 @@ contract TieredLiquidityDistributorTest is Test {

function testTierOdds_Accuracy() public {
SD59x18 odds = distributor.getTierOdds(0, 3);
assertEq(SD59x18.unwrap(odds), 100000000000000003);
assertEq(SD59x18.unwrap(odds), 2739726027397260);
odds = distributor.getTierOdds(3, 7);
assertEq(SD59x18.unwrap(odds), 316227766016837938);
assertEq(SD59x18.unwrap(odds), 52342392259021369);
odds = distributor.getTierOdds(15, 16);
assertEq(SD59x18.unwrap(odds), 1000000000000000000);
}

function testTierOdds_AllComputed() public {
function testTierOdds_AllAvailable() public {
SD59x18 odds;
for (uint8 numTiers = 3; numTiers <= 16; numTiers++) {
for (uint8 tier = 0; tier < numTiers; tier++) {
odds = distributor.getTierOdds(tier, numTiers);
assertGt(SD59x18.unwrap(odds), 0);
assertLe(SD59x18.unwrap(odds), 1000000000000000000);
assertLe(
SD59x18.unwrap(odds),
SD59x18.unwrap(TierCalculationLib.getTierOdds(tier, numTiers, grandPrizePeriodDraws))
);
}
}
}

function testEstimatedPrizesPerDraw_AllAvailable() public {
uint32 prizeCount;
for (uint8 numTiers = 3; numTiers <= 15; numTiers++) {
prizeCount = distributor.estimatedPrizeCount(numTiers);
assertGt(prizeCount, 0);
assertLe(prizeCount, 79777187);
}
}

function testExpansionTierLiquidity_regression() public {
uint96 amount1 = 253012247290373118207;
uint96 amount2 = 99152290762372054017;
Expand Down
11 changes: 1 addition & 10 deletions test/abstract/helper/TieredLiquidityDistributorWrapper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,11 @@ import { TieredLiquidityDistributor, Tier, fromUD34x4toUD60x18, fromUD60x18 } fr

contract TieredLiquidityDistributorWrapper is TieredLiquidityDistributor {
constructor(
uint16 _grandPrizePeriodDraws,
uint8 _numberOfTiers,
uint8 _tierShares,
uint8 _canaryShares,
uint8 _reserveShares
)
TieredLiquidityDistributor(
_grandPrizePeriodDraws,
_numberOfTiers,
_tierShares,
_canaryShares,
_reserveShares
)
{}
) TieredLiquidityDistributor(_numberOfTiers, _tierShares, _canaryShares, _reserveShares) {}

function nextDraw(uint8 _nextNumTiers, uint96 liquidity) external {
_nextDraw(_nextNumTiers, liquidity);
Expand Down
2 changes: 0 additions & 2 deletions test/invariants/helpers/PrizePoolFuzzHarness.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ contract PrizePoolFuzzHarness is CommonBase {

constructor() {
address drawManager = address(this);
uint16 grandPrizePeriodDraws = 10;
uint32 drawPeriodSeconds = 1 hours;
uint64 nextDrawStartsAt = uint64(block.timestamp);
uint8 numberOfTiers = 3;
Expand All @@ -39,7 +38,6 @@ contract PrizePoolFuzzHarness is CommonBase {
token,
twabController,
drawManager,
grandPrizePeriodDraws,
drawPeriodSeconds,
nextDrawStartsAt,
numberOfTiers,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ contract TieredLiquidityDistributorFuzzHarness is TieredLiquidityDistributor {
uint256 public totalAdded;
uint256 public totalConsumed;

constructor() TieredLiquidityDistributor(10, 3, 100, 10, 10) {}
constructor() TieredLiquidityDistributor(3, 100, 10, 10) {}

function nextDraw(uint8 _nextNumTiers, uint96 liquidity) external {
uint8 nextNumTiers = _nextNumTiers / 16; // map to [0, 15]
Expand Down

0 comments on commit 4b09b09

Please sign in to comment.