Skip to content

Commit 6053478

Browse files
Feature/tolerance concentrate (#117)
* Refactor boundary conditions in XYCConcentrateArgsBuilder and adjust tolerance values in tests
1 parent f8b7477 commit 6053478

File tree

5 files changed

+58
-55
lines changed

5 files changed

+58
-55
lines changed

.gas-snapshot

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_quote_exactIn() (gas: 146619)
2-
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_quote_exactOut() (gas: 146945)
3-
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_swap_exactIn() (gas: 248027)
4-
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_swap_exactOut() (gas: 249334)
5-
AMMGas:test_gas_ConcentrateGrowPriceRange_XYCSwap_quote_exactIn() (gas: 146629)
6-
AMMGas:test_gas_ConcentrateGrowPriceRange_XYCSwap_swap_exactIn() (gas: 248048)
7-
AMMGas:test_gas_Concentrate_Decay_XYCSwap_quote_exactIn() (gas: 162514)
8-
AMMGas:test_gas_Concentrate_Decay_XYCSwap_swap_exactIn() (gas: 312434)
1+
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_quote_exactIn() (gas: 146400)
2+
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_quote_exactOut() (gas: 146726)
3+
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_swap_exactIn() (gas: 247808)
4+
AMMGas:test_gas_ConcentrateGrowLiquidity_XYCSwap_swap_exactOut() (gas: 249115)
5+
AMMGas:test_gas_ConcentrateGrowPriceRange_XYCSwap_quote_exactIn() (gas: 146410)
6+
AMMGas:test_gas_ConcentrateGrowPriceRange_XYCSwap_swap_exactIn() (gas: 247829)
7+
AMMGas:test_gas_Concentrate_Decay_XYCSwap_quote_exactIn() (gas: 162295)
8+
AMMGas:test_gas_Concentrate_Decay_XYCSwap_swap_exactIn() (gas: 312215)
99
AMMGas:test_gas_Decay_XYCSwap_quote_exactIn() (gas: 132378)
1010
AMMGas:test_gas_Decay_XYCSwap_quote_exactOut() (gas: 133297)
1111
AMMGas:test_gas_Decay_XYCSwap_swap_exactIn() (gas: 281616)
1212
AMMGas:test_gas_Decay_XYCSwap_swap_exactOut() (gas: 281833)
13-
AMMGas:test_gas_FullAMM_quote_exactIn() (gas: 175492)
14-
AMMGas:test_gas_FullAMM_swap_exactIn() (gas: 324862)
13+
AMMGas:test_gas_FullAMM_quote_exactIn() (gas: 175273)
14+
AMMGas:test_gas_FullAMM_swap_exactIn() (gas: 324643)
1515
AMMGas:test_gas_XYCSwap_FlatFeeIn_quote_exactIn() (gas: 128844)
1616
AMMGas:test_gas_XYCSwap_FlatFeeIn_swap_exactIn() (gas: 231407)
1717
AMMGas:test_gas_XYCSwap_FlatFeeOut_quote_exactIn() (gas: 128899)
@@ -85,35 +85,35 @@ BaseFeeAdjusterTest:test_BaseFeeAdjusterLimitSwapGasVariations() (gas: 308550)
8585
BaseFeeAdjusterTest:test_BaseFeeAdjusterMaxDecayLimits() (gas: 124457)
8686
BaseFeeAdjusterTest:test_BaseFeeAdjusterNoAdjustmentBelowBase() (gas: 158773)
8787
BaseFeeAdjusterTest:test_BaseFeeAdjusterWithDutchAuction() (gas: 523277)
88-
ConcentrateTest:test_ConcentrateGrowLiquidity_ImpossibleSwapTokenNotInActiveStrategy() (gas: 851506)
89-
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForBothTokensNoFee() (gas: 557163)
90-
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForBothTokensWithFee() (gas: 556969)
91-
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForTokenA() (gas: 354667)
92-
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForTokenB() (gas: 354848)
93-
ConcentrateTest:test_ConcentrateGrowLiquidity_SpreadSlowlyGrowsForSomeReason() (gas: 28240503)
88+
ConcentrateTest:test_ConcentrateGrowLiquidity_ImpossibleSwapTokenNotInActiveStrategy() (gas: 851287)
89+
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForBothTokensNoFee() (gas: 556944)
90+
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForBothTokensWithFee() (gas: 556750)
91+
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForTokenA() (gas: 354448)
92+
ConcentrateTest:test_ConcentrateGrowLiquidity_KeepsPriceRangeForTokenB() (gas: 354629)
93+
ConcentrateTest:test_ConcentrateGrowLiquidity_SpreadSlowlyGrowsForSomeReason() (gas: 28240284)
9494
ConcentrateTest:test_ConcentrateRounding_ExactOutUsesMakerFavoringReserveIn() (gas: 143994)
95-
ConcentrateTest:test_QuoteAndSwapExactOutAmountsMatches() (gas: 314538)
96-
ConcentrateTest:test_RoundingInvariantsWithFees() (gas: 40400999)
95+
ConcentrateTest:test_QuoteAndSwapExactOutAmountsMatches() (gas: 314319)
96+
ConcentrateTest:test_RoundingInvariantsWithFees() (gas: 40400780)
9797
ConcentrateTest:test_ZeroBalance_SpotAtLowerBound() (gas: 260076)
9898
ConcentrateTest:test_ZeroBalance_SpotAtUpperBound() (gas: 259839)
99-
ConcentrateXYCDecayFeesInvariants:test_Order1_GrowLiquidity2D() (gas: 3108345)
100-
ConcentrateXYCDecayFeesInvariants:test_Order1_GrowPriceRange2D() (gas: 2772282)
101-
ConcentrateXYCDecayFeesInvariants:test_Order2_GrowLiquidity2D() (gas: 3110798)
102-
ConcentrateXYCDecayFeesInvariants:test_Order2_GrowPriceRange2D() (gas: 2771412)
103-
ConcentrateXYCDecayFeesInvariants:test_Order4_GrowLiquidity2D() (gas: 3314704)
104-
ConcentrateXYCDecayFeesInvariants:test_Order4_GrowPriceRange2D() (gas: 2866770)
105-
ConcentrateXYCDecayFeesInvariants:test_Order5_GrowLiquidity2D() (gas: 3117858)
106-
ConcentrateXYCDecayInvariants:test_ConcentrateGrowLiquidity2D_Decay() (gas: 6580217)
107-
ConcentrateXYCDecayInvariants:test_ConcentrateVariousDecayPeriods() (gas: 26209306)
99+
ConcentrateXYCDecayFeesInvariants:test_Order1_GrowLiquidity2D() (gas: 3108126)
100+
ConcentrateXYCDecayFeesInvariants:test_Order1_GrowPriceRange2D() (gas: 2772063)
101+
ConcentrateXYCDecayFeesInvariants:test_Order2_GrowLiquidity2D() (gas: 3110579)
102+
ConcentrateXYCDecayFeesInvariants:test_Order2_GrowPriceRange2D() (gas: 2771193)
103+
ConcentrateXYCDecayFeesInvariants:test_Order4_GrowLiquidity2D() (gas: 3314485)
104+
ConcentrateXYCDecayFeesInvariants:test_Order4_GrowPriceRange2D() (gas: 2866551)
105+
ConcentrateXYCDecayFeesInvariants:test_Order5_GrowLiquidity2D() (gas: 3117639)
106+
ConcentrateXYCDecayInvariants:test_ConcentrateGrowLiquidity2D_Decay() (gas: 6579998)
107+
ConcentrateXYCDecayInvariants:test_ConcentrateVariousDecayPeriods() (gas: 26208430)
108108
ConcentrateXYCFeesInvariants:test_ConcentrateXYC() (gas: 5448177)
109109
ConcentrateXYCFeesInvariants:test_ConcentrateXYCFlatFeeIn() (gas: 5628638)
110110
ConcentrateXYCFeesInvariants:test_ConcentrateXYCMultipleFees() (gas: 6325997)
111111
ConcentrateXYCFeesInvariants:test_ConcentrateXYCProtocolFee() (gas: 6146773)
112-
ConcentrateXYCInvariants:test_ConcentrateDifferentRanges() (gas: 21549856)
113-
ConcentrateXYCInvariants:test_ConcentrateGrowLiquidity2D() (gas: 5427338)
114-
ConcentrateXYCRounding:test_RoundingProtection_AsymmetricRange() (gas: 15987463)
115-
ConcentrateXYCRounding:test_RoundingProtection_NarrowRange() (gas: 16030081)
116-
ConcentrateXYCRounding:test_RoundingProtection_StandardRange() (gas: 16029546)
112+
ConcentrateXYCInvariants:test_ConcentrateDifferentRanges() (gas: 21548980)
113+
ConcentrateXYCInvariants:test_ConcentrateGrowLiquidity2D() (gas: 5427119)
114+
ConcentrateXYCRounding:test_RoundingProtection_AsymmetricRange() (gas: 15987244)
115+
ConcentrateXYCRounding:test_RoundingProtection_NarrowRange() (gas: 16029862)
116+
ConcentrateXYCRounding:test_RoundingProtection_StandardRange() (gas: 16029327)
117117
ControlsAquaTest:test_DeadlineAlreadyPassed() (gas: 246623)
118118
ControlsAquaTest:test_DeadlineControl() (gas: 407661)
119119
ControlsAquaTest:test_OnlyTakerTokenBalanceNonZero_Fail() (gas: 269588)
@@ -190,13 +190,13 @@ DynamicProtocolFeeTest:test_DynamicProtocolFee_WithFlatFee() (gas: 314882)
190190
DynamicProtocolFeeTest:test_DynamicProtocolFee_ZeroAddress_Reverts() (gas: 150502)
191191
DynamicProtocolFeeTest:test_DynamicProtocolFee_ZeroFee_NoTransfer() (gas: 274725)
192192
DynamicProtocolFeeTest:test_DynamicProtocolFee_ZeroProvider_NoFee() (gas: 257573)
193-
EdgePriceRange:test_AsymmetricRangeDown() (gas: 7078722)
194-
EdgePriceRange:test_AsymmetricRangeUp() (gas: 7078563)
193+
EdgePriceRange:test_AsymmetricRangeDown() (gas: 7078503)
194+
EdgePriceRange:test_AsymmetricRangeUp() (gas: 7081144)
195195
EdgePriceRange:test_ConcentrateXYC() (gas: 7053138)
196196
EdgePriceRange:test_ConcentrateXYCFlatFeeIn() (gas: 7281551)
197197
EdgePriceRange:test_ConcentrateXYCMultipleFees() (gas: 8190511)
198198
EdgePriceRange:test_ConcentrateXYCProtocolFee() (gas: 7963271)
199-
EdgePriceRange:test_VeryNarrowRange() (gas: 7078326)
199+
EdgePriceRange:test_VeryNarrowRange() (gas: 7078107)
200200
ExampleInvariantUsage:test_AMMWithFeesInvariants() (gas: 6583342)
201201
ExampleInvariantUsage:test_LimitOrderInvariants() (gas: 3978781)
202202
ExampleInvariantUsage:test_ProgressiveFeeInvariants() (gas: 2285364)
@@ -620,7 +620,7 @@ UnwrapWethTest:test_MakerShouldReciveEthToCustomAddress() (gas: 288172)
620620
UnwrapWethTest:test_RejectDirectEtherTransfer() (gas: 19364)
621621
UnwrapWethTest:test_TakerShouldReciveEth() (gas: 326663)
622622
UnwrapWethTest:test_TakerShouldReciveEthToCustomAddress() (gas: 327997)
623-
UnwrapWethTest:test_UnwrapWeth_Fuzz(bool,bool,bool,uint128) (runs: 256, μ: 314988, ~: 323750)
623+
UnwrapWethTest:test_UnwrapWeth_Fuzz(bool,bool,bool,uint128) (runs: 256, μ: 315014, ~: 323750)
624624
VeryImbalancedDifferentDecimals:test_AsymmetricPool_ReverseSwap_NoAxisMismatch() (gas: 457375)
625625
VeryImbalancedDifferentDecimals:test_Pegged() (gas: 6118830)
626626
VeryImbalancedDifferentDecimals:test_PeggedDynamicProtocolFeeIn() (gas: 7367551)
@@ -648,22 +648,22 @@ XYCConcentrateCapitalEfficiencyTest:test_HalfCapital_ConcentrateMatchesFullXYCSw
648648
XYCConcentrateCapitalEfficiencyTest:test_NarrowerRange_HigherCapitalEfficiency() (gas: 242781)
649649
XYCConcentrateCapitalEfficiencyTest:test_SameCapital_ConcentrateOutputBetter() (gas: 228819)
650650
XYCConcentrateCapitalEfficiencyTest:test_Slippage_ConcentrateRTimesLess() (gas: 229532)
651-
XYCConcentrateFeeEffectivePriceBoundsTest:test_EffectivePriceAtPmax_3pctFee() (gas: 336508)
652-
XYCConcentrateFeeEffectivePriceBoundsTest:test_EffectivePriceAtPmin_3pctFee() (gas: 357202)
653-
XYCConcentrateFeeTrackingDetailedTest:test_DetailedFeeTracking_PerIteration() (gas: 989429096)
654-
XYCConcentrateFeeTrackingDetailedTest:test_DetailedFeeTracking_ReversedPattern() (gas: 6297019)
655-
XYCConcentratePnLTest:test_AsymmetricRange_CorrectInit_MakerEarns() (gas: 78212964)
651+
XYCConcentrateFeeEffectivePriceBoundsTest:test_EffectivePriceAtPmax_3pctFee() (gas: 335864)
652+
XYCConcentrateFeeEffectivePriceBoundsTest:test_EffectivePriceAtPmin_3pctFee() (gas: 356983)
653+
XYCConcentrateFeeTrackingDetailedTest:test_DetailedFeeTracking_PerIteration() (gas: 989428877)
654+
XYCConcentrateFeeTrackingDetailedTest:test_DetailedFeeTracking_ReversedPattern() (gas: 6296800)
655+
XYCConcentratePnLTest:test_AsymmetricRange_CorrectInit_MakerEarns() (gas: 78212745)
656656
XYCConcentratePnLTest:test_AsymmetricRange_WrongInit_MakerLoses() (gas: 78418610)
657-
XYCConcentratePnLTest:test_MakerEarns_CorrectBalances_HighPriceRatio() (gas: 31482202)
658-
XYCConcentratePnLTest:test_MakerEarns_CorrectBalances_SpotAbove1() (gas: 31397522)
659-
XYCConcentratePnLTest:test_MakerEarns_CorrectBalances_SpotBelow1() (gas: 31397170)
657+
XYCConcentratePnLTest:test_MakerEarns_CorrectBalances_HighPriceRatio() (gas: 31481983)
658+
XYCConcentratePnLTest:test_MakerEarns_CorrectBalances_SpotAbove1() (gas: 31397303)
659+
XYCConcentratePnLTest:test_MakerEarns_CorrectBalances_SpotBelow1() (gas: 31396951)
660660
XYCConcentratePnLTest:test_MakerLoses_WrongBalances_SpotAbove1() (gas: 31465926)
661661
XYCConcentratePnLTest:test_MakerLoses_WrongBalances_SpotBelow1() (gas: 31466080)
662-
XYCConcentratePnLTest:test_PriceBounds_SpotAbove1() (gas: 364841)
663-
XYCConcentratePnLTest:test_PriceBounds_SpotBelow1() (gas: 364716)
664-
XYCConcentratePnLTest:test_QuoteEqualsSwap_HighPriceRatio() (gas: 519111)
665-
XYCConcentratePnLTest:test_QuoteEqualsSwap_SpotAbove1() (gas: 518531)
666-
XYCConcentratePnLTest:test_QuoteEqualsSwap_SpotBelow1() (gas: 518670)
662+
XYCConcentratePnLTest:test_PriceBounds_SpotAbove1() (gas: 364622)
663+
XYCConcentratePnLTest:test_PriceBounds_SpotBelow1() (gas: 364497)
664+
XYCConcentratePnLTest:test_QuoteEqualsSwap_HighPriceRatio() (gas: 518892)
665+
XYCConcentratePnLTest:test_QuoteEqualsSwap_SpotAbove1() (gas: 518312)
666+
XYCConcentratePnLTest:test_QuoteEqualsSwap_SpotBelow1() (gas: 518451)
667667
XYCFeesInvariants:test_XYC() (gas: 5020020)
668668
XYCFeesInvariants:test_XYCDynamicProtocolFeeIn() (gas: 6269141)
669669
XYCFeesInvariants:test_XYCFlatFeeIn() (gas: 5175698)

src/instructions/XYCConcentrate.sol

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,12 @@ library XYCConcentrateArgsBuilder {
6262
) internal pure returns (uint256 bLt, uint256 bGt) {
6363
require(sqrtPmin < sqrtPmax, ConcentrateInvalidPriceBounds(sqrtPmin, sqrtPmax));
6464

65-
if (sqrtPmax > sqrtPspot) {
66-
bLt = Math.Math.ceilDiv(targetL, sqrtPmax - sqrtPspot, Math.mulDiv(sqrtPmax, sqrtPspot, ONE));
67-
}
65+
uint256 invSqrtPspot = Math.mulDiv(ONE, ONE, sqrtPspot);
66+
uint256 invSqrtPmax = Math.mulDiv(ONE, ONE, sqrtPmax);
67+
68+
// Handle boundary: if sqrtPspot >= sqrtPmax, bLt = 0
69+
bLt = invSqrtPspot > invSqrtPmax ? Math.mulDiv(targetL, invSqrtPspot - invSqrtPmax, ONE) : 0;
70+
// Handle boundary: if sqrtPspot <= sqrtPmin, bGt = 0
6871
bGt = sqrtPspot > sqrtPmin ? Math.mulDiv(targetL, sqrtPspot - sqrtPmin, ONE) : 0;
6972
}
7073

test/invariants/concentrate/DustAmounts.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ contract DustAmounts is ConcentrateXYCFeesInvariants {
9090
// Monotonicity: 100% tolerance for dust amounts
9191
// Reason: Fee rounding (ceil) creates monotonicity violations
9292
// This is SAFE: gas costs >> any arbitrage profit (500 trillion:1 loss ratio)
93-
monotonicityToleranceBps = 15000; // 150%
93+
monotonicityToleranceBps = 10000; // 100%
9494

9595
// Rounding: 10% deviation allowed for dust
9696
// Dust amounts have extreme relative rounding errors

test/invariants/concentrate/HugeLiquidity.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ contract HugeLiquidity is ConcentrateXYCFeesInvariants {
3939
testAmounts[4] = 10e23;
4040

4141
symmetryTolerance = 0; // 0 wei tolerance for huge numbers
42-
additivityTolerance = 1; // 1 wei tolerance (rounding from single-division bLt formula)
42+
additivityTolerance = 0; // 0 wei tolerance (rounding from single-division bLt formula)
4343
}
4444
}

test/invariants/concentrate/MicroAmounts.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ contract MicroAmounts is ConcentrateXYCFeesInvariants {
6161
additivityTolerance = 1; // 1 wei (concentrate needs this for L recalculation)
6262

6363
// Monotonicity: dust amounts violate due to rounding
64-
monotonicityToleranceBps = 5;
64+
monotonicityToleranceBps = 1;
6565

6666
// Rounding: 1% deviation from spot price
6767
roundingToleranceBps = 100; // 1%

0 commit comments

Comments
 (0)