The MinimumVarianceUpdateRule contract handles negative prices asymmetrically compared to positive prices, leading to inconsistent weight calculations. While ChainlinkOracle enforces positive prices (require(data > 0)), negative prices can still occur through the project's MultiHopOracle which performs mathematical operations that may result in negative values. This asymmetry (4.1%) could cause significant pool imbalances in pools using MultiHopOracle or similar oracles that support negative prices.
Location: pkg/pool-quantamm/contracts/rules/MinimumVarianceUpdateRule.sol
The issue occurs in the weight calculation where negative prices produce asymmetric results compared to equivalent positive prices:
When handling negative prices (which can occur through MultiHopOracle's mathematical operations), the sign propagates through multiple calculations affecting both the normalization factor and final weights. The asymmetry is amplified by the variance calculations.
Test Results:
Note that the asymmetry (0.041 or 4.1%) is larger than AntiMomentumUpdateRule (1.7%) but smaller than DifferenceMomentumUpdateRule (8.7%). The weight difference could lead to substantial pool imbalances.
Significant asymmetric weight calculations for positive vs negative prices (4.1%)
Inconsistent pool behavior depending on price sign
Could lead to substantial weight distribution imbalances
May create arbitrage opportunities due to predictable asymmetry
Breaks mathematical symmetry expected in price calculations
Could compound with other weight calculation issues
Particularly concerning due to interaction with variance calculations
Modify price handling to maintain symmetry:
Consider architectural improvements:
Add explicit sign handling throughout calculations
Implement symmetry validation in tests
Add invariant checks for price sign handling
Consider using absolute values for intermediate calculations
Add documentation about price sign handling expectations
Consider extracting common price handling logic to a shared library
Add specific checks for variance calculations with negative prices
Add comprehensive tests:
Test symmetry with various price magnitudes
Test edge cases with extreme price values
Add property-based tests for price sign handling
Test interactions between variance and price signs
Test compounding effects over multiple updates
Test interactions with other weight calculation components
Add specific tests for variance-based edge cases
Multihop will call ChainlinkOracle and the check is in it: `require(data > 0, "INVLDDATA");` MultiHop is just here to combine Chainlinks feed when there is no direct USD price feed for a token.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.