解析済みイベント
IDL を取得
命令のデコードに Parsed Events が使用するカタログから、任意のスロット時点で Solana プログラムに適用されていた IDL を取得します。
GET
/
v1
/
parsed-events
/
idl
/
{programId}
/
{slot}
IDL の取得
curl --request GET \
--url 'https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key='import requests
url = "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"name": "kamino_lending",
"version": "0.1.0",
"instructions": [
{
"name": "refreshObligation",
"accounts": [
{
"name": "lendingMarket",
"isMut": false,
"isSigner": false
},
{
"name": "obligation",
"isMut": true,
"isSigner": false
}
],
"args": []
}
],
"errors": [
{
"code": 6000,
"name": "InvalidMarketAuthority",
"msg": "Market authority is invalid"
}
]
}このページのパスパラメータ、レスポンススキーマ、例は、OpenAPI 定義から生成されています。
「IDL を取得」は、指定したスロット時点のプログラムの IDL、つまり
どちらの形式にも
その他のエラーは、
slot 以前に有効になった最新バージョンを返します。slot はバージョンと完全に一致する必要はないため、履歴上の任意の時点を指定できます。特定のバージョンを取得するには、IDL バージョン一覧にあるそのバージョンの slot を指定します。
IDL は、Parsed Events と Parsed Streams が命令のデコードに使用するものと同じカタログから取得されます。Orb エクスプローラーは、これらのエンドポイントを使用してプログラムの IDL を表示します。
ユースケース
- 適切なインターフェースで履歴をデコードします。 トランザクションのスロットを指定すると、その実行時に有効だった IDL を取得できます。プログラムの命令やアカウントは時間の経過とともに変わるため、現在の IDL では古いトランザクションを誤って解釈する可能性があります。
- フィルター用の正確な名前を確認します。 トランザクション履歴をスキャンの
match.programs[].instructionsは、IDL に記載されている命令名を受け付けます。 - インターフェースの変更を確認します。 2 つのバージョンを取得して
instructionsを比較すると、アップグレードで追加または削除された内容を確認できます。IDL バージョン一覧の例を参照してください。
IDL 形式
レスポンスは、保存されている IDL ドキュメントそのものです。カタログ内のプログラムは 2 種類の Anchor 形式のいずれかを使用しており、1 つのプログラムの各バージョンで両方の形式が使われる場合もあります。内容を読み取る前に、受け取った形式を確認してください。| 従来の Anchor(0.30 より前) | Anchor 0.30+ | |
|---|---|---|
| プログラム名とバージョン | トップレベルの name と version | metadata.name と metadata.version |
| プログラムアドレス | トップレベルの address なし | トップレベルの address |
| 命令ディスクリミネーター | 含まれません | instructions[].discriminator |
| 命令アカウントフラグ | isMut、isSigner | writable、signer |
instructions があります。ほとんどの IDL には accounts、types、errors もあり、多くの IDL には events もあります。
クレジット
各リクエストには 10 クレジットが必要で、すべてのプランで利用できます。クレジットを参照してください。エラー
| ステータス | 発生条件 |
|---|---|
400 | programId が有効な base58 アドレスではないか、slot が符号なし 64 ビット整数ではありません。 |
401 | API キーがないか、無効です。本文はプレーンテキストです:Unauthorized。 |
404 | カタログにそのプログラムの IDL がないか、slot 以前に有効だったバージョンがありません。 |
{"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"} などの error メッセージを含む JSON 本文を返します。
リクエストパラメータ
string
必須
base58 でエンコードされたプログラムアドレスです。
number
必須
検索するスロットです。バージョンの有効化スロットと一致する必要はありません。特定のバージョンを取得するには「IDL バージョン一覧」の
slot を指定し、トランザクションの実行時に有効だった IDL を取得するにはそのトランザクションのスロットを指定します。承認
パスパラメータ
base58 でエンコードされたプログラムアドレスです。
例:
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
検索するスロットです。バージョンの有効化スロットと一致する必要はありません。IDL バージョンの一覧表示で得られた slot を渡すとそのバージョンを取得でき、トランザクションのスロットを渡すと実行時に適用されていた IDL を取得できます。
必須範囲:
x >= 0例:
205509752
レスポンス
保存された形式のままの IDL ドキュメントです。従来の Anchor 形式と Anchor 0.30+ 形式の両方が存在するため、読み取る前にどちらを受け取ったか確認してください。
保存された形式のまま返される IDL ドキュメントです。次の 2 つの形式があります。
- 従来の Anchor(0.30 より前):トップレベルに
nameとversionがあります。命令アカウントではisMutとisSignerを使用します。 - Anchor 0.30+:トップレベルに
addressとmetadata(name、version、spec、description)があります。命令にはdiscriminatorが含まれ、命令アカウントではwritableとsignerを使用します。
どちらの形式にも instructions があります。ほとんどの IDL には accounts、types、errors もあり、多くには events があります。同じプログラムでも、バージョンごとに異なる形式が使用される場合があります。
このページは役に立ちましたか?
⌘I
IDL の取得
curl --request GET \
--url 'https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key='import requests
url = "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"name": "kamino_lending",
"version": "0.1.0",
"instructions": [
{
"name": "refreshObligation",
"accounts": [
{
"name": "lendingMarket",
"isMut": false,
"isSigner": false
},
{
"name": "obligation",
"isMut": true,
"isSigner": false
}
],
"args": []
}
],
"errors": [
{
"code": 6000,
"name": "InvalidMarketAuthority",
"msg": "Market authority is invalid"
}
]
}