/// The core methods for a basic non-fungible token. Extension standards may be /// added in addition to this macro. #[macro_export] #[deprecated( note = "implement the near_contract_standards::non_fungible_token::NonFungibleTokenCore and near_contract_standards::non_fungible_token::NonFungibleTokenResolver traits manually instead." )] macro_rules! impl_non_fungible_token_core { ($contract: ident, $token: ident) => { use $crate::non_fungible_token::core::NonFungibleTokenCore; use $crate::non_fungible_token::core::NonFungibleTokenResolver; #[near] impl NonFungibleTokenCore for $contract { #[payable] fn nft_transfer( &mut self, receiver_id: AccountId, token_id: TokenId, approval_id: Option, memo: Option, ) { self.$token.nft_transfer(receiver_id, token_id, approval_id, memo) } #[payable] fn nft_transfer_call( &mut self, receiver_id: AccountId, token_id: TokenId, approval_id: Option, memo: Option, msg: String, ) -> PromiseOrValue { self.$token.nft_transfer_call(receiver_id, token_id, approval_id, memo, msg) } fn nft_token(&self, token_id: TokenId) -> Option { self.$token.nft_token(token_id) } } #[near] impl NonFungibleTokenResolver for $contract { #[private] fn nft_resolve_transfer( &mut self, previous_owner_id: AccountId, receiver_id: AccountId, token_id: TokenId, approved_account_ids: Option>, ) -> bool { self.$token.nft_resolve_transfer( previous_owner_id, receiver_id, token_id, approved_account_ids, ) } } }; } /// Non-fungible token approval management allows for an escrow system where /// multiple approvals per token exist. #[macro_export] #[deprecated( note = "implement the near_contract_standards::non_fungible_token::NonFungibleTokenApproval trait manually instead." )] macro_rules! impl_non_fungible_token_approval { ($contract: ident, $token: ident) => { use $crate::non_fungible_token::approval::NonFungibleTokenApproval; #[near] impl NonFungibleTokenApproval for $contract { #[payable] fn nft_approve( &mut self, token_id: TokenId, account_id: AccountId, msg: Option, ) -> Option { self.$token.nft_approve(token_id, account_id, msg) } #[payable] fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { self.$token.nft_revoke(token_id, account_id) } #[payable] fn nft_revoke_all(&mut self, token_id: TokenId) { self.$token.nft_revoke_all(token_id) } fn nft_is_approved( &self, token_id: TokenId, approved_account_id: AccountId, approval_id: Option, ) -> bool { self.$token.nft_is_approved(token_id, approved_account_id, approval_id) } } }; } /// Non-fungible enumeration adds the extension standard offering several /// view-only methods to get token supply, tokens per owner, etc. #[macro_export] #[deprecated( note = "implement the near_contract_standards::non_fungible_token::NonFungibleTokenEnumeration trait manually instead." )] macro_rules! impl_non_fungible_token_enumeration { ($contract: ident, $token: ident) => { use $crate::non_fungible_token::enumeration::NonFungibleTokenEnumeration; #[near] impl NonFungibleTokenEnumeration for $contract { fn nft_total_supply(&self) -> near_sdk::json_types::U128 { self.$token.nft_total_supply() } fn nft_tokens( &self, from_index: Option, limit: Option, ) -> Vec { self.$token.nft_tokens(from_index, limit) } fn nft_supply_for_owner(&self, account_id: AccountId) -> near_sdk::json_types::U128 { self.$token.nft_supply_for_owner(account_id) } fn nft_tokens_for_owner( &self, account_id: AccountId, from_index: Option, limit: Option, ) -> Vec { self.$token.nft_tokens_for_owner(account_id, from_index, limit) } } }; }