Documentação SolanaDesenvolvendo programasCodama

Gerando Clientes

Codama gera clientes TypeScript e Rust a partir do arquivo IDL de um programa. Os clientes gerados incluem funções para chamar instruções e buscar contas, eliminando a necessidade de manualmente serializar e desserializar contas de programa ou instruction data.

Codama está em desenvolvimento ativo e sujeito a mudanças. Consulte os repositórios vinculados na referência rápida para obter as informações mais recentes.

Referência Rápida

Comandos CLI

ComandoDescrição
codama initGerar um arquivo de configuração codama
codama runGerar clientes de programa a partir do arquivo de configuração

Geradores de Cliente

PacoteDescrição
@codama/renderers-jsGerar clientes TypeScript compatíveis com @solana/kit
@codama/renderers-rustGerar clientes Rust compatíveis com solana_sdk
@codama/nodes-from-anchorConverter IDLs Anchor para IDLs Codama para gerar clientes

Recursos Adicionais

RecursoDescrição
CodamaGitHub do Codama
Codama CLIGitHub do CLI Codama
Codama MacrosGitHub do Codama Macros. Gere IDL Codama a partir de programas Rust nativos com macros Codama
Codama Macros Example ProgramPrograma de exemplo demonstrando o uso de macros Codama

Exemplo

Este exemplo percorre o processo de geração de clientes a partir de um IDL de programa Anchor.

Configurar Arquivos do Projeto

Para acompanhar, crie um novo diretório chamado example e adicione o arquivo idl.json e o arquivo package.json dos trechos de código.

Este exemplo usa um IDL de programa contador. Ver código-fonte.

Em um projeto Anchor, o IDL é encontrado em target/idl/<program_name>.json após executar anchor build.

Criar arquivo de configuração do Codama

O Codama usa um arquivo de configuração para especificar onde o arquivo IDL está localizado, quais linguagens de cliente gerar e onde enviar o código gerado. Crie esta configuração executando:

Terminal
$
npx codama init

Isso irá apresentar perguntas para criar um arquivo codama.json na raiz do seu projeto e instalar as dependências necessárias do 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

Gerar clientes

Uma vez que o arquivo de configuração é criado, execute o comando de geração para gerar os clientes:

Terminal
$
npx codama run --all

Isso irá gerar os clientes do programa nos caminhos de arquivo especificados no arquivo de configuração do 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
}
]
}
}
}

Nem todos os arquivos gerados são mostrados nos trechos de código correspondentes.

Configurar Arquivos do Projeto

Para acompanhar, crie um novo diretório chamado example e adicione o arquivo idl.json e o arquivo package.json dos trechos de código.

Este exemplo usa um IDL de programa contador. Ver código-fonte.

Em um projeto Anchor, o IDL é encontrado em target/idl/<program_name>.json após executar anchor build.

Criar arquivo de configuração do Codama

O Codama usa um arquivo de configuração para especificar onde o arquivo IDL está localizado, quais linguagens de cliente gerar e onde enviar o código gerado. Crie esta configuração executando:

Terminal
$
npx codama init

Isso irá apresentar perguntas para criar um arquivo codama.json na raiz do seu projeto e instalar as dependências necessárias do 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

Gerar clientes

Uma vez que o arquivo de configuração é criado, execute o comando de geração para gerar os clientes:

Terminal
$
npx codama run --all

Isso irá gerar os clientes do programa nos caminhos de arquivo especificados no arquivo de configuração do 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
}
]
}
}
}

Nem todos os arquivos gerados são mostrados nos trechos de código correspondentes.

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

Usando os clientes gerados

Os clientes gerados incluem código-fonte para interagir com seu programa, mas não incluem arquivos package.json (para TypeScript) ou Cargo.toml (para Rust).

Você precisará criar novos arquivos package.json e Cargo.toml ou adicionar as dependências necessárias dos clientes gerados aos arquivos existentes do seu projeto.

Integrado em sua aplicação

Gere o cliente diretamente no diretório de origem da sua aplicação e depois adicione as dependências necessárias ao seu package.json ou Cargo.toml existente.

Use esta abordagem ao construir uma aplicação onde o código do cliente não precisa ser compartilhado ou publicado.

Pacotes ou crates independentes

Crie pacotes TypeScript ou crates Rust separados para cada cliente. Por exemplo, adicione package.json em clients/js/ e Cargo.toml em clients/rust/.

Use esta abordagem para publicar o cliente como uma biblioteca reutilizável (npm ou crates.io) ou compartilhar o cliente entre várias aplicações em um monorepo.

Is this page helpful?

Índice

Editar Página

Gerenciado por

© 2025 Fundação Solana.
Todos os direitos reservados.