Anchor
Token2022 mit Anchor

Token2022 mit Anchor

Die zinstragende Erweiterung

Die InterestBearing Erweiterung ist eine Mint Kontoerweiterung, die es Benutzern ermöglicht, einen Zinssatz auf ihre Token anzuwenden und den aktualisierten Gesamtbetrag, einschließlich Zinsen, zu jedem beliebigen Zeitpunkt abzurufen.

Initialisierung des Mint-Kontos

Da Anchor keine Makros für die interest_bearing Erweiterung hat, werden wir ein Mint Konto mit den rohen CPIs erstellen.

Hier ist, wie man einen Mint mit der Transfer Fee-Erweiterung erstellt:

rust
use anchor_lang::prelude::*;
use anchor_lang::system_program::{create_account, CreateAccount};
use anchor_spl::{
    token_2022::{
        initialize_mint2,
        spl_token_2022::{extension::ExtensionType, pod::PodMint},
        InitializeMint2,
    },
    token_interface::{
        interest_bearing_mint_initialize, InterestBearingMintInitialize, Mint, Token2022,
    },
};

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,
    #[account(mut)]
    pub mint_account: Signer<'info>,
    pub token_program: Program<'info, Token2022>,
    pub system_program: Program<'info, System>,
}

pub fn initialize_interest_bearing_config(
    ctx: Context<Initialize>,
    rate: i16
) -> Result<()> {
    // Calculate space required for mint and extension data
    let mint_size =
        ExtensionType::try_calculate_account_len::<PodMint>(&[ExtensionType::InterestBearingConfig])?;

    // Calculate minimum lamports required for size of mint account with extensions
    let lamports = (Rent::get()?).minimum_balance(mint_size);

    // Invoke System Program to create new account with space for mint and extension data
    create_account(
        CpiContext::new(
            ctx.accounts.system_program.to_account_info(),
            CreateAccount {
                from: ctx.accounts.payer.to_account_info(),
                to: ctx.accounts.mint_account.to_account_info(),
            },
        ),
        lamports,                          // Lamports
        mint_size as u64,                  // Space
        &ctx.accounts.token_program.key(), // Owner Program
    )?;

    // Initialize the InterestBearingConfig extension
    // This instruction must come before the instruction to initialize the mint data
    interest_bearing_mint_initialize(
        CpiContext::new(
            ctx.accounts.token_program.to_account_info(),
            InterestBearingMintInitialize {
                token_program_id: ctx.accounts.token_program.to_account_info(),
                mint: ctx.accounts.mint_account.to_account_info(),
            },
        ),
        Some(ctx.accounts.payer.key()),
        rate,
    )?;

    // Initialize the standard mint account data
    initialize_mint2(
        CpiContext::new(
            ctx.accounts.token_program.to_account_info(),
            InitializeMint2 {
                mint: ctx.accounts.mint_account.to_account_info(),
            },
        ),
        2,                               // decimals
        &ctx.accounts.payer.key(),       // mint authority
        Some(&ctx.accounts.payer.key()), // freeze authority
    )?;

    Ok(())
}

Berechnung der Zinsen

Die InterestBearing Erweiterung generiert keine neuen Token; der angezeigte Betrag enthält einfach die angesammelten Zinsen durch die amount_to_ui_amount Funktion, wodurch die Änderung rein optischer Natur ist.

Nachdem wir also unpacking das Token Konto, für das wir die Zinsen berechnen möchten, ist es einfach, alle Informationen zu erhalten, die wir für die Berechnung des Zinsbetrags benötigen.

Glücklicherweise müssen wir das nicht einmal selbst tun, da wir die amountToUiAmount Funktion wie folgt verwenden können:

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

Aktualisierung der zinstragenden Erweiterung

Mit der InterestBearing Erweiterung ist es möglich, die vom Token-Konto erzeugten Zinsen zu ändern, dank der Art und Weise, wie seine Daten strukturiert sind:

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,
}

Dazu können wir die interest_bearing_mint_update_rate() Anweisung wie folgt verwenden:

ts
interest_bearing_mint_update_rate(
    CpiContext::new(
        ctx.accounts.token_program.to_account_info(),
        InterestBearingMintUpdateRate {
            token_program_id: ctx.accounts.token_program.to_account_info(),
            mint: ctx.accounts.mint_account.to_account_info(),
            rate_authority: ctx.accounts.authority.to_account_info(),
        },
    ),
    rate,
)?;

Und wenn wir möchten, können wir die Autorität über die Zinseinstellung mit der set_authority() Funktion ändern und die richtige AuthorityType wie folgt übergeben:

ts
set_authority(
    CpiContext::new(
        ctx.accounts.token_program.to_account_info(),
        SetAuthority {
            current_authority: ctx.accounts.authority.to_account_info,
            account_or_mint: ctx.accounts.mint.to_account_info,
        }
    ),
    spl_token_2022::instruction::AuthorityType::InterestRate,
    new_authority,
)?;
Blueshift © 2025Commit: e573eab