Price Oracles

Overview description of how price oracles are used with in the Teller protocol

When making a request to the ChainLink oracle to fetch the price of a token pair, it returns a price that is scaled to a predefined number of decimals within the oracle contract. Because each token has their own number of decimals, the resulting price sometimes needs to be converted to be represented in the token that is used as collateral. The math for doing so will be outline in the next section.

Price Conversion

Prices in Teller are represented as 1 WHOLE lending token in collateral UNITS. Lets use an example to help clarify whats happening. Say we want the price for LINK (lending token) in USDC (collateral token).

Let:

  • x be the actual price in decimals of 1 LINK in USDC

  • y be the price returned from the oracle

  • R be the number of decimals within the oracle

  • C be the number of decimals for the collateral token

This formula is defined within the ChainlinkPairAggregator._normalizeResponse() function here.

Inverse Price Conversion

ChainLink does not have some price oracles, which means sometimes we have to get the price of 1 WHOLE collateral token in lending UNITS and then invert the price as prices should still be represented as 1 WHOLE lending token in collateral UNITS.

This formula is defined within the InverseChainlinkPairAggregator._inverseValue() function here.

Last updated