Documentation SolanaDéveloppement de programmesCodama

Génération de clients

Codama génère des clients TypeScript et Rust à partir du fichier IDL d'un programme. Les clients générés incluent des fonctions pour appeler des instructions et récupérer des comptes, éliminant ainsi le besoin de sérialiser et désérialiser manuellement les comptes du programme ou les instruction data.

Codama est en développement actif et sujet à des modifications. Consultez les dépôts liés dans la référence rapide pour les informations les plus récentes.

Référence rapide

Commandes CLI

CommandeDescription
codama initGénérer un fichier de configuration codama
codama runGénérer des clients de programme à partir du fichier de configuration

Générateurs de clients

PackageDescription
@codama/renderers-jsGénérer des clients TypeScript compatibles avec @solana/kit
@codama/renderers-rustGénérer des clients Rust compatibles avec solana_sdk
@codama/nodes-from-anchorConvertir les IDL Anchor en IDL Codama pour générer des clients

Ressources supplémentaires

RessourceDescription
CodamaGitHub de Codama
Codama CLIGitHub de Codama CLI
Codama MacrosGitHub de Codama Macros. Générer des IDL Codama à partir de programmes Rust natifs avec les macros Codama
Codama Macros Example ProgramProgramme exemple démontrant l'utilisation des macros Codama

Exemple

Cet exemple détaille le processus de génération de clients à partir d'un IDL de programme Anchor.

Configuration des fichiers du projet

Pour suivre l'exemple, créez un nouveau répertoire appelé example et ajoutez le fichier idl.json et le fichier package.json à partir des extraits de code.

Cet exemple utilise un IDL de programme compteur. Voir la source.

Dans un projet Anchor, l'IDL se trouve à target/idl/<program_name>.json après avoir exécuté anchor build.

Créer un fichier de configuration Codama

Codama utilise un fichier de configuration pour spécifier où se trouve le fichier IDL, quels langages clients générer, et où placer le code généré. Créez cette configuration en exécutant :

Terminal
$
npx codama init

Cela vous posera des questions pour créer un fichier codama.json à la racine de votre projet et installer les dépendances Codama nécessaires.

example output
Welcome to Codama!
Where is your IDL located? (Supports Codama and Anchor IDLs). … idl.json
Which script preset would you like to use? › Generate JavaScript client, Generate Rust client
[js] Where should the JavaScript code be generated? … clients/js/src/generated
[rust] Where is the Rust client crate located? … clients/rust
[rust] Where should the Rust code be generated? … clients/rust/src/generated
Your configuration requires additional dependencies.
Install command: pnpm install @codama/nodes-from-anchor @codama/renderers-js @codama/renderers-rust
Install dependencies? … yes
Installing
├─ @codama/nodes-from-anchor
├─ @codama/renderers-js
└─ @codama/renderers-rust
Dependencies installed successfully.
Configuration file created.
└─ Path: /example/codama.json

Générer les clients

Une fois le fichier de configuration créé, exécutez la commande de génération pour générer les clients :

Terminal
$
npx codama run --all

Cela générera les clients du programme dans les chemins de fichiers spécifiés dans le fichier de configuration codama.

codama.json
{
"idl": "idl.json",
"before": [],
"scripts": {
"js": {
"from": "@codama/renderers-js",
"args": ["clients/js/src/generated"]
},
"rust": {
"from": "@codama/renderers-rust",
"args": [
"clients/rust/src/generated",
{
"crateFolder": "clients/rust",
"formatCode": true
}
]
}
}
}

Tous les fichiers générés ne sont pas affichés dans les extraits de code correspondants.

Configuration des fichiers du projet

Pour suivre l'exemple, créez un nouveau répertoire appelé example et ajoutez le fichier idl.json et le fichier package.json à partir des extraits de code.

Cet exemple utilise un IDL de programme compteur. Voir la source.

Dans un projet Anchor, l'IDL se trouve à target/idl/<program_name>.json après avoir exécuté anchor build.

Créer un fichier de configuration Codama

Codama utilise un fichier de configuration pour spécifier où se trouve le fichier IDL, quels langages clients générer, et où placer le code généré. Créez cette configuration en exécutant :

Terminal
$
npx codama init

Cela vous posera des questions pour créer un fichier codama.json à la racine de votre projet et installer les dépendances Codama nécessaires.

example output
Welcome to Codama!
Where is your IDL located? (Supports Codama and Anchor IDLs). … idl.json
Which script preset would you like to use? › Generate JavaScript client, Generate Rust client
[js] Where should the JavaScript code be generated? … clients/js/src/generated
[rust] Where is the Rust client crate located? … clients/rust
[rust] Where should the Rust code be generated? … clients/rust/src/generated
Your configuration requires additional dependencies.
Install command: pnpm install @codama/nodes-from-anchor @codama/renderers-js @codama/renderers-rust
Install dependencies? … yes
Installing
├─ @codama/nodes-from-anchor
├─ @codama/renderers-js
└─ @codama/renderers-rust
Dependencies installed successfully.
Configuration file created.
└─ Path: /example/codama.json

Générer les clients

Une fois le fichier de configuration créé, exécutez la commande de génération pour générer les clients :

Terminal
$
npx codama run --all

Cela générera les clients du programme dans les chemins de fichiers spécifiés dans le fichier de configuration codama.

codama.json
{
"idl": "idl.json",
"before": [],
"scripts": {
"js": {
"from": "@codama/renderers-js",
"args": ["clients/js/src/generated"]
},
"rust": {
"from": "@codama/renderers-rust",
"args": [
"clients/rust/src/generated",
{
"crateFolder": "clients/rust",
"formatCode": true
}
]
}
}
}

Tous les fichiers générés ne sont pas affichés dans les extraits de code correspondants.

idl.json
package.json
{
"address": "8PY1q5J3Aq2z7TBDLBrVjv77mYzjXSCz6iHQaFEFw9hY",
"metadata": {
"name": "counter",
"version": "0.1.0",
"spec": "0.1.0",
"description": "Created with Anchor"
},
"instructions": [
{
"name": "decrement",
"discriminator": [106, 227, 168, 59, 248, 27, 150, 101],
"accounts": [
{
"name": "user",
"writable": true,
"signer": true
},
{
"name": "counter",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [99, 111, 117, 110, 116, 101, 114]
}
]
}
},
{
"name": "vault",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [118, 97, 117, 108, 116]
},
{
"kind": "account",
"path": "user"
}
]
}
},
{
"name": "system_program",
"address": "11111111111111111111111111111111"
}
],
"args": []
},
{
"name": "increment",
"discriminator": [11, 18, 104, 9, 104, 174, 59, 33],
"accounts": [
{
"name": "user",
"writable": true,
"signer": true
},
{
"name": "counter",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [99, 111, 117, 110, 116, 101, 114]
}
]
}
},
{
"name": "vault",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [118, 97, 117, 108, 116]
},
{
"kind": "account",
"path": "user"
}
]
}
},
{
"name": "system_program",
"address": "11111111111111111111111111111111"
}
],
"args": []
}
],
"accounts": [
{
"name": "Counter",
"discriminator": [255, 176, 4, 245, 188, 253, 124, 25]
}
],
"errors": [
{
"code": 6000,
"name": "UnderflowError",
"msg": "Counter cannot be decremented below zero"
}
],
"types": [
{
"name": "Counter",
"type": {
"kind": "struct",
"fields": [
{
"name": "count",
"type": "u64"
}
]
}
}
]
}

Utilisation des clients générés

Les clients générés incluent le code source pour interagir avec votre programme mais ne comprennent pas les fichiers package.json (pour TypeScript) ou Cargo.toml (pour Rust).

Vous devrez soit créer de nouveaux fichiers package.json et Cargo.toml, soit ajouter les dépendances requises des clients générés aux fichiers existants de votre projet.

Intégration dans votre application

Générez le client directement dans le répertoire source de votre application, puis ajoutez les dépendances requises à vos fichiers package.json ou Cargo.toml existants.

Utilisez cette approche lors de la création d'une application où le code client n'a pas besoin d'être partagé ou publié.

Packages ou crates autonomes

Créez des packages TypeScript ou des crates Rust séparés pour chaque client. Par exemple, ajoutez package.json dans clients/js/ et Cargo.toml dans clients/rust/.

Utilisez cette approche pour publier le client comme une bibliothèque réutilisable (npm ou crates.io) ou partager le client entre plusieurs applications dans un monorepo.

Is this page helpful?

Table des matières

Modifier la page

Géré par

© 2025 Fondation Solana.
Tous droits réservés.
Restez connecté