Lecture des prix
Trouvez l'adresse d'un contrat PriceFeed, connectez-vous via l'interface Chainlink et lisez le prix actuel avec une validation adéquate.
Étape 1 : Trouver l'adresse de l'oracle
Trois façons de trouver l'adresse d'un contrat PriceFeed pour une paire donnée :
Price Oracle Tracker (le plus simple pendant le développement) : price-oracle-tracker.vercel.app (affiche toutes les paires déployées, les prix en direct, les décimales, le heartbeat et les adresses).
On-chain via OracleFactory : appelez
pairToOracle(string pair). Les symboles de paire doivent être passés en majuscules (p. ex."PSG/USDT") : la factory ne normalise pas l'entrée en lecture.En masse on-chain via OracleFactoryReader : appelez
getActiveOracles()pour récupérer toutes les paires actives et leurs adresses en un seul appel.
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);
}Étape 2 : Se connecter via l'interface
Le contrat PriceFeed implémente la IAggregatorV3Interface standard de Chainlink, ainsi que des extensions spécifiques à Chiliz pour l'état de santé et le statut de pause.
Étape 3 : Lire le prix
La fonction principale est latestRoundData(), qui retourne le prix actuel avec les métadonnées de round et d'horodatage.
Si votre protocole utilise les décimales natives du flux plutôt que de normaliser à 18 :
Données historiques
L'oracle stocke toutes les données de rounds historiques on-chain. Chaque mise à jour de prix crée un nouveau round avec un roundId incrémental.
Vues d'aide supplémentaires exposées par le flux Chiliz :
latestAnswer()
Dernier prix, ou 0 si aucun
latestTimestamp()
Dernier updatedAt, ou 0 si aucun
latestRound()
ID du round actuel
getAnswer(uint80 roundId)
Prix pour un round spécifique, ou 0
getTimestamp(uint80 roundId)
Horodatage pour un round spécifique, ou 0
getRoundsData(uint80[] roundIds)
Tableau RoundData en masse
roundExists(uint80 roundId)
true si updatedAt > 0
Événements
Chaque contrat PriceFeed émet :
AnswerUpdated(int256 indexed current, uint80 indexed roundId, uint256 updatedAt): émis à chaque mise à jour de prix. Filtrez par prix ou par round.NewRound(uint80 indexed roundId, address indexed startedBy, uint256 startedAt): émis lors du démarrage d'un nouveau round. Filtrez par round ou par l'adresse qui l'a démarré.
Fonctions de découverte (OracleFactoryReader)
getActiveOracles()
Retourne toutes les paires actives avec leurs adresses d'oracle
getAllOracles()
Retourne tous les oracles, y compris les inactifs
getOraclesByPairs(string[] pairs)
Résout plusieurs noms de paires en adresses d'oracle en un seul appel
getOracleHealthStatus(address oracle)
État de santé d'un oracle unique
getAllOracleHealthStatus()
État de santé de chaque oracle dans le système
Mis à jour
Ce contenu vous a-t-il été utile ?