Odczytywanie cen
Znajdź adres kontraktu PriceFeed, połącz się za pomocą interfejsu Chainlink i odczytaj aktualną cenę z właściwą walidacją.
Krok 1: Znajdź adres oracle
Trzy sposoby na znalezienie adresu kontraktu PriceFeed dla danej pary:
Price Oracle Tracker (najłatwiejszy podczas developmentu): price-oracle-tracker.vercel.app (pokazuje wszystkie wdrożone pary, ceny na żywo, decimals, heartbeat i adresy).
On-chain przez OracleFactory: wywołaj
pairToOracle(string pair). Symbole par muszą być przekazane wielkimi literami (np."PSG/USDT"): fabryka nie normalizuje danych wejściowych przy odczycie.Zbiorowo on-chain przez OracleFactoryReader: wywołaj
getActiveOracles(), aby pobrać wszystkie aktywne pary i ich adresy jednym wywołaniem.
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);
}Krok 2: Połącz się za pomocą interfejsu
Kontrakt PriceFeed implementuje standardowy Chainlink IAggregatorV3Interface, plus rozszerzenia specyficzne dla Chiliz dotyczące stanu zdrowia i statusu pauzy.
Krok 3: Odczytaj cenę
Feed nie revertuje przy nieaktualnym lub wstrzymanym stanie: jest to celowe. latestRoundData() revertuje z NoDataAvailable(), jeśli jeszcze nie istnieją żadne rundy, ale nie sprawdza, czy feed jest wstrzymany lub nieaktualny. Odpowiada to projektowi Chainlink AggregatorV3Interface: konsumenci są odpowiedzialni za sprawdzenie paused() i getHealthStatus() przed skonsumowaniem ceny. Uwaga: skalarne funkcje pomocnicze (latestAnswer(), latestTimestamp(), getAnswer(), getTimestamp()) zwracają 0 zamiast revertować, gdy nie ma danych. Zobacz Najlepsze praktyki po pełny wzorzec walidacji.
Podstawową funkcją jest latestRoundData(), która zwraca aktualną cenę wraz z metadanymi rundy i znacznikiem czasu.
Jeśli Twój protokół używa natywnych dziesiętnych feedu zamiast normalizacji do 18:
Dane historyczne
Oracle przechowuje wszystkie historyczne dane rund on-chain. Każda aktualizacja ceny tworzy nową rundę z rosnącym roundId.
Dodatkowe funkcje pomocnicze widoku udostępniane przez feed Chiliz:
latestAnswer()
Ostatnia cena lub 0, jeśli brak danych
latestTimestamp()
Ostatni updatedAt lub 0, jeśli brak danych
latestRound()
Aktualny identyfikator rundy
getAnswer(uint80 roundId)
Cena dla konkretnej rundy lub 0
getTimestamp(uint80 roundId)
Znacznik czasu dla konkretnej rundy lub 0
getRoundsData(uint80[] roundIds)
Zbiorcza tablica RoundData
roundExists(uint80 roundId)
true, jeśli updatedAt > 0
Zdarzenia
Każdy kontrakt PriceFeed emituje:
AnswerUpdated(int256 indexed current, uint80 indexed roundId, uint256 updatedAt): emitowane przy każdej aktualizacji ceny. Filtruj według ceny lub rundy.NewRound(uint80 indexed roundId, address indexed startedBy, uint256 startedAt): emitowane po rozpoczęciu nowej rundy. Filtruj według rundy lub adresu, który ją rozpoczął.
Funkcje odkrywania (OracleFactoryReader)
getActiveOracles()
Zwraca wszystkie aktywne pary z ich adresami oracle
getAllOracles()
Zwraca wszystkie oracle, łącznie z nieaktywnymi
getOraclesByPairs(string[] pairs)
Rozwiązuje wiele nazw par na adresy oracle jednym wywołaniem
getOracleHealthStatus(address oracle)
Stan zdrowia dla pojedynczego oracle
getAllOracleHealthStatus()
Stan zdrowia każdego oracle w systemie
Ostatnia aktualizacja
Czy to było pomocne?