use anchor_lang::prelude::*;
use anchor_spl::token::{self, Mint, TokenAccount, Transfer};
declare_id!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
#[program]
mod nft {
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint,
entrypoint::ProgramResult,
msg,
program_error::ProgramError,
pubkey::Pubkey,
};
use spl_token::{
state::Account as TokenAccount,
instruction::{initialize_account, initialize_mint, mint_to},
};
pub struct Processor;
impl Processor {
pub fn process(
program_id: &Pubkey,
accounts: &[AccountInfo],
name: String,
symbol: String,
supply: u64,
) -> ProgramResult {
let accounts_iter = &mut accounts.iter();
let mint_info = next_account_info(accounts_iter)?;
let mint_authority_info = next_account_info(accounts_iter)?;
let destination_info = next_account_info(accounts_iter)?;
if !mint_authority_info.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
initialize_mint(program_id, mint_info, mint_authority_info, None, 0)?;
let account_info = next_account_info(accounts_iter)?;
initialize_account(program_id, account_info, mint_info.key, mint_authority_info)?;
mint_to(program_id, mint_info, destination_info, mint_authority_info, &[], supply)?;
msg!("Mint account: {}", mint_info.key);
msg!("Account account: {}", account_info.key);
msg!("Number of tokens minted: {}", supply);
Ok(())
}
}
#[entrypoint]
pub fn entry(program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult {
let (name, symbol, supply) = deserialize_input(instruction_data)?;
Processor::process(program_id, accounts, name, symbol, supply)
}
fn deserialize_input(input: &[u8]) -> Result<(String, String, u64), ProgramError> {
let (name, symbol, supply) = serde::Deserialize::deserialize(input)
.map_err(|_| ProgramError::InvalidInstructionData)?;
Ok((name, symbol, supply))
}
}