solana_exec/utilities/
close_all_token_accounts.rs1use 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
9pub 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 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}