Metapool Factory: Oracles
Factory contracts include Time-Weighted Average Price oracles. To understand these a bit better, you need to understand how Curve calculates price.
A curve pool is an array of balances of the tokens it holds. To provide a price, it calculates how much of x you can receive given amount y.
Time-Weighted Average Price oracles
- MetaPool.get_price_cumulative_last() uint256[N_COINS]:
Returns the current time-weighted average price (TWAP). This will represent the underlying balances of the pool.
The value returned is the cumulative pool shifting balances over time
- MetaPool.block_timestamp_last() uint256:
Returns the last timestamp that a TWAP reading was taken in unix time.
- MetaPool.get_twap_balances(_first_balances: uint256[N_COINS], _last_balances: uint256[N_COINS], _time_elapsed: uint256) uint256[N_COINS]:
Calculate the current effective TWAP balances given two snapshots over time, and the time elapsed between the two snapshots.
_first_balances: Firstprice_cumulative_lastarray that was snapshot viaget_price_cumulative_last_last_balances: Secondprice_cumulative_lastarray that was snapshot viaget_price_cumulative_last_time_elapsed: The elapsed time in seconds between_first_balancesand_last_balances
Returns the
balancesof the TWAP value.
- MetaPool.get_dy(i: int128, j: int128, dx: uint256, _balances: uint256[N_COINS] = [0, 0]) uint256:
Calculate the price for exchanging a token with index
ito token with indexjand amountdxgiven the_balancesprovided.i: The index of the coin being sent to the pool, as it related to the metapoolj: The index of the coin being received from the pool, as it relates to the metapooldx: The amount ofibeing sent to the pool_balances: The array of balances to be used for purposes of calculating the output amount / exchange rate, this is the value returned inget_twap_balances
Returns the quote / price as
dygivendx.
Security
The Curve TWAP is greatly inspired by Uniswap TWAP architecture, in that the price is a cumulative value over time, which reduces balance shifts due to flash loans, but also records the balances based on the previous block, to avoid recording flashloan data.