supra-push-oracle

Fetches live price feeds from Supra oracle on Hedera so developers can use real-time prices in apps.

Installation
Run `npx skills add "https://github.com/hedera-dev/hedera-skills" --skill "supra-push-oracle"` to install this skill, then follow its SKILL.md instructions for my next request.

Paste this into Claude Code, Cursor, or any agent that can run commands.

SKILL.mdShow the author's original SKILL.md
---
name: supra-push-oracle
description: >
  Supra S-Value push oracle on Hedera. Use when reading getSvalue price feeds on Hedera
  (testnet 296 / mainnet 295), mapping pair IDs, converting millisecond timestamps to unix
  seconds, or quoting USDT pairs where USD is unavailable.
---

# Supra Push Oracle (Hedera)

**Push S-Value pattern:** Supra updates an on-chain feed; readers call `getSvalue(pairId)` and must reject empty, zero, or stale quotes.

```text
Supra push oracle → getSvalue(pairId) → consumer
```

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

## Quick Reference

| Piece | Role |
| ----- | ---- |
| Push oracle | Immutable `ISupraSValueFeed` address for the network |
| Pair ID | Numeric Supra pair id (not an EVM aggregator address) |
| Read | `getSvalue(pairId)` → price, decimals, time |
| Time | Often **milliseconds** on Hedera — convert when `time > 1e10` |
| Quote asset | Hedera feeds are often **USDT**, not USD |
| Freshness | Compare unix **seconds** to a max staleness |

**Hedera chain IDs:** testnet `296`, mainnet `295`.

See [references/hedera-feeds.md](references/hedera-feeds.md) for where to source push-oracle addresses and pair IDs. See [references/examples.md](references/examples.md) for read sketches.

## Critical: Millisecond Timestamps

Supra `time` on Hedera is frequently milliseconds. Treat values `> 10_000_000_000` as ms and convert before staleness checks:

```solidity
uint256 updatedAt = pf.time > 10_000_000_000 ? pf.time / 1_000 : pf.time;
if (block.timestamp - updatedAt > maxStaleness) revert StalePrice(updatedAt, maxStaleness);
```

Comparing a millisecond timestamp to `block.timestamp` (seconds) will look “in the future” or skip staleness incorrectly.

## Critical: USDT Pairs On Hedera

Current Hedera Supra feeds often quote **USDT**, not USD. Pair keys / symbols must match the actual quote (`HBAR`/`USDT`, `BTC`/`USDT`). Do not label a USDT feed as USD.

## Completeness And Invalid Prices

Revert when:

| Condition | Why |
| --------- | --- |
| `pf.time == 0` | No successful update |
| `pf.price == 0` | Invalid price |
| Stale after converting to seconds | Older than `maxStaleness` |
| Unknown pair ID | Do not return zero |

Normalize `pf.price` with `pf.decimals` to the consumer scale (often 18).

## Checklist

When implementing or reviewing Supra reads on Hedera:

- [ ] Push-oracle address and pair IDs taken from Supra Hedera docs (not Ethereum)
- [ ] Timestamps converted to unix seconds when they look like milliseconds
- [ ] Pair symbols match the real quote asset (often USDT)
- [ ] Zero / missing updates revert
- [ ] Staleness bound is enforced in seconds
- [ ] Decimals normalized to the consumer scale

## References

- [references/examples.md](references/examples.md) — `getSvalue` and timestamp sketches
- [references/hedera-feeds.md](references/hedera-feeds.md) — where to source push-oracle addresses and pair IDs
- [Supra push oracle networks](https://docs.supra.com/oracles/data-feeds/push-oracle/networks)
- [Supra data feeds index](https://docs.supra.com/oracles/data-feeds/data-feeds-index)

Ships with 2 supporting files:

  • references/examples.md
  • references/hedera-feeds.md

Mirrored from the author's public source. Install counts from the open skills registry.

The systems behind these skills get built for partners every week.

Partner with us