CurveEMAOracleUnderlying

Git Source

Inherits: BaseAdapter

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();