mcpField
P
pyth-price-feeds

pyth-price-feeds

github.com/hedera-dev開発28464 回インストール8 週間前に更新
リポジトリ

pyth-price-feeds について

pyth-price-feedsは、Pyth価格Feedを使うHederaスマートコントラクト開発者向けの実装・レビューガイドです。Hermesの更新データ送信、経過時間を制限した価格取得、信頼度と指数の検証を説明します。

主な機能

  1. 01Hermes経由で価格更新データを送信
  2. 02価格取得前の更新手数料支払い
  3. 03最大経過時間を指定した価格取得
  4. 04価格と信頼度の検証
  5. 05符号付き指数による値の正規化

活用シーン

  1. 01HederaコントラクトでのPyth価格更新
  2. 02鮮度条件を満たす価格の取得
  3. 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 IDbytes32 フィード 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 ネットワーク)である

参考資料

コメント