Обработанные события
Список версий IDL
Получите список всех версий IDL, доступных в Parsed Events для программы Solana, со слотом, в котором каждая версия стала активной.
GET
/
v1
/
parsed-events
/
idl
/
{programId}
Получить список версий IDL
curl --request GET \
--url 'https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?api-key='import requests
url = "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?api-key="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?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}?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}?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}?api-key=")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?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[
{
"slot": 182747476,
"sources": [
"anchor"
]
},
{
"slot": 205509752,
"sources": [
"anchor"
]
},
{
"slot": 206074074,
"sources": [
"anchor"
]
}
]{
"error": "invalid program id: notanaddress: String is the wrong size"
}Unauthorized{
"error": "no IDLs found for program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}Параметры пути, схема ответа и примеры на этой странице сгенерированы из определения OpenAPI.
List IDL Versions возвращает историю интерфейса программы из каталога IDL, который Parsed Events и Parsed Streams используют для декодирования инструкций. Каждый элемент представляет собой одну версию, идентифицируемую по слоту, в котором она стала активной. Элементы отсортированы от самой старой версии к самой новой, поэтому последний элемент соответствует текущей версии.
Передайте любое значение
Чтобы отслеживать изменения с течением времени, сохраните
При других ошибках возвращается тело JSON с сообщением
slot из ответа в Get IDL, чтобы получить документ IDL для этой версии. Обозреватель Orb использует эти конечные точки для отображения IDL программ.
Варианты использования
- Отслеживание изменений интерфейса. Периодически вызывайте List IDL Versions для программы, от которой зависит ваше приложение. Когда появится новая версия, получите ее и предыдущую версию с помощью Get IDL и сравните их
instructions. Появление новой инструкции администратора или уполномоченного субъекта требует проверки безопасности. - Проверка охвата каталога. Значение
404означает, что в каталоге нет IDL для программы. Такие программы, как SPL Token, вместо этого декодируются встроенными декодерами и также возвращают404.
Пример: обнаружение новой версии IDL
Этот скрипт выводит список версий IDL программы, получает две последние версии и выводит инструкции, которые были добавлены или удалены:diff-idl-versions.js
const API_KEY = process.env.HELIUS_API_KEY;
if (!API_KEY) {
console.error("Missing HELIUS_API_KEY.");
process.exit(1);
}
const BASE = "https://mainnet.helius-rpc.com/v1/parsed-events/idl";
const PROGRAM_ID = "KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD";
async function get(path) {
const response = await fetch(`${BASE}/${path}?api-key=${API_KEY}`);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
return response.json();
}
const versions = await get(PROGRAM_ID);
if (versions.length < 2) {
console.log("Fewer than two IDL versions; nothing to compare.");
process.exit(0);
}
const [previous, latest] = versions.slice(-2);
const [before, after] = await Promise.all([
get(`${PROGRAM_ID}/${previous.slot}`),
get(`${PROGRAM_ID}/${latest.slot}`),
]);
const names = (idl) => new Set(idl.instructions.map((ix) => ix.name));
const beforeNames = names(before);
const afterNames = names(after);
console.log(`Comparing slot ${previous.slot} with slot ${latest.slot}`);
console.log("Added:", [...afterNames].filter((name) => !beforeNames.has(name)));
console.log("Removed:", [...beforeNames].filter((name) => !afterNames.has(name)));
slot последней обнаруженной версии и сравнивайте с ним результат каждого опроса.
Кредиты
Каждый запрос стоит 10 кредитов и доступен на всех тарифных планах. В приведенном выше примере выполняются три запроса, поэтому он стоит 30 кредитов. См. раздел Кредиты.Ошибки
| Статус | Условие |
|---|---|
400 | programId не является допустимым адресом в формате base58. |
401 | Ключ API отсутствует или недействителен. Тело ответа содержит обычный текст: Unauthorized. |
404 | В каталоге нет IDL для программы. |
error, например {"error": "no IDLs found for program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}.
Параметры запроса
string
обязательно
Адрес программы в кодировке base58.
Авторизации
Параметры пути
Адрес программы в кодировке base58.
Пример:
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Ответ
Версии IDL программы, отсортированные по slot в порядке возрастания.
Слот, в котором эта версия IDL стала активной. Передайте его методу «Получить IDL», чтобы получить эту версию.
Источники, в которых Parsed Events нашел эту версию. Возможные значения включают anchor, program_metadata и github; в будущем могут быть добавлены другие. У версии может быть несколько источников.
Была ли эта страница полезной?
⌘I
Получить список версий IDL
curl --request GET \
--url 'https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?api-key='import requests
url = "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?api-key="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?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}?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}?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}?api-key=")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}?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[
{
"slot": 182747476,
"sources": [
"anchor"
]
},
{
"slot": 205509752,
"sources": [
"anchor"
]
},
{
"slot": 206074074,
"sources": [
"anchor"
]
}
]{
"error": "invalid program id: notanaddress: String is the wrong size"
}Unauthorized{
"error": "no IDLs found for program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}