Documentación de SolanaDesarrollo de programasCodama

Generando clientes

Codama genera clientes en TypeScript y Rust a partir del archivo IDL de un programa. Los clientes generados incluyen funciones para llamar a instrucciones y obtener cuentas, eliminando la necesidad de serializar y deserializar manualmente las cuentas del programa o instruction data.

Codama está en desarrollo activo y sujeto a cambios. Consulta los repositorios enlazados en la referencia rápida para obtener la información más reciente.

Referencia rápida

Comandos CLI

ComandoDescripción
codama initGenerar un archivo de configuración de codama
codama runGenerar clientes de programa desde el archivo de configuración

Generadores de clientes

PaqueteDescripción
@codama/renderers-jsGenera clientes TypeScript compatibles con @solana/kit
@codama/renderers-rustGenera clientes Rust compatibles con solana_sdk
@codama/nodes-from-anchorConvierte IDLs de Anchor a IDLs de Codama para generar clientes

Recursos adicionales

RecursoDescripción
CodamaGitHub de Codama
Codama CLIGitHub de Codama CLI
Codama MacrosGitHub de Codama Macros. Genera IDL de Codama desde programas nativos de Rust con macros de Codama
Codama Macros Example ProgramPrograma de ejemplo que demuestra el uso de macros de Codama

Ejemplo

Este ejemplo muestra el proceso de generación de clientes a partir de un IDL de programa Anchor.

Configurar archivos del proyecto

Para seguir el ejemplo, crea un nuevo directorio llamado example y añade el archivo idl.json y el archivo package.json de los fragmentos de código.

Este ejemplo utiliza un IDL de programa contador. Ver código fuente.

En un proyecto de Anchor, el IDL se encuentra en target/idl/<program_name>.json después de ejecutar anchor build.

Crear archivo de configuración de Codama

Codama utiliza un archivo de configuración para especificar dónde se encuentra el archivo IDL, qué lenguajes de cliente generar y dónde guardar el código generado. Crea esta configuración ejecutando:

Terminal
$
npx codama init

Esto te mostrará preguntas para crear un archivo codama.json en la raíz de tu proyecto e instalar las dependencias necesarias de Codama.

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

Generar clientes

Una vez creado el archivo de configuración, ejecuta el comando de generación para generar los clientes:

Terminal
$
npx codama run --all

Esto generará los clientes del programa en las rutas de archivo especificadas en el archivo de configuración de 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
}
]
}
}
}

No todos los archivos generados se muestran en los fragmentos de código correspondientes.

Configurar archivos del proyecto

Para seguir el ejemplo, crea un nuevo directorio llamado example y añade el archivo idl.json y el archivo package.json de los fragmentos de código.

Este ejemplo utiliza un IDL de programa contador. Ver código fuente.

En un proyecto de Anchor, el IDL se encuentra en target/idl/<program_name>.json después de ejecutar anchor build.

Crear archivo de configuración de Codama

Codama utiliza un archivo de configuración para especificar dónde se encuentra el archivo IDL, qué lenguajes de cliente generar y dónde guardar el código generado. Crea esta configuración ejecutando:

Terminal
$
npx codama init

Esto te mostrará preguntas para crear un archivo codama.json en la raíz de tu proyecto e instalar las dependencias necesarias de Codama.

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

Generar clientes

Una vez creado el archivo de configuración, ejecuta el comando de generación para generar los clientes:

Terminal
$
npx codama run --all

Esto generará los clientes del programa en las rutas de archivo especificadas en el archivo de configuración de 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
}
]
}
}
}

No todos los archivos generados se muestran en los fragmentos de código correspondientes.

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"
}
]
}
}
]
}

Uso de los clientes generados

Los clientes generados incluyen código fuente para interactuar con tu programa pero no incluyen archivos package.json (para TypeScript) o Cargo.toml (para Rust).

Necesitarás crear nuevos archivos package.json y Cargo.toml o agregar las dependencias requeridas de los clientes generados a los archivos existentes de tu proyecto.

Integración en tu aplicación

Genera el cliente directamente en el directorio de código fuente de tu aplicación y luego agrega las dependencias requeridas a tus archivos package.json o Cargo.toml existentes.

Utiliza este enfoque cuando construyas una aplicación donde el código del cliente no necesita ser compartido o publicado.

Paquetes o crates independientes

Crea paquetes de TypeScript o crates de Rust separados para cada cliente. Por ejemplo, agrega package.json en clients/js/ y Cargo.toml en clients/rust/.

Utiliza este enfoque para publicar el cliente como una biblioteca reutilizable (npm o crates.io) o compartir el cliente entre múltiples aplicaciones en un monorepo.

Is this page helpful?

Tabla de Contenidos

Editar Página

Gestionado por

© 2025 Fundación Solana.
Todos los derechos reservados.
Conéctate