For the complete documentation index, see llms.txt. This page is also available as Markdown.

Lendo preços

Encontre o endereço de um contrato PriceFeed, conecte-se usando a interface Chainlink e leia o preço atual com validação adequada.

Passo 1: Encontrar o Endereço do Oracle

Três maneiras de encontrar o endereço de um contrato PriceFeed para um determinado par:

  • Price Oracle Tracker (mais fácil durante o desenvolvimento): price-oracle-tracker.vercel.app — exibe todos os pares implantados, preços ao vivo, decimais, heartbeat e endereços.

  • On-chain via OracleFactory: chame pairToOracle(string pair). Os símbolos dos pares devem ser passados em maiúsculas (ex.: "PSG/USDT") — a factory não normaliza a entrada nas leituras.

  • Em lote on-chain via OracleFactoryReader: chame getActiveOracles() para recuperar todos os pares ativos e seus endereços em uma única chamada.

interface IOracleFactory {
    function pairToOracle(string memory pair) external view returns (address);
    function getOracleCount() external view returns (uint256);
}

function resolveFeed(address factory, string memory pair)
    external view returns (address)
{
    // Pair symbol must be passed in uppercase (e.g. "PSG/USDT").
    return IOracleFactory(factory).pairToOracle(pair);
}

Passo 2: Conectar Usando a Interface

O contrato PriceFeed implementa a IAggregatorV3Interface padrão do Chainlink, além de extensões específicas da Chiliz para status de saúde e pausa.

Passo 3: Ler o Preço

A função principal é latestRoundData(), que retorna o preço atual junto com metadados de round e timestamp.

Se o seu protocolo utilizar os decimais nativos do feed em vez de normalizar para 18:

Dados Históricos

O oracle armazena todos os dados históricos de rounds on-chain. Cada atualização de preço cria um novo round com um roundId incremental.

Views auxiliares adicionais expostas pelo feed da Chiliz:

Função
Retorna

latestAnswer()

Preço mais recente, ou 0 se nenhum

latestTimestamp()

updatedAt mais recente, ou 0 se nenhum

latestRound()

ID do round atual

getAnswer(uint80 roundId)

Preço de um round específico, ou 0

getTimestamp(uint80 roundId)

Timestamp de um round específico, ou 0

getRoundsData(uint80[] roundIds)

Array de RoundData em lote

roundExists(uint80 roundId)

true se updatedAt > 0

Eventos

Cada contrato PriceFeed emite:

  • AnswerUpdated(int256 indexed current, uint80 indexed roundId, uint256 updatedAt): emitido a cada atualização de preço. Filtre por preço ou round.

  • NewRound(uint80 indexed roundId, address indexed startedBy, uint256 startedAt): emitido quando um novo round começa. Filtre por round ou pelo endereço que o iniciou.

Funções de Descoberta (OracleFactoryReader)

Função
Descrição

getActiveOracles()

Retorna todos os pares ativos com seus endereços de oracle

getAllOracles()

Retorna todos os oracles, incluindo os inativos

getOraclesByPairs(string[] pairs)

Resolve múltiplos nomes de pares para endereços de oracle em uma única chamada

getOracleHealthStatus(address oracle)

Status de saúde de um único oracle

getAllOracleHealthStatus()

Status de saúde de todos os oracles no sistema

Atualizado

Isto foi útil?