Typescript
SPL Token com Web3.js

SPL Token com Web3.js

Curso SPL Token com Web3.js - Construa programas de tokens com a biblioteca Solana Web3.js

O Token Program

Na Solana, tudo relacionado a tokens é gerenciado pelo SPL Token Program e pelo Token2022 Program: o framework de tokens nativo da Solana que define como todos os tokens são criados, gerenciados e transferidos.

É um programa único e unificado que gerencia todas as operações de tokens na rede, garantindo consistência e interoperabilidade.

A decisão de ter uma interface única e unificada para todos os tokens na Solana cria uma implementação fácil que pode ser replicada em todos os dApps (aplicações descentralizadas) e integrações (como carteiras, ...)

Vamos começar instalando o pacote necessário para trabalhar com o programa SPL Token usando Web3.js:

npm i @solana/spl-token

Contas Mint e Token

Por baixo dos panos, criar uma conta Mint e Token é bastante "complicado". Há diferentes instruções que requerem diferentes inputs e contas; a conta precisa ser tornada isenta de aluguel antes que possamos realmente inicializá-la, ...

Conta Mint

Sem nenhuma abstração, criar uma conta Mint ficaria assim:

ts
import { Keypair, sendAndConfirmTransaction, SystemProgram, Transaction } from "@solana/web3.js";

import {
  createInitializeMint2Instruction,
  MINT_SIZE,
  getMinimumBalanceForRentExemptMint,
  TOKEN_PROGRAM_ID,
} from "@solana/spl-token";

const mint = Keypair.generate();

const mintRent = await getMinimumBalanceForRentExemptMint(connection);

const createAccountInstruction = SystemProgram.createAccount({
  fromPubkey: feePayer.publicKey,
  newAccountPubkey: mint.publicKey,
  space: MINT_SIZE,
  lamports: mintRent,
  programId: TOKEN_PROGRAM_ID,
});

const initializeMintInstruction = createInitializeMint2Instruction(
  mint.publicKey, // pubkey da mint
  6, // decimais
  feePayer.publicKey, // autoridade de mint
  null, // autoridade de freeze
  TOKEN_PROGRAM_ID,
);

const transaction = new Transaction().add(createAccountInstruction, initializeMintInstruction);

const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, mint]);

console.log(
  `Mint criada! Veja sua TX aqui: https://explorer.solana.com/tx/${signature}?cluster=devnet`,
);
Expand
[21 more lines]

Felizmente, o pacote @solana/spl-token tem algumas abstrações. Então podemos criar uma conta Mint com uma única função createMint() assim:

ts
const mint = await createMint(
  connection, // conexão
  keypair, // pagador
  keypair.publicKey, // autoridade de mint
  null, // autoridade de freeze
  6, // decimais
);

Conta Token

O mesmo vale para a conta Token. Se fôssemos criá-la sem abstrações, ficaria assim:

ts
import { Keypair, sendAndConfirmTransaction, SystemProgram, Transaction } from "@solana/web3.js";

import {
  createInitializeAccount3Instruction,
  ACCOUNT_SIZE,
  getMinimumBalanceForRentExemptAccount,
  TOKEN_PROGRAM_ID,
} from "@solana/spl-token";

const token = Keypair.generate();

const tokenRent = await getMinimumBalanceForRentExemptAccount(connection);

const createAccountInstruction = SystemProgram.createAccount({
  fromPubkey: feePayer.publicKey,
  newAccountPubkey: token.publicKey,
  space: ACCOUNT_SIZE,
  lamports: tokenRent,
  programId: TOKEN_PROGRAM_ID,
});

const initializeTokenInstruction = createInitializeAccount3Instruction(
  token.publicKey, // pubkey do token
  mint.publicKey, // pubkey da mint
  feePayer.publicKey, // pubkey do dono
  TOKEN_PROGRAM_ID,
);

const transaction = new Transaction().add(createAccountInstruction, initializeTokenInstruction);

const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, token]);

console.log(
  `Token criado! Veja sua TX aqui: https://explorer.solana.com/tx/${signature}?cluster=devnet`,
);
Expand
[20 more lines]

Mas assim como a conta Mint, o pacote @solana/spl-token tem abstrações para criar a conta Token. Podemos usar a função createAccount() assim:

ts
const token = await createAccount(
  connection, // conexão
  keypair, // pagador
  mint.publicKey, // pubkey da mint
  keypair.publicKey, // pubkey do dono
);

Conta Associated Token

O mesmo se aplica à conta Associated Token, mas a abstração não está relacionada à criação das contas como para as contas Mint e Token, está principalmente relacionada à derivação de endereços.

Então aqui está como criamos uma conta Associated Token sem abstrações:

ts
import { sendAndConfirmTransaction, Transaction } from "@solana/web3.js";

import {
  TOKEN_PROGRAM_ID,
  createAssociatedTokenAccountIdempotentInstruction,
  getAssociatedTokenAddress,
} from "@solana/spl-token";

const associatedTokenAccount = await getAssociatedTokenAddress(
  mint.publicKey, // pubkey da mint
  keypair.publicKey, // pubkey do dono
  false, // permitir owner off-curve
  TOKEN_PROGRAM_ID,
);

// Criar instruções de criação de ATA para todas as contas
const createAtaInstruction = createAssociatedTokenAccountIdempotentInstruction(
  keypair.publicKey, // pagador
  associatedTokenAccount, // endereço da conta associated token
  keypair.publicKey, // dono
  mint.publicKey, // mint
  TOKEN_PROGRAM_ID,
);

const transaction = new Transaction().add(createAtaInstruction);

const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);

console.log(
  `Associated Token criado! Veja sua TX aqui: https://explorer.solana.com/tx/${signature}?cluster=devnet`,
);
Expand
[16 more lines]

E aqui está como fica com abstrações:

ts
const ata = await getOrCreateAssociatedTokenAccount(
  connection, // conexão
  keypair, // pagador
  mint, // pubkey da mint
  keypair.publicKey, // pubkey do dono
);

Como você pode ver, a função se chama getOrCreateAssociatedTokenAccount(). Isso porque pode acontecer que a conta Associated Token já tenha sido criada anteriormente e não queremos que nossa transação falhe por causa disso. Então o que ela faz é criar ou apenas retornar o endereço do ATA.

Blueshift © 2026Commit: 3c44267