use anchor_lang::prelude::*;
use mpl_token_metadata::accounts::Metadata;
use crate::{
approve_collection_authority_helper, cmp_pubkeys, constants::AUTHORITY_SEED,
revoke_collection_authority_helper, AccountVersion, ApproveCollectionAuthorityHelperAccounts,
CandyError, CandyMachine, RevokeCollectionAuthorityHelperAccounts,
};
pub fn set_collection(ctx: Context<SetCollection>) -> Result<()> {
msg!("(Deprecated as of 1.0.0) Use SetCollectionV2 instead");
let accounts = ctx.accounts;
let candy_machine = &mut accounts.candy_machine;
if !matches!(candy_machine.version, AccountVersion::V1) {
return err!(CandyError::InvalidAccountVersion);
}
if candy_machine.items_redeemed > 0 {
return err!(CandyError::NoChangingCollectionDuringMint);
} else if !cmp_pubkeys(accounts.collection_mint.key, &candy_machine.collection_mint) {
return err!(CandyError::MintMismatch);
}
let collection_metadata_info = &accounts.collection_metadata;
let collection_metadata: Metadata =
Metadata::try_from(&collection_metadata_info.to_account_info())?;
let revoke_accounts = RevokeCollectionAuthorityHelperAccounts {
authority_pda: accounts.authority_pda.to_account_info(),
collection_authority_record: accounts.collection_authority_record.to_account_info(),
collection_metadata: accounts.collection_metadata.to_account_info(),
collection_mint: accounts.collection_mint.to_account_info(),
token_metadata_program: accounts.token_metadata_program.to_account_info(),
};
revoke_collection_authority_helper(
revoke_accounts,
candy_machine.key(),
*ctx.bumps.get("authority_pda").unwrap(),
collection_metadata.token_standard,
)?;
candy_machine.collection_mint = accounts.new_collection_mint.key();
let approve_collection_authority_helper_accounts = ApproveCollectionAuthorityHelperAccounts {
payer: accounts.payer.to_account_info(),
authority_pda: accounts.authority_pda.to_account_info(),
collection_update_authority: accounts.new_collection_update_authority.to_account_info(),
collection_mint: accounts.new_collection_mint.to_account_info(),
collection_metadata: accounts.new_collection_metadata.to_account_info(),
collection_authority_record: accounts.new_collection_authority_record.to_account_info(),
token_metadata_program: accounts.token_metadata_program.to_account_info(),
system_program: accounts.system_program.to_account_info(),
};
approve_collection_authority_helper(approve_collection_authority_helper_accounts)
}
#[derive(Accounts)]
pub struct SetCollection<'info> {
#[account(mut, has_one = authority)]
candy_machine: Account<'info, CandyMachine>,
authority: Signer<'info>,
#[account(
mut, seeds = [AUTHORITY_SEED.as_bytes(), candy_machine.to_account_info().key.as_ref()],
bump
)]
authority_pda: UncheckedAccount<'info>,
payer: Signer<'info>,
collection_mint: UncheckedAccount<'info>,
collection_metadata: UncheckedAccount<'info>,
#[account(mut)]
collection_authority_record: UncheckedAccount<'info>,
#[account(mut)]
new_collection_update_authority: Signer<'info>,
new_collection_metadata: UncheckedAccount<'info>,
new_collection_mint: UncheckedAccount<'info>,
new_collection_master_edition: UncheckedAccount<'info>,
#[account(mut)]
new_collection_authority_record: UncheckedAccount<'info>,
#[account(address = mpl_token_metadata::ID)]
token_metadata_program: UncheckedAccount<'info>,
system_program: Program<'info, System>,
}