typhoon_token/traits/
create_mint.rs1use {
2 crate::{Mint, TokenProgram},
3 pinocchio::{cpi::Signer as CpiSigner, sysvars::rent::Rent, AccountView, Address},
4 pinocchio_token::instructions::InitializeMint2,
5 typhoon_accounts::{
6 Account, FromAccountInfo, InterfaceAccount, Mut, ReadableAccount, Signer, SignerCheck,
7 SystemAccount, UncheckedAccount, WritableAccount,
8 },
9 typhoon_errors::Error,
10 typhoon_traits::ProgramId,
11 typhoon_utility::create_account_with_minimum_balance_signed,
12};
13
14pub trait SplCreateMint<'a, T: ReadableAccount>
15where
16 Self: Sized + Into<&'a AccountView>,
17 T: ReadableAccount + FromAccountInfo<'a>,
18{
19 #[inline]
20 fn create_mint(
21 self,
22 rent: &Rent,
23 payer: &impl WritableAccount,
24 mint_authority: &Address,
25 decimals: u8,
26 freeze_authority: Option<&Address>,
27 seeds: Option<&[CpiSigner]>,
28 ) -> Result<Mut<T>, Error> {
29 let info = self.into();
30 create_account_with_minimum_balance_signed(
31 info,
32 Mint::LEN,
33 &TokenProgram::ID,
34 payer.as_ref(),
35 rent,
36 seeds.unwrap_or_default(),
37 )?;
38
39 InitializeMint2 {
40 mint: info,
41 mint_authority,
42 decimals,
43 freeze_authority,
44 }
45 .invoke()?;
46
47 Mut::try_from_info(info)
48 }
49}
50
51macro_rules! impl_trait {
52 ($origin: ty) => {
53 impl<'a> SplCreateMint<'a, Account<'a, Mint>> for $origin {}
54 impl<'a, C> SplCreateMint<'a, Signer<'a, Account<'a, Mint>, C>> for $origin where
55 C: SignerCheck
56 {
57 }
58 impl<'a> SplCreateMint<'a, InterfaceAccount<'a, Mint>> for $origin {}
59 impl<'a, C> SplCreateMint<'a, Signer<'a, InterfaceAccount<'a, Mint>, C>> for $origin where
60 C: SignerCheck
61 {
62 }
63 };
64}
65
66impl_trait!(&'a AccountView);
67impl_trait!(SystemAccount<'a>);
68impl_trait!(UncheckedAccount<'a>);