Skip to content

Commit

Permalink
Refactored a variable name and some tests
Browse files Browse the repository at this point in the history
  • Loading branch information
asselstine committed Mar 21, 2024
1 parent 3344d3c commit e511bc9
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 63 deletions.
10 changes: 5 additions & 5 deletions src/abstract/TieredLiquidityDistributor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ contract TieredLiquidityDistributor {
uint8 numTiers = numberOfTiers;
UD34x4 _prizeTokenPerShare = prizeTokenPerShare;
UD60x18 _prizeTokenPerShareUD60x18 = fromUD34x4toUD60x18(_prizeTokenPerShare);
(uint96 newReserve, UD60x18 newPrizeTokenPerShare) = _computeNewDistributions(
(uint96 deltaReserve, UD60x18 newPrizeTokenPerShare) = _computeNewDistributions(
numTiers,
_nextNumberOfTiers,
_prizeTokenPerShareUD60x18,
Expand All @@ -244,22 +244,22 @@ contract TieredLiquidityDistributor {
numberOfTiers = _nextNumberOfTiers;
_lastAwardedDrawId = _awardingDraw;
lastAwardedDrawAwardedAt = uint48(block.timestamp);
_reserve += newReserve;
_reserve += deltaReserve;
}

/// @notice Computes the liquidity that will be distributed for the next awarded draw given the next number of tiers and prize liquidity.
/// @param _numberOfTiers The current number of tiers
/// @param _nextNumberOfTiers The next number of tiers to use to compute distribution
/// @param _currentPrizeTokenPerShare The current prize token per share
/// @param _prizeTokenLiquidity The amount of fresh liquidity to distribute across the tiers and reserve
/// @return newReserve The amount of liquidity that will be added to the reserve
/// @return deltaReserve The amount of liquidity that will be added to the reserve
/// @return newPrizeTokenPerShare The new prize token per share
function _computeNewDistributions(
uint8 _numberOfTiers,
uint8 _nextNumberOfTiers,
UD60x18 _currentPrizeTokenPerShare,
uint256 _prizeTokenLiquidity
) internal view returns (uint96 newReserve, UD60x18 newPrizeTokenPerShare) {
) internal view returns (uint96 deltaReserve, UD60x18 newPrizeTokenPerShare) {
UD60x18 reclaimedLiquidity;
{
// need to redistribute to the canary tier and any new tiers (if expanding)
Expand All @@ -282,7 +282,7 @@ contract TieredLiquidityDistributor {

newPrizeTokenPerShare = _currentPrizeTokenPerShare.add(convert(deltaPrizeTokensPerShare));

newReserve = SafeCast.toUint96(
deltaReserve = SafeCast.toUint96(
// reserve portion of new liquidity
deltaPrizeTokensPerShare *
reserveShares +
Expand Down
211 changes: 153 additions & 58 deletions test/PrizePool.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -1136,6 +1136,41 @@ contract PrizePoolTest is Test {
assertFalse(prizePool.isWinner(address(this), msg.sender, 1, 0), "still not a winner");
}

function testIsWinner_normalPrizes() public {
uint iterations = 20; //grandPrizePeriodDraws;
uint users = 50;

uint balance = 1e18;
uint totalSupply = users * balance;

uint256 random = uint256(keccak256(abi.encode(1234)));

uint[] memory prizeCounts = new uint[](iterations);
uint totalPrizeCount;

for (uint i = 0; i < iterations; i++) {
contribute(100e18);
awardDraw(random);
for (uint u = 0; u < users; u++) {
address user = makeAddr(string(abi.encodePacked(u)));
for (uint8 t = 0; t < prizePool.numberOfTiers() - 1; t++) {
mockTwabForUser(address(this), user, t, balance);
mockTwabTotalSupply(address(this), t, totalSupply);
for (uint32 p = 0; p < prizePool.getTierPrizeCount(t); p++) {
if (prizePool.isWinner(address(this), user, t, p)) {
prizeCounts[i]++;
}
}
}
}
// console2.log("Iteration %s prize count: %s", i, prizeCounts[i]);
totalPrizeCount += prizeCounts[i];
random = uint256(keccak256(abi.encode(random)));
}

console2.log("Average number of prizes: ", totalPrizeCount / iterations);
}

function testWasClaimed_not() public {
assertEq(prizePool.wasClaimed(vault, msg.sender, 0, 0), false);
assertEq(prizePool.wasClaimed(vault2, msg.sender, 0, 0), false);
Expand Down Expand Up @@ -1668,12 +1703,8 @@ contract PrizePoolTest is Test {
function testGetVaultUserBalanceAndTotalSupplyTwab() public {
awardDraw(winningRandomNumber);
uint24 lastAwardedDrawId = prizePool.getLastAwardedDrawId();
mockTwab(
address(this),
msg.sender,
prizePool.drawClosesAt(0),
prizePool.drawClosesAt(lastAwardedDrawId)
);
mockGetAverageBalanceBetween(address(this), msg.sender, 1, lastAwardedDrawId, 366e30);
mockTwabTotalSupplyDrawRange(address(this), 1, lastAwardedDrawId, 1e30);
(uint256 twab, uint256 twabTotalSupply) = prizePool.getVaultUserBalanceAndTotalSupplyTwab(
address(this),
msg.sender,
Expand All @@ -1689,43 +1720,43 @@ contract PrizePoolTest is Test {
prizePool.computeRangeStartDrawIdInclusive(1, 0);
}

function mockGetAverageBalanceBetween(
address _vault,
address _user,
uint48 _startTime,
uint48 _endTime,
uint256 _result
) internal {
vm.mockCall(
address(twabController),
abi.encodeWithSelector(
TwabController.getTwabBetween.selector,
_vault,
_user,
_startTime,
_endTime
),
abi.encode(_result)
);
}

function mockGetAverageTotalSupplyBetween(
address _vault,
uint32 _startTime,
uint32 _endTime,
uint256 _result
) internal {
vm.mockCall(
address(twabController),
abi.encodeWithSelector(
TwabController.getTotalSupplyTwabBetween.selector,
_vault,
_startTime,
_endTime
),
abi.encode(_result)
);
}
// function mockGetAverageBalanceBetween(
// address _vault,
// address _user,
// uint48 _startTime,
// uint48 _endTime,
// uint256 _result
// ) internal {
// vm.mockCall(
// address(twabController),
// abi.encodeWithSelector(
// TwabController.getTwabBetween.selector,
// _vault,
// _user,
// _startTime,
// _endTime
// ),
// abi.encode(_result)
// );
// }

// function mockGetAverageTotalSupplyBetween(
// address _vault,
// uint32 _startTime,
// uint32 _endTime,
// uint256 _result
// ) internal {
// vm.mockCall(
// address(twabController),
// abi.encodeWithSelector(
// TwabController.getTotalSupplyTwabBetween.selector,
// _vault,
// _startTime,
// _endTime
// ),
// abi.encode(_result)
// );
// }

function contribute(uint256 amountContributed) public {
contribute(amountContributed, address(this));
Expand Down Expand Up @@ -1755,31 +1786,95 @@ contract PrizePoolTest is Test {
return prizePool.claimPrize(sender, tier, prizeIndex, sender, fee, feeRecipient);
}

function mockTwab(address _vault, address _account, uint256 startTime, uint256 endTime) public {
mockGetAverageBalanceBetween(_vault, _account, uint32(startTime), uint32(endTime), 366e30);
mockGetAverageTotalSupplyBetween(_vault, uint32(startTime), uint32(endTime), 1e30);
function mockTwab(address _vault, address _account, uint8 _tier) public {
mockTwabForUser(_vault, _account, _tier, 366e30);
mockTwabTotalSupply(_vault, _tier, 1e30);
}

function mockTwabDrawRange(address _vault, address _account, uint24 startDrawIdInclusive, uint24 endDrawIdInclusive, uint256 amount) public {
function mockTwabForUser(address _vault, address _account, uint8 _tier, uint256 _balance) public {
uint24 endDraw = prizePool.getLastAwardedDrawId();
uint24 durationDraws = prizePool.getTierAccrualDurationInDraws(_tier);
uint24 startDraw = prizePool.computeRangeStartDrawIdInclusive(endDraw, durationDraws);
mockGetAverageBalanceBetween(_vault, _account, startDraw, endDraw, _balance);
}

function mockTwabTotalSupply(address _vault, uint8 _tier, uint256 _totalSupply) public {
uint24 endDraw = prizePool.getLastAwardedDrawId();
uint24 durationDraws = prizePool.getTierAccrualDurationInDraws(_tier);
uint24 startDraw = prizePool.computeRangeStartDrawIdInclusive(endDraw, durationDraws);
mockTwabTotalSupplyDrawRange(_vault, startDraw, endDraw, _totalSupply);
}

function mockGetAverageBalanceBetween(address _vault, address _account, uint24 startDrawIdInclusive, uint24 endDrawIdInclusive, uint256 amount) public {
uint48 startTime = prizePool.drawOpensAt(startDrawIdInclusive);
uint48 endTime = prizePool.drawClosesAt(endDrawIdInclusive);
mockGetAverageBalanceBetween(_vault, _account, uint32(startTime), uint32(endTime), amount);
// mockGetAverageBalanceBetween(_vault, _account, uint32(startTime), uint32(endTime), amount);
vm.mockCall(
address(twabController),
abi.encodeWithSelector(
TwabController.getTwabBetween.selector,
_vault,
_account,
startTime,
endTime
),
abi.encode(amount)
);
}

function mockTwabTotalSupplyDrawRange(address _vault, uint24 startDrawIdInclusive, uint24 endDrawIdInclusive, uint256 amount) public {
uint48 startTime = prizePool.drawOpensAt(startDrawIdInclusive);
uint48 endTime = prizePool.drawClosesAt(endDrawIdInclusive);
mockGetAverageTotalSupplyBetween(_vault, uint32(startTime), uint32(endTime), amount);
// mockGetAverageTotalSupplyBetween(_vault, uint32(startTime), uint32(endTime), amount);
vm.mockCall(
address(twabController),
abi.encodeWithSelector(
TwabController.getTotalSupplyTwabBetween.selector,
_vault,
startTime,
endTime
),
abi.encode(amount)
);
}

function mockTwab(address _vault, address _account, uint8 _tier) public {
uint24 endDraw = prizePool.getLastAwardedDrawId();
uint24 durationDraws = prizePool.getTierAccrualDurationInDraws(_tier);
uint24 startDraw = prizePool.computeRangeStartDrawIdInclusive(endDraw, durationDraws);
uint48 startTime = prizePool.drawOpensAt(startDraw);
uint48 endTime = prizePool.drawClosesAt(endDraw);
mockTwab(_vault, _account, startTime, endTime);
}
// function mockGetAverageBalanceBetween(
// address _vault,
// address _user,
// uint48 _startTime,
// uint48 _endTime,
// uint256 _result
// ) internal {
// vm.mockCall(
// address(twabController),
// abi.encodeWithSelector(
// TwabController.getTwabBetween.selector,
// _vault,
// _user,
// _startTime,
// _endTime
// ),
// abi.encode(_result)
// );
// }

// function mockGetAverageTotalSupplyBetween(
// address _vault,
// uint32 _startTime,
// uint32 _endTime,
// uint256 _result
// ) internal {
// vm.mockCall(
// address(twabController),
// abi.encodeWithSelector(
// TwabController.getTotalSupplyTwabBetween.selector,
// _vault,
// _startTime,
// _endTime
// ),
// abi.encode(_result)
// );
// }

function grandPrizeRangeStart(uint24 endDrawIdInclusive) public view returns (uint24) {
return prizePool.computeRangeStartDrawIdInclusive(endDrawIdInclusive, grandPrizePeriodDraws);
Expand All @@ -1794,7 +1889,7 @@ contract PrizePoolTest is Test {
function mockShutdownTwab(uint256 userTwab, uint256 totalSupplyTwab) public {
(uint24 startDrawId, uint24 shutdownDrawId) = shutdownRangeDrawIds();
// console2.log("mockShutdownTwab ", startDrawId, shutdownDrawId);
mockTwabDrawRange(address(this), msg.sender, startDrawId, shutdownDrawId, userTwab);
mockGetAverageBalanceBetween(address(this), msg.sender, startDrawId, shutdownDrawId, userTwab);
mockTwabTotalSupplyDrawRange(address(this), startDrawId, shutdownDrawId, totalSupplyTwab);
}

Expand Down

0 comments on commit e511bc9

Please sign in to comment.