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

    • where x=4.14x = 4.14

  • y be the price returned from the oracle

    • where y=x10Ry = x * 10 ^ {R}

  • R be the number of decimals within the oracle

  • C be the number of decimals for the collateral token

We want to take the formula for y and make it y=x10Cy = x * 10^{C}. To do this:

  • If C > R the calculation is y10CRy * 10^{C-R}

  • if R > C the calculation is y/10RCy / 10^{R-C}

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.

Because the oracle returns y=x10Ry = x * 10 ^ {R} this means x=y/10Rx = y / 10 ^ {R}.

This means 1 collateral token = y/10Ry / 10 ^ {R} lending tokens.

Therefore 1 lending token = 10R/y10 ^ {R} /y collateral tokens.

Therefore 1 lending token = (10R+10C)/y(10 ^ {R} + 10 ^ {C}) / y collateral units.

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

Last updated