360 Secure SkillHub
360 安全技能中心

pyth-price-feeds

面向开发者在 Hedera 测试网 296 或主网 295 上集成 Pyth 拉取式价格源,说明通过 Hermes 载荷调用 updatePriceFeeds、使用 getPriceNoOlderThan 读取、校验 publishTime、price、conf,并将带符号 expo 归一化到消费者精度。

hedera-dev
热度 0.00
最近更新 2026-10-18 23:42:49
分类:开发依赖:第三方 API应用场景:代码生成 / API 集成 / 代码审查

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add hedera-dev/hedera-skills/pyth-price-feeds
Metadata
name
pyth-price-feeds
description
Pyth pull price feeds on Hedera. Use when integrating Pyth on Hedera (testnet 296 / mainnet 295), fetching Hermes update payloads, paying updatePriceFeeds, calling getPriceNoOlderThan, checking confidence, or normalizing signed price + expo to 18 decimals.

Pyth Price Feeds (Hedera)

Pull pattern: Pyth is not a fire-and-forget push feed. Fresh reads usually need a Hermes payload submitted on-chain (payable) before getPriceNoOlderThan.

Hermes → updatePriceFeeds{value: fee}(updateData) → getPriceNoOlderThan(priceId, maxAge)

Consumers may wrap Pyth behind a local interface; that is optional. Do not assume a project-specific adapter name.

Quick Reference

Piece Role
Pyth contract Network IPyth address
Price ID bytes32 feed id (not an aggregator address)
Update Payable updatePriceFeeds with Hermes updateData
Fee getUpdateFee(updateData) — msg.value must cover it
Read getPriceNoOlderThan(priceId, maxAge)
Confidence Reject when conf > uint64(price)
Scale Signed price + expo → consumer decimals (often 18)

Hedera chain IDs: testnet 296, mainnet 295.

See references/hedera-feeds.md for where to source the Pyth contract and price IDs. See references/examples.md for update / read / expo sketches.

Critical: Update Before Fresh Reads

If the on-chain price is older than your staleness bound, fetch Hermes update data and submit it:

function updatePrice(bytes[] calldata updateData) external payable {
    uint256 fee = PYTH.getUpdateFee(updateData);
    if (msg.value < fee) revert UpdateFeeTooLow(msg.value, fee);
    PYTH.updatePriceFeeds{ value: msg.value }(updateData);
}

Hedera msg.value is tinybars via JSON-RPC — attach enough native value for the Pyth fee. Do not treat a stale getPriceUnsafe as a valid trading price.

Critical: Confidence And Signed Expo

After getPriceNoOlderThan:

Check Why
publishTime != 0 Incomplete
price > 0 Invalid / non-positive
conf > uint64(price) Confidence wider than the price
Normalize expo expo is signed; not the same as ERC-20 decimals
PythStructs.Price memory price = PYTH.getPriceNoOlderThan(priceId, maxStaleness);
if (price.publishTime == 0) revert IncompleteRound();
if (price.price <= 0) revert InvalidPrice();
if (price.conf > uint64(price.price)) revert InvalidConfidence();

Checklist

When implementing or reviewing Pyth on Hedera:

  • Pyth contract + price IDs taken from Pyth Hedera / Hermes docs (not Ethereum defaults)
  • Hermes payloads submitted with sufficient msg.value before relying on a fresh price
  • Reads use getPriceNoOlderThan (or equivalent max-age API), not unbounded unsafe prices for trading
  • Confidence wider than price reverts
  • Signed expo normalized to the consumer scale
  • Chain ID is 295 or 296 (or the project’s documented Hedera network)

References