pyth-price-feeds について
pyth-price-feedsは、Pyth価格Feedを使うHederaスマートコントラクト開発者向けの実装・レビューガイドです。Hermesの更新データ送信、経過時間を制限した価格取得、信頼度と指数の検証を説明します。
主な機能
- 01Hermes経由で価格更新データを送信
- 02価格取得前の更新手数料支払い
- 03最大経過時間を指定した価格取得
- 04価格と信頼度の検証
- 05符号付き指数による値の正規化
活用シーン
- 01HederaコントラクトでのPyth価格更新
- 02鮮度条件を満たす価格の取得
- 03信頼度と指数変換の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hedera-dev/ hedera-skills --skill pyth-price-feedsインストール後、Claude Code で/pyth-price-feedsを入力して読み込まれたか確認します。
同梱ファイルreferences/examples.mdreferences/hedera-feeds.md
詳細
Pyth Price Feeds(Hedera)
取得パターン: Pyth は、送信したら後は何もしなくてよいプッシュ型フィードではありません。最新の値を読み取るには通常、getPriceNoOlderThan を呼び出す前に、Hermes のペイロードをオンチェーンに送信する必要があります(支払いが必要です)。
Hermes → updatePriceFeeds{value: fee}(updateData) → getPriceNoOlderThan(priceId, maxAge)
利用側で Pyth をローカルインターフェースの背後にラップすることもできますが、これは任意です。プロジェクト固有のアダプター名を前提にしないでください。
クイックリファレンス
| 要素 | 役割 |
|---|---|
| Pyth コントラクト | ネットワークの IPyth アドレス |
| Price ID | bytes32 フィード ID(アグリゲーターのアドレスではありません) |
| 更新 | Hermes の updateData を使った、支払い可能な updatePriceFeeds |
| 手数料 | getUpdateFee(updateData) — msg.value は手数料をカバーする必要があります |
| 読み取り | getPriceNoOlderThan(priceId, maxAge) |
| 信頼度 | conf > uint64(price) の場合は拒否します |
| スケール | 符号付きの price と expo → 利用側の小数桁(通常は 18) |
Hedera のチェーン ID: testnet は 296、mainnet は 295 です。
Pyth のコントラクトと Price ID の参照元については、references/hedera-feeds.md を参照してください。更新、読み取り、expo の例については、references/examples.md を参照してください。
重要:最新の値を読み取る前に更新する
オンチェーンの価格が鮮度の上限を超えて古い場合は、Hermes の更新データを取得して送信してください。
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 の JSON-RPC では、msg.value は tinybar 単位です。Pyth の手数料を支払えるだけのネイティブトークンを添付してください。古い getPriceUnsafe を有効な取引価格として扱わないでください。
重要:信頼度と符号付きの expo
getPriceNoOlderThan の呼び出し後に、次の項目を確認してください。
| 確認項目 | 理由 |
|---|---|
publishTime != 0 | 不完全です |
price > 0 | 無効、または正の値ではありません |
conf > uint64(price) | 信頼度の幅が価格を超えています |
expo を正規化する | expo は符号付きで、ERC-20 の小数桁とは異なります |
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();
チェックリスト
Hedera で Pyth を実装またはレビューする際は、次の項目を確認してください。
- Pyth のコントラクトと Price ID は、Ethereum のデフォルト値ではなく、Pyth の Hedera/Hermes ドキュメントから取得している
- 最新の価格を利用する前に、十分な
msg.valueを添えて Hermes のペイロードを送信している - 読み取りには
getPriceNoOlderThan(または同等の最大経過時間 API)を使い、取引に上限のない安全性未確認の価格を使っていない - 信頼度が価格を超える場合はリバートする
- 符号付きの
expoを利用側のスケールに合わせて正規化している - チェーン ID が
295または296(あるいはプロジェクトで文書化されている Hedera ネットワーク)である
参考資料
- references/examples.md — 更新、読み取り、expo の例
- references/hedera-feeds.md — Pyth のコントラクトと Price ID の参照元
- Pyth Price Feeds
- Pyth EVM contract addresses
- Hermes price feeds