From debe8b87ee60a52c66714ec881f5e8b6ca45337d Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Fri, 30 Jun 2023 16:44:04 +0200 Subject: [PATCH 01/12] [Enhancement] NFT: remove declarative macros. --- examples/non-fungible-token/nft/src/lib.rs | 65 ++++++++- .../src/non_fungible_token/macros.rs | 136 ------------------ .../src/non_fungible_token/mod.rs | 4 - 3 files changed, 62 insertions(+), 143 deletions(-) delete mode 100644 near-contract-standards/src/non_fungible_token/macros.rs diff --git a/examples/non-fungible-token/nft/src/lib.rs b/examples/non-fungible-token/nft/src/lib.rs index c5892ac3d..49496ecfb 100644 --- a/examples/non-fungible-token/nft/src/lib.rs +++ b/examples/non-fungible-token/nft/src/lib.rs @@ -20,11 +20,15 @@ use near_contract_standards::non_fungible_token::metadata::{ }; use near_contract_standards::non_fungible_token::NonFungibleToken; use near_contract_standards::non_fungible_token::{Token, TokenId}; +use near_contract_standards::non_fungible_token::approval::NonFungibleTokenApproval; +use near_contract_standards::non_fungible_token::core::NonFungibleTokenCore; +use near_contract_standards::non_fungible_token::enumeration::NonFungibleTokenEnumeration; use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::LazyOption; use near_sdk::{ env, near_bindgen, require, AccountId, BorshStorageKey, PanicOnDefault, Promise, PromiseOrValue, }; +use near_sdk::json_types::U128; #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] @@ -100,9 +104,64 @@ impl Contract { } } -near_contract_standards::impl_non_fungible_token_core!(Contract, tokens); -near_contract_standards::impl_non_fungible_token_approval!(Contract, tokens); -near_contract_standards::impl_non_fungible_token_enumeration!(Contract, tokens); +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + #[payable] + fn nft_transfer(&mut self, receiver_id: AccountId, token_id: TokenId, approval_id: Option, memo: Option) { + self.tokens.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.tokens.nft_transfer_call(receiver_id, token_id, approval_id, memo, msg) + } + + fn nft_token(&self, token_id: TokenId) -> Option { + self.tokens.nft_token(token_id) + } +} + +#[near_bindgen] +impl NonFungibleTokenApproval for Contract { + #[payable] + fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) -> Option { + self.tokens.nft_approve(token_id, account_id, msg) + } + + #[payable] + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { + self.tokens.nft_revoke(token_id, account_id); + } + + #[payable] + fn nft_revoke_all(&mut self, token_id: TokenId) { + self.tokens.nft_revoke_all(token_id); + + } + + fn nft_is_approved(&self, token_id: TokenId, approved_account_id: AccountId, approval_id: Option) -> bool { + self.tokens.nft_is_approved(token_id, approved_account_id, approval_id) + } +} + +#[near_bindgen] +impl NonFungibleTokenEnumeration for Contract { + fn nft_total_supply(&self) -> U128 { + self.tokens.nft_total_supply() + } + + fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + self.tokens.nft_tokens(from_index, limit) + } + + fn nft_supply_for_owner(&self, account_id: AccountId) -> U128 { + self.tokens.nft_supply_for_owner(account_id) + } + + fn nft_tokens_for_owner(&self, account_id: AccountId, from_index: Option, limit: Option) -> Vec { + self.tokens.nft_tokens_for_owner(account_id, from_index, limit) + } +} #[near_bindgen] impl NonFungibleTokenMetadataProvider for Contract { diff --git a/near-contract-standards/src/non_fungible_token/macros.rs b/near-contract-standards/src/non_fungible_token/macros.rs deleted file mode 100644 index c6a37a794..000000000 --- a/near-contract-standards/src/non_fungible_token/macros.rs +++ /dev/null @@ -1,136 +0,0 @@ -/// The core methods for a basic non-fungible token. Extension standards may be -/// added in addition to this macro. -#[macro_export] -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_bindgen] - 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_bindgen] - 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] -macro_rules! impl_non_fungible_token_approval { - ($contract: ident, $token: ident) => { - use $crate::non_fungible_token::approval::NonFungibleTokenApproval; - - #[near_bindgen] - 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] -macro_rules! impl_non_fungible_token_enumeration { - ($contract: ident, $token: ident) => { - use $crate::non_fungible_token::enumeration::NonFungibleTokenEnumeration; - - #[near_bindgen] - 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) - } - } - }; -} diff --git a/near-contract-standards/src/non_fungible_token/mod.rs b/near-contract-standards/src/non_fungible_token/mod.rs index ef936b161..09ca6e1f2 100644 --- a/near-contract-standards/src/non_fungible_token/mod.rs +++ b/near-contract-standards/src/non_fungible_token/mod.rs @@ -6,9 +6,6 @@ pub mod core; /// Trait for the [NFT enumeration standard](https://nomicon.io/Standards/NonFungibleToken/Enumeration.html). /// This provides useful view-only methods returning token supply, tokens by owner, etc. pub mod enumeration; -/// Macros typically used by a contract wanting to take advantage of the non-fungible -/// token NEAR contract standard approach. -mod macros; /// Metadata traits and implementation according to the [NFT enumeration standard](https://nomicon.io/Standards/NonFungibleToken/Metadata.html). /// This covers both the contract metadata and the individual token metadata. pub mod metadata; @@ -21,6 +18,5 @@ mod utils; pub use utils::*; pub use self::core::NonFungibleToken; -pub use macros::*; pub mod events; From 5a4cd6b3e0a36293848ae63e9acee8bb4e4615fc Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Fri, 30 Jun 2023 16:52:04 +0200 Subject: [PATCH 02/12] bump package versions --- examples/non-fungible-token/nft/Cargo.toml | 2 +- near-contract-standards/Cargo.toml | 4 ++-- near-sdk-macros/Cargo.toml | 2 +- near-sdk/Cargo.toml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/non-fungible-token/nft/Cargo.toml b/examples/non-fungible-token/nft/Cargo.toml index 16fd40d50..f36bd5b37 100644 --- a/examples/non-fungible-token/nft/Cargo.toml +++ b/examples/non-fungible-token/nft/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "non-fungible-token" -version = "1.1.0" +version = "1.2.0" authors = ["Near Inc "] edition = "2021" diff --git a/near-contract-standards/Cargo.toml b/near-contract-standards/Cargo.toml index 8db8c158e..650483633 100644 --- a/near-contract-standards/Cargo.toml +++ b/near-contract-standards/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "near-contract-standards" -version = "4.1.1" +version = "4.1.2" authors = ["Near Inc "] edition = "2021" license = "MIT OR Apache-2.0" @@ -13,7 +13,7 @@ NEAR smart contracts standard library. """ [dependencies] -near-sdk = { path = "../near-sdk", version = "~4.1.1", default-features = false, features = ["legacy"] } +near-sdk = { path = "../near-sdk", version = "~4.1.2", default-features = false, features = ["legacy"] } serde = "1" serde_json = "1" schemars = "0.8" diff --git a/near-sdk-macros/Cargo.toml b/near-sdk-macros/Cargo.toml index afb8b0aa6..e596b4fd6 100644 --- a/near-sdk-macros/Cargo.toml +++ b/near-sdk-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" authors = ["Near Inc "] edition = "2021" license = "MIT OR Apache-2.0" diff --git a/near-sdk/Cargo.toml b/near-sdk/Cargo.toml index c01705f1f..f6f44966d 100644 --- a/near-sdk/Cargo.toml +++ b/near-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" authors = ["Near Inc "] edition = "2021" license = "MIT OR Apache-2.0" @@ -21,7 +21,7 @@ required-features = ["abi", "unstable"] # Provide near_bidgen macros. serde = { version = "1", features = ["derive"] } serde_json = "1" -near-sdk-macros = { path = "../near-sdk-macros", version = "~4.1.1" } +near-sdk-macros = { path = "../near-sdk-macros", version = "~4.1.2" } near-sys = { path = "../sys", version = "0.2" } base64 = "0.13" borsh = { version = "0.9", features = ["const-generics"] } From 3932730b44e892f1ce0e690c8a3a9e51296bfbd4 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Fri, 30 Jun 2023 23:09:34 +0200 Subject: [PATCH 03/12] Updated changelog. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f7ab2df5..234af69d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ ### Fixed - Fixed invalid import from "legacy" feature flag from stabilized collection. [PR 960](https://github.com/near/near-sdk-rs/pull/960) +### Removed +- Removed declarative macros for NFT impl code generation. [PR 1042]()https://github.com/near/near-sdk-rs/pull/1042 + ## [4.1.0] - 2022-11-09 ### Added From 6fd407c4c8db19d8602fd18a95acb2afcff19a35 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Fri, 30 Jun 2023 23:10:00 +0200 Subject: [PATCH 04/12] update Cargo.lock --- examples/adder/Cargo.lock | 4 ++-- examples/callback-results/Cargo.lock | 4 ++-- examples/cross-contract-calls/Cargo.lock | 4 ++-- examples/factory-contract/Cargo.lock | 4 ++-- examples/fungible-token/Cargo.lock | 6 +++--- examples/lockable-fungible-token/Cargo.lock | 4 ++-- examples/mission-control/Cargo.lock | 4 ++-- examples/non-fungible-token/Cargo.lock | 8 ++++---- examples/status-message-collections/Cargo.lock | 4 ++-- examples/status-message/Cargo.lock | 4 ++-- examples/test-contract/Cargo.lock | 4 ++-- examples/versioned/Cargo.lock | 4 ++-- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/examples/adder/Cargo.lock b/examples/adder/Cargo.lock index 2fd86a749..b3fe45f79 100644 --- a/examples/adder/Cargo.lock +++ b/examples/adder/Cargo.lock @@ -2081,7 +2081,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2102,7 +2102,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/callback-results/Cargo.lock b/examples/callback-results/Cargo.lock index b645c3463..ee48674c7 100644 --- a/examples/callback-results/Cargo.lock +++ b/examples/callback-results/Cargo.lock @@ -2065,7 +2065,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2086,7 +2086,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/cross-contract-calls/Cargo.lock b/examples/cross-contract-calls/Cargo.lock index 7d6757335..bcc820553 100644 --- a/examples/cross-contract-calls/Cargo.lock +++ b/examples/cross-contract-calls/Cargo.lock @@ -2089,7 +2089,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2110,7 +2110,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/factory-contract/Cargo.lock b/examples/factory-contract/Cargo.lock index 8b20cc522..e65bdf1aa 100644 --- a/examples/factory-contract/Cargo.lock +++ b/examples/factory-contract/Cargo.lock @@ -2089,7 +2089,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2110,7 +2110,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/fungible-token/Cargo.lock b/examples/fungible-token/Cargo.lock index 80df77eed..ff0b4447c 100644 --- a/examples/fungible-token/Cargo.lock +++ b/examples/fungible-token/Cargo.lock @@ -1805,7 +1805,7 @@ dependencies = [ [[package]] name = "near-contract-standards" -version = "4.1.1" +version = "4.1.2" dependencies = [ "near-sdk", "schemars", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2125,7 +2125,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/lockable-fungible-token/Cargo.lock b/examples/lockable-fungible-token/Cargo.lock index 63317ec59..151dce801 100644 --- a/examples/lockable-fungible-token/Cargo.lock +++ b/examples/lockable-fungible-token/Cargo.lock @@ -2073,7 +2073,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2094,7 +2094,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/mission-control/Cargo.lock b/examples/mission-control/Cargo.lock index 81a23798e..4739c240b 100644 --- a/examples/mission-control/Cargo.lock +++ b/examples/mission-control/Cargo.lock @@ -1405,7 +1405,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1426,7 +1426,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/non-fungible-token/Cargo.lock b/examples/non-fungible-token/Cargo.lock index 6a2085167..3dd790cf9 100644 --- a/examples/non-fungible-token/Cargo.lock +++ b/examples/non-fungible-token/Cargo.lock @@ -1779,7 +1779,7 @@ dependencies = [ [[package]] name = "near-contract-standards" -version = "4.1.1" +version = "4.1.2" dependencies = [ "near-sdk", "schemars", @@ -2078,7 +2078,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2099,7 +2099,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", @@ -2203,7 +2203,7 @@ dependencies = [ [[package]] name = "non-fungible-token" -version = "1.1.0" +version = "1.2.0" dependencies = [ "near-contract-standards", "near-sdk", diff --git a/examples/status-message-collections/Cargo.lock b/examples/status-message-collections/Cargo.lock index 28b850225..8d9481c5c 100644 --- a/examples/status-message-collections/Cargo.lock +++ b/examples/status-message-collections/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/status-message/Cargo.lock b/examples/status-message/Cargo.lock index e545e0c96..b3fd7f1cb 100644 --- a/examples/status-message/Cargo.lock +++ b/examples/status-message/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/test-contract/Cargo.lock b/examples/test-contract/Cargo.lock index c1411c003..7a41775e2 100644 --- a/examples/test-contract/Cargo.lock +++ b/examples/test-contract/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/versioned/Cargo.lock b/examples/versioned/Cargo.lock index d01238a11..6fe5eb7ba 100644 --- a/examples/versioned/Cargo.lock +++ b/examples/versioned/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.1" +version = "4.1.2" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.1" +version = "4.1.2" dependencies = [ "Inflector", "proc-macro2", From 22bf7380585c9d60a144aa0e8d5cfe8f18857974 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Tue, 4 Jul 2023 10:59:38 +0200 Subject: [PATCH 05/12] Update CHANGELOG.md Co-authored-by: Vlad Frolov --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 234af69d4..0ca95d944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ - Fixed invalid import from "legacy" feature flag from stabilized collection. [PR 960](https://github.com/near/near-sdk-rs/pull/960) ### Removed -- Removed declarative macros for NFT impl code generation. [PR 1042]()https://github.com/near/near-sdk-rs/pull/1042 +- Removed declarative macros for NFT impl code generation. [PR 1042](https://github.com/near/near-sdk-rs/pull/1042) ## [4.1.0] - 2022-11-09 From 7483be76d996f7f82e36475430bf7946aea7a323 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Tue, 4 Jul 2023 20:48:17 +0200 Subject: [PATCH 06/12] Revert "update Cargo.lock" This reverts commit 6fd407c4c8db19d8602fd18a95acb2afcff19a35. --- examples/adder/Cargo.lock | 4 ++-- examples/callback-results/Cargo.lock | 4 ++-- examples/cross-contract-calls/Cargo.lock | 4 ++-- examples/factory-contract/Cargo.lock | 4 ++-- examples/fungible-token/Cargo.lock | 6 +++--- examples/lockable-fungible-token/Cargo.lock | 4 ++-- examples/mission-control/Cargo.lock | 4 ++-- examples/non-fungible-token/Cargo.lock | 8 ++++---- examples/status-message-collections/Cargo.lock | 4 ++-- examples/status-message/Cargo.lock | 4 ++-- examples/test-contract/Cargo.lock | 4 ++-- examples/versioned/Cargo.lock | 4 ++-- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/examples/adder/Cargo.lock b/examples/adder/Cargo.lock index b3fe45f79..2fd86a749 100644 --- a/examples/adder/Cargo.lock +++ b/examples/adder/Cargo.lock @@ -2081,7 +2081,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2102,7 +2102,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/callback-results/Cargo.lock b/examples/callback-results/Cargo.lock index ee48674c7..b645c3463 100644 --- a/examples/callback-results/Cargo.lock +++ b/examples/callback-results/Cargo.lock @@ -2065,7 +2065,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2086,7 +2086,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/cross-contract-calls/Cargo.lock b/examples/cross-contract-calls/Cargo.lock index bcc820553..7d6757335 100644 --- a/examples/cross-contract-calls/Cargo.lock +++ b/examples/cross-contract-calls/Cargo.lock @@ -2089,7 +2089,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2110,7 +2110,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/factory-contract/Cargo.lock b/examples/factory-contract/Cargo.lock index e65bdf1aa..8b20cc522 100644 --- a/examples/factory-contract/Cargo.lock +++ b/examples/factory-contract/Cargo.lock @@ -2089,7 +2089,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2110,7 +2110,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/fungible-token/Cargo.lock b/examples/fungible-token/Cargo.lock index ff0b4447c..80df77eed 100644 --- a/examples/fungible-token/Cargo.lock +++ b/examples/fungible-token/Cargo.lock @@ -1805,7 +1805,7 @@ dependencies = [ [[package]] name = "near-contract-standards" -version = "4.1.2" +version = "4.1.1" dependencies = [ "near-sdk", "schemars", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2125,7 +2125,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/lockable-fungible-token/Cargo.lock b/examples/lockable-fungible-token/Cargo.lock index 151dce801..63317ec59 100644 --- a/examples/lockable-fungible-token/Cargo.lock +++ b/examples/lockable-fungible-token/Cargo.lock @@ -2073,7 +2073,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2094,7 +2094,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/mission-control/Cargo.lock b/examples/mission-control/Cargo.lock index 4739c240b..81a23798e 100644 --- a/examples/mission-control/Cargo.lock +++ b/examples/mission-control/Cargo.lock @@ -1405,7 +1405,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1426,7 +1426,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/non-fungible-token/Cargo.lock b/examples/non-fungible-token/Cargo.lock index 3dd790cf9..6a2085167 100644 --- a/examples/non-fungible-token/Cargo.lock +++ b/examples/non-fungible-token/Cargo.lock @@ -1779,7 +1779,7 @@ dependencies = [ [[package]] name = "near-contract-standards" -version = "4.1.2" +version = "4.1.1" dependencies = [ "near-sdk", "schemars", @@ -2078,7 +2078,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -2099,7 +2099,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", @@ -2203,7 +2203,7 @@ dependencies = [ [[package]] name = "non-fungible-token" -version = "1.2.0" +version = "1.1.0" dependencies = [ "near-contract-standards", "near-sdk", diff --git a/examples/status-message-collections/Cargo.lock b/examples/status-message-collections/Cargo.lock index 8d9481c5c..28b850225 100644 --- a/examples/status-message-collections/Cargo.lock +++ b/examples/status-message-collections/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/status-message/Cargo.lock b/examples/status-message/Cargo.lock index b3fd7f1cb..e545e0c96 100644 --- a/examples/status-message/Cargo.lock +++ b/examples/status-message/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/test-contract/Cargo.lock b/examples/test-contract/Cargo.lock index 7a41775e2..c1411c003 100644 --- a/examples/test-contract/Cargo.lock +++ b/examples/test-contract/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", diff --git a/examples/versioned/Cargo.lock b/examples/versioned/Cargo.lock index 6fe5eb7ba..d01238a11 100644 --- a/examples/versioned/Cargo.lock +++ b/examples/versioned/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" dependencies = [ "base64 0.13.1", "borsh 0.9.3", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" dependencies = [ "Inflector", "proc-macro2", From fb798bac33a1acef0919e1fe8993fc1cb4843200 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Tue, 4 Jul 2023 20:48:25 +0200 Subject: [PATCH 07/12] Revert "bump package versions" This reverts commit 5a4cd6b3e0a36293848ae63e9acee8bb4e4615fc. --- examples/non-fungible-token/nft/Cargo.toml | 2 +- near-contract-standards/Cargo.toml | 4 ++-- near-sdk-macros/Cargo.toml | 2 +- near-sdk/Cargo.toml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/non-fungible-token/nft/Cargo.toml b/examples/non-fungible-token/nft/Cargo.toml index f36bd5b37..16fd40d50 100644 --- a/examples/non-fungible-token/nft/Cargo.toml +++ b/examples/non-fungible-token/nft/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "non-fungible-token" -version = "1.2.0" +version = "1.1.0" authors = ["Near Inc "] edition = "2021" diff --git a/near-contract-standards/Cargo.toml b/near-contract-standards/Cargo.toml index 650483633..8db8c158e 100644 --- a/near-contract-standards/Cargo.toml +++ b/near-contract-standards/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "near-contract-standards" -version = "4.1.2" +version = "4.1.1" authors = ["Near Inc "] edition = "2021" license = "MIT OR Apache-2.0" @@ -13,7 +13,7 @@ NEAR smart contracts standard library. """ [dependencies] -near-sdk = { path = "../near-sdk", version = "~4.1.2", default-features = false, features = ["legacy"] } +near-sdk = { path = "../near-sdk", version = "~4.1.1", default-features = false, features = ["legacy"] } serde = "1" serde_json = "1" schemars = "0.8" diff --git a/near-sdk-macros/Cargo.toml b/near-sdk-macros/Cargo.toml index e596b4fd6..afb8b0aa6 100644 --- a/near-sdk-macros/Cargo.toml +++ b/near-sdk-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "near-sdk-macros" -version = "4.1.2" +version = "4.1.1" authors = ["Near Inc "] edition = "2021" license = "MIT OR Apache-2.0" diff --git a/near-sdk/Cargo.toml b/near-sdk/Cargo.toml index f6f44966d..c01705f1f 100644 --- a/near-sdk/Cargo.toml +++ b/near-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "near-sdk" -version = "4.1.2" +version = "4.1.1" authors = ["Near Inc "] edition = "2021" license = "MIT OR Apache-2.0" @@ -21,7 +21,7 @@ required-features = ["abi", "unstable"] # Provide near_bidgen macros. serde = { version = "1", features = ["derive"] } serde_json = "1" -near-sdk-macros = { path = "../near-sdk-macros", version = "~4.1.2" } +near-sdk-macros = { path = "../near-sdk-macros", version = "~4.1.1" } near-sys = { path = "../sys", version = "0.2" } base64 = "0.13" borsh = { version = "0.9", features = ["const-generics"] } From c9cd08d73329b49bd24f2695bb952eaa45efd452 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Tue, 4 Jul 2023 21:02:47 +0200 Subject: [PATCH 08/12] deprecate macros instead of removing them --- CHANGELOG.md | 3 + examples/non-fungible-token/nft/src/lib.rs | 11 +- .../src/non_fungible_token/macros.rs | 139 ++++++++++++++++++ .../src/non_fungible_token/mod.rs | 4 + 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 near-contract-standards/src/non_fungible_token/macros.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ca95d944..d97fbd0ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ ### Fixed - Exposed missing iterator types used in `near_sdk::store::UnorderedSet`. [PR 961](https://github.com/near/near-sdk-rs/pull/961) +### Removed +- Deprecated declarative macros for NFT impl code generation. [PR 1042](https://github.com/near/near-sdk-rs/pull/1042) + ## [4.1.1] - 2022-11-10 ### Fixed diff --git a/examples/non-fungible-token/nft/src/lib.rs b/examples/non-fungible-token/nft/src/lib.rs index 49496ecfb..b89f580b7 100644 --- a/examples/non-fungible-token/nft/src/lib.rs +++ b/examples/non-fungible-token/nft/src/lib.rs @@ -15,13 +15,14 @@ NOTES: - To prevent the deployed contract from being modified or deleted, it should not have any access keys on its account. */ +use std::collections::HashMap; use near_contract_standards::non_fungible_token::metadata::{ NFTContractMetadata, NonFungibleTokenMetadataProvider, TokenMetadata, NFT_METADATA_SPEC, }; use near_contract_standards::non_fungible_token::NonFungibleToken; use near_contract_standards::non_fungible_token::{Token, TokenId}; use near_contract_standards::non_fungible_token::approval::NonFungibleTokenApproval; -use near_contract_standards::non_fungible_token::core::NonFungibleTokenCore; +use near_contract_standards::non_fungible_token::core::{NonFungibleTokenCore, NonFungibleTokenResolver}; use near_contract_standards::non_fungible_token::enumeration::NonFungibleTokenEnumeration; use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::LazyOption; @@ -121,6 +122,14 @@ impl NonFungibleTokenCore for Contract { } } +#[near_bindgen] +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.tokens.nft_resolve_transfer(previous_owner_id, receiver_id, token_id, approved_account_ids) + } +} + #[near_bindgen] impl NonFungibleTokenApproval for Contract { #[payable] diff --git a/near-contract-standards/src/non_fungible_token/macros.rs b/near-contract-standards/src/non_fungible_token/macros.rs new file mode 100644 index 000000000..2f77f8b3a --- /dev/null +++ b/near-contract-standards/src/non_fungible_token/macros.rs @@ -0,0 +1,139 @@ +/// 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 NonFungibleTokenCore and 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_bindgen] + 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_bindgen] + 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 NonFungibleTokenApproval trait manually instead.")] +macro_rules! impl_non_fungible_token_approval { + ($contract: ident, $token: ident) => { + use $crate::non_fungible_token::approval::NonFungibleTokenApproval; + + #[near_bindgen] + 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 NonFungibleTokenEnumeration trait manually instead.")] +macro_rules! impl_non_fungible_token_enumeration { + ($contract: ident, $token: ident) => { + use $crate::non_fungible_token::enumeration::NonFungibleTokenEnumeration; + + #[near_bindgen] + 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) + } + } + }; +} diff --git a/near-contract-standards/src/non_fungible_token/mod.rs b/near-contract-standards/src/non_fungible_token/mod.rs index 09ca6e1f2..ef936b161 100644 --- a/near-contract-standards/src/non_fungible_token/mod.rs +++ b/near-contract-standards/src/non_fungible_token/mod.rs @@ -6,6 +6,9 @@ pub mod core; /// Trait for the [NFT enumeration standard](https://nomicon.io/Standards/NonFungibleToken/Enumeration.html). /// This provides useful view-only methods returning token supply, tokens by owner, etc. pub mod enumeration; +/// Macros typically used by a contract wanting to take advantage of the non-fungible +/// token NEAR contract standard approach. +mod macros; /// Metadata traits and implementation according to the [NFT enumeration standard](https://nomicon.io/Standards/NonFungibleToken/Metadata.html). /// This covers both the contract metadata and the individual token metadata. pub mod metadata; @@ -18,5 +21,6 @@ mod utils; pub use utils::*; pub use self::core::NonFungibleToken; +pub use macros::*; pub mod events; From 7b2b07d4f8c932743c3d3e82e3d68b8bdbc7fe45 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Thu, 6 Jul 2023 17:58:50 +0200 Subject: [PATCH 09/12] add docs --- CHANGELOG.md | 5 +-- .../src/non_fungible_token/approval/mod.rs | 40 +++++++++++++++++++ .../src/non_fungible_token/core/mod.rs | 31 ++++++++++++++ .../src/non_fungible_token/core/resolver.rs | 24 +++++++++++ .../src/non_fungible_token/enumeration/mod.rs | 37 +++++++++++++++++ .../src/non_fungible_token/macros.rs | 4 +- .../src/non_fungible_token/mod.rs | 6 ++- 7 files changed, 141 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d97fbd0ee..8c9d50620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,16 +5,13 @@ ### Fixed - Exposed missing iterator types used in `near_sdk::store::UnorderedSet`. [PR 961](https://github.com/near/near-sdk-rs/pull/961) -### Removed -- Deprecated declarative macros for NFT impl code generation. [PR 1042](https://github.com/near/near-sdk-rs/pull/1042) - ## [4.1.1] - 2022-11-10 ### Fixed - Fixed invalid import from "legacy" feature flag from stabilized collection. [PR 960](https://github.com/near/near-sdk-rs/pull/960) ### Removed -- Removed declarative macros for NFT impl code generation. [PR 1042](https://github.com/near/near-sdk-rs/pull/1042) +- Deprecated declarative macros for NFT impl code generation. [PR 1042](https://github.com/near/near-sdk-rs/pull/1042) ## [4.1.0] - 2022-11-09 diff --git a/near-contract-standards/src/non_fungible_token/approval/mod.rs b/near-contract-standards/src/non_fungible_token/approval/mod.rs index 2b415b4c4..3576f3a1c 100644 --- a/near-contract-standards/src/non_fungible_token/approval/mod.rs +++ b/near-contract-standards/src/non_fungible_token/approval/mod.rs @@ -17,6 +17,46 @@ use near_sdk::Promise; /// /// [approval management standard]: https://nomicon.io/Standards/NonFungibleToken/ApprovalManagement.html /// [core non-fungible token standard]: https://nomicon.io/Standards/NonFungibleToken/Core.html +/// +/// # Examples +/// +/// ``` +/// use std::collections::HashMap; +/// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +/// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen, Promise}; +/// use near_contract_standards::non_fungible_token::{NonFungibleToken, TokenId}; +/// use near_contract_standards::non_fungible_token::approval::NonFungibleTokenApproval; +/// +/// #[near_bindgen] +/// #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +/// pub struct Contract { +/// tokens: NonFungibleToken, +///} +/// +/// #[near_bindgen] +/// impl NonFungibleTokenApproval for Contract { +/// #[payable] +/// fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) -> Option { +/// self.tokens.nft_approve(token_id, account_id, msg) +/// } +/// +/// #[payable] +/// fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { +/// self.tokens.nft_revoke(token_id, account_id); +/// } +/// +/// #[payable] +/// fn nft_revoke_all(&mut self, token_id: TokenId) { +/// self.tokens.nft_revoke_all(token_id); +/// +/// } +/// +/// fn nft_is_approved(&self, token_id: TokenId, approved_account_id: AccountId, approval_id: Option) -> bool { +/// self.tokens.nft_is_approved(token_id, approved_account_id, approval_id) +/// } +/// } +/// ``` +/// pub trait NonFungibleTokenApproval { /// Add an approved account for a specific token. /// diff --git a/near-contract-standards/src/non_fungible_token/core/mod.rs b/near-contract-standards/src/non_fungible_token/core/mod.rs index e75160f7e..659de459d 100644 --- a/near-contract-standards/src/non_fungible_token/core/mod.rs +++ b/near-contract-standards/src/non_fungible_token/core/mod.rs @@ -19,6 +19,37 @@ use near_sdk::PromiseOrValue; /// understand how the cross-contract call work. /// /// [core non-fungible token standard]: +/// +/// # Examples +/// +/// ``` +/// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +/// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen}; +/// use near_contract_standards::non_fungible_token::{core::NonFungibleTokenCore, NonFungibleToken, TokenId, Token}; +/// +/// #[near_bindgen] +/// #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +/// pub struct Contract { +/// tokens: NonFungibleToken, +///} +/// #[near_bindgen] +/// impl NonFungibleTokenCore for Contract { +/// #[payable] +/// fn nft_transfer(&mut self, receiver_id: AccountId, token_id: TokenId, approval_id: Option, memo: Option) { +/// self.tokens.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.tokens.nft_transfer_call(receiver_id, token_id, approval_id, memo, msg) +/// } +/// +/// fn nft_token(&self, token_id: TokenId) -> Option { +/// self.tokens.nft_token(token_id) +/// } +///} +/// ``` +/// pub trait NonFungibleTokenCore { /// Simple transfer. Transfer a given `token_id` from current owner to /// `receiver_id`. diff --git a/near-contract-standards/src/non_fungible_token/core/resolver.rs b/near-contract-standards/src/non_fungible_token/core/resolver.rs index 696ac2e86..4d9328300 100644 --- a/near-contract-standards/src/non_fungible_token/core/resolver.rs +++ b/near-contract-standards/src/non_fungible_token/core/resolver.rs @@ -3,6 +3,30 @@ use near_sdk::{ext_contract, AccountId}; use std::collections::HashMap; /// Used when an NFT is transferred using `nft_transfer_call`. This is the method that's called after `nft_on_transfer`. This trait is implemented on the NFT contract. +/// +/// # Examples +/// +/// ``` +/// use std::collections::HashMap; +/// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +/// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen}; +/// use near_contract_standards::non_fungible_token::{NonFungibleToken, TokenId}; +/// use near_contract_standards::non_fungible_token::core::NonFungibleTokenResolver; +/// +/// #[near_bindgen] +/// #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +/// pub struct Contract { +/// tokens: NonFungibleToken, +///} +/// #[near_bindgen] +/// 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.tokens.nft_resolve_transfer(previous_owner_id, receiver_id, token_id, approved_account_ids) +/// } +/// } +/// ``` +/// #[ext_contract(ext_nft_resolver)] pub trait NonFungibleTokenResolver { /// Finalize an `nft_transfer_call` chain of cross-contract calls. diff --git a/near-contract-standards/src/non_fungible_token/enumeration/mod.rs b/near-contract-standards/src/non_fungible_token/enumeration/mod.rs index f38f513d1..70becb2cf 100644 --- a/near-contract-standards/src/non_fungible_token/enumeration/mod.rs +++ b/near-contract-standards/src/non_fungible_token/enumeration/mod.rs @@ -5,6 +5,43 @@ use near_sdk::json_types::U128; use near_sdk::AccountId; /// Offers methods helpful in determining account ownership of NFTs and provides a way to page through NFTs per owner, determine total supply, etc. +/// +/// # Examples +/// +/// ``` +/// use std::collections::HashMap; +/// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +/// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen, Promise}; +/// use near_contract_standards::non_fungible_token::{NonFungibleToken, TokenId, Token}; +/// use near_contract_standards::non_fungible_token::enumeration::NonFungibleTokenEnumeration; +/// use near_sdk::json_types::U128; +/// +/// #[near_bindgen] +/// #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +/// pub struct Contract { +/// tokens: NonFungibleToken, +///} +/// +/// #[near_bindgen] +/// impl NonFungibleTokenEnumeration for Contract { +/// fn nft_total_supply(&self) -> U128 { +/// self.tokens.nft_total_supply() +/// } +/// +/// fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { +/// self.tokens.nft_tokens(from_index, limit) +/// } +/// +/// fn nft_supply_for_owner(&self, account_id: AccountId) -> U128 { +/// self.tokens.nft_supply_for_owner(account_id) +/// } +/// +/// fn nft_tokens_for_owner(&self, account_id: AccountId, from_index: Option, limit: Option) -> Vec { +/// self.tokens.nft_tokens_for_owner(account_id, from_index, limit) +/// } +/// } +/// ``` +/// pub trait NonFungibleTokenEnumeration { /// Returns the total supply of non-fungible tokens as a string representing an /// unsigned 128-bit integer to avoid JSON number limit of 2^53. diff --git a/near-contract-standards/src/non_fungible_token/macros.rs b/near-contract-standards/src/non_fungible_token/macros.rs index 2f77f8b3a..3870346c8 100644 --- a/near-contract-standards/src/non_fungible_token/macros.rs +++ b/near-contract-standards/src/non_fungible_token/macros.rs @@ -1,7 +1,9 @@ /// 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 NonFungibleTokenCore and NonFungibleTokenResolver traits manually instead.")] +#[deprecated( + note = "implement the NonFungibleTokenCore and NonFungibleTokenResolver traits manually instead." +)] macro_rules! impl_non_fungible_token_core { ($contract: ident, $token: ident) => { use $crate::non_fungible_token::core::NonFungibleTokenCore; diff --git a/near-contract-standards/src/non_fungible_token/mod.rs b/near-contract-standards/src/non_fungible_token/mod.rs index ef936b161..5bc8d4863 100644 --- a/near-contract-standards/src/non_fungible_token/mod.rs +++ b/near-contract-standards/src/non_fungible_token/mod.rs @@ -20,7 +20,11 @@ pub use self::token::{Token, TokenId}; mod utils; pub use utils::*; -pub use self::core::NonFungibleToken; pub use macros::*; +pub use self::approval::NonFungibleTokenApproval; +pub use self::core::NonFungibleToken; +pub use self::core::NonFungibleTokenResolver; +pub use self::enumeration::NonFungibleTokenEnumeration; + pub mod events; From 587a47be1df5351faa28e8a8f25de3a7ff713315 Mon Sep 17 00:00:00 2001 From: Roman Useinov Date: Mon, 10 Jul 2023 22:40:51 +0200 Subject: [PATCH 10/12] fix imports --- near-contract-standards/src/non_fungible_token/approval/mod.rs | 3 +-- .../src/non_fungible_token/core/resolver.rs | 3 +-- .../src/non_fungible_token/enumeration/mod.rs | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/near-contract-standards/src/non_fungible_token/approval/mod.rs b/near-contract-standards/src/non_fungible_token/approval/mod.rs index 3576f3a1c..735698ac8 100644 --- a/near-contract-standards/src/non_fungible_token/approval/mod.rs +++ b/near-contract-standards/src/non_fungible_token/approval/mod.rs @@ -24,8 +24,7 @@ use near_sdk::Promise; /// use std::collections::HashMap; /// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; /// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen, Promise}; -/// use near_contract_standards::non_fungible_token::{NonFungibleToken, TokenId}; -/// use near_contract_standards::non_fungible_token::approval::NonFungibleTokenApproval; +/// use near_contract_standards::non_fungible_token::{TokenId, NonFungibleToken, NonFungibleTokenApproval}; /// /// #[near_bindgen] /// #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] diff --git a/near-contract-standards/src/non_fungible_token/core/resolver.rs b/near-contract-standards/src/non_fungible_token/core/resolver.rs index 4d9328300..63b2da4ad 100644 --- a/near-contract-standards/src/non_fungible_token/core/resolver.rs +++ b/near-contract-standards/src/non_fungible_token/core/resolver.rs @@ -10,8 +10,7 @@ use std::collections::HashMap; /// use std::collections::HashMap; /// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; /// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen}; -/// use near_contract_standards::non_fungible_token::{NonFungibleToken, TokenId}; -/// use near_contract_standards::non_fungible_token::core::NonFungibleTokenResolver; +/// use near_contract_standards::non_fungible_token::{NonFungibleToken, NonFungibleTokenResolver, TokenId}; /// /// #[near_bindgen] /// #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] diff --git a/near-contract-standards/src/non_fungible_token/enumeration/mod.rs b/near-contract-standards/src/non_fungible_token/enumeration/mod.rs index 70becb2cf..0711ff12d 100644 --- a/near-contract-standards/src/non_fungible_token/enumeration/mod.rs +++ b/near-contract-standards/src/non_fungible_token/enumeration/mod.rs @@ -12,8 +12,7 @@ use near_sdk::AccountId; /// use std::collections::HashMap; /// use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; /// use near_sdk::{PanicOnDefault, AccountId, PromiseOrValue, near_bindgen, Promise}; -/// use near_contract_standards::non_fungible_token::{NonFungibleToken, TokenId, Token}; -/// use near_contract_standards::non_fungible_token::enumeration::NonFungibleTokenEnumeration; +/// use near_contract_standards::non_fungible_token::{NonFungibleToken, NonFungibleTokenEnumeration, TokenId, Token}; /// use near_sdk::json_types::U128; /// /// #[near_bindgen] From a1eab39e92f1ed57b082f31e65b847b32183df58 Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Tue, 11 Jul 2023 15:35:15 +0200 Subject: [PATCH 11/12] docs: Updated the deprecation note with a fully-qualified path to the traits --- near-contract-standards/src/non_fungible_token/macros.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/near-contract-standards/src/non_fungible_token/macros.rs b/near-contract-standards/src/non_fungible_token/macros.rs index 3870346c8..08d54326e 100644 --- a/near-contract-standards/src/non_fungible_token/macros.rs +++ b/near-contract-standards/src/non_fungible_token/macros.rs @@ -2,7 +2,7 @@ /// added in addition to this macro. #[macro_export] #[deprecated( - note = "implement the NonFungibleTokenCore and NonFungibleTokenResolver traits manually instead." + 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) => { @@ -63,7 +63,7 @@ macro_rules! impl_non_fungible_token_core { /// Non-fungible token approval management allows for an escrow system where /// multiple approvals per token exist. #[macro_export] -#[deprecated(note = "implement the NonFungibleTokenApproval trait manually instead.")] +#[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; @@ -105,7 +105,7 @@ macro_rules! impl_non_fungible_token_approval { /// 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 NonFungibleTokenEnumeration trait manually instead.")] +#[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; From 8362d69d3c8936a939d97a0d9be60fda7b03e065 Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Tue, 11 Jul 2023 15:37:01 +0200 Subject: [PATCH 12/12] fmt --- near-contract-standards/src/non_fungible_token/macros.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/near-contract-standards/src/non_fungible_token/macros.rs b/near-contract-standards/src/non_fungible_token/macros.rs index 08d54326e..ecd98045a 100644 --- a/near-contract-standards/src/non_fungible_token/macros.rs +++ b/near-contract-standards/src/non_fungible_token/macros.rs @@ -63,7 +63,9 @@ macro_rules! impl_non_fungible_token_core { /// 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.")] +#[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; @@ -105,7 +107,9 @@ macro_rules! impl_non_fungible_token_approval { /// 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.")] +#[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;