diff --git a/src/abstract/TieredLiquidityDistributor.sol b/src/abstract/TieredLiquidityDistributor.sol index c76be18..aa7170d 100644 --- a/src/abstract/TieredLiquidityDistributor.sol +++ b/src/abstract/TieredLiquidityDistributor.sol @@ -651,15 +651,6 @@ contract TieredLiquidityDistributor { : uint32(TierCalculationLib.prizeCount(_tier)); } - /// @notice Computes the remaining liquidity for the given tier - /// @param _tier The tier to compute the remaining liquidity for - /// @return The remaining liquidity - function getTierRemainingLiquidity(uint8 _tier) external view returns (uint112) { - uint8 numTiers = numberOfTiers; - return - uint104(_remainingTierLiquidity(_getTier(_tier, numTiers), _computeShares(_tier, numTiers))); - } - /// @notice Retrieves an up-to-date Tier struct for the given tier /// @param _tier The tier to retrieve /// @param _numberOfTiers The number of tiers, should match the current. Passed explicitly as an optimization @@ -717,7 +708,15 @@ contract TieredLiquidityDistributor { uint104 _liquidity ) internal returns (Tier memory) { uint8 _shares = _computeShares(_tier, numberOfTiers); - uint104 remainingLiquidity = uint104(_remainingTierLiquidity(_tierStruct, _shares)); + uint104 remainingLiquidity = uint104( + fromUD60x18( + _getTierRemainingLiquidity( + _shares, + fromUD34x4toUD60x18(_tierStruct.prizeTokenPerShare), + fromUD34x4toUD60x18(prizeTokenPerShare) + ) + ) + ); if (_liquidity > remainingLiquidity) { uint104 excess = _liquidity - remainingLiquidity; if (excess > _reserve) { @@ -735,26 +734,6 @@ contract TieredLiquidityDistributor { return _tierStruct; } - /// @notice Computes the total liquidity available to a tier - /// @param _tier The tier to compute the liquidity for - /// @return The total liquidity - function _remainingTierLiquidity( - Tier memory _tier, - uint8 _shares - ) internal view returns (uint112) { - UD34x4 _prizeTokenPerShare = prizeTokenPerShare; - if (UD34x4.unwrap(_tier.prizeTokenPerShare) >= UD34x4.unwrap(_prizeTokenPerShare)) { - return 0; - } - UD60x18 delta = fromUD34x4toUD60x18(_prizeTokenPerShare).sub( - fromUD34x4toUD60x18(_tier.prizeTokenPerShare) - ); - // delta max int size is (uMAX_UD34x4 / 1e4) - // max share size is 256 - // result max = (uMAX_UD34x4 / 1e4) * 256 - return uint112(fromUD60x18(delta.mul(toUD60x18(_shares)))); - } - /// @notice Computes the prize size of the given tier /// @param _tier The tier to compute the prize size of /// @param _numberOfTiers The current number of tiers @@ -838,7 +817,7 @@ contract TieredLiquidityDistributor { for (uint8 i = start; i < end; i++) { Tier memory tierLiquidity = _tiers[i]; uint8 shares = _computeShares(i, _numberOfTiers); - UD60x18 liq = _getRemainingTierLiquidity( + UD60x18 liq = _getTierRemainingLiquidity( shares, fromUD34x4toUD60x18(tierLiquidity.prizeTokenPerShare), _prizeTokenPerShare @@ -848,14 +827,14 @@ contract TieredLiquidityDistributor { return fromUD60x18(reclaimedLiquidity); } - /// @notice Computes the total liquidity available to a tier + /// @notice Computes the remaining liquidity available to a tier /// @param _tier The tier to compute the liquidity for - /// @return The total liquidity - function getRemainingTierLiquidity(uint8 _tier) external view returns (uint256) { + /// @return The remaining liquidity + function getTierRemainingLiquidity(uint8 _tier) external view returns (uint256) { uint8 _numTiers = numberOfTiers; return fromUD60x18( - _getRemainingTierLiquidity( + _getTierRemainingLiquidity( _computeShares(_tier, _numTiers), fromUD34x4toUD60x18(_getTier(_tier, _numTiers).prizeTokenPerShare), fromUD34x4toUD60x18(prizeTokenPerShare) @@ -867,8 +846,8 @@ contract TieredLiquidityDistributor { /// @param _shares The number of shares that the tier has (can be tierShares or canaryShares) /// @param _tierPrizeTokenPerShare The prizeTokenPerShare of the Tier struct /// @param _prizeTokenPerShare The global prizeTokenPerShare - /// @return The total available liquidity - function _getRemainingTierLiquidity( + /// @return The remaining available liquidity + function _getTierRemainingLiquidity( uint256 _shares, UD60x18 _tierPrizeTokenPerShare, UD60x18 _prizeTokenPerShare diff --git a/test/PrizePool.t.sol b/test/PrizePool.t.sol index 8b20ba5..88b2e20 100644 --- a/test/PrizePool.t.sol +++ b/test/PrizePool.t.sol @@ -538,7 +538,7 @@ contract PrizePoolTest is Test { } function testGetRemainingTierLiquidity_invalidTier() public { - assertEq(prizePool.getRemainingTierLiquidity(10), 0); + assertEq(prizePool.getTierRemainingLiquidity(10), 0); } function testGetRemainingTierLiquidity_grandPrize() public { @@ -547,14 +547,14 @@ contract PrizePoolTest is Test { // 2 tiers at 100 shares each, and 10 for canary and 10 for reserve // = 100 / 220 = 10 / 22 = 0.45454545454545453 // then take only 10% due to alpha = 0.9 - assertEq(prizePool.getRemainingTierLiquidity(0), 0.0454545454545454e18); + assertEq(prizePool.getTierRemainingLiquidity(0), 0.0454545454545454e18); } function testGetRemainingTierLiquidity_afterClaim() public { contribute(100e18); completeAndStartNextDraw(winningRandomNumber); uint256 liquidity = 4.5454545454545454e18; - assertEq(prizePool.getRemainingTierLiquidity(1), liquidity, "second tier"); + assertEq(prizePool.getTierRemainingLiquidity(1), liquidity, "second tier"); mockTwab(sender1, 1); uint256 prize = 1.13636363636363635e18; @@ -562,7 +562,7 @@ contract PrizePoolTest is Test { // reduce by prize assertEq( - prizePool.getRemainingTierLiquidity(1), + prizePool.getTierRemainingLiquidity(1), liquidity - prize, "second tier liquidity post claim 1" ); @@ -571,10 +571,10 @@ contract PrizePoolTest is Test { function testGetRemainingTierLiquidity_canary() public { contribute(220e18); completeAndStartNextDraw(winningRandomNumber); - assertEq(prizePool.getRemainingTierLiquidity(0), 10e18); - assertEq(prizePool.getRemainingTierLiquidity(1), 10e18); + assertEq(prizePool.getTierRemainingLiquidity(0), 10e18); + assertEq(prizePool.getTierRemainingLiquidity(1), 10e18); // canary tier - assertEq(prizePool.getRemainingTierLiquidity(2), 1e18); + assertEq(prizePool.getTierRemainingLiquidity(2), 1e18); } function testSetDrawManager() public { diff --git a/test/abstract/TieredLiquidityDistributor.t.sol b/test/abstract/TieredLiquidityDistributor.t.sol index 6319791..48508bc 100644 --- a/test/abstract/TieredLiquidityDistributor.t.sol +++ b/test/abstract/TieredLiquidityDistributor.t.sol @@ -88,7 +88,7 @@ contract TieredLiquidityDistributorTest is Test { function testGetRemainingTierLiquidity() public { distributor.nextDraw(3, 220e18); - assertEq(distributor.getRemainingTierLiquidity(0), 100e18); + assertEq(distributor.getTierRemainingLiquidity(0), 100e18); } function testGetTierRemainingLiquidity() public { @@ -122,11 +122,11 @@ contract TieredLiquidityDistributorTest is Test { function testExpansionTierLiquidity() public { distributor.nextDraw(3, 220e18); // canary gets 10e18 - assertEq(distributor.getRemainingTierLiquidity(2), 10e18, "canary initial liquidity"); + assertEq(distributor.getTierRemainingLiquidity(2), 10e18, "canary initial liquidity"); distributor.nextDraw(5, 420e18); // should be 420 distributed - assertEq(distributor.getRemainingTierLiquidity(3), 100e18, "new tier liquidity"); - assertEq(distributor.getRemainingTierLiquidity(4), 10e18, "canary liquidity"); + assertEq(distributor.getTierRemainingLiquidity(3), 100e18, "new tier liquidity"); + assertEq(distributor.getTierRemainingLiquidity(4), 10e18, "canary liquidity"); } function testExpansionTierLiquidity_max() public { @@ -142,7 +142,7 @@ contract TieredLiquidityDistributorTest is Test { uint256 summed; for (uint8 t = 0; t < distributor.numberOfTiers(); t++) { - summed += distributor.getRemainingTierLiquidity(t); + summed += distributor.getTierRemainingLiquidity(t); } summed += distributor.reserve(); @@ -195,7 +195,7 @@ contract TieredLiquidityDistributorTest is Test { function summedLiquidity() public view returns (uint256) { uint256 summed; for (uint8 t = 0; t < distributor.numberOfTiers(); t++) { - summed += distributor.getRemainingTierLiquidity(t); + summed += distributor.getTierRemainingLiquidity(t); } summed += distributor.reserve(); return summed; diff --git a/test/abstract/helper/TieredLiquidityDistributorWrapper.sol b/test/abstract/helper/TieredLiquidityDistributorWrapper.sol index bb9cad4..be84ea5 100644 --- a/test/abstract/helper/TieredLiquidityDistributorWrapper.sol +++ b/test/abstract/helper/TieredLiquidityDistributorWrapper.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.17; import "forge-std/console2.sol"; -import { TieredLiquidityDistributor, Tier, fromUD34x4toUD60x18 } from "src/abstract/TieredLiquidityDistributor.sol"; +import { TieredLiquidityDistributor, Tier, fromUD34x4toUD60x18, fromUD60x18 } from "src/abstract/TieredLiquidityDistributor.sol"; contract TieredLiquidityDistributorWrapper is TieredLiquidityDistributor { constructor( @@ -34,7 +34,16 @@ contract TieredLiquidityDistributorWrapper is TieredLiquidityDistributor { function remainingTierLiquidity(uint8 _tier) external view returns (uint112) { uint8 shares = _computeShares(_tier, numberOfTiers); Tier memory tier = _getTier(_tier, numberOfTiers); - return _remainingTierLiquidity(tier, shares); + return + uint112( + fromUD60x18( + _getTierRemainingLiquidity( + shares, + fromUD34x4toUD60x18(tier.prizeTokenPerShare), + fromUD34x4toUD60x18(prizeTokenPerShare) + ) + ) + ); } function getTierLiquidityToReclaim(uint8 _nextNumberOfTiers) external view returns (uint256) { diff --git a/test/invariants/helpers/TieredLiquidityDistributorFuzzHarness.sol b/test/invariants/helpers/TieredLiquidityDistributorFuzzHarness.sol index e176372..4845de5 100644 --- a/test/invariants/helpers/TieredLiquidityDistributorFuzzHarness.sol +++ b/test/invariants/helpers/TieredLiquidityDistributorFuzzHarness.sol @@ -27,7 +27,13 @@ contract TieredLiquidityDistributorFuzzHarness is TieredLiquidityDistributor { uint256 availableLiquidity; for (uint8 i = 0; i < numberOfTiers; i++) { Tier memory tier = _getTier(i, numberOfTiers); - availableLiquidity += _remainingTierLiquidity(tier, _computeShares(i, numberOfTiers)); + availableLiquidity += fromUD60x18( + _getTierRemainingLiquidity( + _computeShares(i, numberOfTiers), + fromUD34x4toUD60x18(tier.prizeTokenPerShare), + fromUD34x4toUD60x18(prizeTokenPerShare) + ) + ); } // console2.log("reserve ", _reserve); availableLiquidity += _reserve; @@ -40,7 +46,15 @@ contract TieredLiquidityDistributorFuzzHarness is TieredLiquidityDistributor { Tier memory tier_ = _getTier(tier, numberOfTiers); uint8 shares = _computeShares(tier, numberOfTiers); - uint112 liq = _remainingTierLiquidity(tier_, shares); + uint112 liq = uint112( + fromUD60x18( + _getTierRemainingLiquidity( + shares, + fromUD34x4toUD60x18(tier_.prizeTokenPerShare), + fromUD34x4toUD60x18(prizeTokenPerShare) + ) + ) + ); // half the time consume only half if (_tier > 128) {