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:
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:
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:
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:
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:
const setAuthorityInstruction = await createSetAuthorityInstruction(
mint.publicKey,
keypair.publicKey,
AuthorityType.InterestRate,
newRateAuthority.publicKey,
[],
TOKEN_2022_PROGRAM_ID,
);