Получение IDL
Получите IDL, действовавший для программы Solana в любом слоте, из каталога, который Parsed Events использует для декодирования инструкций.
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"
}
]
}slot или до него. slot не обязательно должен точно соответствовать версии, поэтому можно передать любую точку в истории. Чтобы получить конкретную версию, передайте ее slot из раздела Список версий IDL.
IDL поступает из того же каталога, который Parsed Events и Parsed Streams используют для декодирования инструкций. Обозреватель Orb использует эти конечные точки для отображения IDL программ.
Варианты использования
- Декодирование истории с правильным интерфейсом. Передайте слот транзакции, чтобы получить IDL, действовавший на момент ее выполнения. Инструкции и учетные записи программ со временем меняются, поэтому текущий IDL может неверно интерпретировать старые транзакции.
- Поиск точных имен для фильтров. Сканирование истории транзакций
match.programs[].instructionsпринимает имена инструкций в том виде, в котором они указаны в IDL. - Просмотр изменений интерфейса. Получите две версии и сравните их
instructions, чтобы узнать, что было добавлено или удалено при обновлении. См. пример в разделе Список версий IDL.
Форматы IDL
Ответ содержит документ IDL в том виде, в котором он хранится. Программы в каталоге используют один из двух форматов Anchor, причем версии одной программы могут использовать оба формата. Перед чтением проверьте, какой формат вы получили:| Устаревший 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, а многие — events.
Кредиты
Каждый запрос стоит 10 кредитов и доступен на всех тарифных планах. См. раздел Кредиты.Ошибки
| Статус | Когда возникает |
|---|---|
400 | programId не является допустимым адресом в кодировке base58 или slot не является беззнаковым 64-битным целым числом. |
401 | Ключ API отсутствует или недействителен. Тело ответа содержит обычный текст: Unauthorized. |
404 | В каталоге нет IDL для программы или ни одна версия не была активна в момент slot или до него. |
error, например {"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"}.
Параметры запроса
slot из списка версий IDL, чтобы получить конкретную версию, или слот транзакции, чтобы получить IDL, действовавший на момент ее выполнения.Авторизации
Параметры пути
Адрес программы в кодировке base58.
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Слот для поиска. Он не обязан совпадать со слотом активации версии. Передайте slot из ответа метода «Получить список версий IDL», чтобы получить конкретную версию, или слот транзакции, чтобы получить IDL, действовавший во время ее выполнения.
x >= 0205509752
Ответ
Документ IDL в сохраненном виде. Встречаются как устаревший формат Anchor, так и формат Anchor 0.30+, поэтому перед чтением проверьте, какой формат вы получили.
Документ IDL, возвращаемый в сохраненном виде. Встречаются два формата:
- Устаревший 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. Версии одной программы могут использовать разные форматы.
Была ли эта страница полезной?
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"
}
]
}