> For the complete documentation index, see [llms.txt](https://docs.chiliz.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chiliz.com/pt-br/desenvolver/avancado/feeds-de-preco-on-chain/melhores-praticas.md).

# Melhores práticas

Padrões de validação, API de status de saúde, verificações de desatualização e um checklist de integração para consumir feeds de preço da Chiliz Chain com segurança.

## Sempre Valide Antes de Usar um Preço

`latestRoundData()` reverte com `NoDataAvailable()` se não existirem rounds, mas não impõe verificações de desatualização ou pausa: retorna os valores armazenados como estão. Antes de consumir qualquer valor de preço, sempre realize estas três verificações:

1. **Verificação de pausa**: chame `paused()` e rejeite se o feed estiver pausado.
2. **Resposta positiva**: exija que `answer > 0`.
3. **Verificação de desatualização**: condicione à `getHealthStatus().isHealthy`.

O exemplo `getSafePrice()` em [Lendo Preços](/pt-br/desenvolver/avancado/feeds-de-preco-on-chain/lendo-precos.md) implementa todas as três.

## API de Status de Saúde

Cada `PriceFeed` expõe uma view `getHealthStatus()` que agrega informações de atualidade em uma única chamada:

```solidity
function getHealthStatus()
    external view
    returns (
        uint256 lastUpdateTimestamp,
        uint256 totalRounds,
        uint256 timeSinceLastUpdate,
        bool isHealthy
    );
```

| Campo                 | Descrição                                                                          |
| --------------------- | ---------------------------------------------------------------------------------- |
| `lastUpdateTimestamp` | `updatedAt` do round mais recente                                                  |
| `totalRounds`         | Número total de rounds gravados                                                    |
| `timeSinceLastUpdate` | `block.timestamp - lastUpdateTimestamp` (ou `block.timestamp` se não houver dados) |
| `isHealthy`           | `true` se `timeSinceLastUpdate <= updateInterval × healthFactor`                   |

O health factor é inicializado em `2` por padrão, mas é configurável por feed pelo administrador do oracle via `setHealthFactor()`. Não fixe `2` no código. Leia diretamente do contrato:

```solidity
uint80 factor = priceFeed.healthFactor(); // per-feed; do NOT assume the default of 2 (live feeds use 720)
```

A janela de saúde é `updateInterval × healthFactor`, ambos configurados por feed: `updateInterval` é um espaçamento mínimo on-chain pequeno, não o heartbeat. Ele varia por feed: CHZ/USDC usa `5s × 720 = janela de 1 hora`, PEPPER/CHZ usa `10s × 720 = janela de 2 horas`, enquanto o pipeline off-chain envia em um heartbeat de \~1 hora. Nunca use `updateInterval` isoladamente como base para desatualização: condicione à `isHealthy`: veja `getSafePrice()` em [Lendo Preços](/pt-br/desenvolver/avancado/feeds-de-preco-on-chain/lendo-precos.md) para o padrão completo.

Use `getAllOracleHealthStatus()` no `OracleFactoryReader` para monitorar todos os feeds do sistema de uma vez: útil para dashboards off-chain e alertas.

## Faça Cache de `decimals()`

Cada par tem sua própria precisão decimal: sempre chame `decimals()` para confirmar antes de interpretar um valor de preço. Os decimais são definidos na implantação e nunca mudam, portanto, leia-os uma vez na inicialização do contrato em vez de a cada leitura de preço:

```solidity
uint8 public immutable feedDecimals;

constructor(address _feed) {
    priceFeed = IChilizPriceFeed(_feed);
    feedDecimals = priceFeed.decimals();
}
```

## Trate o Estado de Pausa com Elegância

Em uma emergência, o administrador do oracle pode pausar um feed. Trate o revert resultante de forma limpa em vez de consumir silenciosamente um valor incorreto:

```solidity
require(!priceFeed.paused(), "Feed paused");
```

## Use o Tracker Durante o Desenvolvimento

O [Price Oracle Tracker](https://price-oracle-tracker.vercel.app/?network=mainnet) permite comparar preços on-chain com o CoinMarketCap e o CoinGecko em tempo real, facilitando a validação da precisão do feed durante a integração. Ele também exibe o status de saúde ao vivo, parâmetros de heartbeat e endereços individuais dos contratos para todos os pares.

## Checklist de Integração

* [ ] Obtenha o endereço do `PriceFeed` via tracker, `pairToOracle()` ou `getActiveOracles()`
* [ ] Confirme a descrição e os decimais do par usando `description()` e `decimals()`
* [ ] Faça cache de `decimals()` na inicialização do contrato
* [ ] Leia os preços via `latestRoundData()` (reverte com `NoDataAvailable()` se ainda não existirem rounds)
* [ ] Verifique `paused()` antes de consumir um preço
* [ ] Valide `answer > 0`
* [ ] Condicione à `getHealthStatus().isHealthy` para desatualização (não derive seu próprio limite apenas de `updateInterval`)
* [ ] Normalize o preço para a precisão interna do seu protocolo (ex.: 18 decimais) se necessário
* [ ] Teste no Spicy Testnet antes de implantar no Mainnet


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.chiliz.com/pt-br/desenvolver/avancado/feeds-de-preco-on-chain/melhores-praticas.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
