Lendo da rede

Leia dados da rede Solana buscando diferentes contas. Este guia explica a estrutura das contas da Solana. Cada conta da Solana tem um endereço único que é 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.