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`);

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: 1b88646