Skip to main content

token_acl_interface/
onchain.rs

1use 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}