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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::{
error::MetadataError,
state::{Data, DataV2, Metadata, TokenMetadataAccount},
utils::{
assert_data_valid, assert_owned_by, assert_update_authority_is_correct,
process_create_metadata_accounts_logic, puff_out_data_fields,
CreateMetadataAccountsLogicArgs,
},
};
use borsh::BorshSerialize;
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
pubkey::Pubkey,
};
pub fn process_deprecated_create_metadata_accounts<'a>(
program_id: &'a Pubkey,
accounts: &'a [AccountInfo<'a>],
data: Data,
allow_direct_creator_writes: bool,
is_mutable: bool,
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let metadata_account_info = next_account_info(account_info_iter)?;
let mint_info = next_account_info(account_info_iter)?;
let mint_authority_info = next_account_info(account_info_iter)?;
let payer_account_info = next_account_info(account_info_iter)?;
let update_authority_info = next_account_info(account_info_iter)?;
let system_account_info = next_account_info(account_info_iter)?;
let rent_info = next_account_info(account_info_iter)?;
process_create_metadata_accounts_logic(
program_id,
CreateMetadataAccountsLogicArgs {
metadata_account_info,
mint_info,
mint_authority_info,
payer_account_info,
update_authority_info,
system_account_info,
rent_info,
},
DataV2 {
name: data.name,
uri: data.uri,
symbol: data.symbol,
creators: data.creators,
seller_fee_basis_points: data.seller_fee_basis_points,
collection: None,
uses: None,
},
allow_direct_creator_writes,
is_mutable,
false,
false,
None,
)
}
pub fn process_deprecated_update_metadata_accounts(
program_id: &Pubkey,
accounts: &[AccountInfo],
optional_data: Option<Data>,
update_authority: Option<Pubkey>,
primary_sale_happened: Option<bool>,
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let metadata_account_info = next_account_info(account_info_iter)?;
let update_authority_info = next_account_info(account_info_iter)?;
let mut metadata: Metadata = Metadata::from_account_info(metadata_account_info)?;
assert_owned_by(metadata_account_info, program_id)?;
assert_update_authority_is_correct(&metadata, update_authority_info)?;
if let Some(data) = optional_data {
if metadata.is_mutable {
assert_data_valid(
&data,
update_authority_info.key,
&metadata,
false,
update_authority_info.is_signer,
true,
)?;
metadata.data = data;
} else {
return Err(MetadataError::DataIsImmutable.into());
}
}
if let Some(val) = update_authority {
metadata.update_authority = val;
}
if let Some(val) = primary_sale_happened {
if val {
metadata.primary_sale_happened = val
} else {
return Err(MetadataError::PrimarySaleCanOnlyBeFlippedToTrue.into());
}
}
puff_out_data_fields(&mut metadata);
metadata.serialize(&mut *metadata_account_info.data.borrow_mut())?;
Ok(())
}