Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CurveEMAOracleUnderlying

Git Source

Inherits: BaseAdapter

Title: CurveEMAOracleUnderlying

Author: Euler Labs (https://www.eulerlabs.com/)

Adapter utilizing the EMA price oracle in Curve pools.

Note: security-contact: security@euler.xyz

State Variables

name

Get the name of the oracle.

string public constant name = "CurveEMAOracleUnderlying"

pool

The address of the Curve pool.

address public immutable pool

base

The address of the base asset.

address public immutable base

quote

The address of the quote asset, must be pool.coins[0].

address public immutable quote

priceOracleIndex

The index in price_oracle corresponding to the base asset.

Note that indices in price_oracle are shifted by 1, i.e. 0 corresponds to coins[1].

uint256 public immutable priceOracleIndex

_scale

The scale factors used for decimal conversions.

Scale internal immutable _scale

Functions

constructor

Deploy a CurveEMAOracleUnderlying for a Curve pool.

IMPORTANT: The isBaseUnderlying and isQuoteUnderlying flags must match the pool's actual asset types. For example, in the sUSDE/sfrxUSD pool (0x3bd1017929b43c1414be2aca39892590fba4d6e2), both tokens are ERC4626-compatible, and the pool returns USDE/frxUSD prices. Curve pools with ERC4626-compatible tokens (like sUSDE/sfrxUSD) internally handle underlying asset conversions. The price_oracle() function returns the price in terms of the underlying assets (e.g., USDE/frxUSD). This behavior is pool-specific and depends on the pool's initialization parameters. WARNING: Incorrect configuration of isBaseUnderlying and isQuoteUnderlying will result in incorrect price calculations. Always verify the pool's asset types off-chain before deployment. WARNING: Some StableSwap-NG pools deployed before Dec-12-2023 have a known oracle vulnerability. See (https://docs.curve.fi/stableswap-exchange/stableswap-ng/pools/oracles/#price-oracles) for more details. Additionally, verify that the pool has enough liquidity before deploying this adapter.

constructor(
    address _pool,
    address _base,
    address _quote,
    uint256 _priceOracleIndex,
    bool isBaseUnderlying,
    bool isQuoteUnderlying
)
    payable;

Parameters

NameTypeDescription
_pooladdressThe address of the Curve pool.
_baseaddressThe address of the base asset.
_quoteaddressThe address of the quote asset, must match pool.coins[0].
_priceOracleIndexuint256The index in price_oracle corresponding to the base asset. If type(uint256).max, then the adapter will call the non-indexed price method price_oracle().
isBaseUnderlyingboolWhether the price oracle returns the price of the base asset in the underlying asset.
isQuoteUnderlyingboolWhether the price oracle returns the price of the quote asset in the underlying asset.

_getQuote

Get a quote by calling the Curve oracle.

function _getQuote(uint256 inAmount, address _base, address _quote) internal view override returns (uint256);

Parameters

NameTypeDescription
inAmountuint256The amount of base to convert.
_baseaddressThe token that is being priced.
_quoteaddressThe token that is the unit of account.

Returns

NameTypeDescription
<none>uint256The converted amount using the Curve EMA oracle.

Errors

BaseAssetMismatch

error BaseAssetMismatch();

QuoteAssetMismatch

error QuoteAssetMismatch();