L'Extension Interest Bearing
L'extension InterestBearing
(Porteur d'Intérêts) est une extension de compte de Mint
qui permet aux utilisateurs d'appliquer un taux d'intérêt à leurs jetons et de récupérer le total mis à jour, intérêts compris, à tout moment.
Initialisation du Compte de Mint
Pour initialiser l'extension InterestBearing
sur un compte de Mint
nous allons avoir besoin de la fonction interestBearingMint()
.
Voici comment créer un compte de mint avec l'extension InterestBearing
:
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();
// Calculate the size needed for a Mint account with Interest Bearing extension
const mintLen = getMintLen([ExtensionType.InterestBearingConfig]);
// Calculate minimum lamports required for rent exemption
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);
// Create the account with the correct size and owner
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: keypair.publicKey,
newAccountPubkey: mint.publicKey,
space: mintLen,
lamports,
programId: TOKEN_2022_PROGRAM_ID,
});
// Initialize the Interest Bearing extension
const initializeMintInterestBearing = createInitializeInterestBearingMintInstruction(
mint.publicKey,
keypair.publicKey,
500,
TOKEN_2022_PROGRAM_ID,
);
// Initialize the mint itself
const initializeMintInstruction = createInitializeMintInstruction(
mint.publicKey,
6,
keypair.publicKey,
null,
TOKEN_2022_PROGRAM_ID,
);
// Combine all instructions in the correct order
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintNonTransferable,
initializeMintInstruction,
);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, mint]);
console.log(`Mint created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);
Calcul des Intérêts
L'extension InterestBearing
ne génère pas de nouveaux jetons. Le montant affiché inclut simplement les intérêts cumulés via la fonction amount_to_ui_amount
, ce qui rend le changement purement esthétique.
Ainsi, après avoir unpacking
("déballé") le compte de Token
dont nous voulons calculer les intérêts, il est facile d'obtenir toutes les informations dont nous avons besoin pour calculer le montant des intérêts.
Heureusement pour nous, nous n'avons même pas besoin de le faire, car nous pouvons utiliser la fonction amountToUiAmount
comme ceci :
const tokenInfo = await getAccount(
connection,
tokenAccount,
undefined,
TOKEN_2022_PROGRAM_ID,
);
console.log("Token Amount: ", tokenInfo.amount);
const uiAmount = await amountToUiAmount(
connection,
keypair,
mint.publicKey,
tokenInfo.amount,
TOKEN_2022_PROGRAM_ID,
);
console.log("UI Amount: ", uiAmount);
Mettre à Jour l'Extension Interest Bearing
Avec l'extension InterestBearing
, il est possible de modifier les intérêts générés par le Compte de Jeton grâce à la manière dont ses données sont structurées :
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,
}
Pour cela, nous pouvons utiliser la fonction updateRateInterestBearingMint
comme ci :
const updateRateInstruction = await createUpdateRateInterestBearingMintInstruction(
mint.publicKey,
newRateAuthority.publicKey,
1000, // updated rate
undefined,
TOKEN_2022_PROGRAM_ID,
);
Et si nous le souhaitons, nous pouvons modifier l'autorité chargée de définir les intérêts à l'aide de la fonction setAuthority
en spécifiant le bon AuthorityType
comme ci :
const setAuthorityInstruction = await createSetAuthorityInstruction(
mint.publicKey,
keypair.publicKey,
AuthorityType.InterestRate,
newRateAuthority.publicKey,
[],
TOKEN_2022_PROGRAM_ID,
);