Congelar cuenta

¿Qué Hace Congelar una Cuenta de Tokens?

Congelar una cuenta de tokens mantiene el mismo propietario, mint y saldo, pero impide que la cuenta de tokens transfiera o queme tokens hasta que la cuenta de tokens sea descongelada.

Una cuenta congelada aún puede cerrarse si la cuenta congelada tiene un saldo de tokens de cero.

Solo un mint que todavía tiene una autoridad de congelación puede congelar cuentas de tokens. Si se revoca la autoridad de congelación de un mint, las cuentas para ese mint ya no pueden ser congeladas.

Cómo Congelar una Cuenta de Tokens

Congelar una cuenta de tokens utiliza la instrucción FreezeAccount del Token Program.

La instrucción FreezeAccount verifica que la cuenta de tokens pertenezca al mint y que el firmante sea la autoridad de congelación del mint, luego cambia el estado de la cuenta de tokens de inicializado a congelado.

Las cuentas de tokens nativas no admiten congelación.

Referencia de Código Fuente

ElementoDescripciónToken ProgramToken Extensions Program
MintEl estado del mint almacena la autoridad de congelación opcional utilizada para congelar cuentas de tokens.FuenteFuente
AccountStateLos estados de la cuenta de tokens, incluidos Initialized y Frozen.FuenteFuente
FreezeAccountUna instrucción que cambia una cuenta de tokens al estado congelado.FuenteFuente
process_toggle_freeze_accountLógica de procesador compartida para congelar y descongelar cuentas de tokens.FuenteFuente

Typescript

Los ejemplos de Kit a continuación muestran el enfoque recomendado utilizando @solana/kit. Los ejemplos heredados que utilizan @solana/web3.js se incluyen como referencia.

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);
Console
Click to execute the code.

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);
Console
Click to execute the code.

Rust

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(())
}
Console
Click to execute the code.

Python

Python
#!/usr/bin/env python3
import asyncio
import json
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.message import Message
from solders.pubkey import Pubkey
from solders.system_program import create_account, CreateAccountParams
from solders.transaction import Transaction
from spl.token.async_client import AsyncToken
from 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_ID
DECIMALS = 2
AMOUNT_TO_MINT = 100
async 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 value
for 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())
Console
Click to execute the code.

Is this page helpful?

Tabla de Contenidos

Editar Página

Gestionado por

© 2026 Fundación Solana.
Todos los derechos reservados.
Conéctate