Интеграция с Pyth Network (оракулы)
Pyth Network — альтернатива Chainlink с принципиально иной моделью: first-party data sources. Цены поставляют напрямую финансовые институты — Jane Street, Jump Trading, Cboe. Данные обновляются sub-second (400ms latency). Pyth доминирует в Solana и активно растёт в EVM экосистеме через cross-chain infrastructure.
Pull vs Push oracle модель
Chainlink (Push): операторы периодически обновляют цену на-chain. Цена всегда доступна в смарт-контракте. Обновления происходят по time-based или deviation-based triggers. Газ платит протокол Chainlink.
Pyth (Pull): цены обновляются off-chain постоянно. Для использования on-chain — пользователь включает price update в свою транзакцию. Газ платит конечный пользователь. Это даёт sub-second свежесть без постоянных on-chain транзакций.
EVM интеграция
Установка
npm install @pythnetwork/pyth-sdk-solidity
npm install @pythnetwork/pyth-evm-js
Смарт-контракт
import "@pythnetwork/pyth-sdk-solidity/IPyth.sol";
import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol";
contract PythConsumer {
IPyth pyth;
bytes32 constant ETH_USD_PRICE_ID =
0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace;
constructor(address pythAddress) {
pyth = IPyth(pythAddress);
}
// updateData передаётся от пользователя (получен с Pyth Hermes API)
function doSomethingWithPrice(bytes[] calldata updateData) external payable {
// Обновить цену (пользователь оплачивает fee)
uint fee = pyth.getUpdateFee(updateData);
pyth.updatePriceFeeds{value: fee}(updateData);
// Получить обновлённую цену
PythStructs.Price memory price = pyth.getPriceNoOlderThan(
ETH_USD_PRICE_ID,
60 // max age in seconds
);
// price.price — int64 (может быть отрицательным, но реально нет для цен)
// price.expo — степень 10 (обычно -8, значит делить на 10^8)
// price.conf — доверительный интервал
int256 ethPrice = price.price * int256(10 ** (18 + price.expo));
}
}
Frontend: получение updateData
import { PriceServiceConnection } from "@pythnetwork/pyth-evm-js";
const connection = new PriceServiceConnection("https://hermes.pyth.network");
const ETH_USD_PRICE_ID = "0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace";
// Получить последнее обновление цены для включения в транзакцию
const priceUpdateData = await connection.getLatestVaas([ETH_USD_PRICE_ID]);
// Передать в контракт вместе с транзакцией
await contract.doSomethingWithPrice(priceUpdateData, {
value: updateFee
});
Confidence interval
Уникальная особенность Pyth — каждая цена включает confidence interval (conf). Это стандартное отклонение цены по источникам.
PythStructs.Price memory price = pyth.getPriceNoOlderThan(priceId, 60);
// Если confidence слишком высокий — цена ненадёжна
// Например, если conf > 1% от цены — отказать
require(
price.conf * 100 < uint64(price.price),
"Price confidence too wide"
);
Это позволяет протоколу защититься от периодов низкой уверенности в цене (market disruptions).
Solana интеграция
use pyth_sdk_solana::load_price_feed_from_account_info;
pub fn get_price(price_account: &AccountInfo) -> Result<i64> {
let price_feed = load_price_feed_from_account_info(price_account)?;
let current_price = price_feed
.get_price_no_older_than(clock.unix_timestamp, 60)?;
Ok(current_price.price)
}
Pyth особенно хорош для протоколов требующих high-frequency price updates (perp DEX, lending с liquidations в волатильных условиях).







