mpl_token_metadata/processor/metadata/
puff_metadata.rs

1use borsh::BorshSerialize;
2use solana_program::{
3    account_info::{next_account_info, AccountInfo},
4    entrypoint::ProgramResult,
5    pubkey::Pubkey,
6};
7
8use crate::{
9    assertions::assert_owned_by,
10    state::{Metadata, TokenMetadataAccount, EDITION, PREFIX},
11    utils::puff_out_data_fields,
12};
13
14/// Puff out the variable length fields to a fixed length on a metadata
15/// account in a permissionless way.
16pub fn process_puff_metadata_account(
17    program_id: &Pubkey,
18    accounts: &[AccountInfo],
19) -> ProgramResult {
20    let account_info_iter = &mut accounts.iter();
21
22    let metadata_account_info = next_account_info(account_info_iter)?;
23    let mut metadata = Metadata::from_account_info(metadata_account_info)?;
24
25    assert_owned_by(metadata_account_info, program_id)?;
26
27    puff_out_data_fields(&mut metadata);
28
29    let edition_seeds = &[
30        PREFIX.as_bytes(),
31        program_id.as_ref(),
32        metadata.mint.as_ref(),
33        EDITION.as_bytes(),
34    ];
35    let (_, edition_bump_seed) = Pubkey::find_program_address(edition_seeds, program_id);
36    metadata.edition_nonce = Some(edition_bump_seed);
37
38    metadata.serialize(&mut *metadata_account_info.try_borrow_mut_data()?)?;
39    Ok(())
40}