Obtenir l’IDL
Obtenez l’IDL qui était en vigueur pour un programme Solana à n’importe quel slot, à partir du catalogue utilisé par Parsed Events pour décoder les instructions.
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 ou avant. slot ne doit pas nécessairement correspondre exactement à une version ; vous pouvez donc indiquer n’importe quel point de l’historique. Pour récupérer une version précise, transmettez son slot depuis Lister les versions d’IDL.
L’IDL provient du même catalogue que celui utilisé par Parsed Events et Parsed Streams pour décoder les instructions. L’explorateur Orb utilise ces endpoints pour afficher les IDL des programmes.
Cas d’utilisation
- Décodez l’historique avec la bonne interface. Transmettez le slot d’une transaction pour obtenir l’IDL qui était actif lors de son exécution. Les instructions et les comptes des programmes évoluent au fil du temps. L’IDL actuel peut donc interpréter incorrectement les anciennes transactions.
- Trouvez les noms exacts à utiliser dans les filtres. Analyser l’historique des transactions
match.programs[].instructionsaccepte les noms d’instructions tels qu’ils figurent dans l’IDL. - Examinez les modifications apportées à l’interface. Récupérez deux versions et comparez leurs
instructionspour voir ce qu’une mise à niveau a ajouté ou supprimé. Consultez l’exemple dans Lister les versions d’IDL.
Formats d’IDL
La réponse correspond au document IDL tel qu’il est stocké. Les programmes du catalogue utilisent l’un des deux formats Anchor, et les versions d’un même programme peuvent utiliser les deux. Vérifiez le format reçu avant de le lire :| Ancien format Anchor (avant la version 0.30) | Anchor 0.30+ | |
|---|---|---|
| Nom et version du programme | name et version au niveau racine | metadata.name et metadata.version |
| Adresse du programme | Aucun address au niveau racine | address au niveau racine |
| Discriminateur d’instruction | Non inclus | instructions[].discriminator |
| Indicateurs de compte de l’instruction | isMut, isSigner | writable, signer |
instructions. La plupart des IDL comportent également accounts, types et errors, et beaucoup comportent events.
Crédits
Chaque requête coûte 10 crédits et est disponible avec toutes les offres. Consultez la page Crédits.Erreurs
| Statut | Quand |
|---|---|
400 | programId n’est pas une adresse base58 valide, ou slot n’est pas un entier non signé de 64 bits. |
401 | La clé API est absente ou non valide. Le corps est en texte brut : Unauthorized. |
404 | Le catalogue ne contient aucun IDL pour le programme, ou aucune version n’était active au niveau de slot ou avant. |
error, tel que {"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"}.
Paramètres de la requête
slot depuis Lister les versions d’IDL pour obtenir cette version précise, ou le slot d’une transaction pour obtenir l’IDL en vigueur lors de son exécution.Autorisations
Paramètres de chemin
Adresse du programme, encodée en base58.
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Slot à rechercher. Il ne doit pas nécessairement correspondre au slot d’activation d’une version. Transmettez un slot provenant de Répertorier les versions de l’IDL pour obtenir cette version précise, ou le slot d’une transaction pour obtenir l’IDL en vigueur lors de son exécution.
x >= 0205509752
Réponse
Document IDL tel qu’il est stocké. Le format Anchor historique et le format Anchor 0.30+ sont tous deux utilisés. Vérifiez donc le format reçu avant de lire le document.
Un document IDL, renvoyé tel qu’il est stocké. Deux formats sont utilisés :
- Anchor historique (avant la version 0.30) :
nameetversionau niveau supérieur. Les comptes d’instruction utilisentisMutetisSigner. - Anchor 0.30+ :
addressetmetadata(name,version,spec,description) au niveau supérieur. Les instructions contiennent undiscriminator, et les comptes d’instruction utilisentwritableetsigner.
Les deux formats comportent instructions. La plupart des IDL comportent également accounts, types et errors, et beaucoup comportent events. Les versions d’un même programme peuvent utiliser des formats différents.
Cette page vous a-t-elle été utile ?
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"
}
]
}