Oracle Usage and Asset Pricing
Sommelier Cellars are built on the notion of "real-time pricing". Given that adaptors can be built to interact with any external protocol in a variety of ways, the core interface guarantee that an adaptor must provide is that each adaptor:
- Must report a base pricing asset (see
- Must be able to report, for a given Cellar, its balance of that base asset (see
- There must be a way to price the base asset in terms of the Cellar's base asset.
This section will cover the third bullet point: how the Sommelier protocol efficiently prices position assets in terms of the Cellar's base asset. This pricing requirement allows a Cellar, at all times, to be able to report its TVL in calls to
_accounting. This is an essential aspect of the Cellar security model (see "totalAssets and Rebalance Deviations"). When available, Sommelier Cellars use Chainlink Data Feeds for on-chain asset pricing. In the future, alternative oracles and additional redundancy mechanisms may be added.
The Sommelier Cellars protocol currently requires a trust assumption that Chainlink Data Feeds will continue to be available and report accurate pricing. Malicious price reporting from Chainlink aggregators can lead to incorrect TVL valuations of Cellars, leading to under or over-assessments of fees. For this reason, Sommelier Governance must be extremely careful about supporting low-liquidity assets which may be subject to oracle manipulation attacks.
In addition, non-operation of Chainlink aggregators can lead to stuck funds, since
totalAssetschecks (which use pricing) are required for all TVL-changing operations. If the pricing call for any asset in a Cellar reverts, the entire
totalAssetscall will revert, effectively freezing the Cellar.
The Price Router serves as the entry point to all pricing operations on the Sommelier protocol. When an asset is added to the Price Router, the
_settingsargument will specify a
derivativevalue: this value is used to determine the mechanism by which the asset may be priced.
Assets which can be priced directly are associated with the address for which the relevant Chainlink aggregator exists. At setup time, the Price Router will call the aggregator to test correct reporting and set up sanity bounds based on the
maxAnswerreported by the aggregator.
For assets which may not be directly available via Chainlink Oracles, different
derivativearguments can be used to inform how the Price Router should translate the reported asset into other assets that can be priced. For instance, aToken derivatives store a mapping between the aToken and the correct underlying token (e.g.
aWETH -> WETH). Curve LP tokens use pricing information reported by the Curve pool itself. Additional mechanisms in the Price Router are in place to ensure that prices are continually up-to-date and don't deviate from expected values. See the "Price Router" section of Protocol (V2) Contract Architecture for more details on expected deviations, caching, and automation for updating price feeds.
For adaptors that directly hold tokens that can be given a market price (for instance, an adapter for holding WETH outright), the adaptor's
balanceOfcall should simply report that Cellar's balance (see ERC20Adaptor). For tokens which represent compositions or derivatives of tokens with a market price, the adaptor's
balanceOfcall must translate the balance of the held asset into an equivalent balance in the Cellar's base asset.
The mechanism of this translation depends on the nature of the underlying position. For example, adaptors that hold LP tokens should contain logic for splitting the LP token into component parts and translating one token's balance into the base token's balance. See UniswapV3Adaptor for an example, where an LP position exists for a pool of two tokens,
token1. If the adaptor's base asset is in terms of
token0, first, the adaptor must determine the amount of tokens of both
token1that can be redeemed for a given LP position, the amount of
token1is converted into the equivalent amount of
token0, then both amounts are summed together to report the entire balance.
For some assets which are priced via Chainlink data feeds, only ETH-based pools are supported (for instance, CRV-ETH). Since many Sommelier Cellars use USD-pegged coins as their underlying asset, the Price Router also requires that all assets can be priced in USD. In these cases, an additional pricing call is made to the ETH-USD feed, and a second price conversion is made to put the target asset in USD prices.