Eventos analisados
Listar versões de IDL
Liste todas as versões de IDL que o Parsed Events tem para um programa da Solana, incluindo o slot em que cada versão se tornou ativa.
GET
/
v1
/
parsed-events
/
idl
/
{programId}
Listar versões de 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"
}Os parâmetros de caminho, o esquema de resposta e os exemplos desta página são gerados com base na definição OpenAPI.
Listar versões de IDL retorna o histórico da interface de um programa presente no catálogo de IDLs que o Parsed Events e o Parsed Streams usam para decodificar instruções. Cada item corresponde a uma versão, identificada pelo slot em que ela se tornou ativa. Os itens são ordenados do mais antigo para o mais recente; portanto, o último item é a versão atual.
Passe qualquer
Para detectar alterações ao longo do tempo, armazene o
Outros erros retornam um corpo JSON com uma mensagem
slot da resposta para Obter IDL a fim de buscar o documento IDL dessa versão. O explorador Orb usa esses endpoints para mostrar as IDLs dos programas.
Casos de uso
- Acompanhe alterações na interface. Consulte periodicamente Listar versões de IDL para um programa do qual você depende. Quando uma nova versão aparecer, busque essa versão e a anterior com Obter IDL e compare os respectivos
instructions. Uma nova instrução de administrador ou autoridade merece uma análise de segurança. - Verifique a cobertura do catálogo. Um
404significa que o catálogo não tem uma IDL para o programa. Programas como o SPL Token são decodificados por decodificadores integrados e também retornam404.
Exemplo: detectar uma nova versão de IDL
Este script lista as versões de IDL de um programa, busca as duas mais recentes e exibe as instruções que foram adicionadas ou removidas: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 da última versão que você viu e compare-o a cada consulta periódica.
Créditos
Cada solicitação custa 10 créditos e está disponível em todos os planos. O exemplo acima faz três solicitações, portanto custa 30 créditos. Consulte Créditos.Erros
| Status | Quando |
|---|---|
400 | programId não é um endereço base58 válido. |
401 | A chave de API está ausente ou é inválida. O corpo está em texto simples: Unauthorized. |
404 | O catálogo não tem uma IDL para o programa. |
error, como {"error": "no IDLs found for program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}.
Parâmetros da solicitação
string
obrigatório
Endereço do programa, codificado em base58.
Autorizações
Parâmetros de caminho
Endereço do programa, codificado em base58.
Exemplo:
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Resposta
As versões de IDL do programa, ordenadas por slot em ordem crescente.
Slot em que esta versão de IDL se tornou ativa. Passe-o para Obter IDL a fim de buscar esta versão.
Onde Eventos analisados encontrou esta versão. Os valores incluem anchor, program_metadata e github, e outros podem ser adicionados. Uma versão pode ter mais de uma fonte.
Esta página foi útil?
⌘I
Listar versões de 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"
}