Typescript
Token2022 com Web3.js

Token2022 com Web3.js

A Extensão Interest Bearing

A extensão InterestBearing é uma extensão de conta Mint que permite aos usuários aplicar uma taxa de juros aos seus tokens e recuperar o total atualizado, incluindo juros, a qualquer momento.

Inicializando a Conta Mint

Para inicializar a extensão InterestBearing em uma conta Mint vamos precisar da função interestBearingMint().

Aqui está como criar uma mint com a extensão Interest Bearing:

ts
import { Keypair, SystemProgram, Transaction, sendAndConfirmTransaction } from "@solana/web3.js";
import {
  createInitializeMintInstruction,
  createInitializeInterestBearingMintInstruction,
  getMintLen,
  ExtensionType,
  TOKEN_2022_PROGRAM_ID,
} from "@solana/spl-token";

const mint = Keypair.generate();

// Calcular o tamanho necessário para uma conta Mint com extensão Interest Bearing
const mintLen = getMintLen([ExtensionType.InterestBearingConfig]);

// Calcular lamports mínimos necessários para isenção de aluguel
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);

// Criar a conta com o tamanho e owner corretos
const createAccountInstruction = SystemProgram.createAccount({
  fromPubkey: keypair.publicKey,
  newAccountPubkey: mint.publicKey,
  space: mintLen,
  lamports,
  programId: TOKEN_2022_PROGRAM_ID,
});

// Inicializar a extensão Interest Bearing
const initializeMintInterestBearing = createInitializeInterestBearingMintInstruction(
  mint.publicKey,
  keypair.publicKey,
  500,
  TOKEN_2022_PROGRAM_ID,
);

// Inicializar a própria mint
const initializeMintInstruction = createInitializeMintInstruction(
  mint.publicKey,
  6,
  keypair.publicKey,
  null,
  TOKEN_2022_PROGRAM_ID,
);

// Combinar todas as instruções na ordem correta
const transaction = new Transaction().add(
  createAccountInstruction,
  initializeMintNonTransferable,
  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
[40 more lines]

Calculando os Juros

A extensão InterestBearing não gera novos tokens; o valor exibido simplesmente inclui os juros acumulados através da função amount_to_ui_amount, tornando a mudança puramente estética.

Então, após fazer o unpack da conta Token da qual queremos calcular os juros, é fácil obter toda a informação que precisamos para realizar o cálculo e obter o valor dos juros.

Felizmente para nós, nem precisamos fazer isso, já que podemos usar a função amountToUiAmount assim:

ts
const tokenInfo = await getAccount(connection, tokenAccount, undefined, TOKEN_2022_PROGRAM_ID);

console.log("Quantidade de Tokens: ", tokenInfo.amount);

const uiAmount = await amountToUiAmount(
  connection,
  keypair,
  mint.publicKey,
  tokenInfo.amount,
  TOKEN_2022_PROGRAM_ID,
);

console.log("Valor UI: ", uiAmount);

Atualizando a Extensão Interest Bearing

Com a extensão InterestBearing é possível alterar os juros produzidos pela conta de token graças à forma como seus dados são estruturados:

rust
pub struct InterestBearing {
    pub rate_authority: Pubkey,
    pub initialization_timestamp: i64,
    pub pre_update_average_rate: u16,
    pub last_update_timestamp: i64,
    pub current_rate: u16,
}

Para fazer isso, podemos usar a função updateRateInterestBearingMint assim:

ts
const updateRateInstruction = await createUpdateRateInterestBearingMintInstruction(
  mint.publicKey,
  newRateAuthority.publicKey,
  1000, // taxa atualizada
  undefined,
  TOKEN_2022_PROGRAM_ID,
);

E se quisermos, podemos mudar a autoridade sobre a definição dos juros usando a função setAuthority e passando o AuthorityType correto assim:

ts
const setAuthorityInstruction = await createSetAuthorityInstruction(
  mint.publicKey,
  keypair.publicKey,
  AuthorityType.InterestRate,
  newRateAuthority.publicKey,
  [],
  TOKEN_2022_PROGRAM_ID,
);
Blueshift © 2026Commit: 3c44267