pub struct Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State,
TNftExtensionMsg: Cw721CustomMsg,
TCollectionExtension: Cw721State,
TCollectionExtensionMsg: Cw721CustomMsg,{
pub config: Cw721Config<'a, TNftExtension>,
/* private fields */
}Expand description
Generic Cw721Extensions which may be extended by other contracts with custom onchain nft and collection extensions.
Contract with generic onchain nft and collection extensions allows handling with:
- no extensions: by defining all extensions as
EmptyorOption<Empty>. - opionated
DefaultOptionalNftExtensionandDefaultOptionalCollectionExtension.DefaultOptionalNftExtension: either with nft metadata (Some<NftExtension>) or noneNone.DefaultOptionalCollectionExtension: either with collection metadata (Some<CollectionExtension>) or noneNone.
- custom extensions: by defining custom extensions.
Generics:
TNftExtensionfor NftInfo extension (onchain metadata).TNftExtensionMsgfor NftInfo extension msg for onchain metadata.TCollectionExtensionfor CollectionInfo extension (onchain attributes).TCollectionExtensionMsgfor CollectionInfo extension msg for onchain collection attributes.TExtensionMsgfor custom extension msg for custom contract logic.TExtensionQueryMsgfor custom query msg for custom contract logic.TCustomResponseMsgfor custom response msg for custom contract logic.
Example:
// instantiate:
let contract = Cw721Extensions::<
DefaultOptionalNftExtension, // use `Option<Empty>` or `Empty` for no nft metadata
DefaultOptionalNftExtensionMsg, // use `Option<Empty>` or `Empty` for no nft metadata
DefaultOptionalCollectionExtension, // use `Option<Empty>` or `Empty` for no collection metadata
DefaultOptionalCollectionExtensionMsg, // use `Option<Empty>` or `Empty` for no collection metadata
Empty, // no custom extension msg
Empty, // no custom query msg
Empty, // no custom response msg
>::default();
let info = mock_info(CREATOR, &[]);
let init_msg = Cw721InstantiateMsg {
name: "SpaceShips".to_string(),
symbol: "SPACE".to_string(),
collection_info_extension: None,
minter: None,
creator: None,
withdraw_address: None,
};
//...
// mint:
let token_id = "Enterprise";
let token_uri = Some("https://starships.example.com/Starship/Enterprise.json".into());
let extension = Some(NftExtensionMsg {
description: Some("description1".into()),
name: Some("name1".to_string()),
attributes: Some(vec![Trait {
display_type: None,
trait_type: "type1".to_string(),
value: "value1".to_string(),
}]),
..NftExtensionMsg::default()
});
let exec_msg = Cw721ExecuteMsg::<
DefaultOptionalNftExtensionMsg,
DefaultOptionalCollectionExtensionMsg,
Empty,
>::Mint {
token_id: token_id.to_string(),
owner: "john".to_string(),
token_uri: token_uri.clone(),
extension: extension.clone(), // use `extension: None` for no metadata
};
//...Fields§
§config: Cw721Config<'a, TNftExtension>Trait Implementations§
Source§impl<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Cw721Execute<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TCustomResponseMsg> for Cw721Extensions<'_, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State,
TNftExtensionMsg: Cw721CustomMsg + StateFactory<TNftExtension>,
TCollectionExtension: Cw721State + ToAttributesState + FromAttributesState,
TCollectionExtensionMsg: Cw721CustomMsg + StateFactory<TCollectionExtension>,
TCustomResponseMsg: CustomMsg,
impl<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Cw721Execute<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TCustomResponseMsg> for Cw721Extensions<'_, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State,
TNftExtensionMsg: Cw721CustomMsg + StateFactory<TNftExtension>,
TCollectionExtension: Cw721State + ToAttributesState + FromAttributesState,
TCollectionExtensionMsg: Cw721CustomMsg + StateFactory<TCollectionExtension>,
TCustomResponseMsg: CustomMsg,
fn instantiate_with_version( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, msg: Cw721InstantiateMsg<TCollectionExtensionMsg>, contract_name: &str, contract_version: &str, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn instantiate( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, msg: Cw721InstantiateMsg<TCollectionExtensionMsg>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn execute( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, msg: Cw721ExecuteMsg<TNftExtensionMsg, TCollectionExtensionMsg, TExtensionMsg>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn migrate( &self, deps: DepsMut<'_>, env: Env, msg: Cw721MigrateMsg, contract_name: &str, contract_version: &str, ) -> Result<Response, Cw721ContractError>
fn transfer_nft( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, recipient: String, token_id: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn send_nft( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, contract: String, token_id: String, msg: Binary, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn approve( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, spender: String, token_id: String, expires: Option<Expiration>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn revoke( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, spender: String, token_id: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn approve_all( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, operator: String, expires: Option<Expiration>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn revoke_all( &self, deps: DepsMut<'_>, _env: &Env, info: &MessageInfo, operator: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn burn_nft( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, token_id: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn add_additional_minter( &self, deps: DepsMut<'_>, info: &MessageInfo, minter: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn remove_additional_minter( &self, deps: DepsMut<'_>, info: &MessageInfo, minter: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn initialize_creator( &self, storage: &mut dyn Storage, api: &dyn Api, creator: Option<&str>, ) -> StdResult<Ownership<Addr>>
fn initialize_minter( &self, storage: &mut dyn Storage, api: &dyn Api, minter: Option<&str>, ) -> StdResult<Ownership<Addr>>
fn update_collection_info( &self, deps: DepsMut<'_>, info: Option<&MessageInfo>, env: &Env, msg: CollectionInfoMsg<TCollectionExtensionMsg>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn mint( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, token_id: String, owner: String, token_uri: Option<String>, extension: TNftExtensionMsg, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn update_minter_ownership( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, action: Action, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn update_creator_ownership( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, action: Action, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
Source§fn execute_extension(
&self,
_deps: DepsMut<'_>,
_env: &Env,
_info: &MessageInfo,
_msg: TExtensionMsg,
) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn execute_extension( &self, _deps: DepsMut<'_>, _env: &Env, _info: &MessageInfo, _msg: TExtensionMsg, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
Custom msg execution. This is a no-op in default implementation.
Source§fn update_nft_info(
&self,
deps: DepsMut<'_>,
env: &Env,
info: &MessageInfo,
token_id: String,
token_uri: Option<String>,
msg: TNftExtensionMsg,
) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn update_nft_info( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, token_id: String, token_uri: Option<String>, msg: TNftExtensionMsg, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
The creator is the only one eligible to update NFT’s token uri and onchain metadata (
NftInfo.extension).
NOTE: approvals and owner are not affected by this call, since they belong to the NFT owner.fn set_withdraw_address( &self, deps: DepsMut<'_>, sender: &Addr, address: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn remove_withdraw_address( &self, storage: &mut dyn Storage, sender: &Addr, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
fn withdraw_funds( &self, storage: &mut dyn Storage, amount: &Coin, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>
Source§impl<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Cw721Query<TNftExtension, TCollectionExtension, TExtensionQueryMsg> for Cw721Extensions<'_, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State + Contains,
TNftExtensionMsg: Cw721CustomMsg,
TCollectionExtension: Cw721State + FromAttributesState,
TCollectionExtensionMsg: Cw721CustomMsg,
TExtensionQueryMsg: Cw721CustomMsg,
TCustomResponseMsg: CustomMsg,
impl<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Cw721Query<TNftExtension, TCollectionExtension, TExtensionQueryMsg> for Cw721Extensions<'_, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State + Contains,
TNftExtensionMsg: Cw721CustomMsg,
TCollectionExtension: Cw721State + FromAttributesState,
TCollectionExtensionMsg: Cw721CustomMsg,
TExtensionQueryMsg: Cw721CustomMsg,
TCustomResponseMsg: CustomMsg,
fn query( &self, deps: Deps<'_>, env: &Env, msg: Cw721QueryMsg<TNftExtension, TCollectionExtension, TExtensionQueryMsg>, ) -> Result<Binary, Cw721ContractError>
Source§fn query_minter(&self, storage: &dyn Storage) -> StdResult<MinterResponse>
fn query_minter(&self, storage: &dyn Storage) -> StdResult<MinterResponse>
👎Deprecated since 0.19.0:
Please use query_minter_ownership instead
Deprecated: use query_minter_ownership instead! Will be removed in next release!
fn query_minter_ownership( &self, storage: &dyn Storage, ) -> StdResult<Ownership<Addr>>
fn query_creator_ownership( &self, storage: &dyn Storage, ) -> StdResult<Ownership<Addr>>
fn query_additional_minters( &self, deps: Deps<'_>, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<AdditionalMintersResponse>
fn query_collection_info(&self, deps: Deps<'_>) -> StdResult<CollectionInfo>
fn query_collection_extension_attributes( &self, deps: Deps<'_>, ) -> StdResult<Vec<Attribute>>
fn query_all_collection_info(
&self,
deps: Deps<'_>,
contract_addr: impl Into<String>,
) -> Result<ConfigResponse<TCollectionExtension>, Cw721ContractError>where
TCollectionExtension: FromAttributesState,
fn query_collection_info_and_extension(
&self,
deps: Deps<'_>,
) -> Result<CollectionInfoAndExtensionResponse<TCollectionExtension>, Cw721ContractError>where
TCollectionExtension: FromAttributesState,
fn query_all_info( &self, deps: Deps<'_>, env: &Env, ) -> StdResult<AllInfoResponse>
fn query_num_tokens( &self, storage: &dyn Storage, ) -> StdResult<NumTokensResponse>
fn query_nft_info( &self, storage: &dyn Storage, token_id: String, ) -> StdResult<NftInfoResponse<TNftExtension>>
fn query_nft_by_extension( &self, storage: &dyn Storage, extension: TNftExtension, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<Option<Vec<NftInfoResponse<TNftExtension>>>>
fn query_owner_of( &self, deps: Deps<'_>, env: &Env, token_id: String, include_expired_approval: bool, ) -> StdResult<OwnerOfResponse>
Source§fn query_operator(
&self,
deps: Deps<'_>,
env: &Env,
owner: String,
operator: String,
include_expired_approval: bool,
) -> StdResult<OperatorResponse>
fn query_operator( &self, deps: Deps<'_>, env: &Env, owner: String, operator: String, include_expired_approval: bool, ) -> StdResult<OperatorResponse>
operator returns the approval status of an operator for a given owner if exists
Source§fn query_operators(
&self,
deps: Deps<'_>,
env: &Env,
owner: String,
include_expired_approval: bool,
start_after: Option<String>,
limit: Option<u32>,
) -> StdResult<OperatorsResponse>
fn query_operators( &self, deps: Deps<'_>, env: &Env, owner: String, include_expired_approval: bool, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<OperatorsResponse>
operators returns all operators owner given access to
fn query_approval( &self, deps: Deps<'_>, env: &Env, token_id: String, spender: String, include_expired_approval: bool, ) -> StdResult<ApprovalResponse>
Source§fn query_approvals(
&self,
deps: Deps<'_>,
env: &Env,
token_id: String,
include_expired_approval: bool,
) -> StdResult<ApprovalsResponse>
fn query_approvals( &self, deps: Deps<'_>, env: &Env, token_id: String, include_expired_approval: bool, ) -> StdResult<ApprovalsResponse>
approvals returns all approvals owner given access to
fn query_tokens( &self, deps: Deps<'_>, _env: &Env, owner: String, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<TokensResponse>
fn query_all_tokens( &self, deps: Deps<'_>, _env: &Env, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<TokensResponse>
fn query_all_nft_info( &self, deps: Deps<'_>, env: &Env, token_id: String, include_expired_approval: bool, ) -> StdResult<AllNftInfoResponse<TNftExtension>>
Source§fn query_extension(
&self,
_deps: Deps<'_>,
_env: &Env,
_msg: TExtensionQueryMsg,
) -> Result<Binary, Cw721ContractError>
fn query_extension( &self, _deps: Deps<'_>, _env: &Env, _msg: TExtensionQueryMsg, ) -> Result<Binary, Cw721ContractError>
Custom msg query. Default implementation returns an empty binary.
Source§fn query_custom_collection_extension(
&self,
_deps: Deps<'_>,
_env: &Env,
_msg: TCollectionExtension,
) -> Result<Binary, Cw721ContractError>
fn query_custom_collection_extension( &self, _deps: Deps<'_>, _env: &Env, _msg: TCollectionExtension, ) -> Result<Binary, Cw721ContractError>
use GetCollectionInfoAndExtension instead.
No-op / empty extension query returning empty binary, needed for inferring type parameter during compile Read more
fn query_withdraw_address(&self, deps: Deps<'_>) -> StdResult<Option<String>>
Source§impl<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Default for Cw721Extensions<'static, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State,
TNftExtensionMsg: Cw721CustomMsg,
TCollectionExtension: Cw721State,
TCollectionExtensionMsg: Cw721CustomMsg,
impl<TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Default for Cw721Extensions<'static, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TNftExtension: Cw721State,
TNftExtensionMsg: Cw721CustomMsg,
TCollectionExtension: Cw721State,
TCollectionExtensionMsg: Cw721CustomMsg,
Auto Trait Implementations§
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Freeze for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> RefUnwindSafe for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TCollectionExtension: RefUnwindSafe,
TNftExtensionMsg: RefUnwindSafe,
TCollectionExtensionMsg: RefUnwindSafe,
TExtensionMsg: RefUnwindSafe,
TExtensionQueryMsg: RefUnwindSafe,
TCustomResponseMsg: RefUnwindSafe,
TNftExtension: RefUnwindSafe,
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Send for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Sync for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Unpin for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> UnsafeUnpin for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> UnwindSafe for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>where
TCollectionExtension: UnwindSafe,
TNftExtensionMsg: UnwindSafe,
TCollectionExtensionMsg: UnwindSafe,
TExtensionMsg: UnwindSafe,
TExtensionQueryMsg: UnwindSafe,
TCustomResponseMsg: UnwindSafe,
TNftExtension: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more