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