Obtener IDL
Obtén el IDL que estaba vigente para un programa de Solana en cualquier slot desde el catálogo que Parsed Events usa para decodificar instrucciones.
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 o antes. slot no necesita coincidir exactamente con una versión, por lo que puedes pasar cualquier punto del historial. Para obtener una versión específica, pasa su slot desde Listar versiones de IDL.
El IDL proviene del mismo catálogo que Parsed Events y Parsed Streams usan para decodificar instrucciones. El explorador Orb usa estos endpoints para mostrar los IDL de los programas.
Casos de uso
- Decodifica el historial con la interfaz correcta. Pasa el slot de una transacción para obtener el IDL que estaba vigente cuando se ejecutó. Los programas cambian sus instrucciones y cuentas con el tiempo, por lo que el IDL actual puede interpretar incorrectamente las transacciones anteriores.
- Encuentra los nombres exactos para los filtros. Escanear el historial de transacciones
match.programs[].instructionsacepta los nombres de las instrucciones tal como aparecen en el IDL. - Revisa los cambios de la interfaz. Obtén dos versiones y compara sus
instructionspara ver qué añadió o eliminó una actualización. Consulta el ejemplo en Listar versiones de IDL.
Formatos de IDL
La respuesta es el documento IDL tal como está almacenado. Los programas del catálogo usan uno de dos formatos de Anchor, y las versiones de un mismo programa pueden usar ambos. Comprueba qué formato recibiste antes de leerlo:| Anchor heredado (anterior a 0.30) | Anchor 0.30+ | |
|---|---|---|
| Nombre y versión del programa | name e version de nivel superior | metadata.name e metadata.version |
| Dirección del programa | Sin address de nivel superior | address de nivel superior |
| Discriminador de instrucción | No incluido | instructions[].discriminator |
| Indicadores de cuentas de instrucciones | isMut, isSigner | writable, signer |
instructions. La mayoría de los IDL también tienen accounts, types e errors, y muchos tienen events.
Créditos
Cada solicitud cuesta 10 créditos y está disponible en todos los planes. Consulta Créditos.Errores
| Estado | Cuándo ocurre |
|---|---|
400 | programId no es una dirección base58 válida o slot no es un entero de 64 bits sin signo. |
401 | Falta la clave de API o no es válida. El cuerpo es texto sin formato: Unauthorized. |
404 | El catálogo no tiene ningún IDL para el programa o ninguna versión estaba activa en slot o antes. |
error, como {"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"}.
Parámetros de la solicitud
slot de Listar versiones de IDL para obtener esa versión exacta, o el slot de una transacción para obtener el IDL que estaba vigente cuando se ejecutó.Autorizaciones
Parámetros de ruta
Dirección del programa, codificada en base58.
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Slot que quieres consultar. No tiene que coincidir con el slot de activación de una versión. Pasa un slot de Listar versiones de IDL para obtener esa versión exacta o el slot de una transacción para obtener la IDL vigente cuando se ejecutó.
x >= 0205509752
Respuesta
El documento IDL tal como está almacenado. Se usan tanto el formato heredado de Anchor como el formato de Anchor 0.30+, así que comprueba cuál recibiste antes de leerlo.
Un documento IDL devuelto tal como está almacenado. Se usan dos formatos:
- Anchor heredado (anterior a 0.30):
nameyversionen el nivel superior. Las cuentas de las instrucciones usanisMuteisSigner. - Anchor 0.30+:
addressymetadata(name,version,spec,description) en el nivel superior. Las instrucciones incluyen undiscriminatory las cuentas de las instrucciones usanwritableysigner.
Ambos formatos tienen instructions. La mayoría de las IDL también tienen accounts, types y errors, y muchas tienen events. Las versiones de un programa pueden usar formatos diferentes.
¿Esta página le ayudó?
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"
}
]
}