Eventos analizados
Listar versiones de IDL
Lista todas las versiones de IDL que Eventos analizados tiene para un programa de Solana, junto con el slot en el que se activó cada versión.
GET
/
v1
/
parsed-events
/
idl
/
{programId}
Listar versiones 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"
}Los parámetros de ruta, el esquema de respuesta y los ejemplos de esta página se generan a partir de la definición de OpenAPI.
Listar versiones de IDL devuelve el historial de la interfaz de un programa desde el catálogo de IDL que Eventos analizados y Flujos analizados usan para decodificar instrucciones. Cada elemento representa una versión, identificada por el slot en el que se activó. Los elementos se ordenan del más antiguo al más reciente, por lo que el último corresponde a la versión actual.
Pasa cualquier
Para detectar cambios con el tiempo, almacena el
Otros errores devuelven un cuerpo JSON con un mensaje
slot de la respuesta a Obtener IDL para recuperar el documento IDL de esa versión. El explorador Orb usa estos endpoints para mostrar los IDL de los programas.
Casos de uso
- Rastrea los cambios en la interfaz. Consulta periódicamente Listar versiones de IDL para un programa del que dependas. Cuando aparezca una nueva versión, obtén esa versión y la anterior con Obtener IDL y compara sus
instructions. Una nueva instrucción de administrador o autoridad amerita una revisión de seguridad. - Comprueba la cobertura del catálogo. Un
404significa que el catálogo no tiene un IDL para el programa. Los programas como SPL Token se decodifican mediante decodificadores integrados y también devuelven404.
Ejemplo: detectar una nueva versión de IDL
Este script lista las versiones de IDL de un programa, obtiene las dos más recientes e imprime las instrucciones que se agregaron o eliminaron: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 de la última versión que hayas visto y compáralo en cada consulta periódica.
Créditos
Cada solicitud cuesta 10 créditos y está disponible en todos los planes. El ejemplo anterior realiza tres solicitudes, por lo que cuesta 30 créditos. Consulta Créditos.Errores
| Estado | Cuándo ocurre |
|---|---|
400 | programId no es una dirección base58 válida. |
401 | Falta la clave de API o no es válida. El cuerpo es texto sin formato: Unauthorized. |
404 | El catálogo no tiene un IDL para el programa. |
error, como {"error": "no IDLs found for program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}.
Parámetros de la solicitud
string
requerido
Dirección del programa, codificada en base58.
Autorizaciones
Parámetros de ruta
Dirección del programa, codificada en base58.
Ejemplo:
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Respuesta
Las versiones de IDL del programa, ordenadas por slot de forma ascendente.
Slot en el que se activó esta versión de la IDL. Pásalo a Obtener IDL para recuperar esta versión.
Dónde encontró Eventos analizados esta versión. Los valores incluyen anchor, program_metadata y github, y se pueden agregar más. Una versión puede tener más de una fuente.
¿Esta página le ayudó?
⌘I
Listar versiones 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"
}