Lendo da rede

Leia dados da rede Solana buscando diferentes contas. Este guia explica a estrutura das contas da Solana. Cada conta da Solana possui um endereço único usado para localizar os dados onchain da conta. As contas da Solana contêm dados de estado ou um programa executável.

Buscar uma conta de carteira

Uma conta de carteira é uma conta pertencente ao System Program. As contas de carteira são usadas principalmente para armazenar SOL e assinar transações. Quando SOL é enviado para um novo endereço pela primeira vez, uma conta do sistema é criada automaticamente.

O exemplo abaixo cria um cliente Kit, gera um novo assinante, solicita SOL para financiar o novo endereço e recupera os dados da conta da API RPC do cliente.

Fetch account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop());
const signer = await generateKeyPairSigner();
console.log(`Address: ${signer.address}`);
// Funding an address with SOL automatically creates an account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Ao buscar uma conta de carteira com getAccountInfo(), o Kit retorna a resposta RPC exibida no exemplo de saída à direita.

A resposta possui dois campos de nível superior: context descreve quando a leitura ocorreu, e value contém os campos da conta retornados pelo método RPC.

O campo context mostra o slot usado para ler a conta e a versão da API RPC que forneceu a resposta. Uma leitura posterior pode retornar um slot ou versão de API diferente.

O campo value contém o estado da conta retornado pelo método RPC. Os seguintes passos percorrem os campos dentro de value na ordem em que os campos aparecem.

O campo lamports contém o saldo SOL da conta, medido em lamports, a menor unidade de SOL.

O campo data contém os dados da conta armazenados em bytes. O RPC retorna os dados da conta como uma tupla: a string de dados codificada, seguida da codificação. Para contas de carteira, a string de dados codificada está vazia porque a conta armazena 0 bytes de dados.

O campo owner mostra o programa que é proprietário da conta. Para carteiras, o proprietário é sempre o System Program, com o endereço 11111111111111111111111111111111.

O campo executable indica se o endereço da conta é chamável. true significa que o endereço representa um programa que pode processar instruções. false significa que a conta armazena estado, como o saldo de uma carteira ou dados da conta, e não é chamada como um programa. Contas de carteira utilizam false.

O campo rentEpoch é um campo legado de um mecanismo de rent descontinuado. O campo ainda é retornado para compatibilidade retroativa.

O campo space mostra o número de bytes contidos no campo data. O campo space é retornado junto com a resposta de busca da conta, mas não faz parte do tipo de dados da conta.

Para o exemplo de conta de carteira, o campo space é 0 porque o campo data contém 0 bytes de dados.

Ao buscar uma conta de carteira com getAccountInfo(), o Kit retorna a resposta RPC exibida no exemplo de saída à direita.

A resposta possui dois campos de nível superior: context descreve quando a leitura ocorreu, e value contém os campos da conta retornados pelo método RPC.

O campo context mostra o slot usado para ler a conta e a versão da API RPC que forneceu a resposta. Uma leitura posterior pode retornar um slot ou versão de API diferente.

O campo value contém o estado da conta retornado pelo método RPC. Os seguintes passos percorrem os campos dentro de value na ordem em que os campos aparecem.

O campo lamports contém o saldo SOL da conta, medido em lamports, a menor unidade de SOL.

O campo data contém os dados da conta armazenados em bytes. O RPC retorna os dados da conta como uma tupla: a string de dados codificada, seguida da codificação. Para contas de carteira, a string de dados codificada está vazia porque a conta armazena 0 bytes de dados.

O campo owner mostra o programa que é proprietário da conta. Para carteiras, o proprietário é sempre o System Program, com o endereço 11111111111111111111111111111111.

O campo executable indica se o endereço da conta é chamável. true significa que o endereço representa um programa que pode processar instruções. false significa que a conta armazena estado, como o saldo de uma carteira ou dados da conta, e não é chamada como um programa. Contas de carteira utilizam false.

O campo rentEpoch é um campo legado de um mecanismo de rent descontinuado. O campo ainda é retornado para compatibilidade retroativa.

O campo space mostra o número de bytes contidos no campo data. O campo space é retornado junto com a resposta de busca da conta, mas não faz parte do tipo de dados da conta.

Para o exemplo de conta de carteira, o campo space é 0 porque o campo data contém 0 bytes de dados.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Buscar o Token Program

O exemplo abaixo busca o Token Program para demonstrar a diferença entre contas de carteira e contas de programa. O Token Program define instruções para trabalhar com tokens, como criar e transferir tokens. Os programas são invocados para processar instruções. O estado do programa, como dados de tokens e saldos, é armazenado em contas separadas de propriedade do programa.

O endereço do Token Program é o program account onchain. Para simplificar, você pode pensar no endereço do programa como o próprio programa, pois esse é o endereço usado para invocá-lo. Para programas atualizáveis, o program account armazena metadados e aponta para um programdata account separado que armazena o código executável implantado. Você pode visualizar o código-fonte do Token Program source code e o program account no Solana Explorer.

Fetch program account
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const tokenProgramAddress = address(
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
);
const accountInfo = await client.rpc
.getAccountInfo(tokenProgramAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
const parsedAccount = await fetchJsonParsedAccount(
client.rpc,
tokenProgramAddress
);
console.log(parsedAccount);
Console
Click to execute the code.

O Token Program é um program account executável. Os programas possuem os mesmos campos subjacentes que todas as contas, mas com diferenças importantes.

O exemplo do Token Program utiliza a codificação base64 para retornar os dados brutos do program account.

Os passos a seguir percorrem os campos dentro de value na ordem em que os campos aparecem.

O campo data armazena o estado do program account do BPF Upgradeable Loader. O primeiro item da tupla contém os dados completos da conta codificados em base64. O segundo item da tupla identifica a codificação. Aqui, os 36 bytes incluem metadados e o endereço do programdata account.

Para programas atualizáveis, o estado do program account aponta para o programdata account separado que armazena o código executável do programa.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

O campo executable está definido como true, o que indica que o endereço da conta pode ser invocado como um programa.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

O campo lamports contém o saldo em SOL mantido pelo program account. Os program accounts precisam de lamports suficientes para permanecer isentos de rent.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Todo program account é de propriedade de um programa carregador. Para o Token Program account, o owner é o BPF Upgradeable Loader.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

O campo rentEpoch é um campo legado de um mecanismo de rent descontinuado. O campo ainda é retornado por compatibilidade retroativa.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

O campo space mostra o tamanho total dos dados do program account em bytes. O valor de space é apenas 36 bytes porque o program account armazena metadados do carregador e o endereço do ProgramData account, e não o programa compilado completo.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

A resposta anterior retornou o campo data do program account como uma tupla base64. A resposta analisada desserializa esses bytes em campos nomeados no objeto data. O campo programData contém o endereço do ProgramData account que armazena o código executável do programa.

Parsed Token program account
{
executable: true,
lamports: 43712780n,
programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",
space: 36n,
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
data: {
programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",
parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }
},
exists: true
}

O Token Program é um program account executável. Os programas possuem os mesmos campos subjacentes que todas as contas, mas com diferenças importantes.

O exemplo do Token Program utiliza a codificação base64 para retornar os dados brutos do program account.

Os passos a seguir percorrem os campos dentro de value na ordem em que os campos aparecem.

O campo data armazena o estado do program account do BPF Upgradeable Loader. O primeiro item da tupla contém os dados completos da conta codificados em base64. O segundo item da tupla identifica a codificação. Aqui, os 36 bytes incluem metadados e o endereço do programdata account.

Para programas atualizáveis, o estado do program account aponta para o programdata account separado que armazena o código executável do programa.

O campo executable está definido como true, o que indica que o endereço da conta pode ser invocado como um programa.

O campo lamports contém o saldo em SOL mantido pelo program account. Os program accounts precisam de lamports suficientes para permanecer isentos de rent.

Todo program account é de propriedade de um programa carregador. Para o Token Program account, o owner é o BPF Upgradeable Loader.

O campo rentEpoch é um campo legado de um mecanismo de rent descontinuado. O campo ainda é retornado por compatibilidade retroativa.

O campo space mostra o tamanho total dos dados do program account em bytes. O valor de space é apenas 36 bytes porque o program account armazena metadados do carregador e o endereço do ProgramData account, e não o programa compilado completo.

A resposta anterior retornou o campo data do program account como uma tupla base64. A resposta analisada desserializa esses bytes em campos nomeados no objeto data. O campo programData contém o endereço do ProgramData account que armazena o código executável do programa.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Buscar um mint account

Um mint account é uma conta pertencente ao Token Program que armazena metadados globais de um token específico. O mint account armazena o fornecimento total do token, o número de casas decimais, a autoridade de cunhagem e a autoridade de congelamento. O endereço do mint account identifica exclusivamente um token na rede Solana.

O exemplo abaixo busca o mint account do USD Coin para demonstrar como o estado de um programa é armazenado em uma conta separada. Os valores exatos de saldos e fornecimento podem variar dependendo do slot que o seu nó RPC utiliza para leitura.

Fetch mint account
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await client.rpc
.getAccountInfo(mintAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
Console
Click to execute the code.

Mint accounts armazenam estado, não código executável. Mint accounts são de propriedade do Token Program, que inclui instruções que definem como criar e atualizar mint accounts.

Os passos a seguir descrevem os campos dentro de value na ordem em que os campos aparecem.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

O campo data contém o estado serializado da conta Mint. O primeiro item da tupla contém os 82 bytes completos dos dados da conta codificados em base64. O segundo item da tupla identifica a codificação.

Para ler a partir de um mint account, você deve desserializar o campo data no tipo de dados Mint, conforme mostrado no próximo exemplo.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

O campo executable indica se a conta pode ser invocada como um programa. Mint accounts armazenam estado, portanto o campo executable é false.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

O campo lamports contém o saldo em SOL mantido pelo mint account. O valor em lamports é o saldo isento de aluguel do mint account, não o fornecimento do token.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

O mint account é de propriedade do Token Program. O campo data do mint account só pode ser modificado pelas instruções do Token Program.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

O campo rentEpoch é um campo legado de um mecanismo de rent obsoleto. O campo ainda é retornado para compatibilidade retroativa.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

O campo space mostra que o mint account contém 82 bytes de dados.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Mint accounts armazenam estado, não código executável. Mint accounts são de propriedade do Token Program, que inclui instruções que definem como criar e atualizar mint accounts.

Os passos a seguir descrevem os campos dentro de value na ordem em que os campos aparecem.

O campo data contém o estado serializado da conta Mint. O primeiro item da tupla contém os 82 bytes completos dos dados da conta codificados em base64. O segundo item da tupla identifica a codificação.

Para ler a partir de um mint account, você deve desserializar o campo data no tipo de dados Mint, conforme mostrado no próximo exemplo.

O campo executable indica se a conta pode ser invocada como um programa. Mint accounts armazenam estado, portanto o campo executable é false.

O campo lamports contém o saldo em SOL mantido pelo mint account. O valor em lamports é o saldo isento de aluguel do mint account, não o fornecimento do token.

O mint account é de propriedade do Token Program. O campo data do mint account só pode ser modificado pelas instruções do Token Program.

O campo rentEpoch é um campo legado de um mecanismo de rent obsoleto. O campo ainda é retornado para compatibilidade retroativa.

O campo space mostra que o mint account contém 82 bytes de dados.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Desserializar mint account

Os dados da conta são armazenados no campo data em formato serializado. Para ler esses dados como campos como supply ou decimals, desserialize o campo data no tipo de conta definido pelo programa proprietário. A maioria dos programas Solana fornece bibliotecas cliente com funções auxiliares para esta etapa. Esses auxiliares retornam dados de conta estruturados, tornando o resultado mais fácil de trabalhar.

Por exemplo, a biblioteca @solana-program/token inclui a função fetchMint() para buscar um mint account e desserializar o campo data do mint account no tipo de dados Mint definido pelo Token Program.

Deserialize mint account data
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
import { fetchMint } from "@solana-program/token";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mint = await fetchMint(client.rpc, mintAddress);
console.log(mint);
Console
Click to execute the code.
Mint account type
pub struct Mint {
/// Optional authority used to mint new tokens. The mint authority may only
/// be provided during mint creation. If no mint authority is present
/// then the mint has a fixed supply and no further tokens may be
/// minted.
pub mint_authority: COption<Pubkey>,
/// Total supply of tokens.
pub supply: u64,
/// Number of base 10 digits to the right of the decimal place.
pub decimals: u8,
/// Is `true` if this structure has been initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

A função fetchMint() busca um mint account e desserializa o campo data do mint account no tipo de conta Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Você pode visualizar os dados completamente desserializados da mint account no Solana Explorer.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo address contém o endereço da mint account.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo data contém o estado desserializado da conta Mint. Os campos aninhados em data são provenientes do tipo de conta Mint do Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo data.mintAuthority indica a única conta autorizada a criar novas unidades do token.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo supply exibe o número total de tokens que foram emitidos. O valor do supply é medido na menor unidade do token. Para obter o supply total em unidades padrão, ajuste o valor do campo supply pelo decimals.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo decimals indica o número de casas decimais do token.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo isInitialized indica se a mint account foi inicializada. O campo isInitialized é uma verificação de segurança utilizada no Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo data.freezeAuthority mostra a conta com autoridade para congelar token accounts. Uma token account é uma conta separada que armazena unidades de um token para um proprietário. Quando congelada, uma token account não pode transferir nem queimar seu saldo de tokens.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo executable é falso. O mint account do USDC armazena o estado do token, portanto o mint account do USDC não pode ser invocado como um programa.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo lamports contém o saldo em SOL mantido pelo mint account. O valor em lamports é o saldo isento de aluguel do mint account, não o fornecimento de tokens.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo programAddress mostra o programa que é proprietário do mint account. Para o USDC, o programa proprietário é o Token Program. Apenas o programa que possui uma conta pode modificar seu campo data por meio das instruções implantadas do programa.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

O campo space mostra o tamanho dos dados originais do mint account em bytes. A conta Mint base do Token Program tem 82 bytes.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

A função fetchMint() busca um mint account e desserializa o campo data do mint account no tipo de conta Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Você pode visualizar os dados completamente desserializados da mint account no Solana Explorer.

O campo address contém o endereço da mint account.

O campo data contém o estado desserializado da conta Mint. Os campos aninhados em data são provenientes do tipo de conta Mint do Token Program.

O campo data.mintAuthority indica a única conta autorizada a criar novas unidades do token.

O campo supply exibe o número total de tokens que foram emitidos. O valor do supply é medido na menor unidade do token. Para obter o supply total em unidades padrão, ajuste o valor do campo supply pelo decimals.

O campo decimals indica o número de casas decimais do token.

O campo isInitialized indica se a mint account foi inicializada. O campo isInitialized é uma verificação de segurança utilizada no Token Program.

O campo data.freezeAuthority mostra a conta com autoridade para congelar token accounts. Uma token account é uma conta separada que armazena unidades de um token para um proprietário. Quando congelada, uma token account não pode transferir nem queimar seu saldo de tokens.

O campo executable é falso. O mint account do USDC armazena o estado do token, portanto o mint account do USDC não pode ser invocado como um programa.

O campo lamports contém o saldo em SOL mantido pelo mint account. O valor em lamports é o saldo isento de aluguel do mint account, não o fornecimento de tokens.

O campo programAddress mostra o programa que é proprietário do mint account. Para o USDC, o programa proprietário é o Token Program. Apenas o programa que possui uma conta pode modificar seu campo data por meio das instruções implantadas do programa.

O campo space mostra o tamanho dos dados originais do mint account em bytes. A conta Mint base do Token Program tem 82 bytes.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Saída serializada vs. desserializada

Ambos os exemplos leem o mesmo mint account do USDC. A primeira resposta deixa o campo data serializado. Para ler o conteúdo do mint account, decodifique esses dados como o tipo de conta definido pelo programa proprietário. Para um mint account, o Token Program define o tipo Mint mostrado à direita.

Antes de decodificar, o campo data contém dados de conta serializados.

Serialized mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Após decodificar os dados como Mint, o campo data contém campos de conta nomeados.

Deserialized mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Is this page helpful?

Índice

Editar Página
© 2026 Fundação Solana. Todos os direitos reservados.