Skip to main content

typhoon_token/traits/
create_mint.rs

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