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
111
use super::*;
pub const MAX_EDITION_LEN: usize = 1 + 32 + 8 + 200;
#[repr(C)]
#[cfg_attr(feature = "serde-feature", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Eq, BorshSerialize, BorshDeserialize, ShankAccount)]
pub struct Edition {
pub key: Key,
#[cfg_attr(feature = "serde-feature", serde(with = "As::<DisplayFromStr>"))]
pub parent: Pubkey,
pub edition: u64,
}
impl Default for Edition {
fn default() -> Self {
Edition {
key: Key::EditionV1,
parent: Pubkey::default(),
edition: 0,
}
}
}
impl TokenMetadataAccount for Edition {
fn key() -> Key {
Key::EditionV1
}
fn size() -> usize {
MAX_EDITION_LEN
}
}
#[cfg(test)]
mod tests {
use borsh::BorshSerialize;
use solana_program::account_info::AccountInfo;
use solana_sdk::{signature::Keypair, signer::Signer};
use crate::{
error::MetadataError,
state::{Edition, Key, Metadata, TokenMetadataAccount},
ID,
};
#[test]
fn successfully_deserialize_edition() {
let expected_data = Edition::default();
let mut buf = Vec::new();
expected_data.serialize(&mut buf).unwrap();
Edition::pad_length(&mut buf).unwrap();
let pubkey = Keypair::new().pubkey();
let owner = &ID;
let mut lamports = 1_000_000_000;
let mut data = buf.clone();
let account_info = AccountInfo::new(
&pubkey,
false,
true,
&mut lamports,
&mut data,
owner,
false,
1_000_000_000,
);
let data = Edition::from_account_info(&account_info).unwrap();
assert_eq!(data.key, Key::EditionV1);
assert_eq!(data, expected_data);
}
#[test]
fn deserializing_wrong_account_type_fails() {
let wrong_type = Metadata::default();
let mut buf = Vec::new();
wrong_type.serialize(&mut buf).unwrap();
Metadata::pad_length(&mut buf).unwrap();
let pubkey = Keypair::new().pubkey();
let owner = &ID;
let mut lamports = 1_000_000_000;
let mut data = buf.clone();
let account_info = AccountInfo::new(
&pubkey,
false,
true,
&mut lamports,
&mut data,
owner,
false,
1_000_000_000,
);
let error = Edition::from_account_info(&account_info).unwrap_err();
assert_eq!(error, MetadataError::DataTypeMismatch.into());
}
}