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
use mpl_utils::assert_signer;
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
program::invoke_signed,
pubkey::Pubkey,
};
use spl_token::{instruction::thaw_account, state::Mint};
use crate::{
assertions::{
assert_delegated_tokens, assert_derivation, assert_freeze_authority_matches_mint,
assert_initialized, assert_owned_by, edition::assert_edition_is_not_programmable,
},
error::MetadataError,
state::{EDITION, PREFIX},
};
pub fn process_thaw_delegated_account(
program_id: &Pubkey,
accounts: &[AccountInfo],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let delegate_info = next_account_info(account_info_iter)?;
let token_account_info = next_account_info(account_info_iter)?;
let edition_info = next_account_info(account_info_iter)?;
let mint_info = next_account_info(account_info_iter)?;
let token_program_account_info = next_account_info(account_info_iter)?;
if *token_program_account_info.key != spl_token::id() {
return Err(MetadataError::InvalidTokenProgram.into());
}
let mint: Mint = assert_initialized(mint_info)?;
assert_owned_by(edition_info, program_id)?;
assert_freeze_authority_matches_mint(&mint.freeze_authority, edition_info)?;
assert_signer(delegate_info)?;
assert_delegated_tokens(delegate_info, mint_info, token_account_info)?;
let edition_info_path = Vec::from([
PREFIX.as_bytes(),
program_id.as_ref(),
mint_info.key.as_ref(),
EDITION.as_bytes(),
]);
let edition_info_path_bump_seed = &[assert_derivation(
program_id,
edition_info,
&edition_info_path,
)?];
assert_edition_is_not_programmable(edition_info)?;
let mut edition_info_seeds = edition_info_path.clone();
edition_info_seeds.push(edition_info_path_bump_seed);
invoke_signed(
&thaw_account(
token_program_account_info.key,
token_account_info.key,
mint_info.key,
edition_info.key,
&[],
)
.unwrap(),
&[
token_account_info.clone(),
mint_info.clone(),
edition_info.clone(),
],
&[&edition_info_seeds],
)?;
Ok(())
}