The protocol has inconsistent handling of negative prices between oracle implementations. While MultiHopOracle correctly allows negative prices (which is valid for synthetic tokens, inverse tokens, and price-difference tracking tokens), ChainlinkOracle incorrectly blocks them with a require(data > 0) check. This inconsistency creates confusion about negative price support and prevents uniform handling of legitimate negative price feeds across the protocol.
ERC20 token price feeds can be negative in several legitimate scenarios:
Synthetic tokens tracking price differences
Inverse token products
Derivative tokens
Spread-based tokens
The MultiHopOracle correctly allows these negative prices:
While ChainlinkOracle blocks them:
Severity: HIGH
Technical Impact:
Inconsistent oracle behavior across the protocol
Blocks legitimate negative price feeds in ChainlinkOracle
Creates confusion about negative price support
Prevents uniform price feed handling
Business Impact:
Cannot use ChainlinkOracle for legitimate negative price feeds
Requires complex oracle paths to support negative prices
Inconsistent support for synthetic/inverse products
Architectural confusion about price sign handling
Foundry testing framework
Manual code review
Analysis of oracle implementations
Cross-reference of Chainlink price feed specifications
Remove positive price requirement from ChainlinkOracle to match MultiHopOracle's behavior:
Add consistent validation across oracles:
Document negative price support clearly
Add uniform bounds checking if needed
Maintain consistent behavior across oracle implementations
Consider adding events for price validation failures
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.