mpl_token_metadata/
utils.rs1use borsh::BorshDeserialize;
2
3use crate::{
4 errors::MplTokenMetadataError,
5 types::{Key, TokenStandard},
6};
7
8const TOKEN_STANDARD_OFFSET: usize = 1;
11
12pub fn clean(value: String) -> String {
14 value.replace('\0', "")
15}
16
17pub fn assert_edition_is_programmable(edition_data: &[u8]) -> Result<(), MplTokenMetadataError> {
19 if edition_data.len() > TOKEN_STANDARD_OFFSET {
20 let key = Key::deserialize(&mut &edition_data[0..1])
22 .map_err(|_error| MplTokenMetadataError::InvalidEditionKey)?;
23
24 return match key {
25 Key::MasterEditionV1 | Key::MasterEditionV2 => {
26 let standard = TokenStandard::deserialize(
28 &mut &edition_data[edition_data.len() - TOKEN_STANDARD_OFFSET..],
29 )
30 .map_err(|_error| MplTokenMetadataError::InvalidTokenStandard)?;
31
32 return match standard {
33 TokenStandard::ProgrammableNonFungible
34 | TokenStandard::ProgrammableNonFungibleEdition => Ok(()),
35 _ => Err(MplTokenMetadataError::InvalidTokenStandard),
36 };
37 }
38 _ => Err(MplTokenMetadataError::InvalidEditionKey),
39 };
40 }
41
42 Err(MplTokenMetadataError::InvalidMasterEditionAccountLength)
43}