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