token_acl_interface/
onchain.rs1use solana_account_info::AccountInfo;
2use solana_cpi::invoke;
3use solana_instruction::AccountMeta;
4use solana_program_error::ProgramResult;
5use solana_pubkey::Pubkey;
6use spl_tlv_account_resolution::state::ExtraAccountMetaList;
7
8use crate::{
9 get_freeze_extra_account_metas_address, get_thaw_extra_account_metas_address, instruction,
10};
11
12pub fn invoke_can_thaw_permissionless<'a>(
13 program_id: &Pubkey,
14 signer: AccountInfo<'a>,
15 token_account: AccountInfo<'a>,
16 mint: AccountInfo<'a>,
17 token_account_owner: AccountInfo<'a>,
18 flag_account: AccountInfo<'a>,
19 additional_accounts: &[AccountInfo<'a>],
20) -> ProgramResult {
21 let mut instruction = instruction::can_thaw_permissionless(
22 program_id,
23 signer.key,
24 token_account.key,
25 mint.key,
26 token_account_owner.key,
27 flag_account.key,
28 );
29
30 let validation_pubkey = get_thaw_extra_account_metas_address(mint.key, program_id);
31
32 let mut cpi_account_infos = vec![
33 signer,
34 token_account,
35 mint,
36 token_account_owner,
37 flag_account,
38 ];
39
40 if let Some(validation_info) = additional_accounts
41 .iter()
42 .find(|&x| *x.key == validation_pubkey)
43 {
44 instruction
45 .accounts
46 .push(AccountMeta::new_readonly(validation_pubkey, false));
47 cpi_account_infos.push(validation_info.clone());
48
49 ExtraAccountMetaList::add_to_cpi_instruction::<
50 instruction::CanThawPermissionlessInstruction,
51 >(
52 &mut instruction,
53 &mut cpi_account_infos,
54 &validation_info.try_borrow_data()?,
55 additional_accounts,
56 )?;
57 }
58
59 invoke(&instruction, &cpi_account_infos)
60}
61
62pub fn invoke_can_freeze_permissionless<'a>(
63 program_id: &Pubkey,
64 signer: AccountInfo<'a>,
65 token_account: AccountInfo<'a>,
66 mint: AccountInfo<'a>,
67 token_account_owner: AccountInfo<'a>,
68 flag_account: AccountInfo<'a>,
69 additional_accounts: &[AccountInfo<'a>],
70) -> ProgramResult {
71 let mut instruction = instruction::can_freeze_permissionless(
72 program_id,
73 signer.key,
74 token_account.key,
75 mint.key,
76 token_account_owner.key,
77 flag_account.key,
78 );
79
80 let validation_pubkey = get_freeze_extra_account_metas_address(mint.key, program_id);
81 let mut cpi_account_infos = vec![
82 signer,
83 token_account,
84 mint,
85 token_account_owner,
86 flag_account,
87 ];
88
89 if let Some(validation_info) = additional_accounts
90 .iter()
91 .find(|&x| *x.key == validation_pubkey)
92 {
93 instruction
94 .accounts
95 .push(AccountMeta::new_readonly(validation_pubkey, false));
96 cpi_account_infos.push(validation_info.clone());
97
98 ExtraAccountMetaList::add_to_cpi_instruction::<
99 instruction::CanFreezePermissionlessInstruction,
100 >(
101 &mut instruction,
102 &mut cpi_account_infos,
103 &validation_info.try_borrow_data()?,
104 additional_accounts,
105 )?;
106 }
107
108 invoke(&instruction, &cpi_account_infos)
109}