Obter IDL
Obtenha a IDL que estava em vigor para um programa da Solana em qualquer slot, usando o catálogo que o Parsed Events utiliza para decodificar instruções.
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_bodyslot. slot não precisa corresponder exatamente a uma versão, portanto você pode passar qualquer ponto no histórico. Para buscar uma versão específica, passe o slot dela em Listar versões da IDL.
A IDL vem do mesmo catálogo que o Parsed Events e o Parsed Streams usam para decodificar instruções. O explorador Orb usa esses endpoints para exibir as IDLs dos programas.
Casos de uso
- Decodifique o histórico com a interface correta. Passe o slot de uma transação para obter a IDL que estava em vigor quando ela foi executada. Os programas alteram suas instruções e contas ao longo do tempo, portanto a IDL atual pode interpretar incorretamente transações mais antigas.
- Encontre os nomes exatos para os filtros. Examinar o histórico de transações
match.programs[].instructionsaceita nomes de instruções exatamente como aparecem na IDL. - Analise alterações na interface. Busque duas versões e compare os respectivos
instructionspara ver o que uma atualização adicionou ou removeu. Consulte o exemplo em Listar versões da IDL.
Formatos de IDL
A resposta é o documento da IDL conforme armazenado. Os programas no catálogo usam um de dois formatos do Anchor, e as versões de um mesmo programa podem usar ambos. Verifique qual formato você recebeu antes de interpretá-lo:| Anchor legado (anterior à versão 0.30) | Anchor 0.30+ | |
|---|---|---|
| Nome e versão do programa | name e version no nível superior | metadata.name e metadata.version |
| Endereço do programa | Sem address no nível superior | address no nível superior |
| Discriminador da instrução | Não incluído | instructions[].discriminator |
| Sinalizadores de conta da instrução | isMut, isSigner | writable, signer |
instructions. A maioria das IDLs também tem accounts, types e errors, e muitas têm events.
Créditos
Cada solicitação custa 10 créditos e está disponível em todos os planos. Consulte Créditos.Erros
| Status | Quando |
|---|---|
400 | programId não é um endereço base58 válido, ou slot não é um inteiro de 64 bits sem sinal. |
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, ou nenhuma versão estava ativa em ou antes de slot. |
error, como {"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"}.
Parâmetros da solicitação
slot de Listar versões da IDL para obter essa versão exata, ou o slot de uma transação para obter a IDL que estava em vigor quando ela foi executada.Autorizações
Parâmetros de caminho
Endereço do programa, codificado em base58.
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Slot a ser consultado. Ele não precisa corresponder ao slot de ativação de uma versão. Passe um slot de Listar versões de IDL para obter essa versão exata ou o slot de uma transação para obter a IDL que estava em vigor quando ela foi executada.
x >= 0205509752
Resposta
O documento IDL conforme armazenado. Tanto o formato legado do Anchor quanto o formato do Anchor 0.30+ podem ocorrer, então verifique qual deles você recebeu antes de lê-lo.
Um documento IDL, retornado conforme armazenado. Há dois formatos:
- Anchor legado (antes da versão 0.30):
nameeversionno nível superior. As contas das instruções usamisMuteisSigner. - Anchor 0.30+:
addressemetadata(name,version,spec,description) no nível superior. As instruções têm umdiscriminator, e as contas das instruções usamwritableesigner.
Ambos os formatos têm instructions. A maioria das IDLs também tem accounts, types e errors, e muitas têm events. As versões de um mesmo programa podem usar formatos diferentes.
Esta página foi útil?
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