pyth-price-feeds — Claude Code skill: Pyth on Hedera
A skill for wiring Pyth pull price feeds into Hedera contracts: Hermes payload updates, max-age reads, and confidence checks.
npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a claude-codeWhat pyth-price-feeds does
Pyth on Hedera is a pull feed, not a push one. A fresh read usually means submitting a Hermes payload on-chain with payment first, then calling getPriceNoOlderThan. The skill walks the agent through that order and reminds it to cover the fee returned by getUpdateFee(updateData).
It ships reference files references/hedera-feeds.md and references/examples.md with update, read and expo sketches, plus a review checklist. The post-read checks are spelled out too: publishTime != 0, price > 0, and a revert when conf is wider than the price itself.
The trap is sourcing. Contract address and price IDs come from the Pyth Hedera docs, not Ethereum defaults, and the chain ID is 296 on testnet or 295 on mainnet. expo is signed and is not the same as ERC-20 decimals, so it has to be normalized to the consumer scale.
What it helps with
- refresh a Pyth price on Hedera before a fresh read
- compute the fee with
getUpdateFeeand attach it inmsg.value - read a feed with a max-age bound instead of
getPriceUnsafe - reject a price when confidence is wider than the price
- normalize a signed
expoto 18 decimals
Example prompts for the agent
- Help me update a Pyth feed on Hedera: pull
updateDatafrom Hermes and submitupdatePriceFeedswith enoughmsg.value. - Review my contract: read via
getPriceNoOlderThan, checkconf, and normalizeexpoto 18 decimals. - Build a review checklist for a Pyth integration on Hedera testnet 296.
How to install pyth-price-feeds
1Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a claude-code2Manually: put the files in place
~/.claude/skills/pyth-price-feeds/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/pyth-price-feeds/
1Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a codex2Manually: put the files in place
.agents/skills/pyth-price-feeds/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a cursor2Manually: put the files in place
.cursor/skills/pyth-price-feeds/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install hedera-dev/hedera-skills pyth-price-feeds2Manually: put the files in place
.github/skills/pyth-price-feeds/SKILL.md1Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a gemini-cli2Platform CLI
gemini skills install https://github.com/hedera-dev/hedera-skills --path plugins/oracles/skills/pyth-price-feedsManually: put the files in place
.devin/skills/pyth-price-feeds/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about pyth-price-feeds
How do I install pyth-price-feeds in Claude?
Run npx skills add hedera-dev/hedera-skills --skill pyth-price-feeds -a claude-code. The skill lands at ~/.claude/skills/pyth-price-feeds/SKILL.md.
What does pyth-price-feeds do?
It guides the agent through Pyth pull feeds on Hedera: submitting Hermes payloads, paying updatePriceFeeds, reading with getPriceNoOlderThan, and checking confidence.
What should I watch out for with Pyth on Hedera?
Take the contract address and price IDs from the Pyth Hedera docs rather than Ethereum defaults. On Hedera msg.value is tinybars, and it has to cover the Pyth fee.
Source text
SKILL.md · Apache-2.0
---
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`.
```text
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](references/hedera-feeds.md) for where to source the Pyth contract and price IDs. See [references/examples.md](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:
```solidity
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 |
```solidity
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
- [references/examples.md](references/examples.md) — update, read, and expo sketches
- [references/hedera-feeds.md](references/hedera-feeds.md) — where to source Pyth contract and price IDs
- [Pyth Price Feeds](https://docs.pyth.network/price-feeds)
- [Pyth EVM contract addresses](https://docs.pyth.network/price-feeds/core/contract-addresses/evm)
- [Hermes price feeds](https://hermes.pyth.network/v2/price_feeds)
© hedera-dev · Apache-2.0 · hedera-dev/hedera-skills