1use cid::Cid;
3use fvm_actor_utils::receiver::RecipientData;
4use fvm_ipld_bitfield::BitField;
5use fvm_ipld_encoding::tuple::*;
6use fvm_ipld_encoding::RawBytes;
7use fvm_shared::address::Address;
8use fvm_shared::ActorID;
9
10#[cfg(doc)]
11use super::state::Cursor;
12
13pub type TokenID = u64;
14
15pub type TokenSet = BitField;
18
19pub type ActorIDSet = BitField;
22
23pub trait FRC53NFT {
25 fn name(&self) -> String;
27
28 fn symbol(&self) -> String;
30
31 fn metadata(&self, params: TokenID) -> Cid;
33
34 fn total_supply(&self) -> u64;
36
37 fn burn(&self, token_id: TokenID);
40
41 fn list_tokens(&self) -> Vec<TokenID>;
44
45 fn balance_of(&self, owner: Address) -> u64;
47
48 fn owner_of(&self, token_id: TokenID) -> ActorID;
50
51 fn transfer(&self, params: TransferParams);
53
54 fn transfer_from(&self, params: TransferFromParams);
57
58 fn approve(&self, params: ApproveParams);
61
62 fn set_approval_for_all(&self, params: ApproveForAllParams);
65
66 fn get_approved(&self, params: TokenID) -> ActorID;
68
69 fn is_approved_for_all(&self, params: IsApprovedForAllParams) -> bool;
71}
72
73#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
78pub struct MintReturn {
79 pub balance: u64,
81 pub supply: u64,
83 pub token_ids: Vec<TokenID>,
86 pub recipient_data: RawBytes,
88}
89
90#[derive(Clone, Debug)]
92pub struct MintIntermediate {
93 pub to: ActorID,
95 pub token_ids: Vec<TokenID>,
97 pub recipient_data: RawBytes,
99}
100
101impl RecipientData for MintIntermediate {
102 fn set_recipient_data(&mut self, data: RawBytes) {
103 self.recipient_data = data;
104 }
105}
106
107#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
110pub struct TransferIntermediate {
111 pub token_ids: Vec<TokenID>,
112 pub from: ActorID,
113 pub to: ActorID,
114 pub recipient_data: RawBytes,
116}
117
118impl RecipientData for TransferIntermediate {
119 fn set_recipient_data(&mut self, data: RawBytes) {
120 self.recipient_data = data;
121 }
122}
123
124#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
125pub struct TransferParams {
126 pub to: Address,
127 pub token_ids: Vec<TokenID>,
128 pub operator_data: RawBytes,
129}
130
131#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
132pub struct TransferReturn {
133 pub from_balance: u64,
134 pub to_balance: u64,
135 pub token_ids: Vec<TokenID>,
136}
137
138#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
139pub struct TransferFromParams {
140 pub from: Address,
141 pub to: Address,
142 pub token_ids: Vec<TokenID>,
143 pub operator_data: RawBytes,
144}
145
146#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
147pub struct BurnFromParams {
148 pub from: Address,
149 pub token_ids: Vec<TokenID>,
150}
151
152#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
153pub struct ApproveParams {
154 pub operator: Address,
155 pub token_ids: Vec<TokenID>,
156}
157
158#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
159pub struct ApproveForAllParams {
160 pub operator: Address,
161}
162
163#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
164pub struct IsApprovedForAllParams {
165 pub owner: Address,
166 pub operator: Address,
167}
168
169#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
170pub struct RevokeParams {
171 pub operator: Address,
172 pub token_ids: Vec<TokenID>,
173}
174
175#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
176pub struct RevokeForAllParams {
177 pub operator: Address,
178}
179
180#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
181pub struct ListTokensParams {
182 pub cursor: RawBytes,
184 pub limit: u64,
185}
186
187#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
188pub struct ListTokensReturn {
189 pub tokens: BitField,
190 pub next_cursor: Option<RawBytes>,
192}
193
194#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
195pub struct ListOwnedTokensParams {
196 pub owner: Address,
197 pub cursor: RawBytes,
199 pub limit: u64,
200}
201
202#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
203pub struct ListOwnedTokensReturn {
204 pub tokens: TokenSet,
205 pub next_cursor: Option<RawBytes>,
207}
208
209#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
210pub struct ListTokenOperatorsParams {
211 pub token_id: TokenID,
212 pub cursor: RawBytes,
214 pub limit: u64,
215}
216
217#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
218pub struct ListTokenOperatorsReturn {
219 pub operators: ActorIDSet,
220 pub next_cursor: Option<RawBytes>,
222}
223
224#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
225pub struct ListOperatorTokensParams {
226 pub operator: Address,
227 pub cursor: RawBytes,
229 pub limit: u64,
230}
231
232#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
233pub struct ListOperatorTokensReturn {
234 pub tokens: TokenSet,
235 pub next_cursor: Option<RawBytes>,
237}
238
239#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
240pub struct ListAccountOperatorsParams {
241 pub owner: Address,
242 pub cursor: RawBytes,
244 pub limit: u64,
245}
246
247#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)]
248pub struct ListAccountOperatorsReturn {
249 pub operators: ActorIDSet,
250 pub next_cursor: Option<RawBytes>,
252}