Skip to content

ExchangeRates

Description

This contract stores the latest Synth exchange rates. These rates are set by an oracle, which updates this contract every three minutes with any prices that have moved sufficiently. Once set, these prices are available for any contract in the Synthetix system to query. Prices which have not been updated recently enough are considered stale; Synthetix functionality using stale prices does not operate. All rates are denominated in terms of sUSD, so the price of sUSD is always $1.00, and is never stale.

The ExchangeRates contract is also responsible for computing the prices of various derived synths. In particular, the behaviour of inverse synths is defined here. These are derivative synths whose price varies inversely with the price of an underlying asset.

This contract interacts with the oracle's frontrunning protection, which is partially described in SIP-6 and SIP-7.

This does not turn off any functionality in the exchange rate contract, but is used by Synthetix to disable currency exchanges while prices are being updated to protect against oracle front running. The lock is released when rate updates have completed.

Source: contracts/ExchangeRates.sol

Architecture

ExchangeRates architecture graph

Details
  • oracle: This address is not actually a contract, but it is the source of prices for this contract.
  • Aggregators: These are a collection of decentralized pricing networks that collect and aggregate results from a network of oracles.
  • PurgeableSynth: exchange rates are used to determine if the total token value is below the purge threshold.
  • Synthetix: the value of tokens is used to in order to facilitate exchange between them, and to ensure exchanges cannot occur while price updates and being made or if a particular exchange rate is stale.

Variables

CONTRACT_NAME

Source

Type: bytes32

aggregatorKeys

Source

A list of the keys of currencies with a decentralized aggregated pricing network.

Type: bytes32[]

aggregators

Source

For each currency with a decentralized aggregated pricing network, return the Aggregation contract address.

Type: mapping(bytes32 => contract AggregatorV2V3Interface)

currencyKeyDecimals

Source

Type: mapping(bytes32 => uint8)

Constructor

constructor

Source

Initialises the oracle address and initial currency prices, along with the inherited SelfDestructible instance.

Details

Signature

constructor(address _owner, address _resolver)

Visibility

public

State Mutability

``

Views

aggregatorWarningFlags

Source

Details

Signature

aggregatorWarningFlags() view returns (address)

Visibility

external

State Mutability

view

anyRateIsInvalid

Source

Details

Signature

anyRateIsInvalid(bytes32[] currencyKeys) view returns (bool)

Visibility

external

State Mutability

view

anyRateIsInvalidAtRound

Source

Details

Signature

anyRateIsInvalidAtRound(bytes32[] currencyKeys, uint256[] roundIds) view returns (bool)

Visibility

external

State Mutability

view

Requires

currenciesUsingAggregator

Source

Details

Signature

currenciesUsingAggregator(address aggregator) view returns (bytes32[] currencies)

Visibility

external

State Mutability

view

effectiveAtomicValueAndRates

Source

Details

Signature

effectiveAtomicValueAndRates(bytes32, uint256, bytes32) view returns (uint256 value, uint256 systemValue, uint256 systemSourceRate, uint256 systemDestinationRate)

Visibility

public

State Mutability

view

effectiveValue

Source

Given a quantity of a source currency, returns a quantity of a destination currency that is of equivalent value at current exchange rates, if those rates are fresh.

The effective value is computed as a simple ratio of the prices of the currencies concerned. That is, to convert a quantity Q_A of currency A to currency B at prices \pi_A and \pi_B, the quantity Q_B received is:

Q_B = Q_A \frac{\pi_A}{\pi_B}

This computation is simple because all fractional quantities in the Synthetix system except for the debt ledger are 18 decimal fixed point numbers.

Details

Signature

effectiveValue(bytes32 sourceCurrencyKey, uint256 sourceAmount, bytes32 destinationCurrencyKey) view returns (uint256 value)

Visibility

external

State Mutability

view

effectiveValueAndRates

Source

Details

Signature

effectiveValueAndRates(bytes32 sourceCurrencyKey, uint256 sourceAmount, bytes32 destinationCurrencyKey) view returns (uint256 value, uint256 sourceRate, uint256 destinationRate)

Visibility

external

State Mutability

view

effectiveValueAndRatesAtRound

Source

Details

Signature

effectiveValueAndRatesAtRound(bytes32 sourceCurrencyKey, uint256 sourceAmount, bytes32 destinationCurrencyKey, uint256 roundIdForSrc, uint256 roundIdForDest) view returns (uint256 value, uint256 sourceRate, uint256 destinationRate)

Visibility

external

State Mutability

view

getCurrentRoundId

Source

Details

Signature

getCurrentRoundId(bytes32 currencyKey) view returns (uint256)

Visibility

external

State Mutability

view

getLastRoundIdBeforeElapsedSecs

Source

Details

Signature

getLastRoundIdBeforeElapsedSecs(bytes32 currencyKey, uint256 startingRoundId, uint256 startingTimestamp, uint256 timediff) view returns (uint256)

Visibility

external

State Mutability

view

lastRateUpdateTimes

Source

Retrieves the timestamp the given rate was last updated. Accessed by the same keys as rates is.

Details

Signature

lastRateUpdateTimes(bytes32 currencyKey) view returns (uint256)

Visibility

external

State Mutability

view

lastRateUpdateTimesForCurrencies

Source

Maps lastRateUpdateTimes over an array of keys.

Details

Signature

lastRateUpdateTimesForCurrencies(bytes32[] currencyKeys) view returns (uint256[])

Visibility

external

State Mutability

view

rateAndInvalid

Source

Details

Signature

rateAndInvalid(bytes32 currencyKey) view returns (uint256 rate, bool isInvalid)

Visibility

public

State Mutability

view

rateAndTimestampAtRound

Source

Details

Signature

rateAndTimestampAtRound(bytes32 currencyKey, uint256 roundId) view returns (uint256 rate, uint256 time)

Visibility

external

State Mutability

view

rateAndUpdatedTime

Source

Details

Signature

rateAndUpdatedTime(bytes32 currencyKey) view returns (uint256 rate, uint256 time)

Visibility

external

State Mutability

view

rateForCurrency

Source

Returns the last recorded rate for the given currency. This is just an alias to the public mapping rates, so it could probably be eliminated.

Details

Signature

rateForCurrency(bytes32 currencyKey) view returns (uint256)

Visibility

external

State Mutability

view

rateIsFlagged

Source

Details

Signature

rateIsFlagged(bytes32 currencyKey) view returns (bool)

Visibility

external

State Mutability

view

rateIsInvalid

Source

Details

Signature

rateIsInvalid(bytes32 currencyKey) view returns (bool)

Visibility

external

State Mutability

view

rateIsStale

Source

The rate for a given currency is stale if its last update occurred more than rateStalePeriod seconds ago.

sUSD is a special case; since its rate is fixed at 1.0, it is never stale. The rates of nonexistent currencies are always stale.

Details

Signature

rateIsStale(bytes32 currencyKey) view returns (bool)

Visibility

external

State Mutability

view

rateStalePeriod

Source

The duration after which a rate will be considered out of date. Synth exchange and other price-sensitive transactions in the Synthetix contract will not operate if a relevant rate is stale. Initialised to 3 hours.

Type: uint256

Details

Signature

rateStalePeriod() view returns (uint256)

Visibility

external

State Mutability

view

ratesAndInvalidForCurrencies

Source

Details

Signature

ratesAndInvalidForCurrencies(bytes32[] currencyKeys) view returns (uint256[] rates, bool anyRateInvalid)

Visibility

external

State Mutability

view

ratesAndUpdatedTimeForCurrencyLastNRounds

Source

Details

Signature

ratesAndUpdatedTimeForCurrencyLastNRounds(bytes32 currencyKey, uint256 numRounds, uint256 roundId) view returns (uint256[] rates, uint256[] times)

Visibility

external

State Mutability

view

ratesForCurrencies

Source

Maps rateForCurrency over an array of keys.

Details

Signature

ratesForCurrencies(bytes32[] currencyKeys) view returns (uint256[])

Visibility

external

State Mutability

view

resolverAddressesRequired

Source

Details

Signature

resolverAddressesRequired() view returns (bytes32[] addresses)

Visibility

public

State Mutability

view

synthTooVolatileForAtomicExchange

Source

Details

Signature

synthTooVolatileForAtomicExchange(bytes32) view returns (bool)

Visibility

public

State Mutability

view

Restricted Functions

addAggregator

Source

Details

Signature

addAggregator(bytes32 currencyKey, address aggregatorAddress)

Visibility

external

State Mutability

``

Requires

Modifiers

Emits

removeAggregator

Source

Details

Signature

removeAggregator(bytes32 currencyKey)

Visibility

external

State Mutability

``

Requires

Modifiers

Internal Functions

_effectiveValueAndRates

Source

Details

Signature

_effectiveValueAndRates(bytes32 sourceCurrencyKey, uint256 sourceAmount, bytes32 destinationCurrencyKey) view returns (uint256 value, uint256 sourceRate, uint256 destinationRate)

Visibility

internal

State Mutability

view

_formatAggregatorAnswer

Source

Details

Signature

_formatAggregatorAnswer(bytes32 currencyKey, int256 rate) view returns (uint256)

Visibility

internal

State Mutability

view

Requires

_getCurrentRoundId

Source

Details

Signature

_getCurrentRoundId(bytes32 currencyKey) view returns (uint256)

Visibility

internal

State Mutability

view

_getRate

Source

Details

Signature

_getRate(bytes32 currencyKey) view returns (uint256)

Visibility

internal

State Mutability

view

_getRateAndTimestampAtRound

Source

Details

Signature

_getRateAndTimestampAtRound(bytes32 currencyKey, uint256 roundId) view returns (uint256 rate, uint256 time)

Visibility

internal

State Mutability

view

_getRateAndUpdatedTime

Source

Details

Signature

_getRateAndUpdatedTime(bytes32 currencyKey) view returns (struct IExchangeRates.RateAndUpdatedTime)

Visibility

internal

State Mutability

view

_getUpdatedTime

Source

Details

Signature

_getUpdatedTime(bytes32 currencyKey) view returns (uint256)

Visibility

internal

State Mutability

view

_notImplemented

Source

Details

Signature

_notImplemented() pure

Visibility

internal

State Mutability

pure

_rateIsCircuitBroken

Source

Details

Signature

_rateIsCircuitBroken(bytes32 currencyKey, uint256 curRate) view returns (bool)

Visibility

internal

State Mutability

view

_rateIsFlagged

Source

Details

Signature

_rateIsFlagged(bytes32 currencyKey, contract FlagsInterface flags) view returns (bool)

Visibility

internal

State Mutability

view

_rateIsStale

Source

Details

Signature

_rateIsStale(bytes32 currencyKey, uint256 _rateStalePeriod) view returns (bool)

Visibility

internal

State Mutability

view

_rateIsStaleWithTime

Source

Details

Signature

_rateIsStaleWithTime(uint256 _rateStalePeriod, uint256 _time) view returns (bool)

Visibility

internal

State Mutability

view

circuitBreaker

Source

Details

Signature

circuitBreaker() view returns (contract ICircuitBreaker)

Visibility

internal

State Mutability

view

getFlagsForRates

Source

Details

Signature

getFlagsForRates(bytes32[] currencyKeys) view returns (bool[] flagList)

Visibility

internal

State Mutability

view

removeFromArray

Source

Helper function that removes an entry from an existing array in storage. Returns true if found and removed, false otherwise.

Details

Signature

removeFromArray(bytes32 entry, bytes32[] array) returns (bool)

Visibility

internal

State Mutability

``

External Functions

rateWithSafetyChecks

Source

Details

Signature

rateWithSafetyChecks(bytes32 currencyKey) returns (uint256 rate, bool broken, bool staleOrInvalid)

Visibility

external

State Mutability

``

Requires

Events

AggregatorAdded

Source

Records that an Aggregator pricing network was added

Signature: AggregatorAdded(bytes32 currencyKey, address aggregator)

AggregatorRemoved

Source

Records that an Aggregator pricing network was removed

Signature: AggregatorRemoved(bytes32 currencyKey, address aggregator)