solana_exec/utilities/
close_all_token_accounts.rs

1use solana_central::CentralContext;
2use solana_central::constants::SOLANA_PROGRAMS;
3use solana_client::rpc_request::TokenAccountsFilter;
4use solana_compute_budget_interface::ComputeBudgetInstruction;
5use solana_sdk::pubkey::Pubkey;
6use solana_sdk::signature::{Keypair, Signer};
7use spl_token::instruction::close_account;
8
9/// Close all token accounts for a wallet. Fetches all token accounts owned by the wallet and
10/// creates close-account instructions for up to 15 accounts. Sends and confirms the transaction
11/// via JSON RPC.
12pub fn close_all_token_accounts(keypair: &Keypair, context: &CentralContext) {
13  let token_accounts = context
14    .json_rpc_client
15    .get_token_accounts_by_owner(
16      &keypair.pubkey(),
17      TokenAccountsFilter::ProgramId(SOLANA_PROGRAMS.token_program),
18    )
19    .unwrap();
20  // println!("Token accounts, {:?}", token_accounts);
21  let mut instructions = vec![
22    ComputeBudgetInstruction::set_compute_unit_limit(200000),
23    ComputeBudgetInstruction::set_compute_unit_price(400000),
24  ];
25  let mut count = 0;
26  for token_account in token_accounts.iter() {
27    if count > 15 {
28      break;
29    }
30    instructions.push(
31      close_account(
32        &SOLANA_PROGRAMS.token_program,
33        &Pubkey::from_str_const(&*token_account.pubkey),
34        &keypair.pubkey(),
35        &keypair.pubkey(),
36        &[],
37      )
38      .unwrap(),
39    );
40    count += 1;
41  }
42  let blockhash = context.json_rpc_client.get_latest_blockhash().unwrap();
43  let message = solana_sdk::message::Message::new(&instructions, Some(&keypair.pubkey()));
44  let transaction = solana_sdk::transaction::Transaction::new(&[&keypair], message, blockhash);
45
46  let signature = context
47    .json_rpc_client
48    .send_and_confirm_transaction(&transaction)
49    .unwrap();
50  println!(
51    "close_all_token_accounts: transaction sent with signature: {}",
52    signature
53  );
54}