Що робить заморожування токен-акаунта?
Заморожування токен-акаунта зберігає того самого власника, mint і баланс, але запобігає перекладу або спалюванню токенів з токен-акаунта, доки токен-акаунт не буде розморожено.
Заморожений акаунт все ще може бути закритий, якщо заморожений акаунт має нульовий баланс токенів.
Тільки mint, який все ще має повноваження на заморожування, може заморожувати токен-акаунти. Якщо повноваження на заморожування mint відкликано, акаунти для цього mint більше не можуть бути заморожені.
Як заморозити токен-акаунт
Заморожування токен-акаунта використовує інструкцію FreezeAccount Token
Program.
Інструкція FreezeAccount перевіряє, що токен-акаунт належить до mint і що
підписувач є повноваженням на заморожування mint, а потім змінює стан
токен-акаунта з ініціалізованого на заморожений.
Нативні токен-акаунти не підтримують заморожування.
Посилання на джерело
| Елемент | Опис | Token Program | Token Extension Program |
|---|---|---|---|
Mint | Стан mint зберігає необов'язкові повноваження на заморожування, які використовуються для заморожування токен-акаунтів. | Джерело | Джерело |
AccountState | Стани токен-акаунта, включаючи Initialized та Frozen. | Джерело | Джерело |
FreezeAccount | Інструкція, яка переводить токен-акаунт у заморожений стан. | Джерело | Джерело |
process_toggle_freeze_account | Спільна логіка процесора для заморожування та розморожування токен-акаунтів. | Джерело | Джерело |
Typescript
Наведені нижче приклади Kit демонструють рекомендований підхід з використанням
@solana/kit. Приклади застарілого підходу з використанням @solana/web3.js
наведено для довідки.
Kit
import { generateKeyPairSigner } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";import {findAssociatedTokenPda,tokenProgram,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const client = await createLocalClient().use(tokenProgram());const mint = await generateKeyPairSigner();const [tokenAccount] = await findAssociatedTokenPda({mint: mint.address,owner: client.payer.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});const result = await client.token.instructions.freezeAccount({account: tokenAccount, // Token account to freeze.mint: mint.address, // Mint for the token account being frozen.owner: client.payer // Freeze authority approving this change.}).sendTransaction();const tokenAccountData = await client.token.accounts.token.fetch(tokenAccount);console.log("Mint Address:", mint.address);console.log("\nToken Account Address:", tokenAccount);console.log("Token Account:", tokenAccountData.data);console.log("\nTransaction Signature:", result.context.signature);
Web3.js
import {createAssociatedTokenAccount,freezeAccount,createMint,getAccount,mintToChecked,TOKEN_PROGRAM_ID} from "@solana/spl-token";import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";const result = await freezeAccount(connection, // Connection to the local validator.feePayer, // Account paying transaction fees.associatedTokenAccount, // Token account to freeze.mintPubkey, // Mint for the token account being frozen.feePayer, // Freeze authority approving this change.[], // Additional multisig signers.{commitment: "confirmed" // Confirmation options for the transaction.},TOKEN_PROGRAM_ID // Token program to invoke.);const tokenAccountData = await getAccount(connection,associatedTokenAccount,"confirmed",TOKEN_PROGRAM_ID);console.log("Mint Address:", mintPubkey.toBase58());console.log("\nAssociated Token Account Address:",associatedTokenAccount.toBase58());console.log("Associated Token Account:", tokenAccountData);console.log("\nTransaction Signature:", result);
Rust
use anyhow::Result;use solana_client::nonblocking::rpc_client::RpcClient;use solana_commitment_config::CommitmentConfig;use solana_sdk::{program_pack::Pack,signature::{Keypair, Signer},transaction::Transaction,};use solana_system_interface::instruction::create_account;use spl_associated_token_account_interface::{address::get_associated_token_address, instruction::create_associated_token_account,};use spl_token_interface::{id as token_program_id,instruction::{freeze_account, initialize_mint, mint_to_checked},state::{Account, Mint},};#[tokio::main]async fn main() -> Result<()> {let client = RpcClient::new_with_commitment(String::from("http://localhost:8899"),CommitmentConfig::confirmed(),);let transaction = Transaction::new_signed_with_payer(&[freeze_account(&token_program_id(), // Token program to invoke.&associated_token_address, // Token account to freeze.&mint.pubkey(), // Mint for the token account being frozen.&fee_payer.pubkey(), // Freeze authority approving this change.&[], // Additional multisig signers.)?,],Some(&fee_payer.pubkey()),&[&fee_payer],latest_blockhash,);let transaction_signature = client.send_and_confirm_transaction(&transaction).await?;let token_account = client.get_account(&associated_token_address).await?;let token_data = Account::unpack(&token_account.data)?;println!("Mint Address: {}", mint.pubkey());println!("\nAssociated Token Account Address: {}",associated_token_address);println!("Associated Token Account: {:#?}", token_data);println!("\nTransaction Signature: {}", transaction_signature);Ok(())}
Python
#!/usr/bin/env python3import asyncioimport jsonfrom solana.rpc.async_api import AsyncClientfrom solders.keypair import Keypairfrom solders.message import Messagefrom solders.pubkey import Pubkeyfrom solders.system_program import create_account, CreateAccountParamsfrom solders.transaction import Transactionfrom spl.token.async_client import AsyncTokenfrom spl.token.instructions import (create_associated_token_account,freeze_account,FreezeAccountParams,get_associated_token_address,initialize_mint,InitializeMintParams,mint_to_checked,MintToCheckedParams,)from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_IDDECIMALS = 2AMOUNT_TO_MINT = 100async def main():rpc = AsyncClient("http://localhost:8899")async with rpc:freeze_account_instruction = freeze_account(FreezeAccountParams(program_id=TOKEN_PROGRAM_ID, # Token program to invoke.account=token_account_address, # Token account to freeze.mint=mint.pubkey(), # Mint for the token account being frozen.authority=fee_payer.pubkey(), # Freeze authority approving the freeze.))latest_blockhash = await rpc.get_latest_blockhash()transaction = Transaction([fee_payer],Message([freeze_account_instruction], fee_payer.pubkey()),latest_blockhash.value.blockhash,)result = await rpc.send_transaction(transaction)token_account_info = await token.get_account_info(token_account_address)token_account = {key: str(value) if isinstance(value, Pubkey) else valuefor key, value in token_account_info._asdict().items()}print("Mint Address:", mint.pubkey())print("\nToken Account Address:", token_account_address)print("Token Account:")print(json.dumps(token_account, indent=2))print("\nTransaction Signature:", result.value)if __name__ == "__main__":asyncio.run(main())
Is this page helpful?