Skip to main content

Cw721Extensions

Struct Cw721Extensions 

Source
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 Empty or Option<Empty>.
  • opionated DefaultOptionalNftExtension and DefaultOptionalCollectionExtension.
    • DefaultOptionalNftExtension: either with nft metadata (Some<NftExtension>) or none None.
    • DefaultOptionalCollectionExtension: either with collection metadata (Some<CollectionExtension>) or none None.
  • custom extensions: by defining custom extensions.

Generics:

  • TNftExtension for NftInfo extension (onchain metadata).
  • TNftExtensionMsg for NftInfo extension msg for onchain metadata.
  • TCollectionExtension for CollectionInfo extension (onchain attributes).
  • TCollectionExtensionMsg for CollectionInfo extension msg for onchain collection attributes.
  • TExtensionMsg for custom extension msg for custom contract logic.
  • TExtensionQueryMsg for custom query msg for custom contract logic.
  • TCustomResponseMsg for 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,

Source§

fn instantiate_with_version( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, msg: Cw721InstantiateMsg<TCollectionExtensionMsg>, contract_name: &str, contract_version: &str, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn instantiate( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, msg: Cw721InstantiateMsg<TCollectionExtensionMsg>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn execute( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, msg: Cw721ExecuteMsg<TNftExtensionMsg, TCollectionExtensionMsg, TExtensionMsg>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn migrate( &self, deps: DepsMut<'_>, env: Env, msg: Cw721MigrateMsg, contract_name: &str, contract_version: &str, ) -> Result<Response, Cw721ContractError>

Source§

fn transfer_nft( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, recipient: String, token_id: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn send_nft( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, contract: String, token_id: String, msg: Binary, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn approve( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, spender: String, token_id: String, expires: Option<Expiration>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn revoke( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, spender: String, token_id: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn approve_all( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, operator: String, expires: Option<Expiration>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn revoke_all( &self, deps: DepsMut<'_>, _env: &Env, info: &MessageInfo, operator: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn burn_nft( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, token_id: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn add_additional_minter( &self, deps: DepsMut<'_>, info: &MessageInfo, minter: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn remove_additional_minter( &self, deps: DepsMut<'_>, info: &MessageInfo, minter: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn initialize_creator( &self, storage: &mut dyn Storage, api: &dyn Api, creator: Option<&str>, ) -> StdResult<Ownership<Addr>>

Source§

fn initialize_minter( &self, storage: &mut dyn Storage, api: &dyn Api, minter: Option<&str>, ) -> StdResult<Ownership<Addr>>

Source§

fn update_collection_info( &self, deps: DepsMut<'_>, info: Option<&MessageInfo>, env: &Env, msg: CollectionInfoMsg<TCollectionExtensionMsg>, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn mint( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, token_id: String, owner: String, token_uri: Option<String>, extension: TNftExtensionMsg, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn update_minter_ownership( &self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo, action: Action, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

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>

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>

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.
Source§

fn set_withdraw_address( &self, deps: DepsMut<'_>, sender: &Addr, address: String, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

fn remove_withdraw_address( &self, storage: &mut dyn Storage, sender: &Addr, ) -> Result<Response<TCustomResponseMsg>, Cw721ContractError>

Source§

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,

Source§

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>

👎Deprecated since 0.19.0:

Please use query_minter_ownership instead

Deprecated: use query_minter_ownership instead! Will be removed in next release!
Source§

fn query_minter_ownership( &self, storage: &dyn Storage, ) -> StdResult<Ownership<Addr>>

Source§

fn query_creator_ownership( &self, storage: &dyn Storage, ) -> StdResult<Ownership<Addr>>

Source§

fn query_additional_minters( &self, deps: Deps<'_>, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<AdditionalMintersResponse>

Source§

fn query_collection_info(&self, deps: Deps<'_>) -> StdResult<CollectionInfo>

Source§

fn query_collection_extension_attributes( &self, deps: Deps<'_>, ) -> StdResult<Vec<Attribute>>

Source§

fn query_all_collection_info( &self, deps: Deps<'_>, contract_addr: impl Into<String>, ) -> Result<ConfigResponse<TCollectionExtension>, Cw721ContractError>
where TCollectionExtension: FromAttributesState,

Source§

fn query_collection_info_and_extension( &self, deps: Deps<'_>, ) -> Result<CollectionInfoAndExtensionResponse<TCollectionExtension>, Cw721ContractError>
where TCollectionExtension: FromAttributesState,

Source§

fn query_all_info( &self, deps: Deps<'_>, env: &Env, ) -> StdResult<AllInfoResponse>

Source§

fn query_num_tokens( &self, storage: &dyn Storage, ) -> StdResult<NumTokensResponse>

Source§

fn query_nft_info( &self, storage: &dyn Storage, token_id: String, ) -> StdResult<NftInfoResponse<TNftExtension>>

Source§

fn query_nft_by_extension( &self, storage: &dyn Storage, extension: TNftExtension, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<Option<Vec<NftInfoResponse<TNftExtension>>>>

Source§

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>

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>

operators returns all operators owner given access to
Source§

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>

approvals returns all approvals owner given access to
Source§

fn query_tokens( &self, deps: Deps<'_>, _env: &Env, owner: String, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<TokensResponse>

Source§

fn query_all_tokens( &self, deps: Deps<'_>, _env: &Env, start_after: Option<String>, limit: Option<u32>, ) -> StdResult<TokensResponse>

Source§

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>

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>

use GetCollectionInfoAndExtension instead. No-op / empty extension query returning empty binary, needed for inferring type parameter during compile Read more
Source§

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,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

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>
where TCollectionExtension: Send, TNftExtensionMsg: Send, TCollectionExtensionMsg: Send, TExtensionMsg: Send, TExtensionQueryMsg: Send, TCustomResponseMsg: Send, TNftExtension: Send,

§

impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Sync for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
where TCollectionExtension: Sync, TNftExtensionMsg: Sync, TCollectionExtensionMsg: Sync, TExtensionMsg: Sync, TExtensionQueryMsg: Sync, TCustomResponseMsg: Sync, TNftExtension: Sync,

§

impl<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg> Unpin for Cw721Extensions<'a, TNftExtension, TNftExtensionMsg, TCollectionExtension, TCollectionExtensionMsg, TExtensionMsg, TExtensionQueryMsg, TCustomResponseMsg>
where TCollectionExtension: Unpin, TNftExtensionMsg: Unpin, TCollectionExtensionMsg: Unpin, TExtensionMsg: Unpin, TExtensionQueryMsg: Unpin, TCustomResponseMsg: Unpin, TNftExtension: Unpin,

§

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<U> As for U

Source§

fn as_<T>(self) -> T
where T: CastFrom<U>, U: Sized,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V