use cosmwasm_schema::cw_serde;
use cosmwasm_std::{Addr, Binary, Decimal, Timestamp};
use cw_ownable::cw_ownable_execute;
use cw_utils::Expiration;
#[cw_ownable_execute]
#[cw_serde]
pub enum ExecuteMsg<T, E> {
TransferNft {
recipient: String,
token_id: String,
},
SendNft {
contract: String,
token_id: String,
msg: Binary,
},
Approve {
spender: String,
token_id: String,
expires: Option<Expiration>,
},
Revoke {
spender: String,
token_id: String,
},
ApproveAll {
operator: String,
expires: Option<Expiration>,
},
RevokeAll {
operator: String,
},
Mint {
token_id: String,
owner: String,
token_uri: Option<String>,
extension: T,
},
Burn {
token_id: String,
},
Extension {
msg: E,
},
UpdateCollectionInfo {
collection_info: UpdateCollectionInfoMsg<RoyaltyInfoResponse>,
},
UpdateStartTradingTime(Option<Timestamp>),
FreezeCollectionInfo,
}
#[cw_serde]
pub struct CollectionInfo<T> {
pub creator: String,
pub description: String,
pub image: String,
pub external_link: Option<String>,
pub explicit_content: Option<bool>,
pub start_trading_time: Option<Timestamp>,
pub royalty_info: Option<T>,
}
#[cw_serde]
pub struct UpdateCollectionInfoMsg<T> {
pub description: Option<String>,
pub image: Option<String>,
pub external_link: Option<Option<String>>,
pub explicit_content: Option<bool>,
pub royalty_info: Option<Option<T>>,
pub creator: Option<String>,
}
#[cw_serde]
pub struct RoyaltyInfo {
pub payment_address: Addr,
pub share: Decimal,
}
impl RoyaltyInfo {
pub fn to_response(&self) -> RoyaltyInfoResponse {
RoyaltyInfoResponse {
payment_address: self.payment_address.to_string(),
share: self.share,
}
}
}
#[cw_serde]
pub struct RoyaltyInfoResponse {
pub payment_address: String,
pub share: Decimal,
}
#[cw_serde]
pub struct InstantiateMsg {
pub name: String,
pub symbol: String,
pub minter: String,
pub collection_info: CollectionInfo<RoyaltyInfoResponse>,
}