MIP10c3-SP#: 27 Author(s): Niklas Kunkel (@NiklasKunkel) Contributors: Type: Process Component Oracle Team Name: Green Status: RFC Date Proposed: 2020-02-12 Date Ratified: <yyyy-mm-dd>
This Oracle would provide the UNI-V2-WBTC-DAI/USD price as part of the collateral onboarding process for the UNI-V2-WBTC-DAI LP token.
Oracle Data Model
A smart contract utilizes Uniswap primitives and liquidity reserves to calculate the price of a Uniswap Liquidity Provider (LP) token.
The reserves of the Uniswap pool, and the supply of the Uniswap LP token are used as inputs to the model. This model utilizes MakerDAO Oracles to price the underlying assets.
This model utilizes the following base assumptions:
Invariant k = reserve_x * reserve_y
reserve_x * price_x = reserve_y * price_y (only holds true at steady-state)
Combining (1) and (2) allows us to derive the formulas for calculating the “normalized” reserve balances of the underlying assets given the invariant k and prices of the underlying assets.
reserve_x = sqrt(k * price_y / price_x)
reserve_y = sqrt*(k * price_x / price_y)
Alternatively given one calculated normalized reserve, one can calculate the other using a mutation of (1).
This is useful for optimizing gas since calculating the square root is an expensive operation.
reserve_x = k / reserve_y
reserve_y = k / reserve_x
Once the normalized reserve balances have been calculated the price of the LP token can be derived:
price_lp = ( (reserve_x * price_x) + (reserve_y * price_y) ) / supply_lp
Substitute of (3), (4) and (7) gives us the following model for calculating the price of a Uniswap V2 LP token:
price_lp = ( (sqrt(k * price_y / price_x) * price_x) + (sqrt(k * price_x / price_y) * price_y) ) / supply_lp
This can be simplified to:
price_lo = 2 * sqrt(k * price_x * price_y) / supply_lp
Oracle Supporting Data Model(s)
| Source | Asset Pair | Feed Model | | :------------ | :------------ | :----------: | | Bitstamp | BTC/USD | Median | | Bittrex | BTC/USD | | | Coinbase | BTC/USD | | | Gemini | BTC/USD | | | Kraken | BTC/USD | |
- Mainnet - UniV2LpOracle - TBD
- Deploy Oracle from Factory Contract
The Uniswap V2 WBTC-DAI pair has very little liquidity, low volume, and low fees. Addition of this collateral to the Maker Protocol is an experiment to determine the DAO’s ability to bootstrap Dai liquidity through enabling credit.
This Oracle utilizes the existing BTC/USD Oracle Medianizer for the BTC component of the Oracle and a DSValue with a static $1 price for the Dai component. This protects against flash-loan attacks which attempt to manipulate the reserve ratios of the pool.
The Oracle Domain Team nonetheless recommends that the initial debt ceiling be limited to 3M Dai. This is a precautionary measure to limit the Maker Protocol’s exposure to the Uniswap V2 LP Oracle smart contract until audits have completed successfully.