cyfs_base_meta/
nft.rs

1use cyfs_base::*;
2use serde::{Serialize, Deserialize};
3use cyfs_core::NFTListDesc;
4
5#[derive(RawEncode, RawDecode, Clone, Serialize, Deserialize, Debug, Eq, PartialEq)]
6pub enum NFTState {
7    Normal,
8    Auctioning((u64, CoinTokenId, u64)),
9    Selling((u64, CoinTokenId, u64)),
10}
11
12#[derive(RawEncode, RawDecode, Clone, Debug)]
13pub enum NFTDesc {
14    FileDesc(FileDesc),
15    FileDesc2((FileDesc, Option<ObjectId>)),
16    ListDesc(NFTListDesc)
17}
18
19impl NFTDesc {
20    pub fn nft_id(&self) -> ObjectId {
21        match self {
22            NFTDesc::FileDesc(desc) => {
23                desc.calculate_id()
24            }
25            NFTDesc::ListDesc(desc) => {
26                desc.calculate_id()
27            }
28            NFTDesc::FileDesc2((desc, _)) => {
29                desc.calculate_id()
30            }
31        }
32    }
33
34    pub fn nft_label(&self) -> HashValue {
35        match self {
36            NFTDesc::FileDesc(desc) => {
37                desc.content().hash().clone()
38            }
39            NFTDesc::ListDesc(desc) => {
40                HashValue::try_from(desc.calculate_id().as_slice()).unwrap()
41            }
42            NFTDesc::FileDesc2((desc, _)) => {
43                desc.content().hash().clone()
44            }
45        }
46    }
47
48    pub fn nft_create_time(&self) -> u64 {
49        match self {
50            NFTDesc::FileDesc(desc) => {
51                desc.create_time()
52            }
53            NFTDesc::ListDesc(desc) => {
54                desc.create_time()
55            }
56            NFTDesc::FileDesc2((desc, _)) => {
57                desc.create_time()
58            }
59        }
60    }
61
62    pub fn owner_id(&self) -> &Option<ObjectId> {
63        match self {
64            NFTDesc::FileDesc(desc) => {
65                desc.owner()
66            }
67            NFTDesc::ListDesc(desc) => {
68                desc.owner()
69            }
70            NFTDesc::FileDesc2((desc, _)) => {
71                desc.owner()
72            }
73        }
74    }
75
76    pub fn author_id(&self) -> &Option<ObjectId> {
77        match self {
78            NFTDesc::FileDesc(desc) => {
79                if desc.author().is_some() {
80                    desc.author()
81                } else {
82                    desc.owner()
83                }
84            }
85            NFTDesc::ListDesc(desc) => {
86                if desc.author().is_some() {
87                    desc.author()
88                } else {
89                    desc.owner()
90                }
91            }
92            NFTDesc::FileDesc2((desc, _)) => {
93                if desc.author().is_some() {
94                    desc.author()
95                } else {
96                    desc.owner()
97                }
98            }
99        }
100    }
101
102    pub fn parent_id(&self) -> Option<ObjectId> {
103        match self {
104            NFTDesc::FileDesc(_) => {
105                None
106            }
107            NFTDesc::FileDesc2((_, parent_id)) => {
108                parent_id.clone()
109            }
110            NFTDesc::ListDesc(_) => {
111                None
112            }
113        }
114    }
115
116    pub fn sub_list(&self) -> Option<Vec<ObjectId>> {
117        match self {
118            NFTDesc::FileDesc(_) => {
119                None
120            }
121            NFTDesc::FileDesc2(_) => {
122                None
123            }
124            NFTDesc::ListDesc(sub_list) => {
125                Some(sub_list.content().nft_list.iter().map(|item| item.calculate_id()).collect())
126            }
127        }
128    }
129}
130
131#[derive(RawEncode, RawDecode, Clone, Debug)]
132pub struct NFTCreateTx {
133    pub desc: NFTDesc,
134    pub name: String,
135    pub state: NFTState,
136}
137
138#[derive(RawEncode, RawDecode, Clone, Debug)]
139pub struct NFTCreateTx2 {
140    pub desc: NFTDesc,
141    pub name: String,
142    pub state: NFTState,
143    pub sub_names: Vec<String>,
144    pub sub_states: Vec<NFTState>,
145}
146
147#[derive(RawEncode, RawDecode, Clone, Debug)]
148pub struct NFTAuctionTx {
149    pub nft_id: ObjectId,
150    pub price: u64,
151    pub coin_id: CoinTokenId,
152    pub duration_block_num: u64,
153}
154
155#[derive(RawEncode, RawDecode, Clone, Debug)]
156pub struct NFTBidTx {
157    pub nft_id: ObjectId,
158    pub price: u64,
159    pub coin_id: CoinTokenId,
160}
161
162#[derive(RawEncode, RawDecode, Clone, Debug)]
163pub struct NFTBuyTx {
164    pub nft_id: ObjectId,
165    pub price: u64,
166    pub coin_id: CoinTokenId,
167}
168
169#[derive(RawEncode, RawDecode, Clone, Debug)]
170pub struct NFTSellTx {
171    pub nft_id: ObjectId,
172    pub price: u64,
173    pub coin_id: CoinTokenId,
174    pub duration_block_num: u64,
175}
176
177#[derive(RawEncode, RawDecode, Clone, Debug)]
178pub struct NFTSellTx2 {
179    pub nft_id: ObjectId,
180    pub price: u64,
181    pub coin_id: CoinTokenId,
182    pub sub_sell_infos: Vec<(CoinTokenId, u64)>
183}
184
185#[derive(RawEncode, RawDecode, Clone, Debug)]
186pub struct NFTCancelSellTx {
187    pub nft_id: ObjectId,
188}
189
190// 求购
191#[derive(RawEncode, RawDecode, Clone, Debug)]
192pub struct NFTApplyBuyTx {
193    pub nft_id: ObjectId,
194    pub price: u64,
195    pub coin_id: CoinTokenId,
196}
197
198#[derive(RawEncode, RawDecode, Clone, Debug)]
199pub struct NFTCancelApplyBuyTx {
200    pub nft_id: ObjectId,
201}
202
203#[derive(RawEncode, RawDecode, Clone, Debug)]
204pub struct NFTAgreeApplyTx {
205    pub nft_id: ObjectId,
206    pub user_id: ObjectId,
207}
208
209#[derive(RawEncode, RawDecode, Clone, Debug)]
210pub struct NFTLikeTx {
211    pub nft_id: ObjectId,
212}
213
214#[derive(RawEncode, RawDecode, Clone, Debug)]
215pub struct NFTSetNameTx {
216    pub nft_id: ObjectId,
217    pub name: String,
218}
219
220#[derive(RawEncode, RawDecode, Clone, Debug)]
221pub struct NFTTransTx {
222    pub nft_id: ObjectId,
223    pub to: ObjectId,
224    pub nft_cached: Option<ObjectId>,
225}
226
227#[derive(Serialize, Deserialize)]
228pub struct NFTData {
229    pub nft_id: String,
230    pub create_time: u64,
231    pub beneficiary: String,
232    pub owner_id: String,
233    pub author_id: String,
234    pub name: String,
235    pub reward_amount: i64,
236    pub like_count: i64,
237    pub state: NFTState,
238    pub block_number: i64,
239    pub parent_id: Option<String>,
240    pub sub_list: Option<Vec<String>>,
241    pub price: u64,
242    pub coin_id: CoinTokenId,
243}
244
245#[derive(Serialize, Deserialize)]
246pub struct NFTTransferRecord {
247    pub nft_id: String,
248    pub create_time: u64,
249    pub owner_id: String,
250    pub author_id: String,
251    pub name: String,
252    pub block_number: i64,
253    pub from: String,
254    pub to: String,
255    pub cached: Option<String>,
256}
257
258#[derive(Serialize, Deserialize)]
259pub struct NFTBidRecord {
260    pub buyer_id: String,
261    pub price: u64,
262    pub coin_id: CoinTokenId
263}
264
265pub struct NFTDetail {
266    pub desc: NFTDesc,
267    pub name: String,
268    pub beneficiary: ObjectId,
269    pub state: NFTState,
270    pub like_count: i64,
271    pub block_number: i64,
272    pub price: u64,
273    pub coin_id: CoinTokenId,
274}
275
276pub struct NFTTransRecord {
277    pub desc: NFTDesc,
278    pub name: String,
279    pub block_number: i64,
280    pub from: String,
281    pub to: String,
282    pub nft_cached: Option<String>,
283}