我正试图从程序内部关闭关联令牌帐户(ATA)。ATA属于该计划。我发现了一个叫做close_account
的函数,但我还没有弄清楚如何正确使用它。我正在使用锚。
我的程序的期望流程是:
- 从程序ATA向用户ATA发送令牌(我已经成功地完成了这一点)
- 关闭用于令牌 的程序ATA
close_account
的实现如下:
pub fn close_account<'a, 'b, 'c, 'info>(
ctx: CpiContext<'a, 'b, 'c, 'info, CloseAccount<'info>>,
) -> Result<()> {
let ix = spl_token::instruction::close_account(
&spl_token::ID,
ctx.accounts.account.key,
ctx.accounts.destination.key,
ctx.accounts.authority.key,
&[], // TODO: support multisig
)?;
solana_program::program::invoke_signed(
&ix,
&[
ctx.accounts.account.clone(),
ctx.accounts.destination.clone(),
ctx.accounts.authority.clone(),
],
ctx.signer_seeds,
)
.map_err(Into::into)
}
CloseAccount
结构体如下:
#[derive(Accounts)]
pub struct CloseAccount<'info> {
pub account: AccountInfo<'info>,
pub destination: AccountInfo<'info>,
pub authority: AccountInfo<'info>,
}
(我假设)帐户是ATA,权限是我的程序-但是目的地是什么在这种情况下?为什么关闭账户需要目的地,我应该使用哪个账户作为目的地账户?
在这种情况下目的地是什么?为什么关闭账户需要目的地,我应该使用哪个账户作为目的地账户?
由于令牌帐户与Solana中的任何其他帐户一样,它们必须有足够的SOL来满足最低余额要求。在关闭账户时,您必须将该SOL发送到其他地方,因此称为"目的地"。最好的选择是使用一个只用于SOL的钱包/SOL帐户。
更多信息请访问https://spl.solana.com/token#closing-accounts