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 112 113 114 115 116 117 118 119 120 121 122
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> {
/// Transfer is a base message to move a token to another account without triggering actions
TransferNft {
recipient: String,
token_id: String,
},
/// Send is a base message to transfer a token to a contract and trigger an action
/// on the receiving contract.
SendNft {
contract: String,
token_id: String,
msg: Binary,
},
/// Allows operator to transfer / send the token from the owner's account.
/// If expiration is set, then this allowance has a time/height limit
Approve {
spender: String,
token_id: String,
expires: Option<Expiration>,
},
/// Remove previously granted Approval
Revoke {
spender: String,
token_id: String,
},
/// Allows operator to transfer / send any token from the owner's account.
/// If expiration is set, then this allowance has a time/height limit
ApproveAll {
operator: String,
expires: Option<Expiration>,
},
/// Remove previously granted ApproveAll permission
RevokeAll {
operator: String,
},
/// Mint a new NFT, can only be called by the contract minter
Mint {
/// Unique ID of the NFT
token_id: String,
/// The owner of the newly minter NFT
owner: String,
/// Universal resource identifier for this NFT
/// Should point to a JSON file that conforms to the ERC721
/// Metadata JSON Schema
token_uri: Option<String>,
/// Any custom extension used by this contract
extension: T,
},
/// Burn an NFT the sender has access to
Burn {
token_id: String,
},
/// Extension msg
Extension {
msg: E,
},
/// Update specific collection info fields
UpdateCollectionInfo {
collection_info: UpdateCollectionInfoMsg<RoyaltyInfoResponse>,
},
/// Called by the minter to update trading start time
UpdateStartTradingTime(Option<Timestamp>),
// Freeze collection info from further updates
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>>,
}
#[cw_serde]
pub struct RoyaltyInfo {
pub payment_address: Addr,
pub share: Decimal,
}
// allows easy conversion from RoyaltyInfo to RoyaltyInfoResponse
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>,
}