## Preamble

```
MIP10c3-SP#: 24
Author(s): Niklas Kunkel (@NiklasKunkel)
Contributors:
Type: Process Component
Oracle Team Name: Green
Status: RFC
Date Proposed: 2020-02-03
Date Ratified: <yyyy-mm-dd>
```

## Specification

### Introduction

This Oracle would provide the UNI-V2-UNI-ETH/USD price as part of the collateral onboarding process for the UNI-V2-UNI-ETH 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:

(1) `Invariant k = reserve_x * reserve_y`

(2) `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.

(3) `reserve_x = sqrt(k * price_y / price_x)`

(4) `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.

(5) `reserve_x = k / reserve_y`

(6) `reserve_y = k / reserve_x`

Once the normalized reserve balances have been calculated the price of the LP token can be derived:

(7) `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:

(8) `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:

(9) price_lo = 2 * sqrt(k * price_x * price_y) / supply_lp

### Oracle Supporting Data Model(s)

**ETH/USD (canonical)**

```
| Source | Asset Pair | Feed Model |
| :------------ | :------------ | :----------: |
| Binance | ETH/USD | Median |
| Bitfinex | ETH/USDT | |
| Bitstamp | ETH/USD | |
| Coinbase | ETH/USD | |
| Gemini | ETH/USD | |
| Kraken | ETH/USD | |
```

**UNI/USD (canonical)**

```
| Source | Asset Pair | Feed Model |
| :----------- | :------------ | :---------: |
| Binance | UNI/BTC | Median |
| Coinbase | UNI/USD |
| FTX | UNI/USD |
| Huobi | UNI/USDT |
| OKEx | UNI/USDT |
| Uniswap | UNI/ETH |
```

### Oracle Address

- Mainnet - UniV2LpOracle - TBD

### Supported Tools

UniV2LpOracle - Source Code

UniV2LpOracle - Tests

### Remaining Work

- Deploy Oracle from Factory Contract
- Update
`MegaPoker`

to`poke`

UniV2LpOracle

### Summary

This proposal would create an Oracle for UNIV2-UNI-ETH/USD as part of the collateral onboarding process. Currently UNIV2-UNI-ETH is one of the most liquid trading pairs on Uniswap with over $268M of liquidity at the time of writing. The Oracle uses the existing ETH/USD and UNI/USD Oracle Medianizers utilized by the Maker Protocol to price the pair component tokens. The Oracle Domain Team is recommending to limit the debt ceiling to 3M at this time to limit Oracle risk. Audits for the LP Oracle contract are currently underway with ABDK. Upon successful completion of the audits, the community can begin to consider raising the debt ceiling.