1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use borsh::BorshSerialize;
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
program_error::ProgramError,
pubkey::Pubkey,
};
use spl_token::state::Account;
use crate::{
assertions::{assert_initialized, assert_owned_by},
error::MetadataError,
state::{Metadata, TokenMetadataAccount},
};
pub fn process_update_primary_sale_happened_via_token(
program_id: &Pubkey,
accounts: &[AccountInfo],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let metadata_account_info = next_account_info(account_info_iter)?;
let owner_info = next_account_info(account_info_iter)?;
let token_account_info = next_account_info(account_info_iter)?;
let token_account: Account = assert_initialized(token_account_info)?;
let mut metadata = Metadata::from_account_info(metadata_account_info)?;
assert_owned_by(metadata_account_info, program_id)?;
assert_owned_by(token_account_info, &spl_token::id())?;
if !owner_info.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
if token_account.owner != *owner_info.key {
return Err(MetadataError::OwnerMismatch.into());
}
if token_account.amount == 0 {
return Err(MetadataError::NoBalanceInAccountForAuthorization.into());
}
if token_account.mint != metadata.mint {
return Err(MetadataError::MintMismatch.into());
}
metadata.primary_sale_happened = true;
metadata.serialize(&mut *metadata_account_info.try_borrow_mut_data()?)?;
Ok(())
}