Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/saucepoint/median-oracles

Experimental variations for a Median Price Oracle with Uni v4
https://github.com/saucepoint/median-oracles

Last synced: about 2 months ago
JSON representation

Experimental variations for a Median Price Oracle with Uni v4

Awesome Lists containing this project

README

        

# median-oracles
### **An experimental suite of Median Price Oracles**

> *from ETHGlobal Paris 2023, built with Uniswap v4 Hooks πŸ¦„*

Why not use TWAP? lower-liquidity pools are prone to manipulation!

---

| Algorithm | Gas (Read) |
|---------------------------|---------------------------------------- |
| Quickselect | comically a lot (hundreds of thousands) |
| Frugal-2U | comically a lot (but less than QS) |
| Running Frugal-2U | 4812 |
| Quickselect Time-weighted | TBD |
| Frugal-2U Time-weighted | TBD |

> Methodology: obtain 50 *unique* tick observations by running swaps in both directions. Each swap is spaced 12 seconds apart. Use `gasleft()` before and after reading the median

## Median Price Oracle (Quickselect)

The classic: given a sequence of unordered ticks, fetch the median with the quickselect algorithm

* Uses an O(logn) algorithm on-read
* Depends on tick observations written to storage

## Frugal Median Price Oracle

Approximates the median using `Frugal-2U` from a sequence of numbers (naive implementation)

Frugal median algorithm compares new numbers against the current approximation and updates the approximation according to a dynamic *step*

* Uses the frugal median-approximation algorithm
* Depends on tick observations written to storage

## Running Frugal Median Price Oracle

The gas-optimized implementation of the frugal median approximation: calculating an on-going approximation of the median

* Uses the frugal median-approxiation algorithm
* Stores the *running* median (approximated) in direct storage
* *additional researchℒ️ required for windowed support*

### Future work: step-optimization
In the frugal median algorithm, the dynamic *step* can be modified to favor stabilization or responsiveness/accuracy. The repo uses 1-tick as a step, but the implementation is set up for additional experimentation

### Future work: time-weighted medians

The repo is in its early stages and did not have sufficient time to implement time-weighted medians. Time-weighted medians are likely to better represent the price since they account for the duration of a tick (price observation). The repo currently treats unique price observations as having equivalent durations.

---

```
src/
β”œβ”€β”€ RunningFrugalMedianHook.sol Running median approximation
β”œβ”€β”€ TickObserver.sol store tick observations for windowed median reads
β”œβ”€β”€ lens
β”‚Β Β  β”œβ”€β”€ FrugalMedianLens.sol read TickObserver and approximate median
β”‚Β Β  └── MedianLens.sol read TickObserver and calculate true median
└── lib
β”œβ”€β”€ FrugalMedianLibrary.sol median approximation library
β”œβ”€β”€ MedianLibrary.sol median calculation library (quickselect)
└── RingBufferLibrary.sol optimized ring buffer for price observations

test/
β”œβ”€β”€ FrugalMedianLens.t.sol test the naive frugal median
β”œβ”€β”€ MedianLens.t.sol test the true median (quickselect)
β”œβ”€β”€ RunningMedian.t.sol test the running median approximation
β”œβ”€β”€ TickObserver.t.sol test the tick observer
β”œβ”€β”€ implementation
β”‚Β Β  β”œβ”€β”€ ... Uniswap overrides for testing
β”œβ”€β”€ median
β”‚Β Β  β”œβ”€β”€ FrugalMedianTest.t.sol test frugal median algo
β”‚Β Β  └── MedianLibrary.t.sol test quickselect algo
└── utils
β”œβ”€β”€ HookTest.sol
└── RingBuffer.t.sol test ring buffer
```

---

Additional resources:

[v4-periphery](https://github.com/uniswap/v4-periphery) contains advanced hook implementations that serve as a great reference

[v4-core](https://github.com/uniswap/v4-core)

---

*requires [foundry](https://book.getfoundry.sh)*

```
forge install
forge test
```

---

Credits

* [Frugal Streaming for Estimating Quantiles:One (or two)
memory suffices](https://arxiv.org/pdf/1407.1121v1.pdf)

* [euler-xyz/median-oracle](https://github.com/euler-xyz/median-oracle) and [median oracle discussions](https://ethresear.ch/t/median-prices-as-alternative-to-twap-an-optimised-proof-of-concept-analysis-and-simulation/12778)

* [Uniswap v3 TWAP Oracles in Proof of Stake](https://blog.uniswap.org/uniswap-v3-oracles)