1#![cfg_attr(docsrs, feature(doc_cfg))]
2pub mod accounts;
6mod approve;
7mod approve_checked;
8mod burn;
9mod burn_checked;
10mod close_account;
11mod create_account;
12mod create_ata;
13mod create_ata_idempotent;
14mod create_mint;
15mod create_multisig;
16#[cfg(not(feature = "token-2022"))]
17mod create_native_mint;
18#[cfg(feature = "token-2022")]
19mod create_native_mint_2022;
20mod freeze_account;
21mod mint_to;
22mod mint_to_checked;
23mod revoke;
24mod set_authority;
25mod sync_native;
26mod thaw_account;
27mod transfer;
28mod transfer_checked;
29
30pub use approve::*;
31pub use approve_checked::*;
32pub use burn::*;
33pub use burn_checked::*;
34pub use close_account::*;
35pub use create_account::*;
36pub use create_ata::*;
37pub use create_ata_idempotent::*;
38pub use create_mint::*;
39pub use create_multisig::*;
40pub use create_native_mint::*;
41#[cfg(feature = "token-2022")]
42use create_native_mint_2022 as create_native_mint;
43pub use freeze_account::*;
44use hpsvm::{HPSVM, types::FailedTransactionMetadata};
45pub use mint_to::*;
46pub use mint_to_checked::*;
47pub use revoke::*;
48pub use set_authority::*;
49use solana_address::Address;
50use solana_program_pack::{IsInitialized, Pack};
51use solana_transaction_error::TransactionError;
52#[cfg(feature = "token-2022")]
53pub use spl_token_2022_interface as spl_token;
54#[cfg(not(feature = "token-2022"))]
55pub use spl_token_interface as spl_token;
56pub use sync_native::*;
57pub use thaw_account::*;
58pub use transfer::*;
59pub use transfer_checked::*;
60
61pub const TOKEN_ID: Address = spl_token::ID;
63
64pub fn get_spl_account<T: Pack + IsInitialized>(
66 svm: &HPSVM,
67 account: &Address,
68) -> Result<T, FailedTransactionMetadata> {
69 let account = svm.get_account(account).ok_or(FailedTransactionMetadata {
70 err: TransactionError::AccountNotFound,
71 meta: Default::default(),
72 })?;
73 let data = account.data.get(..T::LEN).ok_or(FailedTransactionMetadata {
74 err: TransactionError::InstructionError(
75 0,
76 solana_instruction::error::InstructionError::AccountDataTooSmall,
77 ),
78 meta: Default::default(),
79 })?;
80 let account = T::unpack(data)?;
81
82 Ok(account)
83}
84
85fn get_multisig_signers<'a>(
86 authority: &Address,
87 signing_pubkeys: &'a [Address],
88) -> Vec<&'a Address> {
89 if signing_pubkeys == [*authority] {
90 vec![]
91 } else {
92 signing_pubkeys.iter().collect::<Vec<_>>()
93 }
94}