Skip to main content

typhoon_token/traits/
create_mint.rs

1use {
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>);