Skip to main content

sg721_updatable/
msg.rs

1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::Binary;
3use cosmwasm_std::Timestamp;
4use cw_utils::Expiration;
5use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg};
6use sg721_base::msg::QueryMsg as Sg721QueryMsg;
7use sg721_base::ExecuteMsg as Sg721ExecuteMsg;
8
9#[cw_serde]
10pub enum ExecuteMsg<T, E> {
11    /// Freeze token metadata so creator can no longer update token uris
12    FreezeTokenMetadata {},
13    /// Creator calls can update token uris
14    UpdateTokenMetadata {
15        token_id: String,
16        token_uri: Option<String>,
17    },
18    /// Enable updatable for updating token metadata. One time migration fee for sg721-base to sg721-updatable.
19    EnableUpdatable {},
20    // Sg721Base msgs
21    TransferNft {
22        recipient: String,
23        token_id: String,
24    },
25    SendNft {
26        contract: String,
27        token_id: String,
28        msg: Binary,
29    },
30    Approve {
31        spender: String,
32        token_id: String,
33        expires: Option<Expiration>,
34    },
35    Revoke {
36        spender: String,
37        token_id: String,
38    },
39    ApproveAll {
40        operator: String,
41        expires: Option<Expiration>,
42    },
43    RevokeAll {
44        operator: String,
45    },
46    Burn {
47        token_id: String,
48    },
49    UpdateCollectionInfo {
50        collection_info: UpdateCollectionInfoMsg<RoyaltyInfoResponse>,
51    },
52    UpdateStartTradingTime(Option<Timestamp>),
53    FreezeCollectionInfo {},
54    Mint {
55        /// Unique ID of the NFT
56        token_id: String,
57        /// The owner of the newly minter NFT
58        owner: String,
59        /// Universal resource identifier for this NFT
60        /// Should point to a JSON file that conforms to the ERC721
61        /// Metadata JSON Schema
62        token_uri: Option<String>,
63        /// Any custom extension used by this contract
64        extension: T,
65    },
66    Extension {
67        msg: E,
68    },
69}
70
71impl<T, E> From<ExecuteMsg<T, E>> for Sg721ExecuteMsg
72where
73    T: Clone + PartialEq + Into<Option<cosmwasm_std::Empty>>,
74    Option<cosmwasm_std::Empty>: From<T>,
75{
76    fn from(msg: ExecuteMsg<T, E>) -> Sg721ExecuteMsg {
77        match msg {
78            ExecuteMsg::TransferNft {
79                recipient,
80                token_id,
81            } => Sg721ExecuteMsg::TransferNft {
82                recipient,
83                token_id,
84            },
85            ExecuteMsg::SendNft {
86                contract,
87                token_id,
88                msg,
89            } => Sg721ExecuteMsg::SendNft {
90                contract,
91                token_id,
92                msg,
93            },
94            ExecuteMsg::Approve {
95                spender,
96                token_id,
97                expires,
98            } => Sg721ExecuteMsg::Approve {
99                spender,
100                token_id,
101                expires,
102            },
103            ExecuteMsg::ApproveAll { operator, expires } => {
104                Sg721ExecuteMsg::ApproveAll { operator, expires }
105            }
106            ExecuteMsg::Revoke { spender, token_id } => {
107                Sg721ExecuteMsg::Revoke { spender, token_id }
108            }
109            ExecuteMsg::RevokeAll { operator } => Sg721ExecuteMsg::RevokeAll { operator },
110            ExecuteMsg::Burn { token_id } => Sg721ExecuteMsg::Burn { token_id },
111            ExecuteMsg::UpdateCollectionInfo { collection_info } => {
112                Sg721ExecuteMsg::UpdateCollectionInfo { collection_info }
113            }
114            ExecuteMsg::FreezeCollectionInfo {} => Sg721ExecuteMsg::FreezeCollectionInfo {},
115            ExecuteMsg::Mint {
116                token_id,
117                owner,
118                token_uri,
119                extension,
120            } => Sg721ExecuteMsg::Mint {
121                token_id,
122                owner,
123                token_uri,
124                extension: extension.into(),
125            },
126            ExecuteMsg::UpdateStartTradingTime(start_trading_time) => {
127                Sg721ExecuteMsg::UpdateStartTradingTime(start_trading_time)
128            }
129            _ => unreachable!("Invalid ExecuteMsg"),
130        }
131    }
132}
133
134#[cw_serde]
135pub enum QueryMsg {
136    EnableUpdatable {},
137    EnableUpdatableFee {},
138    FreezeTokenMetadata {},
139    OwnerOf {
140        token_id: String,
141        include_expired: Option<bool>,
142    },
143    Approval {
144        token_id: String,
145        spender: String,
146        include_expired: Option<bool>,
147    },
148    Approvals {
149        token_id: String,
150        include_expired: Option<bool>,
151    },
152    AllOperators {
153        owner: String,
154        include_expired: Option<bool>,
155        start_after: Option<String>,
156        limit: Option<u32>,
157    },
158    NumTokens {},
159    ContractInfo {},
160    NftInfo {
161        token_id: String,
162    },
163    AllNftInfo {
164        token_id: String,
165        include_expired: Option<bool>,
166    },
167    Tokens {
168        owner: String,
169        start_after: Option<String>,
170        limit: Option<u32>,
171    },
172    AllTokens {
173        start_after: Option<String>,
174        limit: Option<u32>,
175    },
176    Minter {},
177    CollectionInfo {},
178}
179
180impl From<QueryMsg> for Sg721QueryMsg {
181    fn from(msg: QueryMsg) -> Sg721QueryMsg {
182        match msg {
183            QueryMsg::OwnerOf {
184                token_id,
185                include_expired,
186            } => Sg721QueryMsg::OwnerOf {
187                token_id,
188                include_expired,
189            },
190            QueryMsg::Approval {
191                token_id,
192                spender,
193                include_expired,
194            } => Sg721QueryMsg::Approval {
195                token_id,
196                spender,
197                include_expired,
198            },
199            QueryMsg::Approvals {
200                token_id,
201                include_expired,
202            } => Sg721QueryMsg::Approvals {
203                token_id,
204                include_expired,
205            },
206            QueryMsg::AllOperators {
207                owner,
208                include_expired,
209                start_after,
210                limit,
211            } => Sg721QueryMsg::AllOperators {
212                owner,
213                include_expired,
214                start_after,
215                limit,
216            },
217            QueryMsg::NumTokens {} => Sg721QueryMsg::NumTokens {},
218            QueryMsg::ContractInfo {} => Sg721QueryMsg::ContractInfo {},
219            QueryMsg::NftInfo { token_id } => Sg721QueryMsg::NftInfo { token_id },
220            QueryMsg::AllNftInfo {
221                token_id,
222                include_expired,
223            } => Sg721QueryMsg::AllNftInfo {
224                token_id,
225                include_expired,
226            },
227            QueryMsg::Tokens {
228                owner,
229                start_after,
230                limit,
231            } => Sg721QueryMsg::Tokens {
232                owner,
233                start_after,
234                limit,
235            },
236            QueryMsg::AllTokens { start_after, limit } => {
237                Sg721QueryMsg::AllTokens { start_after, limit }
238            }
239            QueryMsg::Minter {} => Sg721QueryMsg::Minter {},
240            QueryMsg::CollectionInfo {} => Sg721QueryMsg::CollectionInfo {},
241            _ => unreachable!("cannot convert {:?} to Sg721QueryMsg", msg),
242        }
243    }
244}
245
246#[cw_serde]
247pub struct EnableUpdatableResponse {
248    pub enabled: bool,
249}
250
251#[cw_serde]
252pub struct FrozenTokenMetadataResponse {
253    pub frozen: bool,
254}