From dd327d96b325f1219a9af0f008aa7ff3cbc078fd Mon Sep 17 00:00:00 2001 From: garikbesson Date: Thu, 15 Feb 2024 21:01:45 +0100 Subject: [PATCH 01/28] fix integration test --- integration-tests/ts/src/main.ava.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/ts/src/main.ava.ts b/integration-tests/ts/src/main.ava.ts index 0418a1c..fc1e235 100644 --- a/integration-tests/ts/src/main.ava.ts +++ b/integration-tests/ts/src/main.ava.ts @@ -347,7 +347,7 @@ test("cross contract: reselling and royalties", async (t) => { ) t.is( bob_balance_after_2.sub(bob_balance_before_2).toHuman(), - "24.00031 N", + "24.00037 N", "Bob balance should decrease by sale price minus royalty fee of 20% of sale price" ) t.is( From 89bca73f2afa5ab72d942e936b05cbbac2750f9a Mon Sep 17 00:00:00 2001 From: garikbesson Date: Thu, 22 Feb 2024 21:20:31 +0100 Subject: [PATCH 02/28] fix integration tests --- integration-tests/rs/Cargo.toml | 26 +-- integration-tests/rs/rust-toolchain.toml | 4 + integration-tests/rs/src/helpers.rs | 71 ++++--- integration-tests/rs/src/tests.rs | 234 +++++++++-------------- integration-tests/ts/src/main.ava.ts | 4 +- nft-contract/src/tests.rs | 1 - out/main.wasm | Bin 296863 -> 301757 bytes out/market.wasm | Bin 227248 -> 230500 bytes out/series.wasm | Bin 333694 -> 339347 bytes 9 files changed, 138 insertions(+), 202 deletions(-) create mode 100644 integration-tests/rs/rust-toolchain.toml diff --git a/integration-tests/rs/Cargo.toml b/integration-tests/rs/Cargo.toml index c588ca5..2f955b8 100644 --- a/integration-tests/rs/Cargo.toml +++ b/integration-tests/rs/Cargo.toml @@ -1,22 +1,24 @@ [package] -name = "fungible-token-integration-tests" +name = "nonfungible-token-integration-tests" version = "1.0.0" publish = false -edition = "2018" +edition = "2021" + +[dependencies] +near-sdk = "4.1.1" +uint = { version = "0.9.3", default-features = false } + +[patch.crates-io] +parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } [dev-dependencies] +anyhow = "1.0.80" near-sdk = "4.1.1" -anyhow = "1.0.79" -borsh = "1.3.1" -maplit = "1.0.2" -near-units = "0.2.0" -# arbitrary_precision enabled for u128 types that workspaces requires for Balance types -serde_json = { version = "1.0.113", features = ["arbitrary_precision"] } + tokio = { version = "1.36.0", features = ["full"] } -tracing = "0.1.40" -tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } -workspaces = "0.7.0" -pkg-config = "0.3.29" +near-workspaces = { version = "0.10.0", default-features = false, features = ["install"] } +serde_json = { version = "1.0.113", features = ["arbitrary_precision"] } + [[example]] name = "integration-tests" diff --git a/integration-tests/rs/rust-toolchain.toml b/integration-tests/rs/rust-toolchain.toml new file mode 100644 index 0000000..1371a30 --- /dev/null +++ b/integration-tests/rs/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.76" +components = ["rustfmt"] +targets = ["wasm32-unknown-unknown"] \ No newline at end of file diff --git a/integration-tests/rs/src/helpers.rs b/integration-tests/rs/src/helpers.rs index 77665ce..67cf5f8 100644 --- a/integration-tests/rs/src/helpers.rs +++ b/integration-tests/rs/src/helpers.rs @@ -1,13 +1,12 @@ use serde_json::json; -use workspaces::{network::Sandbox, Account, Contract, Worker, AccountDetails}; +use near_workspaces::{types::{NearToken, AccountDetails}, Account, Contract}; pub const DEFAULT_DEPOSIT: u128 = 6760000000000000000000 as u128; -pub const DEFAULT_GAS: u128 = 300000000000000 as u128; +pub const ONE_YOCTO_NEAR: NearToken = NearToken::from_yoctonear(1); pub async fn mint_nft( user: &Account, nft_contract: &Contract, - worker: &Worker, token_id: &str, ) -> anyhow::Result<()> { let request_payload = json!({ @@ -20,9 +19,9 @@ pub async fn mint_nft( }, }); - user.call(&worker, nft_contract.id(), "nft_mint") - .args_json(request_payload)? - .deposit(DEFAULT_DEPOSIT) + let _ = user.call(nft_contract.id(), "nft_mint") + .args_json(request_payload) + .deposit(NearToken::from_yoctonear(DEFAULT_DEPOSIT)) .transact() .await?; @@ -33,7 +32,6 @@ pub async fn approve_nft( market_contract: &Contract, user: &Account, nft_contract: &Contract, - worker: &Worker, token_id: &str, ) -> anyhow::Result<()> { let request_payload = json!({ @@ -42,9 +40,9 @@ pub async fn approve_nft( "msg": serde_json::Value::Null, }); - user.call(&worker, nft_contract.id(), "nft_approve") - .args_json(request_payload)? - .deposit(DEFAULT_DEPOSIT) + let _ = user.call(nft_contract.id(), "nft_approve") + .args_json(request_payload) + .deposit(NearToken::from_yoctonear(DEFAULT_DEPOSIT)) .transact() .await?; @@ -54,16 +52,15 @@ pub async fn approve_nft( pub async fn pay_for_storage( user: &Account, market_contract: &Contract, - worker: &Worker, amount: u128, ) -> anyhow::Result<()> { let request_payload = json!({}); - user.call(&worker, market_contract.id(), "storage_deposit") - .args_json(request_payload)? - .deposit(amount) + let _ = user.call(market_contract.id(), "storage_deposit") + .args_json(request_payload) + .deposit(NearToken::from_yoctonear(amount)) .transact() - .await?; + .await; Ok(()) } @@ -72,7 +69,6 @@ pub async fn place_nft_for_sale( user: &Account, market_contract: &Contract, nft_contract: &Contract, - worker: &Worker, token_id: &str, price: u128, ) -> anyhow::Result<()> { @@ -82,28 +78,26 @@ pub async fn place_nft_for_sale( "msg": format!(r#"{{ "sale_conditions" : "{}" }}"#, price.to_string()), }); - user.call(&worker, nft_contract.id(), "nft_approve") - .args_json(request_payload)? - .deposit(DEFAULT_DEPOSIT) + let _ = user.call(nft_contract.id(), "nft_approve") + .args_json(request_payload) + .deposit(NearToken::from_yoctonear(DEFAULT_DEPOSIT)) .transact() - .await?; + .await; Ok(()) } pub async fn get_user_balance( user: &Account, - worker: &Worker, ) -> anyhow::Result { - let details: AccountDetails = user.view_account(worker).await?; - Ok(details.balance) + let details: AccountDetails = user.view_account().await?; + Ok(details.balance.as_yoctonear()) } pub async fn purchase_listed_nft( bidder: &Account, market_contract: &Contract, nft_contract: &Contract, - worker: &Worker, token_id: &str, offer_price: u128 ) -> anyhow::Result<()> { @@ -112,12 +106,12 @@ pub async fn purchase_listed_nft( "nft_contract_id": nft_contract.id(), }); - bidder.call(&worker, market_contract.id(), "offer") - .args_json(request_payload)? - .gas(DEFAULT_GAS as u64) - .deposit(offer_price) + let _ = bidder.call(market_contract.id(), "offer") + .args_json(request_payload) + .max_gas() + .deposit(NearToken::from_yoctonear(offer_price)) .transact() - .await?; + .await; Ok(()) } @@ -126,7 +120,6 @@ pub async fn transfer_nft( sender: &Account, receiver: &Account, nft_contract: &Contract, - worker: &Worker, token_id: &str, ) -> anyhow::Result<()> { let request_payload = json!({ @@ -135,27 +128,27 @@ pub async fn transfer_nft( "approval_id": 1 as u64, }); - sender.call(&worker, nft_contract.id(), "nft_transfer") - .args_json(request_payload)? - .gas(DEFAULT_GAS as u64) - .deposit(1) + let _ = sender.call(nft_contract.id(), "nft_transfer") + .args_json(request_payload) + .max_gas() + .deposit(ONE_YOCTO_NEAR) .transact() - .await?; + .await; Ok(()) } pub async fn get_nft_token_info( nft_contract: &Contract, - worker: &Worker, token_id: &str, ) -> anyhow::Result { let token_info: serde_json::Value = nft_contract - .call(&worker, "nft_token") - .args_json(json!({"token_id": token_id}))? + .call("nft_token") + .args_json(json!({"token_id": token_id})) .transact() .await? - .json()?; + .json() + .unwrap(); Ok(token_info) } diff --git a/integration-tests/rs/src/tests.rs b/integration-tests/rs/src/tests.rs index 6837f33..f03e640 100644 --- a/integration-tests/rs/src/tests.rs +++ b/integration-tests/rs/src/tests.rs @@ -1,7 +1,5 @@ -use near_units::parse_near; use serde_json::json; -use workspaces::prelude::*; -use workspaces::{network::Sandbox, Account, Contract, Worker}; +use near_workspaces::{types::{NearToken}, Account, Contract}; mod helpers; @@ -11,7 +9,7 @@ const MARKET_WASM_FILEPATH: &str = "../../out/market.wasm"; #[tokio::main] async fn main() -> anyhow::Result<()> { // initiate environemnt - let worker = workspaces::sandbox().await?; + let worker = near_workspaces::sandbox().await?; // deploy contracts let nft_wasm = std::fs::read(NFT_WASM_FILEPATH)?; @@ -20,47 +18,46 @@ async fn main() -> anyhow::Result<()> { let market_contract = worker.dev_deploy(&market_wasm).await?; // create accounts - let owner = worker.root_account(); + let owner = worker.root_account().unwrap(); let alice = owner - .create_subaccount(&worker, "alice") - .initial_balance(parse_near!("30 N")) + .create_subaccount("alice") + .initial_balance(NearToken::from_near(30)) .transact() .await? .into_result()?; let bob = owner - .create_subaccount(&worker, "bob") - .initial_balance(parse_near!("30 N")) + .create_subaccount("bob") + .initial_balance(NearToken::from_near(30)) .transact() .await? .into_result()?; let charlie = owner - .create_subaccount(&worker, "charlie") - .initial_balance(parse_near!("30 N")) + .create_subaccount("charlie") + .initial_balance(NearToken::from_near(30)) .transact() .await? .into_result()?; // Initialize contracts - nft_contract - .call(&worker, "new_default_meta") - .args_json(serde_json::json!({"owner_id": owner.id()}))? + let _ = nft_contract + .call("new_default_meta") + .args_json(serde_json::json!({"owner_id": owner.id()})) .transact() .await?; - market_contract - .call(&worker, "new") - .args_json(serde_json::json!({"owner_id": owner.id()}))? + let _ = market_contract + .call("new") + .args_json(serde_json::json!({"owner_id": owner.id()})) .transact() .await?; // begin tests - test_nft_metadata_view(&owner, &nft_contract, &worker).await?; - test_nft_mint_call(&owner, &alice, &nft_contract, &worker).await?; - test_nft_approve_call(&bob, &nft_contract, &market_contract, &worker).await?; - test_nft_approve_call_long_msg_string(&alice, &nft_contract, &market_contract, &worker).await?; - test_sell_nft_listed_on_marketplace(&alice, &nft_contract, &market_contract, &bob, &worker).await?; - test_transfer_nft_when_listed_on_marketplace(&alice, &bob, &charlie, &nft_contract, &market_contract, &worker).await?; - test_approval_revoke(&alice, &bob, &nft_contract, &market_contract, &worker).await?; - test_reselling_and_royalties(&alice, &bob, &charlie, &nft_contract, &market_contract, &worker).await?; + test_nft_metadata_view(&owner, &nft_contract).await?; + test_nft_mint_call(&owner, &alice, &nft_contract).await?; + test_nft_approve_call(&bob, &nft_contract, &market_contract).await?; + test_sell_nft_listed_on_marketplace(&alice, &nft_contract, &market_contract, &bob).await?; + test_transfer_nft_when_listed_on_marketplace(&alice, &bob, &charlie, &nft_contract, &market_contract).await?; + test_approval_revoke(&alice, &bob, &nft_contract, &market_contract).await?; + test_reselling_and_royalties(&alice, &bob, &charlie, &nft_contract, &market_contract).await?; Ok(()) } @@ -68,7 +65,6 @@ async fn main() -> anyhow::Result<()> { async fn test_nft_metadata_view( owner: &Account, contract: &Contract, - worker: &Worker, ) -> anyhow::Result<()> { let expected = json!({ "base_uri": serde_json::Value::Null, @@ -80,8 +76,8 @@ async fn test_nft_metadata_view( "symbol": "GOTEAM", }); let res: serde_json::Value = owner - .call(&worker, contract.id(), "nft_metadata") - .args_json(json!({ "account_id": owner.id() }))? + .call(contract.id(), "nft_metadata") + .args_json(json!({ "account_id": owner.id() })) .transact() .await? .json()?; @@ -94,7 +90,6 @@ async fn test_nft_mint_call( owner: &Account, user: &Account, contract: &Contract, - worker: &Worker, ) -> anyhow::Result<()> { let request_payload = json!({ "token_id": "1", @@ -106,15 +101,15 @@ async fn test_nft_mint_call( }, }); - user.call(&worker, contract.id(), "nft_mint") - .args_json(request_payload)? - .deposit(parse_near!("0.008 N")) + let _ = user.call(contract.id(), "nft_mint") + .args_json(request_payload) + .deposit(NearToken::from_yoctonear(8000000000000000000000)) .transact() - .await?; + .await; let tokens: serde_json::Value = owner - .call(&worker, contract.id(), "nft_tokens") - .args_json(serde_json::json!({}))? + .call(contract.id(), "nft_tokens") + .args_json(serde_json::json!({})) .transact() .await? .json()?; @@ -151,19 +146,18 @@ async fn test_nft_approve_call( user: &Account, nft_contract: &Contract, market_contract: &Contract, - worker: &Worker, ) -> anyhow::Result<()> { let token_id = "2"; - helpers::mint_nft(user, nft_contract, worker, token_id).await?; - helpers::approve_nft(market_contract, user, nft_contract, worker, token_id).await?; + helpers::mint_nft(user, nft_contract, token_id).await?; + helpers::approve_nft(market_contract, user, nft_contract, token_id).await?; let view_payload = json!({ "token_id": token_id, "approved_account_id": market_contract.id(), }); let result: bool = user - .call(&worker, nft_contract.id(), "nft_is_approved") - .args_json(view_payload)? + .call(nft_contract.id(), "nft_is_approved") + .args_json(view_payload) .transact() .await? .json()?; @@ -173,76 +167,23 @@ async fn test_nft_approve_call( Ok(()) } -async fn test_nft_approve_call_long_msg_string( - user: &Account, - nft_contract: &Contract, - market_contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let token_id = "3"; - helpers::mint_nft(user, nft_contract, worker, token_id).await?; - helpers::pay_for_storage(user, market_contract, worker, 10000000000000000000000).await?; - - let approve_payload = json!({ - "token_id": token_id, - "account_id": market_contract.id(), - "msg": "sample message".repeat(10240), - }); - - match user.call(&worker, nft_contract.id(), "nft_approve") - .args_json(approve_payload)? - .deposit(helpers::DEFAULT_DEPOSIT) - .gas(helpers::DEFAULT_GAS as u64) - .transact() - .await - { - Ok(_result) => { - panic!("test_nft_approve_call_long_msg_string worked despite insufficient gas") - } - Err(e) => { - let e_string = e.to_string(); - if !e_string - .contains("Not valid SaleArgs") - { - panic!("test_nft_approve_call_long_msg_string displays unexpected error message: {:?}", e_string); - } - - let view_payload = json!({ - "token_id": token_id, - "approved_account_id": market_contract.id(), - }); - let result: bool = user - .call(&worker, nft_contract.id(), "nft_is_approved") - .args_json(view_payload)? - .transact() - .await? - .json()?; - - assert_eq!(result, true); - println!(" Passed ✅ test_nft_approve_call_long_msg_string"); - } - } - Ok(()) -} - async fn test_sell_nft_listed_on_marketplace( seller: &Account, nft_contract: &Contract, market_contract: &Contract, buyer: &Account, - worker: &Worker, ) -> anyhow::Result<()> { let token_id = "4"; let sale_price = 300000000000000000000000 as u128; // 0.3 NEAR in yoctoNEAR - helpers::mint_nft(seller, nft_contract, worker, token_id).await?; - helpers::pay_for_storage(seller, market_contract, worker, 10000000000000000000000 as u128).await?; - helpers::place_nft_for_sale(seller, market_contract, nft_contract, worker, token_id, sale_price).await?; + helpers::mint_nft(seller, nft_contract, token_id).await?; + helpers::pay_for_storage(seller, market_contract, 10000000000000000000000 as u128).await?; + helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; - let before_seller_balance: u128 = helpers::get_user_balance(seller, worker).await?; - let before_buyer_balance: u128 = helpers::get_user_balance(buyer, worker).await?; - helpers::purchase_listed_nft(buyer, market_contract, nft_contract, worker, token_id, sale_price).await?; - let after_seller_balance: u128 = helpers::get_user_balance(seller, worker).await?; - let after_buyer_balance: u128 = helpers::get_user_balance(buyer, worker).await?; + let before_seller_balance: u128 = helpers::get_user_balance(seller).await?; + let before_buyer_balance: u128 = helpers::get_user_balance(buyer).await?; + helpers::purchase_listed_nft(buyer, market_contract, nft_contract, token_id, sale_price).await?; + let after_seller_balance: u128 = helpers::get_user_balance(seller).await?; + let after_buyer_balance: u128 = helpers::get_user_balance(buyer).await?; let dp = 1; // being exact requires keeping track of gas usage assert_eq!(helpers::round_to_near_dp(after_seller_balance, dp), helpers::round_to_near_dp(before_seller_balance + sale_price, dp), "seller did not receive the sale price"); @@ -258,25 +199,24 @@ async fn test_transfer_nft_when_listed_on_marketplace( second_buyer: &Account, nft_contract: &Contract, market_contract: &Contract, - worker: &Worker, ) -> anyhow::Result<()> { let token_id = "5"; let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR - helpers::mint_nft(seller, nft_contract, worker, token_id).await?; - helpers::pay_for_storage(seller, market_contract, worker, 10000000000000000000000 as u128).await?; - helpers::place_nft_for_sale(seller, market_contract, nft_contract, worker, token_id, sale_price).await?; + helpers::mint_nft(seller, nft_contract, token_id).await?; + helpers::pay_for_storage(seller, market_contract, 10000000000000000000000 as u128).await?; + helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; - helpers::transfer_nft(seller, first_buyer, nft_contract, worker, token_id).await?; + helpers::transfer_nft(seller, first_buyer, nft_contract, token_id).await?; // attempt purchase NFT - let before_seller_balance: u128 = helpers::get_user_balance(seller, worker).await?; - let before_buyer_balance: u128 = helpers::get_user_balance(second_buyer, worker).await?; - helpers::purchase_listed_nft(second_buyer, market_contract, nft_contract, worker, token_id, sale_price).await?; - let after_seller_balance: u128 = helpers::get_user_balance(seller, worker).await?; - let after_buyer_balance: u128 = helpers::get_user_balance(second_buyer, worker).await?; + let before_seller_balance: u128 = helpers::get_user_balance(seller).await?; + let before_buyer_balance: u128 = helpers::get_user_balance(second_buyer).await?; + helpers::purchase_listed_nft(second_buyer, market_contract, nft_contract, token_id, sale_price).await?; + let after_seller_balance: u128 = helpers::get_user_balance(seller).await?; + let after_buyer_balance: u128 = helpers::get_user_balance(second_buyer).await?; // assert owner remains first_buyer - let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, worker, token_id).await?; + let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; let owner_id: String = token_info["owner_id"].as_str().unwrap().to_string(); assert_eq!(owner_id, first_buyer.id().to_string(), "token owner is not first_buyer"); @@ -295,36 +235,35 @@ async fn test_approval_revoke( second_user: &Account, nft_contract: &Contract, market_contract: &Contract, - worker: &Worker, ) -> anyhow::Result<()> { let token_id = "6"; let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR - helpers::mint_nft(first_user, nft_contract, worker, token_id).await?; - helpers::pay_for_storage(first_user, market_contract, worker, 10000000000000000000000 as u128).await?; - helpers::place_nft_for_sale(first_user, market_contract, nft_contract, worker, token_id, sale_price).await?; + helpers::mint_nft(first_user, nft_contract, token_id).await?; + helpers::pay_for_storage(first_user, market_contract, 10000000000000000000000 as u128).await?; + helpers::place_nft_for_sale(first_user, market_contract, nft_contract, token_id, sale_price).await?; // nft_revoke market_contract call let revoke_payload = json!({ "account_id": market_contract.id(), "token_id": token_id, }); - first_user.call(&worker, nft_contract.id(), "nft_revoke") - .args_json(revoke_payload)? - .deposit(1) + let _ = first_user.call(nft_contract.id(), "nft_revoke") + .args_json(revoke_payload) + .deposit(helpers::ONE_YOCTO_NEAR) .transact() .await?; // market_contract attempts to nft_transfer, when second_user tries to purchase NFT on market - let before_seller_balance: u128 = helpers::get_user_balance(first_user, worker).await?; - let before_buyer_balance: u128 = helpers::get_user_balance(second_user, worker).await?; + let before_seller_balance: u128 = helpers::get_user_balance(first_user).await?; + let before_buyer_balance: u128 = helpers::get_user_balance(second_user).await?; helpers::purchase_listed_nft( - second_user, market_contract, nft_contract, worker, token_id, sale_price + second_user, market_contract, nft_contract, token_id, sale_price ).await?; - let after_seller_balance: u128 = helpers::get_user_balance(first_user, worker).await?; - let after_buyer_balance: u128 = helpers::get_user_balance(second_user, worker).await?; + let after_seller_balance: u128 = helpers::get_user_balance(first_user).await?; + let after_buyer_balance: u128 = helpers::get_user_balance(second_user).await?; // assert owner remains first_user - let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, worker, token_id).await?; + let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; let owner_id: String = token_info["owner_id"].as_str().unwrap().to_string(); assert_eq!(owner_id, first_user.id().to_string(), "token owner is not first_user"); @@ -342,7 +281,6 @@ async fn test_reselling_and_royalties( second_buyer: &Account, nft_contract: &Contract, market_contract: &Contract, - worker: &Worker, ) -> anyhow::Result<()> { let token_id = "7"; let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR @@ -360,24 +298,24 @@ async fn test_reselling_and_royalties( user.id().to_string(): 2000 as u128 } }); - user.call(&worker, nft_contract.id(), "nft_mint") - .args_json(request_payload)? - .deposit(helpers::DEFAULT_DEPOSIT) + let _ = user.call(nft_contract.id(), "nft_mint") + .args_json(request_payload) + .deposit(NearToken::from_yoctonear(helpers::DEFAULT_DEPOSIT)) .transact() - .await?; + .await; - helpers::pay_for_storage(user, market_contract, worker, 10000000000000000000000 as u128).await?; - helpers::place_nft_for_sale(user, market_contract, nft_contract, worker, token_id, sale_price).await?; + helpers::pay_for_storage(user, market_contract, 10000000000000000000000 as u128).await?; + helpers::place_nft_for_sale(user, market_contract, nft_contract, token_id, sale_price).await?; // first_buyer purchases NFT - let mut before_seller_balance: u128 = helpers::get_user_balance(user, worker).await?; - let mut before_buyer_balance: u128 = helpers::get_user_balance(first_buyer, worker).await?; - helpers::purchase_listed_nft(first_buyer, market_contract, nft_contract, worker, token_id, sale_price).await?; - let mut after_seller_balance: u128 = helpers::get_user_balance(user, worker).await?; - let mut after_buyer_balance: u128 = helpers::get_user_balance(first_buyer, worker).await?; + let mut before_seller_balance: u128 = helpers::get_user_balance(user).await?; + let mut before_buyer_balance: u128 = helpers::get_user_balance(first_buyer).await?; + helpers::purchase_listed_nft(first_buyer, market_contract, nft_contract, token_id, sale_price).await?; + let mut after_seller_balance: u128 = helpers::get_user_balance(user).await?; + let mut after_buyer_balance: u128 = helpers::get_user_balance(first_buyer).await?; // assert owner becomes first_buyer - let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, worker, token_id).await?; + let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; let owner_id: String = token_info["owner_id"].as_str().unwrap().to_string(); assert_eq!(owner_id, first_buyer.id().to_string(), "token owner is not first_buyer"); @@ -386,21 +324,21 @@ async fn test_reselling_and_royalties( assert_eq!(helpers::round_to_near_dp(after_buyer_balance, 0), helpers::round_to_near_dp(before_buyer_balance - sale_price, 0), "buyer balance unchanged"); // first buyer lists nft for sale - helpers::pay_for_storage(first_buyer, market_contract, worker, 10000000000000000000000 as u128).await?; - helpers::place_nft_for_sale(first_buyer, market_contract, nft_contract, worker, token_id, sale_price).await?; + helpers::pay_for_storage(first_buyer, market_contract, 10000000000000000000000 as u128).await?; + helpers::place_nft_for_sale(first_buyer, market_contract, nft_contract, token_id, sale_price).await?; // second_buyer purchases NFT let resale_price = sale_price * 5; // 15 NEAR - before_seller_balance = helpers::get_user_balance(first_buyer, worker).await?; - before_buyer_balance = helpers::get_user_balance(second_buyer, worker).await?; - let before_user_balance: u128 = helpers::get_user_balance(user, worker).await?; - helpers::purchase_listed_nft(second_buyer, market_contract, nft_contract, worker, token_id, resale_price).await?; - let after_user_balance: u128 = helpers::get_user_balance(user, worker).await?; - after_seller_balance = helpers::get_user_balance(first_buyer, worker).await?; - after_buyer_balance = helpers::get_user_balance(second_buyer, worker).await?; + before_seller_balance = helpers::get_user_balance(first_buyer).await?; + before_buyer_balance = helpers::get_user_balance(second_buyer).await?; + let before_user_balance: u128 = helpers::get_user_balance(user).await?; + helpers::purchase_listed_nft(second_buyer, market_contract, nft_contract, token_id, resale_price).await?; + let after_user_balance: u128 = helpers::get_user_balance(user).await?; + after_seller_balance = helpers::get_user_balance(first_buyer).await?; + after_buyer_balance = helpers::get_user_balance(second_buyer).await?; // assert owner changes to second_buyer - let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, worker, token_id).await?; + let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; let owner_id: String = token_info["owner_id"].as_str().unwrap().to_string(); assert_eq!(owner_id, second_buyer.id().to_string(), "token owner is not second_buyer"); diff --git a/integration-tests/ts/src/main.ava.ts b/integration-tests/ts/src/main.ava.ts index fc1e235..68d3ab1 100644 --- a/integration-tests/ts/src/main.ava.ts +++ b/integration-tests/ts/src/main.ava.ts @@ -346,8 +346,8 @@ test("cross contract: reselling and royalties", async (t) => { "Alice balance should increase by royalty fee of 20% of sale price" ) t.is( - bob_balance_after_2.sub(bob_balance_before_2).toHuman(), - "24.00037 N", + bob_balance_after_2.sub(bob_balance_before_2).toHuman().slice(0, 2), + "24", "Bob balance should decrease by sale price minus royalty fee of 20% of sale price" ) t.is( diff --git a/nft-contract/src/tests.rs b/nft-contract/src/tests.rs index bb9b23f..6063217 100644 --- a/nft-contract/src/tests.rs +++ b/nft-contract/src/tests.rs @@ -7,7 +7,6 @@ use near_sdk::json_types::{U128, U64}; use near_sdk::test_utils::{accounts, VMContextBuilder}; use near_sdk::testing_env; use near_sdk::{env, AccountId}; - use std::collections::HashMap; const MINT_STORAGE_COST: u128 = 100_000_000_000_000_000_000_000; diff --git a/out/main.wasm b/out/main.wasm index 459543d327ebff65f1cb6e243419c7aea66f756d..7af01f8faa5268cafbc50df350dad0fa8190a575 100755 GIT binary patch delta 101790 zcmeFa37k~LwFlgFd!6YX<_@zmGeCE<&9H;WASliy%A%;?7K|tm*9<6#7)hSmgQB8A z94z#rqK*j)Dk=&JiKv4TMMZ-NDk@PlMA4w)7Kws>|8uJD(mexe^1k=J-}ieVPT#Iu zRp->%>eQ)I)puOq{_#iJCjwJ0JWm7y0r6aD?83zCf?y_dnYe7S$l#B$aN$@Zlv()J zK@k+AWR)rUih@w)vdc1o$zgn4cG;?=i#BfP>=pk{}UlV4vB#1*vSw%{|ky>P)>*pG>SXQ`H|Xg!4Mi06&cm^x4OCr zefa-zpGETZNSCgLD8)ZPfAK$hR39OOfK*o%RTl;1fM~I-kB0PrkwWUr`=23?i&n(~ z)z#I3Kv2jFqeFw$!47g|w8QwKE=Apnii(J4-K(oQ6$Pt$&_5BVDN09+ifTnqQQfO3 zn8yEty^H$rXSym~CPd$U{qb!;y6?brS_F&mzN)NB1Y~8bvm6pjbwB7JCR!{|RMfF} z(7}W2@`fBTbl9+i4h;rNi$J6l8XZ<6GqF^^sIVkVg%ukL$!w`BE5P>4YC`yVdYJ}pD zFhcluq&V_mF>;g;$xujCkFHJvRH!NhDi(<<{2L&OipCs{ChC77`rlDU9~}xE9Xcu$ z6*I(Q{0j#~peWKIm=RWEV@n{O30RA_K7~&_G}A-$ZKE`D-dX2OpZO~z5I_IyS(B#B zm@#wuFV6~m6)L2!zqrsTIWw>)lut!7&-&%`sb>ZL6>8^wn>1zGw7}OPlS*bypEYIL zqzf;aF=N`V0^g}Nv(V!F3j>Ye5~^`w5x<;t_Vk&PreA#iSu+E3Yo-t%-arwul$SbK*;}&iI4za%8P>oA_7cpJH=#ued#U zNAPp;x_C{zDh9n0{%!cq$V-twiI>DCu~|GX{w)43-V^VOo#F%Wp}0GGe|SNpDe{N# zy72GAkA)uyZwNmXULRf&{$1qNOn6!Nw~_n8_lB2;Z;ad$xizvRa(Cpu$X$`gA}>Yv zM*bAJHTvhsN70X?uSH&uJQvv-c{}pg$X_DcB9FyhiQN@#iQN)?DRx`*&S-OVdGwy> zlITs*mC;qvN1`jDtD{?DFGin;z8ZZd`a<-%==$hW(I=xDqHjkxM%P6jk3JUtee|R^ zquZj-MqiJ<5&dKI57GCcpGUul?uh<9`hN7wXjAO^*d4K3W6iPou_t3+MX!tfGx}=m z&e(5b561Ez*iiUPY@84oqdqBWjAYs<2qXg#$i~Lm^6|u&@O+4HMivy*7OBEfzW0X~ zbjz;`n#n*iSYwpPsRhl6)sM6^2F!g|H#PVK=(=H{hm6e6n zp|!#g^1O<2c~HCYrFR2lAZgSXv2@_b0+AHSfVouO+^%=IuW=yW1Ly#tFz=V!+I12q z+o?y5a``}^8P)j7CkoFMpUEEP;cdNKV5*m$jU`XZilX0$kX%~STU;(*F6t>~ycrUE zr1kC?-}im)_r7BB4efi0$@T>|17gdjupCQpcx;z^@6Sdk8m_)c6gB6K_k9~zOIw=5NmgDXKMcwn#* zO9n;|U(7lqkOe{x#=oRPCy_)6{&C{6bDsNf9hZ( zgeNo)q$9~-!(fBjn+?gJ6)<0P8k(snH7o%HR5IV4hYnMbq^5I2JHrS9b1f^>MIaff zGeU_V3Ny*5Dhb{{B6(FZa{pXV%!ao<5J({L=awGHZURdY4TI)Tcf zo}yKlX+?eZZ|F+=4#dYvyJS>8J_ohEIP&R&bUTGPlU-rOCo?SZPT_jAYncVAszxs^srWtJ-=| zCjV91rL7lLa%5Rg@xrPL$}ShdUkPFNP6jJvyNdS5E}IMB;Cc!8Ut=Wbk7@3^k_uI^ zxm?$XHMB*bINBy1itLpQ75%g%j+D1l^mm_Ms5mCfl#(4fq&sPvL3JRT!9W&O?-TYD z=ZOk=UWYzz>sveYNcq|X(MG8!gfQrEOTO9RYgxvopUb{hkFNQ6L0?&&g0)>ReB#*UraJAI%Ey=ySPln-_6synLjcl2$? zf%*Rgay*KV+?*OEPldnnksRN(Q?1j@AnGO2V7@~Yje7Nuqq-MXp47qkTYqyM7Y z!2F%w=yz9+k~elH5+;ZhZckgCp8h7McX7y=!;gXaJG_pF7tz%IhWf>SJk;{E?pu5+ zU#?BLlJ-N{(5Fk0cwNrv*r7f_6NLWS%Bz8_aJAuCh?1Ud^>d;;-_& z>P{|(jY1Rsvs?@tTVsgIz>+cSn8;G)qRth4cs#l2&`hAk4Cs9Bp>u5KQF24i{i5@6 zE;^eJjLvvJI&INwoT67F(I!g~=!HkHPqHz5p;uAp215kx_3s(Q1HdGjqFp%~qG|V4 zF0w-$G3(TOCfw15y~}?Hb@q6$U+mpA?xvPIyS=+xb zx|ZK2<3uIj3LAh~IM;KLLv@@aCgA0EfpRntFKL;LLG&-t0Y_-{`8nWvYL<{0JRBOC8FE z{mbN3d|N}`qR(*m74jq0IkKNA*2^3E_Y{xQyYQ3rPM+SUI$TYVWzoPPVxK%};Lz9? zSGF`_wQ-f4Kk!)Z%ewyJU$}}GNiKa= zIoZUocuI#0gmno0Ntpk%TXth{v;3fkdXE!9UMInaA=lYR3OLR5#2z>rSpvRv3HhuE znHkj0-|?6G>v-p&si_BIB9iF>jy8h2Q`4fWdJLot5EHI#Y}LgF_Y_4z^9u6O(xD>@ zf{6s|wtRT-k%*M+8N3JtxvuU~JjaKO$Mb1JCIwMjJ~`x-suDsJ&eoU$^aa1vh+6{A z3?upAAx9oIP_6y~YE&3PTA*h0T#(kPwwhKliM4OY(q9rE;w-|Rm3@bnRfe#JNE$-} za>%u2w=KUmD&;+$%pDUYpba(2qhNU4eiRa;+2*4?g^Hz=<)DT{uSl zRzP^Oz7~JORuZEGh8X2>1;S}pXT2+S%gPZKNAC!Q3N^ogi zl$am)9eGLU?^I{X&|*1!WV{vcFg~Eqbx#|44qz$X9aq4g3AttDi>+~cXw(IvyTXQH zf7%(EG<0;OH$E*AL^kg9?9mrNZ?}!E#NV$*kH+8nF=O!e+A;L}mobBCKD!DkkW$M` z^J;BeNJk)iFt`C|aWY_jca4{SsMR}wlnV*bIHMh$%j$bUc%e}`}_L_V1`o;hW z^w2=(WH^~;g??%I$~y5fg{XZkAn7O83U%C&`u&T4~;T1zMy4T)9DL&=SzAv1A~gjX^K@#7Vt9EacTcO^Mz1 zf)Pf~&W}A!@FM8&X6lek4VhW|=@ST%hI6Pd-$9(^jv&Scy$of?s~;; zQ&>{0{N?W^_7(qc zfqm-ltC+SpFF*5^%LF* zK$6%jf{3*MVfe26?(~`*{@jg`{de$ZwmfWNTHGxsPfY&^(sq)&CwBZ1w$fM5c+8tU>;W&~y2&zEL$^44s zEFSN`rGYdHK$K2_9{NrK%Cm{_cQFU{6P*m`<%RI zSzLv=Q7%9GF%epI<~fr@<}Gp;(}s0!gN3fD;wF}5Tc1L=0dp;sJP=QiSrg_9j6-{T zvHrTg1y(6xDlmADLi4wzTU438-0T1HJLd~^vw^$OeZD-W@o+TaPMiNootAi=QtiKZ zK<8|r_m$pzf^*;1a>g%uiD&H#+6BwugirrPZ?QtY^NSwQt=w`9#k(sipbmo(Llagr zxo1`$v>?%7tyn3mKj_fDP*D}Vy~1st;-^iw^M-S08 zN{Pq95++$)U~7fQpX;vhW@#X4VUG&JL)Pl^^Tt)MbI674`^3yO%!iNUspqGWnXM6$MgBq@hnKQjhwD~#E+}tPco8H@TA4x{o1`##xynL#0&bsy}9;+rz+IM7B8dD4OUNL2|~eV&OB9IBU@&c#~-4(uMh!Y z^I`e!%z@%dS$g3#tP?N4aAeP1o$fl#(dj9?HlTS+u*%ENE}R(mRhOsCdMNK9;v5w6 zVOe}p4|F-~q5)Z5g3B=OPM6Lw9Hz>qi%!bB-UyP(O%|ze5|Cl1WP*72hD%c@ zNnhGWAa*wHvWxKdnaj@4Q@VkDRQsJOQ6k4@dW$#ZWtrn(0$$3TE)SYpfmTO0u4xko zdFQXnS9QPq0Rr+;=9l<8c5a2KaDr?rjINYpuiPfbUHPH-m)-vn>@b{s)nxrRp(hC= zIdMu{$%PT--NZz4S}>^HPT(e96tEtB5hJ%cn{Ses2I50?V;zL!{WbE=&0FTl#;cR# z2kQ4)i16Op{229sbw28NK(@L-hPUd{+OmL}^g@$;GIMoGoG2#HZpZ}rF{MB zTF0)=#8yp->@+W$Q)R@wKH_FMW8ScuH^>5}uro$0y{@Fi5aamhY{)QU-1GbM3W`|K z5tkx@AS4@qNs4QdVJbCc`kJG~0(t&5DRka+O?UB)TyxDyaHk8d9m#(O$SbcU_xjdr zkHp68JJ*&(SKNp3n0w^jYoB*)nY$F;!W(A$ zXnsE|b56gm+`hlFQ7Xq=SHfS%i6;5rbv^O-jqCd4=?zMAlQb9fk2c*%;BS_r7FeQL zUbCPl{;po&ul3=Ax~gVXOYw;3)|FIZh0Rs+(Cd43SF;FAHrV2yQJ`%OP2;~cD9BS{ zXSxJqcBL7-J&y>;TXy!RX0V%F-qhXLew96bkP?nt?^+rr6gnGCE^i zyPD3oJ|R6MI{>?b8OGbor20^Q_%Dz^p&Vp5)XXvRr{F(hGE0W!tqUs=vw3u3w=(b( ztu|oqfC{{Z2CL*v=Z(u?|8F_36)xxLS-si0O}eLpUXVh7)=c4J;y=&se-wNb*K|Hr%^jn;&dc$d9Y(Lr*pJ- z+K{@m2s!wsVQ@HS-ZT(X&s{fl%X4Wg|8f&;-0iukclQManB(J@8BT1pNlZ-}j*%q3 zLZWwHVTqHm{w;T3RQx_4FOoE1^AUyU7(VxK3Y{j;(*mrSyw+% zRUZfVy8BPm8YT-HNRzHVS=FEDR{vC0ha@Atz!;AZC^8^sq{3}gh)@N*p$bUO&;Ypy zz^5)^R0BB=RD)IpYQ#Pm`BVXIsRD7LRfPmqz??`G3fv02+ZYu3M>QhxB}pSgG@gCH z`uT4Cc|>m1pNmgF)s*Qu7tT0TO7C|8K&l;d2atx;8N4%7YmBQi&V}Hq-QFRj-WjdJ z1|@IA8W1xuENn^OQNIYld!T3m_9nbSoj;N;#EWfNF9_Zdb-@~i^TfJf1>nu&4X{1_ zij3IoI-`3djRj@~uuVM8#rBsAo9Q%H)CFU*@RqS%YskO^tQ};59PEhT$ZMH}^1Uc8 zl$l#9#~=}AzQEYq)fr3Z6BGVoL6LtVJE`digMxIdqF@;T)mt-$1uWg?ZL;aM@(k_J zsEr$gHg5Pa5pTP*M1I@l0OB^y+i#UNA)OrCZ++S?axiPNZIqfqAX^Waht|K%Mv;G~ z5$#U@Xh=w``tgm}-2T`x!QSqN_e_XG+av^eC~XT&DPeL6wVr_yjSpJ17mWDC4#%^WD=!ZrBH$8u&7isPFN<`=L4{z=t! z{e6?F{O+y_@v^MAJJpG2NkT*YBkR6dU^d`sXrvr}cTabEy~Ovt?CwFGb)5pT7#Jn( zAHYf|j0YjA_{H5`eo%VZ#qD*L0TiFqoyH{ZTb5)Ge74-QY;;;reKDn%l$J*1-{PBB zW#8pp+htdi3zv6@`^R?4@8W)jxa+Z%%Yn%z42wH1ln1a@J7$%T; zBcb$gbGN>36cz1aw8mFe_T$e;acB2B)r9bXCq#X_v%4}gSa6^hghSLU9KS7Q&?;OG zuuC(GfCM634z><2fH%0Y$m0eOVS~6Bj@CFe5sU>fea&+l2(JMqPMSF;v~B?SF2k`M z<$^d@wK&sl;m&2;0CGk%jh>+ir&+4Oi~~2oJWXt+291PY@RY$c59(pG2?H~?(*$On z$3ZipZo+(E|li@$|v zClPky7;^ly5>aBWyVW>~&4ek>xMM8x!B*Z;CmxVH@2GZS?M|}cL|QB=?Cd`*F)C&M z=1M1|aD)8)^3e`RY1}h)Kd4`JPgPG(n_V?_tP-g)?1fh2hvYjCb%r}G9!`r_W#^Tn zwK+TQ;qvp#XscuCpycj)rI_28#xpbh*cpK-tk0!bR$Wm z`GLIs$zJl2)yHRbHvchSXTCR6JrKUqw0!wdUw!%LBhzbn#ZSvGBp(b7z>~v6VS^i7 z=0J0UmBg0mv5!`is`!9cNRv-ormic_f--EK4~qYdcsrXq^5n<68~@-XNJn|=<5=JF zs2^XIFF$@fqQC9Jw@yz)PNJd!F-Svv@uHVf7^;cw^P|6cB0lP661 z?(fIB@6P=Lz5CZ6#s%*{{%+AUQ7+GE87g+k-?j|Ki`QGm8cnwR)tSAjzb4|P$bvZv zkreTFBSB=zTqdn9>__g&-fFku&@p{;; zm1|lM6}pM*bGTL@WuCHL1geCPUY*8%K?T}|tnb7HG@V!#gAE@b+d5SgXOJY1`ADS* z7$h4scfh{U+=1x&-Oj=*mf|IqNx9+}3Bow5<`UJ6WTY-Q8Xw`hV7-BV2oxLEE;g@N zd6<8s4yc^|k-kq$>lADx$A<$Ma=U7b89KwCOz@0!m={Y)Z1mAu3I00%QeUqqWNNS^ zqG6)lJWA40ZagO*k`vay!Tgk{V(A13gsTS|lL^D&#+meiV*|snGQu=t^*@pNhKj4s z%+)le1UB7Jnxt14so78)4A2UK*FiV{z^iXK8(834U^rz_tS;X?1r+a3&C3oXg zrQm?miBm??^dO)D6lvZ;c0En@=(D0OIE0u-9!c~_TJX99OGXv7P)tbCy5Ke%Fq9jt zoU0_rzV&I*E(5p9YMI*tVx+8Q7MR>ro~+U&`eV>AfRwGTN34;hG!zsi9eO}zbcha9 z3sKB-fB&iE8+)BC8;;9YfwdYe&q$u-!GA0t@$X4*eG*)!oC@g4e#93J35oAC#@!QN zoa~^XC0TsY0p#})PktfnB){WGMp=GU5+|g%wfr^;p8y{e4k!Ue+)3}5K!WEY_*7>! z0axNHc`?>v7Gmn~1^JU_1{}<(IsBR&DM%(HT}vkUM+nLBIPv!j5}MjzGtSA#JD#aW zgmC*ar{nM8&z9rwPoEuP-}1C5to^~9md`$WSP9T#j;(YTESovUQTE$-gq~AoZR~;V z>m?g2i#cz|Am$75`vv6NO)rEKBlSF5dmIcpMy5}JRu0Z^n!mOq8{O9r=P?Qtuf?Dugr(O(-9e;+vVrMx%2Z^2=!rqNEpA*Ks=lK^U zsven6l5V5KcP^&HbN}ev58fjcM0E}=qK$od{`2W-7ZM-N!8E~{b}IZL7j7!YZt(gS zel~(y|4%^k4p)_b<5*XM9YRQmX);p2x~Y%+^K&O)KI;DbjiKM*6q0=M`HmS)7NedA z>Q*N+LM6#G6uLw`SEnH(CZ3^8l;8qufHjo)f(n1rgj7MzNTtHyFk1#3u5yiKfE0?% z2&4z~z)f?tJmH0Eu}#i+VVqoiVmsOHPou?R`O`mLF8}f3iO4#uf2l>j{-^Un&CH(< z6077Tn-3!YZ*ztC?1sOT$+tIm#g@V~uZ)yOy*#n<8X7rgMxl3eK7Avui1;|(!jOAk zt&*R-e7)+-xVuqax_KaWb#-r@3$xo_CHwwmwyyin%en4XPTev&d`ljDh|ybmym2xKEe|3E5eS!4p)Em{ou&J`uGVeV>xDl&&BC_TO_Obis zi<~z*{;1oSO%4tKyNgRp(9?3%ztQ)m@foTg#hZ#O8kBa3nZxuk3 zPJL@qk1heQo_$L5awe()yfLqvSE-&LVezTV@Cy0LTiuLXu8@1*>M0*C>cklI74vY~ zQ$GE6Q3ZoW9t7oNV2Zef+Q)y*#I2AAZyOZ-7xy2M;_Xs-CU9Q;O%}375NvXK{BLgMH-s;Il`MQe zl(+xALzmB=rtx4;fLsqh)#Ux0RGi2O$5EqU8}6_xMuYceXJh-2`G8z0I)y;tEI9enB^ zGCCz$BrdIG1mpG}X8w*UmEZuVAcIUOBxrjCN+=&FO8ZVdf62Xde!qL!n^!e9qCS(> zRcC0}`{&68J3H2Xb~V4IgNxr#O**llQ<$<68aB%3-cPdoWy%lVADw)dD#OWl6Octt z0`l=YyO*mT0i8soE6x9q`}h=_;}=CBHsYkaWz`3j@{$hm^wTJXDAk#;r}u2%9d}Zu&&B*}@O!V5%?vNALd6UfBrL!xntfWQg|L z@h65vqxtt!&86hgB`KTLD!a(KWzGeS-X0Om2wIGwyfH)>u4d6 zI`Q#C9ky}X+nN5@4@S?$$@W&v+AQDrxCfHejZaRas*`s=m{S!-fUBAyK+UJ!jK+Ib z9rx)(s=MN|+`3qRaoq~5NzVGbn`mBj%jewfo-ZDZY7FE9U-r(dyoW}jS71m>iZrAO z6Foqa6)3m*T6^i!NwaY?Od6N_T3G@7+jbX~=maMm+7{NXtP;aQyfdo=Sy|Tn%-#NG zNHevTWR--iu(cwqBw|IZby+1*D{5`ZD*53EW&Ge7qpXhpyAawhJu*I`{V#xT%y>Ne ze-C_XcDN;m`L+D%o})4G{cg_)qw(HV@9!BYI`7UB$}q$$mJE~T;ZMTaB*%X339<1_ zk4)3OesOG`i*Gmq)#C5P72WMwr7j{rUUWS{IU*2;;QoiAD|dZ!B8-N$_cvG}y|{Nw zbfp@U?6~i+=r+#w+9#*%8yMZBpKsY$7u}_wx9;mPY_EDIyAp_-50h;IUJfyIZ|bcZ ze_5y75B;{kF@J@e_U!<%V%6>6-Y14k7_;Ce=E`ob=YJ_x+c5aRNY@R(+71T8f z+!{-AY8bjkBI8zBky8a{ED8%eGOhE!b{j2WBd8&}rR%av4=70)P51p+K~I$aJ0wZN z3Z(L^A*pQUB&#tq8Ie8bMVfC^0K7dd2W-T}&tHypMC=Tj9|3P}4033+s-X{98n2JoD zsBY4dfr4DZTxxgwndoNx;VS#PJB=PMUPP*Fb*w?CJH1HMWrE8#KTF`_y38=@x%5pgEk>z*X(w@*SifdYA901)AIx6% z)p0S$ex{#DW;So24#Qc1U*R$bhytwF2M%Bct5*iP3?VNdt=9y)EW~AcMWD;VT&5QT zztDvdF2q6r$mHoV9HvBvdI_M*kn@c)?fmPqJTCi?J!YpZM3GDNG5|I0m--_GOmk#n zbpIUbWq(-!>US&ZywZ0lhM*CU)IkJ|q@vE!O*Fu$E(>WS@8i;T zx|9?pf<=r&fa?_ z(aT7O2n12>fKlI%F*-1@kL>3VJDY%+(bnKE3RfMWQx5 z2Oi*Td*!jB+&=7RQDE2Si*A)%NRv5w#hwLiLp?!M`9i7fZ!w{aVBdoCoRTL$S_y6FRK&1#b*1jb)u_m>=)6{dj5I8J(jTa zVbJ`~+-QG$h)Cf~LeU|(I#uCQ$eT_cK6d61(Zil~h$yoU86qyUN8rgB)>}hFz7|%l zWga31ijVELhoHB=*e@T2EQ@ikMeT8iii7NN!$e|DpL$^m`**`c+MZ;IBgH?d(urZn zjZa?&R`T~;RblceRZ;a>Rn#L?rPf|BQWUGMZu*HR?X?rHT-D&l``uHtw~rL%8jB0Y zisAwX0g}_?nwmq!#R7D0J`9I+-?i5rCWfuKajdvNh{bmFSaHIdU;hNxYli-XYi#AG zEoEzt8;a`^L5Ja%NZEfJCZ;;$R6}s=!oYvaBmA?bwtM*CYyQ2 z=|{-!2mik8mN^Jy@l-3C!ox$>p;Z>L%C_uxPHH89Y`_%zzHbi76+k5~Yj%tljRI!q ztfR!#{`Ev_ip^V$2=A0x>*z>0Hjdu{#$+rF>v1ZfggAS`@ghCx02O%U4U@`Q8s;NJ z+W3zK^5^5l8R8>*@Cl*@nmy?RalClae)t6OYZ!z+CyJko2koX4;XZ$6Z#Yp54}EOl zeD{;jm)e<=aU->RK2V{eG7)U+ButDg_VklP*OVG7G*PKV?}iabXT^Xm9N6lLk0yKN zNn$|f#|e3SP2w(3e3Uep50D24M}j$NPyVT>7X zD{^d{_Q#$qD*jh-*V(N9F7Ed8KNWqwqqm4+xaNamVdKdTwXCH!=nbZ==^K0Uj&GKI&AQQshU< zg*oF20aUxtcMKcn$Gh?)_Hk%mn1{5_?LR`XEc`J6H*D^`5^cy(d%_E6F+x)L9lZiY z=!?~CZ$DM^Y>%}Z@3jHrztZb?#;%?yl81TSbEu5MX6CnTc1_VUw`=-ht+X$iDAJK^4N$i zUT^02_U7JZ8T7pJ74~U0!E*b7b46Kg1tr^7n^%#X8}&v#eRcA{{Q@xB?lf7Xaea1@ z@Ia zjIn9wVT1W&u6^ue(Zkp(?2bXKu9_x`$VsYypp?W$FFvYMbfrO8T3%hwphKi-P#S0h zUf0l{-sWCcEAUlootmpyx9shcMK{3iuZBE`Vee}Y2W7#w8ynydSKG6vh)%UXtYaKy zuwQIoDm#7Kg;PWwBC`&|_DiyFU7YvB!2OfVr!)5JKmT5t?tH{%PXImYSZ#?jcCB3} zFH4-S9JRyA-c6!x3;4KE-N(WQw!O6Vuk(P86p-_#>d=e z7oI87#lK;;!i2IxB3W#*D`$w#_)!Hm>nf1|)=$~E_%{NVB-(S%M1=naZc28I3}GT2 zWqX*8DQRZqK)D;#hY18Sk{Xd5Mw7Hdj@dh=dai_6(X6qEdlf2cFRZ`j+Er?1w?9i% zbW|eE)d8$4I=GQLAgg?nJ?bpcqp}m3UxAxiDak?LObsVHpyprgE6)<0^H;N7c`pEy z^}t#1Lzdaw&JtA#bwLqfW$v|uXN&I9rH`~=>tLVV|7_7ex|CX(x7#0|2amb&Y|*#> zG6qb0kF?ok(!Pfp8fAQk{RW%AEVth}TXgH7ueY!~EXd#o;*Z(Y=ZG#n6_M3u3H1yO z)7NSJFML`{O|fkGyPebYH&m|t2iIqd+_YQOOh19SViqO^XKBe1xueS~p5 zjCEVW3fsF}Uw%*tVf7Mnm%Hj$R;?}6twbBf*r#sx>*tDI*+%JRHcH|)d+0Ajrz+cN zWz=IoC>U7gSy+4eFGSLf2Q>Xc^exGy;B_kBuhRbb7oun=AEbp%CrL-TDG>f3U~VH? zLv@rrwf^CiB-z4R|3ry>NQ3B(^L?J3WLq`NXB-zRnQO~9E_B8~Y;n}z-q64!cgz-K z>}H!xqIk|8Fjb^ZzJoh-Z&OdhxdG$TVV`cHpagf^u!$vW8>CxsShXPg7@l9XAol>V z$i8!`IJ!nP85!4lQLXiYci313l~1zXj!zR^`Z}1<#urhJF^PGYP-()!W2AlZG}zy7 z?FG|Bjmw=i(?snU_G9So8r1KNUSiO~G;b)mQPCiD6sk(9tD)B5SU>6?N`LSxESQ&| zi?!#8nz|*cNd26>)?C(O_}rD(>`o%6`CEJ5d17E#O-qlRCwfO$a6hcZr%X{A9Ha?P znD=NFAk~pdtUs*=M61@?L!ag{QW3%kdQN86gT%hzkvO49ty~|CzbvMtj#SjV@r2YBs<3BT9LTSud^;3~0`7o5czZ%Pqrlp@d(iTx|W-%0FWm@W=2 z{vA`nKR?_~^Fv!Nn(0Lfpf0E_wr`&y;$xu?;BpGemc&8!7_XE3tD%c8vHajmf31$Z=}k5G79@MtXOcDYw6*bg9GL(+H9j&XHozfg04ElnVguli<(+p(H$6|dTUz4z1gqN6x~Xw zjvf}FnLw9&?e-U9mC$UDxDc!T2kh;$5d0iE3w=IkpE^s-#r`3R2CHwq>=74<5q9A$ zQ6e7BDu3}pl+V2g7TW}LftmNdi$ouL;l-jm?!sGpu^1{g*n@v5&ah9OE#}#WU5uJU zFJ1G5vS;Uj%2=Ia$u}7E!y6ch&34HzA#f|#pk-8q@6Hopc1=p`%}gj;*;0hzB6Y0q^~0efn@%X1z1{w zM=A?Zy-3B9`Kc(~4Uu0EPUPG7-y^!&nOj9kQSJ!hcJr;GvO*Upjd~ml;w5Z^@>PFt zzjUkU^3zvoXlWe7G7@=&JWx%#7+B7h)87=LsN(Bk3pLeaqYoks0~=WovkzS&2D&Hi z@xwA$BPc?21@bs{OeC@AT#Eg9$8#>}I;R=E20!5A@jQd?rfm^4mlYXFdeqKzZEj+cxEcaeMM@qPlZ74m|J_ZoY76 zV9&n|yIx#uub(f&)nMewNO-pz{^42(&mLXkfsg z>0%T-#s}k~0et2UrZZ}Qn{mhd*KELX3$oidTPv#qjD#|X3Kd2zqb;z2MkfKC?B57q zxS~>l9pR!2Rrt6npKKKNIk$?6N{5wnxQ}F!HVRb(yYqjEs$*sWWiV+5x@XBy{L+t1 zKs2K>TTOzMRdI4R^1~lf%GM_^x*$Yy-6t@{KJE!*%F#<#i9@)~MM?c^1pr3K5~+Mw zMI1#2@(#1816P%q$GBC~Q)RYZ<5IZc+IQ0o6TXockbwx0=*2J;oZnNx=Zb9T&R(Dc z9e2+7p}*)DlGf0%G=#h{bnng^hK?hNB!3x403m;f6D#;l-lYmWdS^4!fzM{lqwS_P z;4>da;sPZXKFPx_6vO0^*s&NAe3nBDzln~BVqi7KY?pfJe4Kjap~99Z3gQ8-5CtnC z(6z>FoIGwtG}Pp~j_{dvy%4vc>xG6W`T|%6aIxTyDuEtZrHpK&NHHdtkjmE3wG14i z#FbwKi5Sf2`WEPTzNrnS!cYl2GL~E`n`4QI5!}sK+!qy5*Doc9v!dh-stG98_JSAA$!$+@N>~g69GP^PZ}}8?;`@}q=|s5 ztvn*+l7TGp0m(3yPFemaGQdAUk_J;XcZ~L(mx+=F&tY(B*?Vd!FU~G7o1BFNScC)Xoh4H>ODWGsK5)>{h;CGC^~4c2jz{; z_23u{rs+tMN*9g!K!c}qfCm~)ga%oW`9Zh|3XR1-01YS4%|Qd}Ek8BdL<68)G#2~O z$l$U?O^(Gu%(V)Qr9S|T>}7F`*RxtTi7Bo(?WYC=&qaf5^+$6ukOxH$Hs_$m(jXSO zKqHTxnEkNAN%?eWfZGrKGf;wgUS_L7?=|n3#N;$ZEGl>J zs8HqXa8kMFYZAq`1aYq@Sw1{(M-&w6PCN#;A_lt~J{oR$2`MAN9t7Dich?&~B!fM4 z5*R?xh~TE$aO`xa}%_M{oz4+Z5z>cyZQy+EbEgl08g2~%Gi{|^!g-5 z+~gR9wc9@bWzp%N-9dI~LD{GyCIwnG`Z73v1ScL4gFJq^&F{F$$0bUw} zhonqZI>CzuMQ~Jye&!&(6i9D1NHNK`B}#$haUZ$44D5;fU3;nr3dZq=C*&~nz*=Ol zd_j~LYlS`iWl=E!wD6cTA7Iwf!ZyzJiAgnZxoG`c0~bsQ(Uu@NX0^uhATtjK=`>0{ z<}DXI;Io$Nl{ofTb<`3|#6&U=z91ysv11;sock*r(xYck#fyV9I*AGKq^A4GRMejT zil{tOna?Z>LL%<1;*?dRX;V$&Wa*#{#0kwpy?7(@s1|Rip%$>ZhTZZPQ92r{PjA+8 zR(v$WxQ&=zj+T#{$=s!xP^~BxG~hksCeb?shlS|O3=GZ01D#CNq~wL}O4e4~yy=q( zYaJIZ&nl#-)KXG6OySM+i527$`h-c_OrMzfHqa+@a4nX|%jr3TFUyhgw3@!a47M0F zXf2pPJdYQZaJUNa`>xJUFgdHnh_!*-J|AMqJiT^=qX2?KP^`^hpjta(>EArJ1^#}u zX>5>yY)SR46%v^F3uYWu_G0TAyY7Gjt&LLHX6w0?U z&zTE67C1{%M8JJKh67GIjN~nk#k@GB#UBVti&GW0;Gd!70umxz8+{@fxL6vyhjW<) z0#&t7>#Q7!yGcFL=O)=;=ri7%Dd|t;u;`DSt(+mf{{-<_&s$c3+ z5aeGh68J>}@4rwcUx$e7X&;CoY6ocL2Z$1leNFVUmu^JXqkIkC-_k~GTE6re;ymkU zeS&4{T6|i#j2VB|VjA2_*kw#&g1NVqJfU{%)^%I zCV~i)vynb&g|^{Gg4V$n7qn;-vy-S1MsX#NU zGXT9^t>h~JF>q&$_36>1ZT+Ju;ID6erIfqQJPdn|6VN9wS| z>99m~7~5}$_^k<$u~he1mepgn4#u)#THtUL`-5PVmnvZ8?H3G-L^*_>X))N?OQKMY zU{yxT28ADe^v(*XVL)vF7dgQ5+XPN)qg>z|cLeac2;XGL5^&(rW42ZWR~gD%j~v~W ztH>5@u*Ta0O+EpwC6q&sFJCy`IYqe0TvJYhz2+Vq0*L(={ENq%ab|S*<-*LYCZfP5 z(&}76(e{z`UK=d^yxCWWby}CRlIdqAu6}OBFSDeeTq)>73KE=x%%w_rD^^ipWw5Zp zyho{IpFpEg5VqUBCF(P@sBw2;+a*ef{2=XGFP>s;-armh*i?Q|6m?vtQfoJELc&9B z!B|bjkp&QDR+9=eA$#OR^l;H<3z35iHP01b+}dD*4Ix@=@PT(OgmAzY{|NAoP7(MG z+2DD;h-UPJ0q`5>7t7V?H~YXlcTYIr5ukNM`g=!TVCur6d@nM@>;&00a&+`UopW%rE;I{?U4m?cDctkTkVV*}^ zp3}~X59}L0+s-YZbJ-?GCFMX0sW;~i4rdUwS)zK&@T%J19XEk!aCZ*>iV+V3YarOv z-M5S!Ja}!CX-?h`a@+z7RPN2S*@%0hH>k>Z-0*2R7k@b2(LB4K?x+a`Qn)*JPEnCy zXdfZBkY{cWIo^wKbP&r3ALY;@gC@E=_%h5bweaA_sNxCAclt!axq!sMmm}*Qgahg$ zCq-b|B8Auqk;wQIk|%V?1W)J?iJd_=y!wR?ymNtr1D+%5KM=e#MgmWUa~B;X1p$(< z2RwNI{2sCk0RIJrRh2$AhLpXeq!8y)6$d;=(mn78R0uXtdh}$(cR8VKfamE0;O9b= z34CLSvLZ%c8GHYT2( zFz?M5!E^z_E6$q&@6Aqx7ZK=k-V_2}UJ|Hx!~-U|D$Eo3(Wa!Cslsd#NERi5R1qFZ zlEuix@cP*nO#1_H`t%WDwK@Aud#}xg>^J(r6t!8K{RaLC9F=*Y6dV-H=Ajf^iCXYK zRYIS;f~ijQxjmTbOrMAzCh2oyFqNXub-`5nfMIMfI?9W9#|W~=&;_EW!<(2B;Hdgy zQ2e7h965%$^p~&XaG4TXfBAN&9M;`m-r|%)$9(04_69^sDb7UC+k%<8;AZ{h3%ppV zpEu)qyMEq@=N3F$%}%Ef-JDJv@w+H+@=w)vD@jo6EX zqOs2s;Vs#ak050Mt*O4L3vX%C@xS%Wt9VN@qJ8dPMB*^tbdPeHsQs;cz6jou7opz5 z!=cPiJFx`;a(Gtet%OJ#p5JmZA!P`@X;ZR0i)ivd-8=pY350=`#h^&}T6wP5MmN8C&qWjV~Ts ze1z|;1E>TP@pk-Gx>e(3ih(GbXb|8A69v>~qJWy~s2o&e;$ZMh9B^R;m4o`r>C+*S z6Ojhjm{=et6HDaVE8fRV4te&*_r;3S9OlEIGxNJ3@=8pGL0_!)UR)}YO65?Ih=`~k zD6Hb8m{!ay$jP7)Cu5wiBlg*E?G$A-nD%s6bVn`srFnr~k{kr3M4deReyHeL*c56| zsrT{!%kjn%D1eZmShld9r3 zXz-Wr)80ugv{8Sw+DferPEg?`6p=>KS--Y3vN;V8Id%sd*Z`;L_e`}dIT;&j10E42 zM^IOZ5y9gNRCod9v`2xT8$G@tV(mBG8q=~4*pij7C)|n@y3-#O$c3{T9~ISu*^kqM z0Q6J=Rl|P?ooM3?>}j<&=o6TL)%i=0itayiSLR-Rbh9r-*-3|Wd|_S*c>TH2Z!m*A ztO;&sy?T);%hVl^LnPS0HKs1Zn53La;1C`aYvUf|O zoUq_ylDp0UckHj$h|Wb$o{BpFJGE8}%usjfXjLkoJyU{5E;hNRh2*d*&lT^Btw7SG zk|}Z65Ne#NpN)@VmDvChpR6Rli6kET zW1}(U(<7$-3Ar;rPc}P{;?P@fs`8Yj&V4kAL!61qa=S2CCA{fE~RF)9squo$u|K15J;EX9)i6dT?Uz6C1Yv}+&xn8P(7F%ZxQZ2&d62~ky0?aM~2bJAPpBQLnM>bqvQYU5d`^_=I<>;2q`rcn6E1%C| zxUd+60Kwg(;eDau)AEIeON$2@@7qpHV>T=?>_v$9J&uxM+DcfZ05kPGSEx9@O8NJZ z&ljL3^1=UdXB8R-ho^b6$*4V|wo+3aAeT_uk~0qWrr}7=CC3uK_Bx4Pb%14;2%L}D}!Nygud?ouDT~=W~URD0T$3R4T;nbD||um zjhq}(`}}W3)yX?}>E}4rlrN73AbN*`nzItzL5D18$h8LyA(`OngU}fg%j4JPt}LW!V7XxsS+VU-z9DoT0DojF;yIgE#qRJjyI}5~ZA3 zkHddnhwiKg$|_>JCmlFq2NK}Z+5}*{w!yd{6I*Z{F$)DR$Dw4Kgo-(WMO$+aaI%ja z1UO*mA>d|Fwnl&jUn4-8<3nJ(pfx0u^!Ry(8G^FGG5%1(sOh1`>VaU=EKg;4q>d2V~O?>w}PN zq%aINQW(Y#f%ysIUE~bIxw+N>%T5ao1L=$ecB?lI$QO+RJ88*z$Sey6((Mp4n+w^( z=RC~jMaxpf7-NyjJ~b`+twpBQefm~o2M7l#JzA+BGbByK`B7#H#yF8FMP4PDfEq}E z67-R{I323$MU5ajIa;>~TDM!MW?O~pW~Jj!X5f4FxrWg(1D@x!+=`a8x@VxoYJ%)? z3i*AcV?bQ#J7}HLp7eb-3`mxQc+L9QNyQ zr_DTYlXRS%Kj_L@`U)R!C4EBF&#hC3^6)r;0(vNg2CX2$a%~u#Uwv9j3r1+B)!*?1 z5e&!R(U-MWG)&SVAmmH7N}g*}xpNRK^BV|=_I2QFAW?>6rX=lpsOXJo=Z@Py?9TSj zo)Y;y_5x?@--eBv3^E33>L>^(!Qlq6#q$Rh>cEg!{j=;58)C{B^ac@#^yF z=ygOj%)2BilxU5=gtEK#22o%zX5_e;v%tmHtMB>z%W~PNG-|0k%W*Sj)5NF5j%R#M zq{#-Yz04mDSXe&{Fu4#U@0g0+nKBvc?~lUGq=%wop}OC=?m8?p?x)!#nncL-L4XJi96 z!z}j4)TL1)`?=XwG<-p0t#xYM!^vQx0n-b9R5%$Mg@Y<08N&|^!&URvZE(8KR$<_J zjP%p>5nR8*vqwhfv_mOLN3}fy<(CuXVV79z5NTaP-=VUL=@Uk&Ua#u#*dMvyR0``g zL(N^}`D3??CoGPu(yzWdD>HIGV+9dj)mX*gfVqQI#a)0F@Uf_<))RYWv#7K)j|%g| z)dU3cPbSit%2*dj)gY}KsC0=ws(IK)IR zU2ik&?)|TIW_|V~@M~4iwm_xh?q)MPdtUc1I^GHdMropJsWo4Tt)#M!uLpXz0O<_T zowXZ;Un`Uc0|DBQ13%Zd{U;cJm6_#{a__@v?tpLHDYH|QXcj_u$8Wh-x! zokI^U$9IUHN)?&+z#j9rlI8?kUsgGl3V@fJ{SIgbFtShN&~7(y^ASo>cd+?BsI_g5oNqO#&Y=Yxs3E*v4 zt=!5K-)T$PolYjR?w}L=#xX)y`MepNxIg3WC#T!dwl8_K%izPXTocsIBAuVqhYPXo zOYt$@!e!rkD=%VdFiOPeu^qRDqe;e95YLr_AI9k#*(}$ra$K+@TT|Avcc43S*kPIDe~}(3KZGr!3R)rN zrfi<#jKf4r**wJ^r;x1K53qT#jE>El?Ag3=SvJqv{)rW2D2~wD&tbiBX9x}P1M4>vl{jV>@piI`ZZ{~!TN*sT~7hVcjSy}ozS4a69s83pf>p$s6 zmeF{I#vXwWC@fS?9Tywqb90j8P}xkoXKe%2SV4u3u+EG^kY2O}lZ*tW!yE_Je&^Q+ z)aQNG#{EMHyXRM;(&Sz#B%&uCd+b+Yc*dPFf^K|ZkV1f>H?#_IbTMn~$p_$i`;J&L z32032e8KZaMT*eH(0%6mP(>dK>%{DRUx|WKvH|9918_==1JIqIS_4!ZV1Ps)f@q(< zUX)cpt+A{jPShBKTm*6M`tm)ZR+}jN#+B7#Ke$J9#P318xJQ&{*#8-#roqv4q^8C= z0@ex3566V$*cq^&yd`2}0*el}T28#08O;kkiX)(Uy*qqAXZchxhzFF_d&g*in61_> z=*aP=;_OYuDI6z~aq_0%aOhkDSc@8bg^YH^2Rx!AK42WG@c}=HszPv)t^&c$7$$mk zxrsa*Z=F_wL+h9$YW39_`jlLNR$2%VAY6k>Nwmd1K-?ZbX}bqP=`Ggc%1I?oi9Uzp zPAE8sZ4Zat!?Yd_#zDiu0DQyAvm3t_Y$54>Cc+z&Y?lWQb6BBr@(x<=xE`<#q}r4xKo z;+Tpl#ZP+D8L^U%T9Z{^W&WQ!CsQ)7126f*-jct?uzO-3EDPQDX2kTM5`z_}Z2DIGH| zA~Hl3foOLpU~PJiRxa7geRU-p8o<3GQ@I?F_-G;~Ue2qb1^=RK(0b;l>TQG8m$LvP zwIL(g1g$)cY|xzI1JHc<6p))Kk;*q}Uh>l#1AueSkQi-3QTMQ{(0fbE)h3KbM&F7b zU1py@U@~Sng6M6YVa?wb9Tga~z=Y$_k@J{fV);NU21WTyzOiUBDoF-#FRnlxFmO0W z{oLslE@fMw$vwcqUgaO)vPZf`(I-O>HRCepW?a#iF|US<1W+5hH@hH@Bvd;|E}2jI zu&aLFOXVz5TJUuFBEwx#D;n;E1OBYDqQ=Pvy`;XAL^1*g$f$Sz*{6MkGY?eX^_U_F zK4XQ^?#^1|w%*bq@@mpi53YG4Drq@%CtCI(z-TNyIcWKj8a7SSdona`$kiA036|{E zn-M@^Zw?B%UK{T!d4qP>*=?b~o{vUhFYt9y!0`hAW+S1nS1dDTM1YVxV{fOUNF?v>F@kx9rGBSJIi{^Qd^nWg!Eu+{Swm#07+Ju}dObw4N6v~H zROUQ95Sc9(MmWz<8=62dv&c~5=Ae*!p&dsRJQNN{W%ejF3b=^Eqp~((K!HsdP*`Lr z7Z%pUCv53Bd_2e%Z<;D;fm7x#4YBCojYWDhWPRn`NyKSb(1<=&G*i2t)Ff^=!xM*ZSgku6E z5tKm#`dCd)m%I4^>D4OMM>!vDVM);zRj!b6>QnH7h|xrfgXg_?ZdA{}3y~2(F5pN; zyZh%RqgClb6}})0mms%^J{KFQOhK{`!3~Hc)6a>eY5Jio=FeGfwLAc`)q!4`s8pwr zO$facgy9=We5CVYF^b7{uU)v01dAIrM#U=s7#D%glhqKL@i@bt7Gu!}bg^%L@^`i$*k|D?&J-fjR5&m86s;TrFE5JWNkV ze4KR+sUce$n)x|g;@C8&2HB$3jeQ6{s<8Mtme;8QIniLUBPxirxZ>mxjKYX0RHEb- zZsS5FM@}JySypJ1-r%z1rO{6ROIn#)XB{(=r@kJz9 zQ#nG-&9oJ!EuhMS=2W5;5bi;~JuoONy0o@qY$^--09#dae1LaixHS1NcrpgN48nI0 z1lPSe0~ooXEX+4;g|c8d&}u7h17^^L*I0+!30JDpg3SG#pobgqNN~U-p|+0_{_P`} z8PZ(Jiy{pruaIINd+0OEivonXXYdGsi-!cNksPZD&vnpf$C`Rj!`Gxt_&Lsf4^9kF?QFOZT!&W47WpV{ zm`&|%;NmTCg9Y00CPCVr6lx|`uDg-jjOg$fV`6k zCG$MqLOLP65IX-P1zMVW=Ft42(ArJt0WA=k=!-7A4*WsI?R55=nKDxQLdsuJBlb<` z5_Lt6MUhQnt7+lcSTcU zfE^#=N^9lD))8|uI}VuSpRyqvr{{C~{q#~XrKcq zi^JGGrRUgSyMBSFX#bYdEBG^E9kQ?+7T~(`cjp07`t=yNFY1g!TivsrXo@zdd3!hV zPSp7>+))LEBF$e+a}ivjCeqQSFwG)!qrO>>gbJXu=e$MXOdFG4+ZhvjnGq&6q0VT8 ziwQVphDG!V{cggi5BNJYW;NsSxYbz#RN06DU}F{Zu}`~RjOw1?RN4cjQ7i^r`}ynf zQ^+y`rTPLP*VVP5I6oN63H%SI{0)BG0~a6Mk9Zw@vt6VoD*X zZzPIgR@h5Z5VIGna+HmLU12KfvUNa{`T^~UyEHy}jN6HYqC+Xtb5r@8TcC)(H_~7( zvxhDehwJ27(ihBsIQ+*>y}MY{_7~07t&W;*)ZSh0vP3c(BT27n4G0)5=ZLe8`Om8} z=FvzX19NFrMD_#Jj*j?$XnPaDD2gR+e5ZSJk%SBoASdi50TLkG0wM^57s%6 z8W0pv@xTqrsR4qCRM2p!sHg}L(4e9QMMVvQ%6mqQf`}RsB`W$5g8YBgJ+nKz9FO53Ag#V|XT zdoF0x@;W7|4Jy^iJb*L?JS4cA;OuT&X3x(`WF)NOMs#nfk=dfSk<*Q;546MRUfN$` z_%pS{;M^fn8t{%(t)ZM!<02d}x}((S5gn_0s-o1mFI_FQLz|G!!xaK9`AAiZjT_@2r8Z)qV=dE} zj1KB}5hxy9EH<)ssspop)DuGjD@87@9$l(eir9uc*)#^OF!uq|&`ObAw_I(s(M69s zdyBD@vJ>}WZT**#cq07Ep^Ap&JGCnd!+&v^k>4x0*u^}~lY$$6_ew4TIp?Tq(vlM$ zRmH+BNCjW`%B@rE%%*B{L(+EveH2iC?S+OE9(NwF2^AIEZi`f1Xq-7J%*K6F#4J0( znS#Q0DNcSQaDp?(-f9~YFvVIkpo0fjcsw>vr8bq`UuLO5A)2#MF4QjD;W{{y+V1p*@p*1$i1#5RlesY=IDIS&9rN+k$wZ?9TZmf9WOw5 zWtjClHgd9pG8ESG;6#N!)I<*o_c%IsztQ$8P;I3VwEI>>6#v2IDrjjzNvj>bLbwOz z{qe=e(&Pt>w&$Su3O0v=^m;@<(jM=lrj|INVqJ!FbQXR2fYG{{zScO{e7J&n3GU1J zj(ny*GmYU|7RRP%C9-E$qB3nZ3i@C1+TsIxZl;mm@+7_uR6o}38KCO>&% zR>uxwY)cw7nWIo2GAD?-8+jfD{}+*WTo=GG5r}a!Xw`j2VtUAZA=pUA7DkQd;v?j7 zlsnhBF8Zs+QU)ZoI^N-`SNP_y-Z>06ZzcOYte|?>B*Ie%Um+Gvw{5}4gyDPTr<^rL zvycN8C<0zMJr}H#OV^MK)=3?(dKZ|XGjZ9NyiGMQ)JH+|`MwCjN-wQ};{F}&S!3j0 zd7`Sdt8_A(@blmt6lYtlQf#BuaZXyA9PHK-G+IT`$hYvNl9ua@)~#)a97t+hb;W`^ zN9kLRY@!kCjl3-ErX@h#Q4$TGr&RLSS$V4C4)J=yz^-6jY#AHu5abH8FtIBZdJ3*s zx(IrFt2R^p^h)2J6FX(11^-*`1IrPHdl`=hhotl%G<* zGa)<7!i|Tq-@fN#olnFEq;n*sm{!D#ery46L2(J9bIwAjt}DVm>Zn~aOqVC7`dS`6 zlpy+q20st|t&t|}>Jyu^x2k*6!W}@g(!&|R$tY`wGHF+{-44TOD?c%gw%}=PRp!c# zF!AjP=+&Z@Jg7e04>MGKnEm>c)q_~NdTp&`|}> zD?=(OXEQNZ&L(76%WZ#=fUD*1^T_U&&w%V;j~sZ6oNndHT#CxsF3pwKov?D$9nifV z{sEd3R_;CR${V;+RDQ^=oG&{%zU8{%0oCXKwdGN#UHM$zIzi<#`H7YnvKkR$xUjoA zQ8&!4C#XDhG$-Cd?&G*=OwVVfrTD~UAB6p7gFRr?OBnVj}Jdj>i0YG^55u{qs-SBz)BD?YH_4+>>;(zIC# zTq+$!e=EM9#NCtcd7s^HVj(>t$LU8C`|iQ1C^qPGvpQtC$6VCN+VM8)3eHH(YC*}P8g+i6@;%vslF+u*NbHzn(3=}*dJ~ZmvWuzucAlU<RO*FtcEHzcLnKfK! zL`YEzG!=~lw#$d|AZcWMeF7q=4X{w{K{uQ*qR(KivfXg(+L=pTZaBQ@#Y9kI6hzn| z*c7LUQ0sV}*l6rgXvBu~y;6`)6Ak5xW23<%$AyLxs6ayrRQ8Il<%5`7jMPP-5pk8I z>IoF*D-QDmdRquGUq60JZ38&;Yp>OwnZ2P4pkxKdJ~p_Y;%G=kSko~TpQ(6G^9 z3FAVep_AP!O3I>F4%(hc%tfnRyI^t3ELcd>l0~chLR?kG2{t;sn}x3_dMsxIIW|3I zHQh@0H5aWqY-P`gaCXPIT!nob<>L!Z#f$Pc@X+1J5ZD6i_bRq`Koj4Hcju@L7jh7H zv-@lxQye{V-3M709usdVVZeE6!(&{xRPG3mQF3EL0M`_AwhH^w;0EDWC$0~vE46X^ zBd#!J)OHI$E`i1EkHX)KeTAIiYtsO2L?_t_Cv10a!4@LZ2`ra>wKb(ivJx!lSN1EK z>kzC~(4u;L6S0m)CW)5DLAohPbf#WOqA`5`aeN&Vn`=|A4)4=6ArI2#B+)#u1CTPq zeexkf3FgZMw8=x0Y5ZmL$#i+n7G;BK%}Ef}c%$3AO8qeR8$y z*{m0~)d9z%LHWO80gFR@+Ls9L{Oy|E9FI}Sqi3RfA)&vBs+^0!Uu<*;x@qvC4g2G! zu-~4O{xM8|BzTwl+N;Wo1zA8?uH3n{JDM z6Yt`}&>W~-@S$qZpNZ)ByXdua(K_pE4rECPRokP4tt(jjczuRXn!6B7 zMq80X85ts(Ud|Mqjc@4tO!2buJ}qq}IvTa~K`U{U@df3y7I!xKP8IEwmPxr8qEic1 zB{ZTaA3i*h0YuPM=1!WBA^b*7<$?@xh0*NWV4i{;ZnP)3trD{3cJ=z6Ba z?R8g?PFr%tyT?~?aVS}3pY|eF*rm^Om43Z$gdsp+8>2p?NR_9et@p&ExH-AX<={B>qn~Uja&J4zfx5QH{DzdMZz3wt>7?Ta|^6G zel=gDK4*&Sk^Ip!#idQZn}s65biGj^8yw6B7WWa!D6@GV(ZkqJ7xoePjT>I&jECkR zsVDvyn$<_N?J$QM!KNN&I@>aZ1uOG)fw@tY%FG8eAEfPlM04Lh8)g<*KF%{2g9lfi z<3b08)-v**B}NVVlADM^X2M>;MOj6!aox|`U<^_fXRhSxc@T0U{NM&Y=fiI{Oqfs6 zi)W!NbLri)z_jnuFK3Ci?QOid?k;+$u%Sqz2vEo_B1=LPJWaj(ip*AXxgr&79$=ZF z>&z|iu@rfbrt}r28aD9}WGd%I=?7pH~(^)EiEcaL}JCRy7bg-}J+-e)c z`9pe9d`}OQPxWa%l}?!NlGRUK(DoOV7j*J@&7bXZPy~d|Z`>CsFr@%^uIVQ_7>DSK zeqypQkA|HsS_U^D#+@yEqUd#+bGGQ+=5<9xg$1&*-Fgbq_*Zhsz4iHy1voJ~EdJCVlRu5J(i7YW7z&)s>oGXxvzp3ijfk`FF7sF)E`vgR#xdI5W{?wmRlm%*h^b2F)Zewf~}>D zfuc>Por-)=K`cfQiYIT-_gWNf4B z&%vDd8!f~mN^uswd5*{m6u!Zw_p-L~(|k^GCm&aaB*J;T2Na7%TaANE16|R>+qk*H z3loJW&r`!0dx5)fUI^@#=lR+JAX`r{6zUE1zd>3pI~Vj;r9%f*yRbCsT#;tXqI=F2 zLkvxc0^2I>^Oy@=WU!t8KnC3N?~br|05Nj zCpzV5S>Z+NeO`4>SLvHfnN^B1Ugd(0{gCs-kWPBwdXdaY3#H*@77+tIxJYP#&x;Gr z26}i$S(q#7>hnd14)c@*Q3adxRFN^}eug;e$sqQ(SoZYmOH(2f#_+hruqv+TFeGLM^KYNBB#$*#v3bw=MN^y6ks&v2*F`?Z)g|td!{-xxEFzZ4v zhMb`KR(jpyjHVWMN=@2Y(&ulYPJ7$$lRbdct~PzP!B7*3fY z|A~=C3}ckTKe^^+iWx3^>5Q31Y$m3MFvMu!aB($IST-DT^B}!9T(t8SZ|3A(Y}~cf zL2+39;kQVbhbd`<$c^47gb^_4#bF{j;9$DKg=r3B3cyJ)MT|m{e>$4GLgZZ$N#2zp zZx=;g-3ZJGVQrXONbipjv(SnWBSo8pKWsu`E9!YF94Ru4GFm!Pv~1@f3E>|kCwAuX zNt!Su>6=?bv-2_-FQ2(BgxB0iyo!Jq&H#m|+kkSyFr$tai9Wzg@QlB}1}^ozw= zMh(4kvB=H}<-*+R?9j3r1tpGuko?fa;+AM09fbznc!@YO(M=zXa~#xD){&v~Y`aAC z4RS`qTi_6TJ_4CA`{TEeIivlhVqlPO4`D<*e5*(*hRaCcAJhDp)?6xD zyZ9E`hD}+WZ3)#~ipD-iIhTnJ=QY?wRfSk}=-#IlH9ZzSb?I_tFWFcrT4EA-E1AK;VRKKNaZqBWl$Qr80VaSAmfiT?H{6b zavhiHkH)+VDYbtdWBDpQ{}1t2<_C6zqTs(4Y!K3I1*QI^2d)-p8XM^Kt1+uKQ0>(s zJ$dGPoZDVgBB5Hz#9t#SdTKod1r_tzPhEu4SHu8NEJQ9Hg*nQ=Y`K*7U4uJO^(rZf z7mm?Ey%9y3Fv#MOoF&7SDKc`I5*5BoK^9)7;E})@r)!xK6S+*u;Z;XlP=`^j2T#OD zEJr*xz6R9f)z^x)O)!Y{zd$eC`U2TNUt9~P6U$h9ok-!U6YLzkidV}Le3ug3ht&%r zcv-R+i$^v{*5Jv@5*%!dvJXc_4dkM+EZNF&jE<(GUY4Le*r3JlA!k{l(r81GsXDna z``KTb$P1t7>E?cV_B!!TV-+>IUZiJMxVtWB4zE(sqcr$>(ds;BRPsk(oKd*}Znhr& z3`|g>Yz!8#&VPUc{ihnmnng62ID5_g%0;&&+Nu4pIcOb?tdN+HSH(W2e!z|Qg zl(-LrcbA3Yp93!&qx&yzeS`tzBV%JLNq-!JFH6KVt z)Ez=9d~IayS6{n>2MjMm=ez1qSNmmJUc@99xNDDCPSLorA|*lV=Ir1MEq~rvk>38m zOzwP~fB>7|7#w7zUO!XKts$;?km zAn~d+B=Kxzq$iA!tiQyviioAzZ*!V6J&tn!$gL!bXsv^HL+zy68U>^3^@ zCM>z<(d~HHEdA6?_;jwb=x((5Lux5FTDO%;b5#a`-ilg(^hg z&kSH2PaMlir1;KBfpVCmV|i0$5FU-_+?z!{IC%2S;_9HVge7p z9)##+VX#6J=$?(gKZ<T+#Y9Da6ZLN#9CkJ&E3IXQzwdkDG%@v z_46Jy=mQ0ae3V}Oq=WEB$tvA(LQ`Z4ONs&sB#xh5(5LFHkD$Mu$LOTXLXw% zju$cRYm&xi#pwQn0SJo5KpLtmIg~+r&hS|JAo)cV3%Zfsu)kjYl%5fPow|*2YF^LGb@^8*7mz z7G_>N65u-P)`AiuwIIh>8wEVjBPb^;kp@o|tUC>}E6Ji?Hj8#*_c>>pP zub3)Qn%s)S!7lbiVJ7J`74kTRMobmGjeRtCDiphY^ubhdRo6w)AuCS(39LAf>gKoh zkY|16JG%6CY{mUZMYoIA0Y{zM3!YT^Oi(QC3=>OAC*p(1JjnKg-aM-Ly~=R}!RbKE zTx#4RG3G`4lq{eS^=e5A35*GW$AbsfG=_DA4aWtyB zm%Nxhl%Y1wrBA)8OKiJn=nfpWAu~vQ7#x42+wM}Uv#0M8ZH-T9+g;*W@X4KbL$Uaj zmftPf#_ZMksrqi1iZ;=YcZ>9xEedvs;_nfyF4Ia4zRQluN{O*M(FS9swHjj6K!)!!}D91{s($`fi>fJ2*Y_H z&e}w`-Y3$V9MtX8`<08O5VUrfXmNUTVf_bT7P8Mmb76U;VPh_;ov92P%n)Fhko~cq znZ!h=2e9$4X3aL^VAmDsvxn`G9kd&mD{Xb;kQ$0yh@%kbVuI`&vP9WsAV+WzU;;LO zdw@1yDbfRfqRkBY9o4itq zJ&th5R;D0;pNwqqV*&mvLV6TxaI`^W4y)}q`g?}x6sT1@VpuaPo?FXp&Jvi%4eJ{f z!+2t?wT2_K24q-Hp1QC+yty8h=LOD#gF7OAk1%4KWk$VcJe)BQRmkR^0OT*UZ+o*8 zMk3P>=HZ#!%NlnbZ_Dwb(hE6jdGbB=48Ue7vI5ZDoio;t?Gm23VGqgk{OaV4wi1={ z{&xt#Mdf+^VnBck7cLVDO2EDn7v$B-!|accj8_4U^6(%7c&ArbeG3N8=9ch3*ftmh z7E`mYV8anUiWnW!@g~4*BzgX-P*BI20Dvl2GPRGR)9sB+chHqiViBs7m2Kxr zbaCt>fW>LKl993#*S1PUJ2*I*s$H2>QNmnE&(9Qd{hLHcFIZt5x4UCP0hldX4bBaX z+zeI$Fs_{CQw?`saQT$0#;uQ;KgWCro#7D!IFPHA;q&RGS)$W~8R#oGA_%LN5wr5b zC$^6K;Re^dh9jW%yr%22Z7|lX9h|vSC^K8))k2=^feW;srxCM7hX0VOojZ<~O}d>~ z*E@>NP9+w1qv8`c6EWN>=xg|`HOwzVE!}NPD0cCHxm@Y#T+nXbagUiJ&bYx=!Ql@J ziK4`gd1`{}g^Zi(A_xjSAwkwFg81Ryv}_Ixv}HCGP&>%*)*O)ohp8Xth+N|cnRDT< zdPL7wK7-lZTtEZnigOzMrGZ1$mVIh8+Tg)5c>7$D(_x>E$^y&adRD_+&K3AU18c>{ z=nA;Q`7kCh(&7iuZA(OIOLK)rfotGR6P3*TggVRe4o@-EVMKubJ zF$W8D83)XlOZ-13i#LrD-w!Dz{l~|stIc6)Oh6(G?&^nML;PzlnOpKki7!K#ukieUvBL@@V_aZ9#dw;}%%!ehh-UQcgW~KqJ3r+- zPjk{V$Wwd?&fr@Hnj(i;&-{yL6(u|*+T_pUL=dki%G~aHU&`JEAYg3H;j@+ zb!mg1RCF;w6CZwp&KK^a?srfW|2N_)pXQwLozVpdR8ZAJBBkYv3`6~fxlYAC5hM9) zJ|(02B$F%>sWBVAtSa=F8z{R-T-B;V)h#S|B$&VOyFZGT(;DzIJz69N;Pm#FMdG%O zY6S$%FM$5MNVt8UM0fK1Sd_Df9bC(4ZOc~8n_Lh0J8v3 z^EVX*4^@s*AUsnz3Qx>_zpHq-U2?qoWP#3ikoqpb9O`345tE}3{zE0knN6M8{8NR| zRy+J34&yV}yt|CUBmB*-or+QqbH~9KW{W!nCIG_-mVJ9QJvqDTKfe?M_=SF4AX4)b zf&Ed;^t>=uL0;3tEY52Z9KhtYj(~-`!$NUs%<8YI&^Zs&?1iGkAl1DX3JC>ShWVMU zz^qYE58tZ4Uca)~@mc{S;z4I9QL_V9Pje^7$H!kr^A`$V60D$W?Yux_E#(%A)~R-q zmLA}YV(^hmC8`iTsu->_i)dl7_%mk1PR42}6)h6on=WI1&obC&(6BI%n!D)ZMWRKX zhDR}+n+u;Y{u`VgT+}fQU{qXA=EI`z$SqtZi-$OHvZdY-$UR}?e?hY0p_AyzhQ6-Vi@hs6j{KC5K<>~`L{hT$cn z6jr!n7aOtH2-ZrHt*U=>>NK-jk653`lW=uZ9(Cw1PnI{|!`_X;;^l_4Dmb~hOwkOe zgY8(CK5L1vGI|6&X} zC|$k%$|CT_`7hyGTLRpcKAyvHbA|U{D>Hx zQpee~B=gDf=;(L3`uO{3!6TyG0BzKPSO#%aRPm!W_P>k8Lyan^ zx~w#^vu6&gm7e(d26s%$lB#NNH&B*Ge5|>c8z=?{FeqSZBywup+{cV#z;x7$=S3@l znv{vF_UK;zTxS++;3Mns;f*S<{v|6k@O`DM}mSu zQEV|iO~)P;dFi%LVdO1fZbeTuKUHvxZ~IX z_m$IuiZSzG{(#k31L@Urk(L)yF)(vP=ol#06Ti_b`F=NV$*)!THm#5CCRL%P=mv3< z@;yGw%VQTU$ni^EpY&yU2OcvX80f{9+9jC`gl)8sG=7pIY z0jb5J8yFS()X(7bpmY&DXJ9dAOL3oMwopU?MEI1b)^jun;8<@H0;r28V)VhAp*~>R zr`WX5_oUi75Dqnj(>@m8w1PIGXcc9?t;i!W@v6Q$LBmu^%~9N$+;BKH+rmIMG+H&3 z%j`n!mWhGbjw@IuhIFo0g|i=lEpGII5_FKJ9@xZs<@2gS4>UKdc}fcB_~_^|F(t9^ z3joc}n4#kzr|HXah+_{eUoN`z)dCy+#4B<`36HGk7nJtQ!U^(?r5#qpEV3bQ^t7U@ zqnH)q^3LBVq?G1k@LKb06^3{Mea*dgq|d>46)kFJWZrBKOJ~&D?h~wKu{B`L<0~+~SG6Hef|KV0`g?^KbngF#<9QyThYRz5tT~_MU!teP zKPRmTPkbRxHQ?s{;^Po--_W~{i+dA)vYRd~II+=)Cq#DQE(XQV5F!?XovPjz&8hSW zk=EL#JDUmEXaJmHMbVZ6ZZmCrLbQolrMhh?{q=EFAS{qL=9fhOsaBqBu8xyp;NsXw%ATmYkquvs3{mYXv2cEn_dlu=z)yLv9YXui-8_$ zwF(q`ht6Cjx_MtU;5a^MmFUzJDmUCylqMAg?eb&Q-Ov$|{ScO{1+b{}Vv6ELKozg% zt5=D>Eoatpjcpt&gmqA@4Hi-BXW;VeMsJ<=bow1RxQBf^}^E>0>b;kAi6j&{~`F3-; zxO7V^#Vx}07Az_%>EqQRZ(#k`oC{hCX;1+bGtQRlTM zq|u}F>^jjoF)R^%w+@sqrL^^!9G6hv_3%_FqY3M=QM-f|t`{>-WD84A)@w5+FP7^K zYJ#1lMc)k@aMrH=TaMvjdfx`oBKe>Wg4v-VAL4+ykydRGeTSCuFt80o@3`LI=XWK% zS+*z@-qGG65AlCKbDm!KqIEDon}1Q4m#{y5l8B+^0xlAZRF>*d=8-ui#Od z#Da-uU_j#)ZWq>$pA|I4$MBQ_r3_d#3^Wf>+RLI%(%iiWShmhzzL$0WMxcqO3ZufR zpxa&+t7EF`IKv9csT3V!_N&0NbVa3T)v`eap5YE+$G=?u=?I%uQKk64Wzjy)7L4?9 zWDX+dZ4`Aa%YO=sOyS53M9zH$k*oKIMVcI$jL12!ierJ*3jM?OXsS^7XIQlg6MI7w zrb~}i^dlGIq=R|SDi4Fe{BNxegGk(qvndSXMVjg`NK^pl&1%Cyn8&UCVUQRr#%c(I z#3D_(qKAV}9PFa2!yxdYur`H3;;neAIt-HF3&dEpVW31S(b^vdX^esz!XQa-CM;4E zcd9p$W_1{(iPgl~6b5OEG}U2{W>&L+RT~CMMxy;;kmlGbY6ye0K$;@er%v@Pt(I1K z7=#^SHibb_tyHTz48l$=BWlAy=~lY6KMazAL=9n(Oe@nW3genqNK>vMl^?$@1{*O& zKPYY?|C`{8)he)p2E8dd#Z;@nvo!rp@mgS$Vl%rHSP)68{ChW>IqbMvL7n~e#*oIF z-05H;lvZ^ZBoUBWH^g$v+8-(lU&K|FHk>eFxx&;L15Wl$VNf0!wF=^N1w;0SK@4AG zt04jsXBDC8?Lq@eSi&lIQ^Vq|^3@tb*KQWq#MEgDQ`Kgi?pn=4!hC`L-YhcuR(!`q zTczX%4yLnB13wAo8iwGeJ)VqxF$F#kn**yjF-{uoSD7BA%ij`bbZbz76`UT4S+!8N z3t5FqLU(|KPAafgt3Z(=))IRCE%7CG&6m6l|FdHHY>PM}S}QMPrOA|xoxh+Ot>dUd z+&T^|+9J+_$0}!n$9dvABKNGh2NXmoIv+~5^-Y{Qc1a0vjGTzXw z?})5~P^$OlQuKRpVt<9&yeHmF-}*b3{4Q(NXhiWr4%PE7rto9$iH!edU&EJIW|wp+ zZAXi@il>b?sNee{73;+--pBm6^FvXM#8{tlY_$1~o!ILn zhOr)rF(#1MtQKV{?{Nw}TLPolEckFk!-PIwRV~tZg~LEG-e<5e1atzzKTv(OXeWN0 zU9#-q>{hl7E=+|^agshlW4DQs86T)h*hJ`8hsI&nR4WivG@o{C6GI2-MINK+$9e$? zxk@v7lVvKelk|ub1;uroCa@$39nBHCV~!R%+NGri-|tjCEJ3Y^ z66oPi#92v^z}inl=GX|JP5l!?BQVful?u72fpK%p`@9SR!M|oQTAuhDv_`3{{r^^^ z1XudV7~aQ`r{zOve&7;}#*mB$wk zvIO&6%H9blX%AhrQ>2~i^+$^VVt@}iw56^|vtV@8LmZ3<5D!2vfWlnF1@YysSc@af z8YMgy*-pK7r|6y2z|CZC$Hd3I!9tQZ2&^4P5z+^5XhfOFyvAYOAVb4|VVK|8t%uQE zEo;vX3LvydG5JZhIWU+Et-pd~wBTQ&eaoL!Ss!OD0eZy$ zTlD$wf)nC{1!vX2#Yp&xHTg{VTPTXKqYP}SAd0fG!4<9eU2%8G+a;~NhG}O?sKK#b z51m;f2DgMMD49nJ%$zX2;st&hUhD@fsS&whrvGf(Un4S;9LCyTzL^=GQa%@LY!6#* z1U6h)PH~Ue;>Q4koq8(+Ym1)X6{`>**Te#V4XbXWGBYT~An&mA`3J>HU`e*pEHGfw zHSVR?KF3Mh->J(NVk$MN6Y<7}RPhD&GY-?YU*P28-?JCjinh4T9(||=a_N_%KtuCd zIt^;j4bmf}3|k_j|Ykp;q!zM3w)j0`*hIMQaXkeviqkw|Y!wgAxLDnfq znhR2`AgM0McM6i=g8Zr=+T0M(mCY>SqHPO=u1rB1yRtoX9Av$MxQl-CxHQ|2gM6tV zc3t?2E86;t0=e5Ux0De&+g1I$3X<%Ce4!vcT#yBiaITIn$g2vHrw{mE&@M4dl>b5B z?-HGc9$*gPA*iKZaL<6H9>yojJJJI*NWH>^>e0gJk&P$NL)bF`rU3V}?@3TQfC;e0xQg zn3-iDpSgvu*eiNum+AnM$@2K)7-t{<>~Fj#{(y476Rk3Ko*;!i6MR57d?zjoIOB1zN@=eV(0@@@fUWkp(hc7m195Rz zmOaZJbf*kKiJRlBF`Tq3!_qERb72>2D?fEw>iNCsYVOrdz}~VyRY{CHzZYl5>{e69 z>s0x@xVryJ?qokt;ot#CPvzw2=^$gx4^?IXZ@hs|Deg6h@nmy1CGHcMvEX~Kt~rC& z?!)y|m+cenW2$uyn!Qit8Y<$V&b5)Hq;M%2T5kY*EV9r{FCU}TA{^8 zZRcz}#0{UYU9Ac`TvD8rOt(BJ5}O<5ADXaSs6AW$Nw5AS`omIq_$Me44^i%Z7}Ms` zmHWj#fthv(;a*f>Wtrb`X7I8n0XLMw+t1^I;MP!Kb#?*bRj0ZDxJeVHG#3DOS_-R? z3jkjvVI_tDnfyr<_-ckAxWf?5#NiK*Ih!W^EG~d8zVc^y!aYc}KMP-G5hJWHL{5+S zi)yWMk@VoErPNCXsYZWc!+78o$^&-2O<^pgKa{+!5 zaKO5%9<%*i`n_KKvstK86ona^seQ|@_{L`~wf_w!*EuxwH__=@MiNYx;RK;Gh_E;#AhvNVWE$7=>HD%s)hbv-WWi z%-Y4jKACQPOV|G)a*}pG!BD@om7mbv9{xiNODcYnff?4u!y5R@A8h3?javDC(0wcEjsJ+N+pgpa^fJoud92oVSh4^cB2H`S>@58ciJOt- z*+aM@Y$g5c5RB|A=@1?rT?O!5Z8@0l{o94PPd)?eO6mN+a0YoLJ^B|$>q>g_FERLh zcYYwvLu#*Q!g$M=YK2Ex_reXxCm?uu(sHUfsH>sjhs96X#ZPl%d^n>&-j`@DU}6;T zH9cT{HMhi=i|CpoqJNT;d&N_lBF`OxKUF<_a71J@SJ}o}N5iunIU;TfIN9o%pusuO zffnk*bYF=9zQ+7nn3+IiA%kAXioF!`E-ovZ?r#iViC_zg-PwFGFANOK^2OcjWW&15 zGVqlKd}1qsKjMh*f#D8Qlu5rdh_WEpRoD%AAe~SzII7#c>Nzr^bl?>vpD9DQUB@UXx zTB4J*ko(CzS~=qw_{b=EWThM!Y{{lVxQUrZANfOe31U&LVVbhRQtXs;p&=(557X<0 zY=!-}T0;&%C{xHG2;D4X&tTE3buqL?$do_{mj;H5W=m6ife#M5Y%PIbun(8-78F>W z;26kX7;}(rV5%P1=|$nF*(19=9BNZ|zpDf~Ps%f}Uv-a^9a3vKIVK~va$(!TV}7NZ z+OuS2s}?0!EpCh@8*9yKbDZdal+E)_Xamw-V!WMW)pMC_1EPGdOtZZ=c?qIybZ^lW zUfDC@Q(X^|&z(U_ys}3?d-7R0j-fsI*h*+{CaxdDPwzO*oq@s`f*JsU5z8*g!V1_i zVkt988K=bTtv7rX=y3&#wLyQ!@dZiuW~-UXqM=dp=7cI;d@Il#O|@}h*9GZiu5{$YJhvm41a8Rg8)i5|!vID#c8YgrK|!bb0UdasepL)Kp# z$$N~=bW6MnQM~Nh=T%044X1{+KqZ%MZe0`x3bQW{Em>ICk{WLlapL7UY=us;ZD76G zK$3vHk5LJ-O<*OLV1B~LVfdZQ{=QMg$17v)TJ?Sg(khXFX%CXY>qpDv0G}R^>`w%+ zsgh#+;-jD*b}fp}j;tY(^I90ZR>A~qUN=dU&3qWQr!?78*ME!T|7JXELDza^PKy)! zq|zl)W(~;VdgjkuQdd`cV8)a1`(}gG%2@}??*F4~jm+-O2q0Nrny!Kbk@F8q3Zw$i3274sNau za>|#P_sx}}j#ZjZrokMCtdL%GW|C|bXZIOwb)%AG%ajK0EtZ>#D_|T;fMmuMH?%NG zwz$r9dPsAM7LO!O`EJA$`2nM;7-k+T@1nx*6gO1dXVL2QYRNiTJ^ipIS5xqg219GNVff7om4$U@|=kF0731 zp?OW^<;Lf?3xF5$ik26E%dqh20qRp`!=`PUJEqyVa{9!RFHhY$RUklE*EKnc;h01AksK8 z^(4)22_5yIDhZ#m(ddB24i45~U5RdRA@h~_vPOulB|*XyyfMX6&-V&UYEFLH)MYfOs7qf;Z{!=(r;+$JEnvf#f8at>YMfSu^UPh{Hm1(Q1 zKBXUG(?W|r=6$$9s3dTR_NB_K%o;uf!e@(klsINRD3v^vYUuh@**&IkJ~!qNElHKV z0|z<1bqxPv_)EOz+l&nFRk2Lo%aMKwcZLA&-cZL&WFk&B<61ITHY}h3saI(c$&z0M z7`opnfrqmSXgg$bfxZ%eMyAQQz!t_x?f66YJYMT<9dSTp9m9YoW@^i2t6=qSf)(trza@g#^8EN4=}pco3b4YH|Ny^8_p_ZTe7nXB?W4SI<12gsSp`q%&jpzNqP&UuKMx02Z@J9JGr z=;(|9SR^n2X=E#zoS=ptdWQ!T-P#H&uNq27jA_sr4UoT09^eT~)u6Jl4jTim=Iv$; zK%9+;&x?TpvEu`GnqO;vwq2CJ;ZPdl+9Qrdw>=pa5;|IWbhm@c(<64k*5%u}CKde|o~&2rA%ITI?*$YCl{wqsNbg=-Pr>X&H=?sT-+ zFK>%|Y?hMf!>Q^eTvgpROE$^f$*8IQVoPDkB2LXVwH)ExuesZxZ_;rR>wzY+>8Uiz zAGwE=P5HDn%KU7Zk{eRZYQqA}Och$U3Q35=N4a*a& z=IJ!At&C54TebLJhyfNyUV5@EhLPPk<|8c;q-q=_HJDEy%!2O1Ga8@y!8Ga!xf6R8 z4GFDMSY=Vm2$$-99IjBigML^SwZqE0p2oM6gVL&BQp}>}Y$ldgfpH3`hIZx3i*dWM zFBitGLmX;Nx97_4qWERTk$e#!4eMQM8D!-`(xZo%cwSAUJzeYfk43-!sGYSUt~;3~yV(FafjaY{ps&KeBr ztU4IXicRTb$K-A1u{m_CC)jNdrS_7$0uL{C@DzPBb9S{%PJ$)?mC<3hAVzlA2~QO zJ~>?NqBiI(eE~)NGjS6|-Lj zj?hKJWF->B4VRNI3Fjtns5F}-F_92!@ec0A%m`w-a?(e`<-A~1t{Wj=cZPVBh1>9) zA>L`E9NtooX&#AD>bnabc)Rc*E*UBPsi9%2BH{Jz4AX5RWhS`mr;)OoVeG7Ib+N29 zg5$O5aeD;u0J5C%S{?><#_Q@Zs54&6pKzDpjMpMJ6v8?}BKEM>E6U)QfSLdt{yr|D zuSqCtYuc`0quk0XJ8dNTu!~g#b+Up?aj;rD%1s;doe^19WoE{-IL&Y4XpGV1GZFW6U`Q2#P3NbkP zj*)$`^vr}$94eqclStUHF2VA03V^4ud)zy&??iaCGe&cL@$h zSBF8J8K}Z3p@SMgRUEYPt$GKnpua1fHPhOl^r543Xw6MBRs5}=$$#4oH>{7bBevq|Po%C^fgk~yz8X@wZ@fIBDD=ZE@~(`HJOm41YcCj| z6>s&w4V&9IRL_>5SD&DJC(2G@ZUwELC|?-vOx_#Ua^?0|w6=1{%CYu`LH8?^{8ob- ziZVmE(=(G~Wf1iZtoFhG;+9(>XlK)cTjjmYX0xus$`x?mqT&xz=4~=37{N@l(~h|G zHu(j3tn*~q2akfu^1N;{U*s}_$`uv{dsSi=g#EDDSaMKD&^MFida-&PEuI2J_l0%z z;S@QK!d5@^pJvPS>@|=yWX6Necmcwtg2NlEUeDEeQ=ST z#i8|LwP%>sbaX1ThHA2Imt$I1Y~%`Hkbwqo6|%7R$?@hIdhK?3!<8qAWXky=0t9EU zJ%^Z-FccZq3NFyJFA_Te=$j}bo<`-$WSVz}obHFeLW~@M=@!~EBcBz^3N;p|K3;iv ze6f^$r|cBX<_Uicjl5H~ZwKc{7zEhX*Z(#KW7)>brbhe#UR)yn;%Vufa%=#%5Gtn# z7=@HwgY8F1hQsO}fk`adl2iSONQ2wMeTld{7)vT^-V8Jl*ERbPVkG?0>`no z5SjPL&Z77w+H*I|jfW~H-6Mw^38jpLIxAp4Lhs)z`=wMc-t3On$I}?i1^MoNT$q!gL;5iW5xz~W zazBf*Vj47B^lYKroWAvK&@wj4G z_JxA=ph_hd=Hqn5Y_R$ z3w3cm-8WZe!Q=Mvxw56Pm0p<(x21o0H11(1R|`7uupBAw-$+)8%&a{6 zh#YGquH|{xs!+c*G?8R4@!~pqhNQ1$4XauH1ioX*%iFnSyvW|Lj=m;2nCJYwGIgFrMdwU=QUvo zUPr}`$XhCnN5OdMu2%Y@26`^ZicYsQtOhr5$+O{1{PJU%0A|n^kI8e#3Bkw%5i~Cs571#sxjdKY@JhLC#ZCUaT=p`ar6x;dA+URRDYgs|xfCK~9etr6 zN0wp)uA|Il;C~dpOy=To^D_AlJhm*8ZSdH)41BPTl9sE`8O!A*2+h->waeuogbpo- z%f~v(T_L-)Kl}>!Uxroos*9Sb9=;PAKbUjzv<&D2V)pHe{^Fw$D|`8^k&D9l;r;j##;ZxIf=o7>dRBTUbyRhakA;s|O~j z1{(3UyaICZnYU%zwypx~94-ikF6Y?v7L9ycwxN_QGP9LEZvo6lyj+R7{`qvt7TLup z=PKILb6aG)Yn=4ZpRM}0xQ}dVTl0AZXLSIVIMx^D8*nfnuWP}k3QnnTCiYqya)hGamD7^!YOGZ%*-@JRu3Y**_DAJS@5z1=66EO*lpK2h z133zz_8(%ZUPqUGDD$+)1FF)B!)|wh)z0VT-Yor4j%ZY^L@j$R(M7k*79^|X*(Y6m zU0E%!IcemF)iN_Je6Gh0Pr-#3iEXlHlT}S^4Xi z@&}pQrPtUoqkHr|bM%;QW6$i~eN3<3W4n(zqw5*H$92E4NB0}Xjk|H&4PCm88TayT zd4qALC0jUgn=REf(*FcKG%8m}Fm~`tN1;xK8n=CkbWsqmDnw z?EH~-@OnJs0Umq%t-xUP)N#HWZyq;ctZx)x_ad%|%5v`yayxEStQ=M+Cr1aSH8nkB z0RPgm*=R>mtIxMuZPXgrx{CFCik_T!(K6R+s_+ceR5+Qbag9B777Ty3-$w z2>;}SX~hBAJ=o64sG^apnnp+lFUerF9L{rv;}OOs4Z--v2>V^(CJ486g_9%VTk7~g zuz<9P1ep;9_#)!7BjR%r=8kme)D>Yj!W>R_#h;<#F9~H}KyE~WR9CnU;@uTok8p}B zel5a^@Rakb91|GX-1J=Pie8E6#;))pgqyp1sK zKg}})fOa8(3M+ic_nYiL+M&}@Byo5A69~g!Hb}>(@$SYGc1bmuoctVa>Pr7Ms^!5p zjjDc=%Z*eT^}9^R%sd)J#fPL1 z$J%7eCWjEuWOm|vlkYFtIq%#|6K?h%&qzF(OPuKQIlC)7j;8%3JNTXGdl1E)I((9E z>ZI}GCOYs^+VYp|p6CQuB1tlN56g4%a$1?5mI$7OCwHHdGc<0GGcfi&wi>s46{Nn>Ucz+mD;PdrcX9fp({L2 zxHAvqhx0xFL1`p;^$}xFC+|X>zA-QzZ zF`1oOiXhKFxp*?)cEleeoJ%W@!DjOd)gOcTA^DM5@AYkxb9BMyBA#hG@y4mwPn|q^ z;*=Z5O?Kj*dZfsk-J}93Gmyf8Zg`~1dr#NCZ8VfyI(gDvqbE$gOSN(o;LJumez{yH zoI(=}Z}-u~i0jsdRBjU9EAU8`-tKq|(vN%fqe6P;G@q7WdZs1f zuQC3T@Mq$WhI+k2a2&SG>%H%^XL_Y586D}GDDULc&jeM;AGbHp^o#`hQRIvE)-#2x z+n+%5Xc`1xjwF6gMtz}?oOW#?Wn@O>su*v7!#}j6>A3|3RT&;nD?FX>TL^P^45ipO z?>*MAeA6=yL6#-m@#lmCc<<*5^T^9{g%{&prKc@%-d@HqYKZerYU1Qxk4l*Lhta)_ zyd7YjT-C@MNc_E%u4^G;qAB)k9Jc$NM#Urh?^G7=?cc;num%ZO?)^@6@!lyH<#aJU zHz2qSrSiyf!l@Ac{)jM(DCK|-FxobU>~ z^VIDQb74-Hl@}gBPB;-^p5xqMZl)7Xh)AEL!+~G|)^^+lHj4!+^ z3LnKgOI-&64)a{@gpc7p&jSu|1KbrDsF1~g6VIe|$IFO#EO^4=y%FJ;QC1sQd6jtY z!yM{VzyOv}PIxok-3Yvmuwr_<%eF*>--!sn8xejlBD@vhfV;r=BNBWN5w1qqjnGFC z@!KQ9J0ij#M}$8?{b4QoG$O&yi15E6!k;1RM(Fd1_%9;DUq*y$x&Pf1_$ng7*Ad}e z5#ikt;XMeu5!xFO|6N4*`#}+aA0ona5#b*r!uy;s6*l!|r*7)0XJUti+JgsMAjweL z)YRLq=^;dObEA5hid7r;qCc8?yLHV)m^p9o#5+b$xOuE^!ssbeeN*nb<%UTUeAgh3 zC-+bu(_>J_-()7;-pqTS@ml4Q*W9)ZuHpB6DExrJ%J~GUmw#m0_FaRzcezxmaT^k$16)sFa9{n z9p>|Hnc))AoD3zCbBT;TANG)(d}k*blf977_6r=J@}$)(A5MUA{*)jqR&VA9>ULgMOZgGKT{D?dSm( z#7-+0qLXtF*8l4J<5~Gpns;16>bXNq51Q<`5Kq>}F2)mt_gq6m+j+ACg$OoAZ~>mI zx87{CKL)|=BNDpjJ=(r|;HDH&2}E8#M}X)ktIFS&Jug#>CqvOeh;< zdj5&`KLFr4)CvCwVSgz656=+*m`j}m9?b3OuCPGZm4WZbRx`Sjo(<UFq2}!jvhi z9F*&wV+2ZvnVuUFejN3%`s9RpAc<(Wc?<+I%y)BKv z>WluruFW2La_ykfRtzjq*UHRqaq+&uS@UBac%FVrEgrN zg-S$IurLZpK#71NnqVj-{eU0TVE9mDV>C)6Q6o_d#>9l6iT=i*1D{GZUmCqs0x%lkU^g*Qw&HzMjxJwJ0k)vctB*B#V*CI3l|DdDWbK zYam%{SZdwUOV_K0R7c9TDv{Ed*s;;lVXjYC6EE=T1n~(zT|rzeZKs!ziDkVd+$uNbY$o29k(asFZjdkQ z%+w8r0;zNncvHJ*dnVf-sV&OnE zaf&pr&3nB@>jUX@t5+Y}sK$o-$(Kj%^~E^6T-PvQmj*N{}4 zbm>MAo7ozURwfDM*$MTqjaq>!*Yda9K>9MudaZG5Xk#~Wa9+e0cg`c}zWjYOlIP^r z#GQ1ObKlg}+=pEDZtnq)+pV)I)U>Iy(c-_#2-C}C;4`^-K}hc&>=+?kUcs{Bq+Ef! zzd~s-<4zFsHo606Bi_+}3r%SMu$wb<3tF7Z4v;a*6s4dIUIe*higv=vn#7WtWVB~~ zP<=5Zb&7ks0GHug_!a(wd)jTwfk&ViR>KCUf)>~Z$KWh{3_rt!4%?ast6)7;LKJqu z0XPf2a2c+`PaXC|%i2X}Fdk+@8I(gcG{8=MW{WzR+T4lfg6*&eUWb!#5k7~n;Cr|U zw?VzcuK+L(@?bVR1090Cx5 zI#?Qrhnz&9BH}v1Ky4rxPBc0-^==IB(J)EpgjDVmMdmG{a9d4f`cu);z23R_8J~W>l;%gjDe;u_n3XX}?72aieCuVyC}q zS7KL={=H7+=wFg*q|OhklF?Qdxw({G4q}B}JuP8*f9ls?SF1vT;agSyi2hgY^y#)i zU#nL4^Y^Q2)WQ`{KDTLYS?Q+5Wu;~1YpH4qiLnmz>5qv^( zQYKecq`$WOOySpZ()VjQ$@_I3dXlfVdbGSNoA%q$b9~xGGn!e01>`F`W;v+kcMyLE z@@YY|)pISP77Z&aIcTT1Gg*J)1&lsTT*?{!Ziap@L!XtoeL#1`mC}1-YHYTt_<<>? zKZ>dRnI>7rA=7GfNrrxZu$mp`iI(U{TonyAdUfC~O7w?uHFu3^qzEGst1_BDvin~r zkqrFp3h^uKDZ#iytG80b3@l4MfAit!||gNI3J^Hut4#cvin(pQ=}LAN-Cg4#|HL zjwXB!#4QTl`tN!^jTImEHt}VIV@a;i%NuaaCb?rEyPHrZx?&)l@BBBgOQdnj>DJ9+ zJ%Bz48XUQro$35Da{9^CRn&-TcVI1TO7iD*3cu~=kqWP$hc-~*Z(xA zA2}14oSXW_c2!y+Qzb88e_&@52)6_xahI0_m$=D$l%admssoK`;nWjvdh>Cfa3baS z*j?p1ZnV;2i*&a;*GZQLa9&?&RQV%^AGOm*_VGt`R+CyXdI4Ijd<~(T(I+3$>zdT8 z5#4C%hQGFGQboi2kkgR*izc;0uV_|pEmX(6pNN()Sa~3REq>4F$L{dfk1@ n&I1|5hGes4(zfWXcJ*-9m7WXj>dT=ywQtzgK{yBBz(4RW^}*+% delta 97026 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%0AH*1SPr_Xo{IS{-@0eJA0~#a(vQ(s6JaK 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 Ezb-$s`v3p{ diff --git a/out/market.wasm b/out/market.wasm index 4fe85385a30106d42c297cc364fb273e02003143..a73525289993b2035fe0e053853eb605a128812a 100755 GIT binary patch delta 69614 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 diff --git a/out/series.wasm b/out/series.wasm index 9b31f36f495cbae6221d3804c004e6b062a94667..2970c565694a40a98989d3cb7b87de2dd221a5a0 100755 GIT binary patch delta 112558 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 +j)pPScE`ZooD$E2(zv?@ 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 delta 107127 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 From bf151c80c7ca48c023317f78737a6cf5ab92b674 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Thu, 29 Feb 2024 19:40:10 +0100 Subject: [PATCH 03/28] Update marketplace logic, rs integration tests --- integration-tests/rs/src/helpers.rs | 13 +-- integration-tests/rs/src/tests.rs | 4 + market-contract/src/external.rs | 13 ++- market-contract/src/nft_callbacks.rs | 107 +------------------ market-contract/src/sale.rs | 151 ++++++++++++++++++++++++++- out/main.wasm | Bin 301757 -> 303671 bytes out/market.wasm | Bin 230500 -> 260117 bytes out/series.wasm | Bin 339347 -> 341261 bytes 8 files changed, 172 insertions(+), 116 deletions(-) diff --git a/integration-tests/rs/src/helpers.rs b/integration-tests/rs/src/helpers.rs index 67cf5f8..32c729d 100644 --- a/integration-tests/rs/src/helpers.rs +++ b/integration-tests/rs/src/helpers.rs @@ -23,7 +23,7 @@ pub async fn mint_nft( .args_json(request_payload) .deposit(NearToken::from_yoctonear(DEFAULT_DEPOSIT)) .transact() - .await?; + .await; Ok(()) } @@ -44,7 +44,7 @@ pub async fn approve_nft( .args_json(request_payload) .deposit(NearToken::from_yoctonear(DEFAULT_DEPOSIT)) .transact() - .await?; + .await; Ok(()) } @@ -72,14 +72,15 @@ pub async fn place_nft_for_sale( token_id: &str, price: u128, ) -> anyhow::Result<()> { - let request_payload = json!({ + let request_payload = json!({ + "nft_contract_id": nft_contract.id(), "token_id": token_id, - "account_id": market_contract.id(), + "approval_id": 0, "msg": format!(r#"{{ "sale_conditions" : "{}" }}"#, price.to_string()), }); - - let _ = user.call(nft_contract.id(), "nft_approve") + let _ = user.call(market_contract.id(), "list_nft_for_sale") .args_json(request_payload) + .max_gas() .deposit(NearToken::from_yoctonear(DEFAULT_DEPOSIT)) .transact() .await; diff --git a/integration-tests/rs/src/tests.rs b/integration-tests/rs/src/tests.rs index f03e640..3df5c99 100644 --- a/integration-tests/rs/src/tests.rs +++ b/integration-tests/rs/src/tests.rs @@ -177,6 +177,7 @@ async fn test_sell_nft_listed_on_marketplace( let sale_price = 300000000000000000000000 as u128; // 0.3 NEAR in yoctoNEAR helpers::mint_nft(seller, nft_contract, token_id).await?; helpers::pay_for_storage(seller, market_contract, 10000000000000000000000 as u128).await?; + helpers::approve_nft(market_contract, seller, nft_contract, token_id).await?; helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; let before_seller_balance: u128 = helpers::get_user_balance(seller).await?; @@ -204,6 +205,7 @@ async fn test_transfer_nft_when_listed_on_marketplace( let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR helpers::mint_nft(seller, nft_contract, token_id).await?; helpers::pay_for_storage(seller, market_contract, 10000000000000000000000 as u128).await?; + helpers::approve_nft(market_contract, seller, nft_contract, token_id).await?; helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; helpers::transfer_nft(seller, first_buyer, nft_contract, token_id).await?; @@ -305,6 +307,7 @@ async fn test_reselling_and_royalties( .await; helpers::pay_for_storage(user, market_contract, 10000000000000000000000 as u128).await?; + helpers::approve_nft(market_contract, user, nft_contract, token_id).await?; helpers::place_nft_for_sale(user, market_contract, nft_contract, token_id, sale_price).await?; // first_buyer purchases NFT @@ -325,6 +328,7 @@ async fn test_reselling_and_royalties( // first buyer lists nft for sale helpers::pay_for_storage(first_buyer, market_contract, 10000000000000000000000 as u128).await?; + helpers::approve_nft(market_contract, first_buyer, nft_contract, token_id).await?; helpers::place_nft_for_sale(first_buyer, market_contract, nft_contract, token_id, sale_price).await?; // second_buyer purchases NFT diff --git a/market-contract/src/external.rs b/market-contract/src/external.rs index 5d806c2..7700642 100644 --- a/market-contract/src/external.rs +++ b/market-contract/src/external.rs @@ -2,10 +2,10 @@ use crate::*; /// external contract calls -//initiate a cross contract call to the nft contract. This will transfer the token to the buyer and return -//a payout object used for the market to distribute funds to the appropriate accounts. +//initiate a cross contract call to the nft contract #[ext_contract(ext_contract)] trait ExtContract { + //This will transfer the token to the buyer and return a payout object used for the market to distribute funds to the appropriate accounts fn nft_transfer_payout( &mut self, receiver_id: AccountId, //purchaser (person to transfer the NFT to) @@ -18,6 +18,13 @@ trait ExtContract { */ balance: U128, //the maximum amount of accounts the market can payout at once (this is limited by GAS) - max_len_payout: u32, + max_len_payout: u32, + ); + fn nft_token(&self, token_id: TokenId); + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: u64, ); } \ No newline at end of file diff --git a/market-contract/src/nft_callbacks.rs b/market-contract/src/nft_callbacks.rs index ece44b4..02ab75e 100644 --- a/market-contract/src/nft_callbacks.rs +++ b/market-contract/src/nft_callbacks.rs @@ -2,13 +2,6 @@ use crate::*; /// approval callbacks from NFT Contracts -//struct for keeping track of the sale conditions for a Sale -#[derive(Serialize, Deserialize)] -#[serde(crate = "near_sdk::serde")] -pub struct SaleArgs { - pub sale_conditions: SalePriceInYoctoNear, -} - /* trait that will be used as the callback from the NFT contract. When nft_approve is called, it will fire a cross contract call to this marketplace and this is the function @@ -27,8 +20,6 @@ trait NonFungibleTokenApprovalsReceiver { //implementation of the trait #[near_bindgen] impl NonFungibleTokenApprovalsReceiver for Contract { - /// where we add the sale because we know nft owner can only call nft_approve - fn nft_on_approve( &mut self, token_id: TokenId, @@ -36,100 +27,8 @@ impl NonFungibleTokenApprovalsReceiver for Contract { approval_id: u64, msg: String, ) { - // get the contract ID which is the predecessor - let nft_contract_id = env::predecessor_account_id(); - //get the signer which is the person who initiated the transaction - let signer_id = env::signer_account_id(); - - //make sure that the signer isn't the predecessor. This is so that we're sure - //this was called via a cross-contract call - assert_ne!( - nft_contract_id, - signer_id, - "nft_on_approve should only be called via cross-contract call" - ); - //make sure the owner ID is the signer. - assert_eq!( - owner_id, - signer_id, - "owner_id should be signer_id" - ); - - //we need to enforce that the user has enough storage for 1 EXTRA sale. - - //get the storage for a sale. dot 0 converts from U128 to u128 - let storage_amount = self.storage_minimum_balance().0; - //get the total storage paid by the owner - let owner_paid_storage = self.storage_deposits.get(&signer_id).unwrap_or(0); - //get the storage required which is simply the storage for the number of sales they have + 1 - let signer_storage_required = (self.get_supply_by_owner_id(signer_id).0 + 1) as u128 * storage_amount; - - //make sure that the total paid is >= the required storage - assert!( - owner_paid_storage >= signer_storage_required, - "Insufficient storage paid: {}, for {} sales at {} rate of per sale", - owner_paid_storage, signer_storage_required / STORAGE_PER_SALE, STORAGE_PER_SALE - ); - - //if all these checks pass we can create the sale conditions object. - let SaleArgs { sale_conditions } = - //the sale conditions come from the msg field. The market assumes that the user passed - //in a proper msg. If they didn't, it panics. - near_sdk::serde_json::from_str(&msg).expect("Not valid SaleArgs"); - - //create the unique sale ID which is the contract + DELIMITER + token ID - let contract_and_token_id = format!("{}{}{}", nft_contract_id, DELIMETER, token_id); - - //insert the key value pair into the sales map. Key is the unique ID. value is the sale object - self.sales.insert( - &contract_and_token_id, - &Sale { - owner_id: owner_id.clone(), //owner of the sale / token - approval_id, //approval ID for that token that was given to the market - nft_contract_id: nft_contract_id.to_string(), //NFT contract the token was minted on - token_id: token_id.clone(), //the actual token ID - sale_conditions, //the sale conditions - }, - ); - - //Extra functionality that populates collections necessary for the view calls - - //get the sales by owner ID for the given owner. If there are none, we create a new empty set - let mut by_owner_id = self.by_owner_id.get(&owner_id).unwrap_or_else(|| { - UnorderedSet::new( - StorageKey::ByOwnerIdInner { - //we get a new unique prefix for the collection by hashing the owner - account_id_hash: hash_account_id(&owner_id), - } - .try_to_vec() - .unwrap(), - ) - }); - - //insert the unique sale ID into the set - by_owner_id.insert(&contract_and_token_id); - //insert that set back into the collection for the owner - self.by_owner_id.insert(&owner_id, &by_owner_id); - - //get the token IDs for the given nft contract ID. If there are none, we create a new empty set - let mut by_nft_contract_id = self - .by_nft_contract_id - .get(&nft_contract_id) - .unwrap_or_else(|| { - UnorderedSet::new( - StorageKey::ByNFTContractIdInner { - //we get a new unique prefix for the collection by hashing the owner - account_id_hash: hash_account_id(&nft_contract_id), - } - .try_to_vec() - .unwrap(), - ) - }); - - //insert the token ID into the set - by_nft_contract_id.insert(&token_id); - //insert the set back into the collection for the given nft contract ID - self.by_nft_contract_id - .insert(&nft_contract_id, &by_nft_contract_id); + /* + YOU CAN PUT SOME INTERNAL MARKETPLACE LOGIC HERE + */ } } diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index 0991bf0..32f0d6d 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -1,5 +1,6 @@ use crate::*; -use near_sdk::promise_result_as_success; +use near_sdk::{log, promise_result_as_success, PromiseError}; +use near_sdk::serde_json::json; //struct that holds important information about each sale on the market #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)] @@ -17,9 +18,45 @@ pub struct Sale { pub sale_conditions: SalePriceInYoctoNear, } +//The Json token is what will be returned from view calls. +#[derive(Serialize, Deserialize)] +#[serde(crate = "near_sdk::serde")] +pub struct JsonToken { + //owner of the token + pub owner_id: AccountId, +} + +//struct for keeping track of the sale conditions for a Sale +#[derive(Serialize, Deserialize)] +#[serde(crate = "near_sdk::serde")] +pub struct SaleArgs { + pub sale_conditions: SalePriceInYoctoNear, +} + #[near_bindgen] impl Contract { - + // lists a nft for sale on the market + #[payable] + pub fn list_nft_for_sale( + &mut self, + nft_contract_id: AccountId, + token_id: TokenId, + approval_id: u64, + msg: String, + ) { + let owner_id = env::predecessor_account_id(); + + let nft_token_promise = Promise::new(nft_contract_id.clone()).function_call( + "nft_token".to_owned(), json!({ "token_id": token_id }).to_string().into_bytes(), 0, Gas(10u64.pow(13)) + ); + let nft_is_approved_promise = Promise::new(nft_contract_id.clone()).function_call( + "nft_is_approved".to_owned(), json!({ "token_id": token_id, "approved_account_id": env::current_account_id(), "approval_id": approval_id }).to_string().into_bytes(), 0, Gas(10u64.pow(13)) + ); + nft_token_promise + .and(nft_is_approved_promise) + .then(Self::ext(env::current_account_id()).process_listing(owner_id.clone(), nft_contract_id, token_id, approval_id, msg)); + } + //removes a sale from the market. #[payable] pub fn remove_sale(&mut self, nft_contract_id: AccountId, token_id: String) { @@ -208,6 +245,114 @@ impl Contract { //return the price payout out price } + + #[private] + pub fn process_listing( + &mut self, + owner_id: AccountId, + nft_contract_id: AccountId, + token_id: TokenId, + approval_id: u64, + msg: String, + #[callback_result] nft_token_result: Result, + #[callback_result] nft_is_approved_result: Result, + ) { + if let Ok(result) = nft_token_result { + assert_eq!( + result.owner_id, + owner_id, + "Signer is not NFT owner", + ) + } else { + log!("nft_is_approved call failed"); + } + if let Ok(result) = nft_is_approved_result { + assert_eq!( + result, + true, + "Marketplace contract is not approved", + ) + } else { + log!("nft_is_approved call failed"); + } + + //we need to enforce that the user has enough storage for 1 EXTRA sale. + + //get the storage for a sale. dot 0 converts from U128 to u128 + let storage_amount = self.storage_minimum_balance().0; + //get the total storage paid by the owner + let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(0); + //get the storage required which is simply the storage for the number of sales they have + 1 + let signer_storage_required = (self.get_supply_by_owner_id(owner_id.clone()).0 + 1) as u128 * storage_amount; + + //make sure that the total paid is >= the required storage + assert!( + owner_paid_storage >= signer_storage_required, + "Insufficient storage paid: {}, for {} sales at {} rate of per sale", + owner_paid_storage, signer_storage_required / STORAGE_PER_SALE, STORAGE_PER_SALE + ); + + //if all these checks pass we can create the sale conditions object. + let SaleArgs { sale_conditions } = + //the sale conditions come from the msg field. The market assumes that the user passed + //in a proper msg. If they didn't, it panics. + near_sdk::serde_json::from_str(&msg).expect("Not valid SaleArgs"); + + //create the unique sale ID which is the contract + DELIMITER + token ID + let contract_and_token_id = format!("{}{}{}", nft_contract_id, DELIMETER, token_id); + + //insert the key value pair into the sales map. Key is the unique ID. value is the sale object + self.sales.insert( + &contract_and_token_id, + &Sale { + owner_id: owner_id.clone(), //owner of the sale / token + approval_id, //approval ID for that token that was given to the market + nft_contract_id: nft_contract_id.to_string(), //NFT contract the token was minted on + token_id: token_id.clone(), //the actual token ID + sale_conditions, //the sale conditions + }, + ); + + //Extra functionality that populates collections necessary for the view calls + + //get the sales by owner ID for the given owner. If there are none, we create a new empty set + let mut by_owner_id = self.by_owner_id.get(&owner_id).unwrap_or_else(|| { + UnorderedSet::new( + StorageKey::ByOwnerIdInner { + //we get a new unique prefix for the collection by hashing the owner + account_id_hash: hash_account_id(&owner_id), + } + .try_to_vec() + .unwrap(), + ) + }); + + //insert the unique sale ID into the set + by_owner_id.insert(&contract_and_token_id); + //insert that set back into the collection for the owner + self.by_owner_id.insert(&owner_id, &by_owner_id); + + //get the token IDs for the given nft contract ID. If there are none, we create a new empty set + let mut by_nft_contract_id = self + .by_nft_contract_id + .get(&nft_contract_id) + .unwrap_or_else(|| { + UnorderedSet::new( + StorageKey::ByNFTContractIdInner { + //we get a new unique prefix for the collection by hashing the owner + account_id_hash: hash_account_id(&nft_contract_id), + } + .try_to_vec() + .unwrap(), + ) + }); + + //insert the token ID into the set + by_nft_contract_id.insert(&token_id); + //insert the set back into the collection for the given nft contract ID + self.by_nft_contract_id + .insert(&nft_contract_id, &by_nft_contract_id); + } } //this is the cross contract call that we call on our own contract. @@ -223,4 +368,4 @@ trait ExtSelf { buyer_id: AccountId, price: U128, ) -> Promise; -} +} \ No newline at end of file diff --git a/out/main.wasm b/out/main.wasm index 7af01f8faa5268cafbc50df350dad0fa8190a575..7a912b83773dd88bfe0bf617fe036eba060e7fae 100755 GIT binary patch delta 34613 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 delta 35158 zcmd6Q2Ygh;_wUZkCYuJ?kOWf6CbZBAB_JhmK`BZVQAAV_5Qs=eMUaFdK{{Mu=mMf3 zH4tD?T2Q13f>MxkD6`8f?D9s)ve{Y6JCx5epiIU0#L z5v_lQWLO#fxZ@elYVU{U-ZQ_5a*&tKVmS zTm07e?ehD=Z>QfXzmNQn`z`ZZ;=j^wggW4>dS zBioVV*yvd0*x)!CaL}>caon-n@wH>0W2fT_#}3CX$2rGd$5zKS#}>zDj#G})jy;a= z9Y54`eC7DuamjJZaocghanW(v@w;Pcz?6Uw1Lg%R3YZwMBj69mq<}k);{l5UmISN~ z2wJl%ba&3qkRgo!nWfh$`bxl`S(%wOTW~%3Fn~qt?xM%SOh`G#GF&znbFS7Ggl^=& zW$6{eO6mihZan5x40AAcSI_>bqW(&;R{FMUL;38{`nsPg=xxIb_<^x{>xkOX2gic6 zizjnuqJyG{BtMtGOE~lOg%K~XgZiC_g@igQ@)!1Oobi>rE2F^jDG#%Xymg^xtpFjp^G_D{Wc=`j6btkIkzVElmM5A0vmi^nB{vxadc@%u_# z6Lv}0Dn#g;;_B;H%Y^A=N)|Hb5!}tk1XoLMd&I6^OlYphmJ8E|B$ZTxBRM6Ta{5VM znzUYTl^mw0xe7^Uait}0m7L=2dCcs?L#|Tn+VrXsx+Af^{%ZL!{oT@qMRP3? z|C+P1bQ)tn=uakA^>nhQ1MchZCst5|jSh&^w^k0&e@-mR9$1}lrDB*~v2r2hOlC6m zn_e^CC<~@+CR4NHE3#W)YI>FWdQ9bN>{q>1e4^f`a*V~jfk^dK)xV5yr`N9%rZ1_G z0K_jU+}3N?2!&2osXE+|I|f4_xRjof5~J@;iDH}e&edwMFZGHkP1sj@RJEEpVb$v~ znNpuc>Z7Xl(j!wMi|2vxejL`?;Am=b!qXnr%GK@wGae&$slHnl83RU$miw%&jH@ z^gcBr*h76}ji!2TO@H>M{!NX}jth!}Le&@5az*^1Mkq#qG7q4i5a*q-x;7|0=W?wi z7V-N(o;GI(92g3*Dtgl%r59JwyDql(r2}) zjNe^t2HJlkl=B@U^vT~9)!%6K7Q3zIw|asV=y9zpI0`bsN(k4xwhq_3w0=>}$>$+C zjoY5#EHB5^K7{cZbMz|D4XU`!w6DTthvl|w6SE)+rv-Ju*7~Qrf?WP@IP>%a&&_U{ zM@w02LI-GL=IqS0rB}Au>e><%%>I@)tfb3w{nAL@=S&zHrd@~~rRedY6=bl$NqTcr=^ zSdz`rr{dYjS^h#N{XwTp{iRNc3bKmb(;J;CqksEiZGHZ!5Iv$(3VWdEo{RKgl-3t_ z>ZJRsjw_3_oT~+Po#CWV9oBbJFgkf(;4&A*G-Smt91?HIV1J@U2C%)`rxiF=+2j4jCGGh z0j2bbLa9CMpDSI<0Wg9Lj4R!_Ss(FQdHwp!vx-=C1yEi3lvgxZ zlW$+C&9>{Y-N>?}c59};@#?cC*Pnyy@^&v~nkX)^|K}WR1qa<9t1CIDeve4b?(5I? z?9T6I>6?4rh1AydD#Je?n{%?)LY{H*3$)bc+)Qc{9HOj|^J{8;a4{sbGdpw9_aV+4 zYBA*l=v+cFv=S@46CYU#7&YfEMaHE0Z6VD?UlGj+MYE!((j$ckBXazi23Mhkg~Hu9^MzqUT!luO}zW=T-H6eH*fI^8S2Y zov?!EP+hiQZ!#Z+nZQWpAZZMPWpe+f(BxzNHSW&RqXzUwuZvMj2dxc#WI)gL(ozw1Z##c$%M=IoT7 zKB^6=+?G+#pmfo!@Eh0h%)`{r<$o;p6> zIoIe&CH<4+26P)=3Y8fM%g6VEK7>se7+`ko({g8mh|oWr;DYaxJKs3*4 z{EWWke<97H$%ktJm{v8L)3X2xNVFT46jUM54KtdtT)kjM8ULN5P$pO&E+tCoPtRQL zrwp_l`6(|BO)NUA1DhqgtmLCZO~V};>{KRJw!OwnXI55+WL~}z}~&2 zGGYI|q!bd-AGPH-N6W<-ELI=;Q3ZBWU-wZJ^&76=`Y4wDf^@i^v@{kjVcJp`eqU9; znd*1(QdiQiqe*J$hh9k`jd{BwaH7hK{)yzdUxC}poJ2BQzXKA+Q<;zB*)KUwKK{zi z4(Wj_Qo%)|6%~l3^YbJ0%oXAOhAGf@ydIgeW(B9Aw{GQ1Yeqs{ki2#QI-ApXRU*@? zEvUi1)w?gCw#fywfZ4XdMdZ#cNI@cOVLNt2@3t@vze^TY!|xIN-qh_M(r>K~Q}EmK z!|G`1+z-z{e(x;0%=AHXQh@mJoF<@?b8XHz#(&L{C)V;*c$X{Zr9=IT&);XTT-J+S ze{#C=YJzdy_oN;@KDks-@AOeFqXU*P$49-g8e!^?EzYX+M?(YGe{BwVp zH(uET*tmJ9S2$P_!f$bK4W92FOn`1geG|*{ki*ZhYkJqif9Zq2YtOFhd%wF2LOYLi zWT*9*qiyvXhn{D%_3?*B<-GbW_LLSMUjp8W9LvHuP5Zv7e(G4~&<{v8lUNZosGSq_ zrpN!(^^-N>q-w{iCM4Q;BaC+D^hFy>g%Vk?zVP_R{LU!7=&|bho|DyrJUbQZ^mQl7 z756PP-YQh|REp{B)i_(5-yfy-Is1g^>-9et7x*=~wrYk<`+g3e4d3}pq#k-9P(O9H zOUiVUU1eNm93;#Tm(4lZ(+aLFvY@n_pRD&em&T^+E6-KXbAM>ZF3YeXJVF2C`+6zf zWo~RIN&zmLcAKG)7qtt@OF@ovs?2zcNBS)X!c6_WAEMa=x$Z4qUJpA}MKz~0{QU)| z>Y6S2`BX19S%3btRr!w74Wc#~`lv;v8y3`DOWo5W&h+4!qxE5DNDdp%RA6)Uouf+V z&dVu!`>T;rqm|@1SyTZ=#u&+9m%gr8S-o}MySnpIDRgPgOJ!LdjQtLJgQxRY$&+vfj?QR9*19 zOvnLt>^Hu8-cP@pHI2G0>-)|(2M@*a)7UV5z_n-eyo+{y?N61k zD`nJ%_R+4?y-RJWsq|>&OjAidR}hPFdhrVlVy$i_Lw0Nz^$oFe+LrE|uJ^qV{j_)f zMU@{!eTV#!UVZnA%JGNDvb>zM(15;J=XV-QawcP09)miGwKc(e7fTA2xKH9u8XQD}Sn{#BFl&O0l7O z$7?;<@7OGCSNzmi^s2db^Q`Lg^b*&{hx|s}#-+Qd)1OW8HMHs1&0r}=5CKFQ7SBJHpFYg>Jg z9GXKr-~;);%}_>R%S?{`hYbB6$|J)g*#9ThJ3Cwb`oCBG@i){AX+_Y!O+i&>})gdg^T zG4T9d#a!Xqs?~(JSyuLA@ob@d#*ft@qVM}*?SOch8SgXWpUk+3zmZ?npT$2W>G`XS z$_)uxlHTeA{r^bPGRVQ6k2N)wH^MeuXnInh%fAICRl6(Dc|{I$uy~TjTnFpM*2%vd ztTtOKQv=wGY>u27z@A5RIRM@B`B>=+WT$1>GAxfhl+&VEB^elu*=0jn=9I(3SwJH< z^#M)Sm?2Fc#c9Bpf*sxi;c3ApjDsJ-Jf)!FfXa|^>^GTOv9N+gMNq-6N-R0Uo3=Uo z`q0i(GpL_MTTwP=VH2j-jG8(BnlQVON4JHD+=vwh}GzzTiabpRU6qyeCd_VfvQj}6C*Raz{>-PNZxk~+I?AVy z{{<5!@j^C?KF%&t*vgM1K|3v)If6`&mxR$KnytbjgVb!b93RZWqs-Qu1UD(Uk%Z;O zV0Km(1QrrZj%5>FzP#DYV!1o1>C~%k6x(jrP>F4li;J*HvR^$GP{~`&zM^7}iArXN zvn%qia)p(TaiKL6%d?WNd(%0p*tNRB=q}TvGP?mQLX3s8K6plVnXZ+IXJ~ApGD&9z z7J=P5ci9Te$)vYn>y+Dv>^+WEgG^g%4jWLtIvw_BSNOs0K#95SzVd?EDMpD8h+X~0hdUA zCx36olH`W=>?xVnnst!bEtu1N?rEkockYv{A7h7QwWchV<;#{$Sv_}x#s)ApTTW}t z+Pep~WP=#{Szck2ZvDYMJItyvlO+Jt84cyj{vpcZ{_8Xkr^{z)E<&93PsBF}kg<_XXw(HDxvNf`8XI4_C zyv!y)0t>+T5|)ogM#(2$W^L_Xc+rR_)FLmjwJ5&rCDu8_X>;M9=F$S3w`93jSqs_v zRTe4(US;93|EugNw${DrRknl6YJJhS6JBE-*bnmjYb+h?r}Sm5WR-64;?5Y)4STa_ z8Q+~b*nU~2I~trXJ9K9$?5ND@&Z@9{_onXb6q9fCWLsp*o-9Eg?ayN6s@K^fxu-kY z@?UyslC|`bWSV#^kKEwLidtBY%;_A0v6tc0sXKqs|c*G`?6(r z8YF`Uu}*}2co3Tn?B0V}8dEKBZyUmJ4*QM#>>aS3FHgLKCeD%ZLs@BdOg0|M>L4|2 zD0|!Q(~&e{vfpKqGUQ!WLe3n10~@3P6V>~Q9i58s29 ze&-%Ef)!z`y`ECLxa`t}+1=W3wvf5o|H+DB@72Bi9($It&t%vGR*D^$XCAV;5K#XI zEYsssTmEaF8MKN;LXx5z_a6cH0(MIH=-e=7aySu*6vY53}cKK_x zM{p@q-ps+!O3h+hLNC#dzJ{O7cM=0!K{Bi;j|j02QT(;*HkneCmy~Ja*f4kMRP;Ew z=`jtueOaFKL@qgWI(t!epN3I;V;W4zEhO0m*-FPPuQTp)Gr%_6DPNq)MxbX;&SdX{ z?^kB2=mJGYWx8a;peL6kn*@}>v)L}t1#9eTMb!Gq9v2w^wR_d|bn`XDm z?3-+YsW+ERy;?*mMNcz=Ht*u)nd6z=121vt>?}$ zh0n+7`4Zs_#h70a%iAJ)U_>qBRBC|{-Js}3WW~k%Z5(=Hbmxj@^&x{fnod|4=HRq2NdxSDMF-f zqNWRSPBH#5RwWI?c}+BFaJXvHrf@z2O{x{azh?*Bp^?19e;AF!i*q`(buTW?8&iWW zl<;YgQBBDxj$3nv+6;?=+MNA@g)_f=a;xOl{j7=%9uFg%wu>dBAw74ob1X+T`-)Wt zQ$xPOM08YE+6{znzG5#!=6JqNT^qB9m7%(|J-GEtfM$Eyso+B6lx*16XZEoUkC=pg zJ|e~#^f0)2gsjbumN06kOZy zXIn|i%P%l*wOIr!e8ruAfdy0Mjf<=}#!lj0R+5BL=8~oHY3|R)Vg3Tc$39>g>_^#Q zJO)(0%o@+?A^LJW8;z*h1XjsXzM`aj{vjbsV^GO0Ibj0Zz;?(+6InGhW57h!jGT#J z_gh(O5-Se^uTEkO5q&s`%|ldgGAs9(xwd9$`R-(<&ip@|jE3dQ&Qlm}5X!76KFy;^ z=9b(!h2eZv&fUnKkd>#hK=l~JG3^s`LL&)GYWxN{2%9+Km?Fq~S;^;@8C`7&<{>x`a3UW9D7l?`U6=W*b`uT9vl5MAbKKb}$;!vOf+nkzFB|Z6q?eK24bFm+rhKV|Fs!Ly=>4 zGPfmR4DSGIcpFI6Z(bh4O@CSS5=*cj#eu$IwiX4s|2T}10!ps$U?wk9R88*vjx~eU zIgj94_cnR|2%Ny&jz>`?W3#o`Et{KNa(bz_%-VY6FKHjJOw?Qhs&Vxh$$mgG^6T(#MosCkrQ^dWYYu=*Z`AG!QvNPm$` z`-DxDTbIKT`r#ASm!68rPRm%j=P6PCv5d9AxYL%S>s3@;{<7QxRhMskiswu2jh`|c zow#M(N@(kG*?A?r+M}}38aS^FR$=kDeI@#;5YXT2*&+9@LgoR&j+1Ry7d{{NJijkj zuY&h~Xf<=V^VhIDO5#6cvy*7hvJLAPhwwJ$s42>wpM#!5x&l<&tLNu)vR?^u@Zw#-mYs9=N#&b~zc3+^J|Qw%*Hn7S=plne5dpB!xmg^!=G%yXTmo0eHvVx zb*DeWap&`HmVBorpMZUIdn?`r8*C4;pjb>)S*2KIfEU)JeMoOU*c(Q_A0-gQsy& z4(tHG<)AF}JpUzT3QeHub^+H4&)9LWI7L=^fk(x>@0D+EnSdJ3?Wd@NRGIYx-&Wi> zkHoD_5~Q7c441!ilkC)yH(?*R7k1>cl*m#$@y=u|W_04aX&L!aXLv;)xIgO*=M)n8 z<7K`Rw)C@Cc)b$ll_yk%qg?!E<9;mmuE(5yqjqtg) zcO{_vURPd)$zOW&Kv}IDujw#p$px9bmE7D7(%&SzcITZTxb59}CZdKt;3aR7Q+vQY zUm~A;9n`*+_g_a>%yHN3NuKnVvTrZ+@Ep0a7oQBAy1jw3L*DGIYOI(J`G;Fx109Kn zq-#fUw?~e9gZF@_Z@dBTXof7+hhN0efjj6;ju&}0$fUl!5$RI*zI-bLkk}6%_CYzi zpVEPC{di+`W>$aI<1)HG-;WNz(4X&!x=WjiII^;=T`rv&UML{TRe(Qk)Rc6S1N@28c{Kmyb73G|GipmEYzoDgNPY z-X4Rc$~(LkR@a_sMtoO={l0cS+aX?+)YGUfL(+aMfYo z4d>MvTq(a1{1$TWjo=k%^Qm+u?*dg0qagWwS$;H64l}%NmqR-VbYe!nHk#KYerJ#74JbY_nvX$$cOJt_qMl)6 zRDW+A!@E^9#=L`kYZ~+1sQ|dw`vu*;OJpWhJ2kP%`#b?gz};;u?+9D#-a3v}7t3Yb zc)kamT^P?Vzz5zpfj=E>siuE2@0^G?i?j`p6C>6tO~mTrh|HSEzeV)oB(9DcvnGL2 zDCX`-{6#SAPMpl0xHToKPvLDm!~&D~bKodY5%VKrbEoi^K;_O9eic#PRD)R2X$G-Y z(_ku3$Tic{K>BGKpDmlbj;UwCbY2Z7UEfT{s^fdvR9D%fb^bG3DhJHq&mnL34BkPu znaTa6YbLLXf)KWC!Fr)2&t*oadyP{R72k|`4Ee#+fL;!J^k zCCARj%4Cl8o5Ob@bN?KUt9J6{9F7}^vg}-#fjRQ+xx6F1pu=-{vY&c~O4mxn|J@5x z^2vETIpCf#8e7tRkyyEY9keaP#1fxGrX-cy85 zCm2l3u2Z?7KV7a~%)esO-Gi3!0LG@dhkt}+9$DO_=nX6vmh#tQCXD>$=V{Y_JO7)l zw!qbw#uM+(xVUZFgpcQE$i5%*81ll#f6Q0VR%q%c{1=MLE#tL(ZnqX3M|E_&RSsCj zTc8uREaP>}tE-Lj#)2o!7F?OcdKh<~oF7u_lUQR+l$p-j0zy@y!4{f%5!=OrhcdhI zZr&dG`f{FyRn3j%SbZOql|SXN=6iPnJ%MYlcp(mN&d`|%{DZEaVp&fYTdPJD!{wC| zU!d0*B)O2dfKUOF=RW0wK&kx-s92uNTES^8DRJAgRSDxhtx4EJHeXiznU|AKtb~Rd z*JXpfuFJ|BEBO-RYV0zJ#L3h^;{60s4&TecS zEtDtSYHz?@;O3+JKpLH{x<%@NyKl{etIGTv^=xaj69=Mrc%Y5 zXNgvv<_ooOujhN?TF_l)z3zIu_$uW;U;T>bKE~ei^G0F0b2q2UpDHeCv12u2uZgAD z*-o#n#JWrG;cMC7*@g&pTf2a`(zvsLY(#KBz1{I>IcOhlOy|h)`*`_)&D6<>wqU(~ zpIXtgy~g2JUeEhvqcc2$ZI>zg;X50b<11MgH$3gBq2xmmSSRsSH;lE&)@cuWvbl5UdY?og$Po|$r&TLur z5Wijsb`iKVz?Ba38-?H~0>=Sd@mp`OlfV(qY{?E{I`VzuiYNKL9f4oC$a5JBScZ{pA1)#DvEZN3R{4>^XNPEw(- zj>B2`RJu;^on5S#WAJ93Hvf`$+3X8Q!BDJHP|NixipgQCHy*uTtsU@z6anP436WTL zdGr-;+zG9~8&|VxnSYt;wrqt3-Rc7+Z9lCb)-^eTT=#)6S5d9t5lCQVZQ>R0rqLbA z`MwbNU#m=rWZ(0yB&Y7*^Hj$w8qdzva`E>(DSWva+{^_BFo1qSoNMH9WMEx-?|c3_ zW{)mEVC}p@)<4C!!>m6z#p@udc^Xr~2AO@Dr&hM!wc(n0E4c8Dtc^rDnBIBCN}GOg z>BqTUhM(b;lGHn3!3j3r$YoR4m)p@g9CNhkd3-ijzUC6!llI<1BemVMaKdW=Q*Tr1 zCjC0iRSYkD&!nn+_8L!QTV?J~JXwa96Q9IxCl;`h!i_Fis3d_({K*mU!)oVfIZ=gg z8!PR}qAkOAWwIzG2UQRe{u*`yoJVE-b3F0y?6=H1$1BHuX;3Cx7N8c%uqE{N0^S+i zCJ&$EC*r;`G3*uwy|>Rvw}A0w9-kexhcF7IlO*7I!^6mzeM*X|{+B5?Snfy=N&Mr+f+`kXX9> z#Io_m749lwX^#0Gn6eSfd0v*e%FAN|ugz8dREeKeMQDckqQ#F!TJJKmVwjOfI;z}q zFmd@RwkMTKZrFgUh7Fj14I|>J{P`MB<=4i_ywYN}U`~~}!SJS|18@x-%dLTT6e*v|q47+AI710vBDS%EdrOEG7!PnV4;t>n^cUvj0ywo^O4Vr(~$kSMPb) zX}Nxgh8L1ddpHdhYEg!ED2SX+kXSFsdId3G&Q&-E6eQXU=c0m`Zw)J)Ulk-=;ba(< zjnRp;0Wu&`L5g}2`uH(Oj)HiT-tidD!N(w{6vV76LveINfxO!>ZU!-w=2iV}1u@=K zHdy>YL27#8OrA-lDtSRZSCG{5v@VrE=+2v~5UWyG|8F3#=unPu*aB~u))il-NK7YcI zr%d8DIrBbt#+J%o@AK%gUn@+GE&0Z{Nltxx(CGh4c!Uj$p#GP#+5=vxxY_??*_n2e z_`~((969g-e=B6`-&mb;1-zl7U>>z&r+l-3w{=>=nP{3Cd9Z-TdZ6kmWlxE{`+$>!26NzEPAxheuHQsZJs6H5R-)Jl*BVk?Yx;4K93RY<`HLEht{Qmlms2WkvC zR9Z#tz=y_Ql8uCj2{$|z)j4XH4R58(H-+dJXO!e{y`Xe-L1bKlxU&+tMH zKo;{X$^IEXv6Y|xPzL(Lj^cu_zo_z}HITNdimYWNmI7F4Xsf(y_ZXDOO|f#N7&c*dZchF$eg*EmIt#JkAeZa){^uUhTCaQ2Ub( z@f5I128iZ=i=_|P8!jgWh%UHzeIr0L3_HD;?8`a&b%|K*$Hg)&P?U1!Eg^8CwwGd< zJUJjxv~*7Wh@f%W=KCh}V4!GF_9msY(%MNAiWXpfKXoZVLBYbU79`@$!&iZ>blDrj zA6191U4uk5+ywtF#1;~IXV?#9=bCg7(Dpa<^#pn z7}jp@xyZCwbfM**WbiF~Suew=NwYPlx@4nZQPG*Jcu&wy{%N*zSTH^{v-E*n5G*>C zTS_$>%LnGNX$fy>0*hPC63!K?P{|O{iwcbk5fv!j5F!#OK7qKB7ZLK|JemNp!x0xk|4N7JFzFSpH# zWaXmbTB)g@P@7yuTz+r3iZ~}zC!}iyfN&@*memgDG+8%PG;~_U7kzAs=7UgClHWWm zKMfVJk*eSu+Mm7!zYi6?GOU6(Nw%H|*Mer6=Zm@m8}l(>WeTyfIw{~e^iEM% zzX^f=pU#NaSd zKK#lrM>h^zxTlMW z7WFLLo8Gu+ydRX2x*|O(*j1$YAo38V$2xwZFLS2RnC}ZUS-$Q?L6#~Z zY6Z+DCTzj=^{`8ka!3gg8hx5dVkV?bDeNxWoM#M_RDEY$asAyTMU!0cy6qS&FvHTw zGd4C<8N6KNG&VLO)M1P|Nz-l;QRGaJ!BHZny>Zw}3l+61^aZsW-PB@#i=Eybbh{EIdh9?Ra z6bUEXF_$^&X^{`ZLGQa;K4}7Mx?$RZ>Ibg9Q|#sb8owz-g+QgiD5M;fa9 z-p2|a`0oXkf9xrkp_x_Y{r8f}k@l3d3f}$i1(n17Siy0l(G`$C^~FE6QaR?2m7GB( z|8qe&%6}u*MUNHCcucUk#rZcSH#}DIv4Sure^cBr{O6KXkiJ*) zxb_tMhk~*zzJ!cZPn;w~%BgXpe#n?HN|+d3+F5xrPLzq8PexF^@5n1-4F-d!O(Z0o zpXSKuc(}YdvPrxchU;HDjMUY5ky86}vZ=;L@FpvC;cWt^`GCCk)aCXBI8dALvAUV1 zBFw$YI%Kv(oU4hEr0HQL!m%6y8<-%L5*f9JF8fyyC89J2YrdKAf{o4Xwd%Q+-sY{? zAf{!Imt}LVm0u=`%51azHBr=*qd&!_hT6U?^)KcJwM$;Tgh-ULlSO-+cU(^vwfJ^? z#g6W89HmB+MFSf?_cvsh@`7H^xlvv;dctg$@gXj3SPRXSZte)HP5J_A6(|^+^qfBN zr@@HbJt2Em5WP|7w-v+*zCTNzZX~+moxe0q#NkH3OPYw4PgW8ipq_6Vh(>{)dSr>p zA|*DLWT9r=M5q{9MQo0fA;DHux60xL%xzmLV-o6wQC$VIUDbBPR?^Blt zJ2z4bp&S9}&X45$DiFa5d9#X$cj?GawShiuIorzH#uA{m0wDF*bXmEocoH{!2UZoe zadx$$sz_t+%d1sITrt8-$Be6NCkSkwAxl&fWr3AeO~m4ay;C(&zqr{N^Baoas*YW5 z$BShV^gY%}&rcu*xfg?)R3O^7v!`qGDdEH=vP=vWfRgLl!co^M4^DWxmhFWD$Amt8 z_b(flks=bJ6)7Ajc_H-)wPMimCHnG;Dgn+(yA4YAbG1zm=R7GXIw zt(5BYg#9U5Q#j)3LJwUFCYQ$AhXVn!M<*xB#x+F^$0Xtw#~H(GiaKu+zV;A* zjsYm<{F2lHi;7?xFc&B@QQ%A$^NLEiL=ijX-1aJl6$l_V6)rN#pHm5fUbiT?pq$rF z$i!MAHiPOn{E5RfPz~nLkylK{zyXeS6eo#TC;Us=pycwiIQQny(=4npu;)-W)OLlq zLJKw2ec^=MUrTfkRra)^c31I$1#W z>WGTXh{Ys_+B#H?;f*+UFVzyB237&(1qK=G~L$X_n>uMn>b%T*LPV99sDdn*3l|Dzn$PBRR|aDSGE+6>L4)dw zuCCcYF*Ine@kr_o4Z2M!Qtc&mMN*V0cQqwUoP!*5N|0|>5M_(1mBbhVtBZMRez~gV z7caYixt{2NZfsCr;Dk;NtuI!UqY_j%&N_@oCmvDvX-c7P)w(=Gc#Ld7WK{KX66-@iL(x>GCT&O3J#OdlC|rKWpLT2rAWpt)|oBECW~|T zv#rED*2ZiU3Suwl@>O~t?o^59qpWZpQkej7M2`EqI-aSas?Yb%-{+JPwi zoDvA$nz)Gz`ZjGo!`;)!cH)_YQC7xMTq9>rPjauix;;u}v=fnRl$_a4xN1Kng^B?Y z1J{!@aE&CLA=$O-@Wg^JkBI@!hgtG^J4~+m(*IeJm$8sKAx>LFv1e;0TS4Qs!#>bF z6Su$zx@!?pNYx4`_E0GJkf61-4L;C`3R+p)O0mLqlB7dDQhbo*9@1XqvS_of3@J0O ze3|{cctU>tx(IYn?I0YFU`BXhx`EkkJ{>i&xc7t>AC*68|Nh^B?gt4Ar+P_7F7|%2){nXn{Hk`BXgi>X`ArhktN36=k z9Y1Tte*T8Q7c|@_-w-tzo97OBQ=Dej(4Dy08cY~Vnl*Ii`#`OsyUGV@4c+-myeU{i zccM2GcKZ=)sMX9-lEFn!CDVV_t}w5n?s@&hjz*d;zMPre6}BQ@4}E`coH~K-A+EtF{u5t`F?a#M{knRpqA4H zipFe|`{+P1gtK$*r-z7=ei=$CmRdhHj$8>|4KUP%u8bC_Ql_H+AC28tf*-Hq9|%6i z+`qshnZD<1Q47gnK0Gx{{A$hG?jytD(qXWaA0g_NGG?h@^Dc#}IMxsJSpnJ_*=ov6 zjvXON8Kc$`pm%>3itB(WE_rl>NOhPAcUXql#_(p{p-hp9sO?BGge`IJ9x1{+`klGj zTRScNp6Ua&^m~yH)Y9+MYrH8~`hCC$YE4bq9tss`IOS4OtE}DhfC+j_`Ihn82IVGU zIg~jX?%Q8R9Ql{wWW@-7-1UTJe<**52c*Iy5VB}GO&0Pus8WcQHl=9?|b{w^G8c!78 zL!06ziMohhm?WB3Uq@6uE)_i63kul_(hB||oNVp3nIR8N5;<(W96cF+?s~a-vcR`* zWs@m5EH<08SrIi&khYgnT7q`P2YOdQleGEkjbUXb-HUIgT5*DcZ7&V~ZzC-B#2dJ9y?mPPb8pBO5PJ80CGFZL=1dR3G z$+>d!3=wT??I|x?T_GGV-801d*x94yKn-&dmWZZfrK;spagAnTLKhnpaef`b$| z!lIQqTU07`2!-f4mz&4ApC6LjXNwpApL0+>5z9!X1!>EPLr>p(LuA}s>|h?2FU=L5 z5N(<(%7lGG$d;YJAUiCt&&5*au#B81TI1d2?(;-dhlwQT&J#OhzC;PFlD23U#k&~3 zNJh13L7KpLj;U@4+w+vc@`}A)4 z(js`)ZaIGu+!41tyhwB{zSz`JKUzlSDtzu-ESoLHMvq&jFGhg_a^+&t6{#XiMC|}m zSNh0bXNVGVesd8l`!2!SW}_UlL{zrkcE$z(#;4l)z=kqLqTIJcQ~=WLCE_JSZ9f9x z33A#;A_}P$ABm@t`u!ttxluMh1os~>DAGO=@1b>DKM^e{8MF*{S|+&bEfaa_ za}l44Dac**DULGSGI<5=ce!P&6{3$J+&|qicLlC~xn;mgCDr;X#UP}zSBlvk6 z7CYqY<=wT|WubX2F$8DySixZ1Z8oiBHmsLbvmwXz^4)CF8Jp-QvPDHUT8eezMcj&d zd7UagbDc=3OC(eI3@SA>AU&}NU8Ucw>M5h;QS4a{vPAm7W09{$$nN#C*28XoDjTd9 zYf#bk^|)&=*Ig$EvqZ7=q)CZ>vNST`#E+1Hp_R7)S}NtbEK|*j`@4DjNT%umH&+TCQh6ExtFw}G1K5i zsf#ww5UUwywH&xbv}9-Hjx9K|I4e(W!J*7qdDn;{w~Fl8vm`i|y*$pYZNt&Ni@1Y> z|05Z`fwNNPZN)*_IT^G~)Goxs*m@MN^EOc~-rAgS*_LV52G+Ip!2KDVjnb3@Q7_si zBJf4SjoZZAa6&3?7nkt4kcb^ZL-hO(=*T*my+hnYv^ZD15Q}MQRphFE6^3>l(NxYXro(B*o%(90NN`y z;7)DVeWC|sxMv^wV}rc94 zBe;*VO-??7E%OQL4Ap(+2)^OP^4!;tiAf?OmpHTdCB@$511SQ?QU$SmEBYGK1_iNR z9i>reKrEaQ;GBpjSh;hem4Q-5&OIl}bvEY}Xe+)| z_64zMwpE)%ey>&$y=ARcssEr<^j??If7EyI+aMJSLSCOW1`o*iJh3yHCRK|lE@|1d z%?g5zhClMeJE2A`+HwVi_dMdfSnxj+hPz`v%%bO}q)UCKrg4zEDH(G?EX26~?1DH0 z^_Lfw9s2yD=z>)2B}|Q*Wz$Qdys~#_iNI%Xa933;=dzQi$6OL^f|T=`C}0caqNSp^ zymd)5{3i#s`DO9)Kjm$?{HXJ4_jX?8t;?cT)N&Fm4MSxgAmWpWE z_lkJ(KMBa!omSfN%a#A3f=&KU75t4lcD^QVgnK*%f6`a_pExRIjc}qpK7P6!`IGqd ze}Mk!bxaNixlIb`*j^PrN^PR;^m{VFQE>;Ejiw&N360l$e|>__*( z-(af{@41b+%lW;+h20@t=FT5v+#S$9BOBj=mBq{czlk`h-w{oUoZt*RXXe_1kDlPN z>s`^@UGWdNB=`>Vmb+pm#qI73JtC?`)j+iW)OE+}f( zql+}fGyO4yW^#VAy&-EZPbb?;vF4k~+gCc|k8j(XJ6k9m1M6u#%boW{9XaS7dsGou zU8k)LKz9&gX5AABty<$L1i_9#Io|2ECTu=RwZrqX2<;K*`8fn{+zv=TkFQ?Z8#-UW zBmEJV9TANB*VeQL$w>twh}Wqn-%GK-Qhi1}gPEfKHd_SnywizZY3|9FMXK9h;ic=l z->hzbjfK74z-fC0h$j)KGMhYI!~QDKZ&1@-op(%=18UlzEjA|2X={nxL%<0{Jfoib zSWSCq5Tt%F&EA*CJo${%hB|CdBMw0PEaD)>4Lliz`=&Q?KEQIweOHVeP%az z+Ir&ocL1UhTj@WLPAp8nWP1Prb&`c(d!;$jUIpltPaC#SJouqVSMo{=q)8I9 zo4b2Aw!h6X9?`oQtqi?ejCxA~&q^;vI?^k>{E_r-q{F@PN#bc<>93Kl;gvpyH14U| zx>yxZLsS=;41^$!MWly;vPgSZfV*@`Fjo0Aq|12WH$j>tD+kQ9yX3hi?RicM^%G&U z;U!cXUU{%rb3c5_UXg{Ts^QnI-#GLfrM9v`GkXp`7XE89`)e7i+Bt16qs%7= zVF*@w_ao`|9!W2LB)t&nh6q;qM986tSGqLPBnB)0GMDA%kveh7aU4D4D`-4Gt ze3LF!t{ZHRDb{C%)7BgLG&qRgJ|pCr!S+{?-C&44ChV@6O=F12+?BnC*t=vHO!Obv zWANaiRp0DKrmb3)YPK;MPFr_iQKdAxtTZu}=#@^#a}}@jU_2*yrC-ByoL8DG5jD!9 zr;)iLgjW%WH8OQw5V|6G!-!Bf1Y*h?-b0Ri%U&@fC)26uZbb}n!wL-U(X+=uR~I}V zekAWv3veCzH2STw-FkH$*tOeWRXSv(VO6ZWLDW$_F(m=+K$%Zb76Q+(4e8r^uwip- zwnoULUTD*QaPNM74d`=#k(KD%!QVr5SGMec! z`yG3G-gcDRZ>arUQLHVH=+8OU5NGUIIc>PTLWP=0lg(;@Sm|u<*9LYSIJD}Z!QItp z@7kwNziv>;USs9O;r7OCs!V>*UMlPW&`D{s5J;O2xI4dRZzwXBqngbK`w&hc{DklT zq3CG5@r_U!p&mk8gw6;(5r!j7Ls*2c24N?{WrTz=PFo#>HV7{vbVulmFalvF!Wx9F z2>TGuAY2^dOtRVDM`Z{l5o#i|KzI%z9pP;RoY9Q5FU#nXg&~gc4#Ecrvk{gde1@xdwNA4I0#~YyYm@dJi7z>i1TUffzn- zm!2p;9)(%F`9%5sDEljcxf8)4I%278G}`_KuQo}p9&Jw#n>xvD-rV&%RIOg}H|ohE%N z|31>BPDf?ivG!)Tjx`%mhL!sca=c3i!C-i&gC9wUJdz%ObZMe)w&E?M$*r=|qmjmq zOi#K8(%>e^19%1i=!z#@6lukPJ2T7P-mgWYSx#kCX{MslVWmICGvQh36_2D>K9XKT zLQIhLCfTEkS!LFGaAc23_6pT4coFbGL&-`vdL+HNu-wi`_D;OfEEzx9Ufo0YjM)aj zyH2*JK5Nmb!Hvn#O5+NfPd$AeN&kp+YcD>2LHcQxmRC_9z8V=f#a<%@kMI!Te*qj-O1c05 diff --git a/out/market.wasm b/out/market.wasm index a73525289993b2035fe0e053853eb605a128812a..78ce9ad1879f72e53bafc28b34e2f8e077827e40 100755 GIT binary patch literal 260117 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ÇI!qs!U2tan}eq_|Up+H&m{^`6Kj79;o=>40> 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 AO8@`> delta 80266 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 SMtNPzEVvrDzrlS5_kREj|2|>> diff --git a/out/series.wasm b/out/series.wasm index 2970c565694a40a98989d3cb7b87de2dd221a5a0..4a83f38f0ea6d97785bd9c729106cb70f447d0d4 100755 GIT binary patch delta 37907 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 Date: Wed, 20 Mar 2024 16:29:10 +0100 Subject: [PATCH 04/28] fix deriving borsh --- nft-contract/Cargo.toml | 14 ++++++++++---- nft-contract/src/lib.rs | 4 +++- nft-contract/src/metadata.rs | 3 +++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/nft-contract/Cargo.toml b/nft-contract/Cargo.toml index 17c1958..17e4525 100644 --- a/nft-contract/Cargo.toml +++ b/nft-contract/Cargo.toml @@ -8,16 +8,22 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = "4.1.1" +near-sdk = { version = "5.0.0", features = ["legacy"] } +schemars = { version = "0.8.16" } serde_json = "1.0.113" -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } +[dev-dependencies] +near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" [profile.release] -codegen-units=1 +codegen-units = 1 +# Tell `rustc` to optimize for small code size. opt-level = "z" lto = true debug = false panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 overflow-checks = true diff --git a/nft-contract/src/lib.rs b/nft-contract/src/lib.rs index a870e6a..8eef96f 100644 --- a/nft-contract/src/lib.rs +++ b/nft-contract/src/lib.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; @@ -31,6 +31,7 @@ pub const NFT_STANDARD_NAME: &str = "nep171"; #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] pub struct Contract { //contract owner pub owner_id: AccountId, @@ -50,6 +51,7 @@ pub struct Contract { /// Helper structure for keys of the persistent collections. #[derive(BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] pub enum StorageKey { TokensPerOwner, TokenPerOwnerInner { account_id_hash: CryptoHash }, diff --git a/nft-contract/src/metadata.rs b/nft-contract/src/metadata.rs index ec13a70..31be514 100644 --- a/nft-contract/src/metadata.rs +++ b/nft-contract/src/metadata.rs @@ -8,6 +8,7 @@ pub struct Payout { } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone)] +#[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct NFTContractMetadata { pub spec: String, // required, essentially a version like "nft-1.0.0" @@ -20,6 +21,7 @@ pub struct NFTContractMetadata { } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)] +#[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct TokenMetadata { pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" @@ -37,6 +39,7 @@ pub struct TokenMetadata { } #[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] pub struct Token { //owner of the token pub owner_id: AccountId, From 9346c02cc99a99ac4d9581f8cedd0516bbe29337 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Wed, 20 Mar 2024 16:52:17 +0100 Subject: [PATCH 05/28] using NearToken in some operations --- nft-contract/src/internal.rs | 8 ++++---- nft-contract/src/lib.rs | 2 +- nft-contract/src/nft_core.rs | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/nft-contract/src/internal.rs b/nft-contract/src/internal.rs index 8a02f6b..450e6d6 100644 --- a/nft-contract/src/internal.rs +++ b/nft-contract/src/internal.rs @@ -46,7 +46,7 @@ pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { pub(crate) fn assert_one_yocto() { assert_eq!( env::attached_deposit(), - 1, + NearToken::from_yoctonear(1), "Requires attached deposit of exactly 1 yoctoNEAR", ) } @@ -54,7 +54,7 @@ pub(crate) fn assert_one_yocto() { //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { assert!( - env::attached_deposit() >= 1, + env::attached_deposit() >= NearToken::from_yoctonear(1), "Requires attached deposit of at least 1 yoctoNEAR", ) } @@ -74,10 +74,10 @@ pub(crate) fn refund_deposit(storage_used: u64) { ); //get the refund amount from the attached deposit - required cost - let refund = attached_deposit - required_cost; + let refund = attached_deposit.saturating_sub(required_cost); //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund > 1 { + if refund.gt(&NearToken::from_yoctonear(1)) { Promise::new(env::predecessor_account_id()).transfer(refund); } } diff --git a/nft-contract/src/lib.rs b/nft-contract/src/lib.rs index 8eef96f..84982f4 100644 --- a/nft-contract/src/lib.rs +++ b/nft-contract/src/lib.rs @@ -4,7 +4,7 @@ use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, AccountId, Balance, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, + env, near_bindgen, AccountId, Balance, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, }; use crate::internal::*; diff --git a/nft-contract/src/nft_core.rs b/nft-contract/src/nft_core.rs index e628e54..1ebc55e 100644 --- a/nft-contract/src/nft_core.rs +++ b/nft-contract/src/nft_core.rs @@ -1,8 +1,8 @@ use crate::*; use near_sdk::{ext_contract, Gas, PromiseResult}; -const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas(10_000_000_000_000); -const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas(25_000_000_000_000); +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); pub trait NonFungibleTokenCore { //transfers an NFT to a receiver ID From 8b6346951055352f0bdc01e4a194e1f442b5f527 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Wed, 20 Mar 2024 16:55:25 +0100 Subject: [PATCH 06/28] fix JsonSchema errors --- nft-contract/Cargo.toml | 2 +- nft-contract/src/lib.rs | 1 + nft-contract/src/metadata.rs | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/nft-contract/Cargo.toml b/nft-contract/Cargo.toml index 17e4525..fdcab30 100644 --- a/nft-contract/Cargo.toml +++ b/nft-contract/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = { version = "5.0.0", features = ["legacy"] } +near-sdk = { version = "5.0.0", features = ["legacy", "abi"] } schemars = { version = "0.8.16" } serde_json = "1.0.113" diff --git a/nft-contract/src/lib.rs b/nft-contract/src/lib.rs index 84982f4..f0f4f65 100644 --- a/nft-contract/src/lib.rs +++ b/nft-contract/src/lib.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use schemars::JsonSchema; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{Base64VecU8, U128}; diff --git a/nft-contract/src/metadata.rs b/nft-contract/src/metadata.rs index 31be514..d9a284e 100644 --- a/nft-contract/src/metadata.rs +++ b/nft-contract/src/metadata.rs @@ -1,13 +1,13 @@ use crate::*; pub type TokenId = String; //defines the payout type we'll be returning as a part of the royalty standards. -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, JsonSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { pub payout: HashMap, } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, JsonSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct NFTContractMetadata { @@ -20,7 +20,7 @@ pub struct NFTContractMetadata { pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, JsonSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct TokenMetadata { @@ -52,7 +52,7 @@ pub struct Token { } //The Json token is what will be returned from view calls. -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, JsonSchema)] #[serde(crate = "near_sdk::serde")] pub struct JsonToken { //token ID From bc914c53d8925a6283c9fbbc9656da35530a6b5d Mon Sep 17 00:00:00 2001 From: garikbesson Date: Wed, 20 Mar 2024 16:57:38 +0100 Subject: [PATCH 07/28] fix StorageKey functionality --- nft-contract/src/internal.rs | 2 -- nft-contract/src/lib.rs | 16 +++++++--------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/nft-contract/src/internal.rs b/nft-contract/src/internal.rs index 450e6d6..0419aff 100644 --- a/nft-contract/src/internal.rs +++ b/nft-contract/src/internal.rs @@ -97,8 +97,6 @@ impl Contract { //we get a new unique prefix for the collection account_id_hash: hash_account_id(&account_id), } - .try_to_vec() - .unwrap(), ) }); diff --git a/nft-contract/src/lib.rs b/nft-contract/src/lib.rs index f0f4f65..b576faf 100644 --- a/nft-contract/src/lib.rs +++ b/nft-contract/src/lib.rs @@ -5,7 +5,7 @@ use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, AccountId, Balance, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, + env, near_bindgen, AccountId, Balance, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, }; use crate::internal::*; @@ -31,7 +31,7 @@ pub const NFT_METADATA_SPEC: &str = "1.0.0"; pub const NFT_STANDARD_NAME: &str = "nep171"; #[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +#[derive(BorshDeserialize, BorshSerialize, BorshStorageKey, PanicOnDefault)] #[borsh(crate = "near_sdk::borsh")] pub struct Contract { //contract owner @@ -51,7 +51,7 @@ pub struct Contract { } /// Helper structure for keys of the persistent collections. -#[derive(BorshSerialize)] +#[derive(BorshSerialize, BorshStorageKey)] #[borsh(crate = "near_sdk::borsh")] pub enum StorageKey { TokensPerOwner, @@ -98,15 +98,13 @@ impl Contract { //create a variable of type Self with all the fields initialized. let this = Self { //Storage keys are simply the prefixes used for the collections. This helps avoid data collision - tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner.try_to_vec().unwrap()), - tokens_by_id: LookupMap::new(StorageKey::TokensById.try_to_vec().unwrap()), - token_metadata_by_id: UnorderedMap::new( - StorageKey::TokenMetadataById.try_to_vec().unwrap(), - ), + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: LookupMap::new(StorageKey::TokensById), + token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), //set the owner_id field equal to the passed in owner_id. owner_id, metadata: LazyOption::new( - StorageKey::NFTContractMetadata.try_to_vec().unwrap(), + StorageKey::NFTContractMetadata, Some(&metadata), ), }; From aea460d5a6b8427e46736adac562e944fdffd32c Mon Sep 17 00:00:00 2001 From: garikbesson Date: Wed, 20 Mar 2024 20:13:33 +0100 Subject: [PATCH 08/28] fix types and jsonschema --- nft-contract/Cargo.toml | 3 +-- nft-contract/build.sh | 2 -- nft-contract/rust-toolchain.toml | 4 ++++ nft-contract/src/approval.rs | 2 +- nft-contract/src/internal.rs | 18 +++++++++--------- nft-contract/src/lib.rs | 3 +-- nft-contract/src/metadata.rs | 12 +++++++----- nft-contract/src/mint.rs | 2 +- nft-contract/src/royalty.rs | 20 ++++++++------------ 9 files changed, 32 insertions(+), 34 deletions(-) delete mode 100755 nft-contract/build.sh create mode 100644 nft-contract/rust-toolchain.toml diff --git a/nft-contract/Cargo.toml b/nft-contract/Cargo.toml index fdcab30..169c45f 100644 --- a/nft-contract/Cargo.toml +++ b/nft-contract/Cargo.toml @@ -8,8 +8,7 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = { version = "5.0.0", features = ["legacy", "abi"] } -schemars = { version = "0.8.16" } +near-sdk = { version = "5.0.0", features = ["legacy"] } serde_json = "1.0.113" [dev-dependencies] diff --git a/nft-contract/build.sh b/nft-contract/build.sh deleted file mode 100755 index 98ae080..0000000 --- a/nft-contract/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -set -e && RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release && mkdir -p ../out && cp target/wasm32-unknown-unknown/release/*.wasm ../out/main.wasm \ No newline at end of file diff --git a/nft-contract/rust-toolchain.toml b/nft-contract/rust-toolchain.toml new file mode 100644 index 0000000..97c2073 --- /dev/null +++ b/nft-contract/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "stable" +components = ["rustfmt"] +targets = ["wasm32-unknown-unknown"] \ No newline at end of file diff --git a/nft-contract/src/approval.rs b/nft-contract/src/approval.rs index 51faa94..61bba70 100644 --- a/nft-contract/src/approval.rs +++ b/nft-contract/src/approval.rs @@ -78,7 +78,7 @@ impl NonFungibleTokenCore for Contract { self.tokens_by_id.insert(&token_id, &token); //refund any excess storage attached by the user. If the user didn't attach enough, panic. - refund_deposit(storage_used); + refund_deposit(storage_used.into()); //if some message was passed into the function, we initiate a cross contract call on the //account we're giving access to. diff --git a/nft-contract/src/internal.rs b/nft-contract/src/internal.rs index 0419aff..2191ed4 100644 --- a/nft-contract/src/internal.rs +++ b/nft-contract/src/internal.rs @@ -1,16 +1,16 @@ use crate::*; -use near_sdk::{CryptoHash}; +use near_sdk::{CryptoHash, NearToken}; use std::mem::size_of; //convert the royalty percentage and amount to pay into a payout (U128) -pub(crate) fn royalty_to_payout(royalty_percentage: u32, amount_to_pay: Balance) -> U128 { - U128(royalty_percentage as u128 * amount_to_pay / 10_000u128) +pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { + amount_to_pay.saturating_mul(royalty_percentage) } //calculate how many bytes the account ID is taking up -pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u64 { +pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u128 { // The extra 4 bytes are coming from Borsh serialization to store the length of the string. - account_id.as_str().len() as u64 + 4 + size_of::() as u64 + account_id.as_str().len() as u128 + 4 + size_of::() as u128 } //refund the storage taken up by passed in approved account IDs and send the funds to the passed in account ID. @@ -19,9 +19,9 @@ pub(crate) fn refund_approved_account_ids_iter<'a, I>( approved_account_ids: I, //the approved account IDs must be passed in as an iterator ) -> Promise where I: Iterator { //get the storage total by going through and summing all the bytes for each approved account IDs - let storage_released: u64 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); //transfer the account the storage that is released - Promise::new(account_id).transfer(Balance::from(storage_released) * env::storage_byte_cost()) + Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) } //refund a map of approved account IDs and send the funds to the passed in account ID @@ -60,9 +60,9 @@ pub(crate) fn assert_at_least_one_yocto() { } //refund the initial deposit based on the amount of storage that was used up -pub(crate) fn refund_deposit(storage_used: u64) { +pub(crate) fn refund_deposit(storage_used: u128) { //get how much it would cost to store the information - let required_cost = env::storage_byte_cost() * Balance::from(storage_used); + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); //get the attached deposit let attached_deposit = env::attached_deposit(); diff --git a/nft-contract/src/lib.rs b/nft-contract/src/lib.rs index b576faf..8fc7b9d 100644 --- a/nft-contract/src/lib.rs +++ b/nft-contract/src/lib.rs @@ -1,11 +1,10 @@ use std::collections::HashMap; -use schemars::JsonSchema; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, AccountId, Balance, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, + env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; use crate::internal::*; diff --git a/nft-contract/src/metadata.rs b/nft-contract/src/metadata.rs index d9a284e..404d701 100644 --- a/nft-contract/src/metadata.rs +++ b/nft-contract/src/metadata.rs @@ -1,13 +1,15 @@ use crate::*; + pub type TokenId = String; + //defines the payout type we'll be returning as a part of the royalty standards. -#[derive(Serialize, Deserialize, JsonSchema)] +#[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, JsonSchema)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct NFTContractMetadata { @@ -20,7 +22,7 @@ pub struct NFTContractMetadata { pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, JsonSchema)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct TokenMetadata { @@ -52,7 +54,7 @@ pub struct Token { } //The Json token is what will be returned from view calls. -#[derive(Serialize, Deserialize, JsonSchema)] +#[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct JsonToken { //token ID diff --git a/nft-contract/src/mint.rs b/nft-contract/src/mint.rs index 4fc049a..37e71ef 100644 --- a/nft-contract/src/mint.rs +++ b/nft-contract/src/mint.rs @@ -76,6 +76,6 @@ impl Contract { let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. - refund_deposit(required_storage_in_bytes); + refund_deposit(required_storage_in_bytes.into()); } } \ No newline at end of file diff --git a/nft-contract/src/royalty.rs b/nft-contract/src/royalty.rs index bde91f6..a80d6d4 100644 --- a/nft-contract/src/royalty.rs +++ b/nft-contract/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout; } @@ -19,7 +19,7 @@ pub trait NonFungibleTokenCore { #[near_bindgen] impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { //get the token object let token = self.tokens_by_id.get(&token_id).expect("No token"); @@ -27,8 +27,6 @@ impl NonFungibleTokenCore for Contract { let owner_id = token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; - //get the u128 version of the passed in balance (which was U128 before) - let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new() @@ -46,13 +44,13 @@ impl NonFungibleTokenCore for Contract { //only insert into the payout if the key isn't the token owner (we add their payout at the end) if key != owner_id { - payout_object.payout.insert(key, royalty_to_payout(*v, balance_u128)); + payout_object.payout.insert(key, royalty_to_payout(*v as u128, balance)); total_perpetual += *v; } } // payout to previous owner who gets 100% - total perpetual royalties - payout_object.payout.insert(owner_id, royalty_to_payout(10000 - total_perpetual, balance_u128)); + payout_object.payout.insert(owner_id, royalty_to_payout((10000 - total_perpetual).into(), balance)); //return the payout object payout_object @@ -66,7 +64,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout { //assert that the user attached 1 yocto NEAR for security reasons @@ -92,8 +90,6 @@ impl NonFungibleTokenCore for Contract { let owner_id = previous_token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; - //get the u128 version of the passed in balance (which was U128 before) - let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new() @@ -111,13 +107,13 @@ impl NonFungibleTokenCore for Contract { //only insert into the payout if the key isn't the token owner (we add their payout at the end) if key != owner_id { - payout_object.payout.insert(key, royalty_to_payout(*v, balance_u128)); + payout_object.payout.insert(key, royalty_to_payout(*v as u128, balance)); total_perpetual += *v; } } // payout to previous owner who gets 100% - total perpetual royalties - payout_object.payout.insert(owner_id, royalty_to_payout(10000 - total_perpetual, balance_u128)); + payout_object.payout.insert(owner_id, royalty_to_payout((10000 - total_perpetual).into(), balance)); //return the payout object payout_object From 9b5a928c50cdeca52abbfe45cabb35fdcbc9d315 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Wed, 20 Mar 2024 21:25:55 +0100 Subject: [PATCH 09/28] fix nft-contract tests --- nft-contract/src/tests.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/nft-contract/src/tests.rs b/nft-contract/src/tests.rs index 6063217..847596c 100644 --- a/nft-contract/src/tests.rs +++ b/nft-contract/src/tests.rs @@ -5,12 +5,12 @@ use crate::TokenMetadata; use crate::approval::NonFungibleTokenCore; use near_sdk::json_types::{U128, U64}; use near_sdk::test_utils::{accounts, VMContextBuilder}; -use near_sdk::testing_env; +use near_sdk::{testing_env, NearToken}; use near_sdk::{env, AccountId}; use std::collections::HashMap; -const MINT_STORAGE_COST: u128 = 100_000_000_000_000_000_000_000; -const MIN_REQUIRED_APPROVAL_YOCTO: u128 = 170000000000000000000; +const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); +const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); fn get_context(predecessor: AccountId) -> VMContextBuilder { let mut builder = VMContextBuilder::new(); @@ -102,7 +102,7 @@ fn test_internal_transfer() { testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(1) + .attached_deposit(NearToken::from_yoctonear(1)) .predecessor_account_id(accounts(0)) .build()); contract.internal_transfer( @@ -117,7 +117,7 @@ fn test_internal_transfer() { .storage_usage(env::storage_usage()) .account_balance(env::account_balance()) .is_view(true) - .attached_deposit(0) + .attached_deposit(NearToken::from_yoctonear(0)) .build()); let tokens = contract.nft_tokens_for_owner(accounts(1), Some(U128(0)), None); @@ -163,7 +163,7 @@ fn test_nft_approve() { .storage_usage(env::storage_usage()) .account_balance(env::account_balance()) .is_view(true) - .attached_deposit(0) + .attached_deposit(NearToken::from_near(0)) .build()); assert!(contract.nft_is_approved(token_id.clone(), accounts(1), None)); } @@ -193,7 +193,7 @@ fn test_nft_revoke() { // alice revokes bob testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(1) + .attached_deposit(NearToken::from_yoctonear(1)) .predecessor_account_id(accounts(0)) .build()); contract.nft_revoke(token_id.clone(), accounts(1)); @@ -201,7 +201,7 @@ fn test_nft_revoke() { .storage_usage(env::storage_usage()) .account_balance(env::account_balance()) .is_view(true) - .attached_deposit(0) + .attached_deposit(NearToken::from_near(0)) .build()); assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), None)); } @@ -231,7 +231,7 @@ fn test_revoke_all() { // alice revokes bob testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(1) + .attached_deposit(NearToken::from_yoctonear(1)) .predecessor_account_id(accounts(0)) .build()); contract.nft_revoke_all(token_id.clone()); @@ -239,7 +239,7 @@ fn test_revoke_all() { .storage_usage(env::storage_usage()) .account_balance(env::account_balance()) .is_view(true) - .attached_deposit(0) + .attached_deposit(NearToken::from_near(0)) .build()); assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), Some(1))); } @@ -289,8 +289,8 @@ fn test_nft_payout() { .build()); contract.nft_approve(token_id.clone(), accounts(1), None); - let payout = contract.nft_payout(token_id.clone(), U128(10), 1); - let expected = HashMap::from([(accounts(0), U128(10))]); + let payout = contract.nft_payout(token_id.clone(), NearToken::from_millinear(10), 1); + let expected = HashMap::from([(accounts(0), NearToken::from_near(100))]); assert_eq!(payout.payout, expected); } From 40085333eff733ebd248f7fee8faceda76c91aed Mon Sep 17 00:00:00 2001 From: garikbesson Date: Thu, 21 Mar 2024 13:37:24 +0100 Subject: [PATCH 10/28] migrated nft-series contract --- nft-contract/src/internal.rs | 4 +- nft-series/Cargo.toml | 15 +++-- nft-series/build.sh | 2 - nft-series/rust-toolchain.toml | 4 ++ nft-series/src/enumeration.rs | 3 +- nft-series/src/internal.rs | 101 +++++++++++++++------------------ nft-series/src/lib.rs | 21 ++++--- nft-series/src/metadata.rs | 13 +++-- nft-series/src/nft_core.rs | 4 +- nft-series/src/royalty.rs | 20 +++---- nft-series/src/series.rs | 14 ++--- 11 files changed, 102 insertions(+), 99 deletions(-) delete mode 100755 nft-series/build.sh create mode 100644 nft-series/rust-toolchain.toml diff --git a/nft-contract/src/internal.rs b/nft-contract/src/internal.rs index 2191ed4..0490bbc 100644 --- a/nft-contract/src/internal.rs +++ b/nft-contract/src/internal.rs @@ -2,7 +2,7 @@ use crate::*; use near_sdk::{CryptoHash, NearToken}; use std::mem::size_of; -//convert the royalty percentage and amount to pay into a payout (U128) +//convert the royalty percentage and amount to pay into a payout pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { amount_to_pay.saturating_mul(royalty_percentage) } @@ -54,7 +54,7 @@ pub(crate) fn assert_one_yocto() { //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { assert!( - env::attached_deposit() >= NearToken::from_yoctonear(1), + env::attached_deposit().ge(&NearToken::from_yoctonear(1)), "Requires attached deposit of at least 1 yoctoNEAR", ) } diff --git a/nft-series/Cargo.toml b/nft-series/Cargo.toml index 17c1958..2f12377 100644 --- a/nft-series/Cargo.toml +++ b/nft-series/Cargo.toml @@ -8,16 +8,21 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = "4.1.1" +near-sdk = { version = "5.0.0", features = ["legacy"] } serde_json = "1.0.113" -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } +[dev-dependencies] +near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" [profile.release] -codegen-units=1 +codegen-units = 1 +# Tell `rustc` to optimize for small code size. opt-level = "z" lto = true debug = false panic = "abort" -overflow-checks = true +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 +overflow-checks = true \ No newline at end of file diff --git a/nft-series/build.sh b/nft-series/build.sh deleted file mode 100755 index eed9fb1..0000000 --- a/nft-series/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -set -e && RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release && mkdir -p ../out && cp target/wasm32-unknown-unknown/release/*.wasm ../out/series.wasm \ No newline at end of file diff --git a/nft-series/rust-toolchain.toml b/nft-series/rust-toolchain.toml new file mode 100644 index 0000000..97c2073 --- /dev/null +++ b/nft-series/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "stable" +components = ["rustfmt"] +targets = ["wasm32-unknown-unknown"] \ No newline at end of file diff --git a/nft-series/src/enumeration.rs b/nft-series/src/enumeration.rs index 31e85cb..0ef1b50 100644 --- a/nft-series/src/enumeration.rs +++ b/nft-series/src/enumeration.rs @@ -3,7 +3,8 @@ use crate::nft_core::NonFungibleTokenCore; /// Struct to return in views to query for specific data related to a series -#[derive(BorshDeserialize, BorshSerialize, Serialize)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct JsonSeries { series_id: u64, diff --git a/nft-series/src/internal.rs b/nft-series/src/internal.rs index c2b57fe..6a00e46 100644 --- a/nft-series/src/internal.rs +++ b/nft-series/src/internal.rs @@ -2,31 +2,26 @@ use crate::*; use near_sdk::CryptoHash; use std::mem::size_of; -//convert the royalty percentage and amount to pay into a payout (U128) -pub(crate) fn royalty_to_payout(royalty_percentage: u32, amount_to_pay: Balance) -> U128 { - U128(royalty_percentage as u128 * amount_to_pay / 10_000u128) +//convert the royalty percentage and amount to pay into a payout +pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { + amount_to_pay.saturating_mul(royalty_percentage) } //calculate how many bytes the account ID is taking up -pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u64 { +pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u128 { // The extra 4 bytes are coming from Borsh serialization to store the length of the string. - account_id.as_str().len() as u64 + 4 + size_of::() as u64 + account_id.as_str().len() as u128 + 4 + size_of::() as u128 } -//refund the storage taken up by passed in approved account IDs and send the funds to the passed in account ID. +//refund the storage taken up by passed in approved account IDs and send the funds to the passed in account ID. pub(crate) fn refund_approved_account_ids_iter<'a, I>( - account_id: AccountId, - approved_account_ids: I, //the approved account IDs must be passed in as an iterator -) -> Promise -where - I: Iterator, -{ - //get the storage total by going through and summing all the bytes for each approved account IDs - let storage_released: u64 = approved_account_ids - .map(bytes_for_approved_account_id) - .sum(); - //transfer the account the storage that is released - Promise::new(account_id).transfer(Balance::from(storage_released) * env::storage_byte_cost()) + account_id: AccountId, + approved_account_ids: I, //the approved account IDs must be passed in as an iterator +) -> Promise where I: Iterator { + //get the storage total by going through and summing all the bytes for each approved account IDs + let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + //transfer the account the storage that is released + Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) } //refund a map of approved account IDs and send the funds to the passed in account ID @@ -49,63 +44,63 @@ pub(crate) fn hash_account_id(account_id: &String) -> CryptoHash { //used to make sure the user attached exactly 1 yoctoNEAR pub(crate) fn assert_one_yocto() { - assert_eq!( - env::attached_deposit(), - 1, - "Requires attached deposit of exactly 1 yoctoNEAR", - ) + assert_eq!( + env::attached_deposit(), + NearToken::from_yoctonear(1), + "Requires attached deposit of exactly 1 yoctoNEAR", + ) } //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { - assert!( - env::attached_deposit() >= 1, - "Requires attached deposit of at least 1 yoctoNEAR", - ) + assert!( + env::attached_deposit() >= NearToken::from_yoctonear(1), + "Requires attached deposit of at least 1 yoctoNEAR", + ) } // Send all the non storage funds to the series owner -pub(crate) fn payout_series_owner(storage_used: u64, price_per_token: Balance, owner_id: AccountId) { +pub(crate) fn payout_series_owner(storage_used: u128, price_per_token: NearToken, owner_id: AccountId) { //get how much it would cost to store the information - let required_cost = env::storage_byte_cost() * Balance::from(storage_used); + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); //get the attached deposit let attached_deposit = env::attached_deposit(); //make sure that the attached deposit is greater than or equal to the required cost assert!( - attached_deposit >= required_cost + price_per_token, + attached_deposit.ge(&required_cost.saturating_add(price_per_token)), "Must attach {} yoctoNEAR to cover storage and price per token {}", required_cost, price_per_token ); // If there's a price for the token, transfer everything but the storage to the series owner - if price_per_token > 0 { - Promise::new(owner_id).transfer(attached_deposit - required_cost); + if price_per_token.gt(&NearToken::from_yoctonear(0)) { + Promise::new(owner_id).transfer(attached_deposit.saturating_sub(required_cost)); } } //refund the initial deposit based on the amount of storage that was used up -pub(crate) fn refund_deposit(storage_used: u64) { - //get how much it would cost to store the information - let required_cost = env::storage_byte_cost() * Balance::from(storage_used); - //get the attached deposit - let attached_deposit = env::attached_deposit(); - - //make sure that the attached deposit is greater than or equal to the required cost - assert!( - required_cost <= attached_deposit, - "Must attach {} yoctoNEAR to cover storage", - required_cost, - ); - - //get the refund amount from the attached deposit - required cost - let refund = attached_deposit - required_cost; - - //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund > 1 { - Promise::new(env::predecessor_account_id()).transfer(refund); - } +pub(crate) fn refund_deposit(storage_used: u128) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit.saturating_sub(required_cost); + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund.gt(&NearToken::from_yoctonear(1)) { + Promise::new(env::predecessor_account_id()).transfer(refund); + } } impl Contract { @@ -131,8 +126,6 @@ impl Contract { //we get a new unique prefix for the collection account_id_hash: hash_account_id(&account_id.to_string()), } - .try_to_vec() - .unwrap(), ) }); diff --git a/nft-series/src/lib.rs b/nft-series/src/lib.rs index b6cd742..a9f374d 100644 --- a/nft-series/src/lib.rs +++ b/nft-series/src/lib.rs @@ -3,8 +3,8 @@ use near_sdk::collections::{LazyOption, LookupMap, LookupSet, UnorderedMap, Unor use near_sdk::json_types::{Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, require, AccountId, Balance, BorshStorageKey, CryptoHash, PanicOnDefault, - Promise, PromiseOrValue, + env, near_bindgen, require, AccountId, NearToken, BorshStorageKey, CryptoHash, PanicOnDefault, + Promise, PromiseOrValue, NearSchema }; use std::collections::HashMap; @@ -34,6 +34,7 @@ pub const NFT_STANDARD_NAME: &str = "nep171"; // Represents the series type. All tokens will derive this data. #[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] pub struct Series { // Metadata including title, num copies etc.. that all tokens will derive from metadata: TokenMetadata, @@ -43,7 +44,7 @@ pub struct Series { tokens: UnorderedSet, // What is the price of each token in this series? If this is specified, when minting, // Users will need to attach enough $NEAR to cover the price. - price: Option, + price: Option, // Owner of the collection owner_id: AccountId, } @@ -52,6 +53,7 @@ pub type SeriesId = u64; #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] pub struct Contract { //contract owner pub owner_id: AccountId, @@ -77,6 +79,7 @@ pub struct Contract { /// Helper structure for keys of the persistent collections. #[derive(BorshSerialize, BorshStorageKey)] +#[borsh(crate = "near_sdk::borsh")] pub enum StorageKey { ApprovedMinters, ApprovedCreators, @@ -121,26 +124,26 @@ impl Contract { pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { // Create the approved minters set and insert the owner let mut approved_minters = - LookupSet::new(StorageKey::ApprovedMinters.try_to_vec().unwrap()); + LookupSet::new(StorageKey::ApprovedMinters); approved_minters.insert(&owner_id); // Create the approved creators set and insert the owner let mut approved_creators = - LookupSet::new(StorageKey::ApprovedCreators.try_to_vec().unwrap()); + LookupSet::new(StorageKey::ApprovedCreators); approved_creators.insert(&owner_id); // Create a variable of type Self with all the fields initialized. let this = Self { approved_minters, approved_creators, - series_by_id: UnorderedMap::new(StorageKey::SeriesById.try_to_vec().unwrap()), + series_by_id: UnorderedMap::new(StorageKey::SeriesById), //Storage keys are simply the prefixes used for the collections. This helps avoid data collision - tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner.try_to_vec().unwrap()), - tokens_by_id: UnorderedMap::new(StorageKey::TokensById.try_to_vec().unwrap()), + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: UnorderedMap::new(StorageKey::TokensById), //set the &owner_id field equal to the passed in owner_id. owner_id, metadata: LazyOption::new( - StorageKey::NFTContractMetadata.try_to_vec().unwrap(), + StorageKey::NFTContractMetadata, Some(&metadata), ), }; diff --git a/nft-series/src/metadata.rs b/nft-series/src/metadata.rs index 7ac6730..0934281 100644 --- a/nft-series/src/metadata.rs +++ b/nft-series/src/metadata.rs @@ -1,13 +1,14 @@ use crate::*; pub type TokenId = String; //defines the payout type we'll be returning as a part of the royalty standards. -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct NFTContractMetadata { pub spec: String, // required, essentially a version like "nft-1.0.0" @@ -19,7 +20,8 @@ pub struct NFTContractMetadata { pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct TokenMetadata { pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" @@ -37,6 +39,7 @@ pub struct TokenMetadata { } #[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] pub struct Token { // Series that the token belongs to pub series_id: u64, @@ -49,7 +52,7 @@ pub struct Token { } //The Json token is what will be returned from view calls. -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct JsonToken { // Series that the token belongs to diff --git a/nft-series/src/nft_core.rs b/nft-series/src/nft_core.rs index fdcac62..6166edf 100644 --- a/nft-series/src/nft_core.rs +++ b/nft-series/src/nft_core.rs @@ -1,8 +1,8 @@ use crate::*; use near_sdk::{ext_contract, Gas, PromiseResult}; -const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas(10_000_000_000_000); -const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas(25_000_000_000_000); +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); pub trait NonFungibleTokenCore { //transfers an NFT to a receiver ID diff --git a/nft-series/src/royalty.rs b/nft-series/src/royalty.rs index 6745f66..0670c55 100644 --- a/nft-series/src/royalty.rs +++ b/nft-series/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout; } @@ -19,7 +19,7 @@ pub trait NonFungibleTokenCore { #[near_bindgen] impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { //get the token object let token = self.tokens_by_id.get(&token_id).expect("No token"); @@ -27,8 +27,6 @@ impl NonFungibleTokenCore for Contract { let owner_id = token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; - //get the u128 version of the passed in balance (which was U128 before) - let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new(), @@ -66,7 +64,7 @@ impl NonFungibleTokenCore for Contract { // payout_object .payout - .insert(key, royalty_to_payout(*v, balance_u128)); + .insert(key, royalty_to_payout(*v as u128, balance)); total_perpetual += *v; } } @@ -74,7 +72,7 @@ impl NonFungibleTokenCore for Contract { // payout to previous owner who gets 100% - total perpetual royalties payout_object.payout.insert( owner_id, - royalty_to_payout(10000 - total_perpetual, balance_u128), + royalty_to_payout((10000 - total_perpetual).into(), balance) ); //return the payout object @@ -89,7 +87,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout { //assert that the user attached 1 yocto NEAR for security reasons @@ -110,8 +108,6 @@ impl NonFungibleTokenCore for Contract { let owner_id = previous_token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; - //get the u128 version of the passed in balance (which was U128 before) - let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new(), @@ -150,7 +146,7 @@ impl NonFungibleTokenCore for Contract { // payout_object .payout - .insert(key, royalty_to_payout(*v, balance_u128)); + .insert(key, royalty_to_payout(*v as u128, balance)); total_perpetual += *v; } } @@ -158,7 +154,7 @@ impl NonFungibleTokenCore for Contract { // payout to previous owner who gets 100% - total perpetual royalties payout_object.payout.insert( owner_id, - royalty_to_payout(10000 - total_perpetual, balance_u128), + royalty_to_payout((10000 - total_perpetual).into(), balance) ); //return the payout object diff --git a/nft-series/src/series.rs b/nft-series/src/series.rs index c89208f..33679bc 100644 --- a/nft-series/src/series.rs +++ b/nft-series/src/series.rs @@ -15,7 +15,7 @@ impl Contract { id: u64, metadata: TokenMetadata, royalty: Option>, - price: Option + price: Option ) { // Measure the initial storage being used on the contract let initial_storage_usage = env::storage_usage(); @@ -54,7 +54,7 @@ impl Contract { let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. - refund_deposit(required_storage_in_bytes); + refund_deposit(required_storage_in_bytes.into()); } /// Mint a new NFT that is part of a series. The caller must be an approved minter. @@ -68,10 +68,10 @@ impl Contract { let mut series = self.series_by_id.get(&id.0).expect("Not a series"); // Check if the series has a price per token. If it does, ensure the caller has attached at least that amount - let mut price_per_token = 0; + let mut price_per_token = NearToken::from_yoctonear(0); if let Some(price) = series.price { price_per_token = price; - require!(env::attached_deposit() > price_per_token, "Need to attach at least enough to cover price"); + require!(env::attached_deposit().ge(&price_per_token), "Need to attach at least enough to cover price"); // If the series doesn't have a price, ensure the caller is an approved minter. } else { // Ensure the caller is an approved minter @@ -141,10 +141,10 @@ impl Contract { let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; // If there's some price for the token, we'll payout the series owner. Otherwise, refund the excess deposit for storage to the caller - if price_per_token > 0 { - payout_series_owner(required_storage_in_bytes, price_per_token, series.owner_id); + if price_per_token.gt(&NearToken::from_yoctonear(0)) { + payout_series_owner(required_storage_in_bytes.into(), price_per_token, series.owner_id); } else { - refund_deposit(required_storage_in_bytes); + refund_deposit(required_storage_in_bytes.into()); } } } From b6c2446c80df07c24394c40cb0bd96463b03040d Mon Sep 17 00:00:00 2001 From: garikbesson Date: Thu, 21 Mar 2024 15:34:52 +0100 Subject: [PATCH 11/28] migrate market-contract + tests --- market-contract/Cargo.toml | 13 +++++--- market-contract/build.sh | 2 -- market-contract/src/external.rs | 2 +- market-contract/src/internal.rs | 4 +++ market-contract/src/lib.rs | 50 ++++++++++++++++-------------- market-contract/src/sale.rs | 55 +++++++++++++++++---------------- market-contract/src/tests.rs | 19 +++++++----- nft-contract/src/internal.rs | 6 ++-- nft-contract/src/lib.rs | 3 ++ nft-contract/src/tests.rs | 8 +++-- nft-series/src/internal.rs | 12 ++++--- 11 files changed, 99 insertions(+), 75 deletions(-) delete mode 100755 market-contract/build.sh diff --git a/market-contract/Cargo.toml b/market-contract/Cargo.toml index 27d85ca..6f00e88 100644 --- a/market-contract/Cargo.toml +++ b/market-contract/Cargo.toml @@ -8,15 +8,20 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = "4.1.1" +near-sdk = { version = "5.0.0", features = ["legacy"] } -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } +[dev-dependencies] +near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" [profile.release] -codegen-units=1 +codegen-units = 1 +# Tell `rustc` to optimize for small code size. opt-level = "z" lto = true debug = false panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 overflow-checks = true diff --git a/market-contract/build.sh b/market-contract/build.sh deleted file mode 100755 index 485dbfd..0000000 --- a/market-contract/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -set -e && RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release && mkdir -p ../out && cp target/wasm32-unknown-unknown/release/*.wasm ../out/market.wasm \ No newline at end of file diff --git a/market-contract/src/external.rs b/market-contract/src/external.rs index 7700642..b921c19 100644 --- a/market-contract/src/external.rs +++ b/market-contract/src/external.rs @@ -16,7 +16,7 @@ trait ExtContract { the price that the token was purchased for. This will be used in conjunction with the royalty percentages for the token in order to determine how much money should go to which account. */ - balance: U128, + balance: NearToken, //the maximum amount of accounts the market can payout at once (this is limited by GAS) max_len_payout: u32, ); diff --git a/market-contract/src/internal.rs b/market-contract/src/internal.rs index 0fd04e0..eb32359 100644 --- a/market-contract/src/internal.rs +++ b/market-contract/src/internal.rs @@ -9,6 +9,10 @@ pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { hash } +pub(crate) fn storage_per_sale() -> NearToken { + env::storage_byte_cost().saturating_mul(1000) +} + impl Contract { //internal method for removing a sale from the market. This returns the previously removed sale object pub(crate) fn internal_remove_sale( diff --git a/market-contract/src/lib.rs b/market-contract/src/lib.rs index 1fbad9a..f3a943d 100644 --- a/market-contract/src/lib.rs +++ b/market-contract/src/lib.rs @@ -1,9 +1,9 @@ -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::borsh::{BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{U128, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - assert_one_yocto, env, ext_contract, near_bindgen, AccountId, Balance, Gas, PanicOnDefault, + assert_one_yocto, env, ext_contract, near_bindgen, AccountId, NearToken, Gas, PanicOnDefault, Promise, CryptoHash, BorshStorageKey, }; use std::collections::HashMap; @@ -11,7 +11,6 @@ use std::collections::HashMap; use crate::external::*; use crate::internal::*; use crate::sale::*; -use near_sdk::env::STORAGE_PRICE_PER_BYTE; mod external; mod internal; @@ -20,11 +19,12 @@ mod sale; mod sale_views; //GAS constants to attach to calls -const GAS_FOR_RESOLVE_PURCHASE: Gas = Gas(115_000_000_000_000); -const GAS_FOR_NFT_TRANSFER: Gas = Gas(15_000_000_000_000); +const GAS_FOR_RESOLVE_PURCHASE: Gas = Gas::from_tgas(115); +const GAS_FOR_NFT_TRANSFER: Gas = Gas::from_tgas(15); -//the minimum storage to have a sale on the contract. -const STORAGE_PER_SALE: u128 = 1000 * STORAGE_PRICE_PER_BYTE; +//Basic NEAR amounts as constants +const ZERO_NEAR: NearToken = NearToken::from_yoctonear(0); +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); //every sale will have a unique ID which is `CONTRACT + DELIMITER + TOKEN_ID` static DELIMETER: &str = "."; @@ -38,13 +38,14 @@ pub type ContractAndTokenId = String; #[derive(Serialize, Deserialize)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } //main contract struct to store all the information #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] pub struct Contract { //keep track of the owner of the contract pub owner_id: AccountId, @@ -63,11 +64,12 @@ pub struct Contract { pub by_nft_contract_id: LookupMap>, //keep track of the storage that accounts have payed - pub storage_deposits: LookupMap, + pub storage_deposits: LookupMap, } /// Helper structure to for keys of the persistent collections. #[derive(BorshStorageKey, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] pub enum StorageKey { Sales, ByOwnerId, @@ -118,17 +120,17 @@ impl Contract { //get the deposit value which is how much the user wants to add to their storage let deposit = env::attached_deposit(); - //make sure the deposit is greater than or equal to the minimum storage for a sale + //make sure the deposit is greater than or equal to the minimum storage for a sale (which computes like env::storage_byte_cost().saturating_mul(1000)) assert!( - deposit >= STORAGE_PER_SALE, + deposit.ge(&storage_per_sale()), "Requires minimum deposit of {}", - STORAGE_PER_SALE + storage_per_sale() ); //get the balance of the account (if the account isn't in the map we default to a balance of 0) - let mut balance: u128 = self.storage_deposits.get(&storage_account_id).unwrap_or(0); + let mut balance: NearToken = self.storage_deposits.get(&storage_account_id).unwrap_or(ZERO_NEAR); //add the deposit to their balance - balance += deposit; + balance = balance.saturating_add(deposit); //insert the balance back into the map for that account ID self.storage_deposits.insert(&storage_account_id, &balance); } @@ -145,39 +147,39 @@ impl Contract { //the account to withdraw storage to is always the function caller let owner_id = env::predecessor_account_id(); //get the amount that the user has by removing them from the map. If they're not in the map, default to 0 - let mut amount = self.storage_deposits.remove(&owner_id).unwrap_or(0); + let mut amount = self.storage_deposits.remove(&owner_id).unwrap_or(ZERO_NEAR); //how many sales is that user taking up currently. This returns a set let sales = self.by_owner_id.get(&owner_id); //get the length of that set. let len = sales.map(|s| s.len()).unwrap_or_default(); - //how much NEAR is being used up for all the current sales on the account - let diff = u128::from(len) * STORAGE_PER_SALE; + //how much NEAR is being used up for all the current sales on the account + let diff = storage_per_sale().saturating_mul(u128::from(len)); //the excess to withdraw is the total storage paid - storage being used up. - amount -= diff; + amount = amount.saturating_sub(diff); //if that excess to withdraw is > 0, we transfer the amount to the user. - if amount > 0 { + if amount.gt(&ZERO_NEAR) { Promise::new(owner_id.clone()).transfer(amount); } //we need to add back the storage being used up into the map if it's greater than 0. //this is so that if the user had 500 sales on the market, we insert that value here so //if those sales get taken down, the user can then go and withdraw 500 sales worth of storage. - if diff > 0 { + if diff.gt(&ZERO_NEAR) { self.storage_deposits.insert(&owner_id, &diff); } } /// views //return the minimum storage for 1 sale - pub fn storage_minimum_balance(&self) -> U128 { - U128(STORAGE_PER_SALE) + pub fn storage_minimum_balance(&self) -> NearToken { + storage_per_sale() } //return how much storage an account has paid for - pub fn storage_balance_of(&self, account_id: AccountId) -> U128 { - U128(self.storage_deposits.get(&account_id).unwrap_or(0)) + pub fn storage_balance_of(&self, account_id: AccountId) -> NearToken { + self.storage_deposits.get(&account_id).unwrap_or(ZERO_NEAR) } } diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index 32f0d6d..420a3c9 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -1,9 +1,10 @@ use crate::*; -use near_sdk::{log, promise_result_as_success, PromiseError}; +use near_sdk::{log, promise_result_as_success, NearSchema, PromiseError}; use near_sdk::serde_json::json; //struct that holds important information about each sale on the market -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)] +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct Sale { //owner of the sale @@ -19,7 +20,7 @@ pub struct Sale { } //The Json token is what will be returned from view calls. -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct JsonToken { //owner of the token @@ -47,10 +48,16 @@ impl Contract { let owner_id = env::predecessor_account_id(); let nft_token_promise = Promise::new(nft_contract_id.clone()).function_call( - "nft_token".to_owned(), json!({ "token_id": token_id }).to_string().into_bytes(), 0, Gas(10u64.pow(13)) + "nft_token".to_owned(), + json!({ "token_id": token_id }).to_string().into_bytes(), + ZERO_NEAR, + Gas::from_gas(10u64.pow(13)) ); let nft_is_approved_promise = Promise::new(nft_contract_id.clone()).function_call( - "nft_is_approved".to_owned(), json!({ "token_id": token_id, "approved_account_id": env::current_account_id(), "approval_id": approval_id }).to_string().into_bytes(), 0, Gas(10u64.pow(13)) + "nft_is_approved".to_owned(), + json!({ "token_id": token_id, "approved_account_id": env::current_account_id(), "approval_id": approval_id }).to_string().into_bytes(), + ZERO_NEAR, + Gas::from_gas(10u64.pow(13)) ); nft_token_promise .and(nft_is_approved_promise) @@ -106,7 +113,7 @@ impl Contract { pub fn offer(&mut self, nft_contract_id: AccountId, token_id: String) { //get the attached deposit and make sure it's greater than 0 let deposit = env::attached_deposit(); - assert!(deposit > 0, "Attached deposit must be greater than 0"); + assert!(!deposit.is_zero(), "Attached deposit must be greater than 0"); //convert the nft_contract_id from a AccountId to an AccountId let contract_id: AccountId = nft_contract_id.into(); @@ -124,13 +131,13 @@ impl Contract { let price = sale.sale_conditions.0; //make sure the deposit is greater than the price - assert!(deposit >= price, "Attached deposit must be greater than or equal to the current price: {:?}", price); + assert!(deposit.ge(&NearToken::from_yoctonear(price)), "Attached deposit must be greater than or equal to the current price: {:?}", price); //process the purchase (which will remove the sale, transfer and get the payout from the nft contract, and then distribute royalties) self.process_purchase( contract_id, token_id, - U128(deposit), + deposit, buyer_id, ); } @@ -142,7 +149,7 @@ impl Contract { &mut self, nft_contract_id: AccountId, token_id: String, - price: U128, + price: NearToken, buyer_id: AccountId, ) -> Promise { //get the sale object by removing the sale @@ -152,7 +159,7 @@ impl Contract { //a payout object used for the market to distribute funds to the appropriate accounts. ext_contract::ext(nft_contract_id) // Attach 1 yoctoNEAR with static GAS equal to the GAS for nft transfer. Also attach an unused GAS weight of 1 by default. - .with_attached_deposit(1) + .with_attached_deposit(ONE_YOCTONEAR) .with_static_gas(GAS_FOR_NFT_TRANSFER) .nft_transfer_payout( buyer_id.clone(), //purchaser (person to transfer the NFT to) @@ -188,8 +195,8 @@ impl Contract { pub fn resolve_purchase( &mut self, buyer_id: AccountId, - price: U128, - ) -> U128 { + price: NearToken, + ) -> NearToken { // checking for payout information returned from the nft_transfer_payout method let payout_option = promise_result_as_success().and_then(|value| { //if we set the payout_option to None, that means something went wrong and we should refund the buyer @@ -206,17 +213,17 @@ impl Contract { //if the payout object is the correct length, we move forward } else { //we'll keep track of how much the nft contract wants us to payout. Starting at the full price payed by the buyer - let mut remainder = price.0; + let mut remainder = price; //loop through the payout and subtract the values from the remainder. for &value in payout_object.payout.values() { //checked sub checks for overflow or any errors and returns None if there are problems - remainder = remainder.checked_sub(value.0)?; + remainder = remainder.checked_sub(value)?; } //Check to see if the NFT contract sent back a faulty payout that requires us to pay more or too little. //The remainder will be 0 if the payout summed to the total price. The remainder will be 1 if the royalties //we something like 3333 + 3333 + 3333. - if remainder == 0 || remainder == 1 { + if remainder.is_zero() || remainder.eq(&ONE_YOCTONEAR) { //set the payout_option to be the payout because nothing went wrong Some(payout_object.payout) } else { @@ -232,14 +239,14 @@ impl Contract { payout_option //if the payout option was None, we refund the buyer for the price they payed and return } else { - Promise::new(buyer_id).transfer(u128::from(price)); + Promise::new(buyer_id).transfer(price); // leave function and return the price that was refunded return price; }; // NEAR payouts for (receiver_id, amount) in payout { - Promise::new(receiver_id).transfer(amount.0); + Promise::new(receiver_id).transfer(amount); } //return the price payout out @@ -279,17 +286,17 @@ impl Contract { //we need to enforce that the user has enough storage for 1 EXTRA sale. //get the storage for a sale. dot 0 converts from U128 to u128 - let storage_amount = self.storage_minimum_balance().0; + let storage_amount = self.storage_minimum_balance(); //get the total storage paid by the owner - let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(0); + let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(ZERO_NEAR); //get the storage required which is simply the storage for the number of sales they have + 1 - let signer_storage_required = (self.get_supply_by_owner_id(owner_id.clone()).0 + 1) as u128 * storage_amount; + let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()).0 + 1).into()); //make sure that the total paid is >= the required storage assert!( - owner_paid_storage >= signer_storage_required, + owner_paid_storage.ge(&signer_storage_required), "Insufficient storage paid: {}, for {} sales at {} rate of per sale", - owner_paid_storage, signer_storage_required / STORAGE_PER_SALE, STORAGE_PER_SALE + owner_paid_storage, signer_storage_required.saturating_div(storage_per_sale().as_yoctonear()), storage_per_sale() ); //if all these checks pass we can create the sale conditions object. @@ -322,8 +329,6 @@ impl Contract { //we get a new unique prefix for the collection by hashing the owner account_id_hash: hash_account_id(&owner_id), } - .try_to_vec() - .unwrap(), ) }); @@ -342,8 +347,6 @@ impl Contract { //we get a new unique prefix for the collection by hashing the owner account_id_hash: hash_account_id(&nft_contract_id), } - .try_to_vec() - .unwrap(), ) }); diff --git a/market-contract/src/tests.rs b/market-contract/src/tests.rs index b66360c..ae84ea0 100644 --- a/market-contract/src/tests.rs +++ b/market-contract/src/tests.rs @@ -6,12 +6,15 @@ use near_sdk::{ collections::UnorderedSet, env, json_types::{U128, U64}, + NearToken, test_utils::{accounts, VMContextBuilder}, testing_env, AccountId, }; -const MIN_REQUIRED_APPROVAL_YOCTO: u128 = 170000000000000000000; -const MIN_REQUIRED_STORAGE_YOCTO: u128 = 10000000000000000000000; +const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(170000000000000000000); +const MIN_REQUIRED_STORAGE_YOCTO: NearToken = NearToken::from_millinear(100); + +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); fn get_context(predecessor: AccountId) -> VMContextBuilder { let mut builder = VMContextBuilder::new(); @@ -28,7 +31,7 @@ fn test_default() { } #[test] -#[should_panic(expected = "Requires minimum deposit of 10000000000000000000000")] +#[should_panic(expected = "Requires minimum deposit of 0.010 NEAR")] fn test_storage_deposit_insufficient_deposit() { let mut context = get_context(accounts(0)); testing_env!(context.build()); @@ -69,7 +72,7 @@ fn test_storage_balance_of() { .build()); contract.storage_deposit(Some(accounts(0))); let balance = contract.storage_balance_of(accounts(0)); - assert_eq!(balance, U128(MIN_REQUIRED_STORAGE_YOCTO)); + assert!(balance.eq(&MIN_REQUIRED_STORAGE_YOCTO)); } #[test] @@ -89,13 +92,13 @@ fn test_storage_withdraw() { // withdraw amount testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(U128(1).0) // below func requires a min of 1 yocto attached + .attached_deposit(ONE_YOCTONEAR) // below func requires a min of 1 yocto attached .predecessor_account_id(accounts(0)) .build()); contract.storage_withdraw(); let remaining_amount = contract.storage_balance_of(accounts(0)); - assert_eq!(remaining_amount, U128(0)) + assert!(remaining_amount.is_zero()) } #[test] @@ -137,7 +140,7 @@ fn test_remove_sale() { // remove sale testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(U128(1).0) // below func requires a min of 1 yocto attached + .attached_deposit(ONE_YOCTONEAR) // below func requires a min of 1 yocto attached .predecessor_account_id(accounts(0)) .build()); contract.remove_sale(nft_contract_id, token_id); @@ -189,7 +192,7 @@ fn test_update_price() { let new_price = U128(150); testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(U128(1).0) + .attached_deposit(ONE_YOCTONEAR) .predecessor_account_id(accounts(0)) // bob to buy NFT from alice .build()); contract.update_price(nft_contract_id, token_id, new_price); diff --git a/nft-contract/src/internal.rs b/nft-contract/src/internal.rs index 0490bbc..2432bb7 100644 --- a/nft-contract/src/internal.rs +++ b/nft-contract/src/internal.rs @@ -46,7 +46,7 @@ pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { pub(crate) fn assert_one_yocto() { assert_eq!( env::attached_deposit(), - NearToken::from_yoctonear(1), + ONE_YOCTONEAR, "Requires attached deposit of exactly 1 yoctoNEAR", ) } @@ -54,7 +54,7 @@ pub(crate) fn assert_one_yocto() { //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { assert!( - env::attached_deposit().ge(&NearToken::from_yoctonear(1)), + env::attached_deposit().ge(&ONE_YOCTONEAR), "Requires attached deposit of at least 1 yoctoNEAR", ) } @@ -77,7 +77,7 @@ pub(crate) fn refund_deposit(storage_used: u128) { let refund = attached_deposit.saturating_sub(required_cost); //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund.gt(&NearToken::from_yoctonear(1)) { + if refund.gt(&ONE_YOCTONEAR) { Promise::new(env::predecessor_account_id()).transfer(refund); } } diff --git a/nft-contract/src/lib.rs b/nft-contract/src/lib.rs index 8fc7b9d..7c81433 100644 --- a/nft-contract/src/lib.rs +++ b/nft-contract/src/lib.rs @@ -29,6 +29,9 @@ pub const NFT_METADATA_SPEC: &str = "1.0.0"; /// This is the name of the NFT standard we're using pub const NFT_STANDARD_NAME: &str = "nep171"; +//Basic NEAR amounts as constants +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize, BorshStorageKey, PanicOnDefault)] #[borsh(crate = "near_sdk::borsh")] diff --git a/nft-contract/src/tests.rs b/nft-contract/src/tests.rs index 847596c..e018ad7 100644 --- a/nft-contract/src/tests.rs +++ b/nft-contract/src/tests.rs @@ -11,6 +11,8 @@ use std::collections::HashMap; const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + fn get_context(predecessor: AccountId) -> VMContextBuilder { let mut builder = VMContextBuilder::new(); @@ -102,7 +104,7 @@ fn test_internal_transfer() { testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(NearToken::from_yoctonear(1)) + .attached_deposit(ONE_YOCTONEAR) .predecessor_account_id(accounts(0)) .build()); contract.internal_transfer( @@ -193,7 +195,7 @@ fn test_nft_revoke() { // alice revokes bob testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(NearToken::from_yoctonear(1)) + .attached_deposit(ONE_YOCTONEAR) .predecessor_account_id(accounts(0)) .build()); contract.nft_revoke(token_id.clone(), accounts(1)); @@ -231,7 +233,7 @@ fn test_revoke_all() { // alice revokes bob testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(NearToken::from_yoctonear(1)) + .attached_deposit(ONE_YOCTONEAR) .predecessor_account_id(accounts(0)) .build()); contract.nft_revoke_all(token_id.clone()); diff --git a/nft-series/src/internal.rs b/nft-series/src/internal.rs index 6a00e46..a3a3e90 100644 --- a/nft-series/src/internal.rs +++ b/nft-series/src/internal.rs @@ -2,6 +2,10 @@ use crate::*; use near_sdk::CryptoHash; use std::mem::size_of; +//Basic NEAR amounts as constants +const ZERO_NEAR: NearToken = NearToken::from_yoctonear(0); +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + //convert the royalty percentage and amount to pay into a payout pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { amount_to_pay.saturating_mul(royalty_percentage) @@ -46,7 +50,7 @@ pub(crate) fn hash_account_id(account_id: &String) -> CryptoHash { pub(crate) fn assert_one_yocto() { assert_eq!( env::attached_deposit(), - NearToken::from_yoctonear(1), + ONE_YOCTONEAR, "Requires attached deposit of exactly 1 yoctoNEAR", ) } @@ -54,7 +58,7 @@ pub(crate) fn assert_one_yocto() { //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { assert!( - env::attached_deposit() >= NearToken::from_yoctonear(1), + env::attached_deposit() >= ONE_YOCTONEAR, "Requires attached deposit of at least 1 yoctoNEAR", ) } @@ -75,7 +79,7 @@ pub(crate) fn payout_series_owner(storage_used: u128, price_per_token: NearToken ); // If there's a price for the token, transfer everything but the storage to the series owner - if price_per_token.gt(&NearToken::from_yoctonear(0)) { + if price_per_token.gt(&ZERO_NEAR) { Promise::new(owner_id).transfer(attached_deposit.saturating_sub(required_cost)); } } @@ -98,7 +102,7 @@ pub(crate) fn refund_deposit(storage_used: u128) { let refund = attached_deposit.saturating_sub(required_cost); //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund.gt(&NearToken::from_yoctonear(1)) { + if refund.gt(&ONE_YOCTONEAR) { Promise::new(env::predecessor_account_id()).transfer(refund); } } From adafdacec85add71cdc408b1b76ece51ea4097b2 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Thu, 21 Mar 2024 15:39:43 +0100 Subject: [PATCH 12/28] migrate integration tests --- integration-tests/rs/Cargo.toml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/integration-tests/rs/Cargo.toml b/integration-tests/rs/Cargo.toml index 2f955b8..2ad1f25 100644 --- a/integration-tests/rs/Cargo.toml +++ b/integration-tests/rs/Cargo.toml @@ -5,19 +5,15 @@ publish = false edition = "2021" [dependencies] -near-sdk = "4.1.1" +near-sdk = { version = "5.0.0", features = ["legacy"] } uint = { version = "0.9.3", default-features = false } -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } - [dev-dependencies] anyhow = "1.0.80" -near-sdk = "4.1.1" - -tokio = { version = "1.36.0", features = ["full"] } -near-workspaces = { version = "0.10.0", default-features = false, features = ["install"] } -serde_json = { version = "1.0.113", features = ["arbitrary_precision"] } +near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" [[example]] From 680463f23b6f63a8cfaf9965eaf50aef27b9d379 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 25 Mar 2024 21:51:33 +0100 Subject: [PATCH 13/28] migration integration tests --- .gitignore | 1 + integration-tests/rs/Cargo.toml | 6 -- integration-tests/rs/rust-toolchain.toml | 2 +- integration-tests/rs/src/helpers.rs | 40 +++----- integration-tests/rs/src/tests.rs | 120 +++++++++++------------ market-contract/Cargo.toml | 2 +- nft-contract/Cargo.toml | 2 +- nft-series/Cargo.toml | 2 +- 8 files changed, 80 insertions(+), 95 deletions(-) diff --git a/.gitignore b/.gitignore index 9ed1da1..e74ad3c 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ notes # misc .DS_Store +.vscode .env.local .env.development.local .env.test.local diff --git a/integration-tests/rs/Cargo.toml b/integration-tests/rs/Cargo.toml index 2ad1f25..76220f3 100644 --- a/integration-tests/rs/Cargo.toml +++ b/integration-tests/rs/Cargo.toml @@ -4,13 +4,7 @@ version = "1.0.0" publish = false edition = "2021" -[dependencies] -near-sdk = { version = "5.0.0", features = ["legacy"] } -uint = { version = "0.9.3", default-features = false } - [dev-dependencies] -anyhow = "1.0.80" -near-sdk = { version = "5.0.0", features = ["unit-testing"] } near-workspaces = { version = "0.10.0", features = ["unstable"] } tokio = { version = "1.12.0", features = ["full"] } serde_json = "1" diff --git a/integration-tests/rs/rust-toolchain.toml b/integration-tests/rs/rust-toolchain.toml index 1371a30..97c2073 100644 --- a/integration-tests/rs/rust-toolchain.toml +++ b/integration-tests/rs/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.76" +channel = "stable" components = ["rustfmt"] targets = ["wasm32-unknown-unknown"] \ No newline at end of file diff --git a/integration-tests/rs/src/helpers.rs b/integration-tests/rs/src/helpers.rs index 32c729d..a8bab32 100644 --- a/integration-tests/rs/src/helpers.rs +++ b/integration-tests/rs/src/helpers.rs @@ -8,7 +8,7 @@ pub async fn mint_nft( user: &Account, nft_contract: &Contract, token_id: &str, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let request_payload = json!({ "token_id": token_id, "receiver_id": user.id(), @@ -33,7 +33,7 @@ pub async fn approve_nft( user: &Account, nft_contract: &Contract, token_id: &str, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let request_payload = json!({ "token_id": token_id, "account_id": market_contract.id(), @@ -52,13 +52,13 @@ pub async fn approve_nft( pub async fn pay_for_storage( user: &Account, market_contract: &Contract, - amount: u128, -) -> anyhow::Result<()> { + amount: NearToken, +) -> Result<(), Box> { let request_payload = json!({}); let _ = user.call(market_contract.id(), "storage_deposit") .args_json(request_payload) - .deposit(NearToken::from_yoctonear(amount)) + .deposit(amount) .transact() .await; @@ -70,8 +70,8 @@ pub async fn place_nft_for_sale( market_contract: &Contract, nft_contract: &Contract, token_id: &str, - price: u128, -) -> anyhow::Result<()> { + price: NearToken, +) -> Result<(), Box> { let request_payload = json!({ "nft_contract_id": nft_contract.id(), "token_id": token_id, @@ -90,9 +90,9 @@ pub async fn place_nft_for_sale( pub async fn get_user_balance( user: &Account, -) -> anyhow::Result { - let details: AccountDetails = user.view_account().await?; - Ok(details.balance.as_yoctonear()) +) -> NearToken { + let details: AccountDetails = user.view_account().await.expect("Account has to have some balance"); + details.balance } pub async fn purchase_listed_nft( @@ -100,8 +100,8 @@ pub async fn purchase_listed_nft( market_contract: &Contract, nft_contract: &Contract, token_id: &str, - offer_price: u128 -) -> anyhow::Result<()> { + offer_price: NearToken +) -> Result<(), Box> { let request_payload = json!({ "token_id": token_id, "nft_contract_id": nft_contract.id(), @@ -110,7 +110,7 @@ pub async fn purchase_listed_nft( let _ = bidder.call(market_contract.id(), "offer") .args_json(request_payload) .max_gas() - .deposit(NearToken::from_yoctonear(offer_price)) + .deposit(offer_price) .transact() .await; @@ -122,7 +122,7 @@ pub async fn transfer_nft( receiver: &Account, nft_contract: &Contract, token_id: &str, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let request_payload = json!({ "token_id": token_id, "receiver_id": receiver.id(), @@ -142,7 +142,7 @@ pub async fn transfer_nft( pub async fn get_nft_token_info( nft_contract: &Contract, token_id: &str, -) -> anyhow::Result { +) -> Result> { let token_info: serde_json::Value = nft_contract .call("nft_token") .args_json(json!({"token_id": token_id})) @@ -152,12 +152,4 @@ pub async fn get_nft_token_info( .unwrap(); Ok(token_info) -} - -pub fn round_to_near_dp( - amount: u128, - sf: u128, -) -> String { - let near_amount = amount as f64 / 1_000_000_000_000_000_000_000_000.0; // yocto in 1 NEAR - return format!("{:.1$}", near_amount, sf as usize); -} +} \ No newline at end of file diff --git a/integration-tests/rs/src/tests.rs b/integration-tests/rs/src/tests.rs index 3df5c99..c28eba5 100644 --- a/integration-tests/rs/src/tests.rs +++ b/integration-tests/rs/src/tests.rs @@ -1,20 +1,18 @@ +use near_workspaces::{types::NearToken, Account, Contract}; use serde_json::json; -use near_workspaces::{types::{NearToken}, Account, Contract}; mod helpers; -const NFT_WASM_FILEPATH: &str = "../../out/main.wasm"; -const MARKET_WASM_FILEPATH: &str = "../../out/market.wasm"; - #[tokio::main] -async fn main() -> anyhow::Result<()> { +async fn main() -> Result<(), Box> { // initiate environemnt let worker = near_workspaces::sandbox().await?; // deploy contracts - let nft_wasm = std::fs::read(NFT_WASM_FILEPATH)?; + let nft_wasm = near_workspaces::compile_project("../../nft-contract/.").await?; let nft_contract = worker.dev_deploy(&nft_wasm).await?; - let market_wasm = std::fs::read(MARKET_WASM_FILEPATH)?; + + let market_wasm = near_workspaces::compile_project("../../market-contract/.").await?; let market_contract = worker.dev_deploy(&market_wasm).await?; // create accounts @@ -65,7 +63,7 @@ async fn main() -> anyhow::Result<()> { async fn test_nft_metadata_view( owner: &Account, contract: &Contract, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let expected = json!({ "base_uri": serde_json::Value::Null, "icon": serde_json::Value::Null, @@ -90,7 +88,7 @@ async fn test_nft_mint_call( owner: &Account, user: &Account, contract: &Contract, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let request_payload = json!({ "token_id": "1", "receiver_id": user.id(), @@ -103,7 +101,7 @@ async fn test_nft_mint_call( let _ = user.call(contract.id(), "nft_mint") .args_json(request_payload) - .deposit(NearToken::from_yoctonear(8000000000000000000000)) + .deposit(NearToken::from_millinear(80)) .transact() .await; @@ -146,7 +144,7 @@ async fn test_nft_approve_call( user: &Account, nft_contract: &Contract, market_contract: &Contract, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let token_id = "2"; helpers::mint_nft(user, nft_contract, token_id).await?; helpers::approve_nft(market_contract, user, nft_contract, token_id).await?; @@ -172,23 +170,24 @@ async fn test_sell_nft_listed_on_marketplace( nft_contract: &Contract, market_contract: &Contract, buyer: &Account, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let token_id = "4"; - let sale_price = 300000000000000000000000 as u128; // 0.3 NEAR in yoctoNEAR + let sale_price: NearToken = NearToken::from_millinear(300); helpers::mint_nft(seller, nft_contract, token_id).await?; - helpers::pay_for_storage(seller, market_contract, 10000000000000000000000 as u128).await?; + helpers::pay_for_storage(seller, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, seller, nft_contract, token_id).await?; helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; - let before_seller_balance: u128 = helpers::get_user_balance(seller).await?; - let before_buyer_balance: u128 = helpers::get_user_balance(buyer).await?; + let before_seller_balance: NearToken = helpers::get_user_balance(seller).await; + let before_buyer_balance: NearToken = helpers::get_user_balance(buyer).await; + helpers::purchase_listed_nft(buyer, market_contract, nft_contract, token_id, sale_price).await?; - let after_seller_balance: u128 = helpers::get_user_balance(seller).await?; - let after_buyer_balance: u128 = helpers::get_user_balance(buyer).await?; - let dp = 1; // being exact requires keeping track of gas usage - assert_eq!(helpers::round_to_near_dp(after_seller_balance, dp), helpers::round_to_near_dp(before_seller_balance + sale_price, dp), "seller did not receive the sale price"); - assert_eq!(helpers::round_to_near_dp(after_buyer_balance, dp), helpers::round_to_near_dp(before_buyer_balance - sale_price, dp), "buyer did not receive the sale price"); + let after_seller_balance: NearToken = helpers::get_user_balance(seller).await; + let after_buyer_balance: NearToken = helpers::get_user_balance(buyer).await; + + assert_eq!(after_seller_balance, before_seller_balance.saturating_add(sale_price), "seller did not receive the sale price"); + assert_eq!(after_buyer_balance, before_buyer_balance.saturating_sub(sale_price), "buyer did not send the sale price"); println!(" Passed ✅ test_sell_nft_listed_on_marketplace"); Ok(()) @@ -200,22 +199,22 @@ async fn test_transfer_nft_when_listed_on_marketplace( second_buyer: &Account, nft_contract: &Contract, market_contract: &Contract, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let token_id = "5"; - let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR + let sale_price = NearToken::from_near(3); helpers::mint_nft(seller, nft_contract, token_id).await?; - helpers::pay_for_storage(seller, market_contract, 10000000000000000000000 as u128).await?; + helpers::pay_for_storage(seller, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, seller, nft_contract, token_id).await?; helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; helpers::transfer_nft(seller, first_buyer, nft_contract, token_id).await?; // attempt purchase NFT - let before_seller_balance: u128 = helpers::get_user_balance(seller).await?; - let before_buyer_balance: u128 = helpers::get_user_balance(second_buyer).await?; + let before_seller_balance: NearToken = helpers::get_user_balance(seller).await; + let before_buyer_balance: NearToken = helpers::get_user_balance(second_buyer).await; helpers::purchase_listed_nft(second_buyer, market_contract, nft_contract, token_id, sale_price).await?; - let after_seller_balance: u128 = helpers::get_user_balance(seller).await?; - let after_buyer_balance: u128 = helpers::get_user_balance(second_buyer).await?; + let after_seller_balance: NearToken = helpers::get_user_balance(seller).await; + let after_buyer_balance: NearToken = helpers::get_user_balance(second_buyer).await; // assert owner remains first_buyer let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; @@ -223,9 +222,8 @@ async fn test_transfer_nft_when_listed_on_marketplace( assert_eq!(owner_id, first_buyer.id().to_string(), "token owner is not first_buyer"); // assert balances remain equal - let dp = 1; - assert_eq!(helpers::round_to_near_dp(after_seller_balance, dp), helpers::round_to_near_dp(before_seller_balance, dp), "seller balance changed"); - assert_eq!(helpers::round_to_near_dp(after_buyer_balance, dp), helpers::round_to_near_dp(before_buyer_balance, dp), "buyer balance changed"); + assert_eq!(after_seller_balance, before_seller_balance, "seller balance changed"); + assert_eq!(after_buyer_balance, before_buyer_balance, "buyer balance changed"); println!(" Passed ✅ test_transfer_nft_when_listed_on_marketplace"); @@ -237,11 +235,11 @@ async fn test_approval_revoke( second_user: &Account, nft_contract: &Contract, market_contract: &Contract, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let token_id = "6"; - let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR + let sale_price = NearToken::from_near(3); helpers::mint_nft(first_user, nft_contract, token_id).await?; - helpers::pay_for_storage(first_user, market_contract, 10000000000000000000000 as u128).await?; + helpers::pay_for_storage(first_user, market_contract, NearToken::from_millinear(10)).await?; helpers::place_nft_for_sale(first_user, market_contract, nft_contract, token_id, sale_price).await?; // nft_revoke market_contract call @@ -256,13 +254,13 @@ async fn test_approval_revoke( .await?; // market_contract attempts to nft_transfer, when second_user tries to purchase NFT on market - let before_seller_balance: u128 = helpers::get_user_balance(first_user).await?; - let before_buyer_balance: u128 = helpers::get_user_balance(second_user).await?; + let before_seller_balance: NearToken = helpers::get_user_balance(first_user).await; + let before_buyer_balance: NearToken = helpers::get_user_balance(second_user).await; helpers::purchase_listed_nft( second_user, market_contract, nft_contract, token_id, sale_price ).await?; - let after_seller_balance: u128 = helpers::get_user_balance(first_user).await?; - let after_buyer_balance: u128 = helpers::get_user_balance(second_user).await?; + let after_seller_balance: NearToken = helpers::get_user_balance(first_user).await; + let after_buyer_balance: NearToken = helpers::get_user_balance(second_user).await; // assert owner remains first_user let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; @@ -270,8 +268,8 @@ async fn test_approval_revoke( assert_eq!(owner_id, first_user.id().to_string(), "token owner is not first_user"); // assert balances unchanged - assert_eq!(helpers::round_to_near_dp(after_seller_balance, 0), helpers::round_to_near_dp(before_seller_balance, 0), "seller balance changed"); - assert_eq!(helpers::round_to_near_dp(after_buyer_balance, 0), helpers::round_to_near_dp(before_buyer_balance, 0), "buyer balance changed"); + assert_eq!(after_seller_balance, before_seller_balance, "seller balance changed"); + assert_eq!(after_buyer_balance, before_buyer_balance, "buyer balance changed"); println!(" Passed ✅ test_approval_revoke"); Ok(()) @@ -283,9 +281,9 @@ async fn test_reselling_and_royalties( second_buyer: &Account, nft_contract: &Contract, market_contract: &Contract, -) -> anyhow::Result<()> { +) -> Result<(), Box> { let token_id = "7"; - let sale_price = 3000000000000000000000000 as u128; // 3 NEAR in yoctoNEAR + let sale_price: NearToken = NearToken::from_near(3); // 3 NEAR in yoctoNEAR // mint with royalties let request_payload = json!({ @@ -306,16 +304,16 @@ async fn test_reselling_and_royalties( .transact() .await; - helpers::pay_for_storage(user, market_contract, 10000000000000000000000 as u128).await?; + helpers::pay_for_storage(user, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, user, nft_contract, token_id).await?; helpers::place_nft_for_sale(user, market_contract, nft_contract, token_id, sale_price).await?; // first_buyer purchases NFT - let mut before_seller_balance: u128 = helpers::get_user_balance(user).await?; - let mut before_buyer_balance: u128 = helpers::get_user_balance(first_buyer).await?; + let mut before_seller_balance: NearToken = helpers::get_user_balance(user).await; + let mut before_buyer_balance: NearToken = helpers::get_user_balance(first_buyer).await; helpers::purchase_listed_nft(first_buyer, market_contract, nft_contract, token_id, sale_price).await?; - let mut after_seller_balance: u128 = helpers::get_user_balance(user).await?; - let mut after_buyer_balance: u128 = helpers::get_user_balance(first_buyer).await?; + let mut after_seller_balance: NearToken = helpers::get_user_balance(user).await; + let mut after_buyer_balance: NearToken = helpers::get_user_balance(first_buyer).await; // assert owner becomes first_buyer let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; @@ -323,23 +321,23 @@ async fn test_reselling_and_royalties( assert_eq!(owner_id, first_buyer.id().to_string(), "token owner is not first_buyer"); // assert balances changed - assert_eq!(helpers::round_to_near_dp(after_seller_balance, 0), helpers::round_to_near_dp(before_seller_balance + sale_price, 0), "seller balance unchanged"); - assert_eq!(helpers::round_to_near_dp(after_buyer_balance, 0), helpers::round_to_near_dp(before_buyer_balance - sale_price, 0), "buyer balance unchanged"); + assert_eq!(after_seller_balance, before_seller_balance.saturating_add(sale_price), "seller balance unchanged"); + assert_eq!(after_buyer_balance, before_buyer_balance.saturating_sub(sale_price), "buyer balance unchanged"); // first buyer lists nft for sale - helpers::pay_for_storage(first_buyer, market_contract, 10000000000000000000000 as u128).await?; + helpers::pay_for_storage(first_buyer, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, first_buyer, nft_contract, token_id).await?; helpers::place_nft_for_sale(first_buyer, market_contract, nft_contract, token_id, sale_price).await?; // second_buyer purchases NFT - let resale_price = sale_price * 5; // 15 NEAR - before_seller_balance = helpers::get_user_balance(first_buyer).await?; - before_buyer_balance = helpers::get_user_balance(second_buyer).await?; - let before_user_balance: u128 = helpers::get_user_balance(user).await?; + let resale_price = sale_price.saturating_mul(5); // 15 NEAR + before_seller_balance = helpers::get_user_balance(first_buyer).await; + before_buyer_balance = helpers::get_user_balance(second_buyer).await; + let before_user_balance: NearToken = helpers::get_user_balance(user).await; helpers::purchase_listed_nft(second_buyer, market_contract, nft_contract, token_id, resale_price).await?; - let after_user_balance: u128 = helpers::get_user_balance(user).await?; - after_seller_balance = helpers::get_user_balance(first_buyer).await?; - after_buyer_balance = helpers::get_user_balance(second_buyer).await?; + let after_user_balance: NearToken = helpers::get_user_balance(user).await; + after_seller_balance = helpers::get_user_balance(first_buyer).await; + after_buyer_balance = helpers::get_user_balance(second_buyer).await; // assert owner changes to second_buyer let token_info: serde_json::Value = helpers::get_nft_token_info(nft_contract, token_id).await?; @@ -347,10 +345,10 @@ async fn test_reselling_and_royalties( assert_eq!(owner_id, second_buyer.id().to_string(), "token owner is not second_buyer"); // assert balances changed - let royalty_fee = resale_price / 5; - assert_eq!(helpers::round_to_near_dp(after_seller_balance, 0), helpers::round_to_near_dp(before_seller_balance + resale_price - royalty_fee, 0), "seller balance unchanged"); - assert_eq!(helpers::round_to_near_dp(after_buyer_balance, 0), helpers::round_to_near_dp(before_buyer_balance - resale_price, 0), "buyer balance unchanged"); - assert_eq!(helpers::round_to_near_dp(after_user_balance, 0), helpers::round_to_near_dp(before_user_balance + royalty_fee, 0), "user balance unchanged"); + let royalty_fee = resale_price.saturating_div(5); + assert_eq!(after_seller_balance, before_seller_balance.saturating_add(resale_price).saturating_sub(royalty_fee), "seller balance unchanged"); + assert_eq!(after_buyer_balance, before_buyer_balance.saturating_sub(resale_price), "buyer balance unchanged"); + assert_eq!(after_user_balance, before_user_balance.saturating_add(royalty_fee), "user balance unchanged"); println!(" Passed ✅ test_reselling_and_royalties"); Ok(()) diff --git a/market-contract/Cargo.toml b/market-contract/Cargo.toml index 6f00e88..4b7b8bf 100644 --- a/market-contract/Cargo.toml +++ b/market-contract/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nft_simple" +name = "nft_market_contract" version = "0.1.0" authors = ["Near Inc "] edition = "2021" diff --git a/nft-contract/Cargo.toml b/nft-contract/Cargo.toml index 169c45f..30d80e7 100644 --- a/nft-contract/Cargo.toml +++ b/nft-contract/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nft_simple" +name = "nft_contract" version = "0.1.0" authors = ["Near Inc "] edition = "2021" diff --git a/nft-series/Cargo.toml b/nft-series/Cargo.toml index 2f12377..7ad0b08 100644 --- a/nft-series/Cargo.toml +++ b/nft-series/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nft_simple" +name = "nft_series_contract" version = "0.1.0" authors = ["Near Inc "] edition = "2021" From 546389fa02ab8ab42c498571a0c90dce18895974 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Fri, 29 Mar 2024 11:23:55 +0100 Subject: [PATCH 14/28] creating several contracts for docs --- .../Cargo.toml | 0 .../README.md | 0 .../res/nft_simple.wasm | Bin .../rust-toolchain.toml | 0 .../src/approval.rs | 0 .../src/enumeration.rs | 0 .../src/events.rs | 0 .../src/internal.rs | 0 .../src/lib.rs | 0 .../src/metadata.rs | 0 .../src/mint.rs | 0 .../src/nft_core.rs | 0 nft-contract-approval/src/royalty.rs | 46 +++ .../src/tests.rs | 0 nft-contract-basic/Cargo.toml | 28 ++ nft-contract-basic/README.md | 1 + nft-contract-basic/res/nft_simple.wasm | Bin 0 -> 211520 bytes nft-contract-basic/rust-toolchain.toml | 4 + nft-contract-basic/src/approval.rs | 73 ++++ nft-contract-basic/src/enumeration.rs | 76 +++++ nft-contract-basic/src/events.rs | 138 ++++++++ nft-contract-basic/src/internal.rs | 235 +++++++++++++ nft-contract-basic/src/lib.rs | 120 +++++++ nft-contract-basic/src/metadata.rs | 82 +++++ nft-contract-basic/src/mint.rs | 81 +++++ nft-contract-basic/src/nft_core.rs | 278 ++++++++++++++++ nft-contract-basic/src/royalty.rs | 46 +++ nft-contract-basic/src/tests.rs | 315 ++++++++++++++++++ nft-contract-royalty/Cargo.toml | 28 ++ nft-contract-royalty/README.md | 1 + nft-contract-royalty/res/nft_simple.wasm | Bin 0 -> 211520 bytes nft-contract-royalty/rust-toolchain.toml | 4 + nft-contract-royalty/src/approval.rs | 174 ++++++++++ nft-contract-royalty/src/enumeration.rs | 76 +++++ nft-contract-royalty/src/events.rs | 138 ++++++++ nft-contract-royalty/src/internal.rs | 235 +++++++++++++ nft-contract-royalty/src/lib.rs | 120 +++++++ nft-contract-royalty/src/metadata.rs | 82 +++++ nft-contract-royalty/src/mint.rs | 81 +++++ nft-contract-royalty/src/nft_core.rs | 278 ++++++++++++++++ .../src/royalty.rs | 0 nft-contract-royalty/src/tests.rs | 315 ++++++++++++++++++ nft-contract-skeleton/Cargo.toml | 22 ++ nft-contract-skeleton/README.md | 1 + nft-contract-skeleton/res/nft_simple.wasm | Bin 0 -> 211520 bytes nft-contract-skeleton/src/approval.rs | 73 ++++ nft-contract-skeleton/src/enumeration.rs | 44 +++ nft-contract-skeleton/src/lib.rs | 72 ++++ nft-contract-skeleton/src/metadata.rs | 58 ++++ nft-contract-skeleton/src/mint.rs | 16 + nft-contract-skeleton/src/nft_core.rs | 113 +++++++ nft-contract-skeleton/src/royalty.rs | 46 +++ 52 files changed, 3500 insertions(+) rename {nft-contract => nft-contract-approval}/Cargo.toml (100%) rename {nft-contract => nft-contract-approval}/README.md (100%) rename {nft-contract => nft-contract-approval}/res/nft_simple.wasm (100%) rename {nft-contract => nft-contract-approval}/rust-toolchain.toml (100%) rename {nft-contract => nft-contract-approval}/src/approval.rs (100%) rename {nft-contract => nft-contract-approval}/src/enumeration.rs (100%) rename {nft-contract => nft-contract-approval}/src/events.rs (100%) rename {nft-contract => nft-contract-approval}/src/internal.rs (100%) rename {nft-contract => nft-contract-approval}/src/lib.rs (100%) rename {nft-contract => nft-contract-approval}/src/metadata.rs (100%) rename {nft-contract => nft-contract-approval}/src/mint.rs (100%) rename {nft-contract => nft-contract-approval}/src/nft_core.rs (100%) create mode 100644 nft-contract-approval/src/royalty.rs rename {nft-contract => nft-contract-approval}/src/tests.rs (100%) create mode 100644 nft-contract-basic/Cargo.toml create mode 100644 nft-contract-basic/README.md create mode 100755 nft-contract-basic/res/nft_simple.wasm create mode 100644 nft-contract-basic/rust-toolchain.toml create mode 100644 nft-contract-basic/src/approval.rs create mode 100644 nft-contract-basic/src/enumeration.rs create mode 100644 nft-contract-basic/src/events.rs create mode 100644 nft-contract-basic/src/internal.rs create mode 100644 nft-contract-basic/src/lib.rs create mode 100644 nft-contract-basic/src/metadata.rs create mode 100644 nft-contract-basic/src/mint.rs create mode 100644 nft-contract-basic/src/nft_core.rs create mode 100644 nft-contract-basic/src/royalty.rs create mode 100644 nft-contract-basic/src/tests.rs create mode 100644 nft-contract-royalty/Cargo.toml create mode 100644 nft-contract-royalty/README.md create mode 100755 nft-contract-royalty/res/nft_simple.wasm create mode 100644 nft-contract-royalty/rust-toolchain.toml create mode 100644 nft-contract-royalty/src/approval.rs create mode 100644 nft-contract-royalty/src/enumeration.rs create mode 100644 nft-contract-royalty/src/events.rs create mode 100644 nft-contract-royalty/src/internal.rs create mode 100644 nft-contract-royalty/src/lib.rs create mode 100644 nft-contract-royalty/src/metadata.rs create mode 100644 nft-contract-royalty/src/mint.rs create mode 100644 nft-contract-royalty/src/nft_core.rs rename {nft-contract => nft-contract-royalty}/src/royalty.rs (100%) create mode 100644 nft-contract-royalty/src/tests.rs create mode 100644 nft-contract-skeleton/Cargo.toml create mode 100644 nft-contract-skeleton/README.md create mode 100755 nft-contract-skeleton/res/nft_simple.wasm create mode 100644 nft-contract-skeleton/src/approval.rs create mode 100644 nft-contract-skeleton/src/enumeration.rs create mode 100644 nft-contract-skeleton/src/lib.rs create mode 100644 nft-contract-skeleton/src/metadata.rs create mode 100644 nft-contract-skeleton/src/mint.rs create mode 100644 nft-contract-skeleton/src/nft_core.rs create mode 100644 nft-contract-skeleton/src/royalty.rs diff --git a/nft-contract/Cargo.toml b/nft-contract-approval/Cargo.toml similarity index 100% rename from nft-contract/Cargo.toml rename to nft-contract-approval/Cargo.toml diff --git a/nft-contract/README.md b/nft-contract-approval/README.md similarity index 100% rename from nft-contract/README.md rename to nft-contract-approval/README.md diff --git a/nft-contract/res/nft_simple.wasm b/nft-contract-approval/res/nft_simple.wasm similarity index 100% rename from nft-contract/res/nft_simple.wasm rename to nft-contract-approval/res/nft_simple.wasm diff --git a/nft-contract/rust-toolchain.toml b/nft-contract-approval/rust-toolchain.toml similarity index 100% rename from nft-contract/rust-toolchain.toml rename to nft-contract-approval/rust-toolchain.toml diff --git a/nft-contract/src/approval.rs b/nft-contract-approval/src/approval.rs similarity index 100% rename from nft-contract/src/approval.rs rename to nft-contract-approval/src/approval.rs diff --git a/nft-contract/src/enumeration.rs b/nft-contract-approval/src/enumeration.rs similarity index 100% rename from nft-contract/src/enumeration.rs rename to nft-contract-approval/src/enumeration.rs diff --git a/nft-contract/src/events.rs b/nft-contract-approval/src/events.rs similarity index 100% rename from nft-contract/src/events.rs rename to nft-contract-approval/src/events.rs diff --git a/nft-contract/src/internal.rs b/nft-contract-approval/src/internal.rs similarity index 100% rename from nft-contract/src/internal.rs rename to nft-contract-approval/src/internal.rs diff --git a/nft-contract/src/lib.rs b/nft-contract-approval/src/lib.rs similarity index 100% rename from nft-contract/src/lib.rs rename to nft-contract-approval/src/lib.rs diff --git a/nft-contract/src/metadata.rs b/nft-contract-approval/src/metadata.rs similarity index 100% rename from nft-contract/src/metadata.rs rename to nft-contract-approval/src/metadata.rs diff --git a/nft-contract/src/mint.rs b/nft-contract-approval/src/mint.rs similarity index 100% rename from nft-contract/src/mint.rs rename to nft-contract-approval/src/mint.rs diff --git a/nft-contract/src/nft_core.rs b/nft-contract-approval/src/nft_core.rs similarity index 100% rename from nft-contract/src/nft_core.rs rename to nft-contract-approval/src/nft_core.rs diff --git a/nft-contract-approval/src/royalty.rs b/nft-contract-approval/src/royalty.rs new file mode 100644 index 0000000..7646f9e --- /dev/null +++ b/nft-contract-approval/src/royalty.rs @@ -0,0 +1,46 @@ +use crate::*; + +pub trait NonFungibleTokenCore { + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + #[payable] + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} diff --git a/nft-contract/src/tests.rs b/nft-contract-approval/src/tests.rs similarity index 100% rename from nft-contract/src/tests.rs rename to nft-contract-approval/src/tests.rs diff --git a/nft-contract-basic/Cargo.toml b/nft-contract-basic/Cargo.toml new file mode 100644 index 0000000..d0ab6ac --- /dev/null +++ b/nft-contract-basic/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "nft_contract_basic" +version = "0.1.0" +authors = ["Near Inc "] +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = { version = "5.1.0", features = ["legacy"] } +serde_json = "1.0.113" + +[dev-dependencies] +near-sdk = { version = "5.1.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" + +[profile.release] +codegen-units = 1 +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +debug = false +panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 +overflow-checks = true diff --git a/nft-contract-basic/README.md b/nft-contract-basic/README.md new file mode 100644 index 0000000..7064491 --- /dev/null +++ b/nft-contract-basic/README.md @@ -0,0 +1 @@ +# TBD diff --git a/nft-contract-basic/res/nft_simple.wasm b/nft-contract-basic/res/nft_simple.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f68c929bd483f1dc1d8f73986c7cdfbd91ce2947 GIT binary patch literal 211520 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 + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool; + + //revoke a specific account from transferring the token on your behalf + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId); + + //revoke all accounts from transferring the token on your behalf + fn nft_revoke_all(&mut self, token_id: TokenId); +} + +#[ext_contract(ext_non_fungible_approval_receiver)] +trait NonFungibleTokenApprovalsReceiver { + //cross contract call to an external contract that is initiated during nft_approve + fn nft_on_approve( + &mut self, + token_id: TokenId, + owner_id: AccountId, + approval_id: u64, + msg: String, + ); +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //allow a specific account ID to approve a token on your behalf + #[payable] + fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) { + /* + FILL THIS IN + */ + } + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //revoke a specific account from transferring the token on your behalf + #[payable] + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { + /* + FILL THIS IN + */ + } + + //revoke all accounts from transferring the token on your behalf + #[payable] + fn nft_revoke_all(&mut self, token_id: TokenId) { + /* + FILL THIS IN + */ + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/enumeration.rs b/nft-contract-basic/src/enumeration.rs new file mode 100644 index 0000000..5d1e0de --- /dev/null +++ b/nft-contract-basic/src/enumeration.rs @@ -0,0 +1,76 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + //Query for the total supply of NFTs on the contract + pub fn nft_total_supply(&self) -> U128 { + //return the length of the token metadata by ID + U128(self.token_metadata_by_id.len() as u128) + } + + //Query for nft tokens on the contract regardless of the owner using pagination + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(U128(0))); + + //iterate through each token using an iterator + self.token_metadata_by_id.keys() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } + + //get the total supply of NFTs for a given owner + pub fn nft_supply_for_owner( + &self, + account_id: AccountId, + ) -> U128 { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + + //if there is some set of tokens, we'll return the length as a U128 + if let Some(tokens_for_owner_set) = tokens_for_owner_set { + U128(tokens_for_owner_set.len() as u128) + } else { + //if there isn't a set of tokens for the passed in account ID, we'll return 0 + U128(0) + } + } + + //Query for all the tokens for an owner + pub fn nft_tokens_for_owner( + &self, + account_id: AccountId, + from_index: Option, + limit: Option, + ) -> Vec { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + //if there is some set of tokens, we'll set the tokens variable equal to that set + let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set + } else { + //if there is no set of tokens, we'll simply return an empty vector. + return vec![]; + }; + + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(U128(0))); + + //iterate through the keys vector + tokens.iter() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } +} diff --git a/nft-contract-basic/src/events.rs b/nft-contract-basic/src/events.rs new file mode 100644 index 0000000..f65a3f4 --- /dev/null +++ b/nft-contract-basic/src/events.rs @@ -0,0 +1,138 @@ +use std::fmt; + +use near_sdk::serde::{Deserialize, Serialize}; + +/// Enum that represents the data type of the EventLog. +/// The enum can either be an NftMint or an NftTransfer. +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "event", content = "data")] +#[serde(rename_all = "snake_case")] +#[serde(crate = "near_sdk::serde")] +#[non_exhaustive] +pub enum EventLogVariant { + NftMint(Vec), + NftTransfer(Vec), +} + +/// Interface to capture data about an event +/// +/// Arguments: +/// * `standard`: name of standard e.g. nep171 +/// * `version`: e.g. 1.0.0 +/// * `event`: associate event data +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct EventLog { + pub standard: String, + pub version: String, + + // `flatten` to not have "event": {} in the JSON, just have the contents of {}. + #[serde(flatten)] + pub event: EventLogVariant, +} + +impl fmt::Display for EventLog { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!( + "EVENT_JSON:{}", + &serde_json::to_string(self).map_err(|_| fmt::Error)? + )) + } +} + +/// An event log to capture token minting +/// +/// Arguments +/// * `owner_id`: "account.near" +/// * `token_ids`: ["1", "abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftMintLog { + pub owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +/// An event log to capture token transfer +/// +/// Arguments +/// * `authorized_id`: approved account to transfer +/// * `old_owner_id`: "owner.near" +/// * `new_owner_id`: "receiver.near" +/// * `token_ids`: ["1", "12345abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftTransferLog { + #[serde(skip_serializing_if = "Option::is_none")] + pub authorized_id: Option, + + pub old_owner_id: String, + pub new_owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn nep_format_vector() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![ + NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }, + NftMintLog { + owner_id: "user1.near".to_owned(), + token_ids: vec!["meme".to_string()], + memo: None, + }, + ]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_mint() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_transfer_all_fields() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + authorized_id: Some("market.near".to_string()), + old_owner_id: "user1.near".to_string(), + new_owner_id: "user2.near".to_string(), + token_ids: vec!["token".to_string()], + memo: Some("Go Team!".to_owned()), + }]), + }; + assert_eq!(expected, log.to_string()); + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/internal.rs b/nft-contract-basic/src/internal.rs new file mode 100644 index 0000000..2432bb7 --- /dev/null +++ b/nft-contract-basic/src/internal.rs @@ -0,0 +1,235 @@ +use crate::*; +use near_sdk::{CryptoHash, NearToken}; +use std::mem::size_of; + +//convert the royalty percentage and amount to pay into a payout +pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { + amount_to_pay.saturating_mul(royalty_percentage) +} + +//calculate how many bytes the account ID is taking up +pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u128 { + // The extra 4 bytes are coming from Borsh serialization to store the length of the string. + account_id.as_str().len() as u128 + 4 + size_of::() as u128 +} + +//refund the storage taken up by passed in approved account IDs and send the funds to the passed in account ID. +pub(crate) fn refund_approved_account_ids_iter<'a, I>( + account_id: AccountId, + approved_account_ids: I, //the approved account IDs must be passed in as an iterator +) -> Promise where I: Iterator { + //get the storage total by going through and summing all the bytes for each approved account IDs + let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + //transfer the account the storage that is released + Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) +} + +//refund a map of approved account IDs and send the funds to the passed in account ID +pub(crate) fn refund_approved_account_ids( + account_id: AccountId, + approved_account_ids: &HashMap, +) -> Promise { + //call the refund_approved_account_ids_iter with the approved account IDs as keys + refund_approved_account_ids_iter(account_id, approved_account_ids.keys()) +} + +//used to generate a unique prefix in our storage collections (this is to avoid data collisions) +pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { + //get the default hash + let mut hash = CryptoHash::default(); + //we hash the account ID and return it + hash.copy_from_slice(&env::sha256(account_id.as_bytes())); + hash +} + +//used to make sure the user attached exactly 1 yoctoNEAR +pub(crate) fn assert_one_yocto() { + assert_eq!( + env::attached_deposit(), + ONE_YOCTONEAR, + "Requires attached deposit of exactly 1 yoctoNEAR", + ) +} + +//Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) +pub(crate) fn assert_at_least_one_yocto() { + assert!( + env::attached_deposit().ge(&ONE_YOCTONEAR), + "Requires attached deposit of at least 1 yoctoNEAR", + ) +} + +//refund the initial deposit based on the amount of storage that was used up +pub(crate) fn refund_deposit(storage_used: u128) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit.saturating_sub(required_cost); + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund.gt(&ONE_YOCTONEAR) { + Promise::new(env::predecessor_account_id()).transfer(refund); + } +} + +impl Contract { + //add a token to the set of tokens an owner has + pub(crate) fn internal_add_token_to_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //get the set of tokens for the given account + let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { + //if the account doesn't have any tokens, we create a new unordered set + UnorderedSet::new( + StorageKey::TokenPerOwnerInner { + //we get a new unique prefix for the collection + account_id_hash: hash_account_id(&account_id), + } + ) + }); + + //we insert the token ID into the set + tokens_set.insert(token_id); + + //we insert that set for the given account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + + //remove a token from an owner (internal method and can't be called directly via CLI). + pub(crate) fn internal_remove_token_from_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //we get the set of tokens that the owner has + let mut tokens_set = self + .tokens_per_owner + .get(account_id) + //if there is no set of tokens for the owner, we panic with the following message: + .expect("Token should be owned by the sender"); + + //we remove the the token_id from the set of tokens + tokens_set.remove(token_id); + + //if the token set is now empty, we remove the owner from the tokens_per_owner collection + if tokens_set.is_empty() { + self.tokens_per_owner.remove(account_id); + } else { + //if the token set is not empty, we simply insert it back for the account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + } + + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + pub(crate) fn internal_transfer( + &mut self, + sender_id: &AccountId, + receiver_id: &AccountId, + token_id: &TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ) -> Token { + //get the token object by passing in the token_id + let token = self.tokens_by_id.get(token_id).expect("No token"); + + //if the sender doesn't equal the owner, we check if the sender is in the approval list + if sender_id != &token.owner_id { + //if the token's approved account IDs doesn't contain the sender, we panic + if !token.approved_account_ids.contains_key(sender_id) { + env::panic_str("Unauthorized"); + } + + // If they included an approval_id, check if the sender's actual approval_id is the same as the one included + if let Some(enforced_approval_id) = approval_id { + //get the actual approval ID + let actual_approval_id = token + .approved_account_ids + .get(sender_id) + //if the sender isn't in the map, we panic + .expect("Sender is not approved account"); + + //make sure that the actual approval ID is the same as the one provided + assert_eq!( + actual_approval_id, &enforced_approval_id, + "The actual approval_id {} is different from the given approval_id {}", + actual_approval_id, enforced_approval_id, + ); + } + } + + //we make sure that the sender isn't sending the token to themselves + assert_ne!( + &token.owner_id, receiver_id, + "The token owner and the receiver should be different" + ); + + //we remove the token from it's current owner's set + self.internal_remove_token_from_owner(&token.owner_id, token_id); + //we then add the token to the receiver_id's set + self.internal_add_token_to_owner(receiver_id, token_id); + + //we create a new token struct + let new_token = Token { + owner_id: receiver_id.clone(), + //reset the approval account IDs + approved_account_ids: Default::default(), + next_approval_id: token.next_approval_id, + //we copy over the royalties from the previous token + royalty: token.royalty.clone(), + }; + //insert that new token into the tokens_by_id, replacing the old entry + self.tokens_by_id.insert(token_id, &new_token); + + //if there was some memo attached, we log it. + if let Some(memo) = memo.as_ref() { + env::log_str(&format!("Memo: {}", memo).to_string()); + } + + // Default the authorized ID to be None for the logs. + let mut authorized_id = None; + //if the approval ID was provided, set the authorized ID equal to the sender + if approval_id.is_some() { + authorized_id = Some(sender_id.to_string()); + } + + // Construct the transfer log as per the events standard. + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: token.owner_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: receiver_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_transfer_log.to_string()); + + //return the previous token object that was transferred. + token + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/lib.rs b/nft-contract-basic/src/lib.rs new file mode 100644 index 0000000..366fa65 --- /dev/null +++ b/nft-contract-basic/src/lib.rs @@ -0,0 +1,120 @@ +use std::collections::HashMap; +use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; +use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; +use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema +}; + +use crate::internal::*; +pub use crate::metadata::*; +pub use crate::mint::*; +pub use crate::nft_core::*; +pub use crate::approval::*; +pub use crate::royalty::*; +pub use crate::events::*; + +mod internal; +mod approval; +mod enumeration; +mod metadata; +mod mint; +mod nft_core; +mod royalty; +mod events; + +/// This spec can be treated like a version of the standard. +pub const NFT_METADATA_SPEC: &str = "1.0.0"; +/// This is the name of the NFT standard we're using +pub const NFT_STANDARD_NAME: &str = "nep171"; + +//Basic NEAR amounts as constants +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + +#[near_bindgen] +#[derive(BorshSerialize, BorshDeserialize, BorshStorageKey, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Contract { + //contract owner + pub owner_id: AccountId, + + //keeps track of all the token IDs for a given account + pub tokens_per_owner: LookupMap>, + + //keeps track of the token struct for a given token ID + pub tokens_by_id: LookupMap, + + //keeps track of the token metadata for a given token ID + pub token_metadata_by_id: UnorderedMap, + + //keeps track of the metadata for the contract + pub metadata: LazyOption, +} + +/// Helper structure for keys of the persistent collections. +#[derive(BorshSerialize, BorshStorageKey)] +#[borsh(crate = "near_sdk::borsh")] +pub enum StorageKey { + TokensPerOwner, + TokenPerOwnerInner { account_id_hash: CryptoHash }, + TokensById, + TokenMetadataById, + NFTContractMetadata, + TokensPerType, + TokensPerTypeInner { token_type_hash: CryptoHash }, + TokenTypesLocked, +} + +#[near_bindgen] +impl Contract { + /* + initialization function (can only be called once). + this initializes the contract with default metadata so the + user doesn't have to manually type metadata. + */ + #[init] + pub fn new_default_meta(owner_id: AccountId) -> Self { + //calls the other function "new: with some default metadata and the owner_id passed in + Self::new( + owner_id, + NFTContractMetadata { + spec: "nft-1.0.0".to_string(), + name: "NFT Tutorial Contract".to_string(), + symbol: "GOTEAM".to_string(), + icon: None, + base_uri: None, + reference: None, + reference_hash: None, + }, + ) + } + + /* + initialization function (can only be called once). + this initializes the contract with metadata that was passed in and + the owner_id. + */ + #[init] + pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { + //create a variable of type Self with all the fields initialized. + let this = Self { + //Storage keys are simply the prefixes used for the collections. This helps avoid data collision + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: LookupMap::new(StorageKey::TokensById), + token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), + //set the owner_id field equal to the passed in owner_id. + owner_id, + metadata: LazyOption::new( + StorageKey::NFTContractMetadata, + Some(&metadata), + ), + }; + + //return the Contract object + this + } +} + +#[cfg(test)] +mod tests; \ No newline at end of file diff --git a/nft-contract-basic/src/metadata.rs b/nft-contract-basic/src/metadata.rs new file mode 100644 index 0000000..404d701 --- /dev/null +++ b/nft-contract-basic/src/metadata.rs @@ -0,0 +1,82 @@ +use crate::*; + +pub type TokenId = String; + +//defines the payout type we'll be returning as a part of the royalty standards. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct Payout { + pub payout: HashMap, +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct NFTContractMetadata { + pub spec: String, // required, essentially a version like "nft-1.0.0" + pub name: String, // required, ex. "Mosaics" + pub symbol: String, // required, ex. "MOSAIC" + pub icon: Option, // Data URL + pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs + pub reference: Option, // URL to a JSON file with more info + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct TokenMetadata { + pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + pub description: Option, // free-form description + pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage + pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + pub copies: Option, // number of copies of this set of metadata in existence when token was minted. + pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds + pub expires_at: Option, // When token expires, Unix epoch in milliseconds + pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds + pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds + pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. + pub reference: Option, // URL to an off-chain JSON file with more info. + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Token { + //owner of the token + pub owner_id: AccountId, + //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID + pub approved_account_ids: HashMap, + //the next approval ID to give out. + pub next_approval_id: u64, + //keep track of the royalty percentages for the token in a hash map + pub royalty: HashMap, +} + +//The Json token is what will be returned from view calls. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct JsonToken { + //token ID + pub token_id: TokenId, + //owner of the token + pub owner_id: AccountId, + //token metadata + pub metadata: TokenMetadata, + //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID + pub approved_account_ids: HashMap, + //keep track of the royalty percentages for the token in a hash map + pub royalty: HashMap, +} + +pub trait NonFungibleTokenMetadata { + //view call for returning the contract metadata + fn nft_metadata(&self) -> NFTContractMetadata; +} + +#[near_bindgen] +impl NonFungibleTokenMetadata for Contract { + fn nft_metadata(&self) -> NFTContractMetadata { + self.metadata.get().unwrap() + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/mint.rs b/nft-contract-basic/src/mint.rs new file mode 100644 index 0000000..37e71ef --- /dev/null +++ b/nft-contract-basic/src/mint.rs @@ -0,0 +1,81 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + #[payable] + pub fn nft_mint( + &mut self, + token_id: TokenId, + metadata: TokenMetadata, + receiver_id: AccountId, + //we add an optional parameter for perpetual royalties + perpetual_royalties: Option>, + ) { + //measure the initial storage being used on the contract + let initial_storage_usage = env::storage_usage(); + + // create a royalty map to store in the token + let mut royalty = HashMap::new(); + + // if perpetual royalties were passed into the function: + if let Some(perpetual_royalties) = perpetual_royalties { + //make sure that the length of the perpetual royalties is below 7 since we won't have enough GAS to pay out that many people + assert!(perpetual_royalties.len() < 7, "Cannot add more than 6 perpetual royalty amounts"); + + //iterate through the perpetual royalties and insert the account and amount in the royalty map + for (account, amount) in perpetual_royalties { + royalty.insert(account, amount); + } + } + + //specify the token struct that contains the owner ID + let token = Token { + //set the owner ID equal to the receiver ID passed into the function + owner_id: receiver_id, + //we set the approved account IDs to the default value (an empty map) + approved_account_ids: Default::default(), + //the next approval ID is set to 0 + next_approval_id: 0, + //the map of perpetual royalties for the token (The owner will get 100% - total perpetual royalties) + royalty, + }; + + //insert the token ID and token struct and make sure that the token doesn't exist + assert!( + self.tokens_by_id.insert(&token_id, &token).is_none(), + "Token already exists" + ); + + //insert the token ID and metadata + self.token_metadata_by_id.insert(&token_id, &metadata); + + //call the internal method for adding the token to the owner + self.internal_add_token_to_owner(&token.owner_id, &token_id); + + // Construct the mint log as per the events standard. + let nft_mint_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftMint(vec![NftMintLog { + // Owner of the token. + owner_id: token.owner_id.to_string(), + // Vector of token IDs that were minted. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo: None, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_mint_log.to_string()); + + //calculate the required storage which was the used - initial + let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; + + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. + refund_deposit(required_storage_in_bytes.into()); + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/nft_core.rs b/nft-contract-basic/src/nft_core.rs new file mode 100644 index 0000000..1ebc55e --- /dev/null +++ b/nft-contract-basic/src/nft_core.rs @@ -0,0 +1,278 @@ +use crate::*; +use near_sdk::{ext_contract, Gas, PromiseResult}; + +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); + +pub trait NonFungibleTokenCore { + //transfers an NFT to a receiver ID + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ); + + // Transfers an NFT to a receiver and calls the + // function `nft_on_transfer` on their contract. + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + msg: String, + ) -> PromiseOrValue; + + //get information about the NFT token passed in + fn nft_token(&self, token_id: TokenId) -> Option; +} + +#[ext_contract(ext_non_fungible_token_receiver)] +trait NonFungibleTokenReceiver { + //Method stored on the receiver contract that is called via cross contract call when nft_transfer_call is called + /// Returns `true` if the token should be returned back to the sender. + fn nft_on_transfer( + &mut self, + sender_id: AccountId, + previous_owner_id: AccountId, + token_id: TokenId, + msg: String, + ) -> Promise; +} + +#[ext_contract(ext_self)] +/* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method +*/ +trait NonFungibleTokenResolver { + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce the approval map so we can keep track of what the approvals were before the transfer + approved_account_ids: HashMap, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //implementation of the nft_transfer method. This transfers the NFT from the current owner to the receiver. + #[payable] + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ) { + //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. + assert_one_yocto(); + //get the sender to transfer the token from the sender to the receiver + let sender_id = env::predecessor_account_id(); + + //call the internal transfer method and get back the previous token so we can refund the approved account IDs + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + approval_id, + memo, + ); + + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids( + previous_token.owner_id.clone(), + &previous_token.approved_account_ids, + ); + } + + //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract + #[payable] + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + msg: String, + ) -> PromiseOrValue { + //assert that the user attached exactly 1 yocto for security reasons. + assert_one_yocto(); + + //get the sender ID + let sender_id = env::predecessor_account_id(); + + //transfer the token and get the previous token object + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + approval_id, + memo.clone(), + ); + + //default the authorized_id to none + let mut authorized_id = None; + //if the sender isn't the owner of the token, we set the authorized ID equal to the sender. + if sender_id != previous_token.owner_id { + authorized_id = Some(sender_id.to_string()); + } + + // Initiating receiver's call and the callback + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. + ext_non_fungible_token_receiver::ext(receiver_id.clone()) + .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) + .nft_on_transfer( + sender_id, + previous_token.owner_id.clone(), + token_id.clone(), + msg + ) + // We then resolve the promise and call nft_resolve_transfer on our own contract + .then( + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer + Self::ext(env::current_account_id()) + .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) + .nft_resolve_transfer( + authorized_id, // we introduce an authorized ID so that we can log the transfer + previous_token.owner_id, + receiver_id, + token_id, + previous_token.approved_account_ids, + memo, // we introduce a memo for logging in the events standard + ) + ).into() + } + + //get the information for a specific token ID + fn nft_token(&self, token_id: TokenId) -> Option { + //if there is some token ID in the tokens_by_id collection + if let Some(token) = self.tokens_by_id.get(&token_id) { + //we'll get the metadata for that token + let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); + //we return the JsonToken (wrapped by Some since we return an option) + Some(JsonToken { + token_id, + owner_id: token.owner_id, + metadata, + approved_account_ids: token.approved_account_ids, + royalty: token.royalty, + }) + } else { //if there wasn't a token ID in the tokens_by_id collection, we return None + None + } + } +} + +#[near_bindgen] +impl NonFungibleTokenResolver for Contract { + //resolves the cross contract call when calling nft_on_transfer in the nft_transfer_call method + //returns true if the token was successfully transferred to the receiver_id + #[private] + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce the approval map so we can keep track of what the approvals were before the transfer + approved_account_ids: HashMap, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool { + // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` + // call result. + if let PromiseResult::Successful(value) = env::promise_result(0) { + //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not + if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { + //if we need don't need to return the token, we simply return true meaning everything went fine + if !return_token { + /* + since we've already transferred the token and nft_on_transfer returned false, we don't have to + revert the original transfer and thus we can just return true since nothing went wrong. + */ + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + return true; + } + } + } + + //get the token object if there is some token object + let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { + if token.owner_id != receiver_id { + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + // The token is not owner by the receiver anymore. Can't return it. + return true; + } + token + //if there isn't a token object, it was burned and so we return true + } else { + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + return true; + }; + + //we remove the token from the receiver + self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); + //we add the token to the original owner + self.internal_add_token_to_owner(&owner_id, &token_id); + + //we change the token struct's owner to be the original owner + token.owner_id = owner_id.clone(); + + //we refund the receiver any approved account IDs that they may have set on the token + refund_approved_account_ids(receiver_id.clone(), &token.approved_account_ids); + //reset the approved account IDs to what they were before the transfer + token.approved_account_ids = approved_account_ids; + + //we inset the token back into the tokens_by_id collection + self.tokens_by_id.insert(&token_id, &token); + + /* + We need to log that the NFT was reverted back to the original owner. + The old_owner_id will be the receiver and the new_owner_id will be the + original owner of the token since we're reverting the transfer. + */ + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: receiver_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: owner_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + //we perform the actual logging + env::log_str(&nft_transfer_log.to_string()); + + //return false + false + } +} diff --git a/nft-contract-basic/src/royalty.rs b/nft-contract-basic/src/royalty.rs new file mode 100644 index 0000000..7646f9e --- /dev/null +++ b/nft-contract-basic/src/royalty.rs @@ -0,0 +1,46 @@ +use crate::*; + +pub trait NonFungibleTokenCore { + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + #[payable] + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} diff --git a/nft-contract-basic/src/tests.rs b/nft-contract-basic/src/tests.rs new file mode 100644 index 0000000..e018ad7 --- /dev/null +++ b/nft-contract-basic/src/tests.rs @@ -0,0 +1,315 @@ +/* unit tests */ +#[cfg(test)] +use crate::Contract; +use crate::TokenMetadata; +use crate::approval::NonFungibleTokenCore; +use near_sdk::json_types::{U128, U64}; +use near_sdk::test_utils::{accounts, VMContextBuilder}; +use near_sdk::{testing_env, NearToken}; +use near_sdk::{env, AccountId}; +use std::collections::HashMap; + +const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); +const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + + +fn get_context(predecessor: AccountId) -> VMContextBuilder { + let mut builder = VMContextBuilder::new(); + builder.predecessor_account_id(predecessor); + builder +} + +fn sample_token_metadata() -> TokenMetadata { + TokenMetadata { + title: Some("Olympus Mons".into()), + description: Some("The tallest mountain in the charted solar system".into()), + media: None, + media_hash: None, + copies: Some(1u64), + issued_at: None, + expires_at: None, + starts_at: None, + updated_at: None, + extra: None, + reference: None, + reference_hash: None, + } +} + +#[test] +#[should_panic(expected = "The contract is not initialized")] +fn test_default() { + let context = get_context(accounts(1)); + testing_env!(context.build()); + let _contract = Contract::default(); +} + +#[test] +fn test_new_account_contract() { + let mut context = get_context(accounts(1)); + testing_env!(context.build()); + let contract = Contract::new_default_meta(accounts(1).into()); + testing_env!(context.is_view(true).build()); + let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); + assert_eq!(contract_nft_tokens.len(), 0); +} + +#[test] +fn test_mint_nft() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_metadata: TokenMetadata = sample_token_metadata(); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), token_metadata, accounts(0), None); + let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); + assert_eq!(contract_nft_tokens.len(), 1); + + assert_eq!(contract_nft_tokens[0].token_id, token_id); + assert_eq!(contract_nft_tokens[0].owner_id, accounts(0)); + assert_eq!( + contract_nft_tokens[0].metadata.title, + sample_token_metadata().title + ); + assert_eq!( + contract_nft_tokens[0].metadata.description, + sample_token_metadata().description + ); + assert_eq!( + contract_nft_tokens[0].metadata.media, + sample_token_metadata().media + ); + assert_eq!(contract_nft_tokens[0].approved_account_ids, HashMap::new()); +} + +#[test] +fn test_internal_transfer() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(ONE_YOCTONEAR) + .predecessor_account_id(accounts(0)) + .build()); + contract.internal_transfer( + &accounts(0), + &accounts(1), + &token_id.clone(), + Some(U64(1).0), + None, + ); + + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_yoctonear(0)) + .build()); + + let tokens = contract.nft_tokens_for_owner(accounts(1), Some(U128(0)), None); + assert_ne!( + tokens.len(), + 0, + "Token not correctly created and/or sent to second account" + ); + let token = &tokens[0]; + assert_eq!(token.token_id, token_id); + assert_eq!(token.owner_id, accounts(1)); + assert_eq!(token.metadata.title, sample_token_metadata().title); + assert_eq!( + token.metadata.description, + sample_token_metadata().description + ); + assert_eq!(token.metadata.media, sample_token_metadata().media); + assert_eq!(token.approved_account_ids, HashMap::new()); +} + +#[test] +fn test_nft_approve() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_near(0)) + .build()); + assert!(contract.nft_is_approved(token_id.clone(), accounts(1), None)); +} + +#[test] +fn test_nft_revoke() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + // alice approves bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + // alice revokes bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(ONE_YOCTONEAR) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_revoke(token_id.clone(), accounts(1)); + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_near(0)) + .build()); + assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), None)); +} + +#[test] +fn test_revoke_all() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + // alice approves bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + // alice revokes bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(ONE_YOCTONEAR) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_revoke_all(token_id.clone()); + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_near(0)) + .build()); + assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), Some(1))); +} + +#[test] +fn test_internal_remove_token_from_owner() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + let contract_nft_tokens_before = contract.nft_tokens_for_owner(accounts(0), None, None); + assert_eq!(contract_nft_tokens_before.len(), 1); + + contract.internal_remove_token_from_owner(&accounts(0), &token_id); + let contract_nft_tokens_after = contract.nft_tokens_for_owner(accounts(0), None, None); + assert_eq!(contract_nft_tokens_after.len(), 0); +} + +#[test] +fn test_nft_payout() { + use crate::royalty::NonFungibleTokenCore; + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + // alice approves bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + let payout = contract.nft_payout(token_id.clone(), NearToken::from_millinear(10), 1); + let expected = HashMap::from([(accounts(0), NearToken::from_near(100))]); + assert_eq!(payout.payout, expected); +} + +#[test] +fn test_nft_total_supply() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + let total_supply = contract.nft_total_supply(); + assert_eq!(total_supply, U128(1)); +} \ No newline at end of file diff --git a/nft-contract-royalty/Cargo.toml b/nft-contract-royalty/Cargo.toml new file mode 100644 index 0000000..30d80e7 --- /dev/null +++ b/nft-contract-royalty/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "nft_contract" +version = "0.1.0" +authors = ["Near Inc "] +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = { version = "5.0.0", features = ["legacy"] } +serde_json = "1.0.113" + +[dev-dependencies] +near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" + +[profile.release] +codegen-units = 1 +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +debug = false +panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 +overflow-checks = true diff --git a/nft-contract-royalty/README.md b/nft-contract-royalty/README.md new file mode 100644 index 0000000..7064491 --- /dev/null +++ b/nft-contract-royalty/README.md @@ -0,0 +1 @@ +# TBD diff --git a/nft-contract-royalty/res/nft_simple.wasm b/nft-contract-royalty/res/nft_simple.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f68c929bd483f1dc1d8f73986c7cdfbd91ce2947 GIT binary patch literal 211520 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 + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool; + + //revoke a specific account from transferring the token on your behalf + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId); + + //revoke all accounts from transferring the token on your behalf + fn nft_revoke_all(&mut self, token_id: TokenId); +} + +#[ext_contract(ext_non_fungible_approval_receiver)] +trait NonFungibleTokenApprovalsReceiver { + //cross contract call to an external contract that is initiated during nft_approve + fn nft_on_approve( + &mut self, + token_id: TokenId, + owner_id: AccountId, + approval_id: u64, + msg: String, + ); +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //allow a specific account ID to approve a token on your behalf + #[payable] + fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) { + /* + assert at least one yocto for security reasons - this will cause a redirect to the NEAR wallet. + The user needs to attach enough to pay for storage on the contract + */ + assert_at_least_one_yocto(); + + //get the token object from the token ID + let mut token = self.tokens_by_id.get(&token_id).expect("No token"); + + //make sure that the person calling the function is the owner of the token + assert_eq!( + &env::predecessor_account_id(), + &token.owner_id, + "Predecessor must be the token owner." + ); + + //get the next approval ID if we need a new approval + let approval_id: u64 = token.next_approval_id; + + //check if the account has been approved already for this token + let is_new_approval = token + .approved_account_ids + //insert returns none if the key was not present. + .insert(account_id.clone(), approval_id) + //if the key was not present, .is_none() will return true so it is a new approval. + .is_none(); + + //if it was a new approval, we need to calculate how much storage is being used to add the account. + let storage_used = if is_new_approval { + bytes_for_approved_account_id(&account_id) + //if it was not a new approval, we used no storage. + } else { + 0 + }; + + //increment the token's next approval ID by 1 + token.next_approval_id += 1; + //insert the token back into the tokens_by_id collection + self.tokens_by_id.insert(&token_id, &token); + + //refund any excess storage attached by the user. If the user didn't attach enough, panic. + refund_deposit(storage_used.into()); + + //if some message was passed into the function, we initiate a cross contract call on the + //account we're giving access to. + if let Some(msg) = msg { + // Defaulting GAS weight to 1, no attached deposit, and no static GAS to attach. + ext_non_fungible_approval_receiver::ext(account_id) + .nft_on_approve( + token_id, + token.owner_id, + approval_id, + msg + ).as_return(); + } + } + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool { + //get the token object from the token_id + let token = self.tokens_by_id.get(&token_id).expect("No token"); + + //get the approval number for the passed in account ID + let approval = token.approved_account_ids.get(&approved_account_id); + + //if there was some approval ID found for the account ID + if let Some(approval) = approval { + //if a specific approval_id was passed into the function + if let Some(approval_id) = approval_id { + //return if the approval ID passed in matches the actual approval ID for the account + approval_id == *approval + //if there was no approval_id passed into the function, we simply return true + } else { + true + } + //if there was no approval ID found for the account ID, we simply return false + } else { + false + } + } + + //revoke a specific account from transferring the token on your behalf + #[payable] + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { + //assert that the user attached exactly 1 yoctoNEAR for security reasons + assert_one_yocto(); + //get the token object using the passed in token_id + let mut token = self.tokens_by_id.get(&token_id).expect("No token"); + + //get the caller of the function and assert that they are the owner of the token + let predecessor_account_id = env::predecessor_account_id(); + assert_eq!(&predecessor_account_id, &token.owner_id); + + //if the account ID was in the token's approval, we remove it and the if statement logic executes + if token + .approved_account_ids + .remove(&account_id) + .is_some() + { + //refund the funds released by removing the approved_account_id to the caller of the function + refund_approved_account_ids_iter(predecessor_account_id, [account_id].iter()); + + //insert the token back into the tokens_by_id collection with the account_id removed from the approval list + self.tokens_by_id.insert(&token_id, &token); + } + } + + //revoke all accounts from transferring the token on your behalf + #[payable] + fn nft_revoke_all(&mut self, token_id: TokenId) { + //assert that the caller attached exactly 1 yoctoNEAR for security + assert_one_yocto(); + + //get the token object from the passed in token ID + let mut token = self.tokens_by_id.get(&token_id).expect("No token"); + //get the caller and make sure they are the owner of the tokens + let predecessor_account_id = env::predecessor_account_id(); + assert_eq!(&predecessor_account_id, &token.owner_id); + + //only revoke if the approved account IDs for the token is not empty + if !token.approved_account_ids.is_empty() { + //refund the approved account IDs to the caller of the function + refund_approved_account_ids(predecessor_account_id, &token.approved_account_ids); + //clear the approved account IDs + token.approved_account_ids.clear(); + //insert the token back into the tokens_by_id collection with the approved account IDs cleared + self.tokens_by_id.insert(&token_id, &token); + } + } +} \ No newline at end of file diff --git a/nft-contract-royalty/src/enumeration.rs b/nft-contract-royalty/src/enumeration.rs new file mode 100644 index 0000000..5d1e0de --- /dev/null +++ b/nft-contract-royalty/src/enumeration.rs @@ -0,0 +1,76 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + //Query for the total supply of NFTs on the contract + pub fn nft_total_supply(&self) -> U128 { + //return the length of the token metadata by ID + U128(self.token_metadata_by_id.len() as u128) + } + + //Query for nft tokens on the contract regardless of the owner using pagination + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(U128(0))); + + //iterate through each token using an iterator + self.token_metadata_by_id.keys() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } + + //get the total supply of NFTs for a given owner + pub fn nft_supply_for_owner( + &self, + account_id: AccountId, + ) -> U128 { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + + //if there is some set of tokens, we'll return the length as a U128 + if let Some(tokens_for_owner_set) = tokens_for_owner_set { + U128(tokens_for_owner_set.len() as u128) + } else { + //if there isn't a set of tokens for the passed in account ID, we'll return 0 + U128(0) + } + } + + //Query for all the tokens for an owner + pub fn nft_tokens_for_owner( + &self, + account_id: AccountId, + from_index: Option, + limit: Option, + ) -> Vec { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + //if there is some set of tokens, we'll set the tokens variable equal to that set + let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set + } else { + //if there is no set of tokens, we'll simply return an empty vector. + return vec![]; + }; + + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(U128(0))); + + //iterate through the keys vector + tokens.iter() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } +} diff --git a/nft-contract-royalty/src/events.rs b/nft-contract-royalty/src/events.rs new file mode 100644 index 0000000..f65a3f4 --- /dev/null +++ b/nft-contract-royalty/src/events.rs @@ -0,0 +1,138 @@ +use std::fmt; + +use near_sdk::serde::{Deserialize, Serialize}; + +/// Enum that represents the data type of the EventLog. +/// The enum can either be an NftMint or an NftTransfer. +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "event", content = "data")] +#[serde(rename_all = "snake_case")] +#[serde(crate = "near_sdk::serde")] +#[non_exhaustive] +pub enum EventLogVariant { + NftMint(Vec), + NftTransfer(Vec), +} + +/// Interface to capture data about an event +/// +/// Arguments: +/// * `standard`: name of standard e.g. nep171 +/// * `version`: e.g. 1.0.0 +/// * `event`: associate event data +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct EventLog { + pub standard: String, + pub version: String, + + // `flatten` to not have "event": {} in the JSON, just have the contents of {}. + #[serde(flatten)] + pub event: EventLogVariant, +} + +impl fmt::Display for EventLog { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!( + "EVENT_JSON:{}", + &serde_json::to_string(self).map_err(|_| fmt::Error)? + )) + } +} + +/// An event log to capture token minting +/// +/// Arguments +/// * `owner_id`: "account.near" +/// * `token_ids`: ["1", "abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftMintLog { + pub owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +/// An event log to capture token transfer +/// +/// Arguments +/// * `authorized_id`: approved account to transfer +/// * `old_owner_id`: "owner.near" +/// * `new_owner_id`: "receiver.near" +/// * `token_ids`: ["1", "12345abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftTransferLog { + #[serde(skip_serializing_if = "Option::is_none")] + pub authorized_id: Option, + + pub old_owner_id: String, + pub new_owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn nep_format_vector() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![ + NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }, + NftMintLog { + owner_id: "user1.near".to_owned(), + token_ids: vec!["meme".to_string()], + memo: None, + }, + ]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_mint() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_transfer_all_fields() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + authorized_id: Some("market.near".to_string()), + old_owner_id: "user1.near".to_string(), + new_owner_id: "user2.near".to_string(), + token_ids: vec!["token".to_string()], + memo: Some("Go Team!".to_owned()), + }]), + }; + assert_eq!(expected, log.to_string()); + } +} \ No newline at end of file diff --git a/nft-contract-royalty/src/internal.rs b/nft-contract-royalty/src/internal.rs new file mode 100644 index 0000000..2432bb7 --- /dev/null +++ b/nft-contract-royalty/src/internal.rs @@ -0,0 +1,235 @@ +use crate::*; +use near_sdk::{CryptoHash, NearToken}; +use std::mem::size_of; + +//convert the royalty percentage and amount to pay into a payout +pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { + amount_to_pay.saturating_mul(royalty_percentage) +} + +//calculate how many bytes the account ID is taking up +pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u128 { + // The extra 4 bytes are coming from Borsh serialization to store the length of the string. + account_id.as_str().len() as u128 + 4 + size_of::() as u128 +} + +//refund the storage taken up by passed in approved account IDs and send the funds to the passed in account ID. +pub(crate) fn refund_approved_account_ids_iter<'a, I>( + account_id: AccountId, + approved_account_ids: I, //the approved account IDs must be passed in as an iterator +) -> Promise where I: Iterator { + //get the storage total by going through and summing all the bytes for each approved account IDs + let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + //transfer the account the storage that is released + Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) +} + +//refund a map of approved account IDs and send the funds to the passed in account ID +pub(crate) fn refund_approved_account_ids( + account_id: AccountId, + approved_account_ids: &HashMap, +) -> Promise { + //call the refund_approved_account_ids_iter with the approved account IDs as keys + refund_approved_account_ids_iter(account_id, approved_account_ids.keys()) +} + +//used to generate a unique prefix in our storage collections (this is to avoid data collisions) +pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { + //get the default hash + let mut hash = CryptoHash::default(); + //we hash the account ID and return it + hash.copy_from_slice(&env::sha256(account_id.as_bytes())); + hash +} + +//used to make sure the user attached exactly 1 yoctoNEAR +pub(crate) fn assert_one_yocto() { + assert_eq!( + env::attached_deposit(), + ONE_YOCTONEAR, + "Requires attached deposit of exactly 1 yoctoNEAR", + ) +} + +//Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) +pub(crate) fn assert_at_least_one_yocto() { + assert!( + env::attached_deposit().ge(&ONE_YOCTONEAR), + "Requires attached deposit of at least 1 yoctoNEAR", + ) +} + +//refund the initial deposit based on the amount of storage that was used up +pub(crate) fn refund_deposit(storage_used: u128) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit.saturating_sub(required_cost); + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund.gt(&ONE_YOCTONEAR) { + Promise::new(env::predecessor_account_id()).transfer(refund); + } +} + +impl Contract { + //add a token to the set of tokens an owner has + pub(crate) fn internal_add_token_to_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //get the set of tokens for the given account + let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { + //if the account doesn't have any tokens, we create a new unordered set + UnorderedSet::new( + StorageKey::TokenPerOwnerInner { + //we get a new unique prefix for the collection + account_id_hash: hash_account_id(&account_id), + } + ) + }); + + //we insert the token ID into the set + tokens_set.insert(token_id); + + //we insert that set for the given account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + + //remove a token from an owner (internal method and can't be called directly via CLI). + pub(crate) fn internal_remove_token_from_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //we get the set of tokens that the owner has + let mut tokens_set = self + .tokens_per_owner + .get(account_id) + //if there is no set of tokens for the owner, we panic with the following message: + .expect("Token should be owned by the sender"); + + //we remove the the token_id from the set of tokens + tokens_set.remove(token_id); + + //if the token set is now empty, we remove the owner from the tokens_per_owner collection + if tokens_set.is_empty() { + self.tokens_per_owner.remove(account_id); + } else { + //if the token set is not empty, we simply insert it back for the account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + } + + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + pub(crate) fn internal_transfer( + &mut self, + sender_id: &AccountId, + receiver_id: &AccountId, + token_id: &TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ) -> Token { + //get the token object by passing in the token_id + let token = self.tokens_by_id.get(token_id).expect("No token"); + + //if the sender doesn't equal the owner, we check if the sender is in the approval list + if sender_id != &token.owner_id { + //if the token's approved account IDs doesn't contain the sender, we panic + if !token.approved_account_ids.contains_key(sender_id) { + env::panic_str("Unauthorized"); + } + + // If they included an approval_id, check if the sender's actual approval_id is the same as the one included + if let Some(enforced_approval_id) = approval_id { + //get the actual approval ID + let actual_approval_id = token + .approved_account_ids + .get(sender_id) + //if the sender isn't in the map, we panic + .expect("Sender is not approved account"); + + //make sure that the actual approval ID is the same as the one provided + assert_eq!( + actual_approval_id, &enforced_approval_id, + "The actual approval_id {} is different from the given approval_id {}", + actual_approval_id, enforced_approval_id, + ); + } + } + + //we make sure that the sender isn't sending the token to themselves + assert_ne!( + &token.owner_id, receiver_id, + "The token owner and the receiver should be different" + ); + + //we remove the token from it's current owner's set + self.internal_remove_token_from_owner(&token.owner_id, token_id); + //we then add the token to the receiver_id's set + self.internal_add_token_to_owner(receiver_id, token_id); + + //we create a new token struct + let new_token = Token { + owner_id: receiver_id.clone(), + //reset the approval account IDs + approved_account_ids: Default::default(), + next_approval_id: token.next_approval_id, + //we copy over the royalties from the previous token + royalty: token.royalty.clone(), + }; + //insert that new token into the tokens_by_id, replacing the old entry + self.tokens_by_id.insert(token_id, &new_token); + + //if there was some memo attached, we log it. + if let Some(memo) = memo.as_ref() { + env::log_str(&format!("Memo: {}", memo).to_string()); + } + + // Default the authorized ID to be None for the logs. + let mut authorized_id = None; + //if the approval ID was provided, set the authorized ID equal to the sender + if approval_id.is_some() { + authorized_id = Some(sender_id.to_string()); + } + + // Construct the transfer log as per the events standard. + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: token.owner_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: receiver_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_transfer_log.to_string()); + + //return the previous token object that was transferred. + token + } +} \ No newline at end of file diff --git a/nft-contract-royalty/src/lib.rs b/nft-contract-royalty/src/lib.rs new file mode 100644 index 0000000..7c81433 --- /dev/null +++ b/nft-contract-royalty/src/lib.rs @@ -0,0 +1,120 @@ +use std::collections::HashMap; +use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; +use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; +use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema +}; + +use crate::internal::*; +pub use crate::metadata::*; +pub use crate::mint::*; +pub use crate::nft_core::*; +pub use crate::approval::*; +pub use crate::royalty::*; +pub use crate::events::*; + +mod internal; +mod approval; +mod enumeration; +mod metadata; +mod mint; +mod nft_core; +mod royalty; +mod events; + +/// This spec can be treated like a version of the standard. +pub const NFT_METADATA_SPEC: &str = "1.0.0"; +/// This is the name of the NFT standard we're using +pub const NFT_STANDARD_NAME: &str = "nep171"; + +//Basic NEAR amounts as constants +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize, BorshStorageKey, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Contract { + //contract owner + pub owner_id: AccountId, + + //keeps track of all the token IDs for a given account + pub tokens_per_owner: LookupMap>, + + //keeps track of the token struct for a given token ID + pub tokens_by_id: LookupMap, + + //keeps track of the token metadata for a given token ID + pub token_metadata_by_id: UnorderedMap, + + //keeps track of the metadata for the contract + pub metadata: LazyOption, +} + +/// Helper structure for keys of the persistent collections. +#[derive(BorshSerialize, BorshStorageKey)] +#[borsh(crate = "near_sdk::borsh")] +pub enum StorageKey { + TokensPerOwner, + TokenPerOwnerInner { account_id_hash: CryptoHash }, + TokensById, + TokenMetadataById, + NFTContractMetadata, + TokensPerType, + TokensPerTypeInner { token_type_hash: CryptoHash }, + TokenTypesLocked, +} + +#[near_bindgen] +impl Contract { + /* + initialization function (can only be called once). + this initializes the contract with default metadata so the + user doesn't have to manually type metadata. + */ + #[init] + pub fn new_default_meta(owner_id: AccountId) -> Self { + //calls the other function "new: with some default metadata and the owner_id passed in + Self::new( + owner_id, + NFTContractMetadata { + spec: "nft-1.0.0".to_string(), + name: "NFT Tutorial Contract".to_string(), + symbol: "GOTEAM".to_string(), + icon: None, + base_uri: None, + reference: None, + reference_hash: None, + }, + ) + } + + /* + initialization function (can only be called once). + this initializes the contract with metadata that was passed in and + the owner_id. + */ + #[init] + pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { + //create a variable of type Self with all the fields initialized. + let this = Self { + //Storage keys are simply the prefixes used for the collections. This helps avoid data collision + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: LookupMap::new(StorageKey::TokensById), + token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), + //set the owner_id field equal to the passed in owner_id. + owner_id, + metadata: LazyOption::new( + StorageKey::NFTContractMetadata, + Some(&metadata), + ), + }; + + //return the Contract object + this + } +} + +#[cfg(test)] +mod tests; \ No newline at end of file diff --git a/nft-contract-royalty/src/metadata.rs b/nft-contract-royalty/src/metadata.rs new file mode 100644 index 0000000..404d701 --- /dev/null +++ b/nft-contract-royalty/src/metadata.rs @@ -0,0 +1,82 @@ +use crate::*; + +pub type TokenId = String; + +//defines the payout type we'll be returning as a part of the royalty standards. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct Payout { + pub payout: HashMap, +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct NFTContractMetadata { + pub spec: String, // required, essentially a version like "nft-1.0.0" + pub name: String, // required, ex. "Mosaics" + pub symbol: String, // required, ex. "MOSAIC" + pub icon: Option, // Data URL + pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs + pub reference: Option, // URL to a JSON file with more info + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct TokenMetadata { + pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + pub description: Option, // free-form description + pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage + pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + pub copies: Option, // number of copies of this set of metadata in existence when token was minted. + pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds + pub expires_at: Option, // When token expires, Unix epoch in milliseconds + pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds + pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds + pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. + pub reference: Option, // URL to an off-chain JSON file with more info. + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Token { + //owner of the token + pub owner_id: AccountId, + //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID + pub approved_account_ids: HashMap, + //the next approval ID to give out. + pub next_approval_id: u64, + //keep track of the royalty percentages for the token in a hash map + pub royalty: HashMap, +} + +//The Json token is what will be returned from view calls. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct JsonToken { + //token ID + pub token_id: TokenId, + //owner of the token + pub owner_id: AccountId, + //token metadata + pub metadata: TokenMetadata, + //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID + pub approved_account_ids: HashMap, + //keep track of the royalty percentages for the token in a hash map + pub royalty: HashMap, +} + +pub trait NonFungibleTokenMetadata { + //view call for returning the contract metadata + fn nft_metadata(&self) -> NFTContractMetadata; +} + +#[near_bindgen] +impl NonFungibleTokenMetadata for Contract { + fn nft_metadata(&self) -> NFTContractMetadata { + self.metadata.get().unwrap() + } +} \ No newline at end of file diff --git a/nft-contract-royalty/src/mint.rs b/nft-contract-royalty/src/mint.rs new file mode 100644 index 0000000..37e71ef --- /dev/null +++ b/nft-contract-royalty/src/mint.rs @@ -0,0 +1,81 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + #[payable] + pub fn nft_mint( + &mut self, + token_id: TokenId, + metadata: TokenMetadata, + receiver_id: AccountId, + //we add an optional parameter for perpetual royalties + perpetual_royalties: Option>, + ) { + //measure the initial storage being used on the contract + let initial_storage_usage = env::storage_usage(); + + // create a royalty map to store in the token + let mut royalty = HashMap::new(); + + // if perpetual royalties were passed into the function: + if let Some(perpetual_royalties) = perpetual_royalties { + //make sure that the length of the perpetual royalties is below 7 since we won't have enough GAS to pay out that many people + assert!(perpetual_royalties.len() < 7, "Cannot add more than 6 perpetual royalty amounts"); + + //iterate through the perpetual royalties and insert the account and amount in the royalty map + for (account, amount) in perpetual_royalties { + royalty.insert(account, amount); + } + } + + //specify the token struct that contains the owner ID + let token = Token { + //set the owner ID equal to the receiver ID passed into the function + owner_id: receiver_id, + //we set the approved account IDs to the default value (an empty map) + approved_account_ids: Default::default(), + //the next approval ID is set to 0 + next_approval_id: 0, + //the map of perpetual royalties for the token (The owner will get 100% - total perpetual royalties) + royalty, + }; + + //insert the token ID and token struct and make sure that the token doesn't exist + assert!( + self.tokens_by_id.insert(&token_id, &token).is_none(), + "Token already exists" + ); + + //insert the token ID and metadata + self.token_metadata_by_id.insert(&token_id, &metadata); + + //call the internal method for adding the token to the owner + self.internal_add_token_to_owner(&token.owner_id, &token_id); + + // Construct the mint log as per the events standard. + let nft_mint_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftMint(vec![NftMintLog { + // Owner of the token. + owner_id: token.owner_id.to_string(), + // Vector of token IDs that were minted. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo: None, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_mint_log.to_string()); + + //calculate the required storage which was the used - initial + let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; + + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. + refund_deposit(required_storage_in_bytes.into()); + } +} \ No newline at end of file diff --git a/nft-contract-royalty/src/nft_core.rs b/nft-contract-royalty/src/nft_core.rs new file mode 100644 index 0000000..1ebc55e --- /dev/null +++ b/nft-contract-royalty/src/nft_core.rs @@ -0,0 +1,278 @@ +use crate::*; +use near_sdk::{ext_contract, Gas, PromiseResult}; + +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); + +pub trait NonFungibleTokenCore { + //transfers an NFT to a receiver ID + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ); + + // Transfers an NFT to a receiver and calls the + // function `nft_on_transfer` on their contract. + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + msg: String, + ) -> PromiseOrValue; + + //get information about the NFT token passed in + fn nft_token(&self, token_id: TokenId) -> Option; +} + +#[ext_contract(ext_non_fungible_token_receiver)] +trait NonFungibleTokenReceiver { + //Method stored on the receiver contract that is called via cross contract call when nft_transfer_call is called + /// Returns `true` if the token should be returned back to the sender. + fn nft_on_transfer( + &mut self, + sender_id: AccountId, + previous_owner_id: AccountId, + token_id: TokenId, + msg: String, + ) -> Promise; +} + +#[ext_contract(ext_self)] +/* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method +*/ +trait NonFungibleTokenResolver { + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce the approval map so we can keep track of what the approvals were before the transfer + approved_account_ids: HashMap, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //implementation of the nft_transfer method. This transfers the NFT from the current owner to the receiver. + #[payable] + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ) { + //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. + assert_one_yocto(); + //get the sender to transfer the token from the sender to the receiver + let sender_id = env::predecessor_account_id(); + + //call the internal transfer method and get back the previous token so we can refund the approved account IDs + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + approval_id, + memo, + ); + + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids( + previous_token.owner_id.clone(), + &previous_token.approved_account_ids, + ); + } + + //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract + #[payable] + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + msg: String, + ) -> PromiseOrValue { + //assert that the user attached exactly 1 yocto for security reasons. + assert_one_yocto(); + + //get the sender ID + let sender_id = env::predecessor_account_id(); + + //transfer the token and get the previous token object + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + approval_id, + memo.clone(), + ); + + //default the authorized_id to none + let mut authorized_id = None; + //if the sender isn't the owner of the token, we set the authorized ID equal to the sender. + if sender_id != previous_token.owner_id { + authorized_id = Some(sender_id.to_string()); + } + + // Initiating receiver's call and the callback + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. + ext_non_fungible_token_receiver::ext(receiver_id.clone()) + .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) + .nft_on_transfer( + sender_id, + previous_token.owner_id.clone(), + token_id.clone(), + msg + ) + // We then resolve the promise and call nft_resolve_transfer on our own contract + .then( + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer + Self::ext(env::current_account_id()) + .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) + .nft_resolve_transfer( + authorized_id, // we introduce an authorized ID so that we can log the transfer + previous_token.owner_id, + receiver_id, + token_id, + previous_token.approved_account_ids, + memo, // we introduce a memo for logging in the events standard + ) + ).into() + } + + //get the information for a specific token ID + fn nft_token(&self, token_id: TokenId) -> Option { + //if there is some token ID in the tokens_by_id collection + if let Some(token) = self.tokens_by_id.get(&token_id) { + //we'll get the metadata for that token + let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); + //we return the JsonToken (wrapped by Some since we return an option) + Some(JsonToken { + token_id, + owner_id: token.owner_id, + metadata, + approved_account_ids: token.approved_account_ids, + royalty: token.royalty, + }) + } else { //if there wasn't a token ID in the tokens_by_id collection, we return None + None + } + } +} + +#[near_bindgen] +impl NonFungibleTokenResolver for Contract { + //resolves the cross contract call when calling nft_on_transfer in the nft_transfer_call method + //returns true if the token was successfully transferred to the receiver_id + #[private] + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce the approval map so we can keep track of what the approvals were before the transfer + approved_account_ids: HashMap, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool { + // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` + // call result. + if let PromiseResult::Successful(value) = env::promise_result(0) { + //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not + if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { + //if we need don't need to return the token, we simply return true meaning everything went fine + if !return_token { + /* + since we've already transferred the token and nft_on_transfer returned false, we don't have to + revert the original transfer and thus we can just return true since nothing went wrong. + */ + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + return true; + } + } + } + + //get the token object if there is some token object + let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { + if token.owner_id != receiver_id { + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + // The token is not owner by the receiver anymore. Can't return it. + return true; + } + token + //if there isn't a token object, it was burned and so we return true + } else { + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + return true; + }; + + //we remove the token from the receiver + self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); + //we add the token to the original owner + self.internal_add_token_to_owner(&owner_id, &token_id); + + //we change the token struct's owner to be the original owner + token.owner_id = owner_id.clone(); + + //we refund the receiver any approved account IDs that they may have set on the token + refund_approved_account_ids(receiver_id.clone(), &token.approved_account_ids); + //reset the approved account IDs to what they were before the transfer + token.approved_account_ids = approved_account_ids; + + //we inset the token back into the tokens_by_id collection + self.tokens_by_id.insert(&token_id, &token); + + /* + We need to log that the NFT was reverted back to the original owner. + The old_owner_id will be the receiver and the new_owner_id will be the + original owner of the token since we're reverting the transfer. + */ + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: receiver_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: owner_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + //we perform the actual logging + env::log_str(&nft_transfer_log.to_string()); + + //return false + false + } +} diff --git a/nft-contract/src/royalty.rs b/nft-contract-royalty/src/royalty.rs similarity index 100% rename from nft-contract/src/royalty.rs rename to nft-contract-royalty/src/royalty.rs diff --git a/nft-contract-royalty/src/tests.rs b/nft-contract-royalty/src/tests.rs new file mode 100644 index 0000000..e018ad7 --- /dev/null +++ b/nft-contract-royalty/src/tests.rs @@ -0,0 +1,315 @@ +/* unit tests */ +#[cfg(test)] +use crate::Contract; +use crate::TokenMetadata; +use crate::approval::NonFungibleTokenCore; +use near_sdk::json_types::{U128, U64}; +use near_sdk::test_utils::{accounts, VMContextBuilder}; +use near_sdk::{testing_env, NearToken}; +use near_sdk::{env, AccountId}; +use std::collections::HashMap; + +const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); +const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + + +fn get_context(predecessor: AccountId) -> VMContextBuilder { + let mut builder = VMContextBuilder::new(); + builder.predecessor_account_id(predecessor); + builder +} + +fn sample_token_metadata() -> TokenMetadata { + TokenMetadata { + title: Some("Olympus Mons".into()), + description: Some("The tallest mountain in the charted solar system".into()), + media: None, + media_hash: None, + copies: Some(1u64), + issued_at: None, + expires_at: None, + starts_at: None, + updated_at: None, + extra: None, + reference: None, + reference_hash: None, + } +} + +#[test] +#[should_panic(expected = "The contract is not initialized")] +fn test_default() { + let context = get_context(accounts(1)); + testing_env!(context.build()); + let _contract = Contract::default(); +} + +#[test] +fn test_new_account_contract() { + let mut context = get_context(accounts(1)); + testing_env!(context.build()); + let contract = Contract::new_default_meta(accounts(1).into()); + testing_env!(context.is_view(true).build()); + let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); + assert_eq!(contract_nft_tokens.len(), 0); +} + +#[test] +fn test_mint_nft() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_metadata: TokenMetadata = sample_token_metadata(); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), token_metadata, accounts(0), None); + let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); + assert_eq!(contract_nft_tokens.len(), 1); + + assert_eq!(contract_nft_tokens[0].token_id, token_id); + assert_eq!(contract_nft_tokens[0].owner_id, accounts(0)); + assert_eq!( + contract_nft_tokens[0].metadata.title, + sample_token_metadata().title + ); + assert_eq!( + contract_nft_tokens[0].metadata.description, + sample_token_metadata().description + ); + assert_eq!( + contract_nft_tokens[0].metadata.media, + sample_token_metadata().media + ); + assert_eq!(contract_nft_tokens[0].approved_account_ids, HashMap::new()); +} + +#[test] +fn test_internal_transfer() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(ONE_YOCTONEAR) + .predecessor_account_id(accounts(0)) + .build()); + contract.internal_transfer( + &accounts(0), + &accounts(1), + &token_id.clone(), + Some(U64(1).0), + None, + ); + + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_yoctonear(0)) + .build()); + + let tokens = contract.nft_tokens_for_owner(accounts(1), Some(U128(0)), None); + assert_ne!( + tokens.len(), + 0, + "Token not correctly created and/or sent to second account" + ); + let token = &tokens[0]; + assert_eq!(token.token_id, token_id); + assert_eq!(token.owner_id, accounts(1)); + assert_eq!(token.metadata.title, sample_token_metadata().title); + assert_eq!( + token.metadata.description, + sample_token_metadata().description + ); + assert_eq!(token.metadata.media, sample_token_metadata().media); + assert_eq!(token.approved_account_ids, HashMap::new()); +} + +#[test] +fn test_nft_approve() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_near(0)) + .build()); + assert!(contract.nft_is_approved(token_id.clone(), accounts(1), None)); +} + +#[test] +fn test_nft_revoke() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + // alice approves bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + // alice revokes bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(ONE_YOCTONEAR) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_revoke(token_id.clone(), accounts(1)); + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_near(0)) + .build()); + assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), None)); +} + +#[test] +fn test_revoke_all() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + // alice approves bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + // alice revokes bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(ONE_YOCTONEAR) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_revoke_all(token_id.clone()); + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(NearToken::from_near(0)) + .build()); + assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), Some(1))); +} + +#[test] +fn test_internal_remove_token_from_owner() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + let contract_nft_tokens_before = contract.nft_tokens_for_owner(accounts(0), None, None); + assert_eq!(contract_nft_tokens_before.len(), 1); + + contract.internal_remove_token_from_owner(&accounts(0), &token_id); + let contract_nft_tokens_after = contract.nft_tokens_for_owner(accounts(0), None, None); + assert_eq!(contract_nft_tokens_after.len(), 0); +} + +#[test] +fn test_nft_payout() { + use crate::royalty::NonFungibleTokenCore; + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + // alice approves bob + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) + .predecessor_account_id(accounts(0)) + .build()); + contract.nft_approve(token_id.clone(), accounts(1), None); + + let payout = contract.nft_payout(token_id.clone(), NearToken::from_millinear(10), 1); + let expected = HashMap::from([(accounts(0), NearToken::from_near(100))]); + assert_eq!(payout.payout, expected); +} + +#[test] +fn test_nft_total_supply() { + let mut context = get_context(accounts(0)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(0).into()); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(MINT_STORAGE_COST) + .predecessor_account_id(accounts(0)) + .build()); + let token_id = "0".to_string(); + contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); + + let total_supply = contract.nft_total_supply(); + assert_eq!(total_supply, U128(1)); +} \ No newline at end of file diff --git a/nft-contract-skeleton/Cargo.toml b/nft-contract-skeleton/Cargo.toml new file mode 100644 index 0000000..ac9428c --- /dev/null +++ b/nft-contract-skeleton/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "nft_contract_skeleton" +version = "0.1.0" +authors = ["Near Inc "] +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = { version = "5.1.0", features = ["legacy"] } +schemars = { version = "0.8.16"} + +[profile.release] +codegen-units = 1 +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +debug = false +panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 +overflow-checks = true diff --git a/nft-contract-skeleton/README.md b/nft-contract-skeleton/README.md new file mode 100644 index 0000000..7064491 --- /dev/null +++ b/nft-contract-skeleton/README.md @@ -0,0 +1 @@ +# TBD diff --git a/nft-contract-skeleton/res/nft_simple.wasm b/nft-contract-skeleton/res/nft_simple.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f68c929bd483f1dc1d8f73986c7cdfbd91ce2947 GIT binary patch literal 211520 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 + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool; + + //revoke a specific account from transferring the token on your behalf + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId); + + //revoke all accounts from transferring the token on your behalf + fn nft_revoke_all(&mut self, token_id: TokenId); +} + +#[ext_contract(ext_non_fungible_approval_receiver)] +trait NonFungibleTokenApprovalsReceiver { + //cross contract call to an external contract that is initiated during nft_approve + fn nft_on_approve( + &mut self, + token_id: TokenId, + owner_id: AccountId, + approval_id: u64, + msg: String, + ); +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //allow a specific account ID to approve a token on your behalf + #[payable] + fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) { + /* + FILL THIS IN + */ + } + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //revoke a specific account from transferring the token on your behalf + #[payable] + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { + /* + FILL THIS IN + */ + } + + //revoke all accounts from transferring the token on your behalf + #[payable] + fn nft_revoke_all(&mut self, token_id: TokenId) { + /* + FILL THIS IN + */ + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/enumeration.rs b/nft-contract-skeleton/src/enumeration.rs new file mode 100644 index 0000000..82c473a --- /dev/null +++ b/nft-contract-skeleton/src/enumeration.rs @@ -0,0 +1,44 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + //Query for the total supply of NFTs on the contract + pub fn nft_total_supply(&self) -> U128 { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //Query for nft tokens on the contract regardless of the owner using pagination + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //get the total supply of NFTs for a given owner + pub fn nft_supply_for_owner( + &self, + account_id: AccountId, + ) -> U128 { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //Query for all the tokens for an owner + pub fn nft_tokens_for_owner( + &self, + account_id: AccountId, + from_index: Option, + limit: Option, + ) -> Vec { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/lib.rs b/nft-contract-skeleton/src/lib.rs new file mode 100644 index 0000000..724ebf3 --- /dev/null +++ b/nft-contract-skeleton/src/lib.rs @@ -0,0 +1,72 @@ +use std::collections::HashMap; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; +use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + near, env, AccountId, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, NearSchema +}; + +pub use crate::metadata::*; +pub use crate::mint::*; +pub use crate::nft_core::*; +pub use crate::approval::*; +pub use crate::royalty::*; + +mod approval; +mod enumeration; +mod metadata; +mod mint; +mod nft_core; +mod royalty; + +#[near(contract_state)] +#[derive(PanicOnDefault)] +pub struct Contract { + /* + FILL THIS IN + */ +} + +/// Helper structure for keys of the persistent collections. +#[derive(BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] +pub enum StorageKey { + TokensPerOwner, + TokenPerOwnerInner { account_id_hash: CryptoHash }, + TokensById, + TokenMetadataById, + NFTContractMetadata, + TokensPerType, + TokensPerTypeInner { token_type_hash: CryptoHash }, + TokenTypesLocked, +} + +#[near_bindgen] +impl Contract { + /* + initialization function (can only be called once). + this initializes the contract with default metadata so the + user doesn't have to manually type metadata. + */ + #[init] + pub fn new_default_meta(owner_id: AccountId) -> Self { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + /* + initialization function (can only be called once). + this initializes the contract with metadata that was passed in and + the owner_id. + */ + #[init] + pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/metadata.rs b/nft-contract-skeleton/src/metadata.rs new file mode 100644 index 0000000..1127397 --- /dev/null +++ b/nft-contract-skeleton/src/metadata.rs @@ -0,0 +1,58 @@ +use crate::*; +pub type TokenId = String; +//defines the payout type we'll be returning as a part of the royalty standards. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct Payout { + pub payout: HashMap, +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct NFTContractMetadata { + /* + FILL THIS IN + */ +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct TokenMetadata { + /* + FILL THIS IN + */ +} + +#[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Token { + /* + FILL THIS IN + */ +} + +//The Json token is what will be returned from view calls. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct JsonToken { + /* + FILL THIS IN + */ +} + +pub trait NonFungibleTokenMetadata { + //view call for returning the contract metadata + fn nft_metadata(&self) -> NFTContractMetadata; +} + +#[near_bindgen] +impl NonFungibleTokenMetadata for Contract { + fn nft_metadata(&self) -> NFTContractMetadata { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/mint.rs b/nft-contract-skeleton/src/mint.rs new file mode 100644 index 0000000..ece73ad --- /dev/null +++ b/nft-contract-skeleton/src/mint.rs @@ -0,0 +1,16 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + #[payable] + pub fn nft_mint( + &mut self, + token_id: Option, + metadata: TokenMetadata, + receiver_id: Option, + ) { + /* + FILL THIS IN + */ + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/nft_core.rs b/nft-contract-skeleton/src/nft_core.rs new file mode 100644 index 0000000..3c35d2c --- /dev/null +++ b/nft-contract-skeleton/src/nft_core.rs @@ -0,0 +1,113 @@ +use crate::*; +use near_sdk::{ext_contract, Gas, log, PromiseResult}; + +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); + +pub trait NonFungibleTokenCore { + //transfers an NFT to a receiver ID + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + ); + + //transfers an NFT to a receiver and calls a function on the receiver ID's contract + /// Returns `true` if the token was transferred from the sender's account. + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + msg: String, + ) -> PromiseOrValue; + + //get information about the NFT token passed in + fn nft_token(&self, token_id: TokenId) -> Option; +} + +#[ext_contract(ext_non_fungible_token_receiver)] +trait NonFungibleTokenReceiver { + //Method stored on the receiver contract that is called via cross contract call when nft_transfer_call is called + /// Returns `true` if the token should be returned back to the sender. + fn nft_on_transfer( + &mut self, + sender_id: AccountId, + previous_owner_id: AccountId, + token_id: TokenId, + msg: String, + ) -> Promise; +} + +#[ext_contract(ext_self)] +trait NonFungibleTokenResolver { + /* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method + */ + fn nft_resolve_transfer( + &mut self, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + ) -> bool; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //implementation of the nft_transfer method. This transfers the NFT from the current owner to the receiver. + #[payable] + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + ) { + /* + FILL THIS IN + */ + } + + //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract + #[payable] + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + msg: String, + ) -> PromiseOrValue { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //get the information for a specific token ID + fn nft_token(&self, token_id: TokenId) -> Option { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} + +#[near_bindgen] +impl NonFungibleTokenResolver for Contract { + //resolves the cross contract call when calling nft_on_transfer in the nft_transfer_call method + //returns true if the token was successfully transferred to the receiver_id + #[private] + fn nft_resolve_transfer( + &mut self, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + ) -> bool { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} diff --git a/nft-contract-skeleton/src/royalty.rs b/nft-contract-skeleton/src/royalty.rs new file mode 100644 index 0000000..7646f9e --- /dev/null +++ b/nft-contract-skeleton/src/royalty.rs @@ -0,0 +1,46 @@ +use crate::*; + +pub trait NonFungibleTokenCore { + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + #[payable] + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} From 2cee79b91c82637af3783ea63b1319bc3c8826d3 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Fri, 29 Mar 2024 17:19:50 +0100 Subject: [PATCH 15/28] clearing basic contract in order to build it from the scratch --- nft-contract-basic copy/Cargo.toml | 28 ++ nft-contract-basic copy/README.md | 1 + nft-contract-basic copy/res/nft_simple.wasm | Bin 0 -> 211520 bytes .../rust-toolchain.toml | 0 nft-contract-basic copy/src/approval.rs | 73 +++++ nft-contract-basic copy/src/enumeration.rs | 76 +++++ nft-contract-basic copy/src/events.rs | 138 +++++++++ nft-contract-basic copy/src/internal.rs | 63 ++++ nft-contract-basic copy/src/lib.rs | 120 ++++++++ nft-contract-basic copy/src/metadata.rs | 72 +++++ nft-contract-basic copy/src/mint.rs | 39 +++ nft-contract-basic copy/src/nft_core.rs | 278 ++++++++++++++++++ nft-contract-basic copy/src/royalty.rs | 46 +++ .../src/tests.rs | 0 nft-contract-basic/Cargo.toml | 8 +- nft-contract-basic/src/enumeration.rs | 66 ++--- nft-contract-basic/src/internal.rs | 235 --------------- nft-contract-basic/src/lib.rs | 77 +---- nft-contract-basic/src/metadata.rs | 58 ++-- nft-contract-basic/src/mint.rs | 75 +---- nft-contract-basic/src/nft_core.rs | 207 ++----------- nft-contract-skeleton/Cargo.toml | 2 +- nft-contract-skeleton/src/events.rs | 138 +++++++++ nft-contract-skeleton/src/lib.rs | 7 +- 24 files changed, 1154 insertions(+), 653 deletions(-) create mode 100644 nft-contract-basic copy/Cargo.toml create mode 100644 nft-contract-basic copy/README.md create mode 100755 nft-contract-basic copy/res/nft_simple.wasm rename {nft-contract-basic => nft-contract-basic copy}/rust-toolchain.toml (100%) create mode 100644 nft-contract-basic copy/src/approval.rs create mode 100644 nft-contract-basic copy/src/enumeration.rs create mode 100644 nft-contract-basic copy/src/events.rs create mode 100644 nft-contract-basic copy/src/internal.rs create mode 100644 nft-contract-basic copy/src/lib.rs create mode 100644 nft-contract-basic copy/src/metadata.rs create mode 100644 nft-contract-basic copy/src/mint.rs create mode 100644 nft-contract-basic copy/src/nft_core.rs create mode 100644 nft-contract-basic copy/src/royalty.rs rename {nft-contract-basic => nft-contract-basic copy}/src/tests.rs (100%) delete mode 100644 nft-contract-basic/src/internal.rs create mode 100644 nft-contract-skeleton/src/events.rs diff --git a/nft-contract-basic copy/Cargo.toml b/nft-contract-basic copy/Cargo.toml new file mode 100644 index 0000000..d0ab6ac --- /dev/null +++ b/nft-contract-basic copy/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "nft_contract_basic" +version = "0.1.0" +authors = ["Near Inc "] +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = { version = "5.1.0", features = ["legacy"] } +serde_json = "1.0.113" + +[dev-dependencies] +near-sdk = { version = "5.1.0", features = ["unit-testing"] } +near-workspaces = { version = "0.10.0", features = ["unstable"] } +tokio = { version = "1.12.0", features = ["full"] } +serde_json = "1" + +[profile.release] +codegen-units = 1 +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +debug = false +panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 +overflow-checks = true diff --git a/nft-contract-basic copy/README.md b/nft-contract-basic copy/README.md new file mode 100644 index 0000000..7064491 --- /dev/null +++ b/nft-contract-basic copy/README.md @@ -0,0 +1 @@ +# TBD diff --git a/nft-contract-basic copy/res/nft_simple.wasm b/nft-contract-basic copy/res/nft_simple.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f68c929bd483f1dc1d8f73986c7cdfbd91ce2947 GIT binary patch literal 211520 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 + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool; + + //revoke a specific account from transferring the token on your behalf + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId); + + //revoke all accounts from transferring the token on your behalf + fn nft_revoke_all(&mut self, token_id: TokenId); +} + +#[ext_contract(ext_non_fungible_approval_receiver)] +trait NonFungibleTokenApprovalsReceiver { + //cross contract call to an external contract that is initiated during nft_approve + fn nft_on_approve( + &mut self, + token_id: TokenId, + owner_id: AccountId, + approval_id: u64, + msg: String, + ); +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //allow a specific account ID to approve a token on your behalf + #[payable] + fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) { + /* + FILL THIS IN + */ + } + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //revoke a specific account from transferring the token on your behalf + #[payable] + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { + /* + FILL THIS IN + */ + } + + //revoke all accounts from transferring the token on your behalf + #[payable] + fn nft_revoke_all(&mut self, token_id: TokenId) { + /* + FILL THIS IN + */ + } +} \ No newline at end of file diff --git a/nft-contract-basic copy/src/enumeration.rs b/nft-contract-basic copy/src/enumeration.rs new file mode 100644 index 0000000..5d1e0de --- /dev/null +++ b/nft-contract-basic copy/src/enumeration.rs @@ -0,0 +1,76 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + //Query for the total supply of NFTs on the contract + pub fn nft_total_supply(&self) -> U128 { + //return the length of the token metadata by ID + U128(self.token_metadata_by_id.len() as u128) + } + + //Query for nft tokens on the contract regardless of the owner using pagination + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(U128(0))); + + //iterate through each token using an iterator + self.token_metadata_by_id.keys() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } + + //get the total supply of NFTs for a given owner + pub fn nft_supply_for_owner( + &self, + account_id: AccountId, + ) -> U128 { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + + //if there is some set of tokens, we'll return the length as a U128 + if let Some(tokens_for_owner_set) = tokens_for_owner_set { + U128(tokens_for_owner_set.len() as u128) + } else { + //if there isn't a set of tokens for the passed in account ID, we'll return 0 + U128(0) + } + } + + //Query for all the tokens for an owner + pub fn nft_tokens_for_owner( + &self, + account_id: AccountId, + from_index: Option, + limit: Option, + ) -> Vec { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + //if there is some set of tokens, we'll set the tokens variable equal to that set + let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set + } else { + //if there is no set of tokens, we'll simply return an empty vector. + return vec![]; + }; + + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(U128(0))); + + //iterate through the keys vector + tokens.iter() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } +} diff --git a/nft-contract-basic copy/src/events.rs b/nft-contract-basic copy/src/events.rs new file mode 100644 index 0000000..f65a3f4 --- /dev/null +++ b/nft-contract-basic copy/src/events.rs @@ -0,0 +1,138 @@ +use std::fmt; + +use near_sdk::serde::{Deserialize, Serialize}; + +/// Enum that represents the data type of the EventLog. +/// The enum can either be an NftMint or an NftTransfer. +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "event", content = "data")] +#[serde(rename_all = "snake_case")] +#[serde(crate = "near_sdk::serde")] +#[non_exhaustive] +pub enum EventLogVariant { + NftMint(Vec), + NftTransfer(Vec), +} + +/// Interface to capture data about an event +/// +/// Arguments: +/// * `standard`: name of standard e.g. nep171 +/// * `version`: e.g. 1.0.0 +/// * `event`: associate event data +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct EventLog { + pub standard: String, + pub version: String, + + // `flatten` to not have "event": {} in the JSON, just have the contents of {}. + #[serde(flatten)] + pub event: EventLogVariant, +} + +impl fmt::Display for EventLog { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!( + "EVENT_JSON:{}", + &serde_json::to_string(self).map_err(|_| fmt::Error)? + )) + } +} + +/// An event log to capture token minting +/// +/// Arguments +/// * `owner_id`: "account.near" +/// * `token_ids`: ["1", "abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftMintLog { + pub owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +/// An event log to capture token transfer +/// +/// Arguments +/// * `authorized_id`: approved account to transfer +/// * `old_owner_id`: "owner.near" +/// * `new_owner_id`: "receiver.near" +/// * `token_ids`: ["1", "12345abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftTransferLog { + #[serde(skip_serializing_if = "Option::is_none")] + pub authorized_id: Option, + + pub old_owner_id: String, + pub new_owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn nep_format_vector() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![ + NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }, + NftMintLog { + owner_id: "user1.near".to_owned(), + token_ids: vec!["meme".to_string()], + memo: None, + }, + ]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_mint() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_transfer_all_fields() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + authorized_id: Some("market.near".to_string()), + old_owner_id: "user1.near".to_string(), + new_owner_id: "user2.near".to_string(), + token_ids: vec!["token".to_string()], + memo: Some("Go Team!".to_owned()), + }]), + }; + assert_eq!(expected, log.to_string()); + } +} \ No newline at end of file diff --git a/nft-contract-basic copy/src/internal.rs b/nft-contract-basic copy/src/internal.rs new file mode 100644 index 0000000..40fb72a --- /dev/null +++ b/nft-contract-basic copy/src/internal.rs @@ -0,0 +1,63 @@ +use crate::*; +use near_sdk::{CryptoHash}; +use std::mem::size_of; + +//used to generate a unique prefix in our storage collections (this is to avoid data collisions) +pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { + //get the default hash + let mut hash = CryptoHash::default(); + //we hash the account ID and return it + hash.copy_from_slice(&env::sha256(account_id.as_bytes())); + hash +} + +//refund the initial deposit based on the amount of storage that was used up +pub(crate) fn refund_deposit(storage_used: u64) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost() * Balance::from(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit - required_cost; + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund > 1 { + Promise::new(env::predecessor_account_id()).transfer(refund); + } +} + +impl Contract { + //add a token to the set of tokens an owner has + pub(crate) fn internal_add_token_to_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //get the set of tokens for the given account + let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { + //if the account doesn't have any tokens, we create a new unordered set + UnorderedSet::new( + StorageKey::TokenPerOwnerInner { + //we get a new unique prefix for the collection + account_id_hash: hash_account_id(&account_id), + } + .try_to_vec() + .unwrap(), + ) + }); + + //we insert the token ID into the set + tokens_set.insert(token_id); + + //we insert that set for the given account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } +} \ No newline at end of file diff --git a/nft-contract-basic copy/src/lib.rs b/nft-contract-basic copy/src/lib.rs new file mode 100644 index 0000000..636f5e2 --- /dev/null +++ b/nft-contract-basic copy/src/lib.rs @@ -0,0 +1,120 @@ +use std::collections::HashMap; +use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; +use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; +use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema +}; + +use crate::internal::*; +pub use crate::metadata::*; +pub use crate::mint::*; +pub use crate::nft_core::*; +pub use crate::events::*; +pub use crate::approval::*; +pub use crate::royalty::*; + +mod internal; +mod enumeration; +mod metadata; +mod mint; +mod nft_core; +mod events; +mod approval; +mod royalty; + +/// This spec can be treated like a version of the standard. +pub const NFT_METADATA_SPEC: &str = "1.0.0"; +/// This is the name of the NFT standard we're using +pub const NFT_STANDARD_NAME: &str = "nep171"; + +//Basic NEAR amounts as constants +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + +#[near_bindgen] +#[derive(BorshSerialize, BorshDeserialize, BorshStorageKey, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Contract { + //contract owner + pub owner_id: AccountId, + + //keeps track of all the token IDs for a given account + pub tokens_per_owner: LookupMap>, + + //keeps track of the token struct for a given token ID + pub tokens_by_id: LookupMap, + + //keeps track of the token metadata for a given token ID + pub token_metadata_by_id: UnorderedMap, + + //keeps track of the metadata for the contract + pub metadata: LazyOption, +} + +/// Helper structure for keys of the persistent collections. +#[derive(BorshSerialize, BorshStorageKey)] +#[borsh(crate = "near_sdk::borsh")] +pub enum StorageKey { + TokensPerOwner, + TokenPerOwnerInner { account_id_hash: CryptoHash }, + TokensById, + TokenMetadataById, + NFTContractMetadata, + TokensPerType, + TokensPerTypeInner { token_type_hash: CryptoHash }, + TokenTypesLocked, +} + +#[near_bindgen] +impl Contract { + /* + initialization function (can only be called once). + this initializes the contract with default metadata so the + user doesn't have to manually type metadata. + */ + #[init] + pub fn new_default_meta(owner_id: AccountId) -> Self { + //calls the other function "new: with some default metadata and the owner_id passed in + Self::new( + owner_id, + NFTContractMetadata { + spec: "nft-1.0.0".to_string(), + name: "NFT Tutorial Contract".to_string(), + symbol: "GOTEAM".to_string(), + icon: None, + base_uri: None, + reference: None, + reference_hash: None, + }, + ) + } + + /* + initialization function (can only be called once). + this initializes the contract with metadata that was passed in and + the owner_id. + */ + #[init] + pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { + //create a variable of type Self with all the fields initialized. + let this = Self { + //Storage keys are simply the prefixes used for the collections. This helps avoid data collision + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: LookupMap::new(StorageKey::TokensById), + token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), + //set the owner_id field equal to the passed in owner_id. + owner_id, + metadata: LazyOption::new( + StorageKey::NFTContractMetadata, + Some(&metadata), + ), + }; + + //return the Contract object + this + } +} + +#[cfg(test)] +mod tests; \ No newline at end of file diff --git a/nft-contract-basic copy/src/metadata.rs b/nft-contract-basic copy/src/metadata.rs new file mode 100644 index 0000000..f25dece --- /dev/null +++ b/nft-contract-basic copy/src/metadata.rs @@ -0,0 +1,72 @@ +use crate::*; + +pub type TokenId = String; + +//defines the payout type we'll be returning as a part of the royalty standards. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct Payout { + pub payout: HashMap, +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct NFTContractMetadata { + pub spec: String, // required, essentially a version like "nft-1.0.0" + pub name: String, // required, ex. "Mosaics" + pub symbol: String, // required, ex. "MOSAIC" + pub icon: Option, // Data URL + pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs + pub reference: Option, // URL to a JSON file with more info + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct TokenMetadata { + pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + pub description: Option, // free-form description + pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage + pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + pub copies: Option, // number of copies of this set of metadata in existence when token was minted. + pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds + pub expires_at: Option, // When token expires, Unix epoch in milliseconds + pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds + pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds + pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. + pub reference: Option, // URL to an off-chain JSON file with more info. + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Token { + //owner of the token + pub owner_id: AccountId +} + +//The Json token is what will be returned from view calls. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct JsonToken { + //token ID + pub token_id: TokenId, + //owner of the token + pub owner_id: AccountId, + //token metadata + pub metadata: TokenMetadata +} + +pub trait NonFungibleTokenMetadata { + //view call for returning the contract metadata + fn nft_metadata(&self) -> NFTContractMetadata; +} + +#[near_bindgen] +impl NonFungibleTokenMetadata for Contract { + fn nft_metadata(&self) -> NFTContractMetadata { + self.metadata.get().unwrap() + } +} \ No newline at end of file diff --git a/nft-contract-basic copy/src/mint.rs b/nft-contract-basic copy/src/mint.rs new file mode 100644 index 0000000..21db9fe --- /dev/null +++ b/nft-contract-basic copy/src/mint.rs @@ -0,0 +1,39 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + #[payable] + pub fn nft_mint( + &mut self, + token_id: TokenId, + metadata: TokenMetadata, + receiver_id: AccountId, + ) { + //measure the initial storage being used on the contract + let initial_storage_usage = env::storage_usage(); + + //specify the token struct that contains the owner ID + let token = Token { + //set the owner ID equal to the receiver ID passed into the function + owner_id: receiver_id, + }; + + //insert the token ID and token struct and make sure that the token doesn't exist + assert!( + self.tokens_by_id.insert(&token_id, &token).is_none(), + "Token already exists" + ); + + //insert the token ID and metadata + self.token_metadata_by_id.insert(&token_id, &metadata); + + //call the internal method for adding the token to the owner + self.internal_add_token_to_owner(&token.owner_id, &token_id); + + //calculate the required storage which was the used - initial + let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; + + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. + refund_deposit(required_storage_in_bytes); + } +} \ No newline at end of file diff --git a/nft-contract-basic copy/src/nft_core.rs b/nft-contract-basic copy/src/nft_core.rs new file mode 100644 index 0000000..1ebc55e --- /dev/null +++ b/nft-contract-basic copy/src/nft_core.rs @@ -0,0 +1,278 @@ +use crate::*; +use near_sdk::{ext_contract, Gas, PromiseResult}; + +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); + +pub trait NonFungibleTokenCore { + //transfers an NFT to a receiver ID + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ); + + // Transfers an NFT to a receiver and calls the + // function `nft_on_transfer` on their contract. + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + msg: String, + ) -> PromiseOrValue; + + //get information about the NFT token passed in + fn nft_token(&self, token_id: TokenId) -> Option; +} + +#[ext_contract(ext_non_fungible_token_receiver)] +trait NonFungibleTokenReceiver { + //Method stored on the receiver contract that is called via cross contract call when nft_transfer_call is called + /// Returns `true` if the token should be returned back to the sender. + fn nft_on_transfer( + &mut self, + sender_id: AccountId, + previous_owner_id: AccountId, + token_id: TokenId, + msg: String, + ) -> Promise; +} + +#[ext_contract(ext_self)] +/* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method +*/ +trait NonFungibleTokenResolver { + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce the approval map so we can keep track of what the approvals were before the transfer + approved_account_ids: HashMap, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //implementation of the nft_transfer method. This transfers the NFT from the current owner to the receiver. + #[payable] + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + ) { + //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. + assert_one_yocto(); + //get the sender to transfer the token from the sender to the receiver + let sender_id = env::predecessor_account_id(); + + //call the internal transfer method and get back the previous token so we can refund the approved account IDs + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + approval_id, + memo, + ); + + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids( + previous_token.owner_id.clone(), + &previous_token.approved_account_ids, + ); + } + + //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract + #[payable] + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + //we introduce an approval ID so that people with that approval ID can transfer the token + approval_id: Option, + memo: Option, + msg: String, + ) -> PromiseOrValue { + //assert that the user attached exactly 1 yocto for security reasons. + assert_one_yocto(); + + //get the sender ID + let sender_id = env::predecessor_account_id(); + + //transfer the token and get the previous token object + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + approval_id, + memo.clone(), + ); + + //default the authorized_id to none + let mut authorized_id = None; + //if the sender isn't the owner of the token, we set the authorized ID equal to the sender. + if sender_id != previous_token.owner_id { + authorized_id = Some(sender_id.to_string()); + } + + // Initiating receiver's call and the callback + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. + ext_non_fungible_token_receiver::ext(receiver_id.clone()) + .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) + .nft_on_transfer( + sender_id, + previous_token.owner_id.clone(), + token_id.clone(), + msg + ) + // We then resolve the promise and call nft_resolve_transfer on our own contract + .then( + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer + Self::ext(env::current_account_id()) + .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) + .nft_resolve_transfer( + authorized_id, // we introduce an authorized ID so that we can log the transfer + previous_token.owner_id, + receiver_id, + token_id, + previous_token.approved_account_ids, + memo, // we introduce a memo for logging in the events standard + ) + ).into() + } + + //get the information for a specific token ID + fn nft_token(&self, token_id: TokenId) -> Option { + //if there is some token ID in the tokens_by_id collection + if let Some(token) = self.tokens_by_id.get(&token_id) { + //we'll get the metadata for that token + let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); + //we return the JsonToken (wrapped by Some since we return an option) + Some(JsonToken { + token_id, + owner_id: token.owner_id, + metadata, + approved_account_ids: token.approved_account_ids, + royalty: token.royalty, + }) + } else { //if there wasn't a token ID in the tokens_by_id collection, we return None + None + } + } +} + +#[near_bindgen] +impl NonFungibleTokenResolver for Contract { + //resolves the cross contract call when calling nft_on_transfer in the nft_transfer_call method + //returns true if the token was successfully transferred to the receiver_id + #[private] + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce the approval map so we can keep track of what the approvals were before the transfer + approved_account_ids: HashMap, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool { + // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` + // call result. + if let PromiseResult::Successful(value) = env::promise_result(0) { + //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not + if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { + //if we need don't need to return the token, we simply return true meaning everything went fine + if !return_token { + /* + since we've already transferred the token and nft_on_transfer returned false, we don't have to + revert the original transfer and thus we can just return true since nothing went wrong. + */ + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + return true; + } + } + } + + //get the token object if there is some token object + let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { + if token.owner_id != receiver_id { + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + // The token is not owner by the receiver anymore. Can't return it. + return true; + } + token + //if there isn't a token object, it was burned and so we return true + } else { + //we refund the owner for releasing the storage used up by the approved account IDs + refund_approved_account_ids(owner_id, &approved_account_ids); + return true; + }; + + //we remove the token from the receiver + self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); + //we add the token to the original owner + self.internal_add_token_to_owner(&owner_id, &token_id); + + //we change the token struct's owner to be the original owner + token.owner_id = owner_id.clone(); + + //we refund the receiver any approved account IDs that they may have set on the token + refund_approved_account_ids(receiver_id.clone(), &token.approved_account_ids); + //reset the approved account IDs to what they were before the transfer + token.approved_account_ids = approved_account_ids; + + //we inset the token back into the tokens_by_id collection + self.tokens_by_id.insert(&token_id, &token); + + /* + We need to log that the NFT was reverted back to the original owner. + The old_owner_id will be the receiver and the new_owner_id will be the + original owner of the token since we're reverting the transfer. + */ + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: receiver_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: owner_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + //we perform the actual logging + env::log_str(&nft_transfer_log.to_string()); + + //return false + false + } +} diff --git a/nft-contract-basic copy/src/royalty.rs b/nft-contract-basic copy/src/royalty.rs new file mode 100644 index 0000000..7646f9e --- /dev/null +++ b/nft-contract-basic copy/src/royalty.rs @@ -0,0 +1,46 @@ +use crate::*; + +pub trait NonFungibleTokenCore { + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + #[payable] + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: U128, + max_len_payout: u32, + ) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} diff --git a/nft-contract-basic/src/tests.rs b/nft-contract-basic copy/src/tests.rs similarity index 100% rename from nft-contract-basic/src/tests.rs rename to nft-contract-basic copy/src/tests.rs diff --git a/nft-contract-basic/Cargo.toml b/nft-contract-basic/Cargo.toml index d0ab6ac..b1b459a 100644 --- a/nft-contract-basic/Cargo.toml +++ b/nft-contract-basic/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nft_contract_basic" +name = "nft_contract_skeleton" version = "0.1.0" authors = ["Near Inc "] edition = "2021" @@ -11,12 +11,6 @@ crate-type = ["cdylib", "rlib"] near-sdk = { version = "5.1.0", features = ["legacy"] } serde_json = "1.0.113" -[dev-dependencies] -near-sdk = { version = "5.1.0", features = ["unit-testing"] } -near-workspaces = { version = "0.10.0", features = ["unstable"] } -tokio = { version = "1.12.0", features = ["full"] } -serde_json = "1" - [profile.release] codegen-units = 1 # Tell `rustc` to optimize for small code size. diff --git a/nft-contract-basic/src/enumeration.rs b/nft-contract-basic/src/enumeration.rs index 5d1e0de..82c473a 100644 --- a/nft-contract-basic/src/enumeration.rs +++ b/nft-contract-basic/src/enumeration.rs @@ -4,25 +4,18 @@ use crate::*; impl Contract { //Query for the total supply of NFTs on the contract pub fn nft_total_supply(&self) -> U128 { - //return the length of the token metadata by ID - U128(self.token_metadata_by_id.len() as u128) + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } //Query for nft tokens on the contract regardless of the owner using pagination pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { - //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); - - //iterate through each token using an iterator - self.token_metadata_by_id.keys() - //skip to the index we specified in the start variable - .skip(start as usize) - //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 - .take(limit.unwrap_or(50) as usize) - //we'll map the token IDs which are strings into Json Tokens - .map(|token_id| self.nft_token(token_id.clone()).unwrap()) - //since we turned the keys into an iterator, we need to turn it back into a vector to return - .collect() + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } //get the total supply of NFTs for a given owner @@ -30,16 +23,10 @@ impl Contract { &self, account_id: AccountId, ) -> U128 { - //get the set of tokens for the passed in owner - let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - - //if there is some set of tokens, we'll return the length as a U128 - if let Some(tokens_for_owner_set) = tokens_for_owner_set { - U128(tokens_for_owner_set.len() as u128) - } else { - //if there isn't a set of tokens for the passed in account ID, we'll return 0 - U128(0) - } + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } //Query for all the tokens for an owner @@ -49,28 +36,9 @@ impl Contract { from_index: Option, limit: Option, ) -> Vec { - //get the set of tokens for the passed in owner - let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - //if there is some set of tokens, we'll set the tokens variable equal to that set - let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set - } else { - //if there is no set of tokens, we'll simply return an empty vector. - return vec![]; - }; - - //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); - - //iterate through the keys vector - tokens.iter() - //skip to the index we specified in the start variable - .skip(start as usize) - //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 - .take(limit.unwrap_or(50) as usize) - //we'll map the token IDs which are strings into Json Tokens - .map(|token_id| self.nft_token(token_id.clone()).unwrap()) - //since we turned the keys into an iterator, we need to turn it back into a vector to return - .collect() + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } -} +} \ No newline at end of file diff --git a/nft-contract-basic/src/internal.rs b/nft-contract-basic/src/internal.rs deleted file mode 100644 index 2432bb7..0000000 --- a/nft-contract-basic/src/internal.rs +++ /dev/null @@ -1,235 +0,0 @@ -use crate::*; -use near_sdk::{CryptoHash, NearToken}; -use std::mem::size_of; - -//convert the royalty percentage and amount to pay into a payout -pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { - amount_to_pay.saturating_mul(royalty_percentage) -} - -//calculate how many bytes the account ID is taking up -pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u128 { - // The extra 4 bytes are coming from Borsh serialization to store the length of the string. - account_id.as_str().len() as u128 + 4 + size_of::() as u128 -} - -//refund the storage taken up by passed in approved account IDs and send the funds to the passed in account ID. -pub(crate) fn refund_approved_account_ids_iter<'a, I>( - account_id: AccountId, - approved_account_ids: I, //the approved account IDs must be passed in as an iterator -) -> Promise where I: Iterator { - //get the storage total by going through and summing all the bytes for each approved account IDs - let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); - //transfer the account the storage that is released - Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) -} - -//refund a map of approved account IDs and send the funds to the passed in account ID -pub(crate) fn refund_approved_account_ids( - account_id: AccountId, - approved_account_ids: &HashMap, -) -> Promise { - //call the refund_approved_account_ids_iter with the approved account IDs as keys - refund_approved_account_ids_iter(account_id, approved_account_ids.keys()) -} - -//used to generate a unique prefix in our storage collections (this is to avoid data collisions) -pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { - //get the default hash - let mut hash = CryptoHash::default(); - //we hash the account ID and return it - hash.copy_from_slice(&env::sha256(account_id.as_bytes())); - hash -} - -//used to make sure the user attached exactly 1 yoctoNEAR -pub(crate) fn assert_one_yocto() { - assert_eq!( - env::attached_deposit(), - ONE_YOCTONEAR, - "Requires attached deposit of exactly 1 yoctoNEAR", - ) -} - -//Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) -pub(crate) fn assert_at_least_one_yocto() { - assert!( - env::attached_deposit().ge(&ONE_YOCTONEAR), - "Requires attached deposit of at least 1 yoctoNEAR", - ) -} - -//refund the initial deposit based on the amount of storage that was used up -pub(crate) fn refund_deposit(storage_used: u128) { - //get how much it would cost to store the information - let required_cost = env::storage_byte_cost().saturating_mul(storage_used); - //get the attached deposit - let attached_deposit = env::attached_deposit(); - - //make sure that the attached deposit is greater than or equal to the required cost - assert!( - required_cost <= attached_deposit, - "Must attach {} yoctoNEAR to cover storage", - required_cost, - ); - - //get the refund amount from the attached deposit - required cost - let refund = attached_deposit.saturating_sub(required_cost); - - //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund.gt(&ONE_YOCTONEAR) { - Promise::new(env::predecessor_account_id()).transfer(refund); - } -} - -impl Contract { - //add a token to the set of tokens an owner has - pub(crate) fn internal_add_token_to_owner( - &mut self, - account_id: &AccountId, - token_id: &TokenId, - ) { - //get the set of tokens for the given account - let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { - //if the account doesn't have any tokens, we create a new unordered set - UnorderedSet::new( - StorageKey::TokenPerOwnerInner { - //we get a new unique prefix for the collection - account_id_hash: hash_account_id(&account_id), - } - ) - }); - - //we insert the token ID into the set - tokens_set.insert(token_id); - - //we insert that set for the given account ID. - self.tokens_per_owner.insert(account_id, &tokens_set); - } - - //remove a token from an owner (internal method and can't be called directly via CLI). - pub(crate) fn internal_remove_token_from_owner( - &mut self, - account_id: &AccountId, - token_id: &TokenId, - ) { - //we get the set of tokens that the owner has - let mut tokens_set = self - .tokens_per_owner - .get(account_id) - //if there is no set of tokens for the owner, we panic with the following message: - .expect("Token should be owned by the sender"); - - //we remove the the token_id from the set of tokens - tokens_set.remove(token_id); - - //if the token set is now empty, we remove the owner from the tokens_per_owner collection - if tokens_set.is_empty() { - self.tokens_per_owner.remove(account_id); - } else { - //if the token set is not empty, we simply insert it back for the account ID. - self.tokens_per_owner.insert(account_id, &tokens_set); - } - } - - //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). - pub(crate) fn internal_transfer( - &mut self, - sender_id: &AccountId, - receiver_id: &AccountId, - token_id: &TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, - memo: Option, - ) -> Token { - //get the token object by passing in the token_id - let token = self.tokens_by_id.get(token_id).expect("No token"); - - //if the sender doesn't equal the owner, we check if the sender is in the approval list - if sender_id != &token.owner_id { - //if the token's approved account IDs doesn't contain the sender, we panic - if !token.approved_account_ids.contains_key(sender_id) { - env::panic_str("Unauthorized"); - } - - // If they included an approval_id, check if the sender's actual approval_id is the same as the one included - if let Some(enforced_approval_id) = approval_id { - //get the actual approval ID - let actual_approval_id = token - .approved_account_ids - .get(sender_id) - //if the sender isn't in the map, we panic - .expect("Sender is not approved account"); - - //make sure that the actual approval ID is the same as the one provided - assert_eq!( - actual_approval_id, &enforced_approval_id, - "The actual approval_id {} is different from the given approval_id {}", - actual_approval_id, enforced_approval_id, - ); - } - } - - //we make sure that the sender isn't sending the token to themselves - assert_ne!( - &token.owner_id, receiver_id, - "The token owner and the receiver should be different" - ); - - //we remove the token from it's current owner's set - self.internal_remove_token_from_owner(&token.owner_id, token_id); - //we then add the token to the receiver_id's set - self.internal_add_token_to_owner(receiver_id, token_id); - - //we create a new token struct - let new_token = Token { - owner_id: receiver_id.clone(), - //reset the approval account IDs - approved_account_ids: Default::default(), - next_approval_id: token.next_approval_id, - //we copy over the royalties from the previous token - royalty: token.royalty.clone(), - }; - //insert that new token into the tokens_by_id, replacing the old entry - self.tokens_by_id.insert(token_id, &new_token); - - //if there was some memo attached, we log it. - if let Some(memo) = memo.as_ref() { - env::log_str(&format!("Memo: {}", memo).to_string()); - } - - // Default the authorized ID to be None for the logs. - let mut authorized_id = None; - //if the approval ID was provided, set the authorized ID equal to the sender - if approval_id.is_some() { - authorized_id = Some(sender_id.to_string()); - } - - // Construct the transfer log as per the events standard. - let nft_transfer_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - // The optional authorized account ID to transfer the token on behalf of the old owner. - authorized_id, - // The old owner's account ID. - old_owner_id: token.owner_id.to_string(), - // The account ID of the new owner of the token. - new_owner_id: receiver_id.to_string(), - // A vector containing the token IDs as strings. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo, - }]), - }; - - // Log the serialized json. - env::log_str(&nft_transfer_log.to_string()); - - //return the previous token object that was transferred. - token - } -} \ No newline at end of file diff --git a/nft-contract-basic/src/lib.rs b/nft-contract-basic/src/lib.rs index 366fa65..3b08677 100644 --- a/nft-contract-basic/src/lib.rs +++ b/nft-contract-basic/src/lib.rs @@ -7,53 +7,32 @@ use near_sdk::{ env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; -use crate::internal::*; pub use crate::metadata::*; pub use crate::mint::*; pub use crate::nft_core::*; +pub use crate::events::*; pub use crate::approval::*; pub use crate::royalty::*; -pub use crate::events::*; -mod internal; -mod approval; mod enumeration; mod metadata; mod mint; mod nft_core; -mod royalty; mod events; - -/// This spec can be treated like a version of the standard. -pub const NFT_METADATA_SPEC: &str = "1.0.0"; -/// This is the name of the NFT standard we're using -pub const NFT_STANDARD_NAME: &str = "nep171"; - -//Basic NEAR amounts as constants -const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); +mod approval; +mod royalty; #[near_bindgen] #[derive(BorshSerialize, BorshDeserialize, BorshStorageKey, PanicOnDefault)] #[borsh(crate = "near_sdk::borsh")] pub struct Contract { - //contract owner - pub owner_id: AccountId, - - //keeps track of all the token IDs for a given account - pub tokens_per_owner: LookupMap>, - - //keeps track of the token struct for a given token ID - pub tokens_by_id: LookupMap, - - //keeps track of the token metadata for a given token ID - pub token_metadata_by_id: UnorderedMap, - - //keeps track of the metadata for the contract - pub metadata: LazyOption, + /* + FILL THIS IN + */ } /// Helper structure for keys of the persistent collections. -#[derive(BorshSerialize, BorshStorageKey)] +#[derive(BorshSerialize)] #[borsh(crate = "near_sdk::borsh")] pub enum StorageKey { TokensPerOwner, @@ -75,19 +54,10 @@ impl Contract { */ #[init] pub fn new_default_meta(owner_id: AccountId) -> Self { - //calls the other function "new: with some default metadata and the owner_id passed in - Self::new( - owner_id, - NFTContractMetadata { - spec: "nft-1.0.0".to_string(), - name: "NFT Tutorial Contract".to_string(), - symbol: "GOTEAM".to_string(), - icon: None, - base_uri: None, - reference: None, - reference_hash: None, - }, - ) + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } /* @@ -97,24 +67,9 @@ impl Contract { */ #[init] pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { - //create a variable of type Self with all the fields initialized. - let this = Self { - //Storage keys are simply the prefixes used for the collections. This helps avoid data collision - tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), - tokens_by_id: LookupMap::new(StorageKey::TokensById), - token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), - //set the owner_id field equal to the passed in owner_id. - owner_id, - metadata: LazyOption::new( - StorageKey::NFTContractMetadata, - Some(&metadata), - ), - }; - - //return the Contract object - this + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } -} - -#[cfg(test)] -mod tests; \ No newline at end of file +} \ No newline at end of file diff --git a/nft-contract-basic/src/metadata.rs b/nft-contract-basic/src/metadata.rs index 404d701..1127397 100644 --- a/nft-contract-basic/src/metadata.rs +++ b/nft-contract-basic/src/metadata.rs @@ -1,72 +1,45 @@ use crate::*; - pub type TokenId = String; - //defines the payout type we'll be returning as a part of the royalty standards. #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct NFTContractMetadata { - pub spec: String, // required, essentially a version like "nft-1.0.0" - pub name: String, // required, ex. "Mosaics" - pub symbol: String, // required, ex. "MOSAIC" - pub icon: Option, // Data URL - pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs - pub reference: Option, // URL to a JSON file with more info - pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + /* + FILL THIS IN + */ } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct TokenMetadata { - pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" - pub description: Option, // free-form description - pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage - pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. - pub copies: Option, // number of copies of this set of metadata in existence when token was minted. - pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds - pub expires_at: Option, // When token expires, Unix epoch in milliseconds - pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds - pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds - pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. - pub reference: Option, // URL to an off-chain JSON file with more info. - pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + /* + FILL THIS IN + */ } #[derive(BorshDeserialize, BorshSerialize)] #[borsh(crate = "near_sdk::borsh")] pub struct Token { - //owner of the token - pub owner_id: AccountId, - //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID - pub approved_account_ids: HashMap, - //the next approval ID to give out. - pub next_approval_id: u64, - //keep track of the royalty percentages for the token in a hash map - pub royalty: HashMap, + /* + FILL THIS IN + */ } //The Json token is what will be returned from view calls. #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct JsonToken { - //token ID - pub token_id: TokenId, - //owner of the token - pub owner_id: AccountId, - //token metadata - pub metadata: TokenMetadata, - //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID - pub approved_account_ids: HashMap, - //keep track of the royalty percentages for the token in a hash map - pub royalty: HashMap, + /* + FILL THIS IN + */ } pub trait NonFungibleTokenMetadata { @@ -77,6 +50,9 @@ pub trait NonFungibleTokenMetadata { #[near_bindgen] impl NonFungibleTokenMetadata for Contract { fn nft_metadata(&self) -> NFTContractMetadata { - self.metadata.get().unwrap() + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } } \ No newline at end of file diff --git a/nft-contract-basic/src/mint.rs b/nft-contract-basic/src/mint.rs index 37e71ef..ece73ad 100644 --- a/nft-contract-basic/src/mint.rs +++ b/nft-contract-basic/src/mint.rs @@ -5,77 +5,12 @@ impl Contract { #[payable] pub fn nft_mint( &mut self, - token_id: TokenId, + token_id: Option, metadata: TokenMetadata, - receiver_id: AccountId, - //we add an optional parameter for perpetual royalties - perpetual_royalties: Option>, + receiver_id: Option, ) { - //measure the initial storage being used on the contract - let initial_storage_usage = env::storage_usage(); - - // create a royalty map to store in the token - let mut royalty = HashMap::new(); - - // if perpetual royalties were passed into the function: - if let Some(perpetual_royalties) = perpetual_royalties { - //make sure that the length of the perpetual royalties is below 7 since we won't have enough GAS to pay out that many people - assert!(perpetual_royalties.len() < 7, "Cannot add more than 6 perpetual royalty amounts"); - - //iterate through the perpetual royalties and insert the account and amount in the royalty map - for (account, amount) in perpetual_royalties { - royalty.insert(account, amount); - } - } - - //specify the token struct that contains the owner ID - let token = Token { - //set the owner ID equal to the receiver ID passed into the function - owner_id: receiver_id, - //we set the approved account IDs to the default value (an empty map) - approved_account_ids: Default::default(), - //the next approval ID is set to 0 - next_approval_id: 0, - //the map of perpetual royalties for the token (The owner will get 100% - total perpetual royalties) - royalty, - }; - - //insert the token ID and token struct and make sure that the token doesn't exist - assert!( - self.tokens_by_id.insert(&token_id, &token).is_none(), - "Token already exists" - ); - - //insert the token ID and metadata - self.token_metadata_by_id.insert(&token_id, &metadata); - - //call the internal method for adding the token to the owner - self.internal_add_token_to_owner(&token.owner_id, &token_id); - - // Construct the mint log as per the events standard. - let nft_mint_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftMint(vec![NftMintLog { - // Owner of the token. - owner_id: token.owner_id.to_string(), - // Vector of token IDs that were minted. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo: None, - }]), - }; - - // Log the serialized json. - env::log_str(&nft_mint_log.to_string()); - - //calculate the required storage which was the used - initial - let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; - - //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. - refund_deposit(required_storage_in_bytes.into()); + /* + FILL THIS IN + */ } } \ No newline at end of file diff --git a/nft-contract-basic/src/nft_core.rs b/nft-contract-basic/src/nft_core.rs index 1ebc55e..3c35d2c 100644 --- a/nft-contract-basic/src/nft_core.rs +++ b/nft-contract-basic/src/nft_core.rs @@ -1,5 +1,5 @@ use crate::*; -use near_sdk::{ext_contract, Gas, PromiseResult}; +use near_sdk::{ext_contract, Gas, log, PromiseResult}; const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); @@ -10,19 +10,15 @@ pub trait NonFungibleTokenCore { &mut self, receiver_id: AccountId, token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, memo: Option, ); - // Transfers an NFT to a receiver and calls the - // function `nft_on_transfer` on their contract. + //transfers an NFT to a receiver and calls a function on the receiver ID's contract + /// Returns `true` if the token was transferred from the sender's account. fn nft_transfer_call( &mut self, receiver_id: AccountId, token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, memo: Option, msg: String, ) -> PromiseOrValue; @@ -45,23 +41,17 @@ trait NonFungibleTokenReceiver { } #[ext_contract(ext_self)] -/* - resolves the promise of the cross contract call to the receiver contract - this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called - as part of the nft_transfer_call method -*/ trait NonFungibleTokenResolver { + /* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method + */ fn nft_resolve_transfer( &mut self, - //we introduce an authorized ID for logging the transfer event - authorized_id: Option, owner_id: AccountId, receiver_id: AccountId, token_id: TokenId, - //we introduce the approval map so we can keep track of what the approvals were before the transfer - approved_account_ids: HashMap, - //we introduce a memo for logging the transfer event - memo: Option, ) -> bool; } @@ -73,29 +63,11 @@ impl NonFungibleTokenCore for Contract { &mut self, receiver_id: AccountId, token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, memo: Option, ) { - //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. - assert_one_yocto(); - //get the sender to transfer the token from the sender to the receiver - let sender_id = env::predecessor_account_id(); - - //call the internal transfer method and get back the previous token so we can refund the approved account IDs - let previous_token = self.internal_transfer( - &sender_id, - &receiver_id, - &token_id, - approval_id, - memo, - ); - - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids( - previous_token.owner_id.clone(), - &previous_token.approved_account_ids, - ); + /* + FILL THIS IN + */ } //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract @@ -104,76 +76,21 @@ impl NonFungibleTokenCore for Contract { &mut self, receiver_id: AccountId, token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, memo: Option, msg: String, ) -> PromiseOrValue { - //assert that the user attached exactly 1 yocto for security reasons. - assert_one_yocto(); - - //get the sender ID - let sender_id = env::predecessor_account_id(); - - //transfer the token and get the previous token object - let previous_token = self.internal_transfer( - &sender_id, - &receiver_id, - &token_id, - approval_id, - memo.clone(), - ); - - //default the authorized_id to none - let mut authorized_id = None; - //if the sender isn't the owner of the token, we set the authorized ID equal to the sender. - if sender_id != previous_token.owner_id { - authorized_id = Some(sender_id.to_string()); - } - - // Initiating receiver's call and the callback - // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. - ext_non_fungible_token_receiver::ext(receiver_id.clone()) - .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) - .nft_on_transfer( - sender_id, - previous_token.owner_id.clone(), - token_id.clone(), - msg - ) - // We then resolve the promise and call nft_resolve_transfer on our own contract - .then( - // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer - Self::ext(env::current_account_id()) - .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) - .nft_resolve_transfer( - authorized_id, // we introduce an authorized ID so that we can log the transfer - previous_token.owner_id, - receiver_id, - token_id, - previous_token.approved_account_ids, - memo, // we introduce a memo for logging in the events standard - ) - ).into() + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } //get the information for a specific token ID fn nft_token(&self, token_id: TokenId) -> Option { - //if there is some token ID in the tokens_by_id collection - if let Some(token) = self.tokens_by_id.get(&token_id) { - //we'll get the metadata for that token - let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); - //we return the JsonToken (wrapped by Some since we return an option) - Some(JsonToken { - token_id, - owner_id: token.owner_id, - metadata, - approved_account_ids: token.approved_account_ids, - royalty: token.royalty, - }) - } else { //if there wasn't a token ID in the tokens_by_id collection, we return None - None - } + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. } } @@ -184,95 +101,13 @@ impl NonFungibleTokenResolver for Contract { #[private] fn nft_resolve_transfer( &mut self, - //we introduce an authorized ID for logging the transfer event - authorized_id: Option, owner_id: AccountId, receiver_id: AccountId, token_id: TokenId, - //we introduce the approval map so we can keep track of what the approvals were before the transfer - approved_account_ids: HashMap, - //we introduce a memo for logging the transfer event - memo: Option, ) -> bool { - // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` - // call result. - if let PromiseResult::Successful(value) = env::promise_result(0) { - //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not - if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { - //if we need don't need to return the token, we simply return true meaning everything went fine - if !return_token { - /* - since we've already transferred the token and nft_on_transfer returned false, we don't have to - revert the original transfer and thus we can just return true since nothing went wrong. - */ - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids(owner_id, &approved_account_ids); - return true; - } - } - } - - //get the token object if there is some token object - let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { - if token.owner_id != receiver_id { - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids(owner_id, &approved_account_ids); - // The token is not owner by the receiver anymore. Can't return it. - return true; - } - token - //if there isn't a token object, it was burned and so we return true - } else { - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids(owner_id, &approved_account_ids); - return true; - }; - - //we remove the token from the receiver - self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); - //we add the token to the original owner - self.internal_add_token_to_owner(&owner_id, &token_id); - - //we change the token struct's owner to be the original owner - token.owner_id = owner_id.clone(); - - //we refund the receiver any approved account IDs that they may have set on the token - refund_approved_account_ids(receiver_id.clone(), &token.approved_account_ids); - //reset the approved account IDs to what they were before the transfer - token.approved_account_ids = approved_account_ids; - - //we inset the token back into the tokens_by_id collection - self.tokens_by_id.insert(&token_id, &token); - /* - We need to log that the NFT was reverted back to the original owner. - The old_owner_id will be the receiver and the new_owner_id will be the - original owner of the token since we're reverting the transfer. + FILL THIS IN */ - let nft_transfer_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - // The optional authorized account ID to transfer the token on behalf of the old owner. - authorized_id, - // The old owner's account ID. - old_owner_id: receiver_id.to_string(), - // The account ID of the new owner of the token. - new_owner_id: owner_id.to_string(), - // A vector containing the token IDs as strings. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo, - }]), - }; - - //we perform the actual logging - env::log_str(&nft_transfer_log.to_string()); - - //return false - false + todo!(); //remove once code is filled in. } } diff --git a/nft-contract-skeleton/Cargo.toml b/nft-contract-skeleton/Cargo.toml index ac9428c..b1b459a 100644 --- a/nft-contract-skeleton/Cargo.toml +++ b/nft-contract-skeleton/Cargo.toml @@ -9,7 +9,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] near-sdk = { version = "5.1.0", features = ["legacy"] } -schemars = { version = "0.8.16"} +serde_json = "1.0.113" [profile.release] codegen-units = 1 diff --git a/nft-contract-skeleton/src/events.rs b/nft-contract-skeleton/src/events.rs new file mode 100644 index 0000000..f65a3f4 --- /dev/null +++ b/nft-contract-skeleton/src/events.rs @@ -0,0 +1,138 @@ +use std::fmt; + +use near_sdk::serde::{Deserialize, Serialize}; + +/// Enum that represents the data type of the EventLog. +/// The enum can either be an NftMint or an NftTransfer. +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "event", content = "data")] +#[serde(rename_all = "snake_case")] +#[serde(crate = "near_sdk::serde")] +#[non_exhaustive] +pub enum EventLogVariant { + NftMint(Vec), + NftTransfer(Vec), +} + +/// Interface to capture data about an event +/// +/// Arguments: +/// * `standard`: name of standard e.g. nep171 +/// * `version`: e.g. 1.0.0 +/// * `event`: associate event data +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct EventLog { + pub standard: String, + pub version: String, + + // `flatten` to not have "event": {} in the JSON, just have the contents of {}. + #[serde(flatten)] + pub event: EventLogVariant, +} + +impl fmt::Display for EventLog { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!( + "EVENT_JSON:{}", + &serde_json::to_string(self).map_err(|_| fmt::Error)? + )) + } +} + +/// An event log to capture token minting +/// +/// Arguments +/// * `owner_id`: "account.near" +/// * `token_ids`: ["1", "abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftMintLog { + pub owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +/// An event log to capture token transfer +/// +/// Arguments +/// * `authorized_id`: approved account to transfer +/// * `old_owner_id`: "owner.near" +/// * `new_owner_id`: "receiver.near" +/// * `token_ids`: ["1", "12345abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftTransferLog { + #[serde(skip_serializing_if = "Option::is_none")] + pub authorized_id: Option, + + pub old_owner_id: String, + pub new_owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn nep_format_vector() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![ + NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }, + NftMintLog { + owner_id: "user1.near".to_owned(), + token_ids: vec!["meme".to_string()], + memo: None, + }, + ]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_mint() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_transfer_all_fields() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + authorized_id: Some("market.near".to_string()), + old_owner_id: "user1.near".to_string(), + new_owner_id: "user2.near".to_string(), + token_ids: vec!["token".to_string()], + memo: Some("Go Team!".to_owned()), + }]), + }; + assert_eq!(expected, log.to_string()); + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/lib.rs b/nft-contract-skeleton/src/lib.rs index 724ebf3..f3d898c 100644 --- a/nft-contract-skeleton/src/lib.rs +++ b/nft-contract-skeleton/src/lib.rs @@ -4,7 +4,7 @@ use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::json_types::{Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - near, env, AccountId, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, NearSchema + near_bindgen, env, AccountId, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; pub use crate::metadata::*; @@ -20,8 +20,9 @@ mod mint; mod nft_core; mod royalty; -#[near(contract_state)] -#[derive(PanicOnDefault)] +#[near_bindgen] +#[derive(BorshSerialize, BorshDeserialize, BorshStorageKey, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] pub struct Contract { /* FILL THIS IN From d4568b2153790ca0e6298040b73eb49b5d6f7d07 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 1 Apr 2024 17:31:32 +0200 Subject: [PATCH 16/28] splitted contracts into different stages --- market-contract/Cargo.toml | 4 +- market-contract/src/lib.rs | 3 +- market-contract/src/sale.rs | 15 +- market-contract/src/sale_views.rs | 26 +- market-contract/src/tests.rs | 11 +- nft-contract-approval/Cargo.toml | 10 +- nft-contract-approval/rust-toolchain.toml | 4 - nft-contract-approval/src/approval.rs | 12 +- nft-contract-approval/src/enumeration.rs | 26 +- nft-contract-approval/src/internal.rs | 17 +- nft-contract-approval/src/lib.rs | 15 +- nft-contract-approval/src/metadata.rs | 6 - nft-contract-approval/src/mint.rs | 25 +- nft-contract-approval/src/nft_core.rs | 16 +- nft-contract-approval/src/royalty.rs | 8 +- nft-contract-approval/src/tests.rs | 315 -------------------- nft-contract-basic copy/Cargo.toml | 28 -- nft-contract-basic copy/README.md | 1 - nft-contract-basic copy/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-contract-basic copy/rust-toolchain.toml | 4 - nft-contract-basic copy/src/approval.rs | 73 ----- nft-contract-basic copy/src/enumeration.rs | 76 ----- nft-contract-basic copy/src/events.rs | 138 --------- nft-contract-basic copy/src/internal.rs | 63 ---- nft-contract-basic copy/src/lib.rs | 120 -------- nft-contract-basic copy/src/metadata.rs | 72 ----- nft-contract-basic copy/src/mint.rs | 39 --- nft-contract-basic copy/src/nft_core.rs | 278 ----------------- nft-contract-basic copy/src/royalty.rs | 46 --- nft-contract-basic copy/src/tests.rs | 315 -------------------- nft-contract-basic/src/enumeration.rs | 77 +++-- nft-contract-basic/src/internal.rs | 161 ++++++++++ nft-contract-basic/src/lib.rs | 78 +++-- nft-contract-basic/src/metadata.rs | 46 +-- nft-contract-basic/src/mint.rs | 69 ++++- nft-contract-basic/src/nft_core.rs | 165 ++++++++-- nft-contract-basic/src/royalty.rs | 8 +- nft-contract-royalty/Cargo.toml | 10 +- nft-contract-royalty/rust-toolchain.toml | 4 - nft-contract-royalty/src/approval.rs | 12 +- nft-contract-royalty/src/enumeration.rs | 27 +- nft-contract-royalty/src/internal.rs | 10 +- nft-contract-royalty/src/lib.rs | 15 +- nft-contract-royalty/src/metadata.rs | 2 - nft-contract-royalty/src/mint.rs | 6 +- nft-contract-royalty/src/nft_core.rs | 15 +- nft-contract-royalty/src/tests.rs | 315 -------------------- nft-contract-skeleton/Cargo.toml | 1 - nft-contract-skeleton/src/enumeration.rs | 8 +- nft-contract-skeleton/src/events.rs | 138 --------- nft-contract-skeleton/src/internal.rs | 139 +++++++++ nft-contract-skeleton/src/lib.rs | 8 +- nft-contract-skeleton/src/metadata.rs | 4 +- nft-contract-skeleton/src/royalty.rs | 8 +- nft-series/Cargo.toml | 2 +- nft-series/src/enumeration.rs | 34 +-- nft-series/src/lib.rs | 2 +- nft-series/src/series.rs | 12 +- 58 files changed, 827 insertions(+), 2315 deletions(-) delete mode 100644 nft-contract-approval/rust-toolchain.toml delete mode 100644 nft-contract-approval/src/tests.rs delete mode 100644 nft-contract-basic copy/Cargo.toml delete mode 100644 nft-contract-basic copy/README.md delete mode 100755 nft-contract-basic copy/res/nft_simple.wasm delete mode 100644 nft-contract-basic copy/rust-toolchain.toml delete mode 100644 nft-contract-basic copy/src/approval.rs delete mode 100644 nft-contract-basic copy/src/enumeration.rs delete mode 100644 nft-contract-basic copy/src/events.rs delete mode 100644 nft-contract-basic copy/src/internal.rs delete mode 100644 nft-contract-basic copy/src/lib.rs delete mode 100644 nft-contract-basic copy/src/metadata.rs delete mode 100644 nft-contract-basic copy/src/mint.rs delete mode 100644 nft-contract-basic copy/src/nft_core.rs delete mode 100644 nft-contract-basic copy/src/royalty.rs delete mode 100644 nft-contract-basic copy/src/tests.rs create mode 100644 nft-contract-basic/src/internal.rs delete mode 100644 nft-contract-royalty/rust-toolchain.toml delete mode 100644 nft-contract-royalty/src/tests.rs delete mode 100644 nft-contract-skeleton/src/events.rs create mode 100644 nft-contract-skeleton/src/internal.rs diff --git a/market-contract/Cargo.toml b/market-contract/Cargo.toml index 4b7b8bf..55b4a83 100644 --- a/market-contract/Cargo.toml +++ b/market-contract/Cargo.toml @@ -8,10 +8,10 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = { version = "5.0.0", features = ["legacy"] } +near-sdk = { version = "5.1.0", features = ["legacy"] } [dev-dependencies] -near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-sdk = { version = "5.1.0", features = ["unit-testing"] } near-workspaces = { version = "0.10.0", features = ["unstable"] } tokio = { version = "1.12.0", features = ["full"] } serde_json = "1" diff --git a/market-contract/src/lib.rs b/market-contract/src/lib.rs index f3a943d..f7b5b73 100644 --- a/market-contract/src/lib.rs +++ b/market-contract/src/lib.rs @@ -1,6 +1,5 @@ use near_sdk::borsh::{BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{U128, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ assert_one_yocto, env, ext_contract, near_bindgen, AccountId, NearToken, Gas, PanicOnDefault, @@ -30,7 +29,7 @@ const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); static DELIMETER: &str = "."; //Creating custom types to use within the contract. This makes things more readable. -pub type SalePriceInYoctoNear = U128; +pub type SalePriceInYoctoNear = NearToken; pub type TokenId = String; pub type FungibleTokenId = AccountId; pub type ContractAndTokenId = String; diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index 420a3c9..7782ab2 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -83,7 +83,7 @@ impl Contract { &mut self, nft_contract_id: AccountId, token_id: String, - price: U128, + price: NearToken, ) { //assert that the user has attached exactly 1 yoctoNEAR (for security reasons) assert_one_yocto(); @@ -126,12 +126,11 @@ impl Contract { //get the buyer ID which is the person who called the function and make sure they're not the owner of the sale let buyer_id = env::predecessor_account_id(); assert_ne!(sale.owner_id, buyer_id, "Cannot bid on your own sale."); - - //get the u128 price of the token (dot 0 converts from U128 to u128) - let price = sale.sale_conditions.0; + + let price = sale.sale_conditions; //make sure the deposit is greater than the price - assert!(deposit.ge(&NearToken::from_yoctonear(price)), "Attached deposit must be greater than or equal to the current price: {:?}", price); + assert!(deposit.ge(&price), "Attached deposit must be greater than or equal to the current price: {:?}", price); //process the purchase (which will remove the sale, transfer and get the payout from the nft contract, and then distribute royalties) self.process_purchase( @@ -285,12 +284,12 @@ impl Contract { //we need to enforce that the user has enough storage for 1 EXTRA sale. - //get the storage for a sale. dot 0 converts from U128 to u128 + //get the storage for a sale let storage_amount = self.storage_minimum_balance(); //get the total storage paid by the owner let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(ZERO_NEAR); //get the storage required which is simply the storage for the number of sales they have + 1 - let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()).0 + 1).into()); + let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()) + 1).into()); //make sure that the total paid is >= the required storage assert!( @@ -369,6 +368,6 @@ trait ExtSelf { fn resolve_purchase( &mut self, buyer_id: AccountId, - price: U128, + price: NearToken, ) -> Promise; } \ No newline at end of file diff --git a/market-contract/src/sale_views.rs b/market-contract/src/sale_views.rs index 43c76e3..ac60f42 100644 --- a/market-contract/src/sale_views.rs +++ b/market-contract/src/sale_views.rs @@ -7,24 +7,24 @@ impl Contract { //returns the number of sales the marketplace has up (as a string) pub fn get_supply_sales( &self, - ) -> U64 { - //returns the sales object length wrapped as a U64 - U64(self.sales.len()) + ) -> u64 { + //returns the sales object length + self.sales.len() } //returns the number of sales for a given account (result is a string) pub fn get_supply_by_owner_id( &self, account_id: AccountId, - ) -> U64 { + ) -> u64 { //get the set of sales for the given owner Id let by_owner_id = self.by_owner_id.get(&account_id); //if there as some set, we return the length but if there wasn't a set, we return 0 if let Some(by_owner_id) = by_owner_id { - U64(by_owner_id.len()) + by_owner_id.len() } else { - U64(0) + 0 } } @@ -32,7 +32,7 @@ impl Contract { pub fn get_sales_by_owner_id( &self, account_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { //get the set of token IDs for sale for the given account ID @@ -48,7 +48,7 @@ impl Contract { let keys = sales.as_vector(); //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through the keys vector keys.iter() @@ -66,15 +66,15 @@ impl Contract { pub fn get_supply_by_nft_contract_id( &self, nft_contract_id: AccountId, - ) -> U64 { + ) -> u64 { //get the set of tokens for associated with the given nft contract let by_nft_contract_id = self.by_nft_contract_id.get(&nft_contract_id); //if there was some set, return it's length. Otherwise return 0 if let Some(by_nft_contract_id) = by_nft_contract_id { - U64(by_nft_contract_id.len()) + by_nft_contract_id.len() } else { - U64(0) + 0 } } @@ -82,7 +82,7 @@ impl Contract { pub fn get_sales_by_nft_contract_id( &self, nft_contract_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { //get the set of token IDs for sale for the given contract ID @@ -99,7 +99,7 @@ impl Contract { let keys = sales.as_vector(); //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through the keys vector keys.iter() diff --git a/market-contract/src/tests.rs b/market-contract/src/tests.rs index ae84ea0..345c9fd 100644 --- a/market-contract/src/tests.rs +++ b/market-contract/src/tests.rs @@ -5,7 +5,6 @@ use crate::Contract; use near_sdk::{ collections::UnorderedSet, env, - json_types::{U128, U64}, NearToken, test_utils::{accounts, VMContextBuilder}, testing_env, AccountId, @@ -119,10 +118,10 @@ fn test_remove_sale() { let token_id = String::from("0n3C0ntr4ctT0Rul3Th3m4ll"); let sale = Sale { owner_id: accounts(0).clone(), //owner of the sale / token - approval_id: U64(1).0, //approval ID for that token that was given to the market + approval_id: 1, //approval ID for that token that was given to the market nft_contract_id: env::predecessor_account_id().to_string(), //NFT contract the token was minted on token_id: token_id.clone(), //the actual token ID - sale_conditions: U128(100), //the sale conditions -- price in YOCTO NEAR + sale_conditions: NearToken::from_yoctonear(100), //the sale conditions -- price in YOCTO NEAR }; let nft_contract_id = env::predecessor_account_id(); let contract_and_token_id = format!("{}{}{}", nft_contract_id, ".", token_id); @@ -167,10 +166,10 @@ fn test_update_price() { // add sale let token_id = String::from("0n3C0ntr4ctT0Rul3Th3m4ll"); - let nft_bid_yocto = U128(100); + let nft_bid_yocto = NearToken::from_yoctonear(100); let sale = Sale { owner_id: accounts(0).clone(), //owner of the sale / token - approval_id: U64(1).0, //approval ID for that token that was given to the market + approval_id: 1, //approval ID for that token that was given to the market nft_contract_id: env::predecessor_account_id().to_string(), //NFT contract the token was minted on token_id: token_id.clone(), //the actual token ID sale_conditions: nft_bid_yocto, //the sale conditions -- price in YOCTO NEAR @@ -189,7 +188,7 @@ fn test_update_price() { assert_eq!(contract.sales.len(), 1, "Failed to insert sale to contract"); // update price - let new_price = U128(150); + let new_price = NearToken::from_yoctonear(150); testing_env!(context .storage_usage(env::storage_usage()) .attached_deposit(ONE_YOCTONEAR) diff --git a/nft-contract-approval/Cargo.toml b/nft-contract-approval/Cargo.toml index 30d80e7..b1b459a 100644 --- a/nft-contract-approval/Cargo.toml +++ b/nft-contract-approval/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nft_contract" +name = "nft_contract_skeleton" version = "0.1.0" authors = ["Near Inc "] edition = "2021" @@ -8,15 +8,9 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = { version = "5.0.0", features = ["legacy"] } +near-sdk = { version = "5.1.0", features = ["legacy"] } serde_json = "1.0.113" -[dev-dependencies] -near-sdk = { version = "5.0.0", features = ["unit-testing"] } -near-workspaces = { version = "0.10.0", features = ["unstable"] } -tokio = { version = "1.12.0", features = ["full"] } -serde_json = "1" - [profile.release] codegen-units = 1 # Tell `rustc` to optimize for small code size. diff --git a/nft-contract-approval/rust-toolchain.toml b/nft-contract-approval/rust-toolchain.toml deleted file mode 100644 index 97c2073..0000000 --- a/nft-contract-approval/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["wasm32-unknown-unknown"] \ No newline at end of file diff --git a/nft-contract-approval/src/approval.rs b/nft-contract-approval/src/approval.rs index 61bba70..3dda71a 100644 --- a/nft-contract-approval/src/approval.rs +++ b/nft-contract-approval/src/approval.rs @@ -6,7 +6,7 @@ pub trait NonFungibleTokenCore { fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option); //check if the passed in account has access to approve the token ID - fn nft_is_approved( + fn nft_is_approved( &self, token_id: TokenId, approved_account_id: AccountId, @@ -78,7 +78,7 @@ impl NonFungibleTokenCore for Contract { self.tokens_by_id.insert(&token_id, &token); //refund any excess storage attached by the user. If the user didn't attach enough, panic. - refund_deposit(storage_used.into()); + refund_deposit(storage_used); //if some message was passed into the function, we initiate a cross contract call on the //account we're giving access to. @@ -103,10 +103,10 @@ impl NonFungibleTokenCore for Contract { ) -> bool { //get the token object from the token_id let token = self.tokens_by_id.get(&token_id).expect("No token"); - + //get the approval number for the passed in account ID - let approval = token.approved_account_ids.get(&approved_account_id); - + let approval = token.approved_account_ids.get(&approved_account_id); + //if there was some approval ID found for the account ID if let Some(approval) = approval { //if a specific approval_id was passed into the function @@ -117,7 +117,7 @@ impl NonFungibleTokenCore for Contract { } else { true } - //if there was no approval ID found for the account ID, we simply return false + //if there was no approval ID found for the account ID, we simply return false } else { false } diff --git a/nft-contract-approval/src/enumeration.rs b/nft-contract-approval/src/enumeration.rs index 5d1e0de..c7f3633 100644 --- a/nft-contract-approval/src/enumeration.rs +++ b/nft-contract-approval/src/enumeration.rs @@ -3,15 +3,15 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> U128 { + pub fn nft_total_supply(&self) -> u64 { //return the length of the token metadata by ID - U128(self.token_metadata_by_id.len() as u128) + self.token_metadata_by_id.len() } //Query for nft tokens on the contract regardless of the owner using pagination - pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through each token using an iterator self.token_metadata_by_id.keys() @@ -27,18 +27,18 @@ impl Contract { //get the total supply of NFTs for a given owner pub fn nft_supply_for_owner( - &self, - account_id: AccountId, - ) -> U128 { + &self, + account_id: AccountId, + ) -> u64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - //if there is some set of tokens, we'll return the length as a U128 + //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - U128(tokens_for_owner_set.len() as u128) + tokens_for_owner_set.len() } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - U128(0) + 0 } } @@ -46,7 +46,7 @@ impl Contract { pub fn nft_tokens_for_owner( &self, account_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { //get the set of tokens for the passed in owner @@ -60,7 +60,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through the keys vector tokens.iter() @@ -73,4 +73,4 @@ impl Contract { //since we turned the keys into an iterator, we need to turn it back into a vector to return .collect() } -} +} \ No newline at end of file diff --git a/nft-contract-approval/src/internal.rs b/nft-contract-approval/src/internal.rs index 2432bb7..ca112f7 100644 --- a/nft-contract-approval/src/internal.rs +++ b/nft-contract-approval/src/internal.rs @@ -1,12 +1,7 @@ use crate::*; -use near_sdk::{CryptoHash, NearToken}; +use near_sdk::{CryptoHash}; use std::mem::size_of; -//convert the royalty percentage and amount to pay into a payout -pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { - amount_to_pay.saturating_mul(royalty_percentage) -} - //calculate how many bytes the account ID is taking up pub(crate) fn bytes_for_approved_account_id(account_id: &AccountId) -> u128 { // The extra 4 bytes are coming from Borsh serialization to store the length of the string. @@ -46,7 +41,7 @@ pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { pub(crate) fn assert_one_yocto() { assert_eq!( env::attached_deposit(), - ONE_YOCTONEAR, + NearToken::from_yoctonear(1), "Requires attached deposit of exactly 1 yoctoNEAR", ) } @@ -54,7 +49,7 @@ pub(crate) fn assert_one_yocto() { //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { assert!( - env::attached_deposit().ge(&ONE_YOCTONEAR), + env::attached_deposit() >= NearToken::from_yoctonear(1), "Requires attached deposit of at least 1 yoctoNEAR", ) } @@ -96,7 +91,7 @@ impl Contract { StorageKey::TokenPerOwnerInner { //we get a new unique prefix for the collection account_id_hash: hash_account_id(&account_id), - } + }, ) }); @@ -127,7 +122,7 @@ impl Contract { if tokens_set.is_empty() { self.tokens_per_owner.remove(account_id); } else { - //if the token set is not empty, we simply insert it back for the account ID. + //if the token set is not empty, we simply insert it back for the account ID. self.tokens_per_owner.insert(account_id, &tokens_set); } } @@ -187,8 +182,6 @@ impl Contract { //reset the approval account IDs approved_account_ids: Default::default(), next_approval_id: token.next_approval_id, - //we copy over the royalties from the previous token - royalty: token.royalty.clone(), }; //insert that new token into the tokens_by_id, replacing the old entry self.tokens_by_id.insert(token_id, &new_token); diff --git a/nft-contract-approval/src/lib.rs b/nft-contract-approval/src/lib.rs index 7c81433..a37235c 100644 --- a/nft-contract-approval/src/lib.rs +++ b/nft-contract-approval/src/lib.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::json_types::Base64VecU8; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema + near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; use crate::internal::*; @@ -16,12 +16,12 @@ pub use crate::royalty::*; pub use crate::events::*; mod internal; -mod approval; mod enumeration; mod metadata; mod mint; mod nft_core; -mod royalty; +mod approval; +mod royalty; mod events; /// This spec can be treated like a version of the standard. @@ -33,7 +33,7 @@ pub const NFT_STANDARD_NAME: &str = "nep171"; const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); #[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, BorshStorageKey, PanicOnDefault)] +#[derive(BorshSerialize, BorshDeserialize, PanicOnDefault)] #[borsh(crate = "near_sdk::borsh")] pub struct Contract { //contract owner @@ -114,7 +114,4 @@ impl Contract { //return the Contract object this } -} - -#[cfg(test)] -mod tests; \ No newline at end of file +} \ No newline at end of file diff --git a/nft-contract-approval/src/metadata.rs b/nft-contract-approval/src/metadata.rs index 404d701..dc74200 100644 --- a/nft-contract-approval/src/metadata.rs +++ b/nft-contract-approval/src/metadata.rs @@ -1,7 +1,5 @@ use crate::*; - pub type TokenId = String; - //defines the payout type we'll be returning as a part of the royalty standards. #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] @@ -49,8 +47,6 @@ pub struct Token { pub approved_account_ids: HashMap, //the next approval ID to give out. pub next_approval_id: u64, - //keep track of the royalty percentages for the token in a hash map - pub royalty: HashMap, } //The Json token is what will be returned from view calls. @@ -65,8 +61,6 @@ pub struct JsonToken { pub metadata: TokenMetadata, //list of approved account IDs that have access to transfer the token. This maps an account ID to an approval ID pub approved_account_ids: HashMap, - //keep track of the royalty percentages for the token in a hash map - pub royalty: HashMap, } pub trait NonFungibleTokenMetadata { diff --git a/nft-contract-approval/src/mint.rs b/nft-contract-approval/src/mint.rs index 37e71ef..cb053e7 100644 --- a/nft-contract-approval/src/mint.rs +++ b/nft-contract-approval/src/mint.rs @@ -13,45 +13,42 @@ impl Contract { ) { //measure the initial storage being used on the contract let initial_storage_usage = env::storage_usage(); - + // create a royalty map to store in the token let mut royalty = HashMap::new(); - + // if perpetual royalties were passed into the function: if let Some(perpetual_royalties) = perpetual_royalties { //make sure that the length of the perpetual royalties is below 7 since we won't have enough GAS to pay out that many people assert!(perpetual_royalties.len() < 7, "Cannot add more than 6 perpetual royalty amounts"); - + //iterate through the perpetual royalties and insert the account and amount in the royalty map for (account, amount) in perpetual_royalties { royalty.insert(account, amount); } } - + //specify the token struct that contains the owner ID let token = Token { - //set the owner ID equal to the receiver ID passed into the function owner_id: receiver_id, //we set the approved account IDs to the default value (an empty map) approved_account_ids: Default::default(), //the next approval ID is set to 0 next_approval_id: 0, - //the map of perpetual royalties for the token (The owner will get 100% - total perpetual royalties) - royalty, }; - + //insert the token ID and token struct and make sure that the token doesn't exist assert!( self.tokens_by_id.insert(&token_id, &token).is_none(), "Token already exists" ); - + //insert the token ID and metadata self.token_metadata_by_id.insert(&token_id, &metadata); - + //call the internal method for adding the token to the owner self.internal_add_token_to_owner(&token.owner_id, &token_id); - + // Construct the mint log as per the events standard. let nft_mint_log: EventLog = EventLog { // Standard name ("nep171"). @@ -68,13 +65,13 @@ impl Contract { memo: None, }]), }; - + // Log the serialized json. env::log_str(&nft_mint_log.to_string()); - + //calculate the required storage which was the used - initial let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; - + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. refund_deposit(required_storage_in_bytes.into()); } diff --git a/nft-contract-approval/src/nft_core.rs b/nft-contract-approval/src/nft_core.rs index 1ebc55e..1be044e 100644 --- a/nft-contract-approval/src/nft_core.rs +++ b/nft-contract-approval/src/nft_core.rs @@ -1,5 +1,5 @@ use crate::*; -use near_sdk::{ext_contract, Gas, PromiseResult}; +use near_sdk::{ext_contract, Gas, log, PromiseResult}; const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); @@ -45,12 +45,12 @@ trait NonFungibleTokenReceiver { } #[ext_contract(ext_self)] -/* - resolves the promise of the cross contract call to the receiver contract - this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called - as part of the nft_transfer_call method -*/ trait NonFungibleTokenResolver { + /* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method + */ fn nft_resolve_transfer( &mut self, //we introduce an authorized ID for logging the transfer event @@ -169,7 +169,6 @@ impl NonFungibleTokenCore for Contract { owner_id: token.owner_id, metadata, approved_account_ids: token.approved_account_ids, - royalty: token.royalty, }) } else { //if there wasn't a token ID in the tokens_by_id collection, we return None None @@ -228,6 +227,9 @@ impl NonFungibleTokenResolver for Contract { return true; }; + //if at the end, we haven't returned true, that means that we should return the token to it's original owner + log!("Return {} from @{} to @{}", token_id, receiver_id, owner_id); + //we remove the token from the receiver self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); //we add the token to the original owner diff --git a/nft-contract-approval/src/royalty.rs b/nft-contract-approval/src/royalty.rs index 7646f9e..beb2fc2 100644 --- a/nft-contract-approval/src/royalty.rs +++ b/nft-contract-approval/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout; } @@ -20,7 +20,7 @@ pub trait NonFungibleTokenCore { impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -35,7 +35,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-contract-approval/src/tests.rs b/nft-contract-approval/src/tests.rs deleted file mode 100644 index e018ad7..0000000 --- a/nft-contract-approval/src/tests.rs +++ /dev/null @@ -1,315 +0,0 @@ -/* unit tests */ -#[cfg(test)] -use crate::Contract; -use crate::TokenMetadata; -use crate::approval::NonFungibleTokenCore; -use near_sdk::json_types::{U128, U64}; -use near_sdk::test_utils::{accounts, VMContextBuilder}; -use near_sdk::{testing_env, NearToken}; -use near_sdk::{env, AccountId}; -use std::collections::HashMap; - -const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); -const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); -const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); - - -fn get_context(predecessor: AccountId) -> VMContextBuilder { - let mut builder = VMContextBuilder::new(); - builder.predecessor_account_id(predecessor); - builder -} - -fn sample_token_metadata() -> TokenMetadata { - TokenMetadata { - title: Some("Olympus Mons".into()), - description: Some("The tallest mountain in the charted solar system".into()), - media: None, - media_hash: None, - copies: Some(1u64), - issued_at: None, - expires_at: None, - starts_at: None, - updated_at: None, - extra: None, - reference: None, - reference_hash: None, - } -} - -#[test] -#[should_panic(expected = "The contract is not initialized")] -fn test_default() { - let context = get_context(accounts(1)); - testing_env!(context.build()); - let _contract = Contract::default(); -} - -#[test] -fn test_new_account_contract() { - let mut context = get_context(accounts(1)); - testing_env!(context.build()); - let contract = Contract::new_default_meta(accounts(1).into()); - testing_env!(context.is_view(true).build()); - let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); - assert_eq!(contract_nft_tokens.len(), 0); -} - -#[test] -fn test_mint_nft() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_metadata: TokenMetadata = sample_token_metadata(); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), token_metadata, accounts(0), None); - let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); - assert_eq!(contract_nft_tokens.len(), 1); - - assert_eq!(contract_nft_tokens[0].token_id, token_id); - assert_eq!(contract_nft_tokens[0].owner_id, accounts(0)); - assert_eq!( - contract_nft_tokens[0].metadata.title, - sample_token_metadata().title - ); - assert_eq!( - contract_nft_tokens[0].metadata.description, - sample_token_metadata().description - ); - assert_eq!( - contract_nft_tokens[0].metadata.media, - sample_token_metadata().media - ); - assert_eq!(contract_nft_tokens[0].approved_account_ids, HashMap::new()); -} - -#[test] -fn test_internal_transfer() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.internal_transfer( - &accounts(0), - &accounts(1), - &token_id.clone(), - Some(U64(1).0), - None, - ); - - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_yoctonear(0)) - .build()); - - let tokens = contract.nft_tokens_for_owner(accounts(1), Some(U128(0)), None); - assert_ne!( - tokens.len(), - 0, - "Token not correctly created and/or sent to second account" - ); - let token = &tokens[0]; - assert_eq!(token.token_id, token_id); - assert_eq!(token.owner_id, accounts(1)); - assert_eq!(token.metadata.title, sample_token_metadata().title); - assert_eq!( - token.metadata.description, - sample_token_metadata().description - ); - assert_eq!(token.metadata.media, sample_token_metadata().media); - assert_eq!(token.approved_account_ids, HashMap::new()); -} - -#[test] -fn test_nft_approve() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(contract.nft_is_approved(token_id.clone(), accounts(1), None)); -} - -#[test] -fn test_nft_revoke() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - // alice revokes bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_revoke(token_id.clone(), accounts(1)); - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), None)); -} - -#[test] -fn test_revoke_all() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - // alice revokes bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_revoke_all(token_id.clone()); - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), Some(1))); -} - -#[test] -fn test_internal_remove_token_from_owner() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - let contract_nft_tokens_before = contract.nft_tokens_for_owner(accounts(0), None, None); - assert_eq!(contract_nft_tokens_before.len(), 1); - - contract.internal_remove_token_from_owner(&accounts(0), &token_id); - let contract_nft_tokens_after = contract.nft_tokens_for_owner(accounts(0), None, None); - assert_eq!(contract_nft_tokens_after.len(), 0); -} - -#[test] -fn test_nft_payout() { - use crate::royalty::NonFungibleTokenCore; - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - let payout = contract.nft_payout(token_id.clone(), NearToken::from_millinear(10), 1); - let expected = HashMap::from([(accounts(0), NearToken::from_near(100))]); - assert_eq!(payout.payout, expected); -} - -#[test] -fn test_nft_total_supply() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - let total_supply = contract.nft_total_supply(); - assert_eq!(total_supply, U128(1)); -} \ No newline at end of file diff --git a/nft-contract-basic copy/Cargo.toml b/nft-contract-basic copy/Cargo.toml deleted file mode 100644 index d0ab6ac..0000000 --- a/nft-contract-basic copy/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "nft_contract_basic" -version = "0.1.0" -authors = ["Near Inc "] -edition = "2021" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -near-sdk = { version = "5.1.0", features = ["legacy"] } -serde_json = "1.0.113" - -[dev-dependencies] -near-sdk = { version = "5.1.0", features = ["unit-testing"] } -near-workspaces = { version = "0.10.0", features = ["unstable"] } -tokio = { version = "1.12.0", features = ["full"] } -serde_json = "1" - -[profile.release] -codegen-units = 1 -# Tell `rustc` to optimize for small code size. -opt-level = "z" -lto = true -debug = false -panic = "abort" -# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 -overflow-checks = true diff --git a/nft-contract-basic copy/README.md b/nft-contract-basic copy/README.md deleted file mode 100644 index 7064491..0000000 --- a/nft-contract-basic copy/README.md +++ /dev/null @@ -1 +0,0 @@ -# TBD diff --git a/nft-contract-basic copy/res/nft_simple.wasm b/nft-contract-basic copy/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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 - - //check if the passed in account has access to approve the token ID - fn nft_is_approved( - &self, - token_id: TokenId, - approved_account_id: AccountId, - approval_id: Option, - ) -> bool; - - //revoke a specific account from transferring the token on your behalf - fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId); - - //revoke all accounts from transferring the token on your behalf - fn nft_revoke_all(&mut self, token_id: TokenId); -} - -#[ext_contract(ext_non_fungible_approval_receiver)] -trait NonFungibleTokenApprovalsReceiver { - //cross contract call to an external contract that is initiated during nft_approve - fn nft_on_approve( - &mut self, - token_id: TokenId, - owner_id: AccountId, - approval_id: u64, - msg: String, - ); -} - -#[near_bindgen] -impl NonFungibleTokenCore for Contract { - //allow a specific account ID to approve a token on your behalf - #[payable] - fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) { - /* - FILL THIS IN - */ - } - - //check if the passed in account has access to approve the token ID - fn nft_is_approved( - &self, - token_id: TokenId, - approved_account_id: AccountId, - approval_id: Option, - ) -> bool { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. - } - - //revoke a specific account from transferring the token on your behalf - #[payable] - fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { - /* - FILL THIS IN - */ - } - - //revoke all accounts from transferring the token on your behalf - #[payable] - fn nft_revoke_all(&mut self, token_id: TokenId) { - /* - FILL THIS IN - */ - } -} \ No newline at end of file diff --git a/nft-contract-basic copy/src/enumeration.rs b/nft-contract-basic copy/src/enumeration.rs deleted file mode 100644 index 5d1e0de..0000000 --- a/nft-contract-basic copy/src/enumeration.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::*; - -#[near_bindgen] -impl Contract { - //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> U128 { - //return the length of the token metadata by ID - U128(self.token_metadata_by_id.len() as u128) - } - - //Query for nft tokens on the contract regardless of the owner using pagination - pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { - //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); - - //iterate through each token using an iterator - self.token_metadata_by_id.keys() - //skip to the index we specified in the start variable - .skip(start as usize) - //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 - .take(limit.unwrap_or(50) as usize) - //we'll map the token IDs which are strings into Json Tokens - .map(|token_id| self.nft_token(token_id.clone()).unwrap()) - //since we turned the keys into an iterator, we need to turn it back into a vector to return - .collect() - } - - //get the total supply of NFTs for a given owner - pub fn nft_supply_for_owner( - &self, - account_id: AccountId, - ) -> U128 { - //get the set of tokens for the passed in owner - let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - - //if there is some set of tokens, we'll return the length as a U128 - if let Some(tokens_for_owner_set) = tokens_for_owner_set { - U128(tokens_for_owner_set.len() as u128) - } else { - //if there isn't a set of tokens for the passed in account ID, we'll return 0 - U128(0) - } - } - - //Query for all the tokens for an owner - pub fn nft_tokens_for_owner( - &self, - account_id: AccountId, - from_index: Option, - limit: Option, - ) -> Vec { - //get the set of tokens for the passed in owner - let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - //if there is some set of tokens, we'll set the tokens variable equal to that set - let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set - } else { - //if there is no set of tokens, we'll simply return an empty vector. - return vec![]; - }; - - //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); - - //iterate through the keys vector - tokens.iter() - //skip to the index we specified in the start variable - .skip(start as usize) - //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 - .take(limit.unwrap_or(50) as usize) - //we'll map the token IDs which are strings into Json Tokens - .map(|token_id| self.nft_token(token_id.clone()).unwrap()) - //since we turned the keys into an iterator, we need to turn it back into a vector to return - .collect() - } -} diff --git a/nft-contract-basic copy/src/events.rs b/nft-contract-basic copy/src/events.rs deleted file mode 100644 index f65a3f4..0000000 --- a/nft-contract-basic copy/src/events.rs +++ /dev/null @@ -1,138 +0,0 @@ -use std::fmt; - -use near_sdk::serde::{Deserialize, Serialize}; - -/// Enum that represents the data type of the EventLog. -/// The enum can either be an NftMint or an NftTransfer. -#[derive(Serialize, Deserialize, Debug)] -#[serde(tag = "event", content = "data")] -#[serde(rename_all = "snake_case")] -#[serde(crate = "near_sdk::serde")] -#[non_exhaustive] -pub enum EventLogVariant { - NftMint(Vec), - NftTransfer(Vec), -} - -/// Interface to capture data about an event -/// -/// Arguments: -/// * `standard`: name of standard e.g. nep171 -/// * `version`: e.g. 1.0.0 -/// * `event`: associate event data -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "near_sdk::serde")] -pub struct EventLog { - pub standard: String, - pub version: String, - - // `flatten` to not have "event": {} in the JSON, just have the contents of {}. - #[serde(flatten)] - pub event: EventLogVariant, -} - -impl fmt::Display for EventLog { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_fmt(format_args!( - "EVENT_JSON:{}", - &serde_json::to_string(self).map_err(|_| fmt::Error)? - )) - } -} - -/// An event log to capture token minting -/// -/// Arguments -/// * `owner_id`: "account.near" -/// * `token_ids`: ["1", "abc"] -/// * `memo`: optional message -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "near_sdk::serde")] -pub struct NftMintLog { - pub owner_id: String, - pub token_ids: Vec, - - #[serde(skip_serializing_if = "Option::is_none")] - pub memo: Option, -} - -/// An event log to capture token transfer -/// -/// Arguments -/// * `authorized_id`: approved account to transfer -/// * `old_owner_id`: "owner.near" -/// * `new_owner_id`: "receiver.near" -/// * `token_ids`: ["1", "12345abc"] -/// * `memo`: optional message -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "near_sdk::serde")] -pub struct NftTransferLog { - #[serde(skip_serializing_if = "Option::is_none")] - pub authorized_id: Option, - - pub old_owner_id: String, - pub new_owner_id: String, - pub token_ids: Vec, - - #[serde(skip_serializing_if = "Option::is_none")] - pub memo: Option, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn nep_format_vector() { - let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; - let log = EventLog { - standard: "nep171".to_string(), - version: "1.0.0".to_string(), - event: EventLogVariant::NftMint(vec![ - NftMintLog { - owner_id: "foundation.near".to_owned(), - token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], - memo: None, - }, - NftMintLog { - owner_id: "user1.near".to_owned(), - token_ids: vec!["meme".to_string()], - memo: None, - }, - ]), - }; - assert_eq!(expected, log.to_string()); - } - - #[test] - fn nep_format_mint() { - let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; - let log = EventLog { - standard: "nep171".to_string(), - version: "1.0.0".to_string(), - event: EventLogVariant::NftMint(vec![NftMintLog { - owner_id: "foundation.near".to_owned(), - token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], - memo: None, - }]), - }; - assert_eq!(expected, log.to_string()); - } - - #[test] - fn nep_format_transfer_all_fields() { - let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; - let log = EventLog { - standard: "nep171".to_string(), - version: "1.0.0".to_string(), - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - authorized_id: Some("market.near".to_string()), - old_owner_id: "user1.near".to_string(), - new_owner_id: "user2.near".to_string(), - token_ids: vec!["token".to_string()], - memo: Some("Go Team!".to_owned()), - }]), - }; - assert_eq!(expected, log.to_string()); - } -} \ No newline at end of file diff --git a/nft-contract-basic copy/src/internal.rs b/nft-contract-basic copy/src/internal.rs deleted file mode 100644 index 40fb72a..0000000 --- a/nft-contract-basic copy/src/internal.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::*; -use near_sdk::{CryptoHash}; -use std::mem::size_of; - -//used to generate a unique prefix in our storage collections (this is to avoid data collisions) -pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { - //get the default hash - let mut hash = CryptoHash::default(); - //we hash the account ID and return it - hash.copy_from_slice(&env::sha256(account_id.as_bytes())); - hash -} - -//refund the initial deposit based on the amount of storage that was used up -pub(crate) fn refund_deposit(storage_used: u64) { - //get how much it would cost to store the information - let required_cost = env::storage_byte_cost() * Balance::from(storage_used); - //get the attached deposit - let attached_deposit = env::attached_deposit(); - - //make sure that the attached deposit is greater than or equal to the required cost - assert!( - required_cost <= attached_deposit, - "Must attach {} yoctoNEAR to cover storage", - required_cost, - ); - - //get the refund amount from the attached deposit - required cost - let refund = attached_deposit - required_cost; - - //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund > 1 { - Promise::new(env::predecessor_account_id()).transfer(refund); - } -} - -impl Contract { - //add a token to the set of tokens an owner has - pub(crate) fn internal_add_token_to_owner( - &mut self, - account_id: &AccountId, - token_id: &TokenId, - ) { - //get the set of tokens for the given account - let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { - //if the account doesn't have any tokens, we create a new unordered set - UnorderedSet::new( - StorageKey::TokenPerOwnerInner { - //we get a new unique prefix for the collection - account_id_hash: hash_account_id(&account_id), - } - .try_to_vec() - .unwrap(), - ) - }); - - //we insert the token ID into the set - tokens_set.insert(token_id); - - //we insert that set for the given account ID. - self.tokens_per_owner.insert(account_id, &tokens_set); - } -} \ No newline at end of file diff --git a/nft-contract-basic copy/src/lib.rs b/nft-contract-basic copy/src/lib.rs deleted file mode 100644 index 636f5e2..0000000 --- a/nft-contract-basic copy/src/lib.rs +++ /dev/null @@ -1,120 +0,0 @@ -use std::collections::HashMap; -use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; -use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U128}; -use near_sdk::serde::{Deserialize, Serialize}; -use near_sdk::{ - env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema -}; - -use crate::internal::*; -pub use crate::metadata::*; -pub use crate::mint::*; -pub use crate::nft_core::*; -pub use crate::events::*; -pub use crate::approval::*; -pub use crate::royalty::*; - -mod internal; -mod enumeration; -mod metadata; -mod mint; -mod nft_core; -mod events; -mod approval; -mod royalty; - -/// This spec can be treated like a version of the standard. -pub const NFT_METADATA_SPEC: &str = "1.0.0"; -/// This is the name of the NFT standard we're using -pub const NFT_STANDARD_NAME: &str = "nep171"; - -//Basic NEAR amounts as constants -const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); - -#[near_bindgen] -#[derive(BorshSerialize, BorshDeserialize, BorshStorageKey, PanicOnDefault)] -#[borsh(crate = "near_sdk::borsh")] -pub struct Contract { - //contract owner - pub owner_id: AccountId, - - //keeps track of all the token IDs for a given account - pub tokens_per_owner: LookupMap>, - - //keeps track of the token struct for a given token ID - pub tokens_by_id: LookupMap, - - //keeps track of the token metadata for a given token ID - pub token_metadata_by_id: UnorderedMap, - - //keeps track of the metadata for the contract - pub metadata: LazyOption, -} - -/// Helper structure for keys of the persistent collections. -#[derive(BorshSerialize, BorshStorageKey)] -#[borsh(crate = "near_sdk::borsh")] -pub enum StorageKey { - TokensPerOwner, - TokenPerOwnerInner { account_id_hash: CryptoHash }, - TokensById, - TokenMetadataById, - NFTContractMetadata, - TokensPerType, - TokensPerTypeInner { token_type_hash: CryptoHash }, - TokenTypesLocked, -} - -#[near_bindgen] -impl Contract { - /* - initialization function (can only be called once). - this initializes the contract with default metadata so the - user doesn't have to manually type metadata. - */ - #[init] - pub fn new_default_meta(owner_id: AccountId) -> Self { - //calls the other function "new: with some default metadata and the owner_id passed in - Self::new( - owner_id, - NFTContractMetadata { - spec: "nft-1.0.0".to_string(), - name: "NFT Tutorial Contract".to_string(), - symbol: "GOTEAM".to_string(), - icon: None, - base_uri: None, - reference: None, - reference_hash: None, - }, - ) - } - - /* - initialization function (can only be called once). - this initializes the contract with metadata that was passed in and - the owner_id. - */ - #[init] - pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { - //create a variable of type Self with all the fields initialized. - let this = Self { - //Storage keys are simply the prefixes used for the collections. This helps avoid data collision - tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), - tokens_by_id: LookupMap::new(StorageKey::TokensById), - token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), - //set the owner_id field equal to the passed in owner_id. - owner_id, - metadata: LazyOption::new( - StorageKey::NFTContractMetadata, - Some(&metadata), - ), - }; - - //return the Contract object - this - } -} - -#[cfg(test)] -mod tests; \ No newline at end of file diff --git a/nft-contract-basic copy/src/metadata.rs b/nft-contract-basic copy/src/metadata.rs deleted file mode 100644 index f25dece..0000000 --- a/nft-contract-basic copy/src/metadata.rs +++ /dev/null @@ -1,72 +0,0 @@ -use crate::*; - -pub type TokenId = String; - -//defines the payout type we'll be returning as a part of the royalty standards. -#[derive(Serialize, Deserialize, NearSchema)] -#[serde(crate = "near_sdk::serde")] -pub struct Payout { - pub payout: HashMap, -} - -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] -#[borsh(crate = "near_sdk::borsh")] -#[serde(crate = "near_sdk::serde")] -pub struct NFTContractMetadata { - pub spec: String, // required, essentially a version like "nft-1.0.0" - pub name: String, // required, ex. "Mosaics" - pub symbol: String, // required, ex. "MOSAIC" - pub icon: Option, // Data URL - pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs - pub reference: Option, // URL to a JSON file with more info - pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. -} - -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] -#[borsh(crate = "near_sdk::borsh")] -#[serde(crate = "near_sdk::serde")] -pub struct TokenMetadata { - pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" - pub description: Option, // free-form description - pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage - pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. - pub copies: Option, // number of copies of this set of metadata in existence when token was minted. - pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds - pub expires_at: Option, // When token expires, Unix epoch in milliseconds - pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds - pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds - pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. - pub reference: Option, // URL to an off-chain JSON file with more info. - pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. -} - -#[derive(BorshDeserialize, BorshSerialize)] -#[borsh(crate = "near_sdk::borsh")] -pub struct Token { - //owner of the token - pub owner_id: AccountId -} - -//The Json token is what will be returned from view calls. -#[derive(Serialize, Deserialize, NearSchema)] -#[serde(crate = "near_sdk::serde")] -pub struct JsonToken { - //token ID - pub token_id: TokenId, - //owner of the token - pub owner_id: AccountId, - //token metadata - pub metadata: TokenMetadata -} - -pub trait NonFungibleTokenMetadata { - //view call for returning the contract metadata - fn nft_metadata(&self) -> NFTContractMetadata; -} - -#[near_bindgen] -impl NonFungibleTokenMetadata for Contract { - fn nft_metadata(&self) -> NFTContractMetadata { - self.metadata.get().unwrap() - } -} \ No newline at end of file diff --git a/nft-contract-basic copy/src/mint.rs b/nft-contract-basic copy/src/mint.rs deleted file mode 100644 index 21db9fe..0000000 --- a/nft-contract-basic copy/src/mint.rs +++ /dev/null @@ -1,39 +0,0 @@ -use crate::*; - -#[near_bindgen] -impl Contract { - #[payable] - pub fn nft_mint( - &mut self, - token_id: TokenId, - metadata: TokenMetadata, - receiver_id: AccountId, - ) { - //measure the initial storage being used on the contract - let initial_storage_usage = env::storage_usage(); - - //specify the token struct that contains the owner ID - let token = Token { - //set the owner ID equal to the receiver ID passed into the function - owner_id: receiver_id, - }; - - //insert the token ID and token struct and make sure that the token doesn't exist - assert!( - self.tokens_by_id.insert(&token_id, &token).is_none(), - "Token already exists" - ); - - //insert the token ID and metadata - self.token_metadata_by_id.insert(&token_id, &metadata); - - //call the internal method for adding the token to the owner - self.internal_add_token_to_owner(&token.owner_id, &token_id); - - //calculate the required storage which was the used - initial - let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; - - //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. - refund_deposit(required_storage_in_bytes); - } -} \ No newline at end of file diff --git a/nft-contract-basic copy/src/nft_core.rs b/nft-contract-basic copy/src/nft_core.rs deleted file mode 100644 index 1ebc55e..0000000 --- a/nft-contract-basic copy/src/nft_core.rs +++ /dev/null @@ -1,278 +0,0 @@ -use crate::*; -use near_sdk::{ext_contract, Gas, PromiseResult}; - -const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); -const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); - -pub trait NonFungibleTokenCore { - //transfers an NFT to a receiver ID - fn nft_transfer( - &mut self, - receiver_id: AccountId, - token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, - memo: Option, - ); - - // Transfers an NFT to a receiver and calls the - // function `nft_on_transfer` on their contract. - fn nft_transfer_call( - &mut self, - receiver_id: AccountId, - token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, - memo: Option, - msg: String, - ) -> PromiseOrValue; - - //get information about the NFT token passed in - fn nft_token(&self, token_id: TokenId) -> Option; -} - -#[ext_contract(ext_non_fungible_token_receiver)] -trait NonFungibleTokenReceiver { - //Method stored on the receiver contract that is called via cross contract call when nft_transfer_call is called - /// Returns `true` if the token should be returned back to the sender. - fn nft_on_transfer( - &mut self, - sender_id: AccountId, - previous_owner_id: AccountId, - token_id: TokenId, - msg: String, - ) -> Promise; -} - -#[ext_contract(ext_self)] -/* - resolves the promise of the cross contract call to the receiver contract - this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called - as part of the nft_transfer_call method -*/ -trait NonFungibleTokenResolver { - fn nft_resolve_transfer( - &mut self, - //we introduce an authorized ID for logging the transfer event - authorized_id: Option, - owner_id: AccountId, - receiver_id: AccountId, - token_id: TokenId, - //we introduce the approval map so we can keep track of what the approvals were before the transfer - approved_account_ids: HashMap, - //we introduce a memo for logging the transfer event - memo: Option, - ) -> bool; -} - -#[near_bindgen] -impl NonFungibleTokenCore for Contract { - //implementation of the nft_transfer method. This transfers the NFT from the current owner to the receiver. - #[payable] - fn nft_transfer( - &mut self, - receiver_id: AccountId, - token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, - memo: Option, - ) { - //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. - assert_one_yocto(); - //get the sender to transfer the token from the sender to the receiver - let sender_id = env::predecessor_account_id(); - - //call the internal transfer method and get back the previous token so we can refund the approved account IDs - let previous_token = self.internal_transfer( - &sender_id, - &receiver_id, - &token_id, - approval_id, - memo, - ); - - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids( - previous_token.owner_id.clone(), - &previous_token.approved_account_ids, - ); - } - - //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract - #[payable] - fn nft_transfer_call( - &mut self, - receiver_id: AccountId, - token_id: TokenId, - //we introduce an approval ID so that people with that approval ID can transfer the token - approval_id: Option, - memo: Option, - msg: String, - ) -> PromiseOrValue { - //assert that the user attached exactly 1 yocto for security reasons. - assert_one_yocto(); - - //get the sender ID - let sender_id = env::predecessor_account_id(); - - //transfer the token and get the previous token object - let previous_token = self.internal_transfer( - &sender_id, - &receiver_id, - &token_id, - approval_id, - memo.clone(), - ); - - //default the authorized_id to none - let mut authorized_id = None; - //if the sender isn't the owner of the token, we set the authorized ID equal to the sender. - if sender_id != previous_token.owner_id { - authorized_id = Some(sender_id.to_string()); - } - - // Initiating receiver's call and the callback - // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. - ext_non_fungible_token_receiver::ext(receiver_id.clone()) - .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) - .nft_on_transfer( - sender_id, - previous_token.owner_id.clone(), - token_id.clone(), - msg - ) - // We then resolve the promise and call nft_resolve_transfer on our own contract - .then( - // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer - Self::ext(env::current_account_id()) - .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) - .nft_resolve_transfer( - authorized_id, // we introduce an authorized ID so that we can log the transfer - previous_token.owner_id, - receiver_id, - token_id, - previous_token.approved_account_ids, - memo, // we introduce a memo for logging in the events standard - ) - ).into() - } - - //get the information for a specific token ID - fn nft_token(&self, token_id: TokenId) -> Option { - //if there is some token ID in the tokens_by_id collection - if let Some(token) = self.tokens_by_id.get(&token_id) { - //we'll get the metadata for that token - let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); - //we return the JsonToken (wrapped by Some since we return an option) - Some(JsonToken { - token_id, - owner_id: token.owner_id, - metadata, - approved_account_ids: token.approved_account_ids, - royalty: token.royalty, - }) - } else { //if there wasn't a token ID in the tokens_by_id collection, we return None - None - } - } -} - -#[near_bindgen] -impl NonFungibleTokenResolver for Contract { - //resolves the cross contract call when calling nft_on_transfer in the nft_transfer_call method - //returns true if the token was successfully transferred to the receiver_id - #[private] - fn nft_resolve_transfer( - &mut self, - //we introduce an authorized ID for logging the transfer event - authorized_id: Option, - owner_id: AccountId, - receiver_id: AccountId, - token_id: TokenId, - //we introduce the approval map so we can keep track of what the approvals were before the transfer - approved_account_ids: HashMap, - //we introduce a memo for logging the transfer event - memo: Option, - ) -> bool { - // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` - // call result. - if let PromiseResult::Successful(value) = env::promise_result(0) { - //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not - if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { - //if we need don't need to return the token, we simply return true meaning everything went fine - if !return_token { - /* - since we've already transferred the token and nft_on_transfer returned false, we don't have to - revert the original transfer and thus we can just return true since nothing went wrong. - */ - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids(owner_id, &approved_account_ids); - return true; - } - } - } - - //get the token object if there is some token object - let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { - if token.owner_id != receiver_id { - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids(owner_id, &approved_account_ids); - // The token is not owner by the receiver anymore. Can't return it. - return true; - } - token - //if there isn't a token object, it was burned and so we return true - } else { - //we refund the owner for releasing the storage used up by the approved account IDs - refund_approved_account_ids(owner_id, &approved_account_ids); - return true; - }; - - //we remove the token from the receiver - self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); - //we add the token to the original owner - self.internal_add_token_to_owner(&owner_id, &token_id); - - //we change the token struct's owner to be the original owner - token.owner_id = owner_id.clone(); - - //we refund the receiver any approved account IDs that they may have set on the token - refund_approved_account_ids(receiver_id.clone(), &token.approved_account_ids); - //reset the approved account IDs to what they were before the transfer - token.approved_account_ids = approved_account_ids; - - //we inset the token back into the tokens_by_id collection - self.tokens_by_id.insert(&token_id, &token); - - /* - We need to log that the NFT was reverted back to the original owner. - The old_owner_id will be the receiver and the new_owner_id will be the - original owner of the token since we're reverting the transfer. - */ - let nft_transfer_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - // The optional authorized account ID to transfer the token on behalf of the old owner. - authorized_id, - // The old owner's account ID. - old_owner_id: receiver_id.to_string(), - // The account ID of the new owner of the token. - new_owner_id: owner_id.to_string(), - // A vector containing the token IDs as strings. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo, - }]), - }; - - //we perform the actual logging - env::log_str(&nft_transfer_log.to_string()); - - //return false - false - } -} diff --git a/nft-contract-basic copy/src/royalty.rs b/nft-contract-basic copy/src/royalty.rs deleted file mode 100644 index 7646f9e..0000000 --- a/nft-contract-basic copy/src/royalty.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::*; - -pub trait NonFungibleTokenCore { - //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; - - //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. - fn nft_transfer_payout( - &mut self, - receiver_id: AccountId, - token_id: TokenId, - approval_id: u64, - memo: Option, - balance: U128, - max_len_payout: u32, - ) -> Payout; -} - -#[near_bindgen] -impl NonFungibleTokenCore for Contract { - - //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. - } - - //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. - #[payable] - fn nft_transfer_payout( - &mut self, - receiver_id: AccountId, - token_id: TokenId, - approval_id: u64, - memo: Option, - balance: U128, - max_len_payout: u32, - ) -> Payout { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. - } -} diff --git a/nft-contract-basic copy/src/tests.rs b/nft-contract-basic copy/src/tests.rs deleted file mode 100644 index e018ad7..0000000 --- a/nft-contract-basic copy/src/tests.rs +++ /dev/null @@ -1,315 +0,0 @@ -/* unit tests */ -#[cfg(test)] -use crate::Contract; -use crate::TokenMetadata; -use crate::approval::NonFungibleTokenCore; -use near_sdk::json_types::{U128, U64}; -use near_sdk::test_utils::{accounts, VMContextBuilder}; -use near_sdk::{testing_env, NearToken}; -use near_sdk::{env, AccountId}; -use std::collections::HashMap; - -const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); -const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); -const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); - - -fn get_context(predecessor: AccountId) -> VMContextBuilder { - let mut builder = VMContextBuilder::new(); - builder.predecessor_account_id(predecessor); - builder -} - -fn sample_token_metadata() -> TokenMetadata { - TokenMetadata { - title: Some("Olympus Mons".into()), - description: Some("The tallest mountain in the charted solar system".into()), - media: None, - media_hash: None, - copies: Some(1u64), - issued_at: None, - expires_at: None, - starts_at: None, - updated_at: None, - extra: None, - reference: None, - reference_hash: None, - } -} - -#[test] -#[should_panic(expected = "The contract is not initialized")] -fn test_default() { - let context = get_context(accounts(1)); - testing_env!(context.build()); - let _contract = Contract::default(); -} - -#[test] -fn test_new_account_contract() { - let mut context = get_context(accounts(1)); - testing_env!(context.build()); - let contract = Contract::new_default_meta(accounts(1).into()); - testing_env!(context.is_view(true).build()); - let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); - assert_eq!(contract_nft_tokens.len(), 0); -} - -#[test] -fn test_mint_nft() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_metadata: TokenMetadata = sample_token_metadata(); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), token_metadata, accounts(0), None); - let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); - assert_eq!(contract_nft_tokens.len(), 1); - - assert_eq!(contract_nft_tokens[0].token_id, token_id); - assert_eq!(contract_nft_tokens[0].owner_id, accounts(0)); - assert_eq!( - contract_nft_tokens[0].metadata.title, - sample_token_metadata().title - ); - assert_eq!( - contract_nft_tokens[0].metadata.description, - sample_token_metadata().description - ); - assert_eq!( - contract_nft_tokens[0].metadata.media, - sample_token_metadata().media - ); - assert_eq!(contract_nft_tokens[0].approved_account_ids, HashMap::new()); -} - -#[test] -fn test_internal_transfer() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.internal_transfer( - &accounts(0), - &accounts(1), - &token_id.clone(), - Some(U64(1).0), - None, - ); - - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_yoctonear(0)) - .build()); - - let tokens = contract.nft_tokens_for_owner(accounts(1), Some(U128(0)), None); - assert_ne!( - tokens.len(), - 0, - "Token not correctly created and/or sent to second account" - ); - let token = &tokens[0]; - assert_eq!(token.token_id, token_id); - assert_eq!(token.owner_id, accounts(1)); - assert_eq!(token.metadata.title, sample_token_metadata().title); - assert_eq!( - token.metadata.description, - sample_token_metadata().description - ); - assert_eq!(token.metadata.media, sample_token_metadata().media); - assert_eq!(token.approved_account_ids, HashMap::new()); -} - -#[test] -fn test_nft_approve() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(contract.nft_is_approved(token_id.clone(), accounts(1), None)); -} - -#[test] -fn test_nft_revoke() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - // alice revokes bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_revoke(token_id.clone(), accounts(1)); - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), None)); -} - -#[test] -fn test_revoke_all() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - // alice revokes bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_revoke_all(token_id.clone()); - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), Some(1))); -} - -#[test] -fn test_internal_remove_token_from_owner() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - let contract_nft_tokens_before = contract.nft_tokens_for_owner(accounts(0), None, None); - assert_eq!(contract_nft_tokens_before.len(), 1); - - contract.internal_remove_token_from_owner(&accounts(0), &token_id); - let contract_nft_tokens_after = contract.nft_tokens_for_owner(accounts(0), None, None); - assert_eq!(contract_nft_tokens_after.len(), 0); -} - -#[test] -fn test_nft_payout() { - use crate::royalty::NonFungibleTokenCore; - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - let payout = contract.nft_payout(token_id.clone(), NearToken::from_millinear(10), 1); - let expected = HashMap::from([(accounts(0), NearToken::from_near(100))]); - assert_eq!(payout.payout, expected); -} - -#[test] -fn test_nft_total_supply() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - let total_supply = contract.nft_total_supply(); - assert_eq!(total_supply, U128(1)); -} \ No newline at end of file diff --git a/nft-contract-basic/src/enumeration.rs b/nft-contract-basic/src/enumeration.rs index 82c473a..859d21d 100644 --- a/nft-contract-basic/src/enumeration.rs +++ b/nft-contract-basic/src/enumeration.rs @@ -3,42 +3,75 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> U128 { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + pub fn nft_total_supply(&self) -> u64 { + //return the length of the token metadata by ID + self.token_metadata_by_id.len() } //Query for nft tokens on the contract regardless of the owner using pagination - pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(0)); + + //iterate through each token using an iterator + self.token_metadata_by_id.keys() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() } //get the total supply of NFTs for a given owner pub fn nft_supply_for_owner( - &self, - account_id: AccountId, - ) -> U128 { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + &self, + account_id: AccountId, + ) -> u64 { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + + //if there is some set of tokens, we'll return the length + if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set.len() + } else { + //if there isn't a set of tokens for the passed in account ID, we'll return 0 + 0 + } } + //Query for all the tokens for an owner //Query for all the tokens for an owner pub fn nft_tokens_for_owner( &self, account_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + //if there is some set of tokens, we'll set the tokens variable equal to that set + let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set + } else { + //if there is no set of tokens, we'll simply return an empty vector. + return vec![]; + }; + + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(0)); + + //iterate through the keys vector + tokens.iter() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() } } \ No newline at end of file diff --git a/nft-contract-basic/src/internal.rs b/nft-contract-basic/src/internal.rs new file mode 100644 index 0000000..fb8747d --- /dev/null +++ b/nft-contract-basic/src/internal.rs @@ -0,0 +1,161 @@ +use crate::*; +use near_sdk::{CryptoHash}; +use std::mem::size_of; + +//used to generate a unique prefix in our storage collections (this is to avoid data collisions) +pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { + //get the default hash + let mut hash = CryptoHash::default(); + //we hash the account ID and return it + hash.copy_from_slice(&env::sha256(account_id.as_bytes())); + hash +} + +//used to make sure the user attached exactly 1 yoctoNEAR +pub(crate) fn assert_one_yocto() { + assert_eq!( + env::attached_deposit(), + NearToken::from_yoctonear(1), + "Requires attached deposit of exactly 1 yoctoNEAR", + ) +} + +//refund the initial deposit based on the amount of storage that was used up +pub(crate) fn refund_deposit(storage_used: u128) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit.saturating_sub(required_cost); + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund.gt(&ONE_YOCTONEAR) { + Promise::new(env::predecessor_account_id()).transfer(refund); + } +} + +impl Contract { + //add a token to the set of tokens an owner has + pub(crate) fn internal_add_token_to_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //get the set of tokens for the given account + let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { + //if the account doesn't have any tokens, we create a new unordered set + UnorderedSet::new( + StorageKey::TokenPerOwnerInner { + //we get a new unique prefix for the collection + account_id_hash: hash_account_id(&account_id), + }, + ) + }); + + //we insert the token ID into the set + tokens_set.insert(token_id); + + //we insert that set for the given account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + + //remove a token from an owner (internal method and can't be called directly via CLI). + pub(crate) fn internal_remove_token_from_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //we get the set of tokens that the owner has + let mut tokens_set = self + .tokens_per_owner + .get(account_id) + //if there is no set of tokens for the owner, we panic with the following message: + .expect("Token should be owned by the sender"); + + //we remove the the token_id from the set of tokens + tokens_set.remove(token_id); + + //if the token set is now empty, we remove the owner from the tokens_per_owner collection + if tokens_set.is_empty() { + self.tokens_per_owner.remove(account_id); + } else { + //if the token set is not empty, we simply insert it back for the account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + } + + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + pub(crate) fn internal_transfer( + &mut self, + sender_id: &AccountId, + receiver_id: &AccountId, + token_id: &TokenId, + memo: Option, + ) -> Token { + //get the token object by passing in the token_id + let token = self.tokens_by_id.get(token_id).expect("No token"); + + //we make sure that the sender isn't sending the token to themselves + assert_ne!( + &token.owner_id, receiver_id, + "The token owner and the receiver should be different" + ); + + //we remove the token from it's current owner's set + self.internal_remove_token_from_owner(&token.owner_id, token_id); + //we then add the token to the receiver_id's set + self.internal_add_token_to_owner(receiver_id, token_id); + + //we create a new token struct + let new_token = Token { + owner_id: receiver_id.clone(), + }; + //insert that new token into the tokens_by_id, replacing the old entry + self.tokens_by_id.insert(token_id, &new_token); + + //if there was some memo attached, we log it. + if let Some(memo) = memo.as_ref() { + env::log_str(&format!("Memo: {}", memo).to_string()); + } + + // Default the authorized ID to be None for the logs. // We will return here in the future when we study the approval functionality + let mut authorized_id = None; + + // Construct the transfer log as per the events standard. + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: token.owner_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: receiver_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_transfer_log.to_string()); + + //return the previous token object that was transferred. + token + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/lib.rs b/nft-contract-basic/src/lib.rs index 3b08677..a37235c 100644 --- a/nft-contract-basic/src/lib.rs +++ b/nft-contract-basic/src/lib.rs @@ -1,38 +1,59 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::json_types::Base64VecU8; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema + near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; +use crate::internal::*; pub use crate::metadata::*; pub use crate::mint::*; pub use crate::nft_core::*; -pub use crate::events::*; pub use crate::approval::*; pub use crate::royalty::*; +pub use crate::events::*; +mod internal; mod enumeration; mod metadata; mod mint; mod nft_core; -mod events; mod approval; -mod royalty; +mod royalty; +mod events; + +/// This spec can be treated like a version of the standard. +pub const NFT_METADATA_SPEC: &str = "1.0.0"; +/// This is the name of the NFT standard we're using +pub const NFT_STANDARD_NAME: &str = "nep171"; + +//Basic NEAR amounts as constants +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); #[near_bindgen] -#[derive(BorshSerialize, BorshDeserialize, BorshStorageKey, PanicOnDefault)] +#[derive(BorshSerialize, BorshDeserialize, PanicOnDefault)] #[borsh(crate = "near_sdk::borsh")] pub struct Contract { - /* - FILL THIS IN - */ + //contract owner + pub owner_id: AccountId, + + //keeps track of all the token IDs for a given account + pub tokens_per_owner: LookupMap>, + + //keeps track of the token struct for a given token ID + pub tokens_by_id: LookupMap, + + //keeps track of the token metadata for a given token ID + pub token_metadata_by_id: UnorderedMap, + + //keeps track of the metadata for the contract + pub metadata: LazyOption, } /// Helper structure for keys of the persistent collections. -#[derive(BorshSerialize)] +#[derive(BorshSerialize, BorshStorageKey)] #[borsh(crate = "near_sdk::borsh")] pub enum StorageKey { TokensPerOwner, @@ -54,10 +75,19 @@ impl Contract { */ #[init] pub fn new_default_meta(owner_id: AccountId) -> Self { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + //calls the other function "new: with some default metadata and the owner_id passed in + Self::new( + owner_id, + NFTContractMetadata { + spec: "nft-1.0.0".to_string(), + name: "NFT Tutorial Contract".to_string(), + symbol: "GOTEAM".to_string(), + icon: None, + base_uri: None, + reference: None, + reference_hash: None, + }, + ) } /* @@ -67,9 +97,21 @@ impl Contract { */ #[init] pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + //create a variable of type Self with all the fields initialized. + let this = Self { + //Storage keys are simply the prefixes used for the collections. This helps avoid data collision + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: LookupMap::new(StorageKey::TokensById), + token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), + //set the owner_id field equal to the passed in owner_id. + owner_id, + metadata: LazyOption::new( + StorageKey::NFTContractMetadata, + Some(&metadata), + ), + }; + + //return the Contract object + this } } \ No newline at end of file diff --git a/nft-contract-basic/src/metadata.rs b/nft-contract-basic/src/metadata.rs index 1127397..1578d88 100644 --- a/nft-contract-basic/src/metadata.rs +++ b/nft-contract-basic/src/metadata.rs @@ -4,42 +4,57 @@ pub type TokenId = String; #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct NFTContractMetadata { - /* - FILL THIS IN - */ + pub spec: String, // required, essentially a version like "nft-1.0.0" + pub name: String, // required, ex. "Mosaics" + pub symbol: String, // required, ex. "MOSAIC" + pub icon: Option, // Data URL + pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs + pub reference: Option, // URL to a JSON file with more info + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] #[borsh(crate = "near_sdk::borsh")] #[serde(crate = "near_sdk::serde")] pub struct TokenMetadata { - /* - FILL THIS IN - */ + pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + pub description: Option, // free-form description + pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage + pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + pub copies: Option, // number of copies of this set of metadata in existence when token was minted. + pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds + pub expires_at: Option, // When token expires, Unix epoch in milliseconds + pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds + pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds + pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. + pub reference: Option, // URL to an off-chain JSON file with more info. + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. } #[derive(BorshDeserialize, BorshSerialize)] #[borsh(crate = "near_sdk::borsh")] pub struct Token { - /* - FILL THIS IN - */ + //owner of the token + pub owner_id: AccountId, } //The Json token is what will be returned from view calls. #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct JsonToken { - /* - FILL THIS IN - */ + //token ID + pub token_id: TokenId, + //owner of the token + pub owner_id: AccountId, + //token metadata + pub metadata: TokenMetadata, } pub trait NonFungibleTokenMetadata { @@ -50,9 +65,6 @@ pub trait NonFungibleTokenMetadata { #[near_bindgen] impl NonFungibleTokenMetadata for Contract { fn nft_metadata(&self) -> NFTContractMetadata { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + self.metadata.get().unwrap() } } \ No newline at end of file diff --git a/nft-contract-basic/src/mint.rs b/nft-contract-basic/src/mint.rs index ece73ad..44fa334 100644 --- a/nft-contract-basic/src/mint.rs +++ b/nft-contract-basic/src/mint.rs @@ -5,12 +5,71 @@ impl Contract { #[payable] pub fn nft_mint( &mut self, - token_id: Option, + token_id: TokenId, metadata: TokenMetadata, - receiver_id: Option, + receiver_id: AccountId, + //we add an optional parameter for perpetual royalties + perpetual_royalties: Option>, ) { - /* - FILL THIS IN - */ + //measure the initial storage being used on the contract + let initial_storage_usage = env::storage_usage(); + + // create a royalty map to store in the token + let mut royalty = HashMap::new(); + + // if perpetual royalties were passed into the function: + if let Some(perpetual_royalties) = perpetual_royalties { + //make sure that the length of the perpetual royalties is below 7 since we won't have enough GAS to pay out that many people + assert!(perpetual_royalties.len() < 7, "Cannot add more than 6 perpetual royalty amounts"); + + //iterate through the perpetual royalties and insert the account and amount in the royalty map + for (account, amount) in perpetual_royalties { + royalty.insert(account, amount); + } + } + + //specify the token struct that contains the owner ID + let token = Token { + //set the owner ID equal to the receiver ID passed into the function + owner_id: receiver_id, + }; + + //insert the token ID and token struct and make sure that the token doesn't exist + assert!( + self.tokens_by_id.insert(&token_id, &token).is_none(), + "Token already exists" + ); + + //insert the token ID and metadata + self.token_metadata_by_id.insert(&token_id, &metadata); + + //call the internal method for adding the token to the owner + self.internal_add_token_to_owner(&token.owner_id, &token_id); + + // Construct the mint log as per the events standard. + let nft_mint_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftMint(vec![NftMintLog { + // Owner of the token. + owner_id: token.owner_id.to_string(), + // Vector of token IDs that were minted. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo: None, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_mint_log.to_string()); + + //calculate the required storage which was the used - initial + let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; + + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. + refund_deposit(required_storage_in_bytes.into()); } } \ No newline at end of file diff --git a/nft-contract-basic/src/nft_core.rs b/nft-contract-basic/src/nft_core.rs index 3c35d2c..a74afb1 100644 --- a/nft-contract-basic/src/nft_core.rs +++ b/nft-contract-basic/src/nft_core.rs @@ -48,11 +48,15 @@ trait NonFungibleTokenResolver { as part of the nft_transfer_call method */ fn nft_resolve_transfer( - &mut self, - owner_id: AccountId, - receiver_id: AccountId, - token_id: TokenId, - ) -> bool; + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool; } #[near_bindgen] @@ -65,9 +69,18 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, memo: Option, ) { - /* - FILL THIS IN - */ + //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. + assert_one_yocto(); + //get the sender to transfer the token from the sender to the receiver + let sender_id = env::predecessor_account_id(); + + //call the internal transfer method + self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + memo, + ); } //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract @@ -79,18 +92,63 @@ impl NonFungibleTokenCore for Contract { memo: Option, msg: String, ) -> PromiseOrValue { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + //assert that the user attached exactly 1 yocto for security reasons. + assert_one_yocto(); + + //get the sender ID + let sender_id = env::predecessor_account_id(); + + //transfer the token and get the previous token object + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + memo.clone(), + ); + + //default the authorized_id to none + let mut authorized_id = None; + + // Initiating receiver's call and the callback + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. + ext_non_fungible_token_receiver::ext(receiver_id.clone()) + .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) + .nft_on_transfer( + sender_id, + previous_token.owner_id.clone(), + token_id.clone(), + msg + ) + // We then resolve the promise and call nft_resolve_transfer on our own contract + .then( + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer + Self::ext(env::current_account_id()) + .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) + .nft_resolve_transfer( + authorized_id, // we introduce an authorized ID so that we can log the transfer + previous_token.owner_id, + receiver_id, + token_id, + memo, // we introduce a memo for logging in the events standard + ) + ).into() } //get the information for a specific token ID fn nft_token(&self, token_id: TokenId) -> Option { - /* - FILL THIS IN - */ - todo!(); //remove once code is filled in. + //if there is some token ID in the tokens_by_id collection + if let Some(token) = self.tokens_by_id.get(&token_id) { + //we'll get the metadata for that token + let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); + //we return the JsonToken (wrapped by Some since we return an option) + Some(JsonToken { + token_id, + owner_id: token.owner_id, + metadata, + }) + } else { //if there wasn't a token ID in the tokens_by_id collection, we return None + None + } } } @@ -101,13 +159,84 @@ impl NonFungibleTokenResolver for Contract { #[private] fn nft_resolve_transfer( &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, owner_id: AccountId, receiver_id: AccountId, token_id: TokenId, + //we introduce a memo for logging the transfer event + memo: Option, ) -> bool { + // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` + // call result. + if let PromiseResult::Successful(value) = env::promise_result(0) { + //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not + if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { + //if we need don't need to return the token, we simply return true meaning everything went fine + if !return_token { + /* + since we've already transferred the token and nft_on_transfer returned false, we don't have to + revert the original transfer and thus we can just return true since nothing went wrong. + */ + return true; + } + } + } + + //get the token object if there is some token object + let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { + if token.owner_id != receiver_id { + // The token is not owner by the receiver anymore. Can't return it. + return true; + } + token + //if there isn't a token object, it was burned and so we return true + } else { + return true; + }; + + //if at the end, we haven't returned true, that means that we should return the token to it's original owner + log!("Return {} from @{} to @{}", token_id, receiver_id, owner_id); + + //we remove the token from the receiver + self.internal_remove_token_from_owner(&receiver_id, &token_id); + //we add the token to the original owner + self.internal_add_token_to_owner(&owner_id, &token_id); + + //we change the token struct's owner to be the original owner + token.owner_id = owner_id.clone(); + //we inset the token back into the tokens_by_id collection + self.tokens_by_id.insert(&token_id, &token); + /* - FILL THIS IN + We need to log that the NFT was reverted back to the original owner. + The old_owner_id will be the receiver and the new_owner_id will be the + original owner of the token since we're reverting the transfer. */ - todo!(); //remove once code is filled in. + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: receiver_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: owner_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + //we perform the actual logging + env::log_str(&nft_transfer_log.to_string()); + + //return false + false } } diff --git a/nft-contract-basic/src/royalty.rs b/nft-contract-basic/src/royalty.rs index 7646f9e..beb2fc2 100644 --- a/nft-contract-basic/src/royalty.rs +++ b/nft-contract-basic/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout; } @@ -20,7 +20,7 @@ pub trait NonFungibleTokenCore { impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -35,7 +35,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-contract-royalty/Cargo.toml b/nft-contract-royalty/Cargo.toml index 30d80e7..b1b459a 100644 --- a/nft-contract-royalty/Cargo.toml +++ b/nft-contract-royalty/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nft_contract" +name = "nft_contract_skeleton" version = "0.1.0" authors = ["Near Inc "] edition = "2021" @@ -8,15 +8,9 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = { version = "5.0.0", features = ["legacy"] } +near-sdk = { version = "5.1.0", features = ["legacy"] } serde_json = "1.0.113" -[dev-dependencies] -near-sdk = { version = "5.0.0", features = ["unit-testing"] } -near-workspaces = { version = "0.10.0", features = ["unstable"] } -tokio = { version = "1.12.0", features = ["full"] } -serde_json = "1" - [profile.release] codegen-units = 1 # Tell `rustc` to optimize for small code size. diff --git a/nft-contract-royalty/rust-toolchain.toml b/nft-contract-royalty/rust-toolchain.toml deleted file mode 100644 index 97c2073..0000000 --- a/nft-contract-royalty/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["wasm32-unknown-unknown"] \ No newline at end of file diff --git a/nft-contract-royalty/src/approval.rs b/nft-contract-royalty/src/approval.rs index 61bba70..3dda71a 100644 --- a/nft-contract-royalty/src/approval.rs +++ b/nft-contract-royalty/src/approval.rs @@ -6,7 +6,7 @@ pub trait NonFungibleTokenCore { fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option); //check if the passed in account has access to approve the token ID - fn nft_is_approved( + fn nft_is_approved( &self, token_id: TokenId, approved_account_id: AccountId, @@ -78,7 +78,7 @@ impl NonFungibleTokenCore for Contract { self.tokens_by_id.insert(&token_id, &token); //refund any excess storage attached by the user. If the user didn't attach enough, panic. - refund_deposit(storage_used.into()); + refund_deposit(storage_used); //if some message was passed into the function, we initiate a cross contract call on the //account we're giving access to. @@ -103,10 +103,10 @@ impl NonFungibleTokenCore for Contract { ) -> bool { //get the token object from the token_id let token = self.tokens_by_id.get(&token_id).expect("No token"); - + //get the approval number for the passed in account ID - let approval = token.approved_account_ids.get(&approved_account_id); - + let approval = token.approved_account_ids.get(&approved_account_id); + //if there was some approval ID found for the account ID if let Some(approval) = approval { //if a specific approval_id was passed into the function @@ -117,7 +117,7 @@ impl NonFungibleTokenCore for Contract { } else { true } - //if there was no approval ID found for the account ID, we simply return false + //if there was no approval ID found for the account ID, we simply return false } else { false } diff --git a/nft-contract-royalty/src/enumeration.rs b/nft-contract-royalty/src/enumeration.rs index 5d1e0de..859d21d 100644 --- a/nft-contract-royalty/src/enumeration.rs +++ b/nft-contract-royalty/src/enumeration.rs @@ -3,15 +3,15 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> U128 { + pub fn nft_total_supply(&self) -> u64 { //return the length of the token metadata by ID - U128(self.token_metadata_by_id.len() as u128) + self.token_metadata_by_id.len() } //Query for nft tokens on the contract regardless of the owner using pagination - pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through each token using an iterator self.token_metadata_by_id.keys() @@ -27,26 +27,27 @@ impl Contract { //get the total supply of NFTs for a given owner pub fn nft_supply_for_owner( - &self, - account_id: AccountId, - ) -> U128 { + &self, + account_id: AccountId, + ) -> u64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - //if there is some set of tokens, we'll return the length as a U128 + //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - U128(tokens_for_owner_set.len() as u128) + tokens_for_owner_set.len() } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - U128(0) + 0 } } + //Query for all the tokens for an owner //Query for all the tokens for an owner pub fn nft_tokens_for_owner( &self, account_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { //get the set of tokens for the passed in owner @@ -60,7 +61,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through the keys vector tokens.iter() @@ -73,4 +74,4 @@ impl Contract { //since we turned the keys into an iterator, we need to turn it back into a vector to return .collect() } -} +} \ No newline at end of file diff --git a/nft-contract-royalty/src/internal.rs b/nft-contract-royalty/src/internal.rs index 2432bb7..d50efe5 100644 --- a/nft-contract-royalty/src/internal.rs +++ b/nft-contract-royalty/src/internal.rs @@ -1,5 +1,5 @@ use crate::*; -use near_sdk::{CryptoHash, NearToken}; +use near_sdk::{CryptoHash}; use std::mem::size_of; //convert the royalty percentage and amount to pay into a payout @@ -46,7 +46,7 @@ pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { pub(crate) fn assert_one_yocto() { assert_eq!( env::attached_deposit(), - ONE_YOCTONEAR, + NearToken::from_yoctonear(1), "Requires attached deposit of exactly 1 yoctoNEAR", ) } @@ -54,7 +54,7 @@ pub(crate) fn assert_one_yocto() { //Assert that the user has attached at least 1 yoctoNEAR (for security reasons and to pay for storage) pub(crate) fn assert_at_least_one_yocto() { assert!( - env::attached_deposit().ge(&ONE_YOCTONEAR), + env::attached_deposit() >= NearToken::from_yoctonear(1), "Requires attached deposit of at least 1 yoctoNEAR", ) } @@ -96,7 +96,7 @@ impl Contract { StorageKey::TokenPerOwnerInner { //we get a new unique prefix for the collection account_id_hash: hash_account_id(&account_id), - } + }, ) }); @@ -127,7 +127,7 @@ impl Contract { if tokens_set.is_empty() { self.tokens_per_owner.remove(account_id); } else { - //if the token set is not empty, we simply insert it back for the account ID. + //if the token set is not empty, we simply insert it back for the account ID. self.tokens_per_owner.insert(account_id, &tokens_set); } } diff --git a/nft-contract-royalty/src/lib.rs b/nft-contract-royalty/src/lib.rs index 7c81433..a37235c 100644 --- a/nft-contract-royalty/src/lib.rs +++ b/nft-contract-royalty/src/lib.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::json_types::Base64VecU8; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - env, near_bindgen, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema + near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; use crate::internal::*; @@ -16,12 +16,12 @@ pub use crate::royalty::*; pub use crate::events::*; mod internal; -mod approval; mod enumeration; mod metadata; mod mint; mod nft_core; -mod royalty; +mod approval; +mod royalty; mod events; /// This spec can be treated like a version of the standard. @@ -33,7 +33,7 @@ pub const NFT_STANDARD_NAME: &str = "nep171"; const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); #[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, BorshStorageKey, PanicOnDefault)] +#[derive(BorshSerialize, BorshDeserialize, PanicOnDefault)] #[borsh(crate = "near_sdk::borsh")] pub struct Contract { //contract owner @@ -114,7 +114,4 @@ impl Contract { //return the Contract object this } -} - -#[cfg(test)] -mod tests; \ No newline at end of file +} \ No newline at end of file diff --git a/nft-contract-royalty/src/metadata.rs b/nft-contract-royalty/src/metadata.rs index 404d701..6f7add6 100644 --- a/nft-contract-royalty/src/metadata.rs +++ b/nft-contract-royalty/src/metadata.rs @@ -1,7 +1,5 @@ use crate::*; - pub type TokenId = String; - //defines the payout type we'll be returning as a part of the royalty standards. #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] diff --git a/nft-contract-royalty/src/mint.rs b/nft-contract-royalty/src/mint.rs index 37e71ef..93f0b98 100644 --- a/nft-contract-royalty/src/mint.rs +++ b/nft-contract-royalty/src/mint.rs @@ -68,13 +68,13 @@ impl Contract { memo: None, }]), }; - + // Log the serialized json. env::log_str(&nft_mint_log.to_string()); - + //calculate the required storage which was the used - initial let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; - + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. refund_deposit(required_storage_in_bytes.into()); } diff --git a/nft-contract-royalty/src/nft_core.rs b/nft-contract-royalty/src/nft_core.rs index 1ebc55e..61f4898 100644 --- a/nft-contract-royalty/src/nft_core.rs +++ b/nft-contract-royalty/src/nft_core.rs @@ -1,5 +1,5 @@ use crate::*; -use near_sdk::{ext_contract, Gas, PromiseResult}; +use near_sdk::{ext_contract, Gas, log, PromiseResult}; const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); @@ -45,12 +45,12 @@ trait NonFungibleTokenReceiver { } #[ext_contract(ext_self)] -/* - resolves the promise of the cross contract call to the receiver contract - this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called - as part of the nft_transfer_call method -*/ trait NonFungibleTokenResolver { + /* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method + */ fn nft_resolve_transfer( &mut self, //we introduce an authorized ID for logging the transfer event @@ -228,6 +228,9 @@ impl NonFungibleTokenResolver for Contract { return true; }; + //if at the end, we haven't returned true, that means that we should return the token to it's original owner + log!("Return {} from @{} to @{}", token_id, receiver_id, owner_id); + //we remove the token from the receiver self.internal_remove_token_from_owner(&receiver_id.clone(), &token_id); //we add the token to the original owner diff --git a/nft-contract-royalty/src/tests.rs b/nft-contract-royalty/src/tests.rs deleted file mode 100644 index e018ad7..0000000 --- a/nft-contract-royalty/src/tests.rs +++ /dev/null @@ -1,315 +0,0 @@ -/* unit tests */ -#[cfg(test)] -use crate::Contract; -use crate::TokenMetadata; -use crate::approval::NonFungibleTokenCore; -use near_sdk::json_types::{U128, U64}; -use near_sdk::test_utils::{accounts, VMContextBuilder}; -use near_sdk::{testing_env, NearToken}; -use near_sdk::{env, AccountId}; -use std::collections::HashMap; - -const MINT_STORAGE_COST: NearToken = NearToken::from_millinear(1000); -const MIN_REQUIRED_APPROVAL_YOCTO: NearToken = NearToken::from_yoctonear(1700000000000000000000); -const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); - - -fn get_context(predecessor: AccountId) -> VMContextBuilder { - let mut builder = VMContextBuilder::new(); - builder.predecessor_account_id(predecessor); - builder -} - -fn sample_token_metadata() -> TokenMetadata { - TokenMetadata { - title: Some("Olympus Mons".into()), - description: Some("The tallest mountain in the charted solar system".into()), - media: None, - media_hash: None, - copies: Some(1u64), - issued_at: None, - expires_at: None, - starts_at: None, - updated_at: None, - extra: None, - reference: None, - reference_hash: None, - } -} - -#[test] -#[should_panic(expected = "The contract is not initialized")] -fn test_default() { - let context = get_context(accounts(1)); - testing_env!(context.build()); - let _contract = Contract::default(); -} - -#[test] -fn test_new_account_contract() { - let mut context = get_context(accounts(1)); - testing_env!(context.build()); - let contract = Contract::new_default_meta(accounts(1).into()); - testing_env!(context.is_view(true).build()); - let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); - assert_eq!(contract_nft_tokens.len(), 0); -} - -#[test] -fn test_mint_nft() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_metadata: TokenMetadata = sample_token_metadata(); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), token_metadata, accounts(0), None); - let contract_nft_tokens = contract.nft_tokens(Some(U128(0)), None); - assert_eq!(contract_nft_tokens.len(), 1); - - assert_eq!(contract_nft_tokens[0].token_id, token_id); - assert_eq!(contract_nft_tokens[0].owner_id, accounts(0)); - assert_eq!( - contract_nft_tokens[0].metadata.title, - sample_token_metadata().title - ); - assert_eq!( - contract_nft_tokens[0].metadata.description, - sample_token_metadata().description - ); - assert_eq!( - contract_nft_tokens[0].metadata.media, - sample_token_metadata().media - ); - assert_eq!(contract_nft_tokens[0].approved_account_ids, HashMap::new()); -} - -#[test] -fn test_internal_transfer() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.internal_transfer( - &accounts(0), - &accounts(1), - &token_id.clone(), - Some(U64(1).0), - None, - ); - - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_yoctonear(0)) - .build()); - - let tokens = contract.nft_tokens_for_owner(accounts(1), Some(U128(0)), None); - assert_ne!( - tokens.len(), - 0, - "Token not correctly created and/or sent to second account" - ); - let token = &tokens[0]; - assert_eq!(token.token_id, token_id); - assert_eq!(token.owner_id, accounts(1)); - assert_eq!(token.metadata.title, sample_token_metadata().title); - assert_eq!( - token.metadata.description, - sample_token_metadata().description - ); - assert_eq!(token.metadata.media, sample_token_metadata().media); - assert_eq!(token.approved_account_ids, HashMap::new()); -} - -#[test] -fn test_nft_approve() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(contract.nft_is_approved(token_id.clone(), accounts(1), None)); -} - -#[test] -fn test_nft_revoke() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - // alice revokes bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_revoke(token_id.clone(), accounts(1)); - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), None)); -} - -#[test] -fn test_revoke_all() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - // alice revokes bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(ONE_YOCTONEAR) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_revoke_all(token_id.clone()); - testing_env!(context - .storage_usage(env::storage_usage()) - .account_balance(env::account_balance()) - .is_view(true) - .attached_deposit(NearToken::from_near(0)) - .build()); - assert!(!contract.nft_is_approved(token_id.clone(), accounts(1), Some(1))); -} - -#[test] -fn test_internal_remove_token_from_owner() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - let contract_nft_tokens_before = contract.nft_tokens_for_owner(accounts(0), None, None); - assert_eq!(contract_nft_tokens_before.len(), 1); - - contract.internal_remove_token_from_owner(&accounts(0), &token_id); - let contract_nft_tokens_after = contract.nft_tokens_for_owner(accounts(0), None, None); - assert_eq!(contract_nft_tokens_after.len(), 0); -} - -#[test] -fn test_nft_payout() { - use crate::royalty::NonFungibleTokenCore; - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - // alice approves bob - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MIN_REQUIRED_APPROVAL_YOCTO) - .predecessor_account_id(accounts(0)) - .build()); - contract.nft_approve(token_id.clone(), accounts(1), None); - - let payout = contract.nft_payout(token_id.clone(), NearToken::from_millinear(10), 1); - let expected = HashMap::from([(accounts(0), NearToken::from_near(100))]); - assert_eq!(payout.payout, expected); -} - -#[test] -fn test_nft_total_supply() { - let mut context = get_context(accounts(0)); - testing_env!(context.build()); - let mut contract = Contract::new_default_meta(accounts(0).into()); - - testing_env!(context - .storage_usage(env::storage_usage()) - .attached_deposit(MINT_STORAGE_COST) - .predecessor_account_id(accounts(0)) - .build()); - let token_id = "0".to_string(); - contract.nft_mint(token_id.clone(), sample_token_metadata(), accounts(0), None); - - let total_supply = contract.nft_total_supply(); - assert_eq!(total_supply, U128(1)); -} \ No newline at end of file diff --git a/nft-contract-skeleton/Cargo.toml b/nft-contract-skeleton/Cargo.toml index b1b459a..6a5b5c8 100644 --- a/nft-contract-skeleton/Cargo.toml +++ b/nft-contract-skeleton/Cargo.toml @@ -9,7 +9,6 @@ crate-type = ["cdylib", "rlib"] [dependencies] near-sdk = { version = "5.1.0", features = ["legacy"] } -serde_json = "1.0.113" [profile.release] codegen-units = 1 diff --git a/nft-contract-skeleton/src/enumeration.rs b/nft-contract-skeleton/src/enumeration.rs index 82c473a..0a8a990 100644 --- a/nft-contract-skeleton/src/enumeration.rs +++ b/nft-contract-skeleton/src/enumeration.rs @@ -3,7 +3,7 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> U128 { + pub fn nft_total_supply(&self) -> u64 { /* FILL THIS IN */ @@ -11,7 +11,7 @@ impl Contract { } //Query for nft tokens on the contract regardless of the owner using pagination - pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { /* FILL THIS IN */ @@ -22,7 +22,7 @@ impl Contract { pub fn nft_supply_for_owner( &self, account_id: AccountId, - ) -> U128 { + ) -> u64 { /* FILL THIS IN */ @@ -33,7 +33,7 @@ impl Contract { pub fn nft_tokens_for_owner( &self, account_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { /* diff --git a/nft-contract-skeleton/src/events.rs b/nft-contract-skeleton/src/events.rs deleted file mode 100644 index f65a3f4..0000000 --- a/nft-contract-skeleton/src/events.rs +++ /dev/null @@ -1,138 +0,0 @@ -use std::fmt; - -use near_sdk::serde::{Deserialize, Serialize}; - -/// Enum that represents the data type of the EventLog. -/// The enum can either be an NftMint or an NftTransfer. -#[derive(Serialize, Deserialize, Debug)] -#[serde(tag = "event", content = "data")] -#[serde(rename_all = "snake_case")] -#[serde(crate = "near_sdk::serde")] -#[non_exhaustive] -pub enum EventLogVariant { - NftMint(Vec), - NftTransfer(Vec), -} - -/// Interface to capture data about an event -/// -/// Arguments: -/// * `standard`: name of standard e.g. nep171 -/// * `version`: e.g. 1.0.0 -/// * `event`: associate event data -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "near_sdk::serde")] -pub struct EventLog { - pub standard: String, - pub version: String, - - // `flatten` to not have "event": {} in the JSON, just have the contents of {}. - #[serde(flatten)] - pub event: EventLogVariant, -} - -impl fmt::Display for EventLog { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_fmt(format_args!( - "EVENT_JSON:{}", - &serde_json::to_string(self).map_err(|_| fmt::Error)? - )) - } -} - -/// An event log to capture token minting -/// -/// Arguments -/// * `owner_id`: "account.near" -/// * `token_ids`: ["1", "abc"] -/// * `memo`: optional message -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "near_sdk::serde")] -pub struct NftMintLog { - pub owner_id: String, - pub token_ids: Vec, - - #[serde(skip_serializing_if = "Option::is_none")] - pub memo: Option, -} - -/// An event log to capture token transfer -/// -/// Arguments -/// * `authorized_id`: approved account to transfer -/// * `old_owner_id`: "owner.near" -/// * `new_owner_id`: "receiver.near" -/// * `token_ids`: ["1", "12345abc"] -/// * `memo`: optional message -#[derive(Serialize, Deserialize, Debug)] -#[serde(crate = "near_sdk::serde")] -pub struct NftTransferLog { - #[serde(skip_serializing_if = "Option::is_none")] - pub authorized_id: Option, - - pub old_owner_id: String, - pub new_owner_id: String, - pub token_ids: Vec, - - #[serde(skip_serializing_if = "Option::is_none")] - pub memo: Option, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn nep_format_vector() { - let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; - let log = EventLog { - standard: "nep171".to_string(), - version: "1.0.0".to_string(), - event: EventLogVariant::NftMint(vec![ - NftMintLog { - owner_id: "foundation.near".to_owned(), - token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], - memo: None, - }, - NftMintLog { - owner_id: "user1.near".to_owned(), - token_ids: vec!["meme".to_string()], - memo: None, - }, - ]), - }; - assert_eq!(expected, log.to_string()); - } - - #[test] - fn nep_format_mint() { - let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; - let log = EventLog { - standard: "nep171".to_string(), - version: "1.0.0".to_string(), - event: EventLogVariant::NftMint(vec![NftMintLog { - owner_id: "foundation.near".to_owned(), - token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], - memo: None, - }]), - }; - assert_eq!(expected, log.to_string()); - } - - #[test] - fn nep_format_transfer_all_fields() { - let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; - let log = EventLog { - standard: "nep171".to_string(), - version: "1.0.0".to_string(), - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - authorized_id: Some("market.near".to_string()), - old_owner_id: "user1.near".to_string(), - new_owner_id: "user2.near".to_string(), - token_ids: vec!["token".to_string()], - memo: Some("Go Team!".to_owned()), - }]), - }; - assert_eq!(expected, log.to_string()); - } -} \ No newline at end of file diff --git a/nft-contract-skeleton/src/internal.rs b/nft-contract-skeleton/src/internal.rs new file mode 100644 index 0000000..ece73cc --- /dev/null +++ b/nft-contract-skeleton/src/internal.rs @@ -0,0 +1,139 @@ +use crate::*; +use near_sdk::{CryptoHash}; +use std::mem::size_of; + +//used to generate a unique prefix in our storage collections (this is to avoid data collisions) +pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { + //get the default hash + let mut hash = CryptoHash::default(); + //we hash the account ID and return it + hash.copy_from_slice(&env::sha256(account_id.as_bytes())); + hash +} + +//used to make sure the user attached exactly 1 yoctoNEAR +pub(crate) fn assert_one_yocto() { + assert_eq!( + env::attached_deposit(), + 1, + "Requires attached deposit of exactly 1 yoctoNEAR", + ) +} + +//refund the initial deposit based on the amount of storage that was used up +pub(crate) fn refund_deposit(storage_used: u128) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit - required_cost; + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund > 1 { + Promise::new(env::predecessor_account_id()).transfer(refund); + } +} + +impl Contract { + //add a token to the set of tokens an owner has + pub(crate) fn internal_add_token_to_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //get the set of tokens for the given account + let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { + //if the account doesn't have any tokens, we create a new unordered set + UnorderedSet::new( + StorageKey::TokenPerOwnerInner { + //we get a new unique prefix for the collection + account_id_hash: hash_account_id(&account_id), + } + .try_to_vec() + .unwrap(), + ) + }); + + //we insert the token ID into the set + tokens_set.insert(token_id); + + //we insert that set for the given account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + + //remove a token from an owner (internal method and can't be called directly via CLI). + pub(crate) fn internal_remove_token_from_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //we get the set of tokens that the owner has + let mut tokens_set = self + .tokens_per_owner + .get(account_id) + //if there is no set of tokens for the owner, we panic with the following message: + .expect("Token should be owned by the sender"); + + //we remove the the token_id from the set of tokens + tokens_set.remove(token_id); + + //if the token set is now empty, we remove the owner from the tokens_per_owner collection + if tokens_set.is_empty() { + self.tokens_per_owner.remove(account_id); + } else { + //if the token set is not empty, we simply insert it back for the account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + } + + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + pub(crate) fn internal_transfer( + &mut self, + sender_id: &AccountId, + receiver_id: &AccountId, + token_id: &TokenId, + memo: Option, + ) -> Token { + //get the token object by passing in the token_id + let token = self.tokens_by_id.get(token_id).expect("No token"); + + //if the sender doesn't equal the owner, we panic + if sender_id != &token.owner_id { + env::panic_str("Unauthorized"); + } + //we make sure that the sender isn't sending the token to themselves + assert_ne!( + &token.owner_id, receiver_id, + "The token owner and the receiver should be different" + ); + + //we remove the token from it's current owner's set + self.internal_remove_token_from_owner(&token.owner_id, token_id); + //we then add the token to the receiver_id's set + self.internal_add_token_to_owner(receiver_id, token_id); + + //we create a new token struct + let new_token = Token { + owner_id: receiver_id.clone(), + }; + //insert that new token into the tokens_by_id, replacing the old entry + self.tokens_by_id.insert(token_id, &new_token); + + //if there was some memo attached, we log it. + if let Some(memo) = memo { + env::log_str(&format!("Memo: {}", memo).to_string()); + } + + //return the previous token object that was transferred. + token + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/lib.rs b/nft-contract-skeleton/src/lib.rs index f3d898c..fc2958b 100644 --- a/nft-contract-skeleton/src/lib.rs +++ b/nft-contract-skeleton/src/lib.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::json_types::Base64VecU8; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - near_bindgen, env, AccountId, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema + near_bindgen, env, NearToken, AccountId, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema }; pub use crate::metadata::*; @@ -13,11 +13,11 @@ pub use crate::nft_core::*; pub use crate::approval::*; pub use crate::royalty::*; -mod approval; mod enumeration; mod metadata; mod mint; -mod nft_core; +mod nft_core; +mod approval; mod royalty; #[near_bindgen] diff --git a/nft-contract-skeleton/src/metadata.rs b/nft-contract-skeleton/src/metadata.rs index 1127397..895282e 100644 --- a/nft-contract-skeleton/src/metadata.rs +++ b/nft-contract-skeleton/src/metadata.rs @@ -1,10 +1,12 @@ +use near_sdk::NearToken; + use crate::*; pub type TokenId = String; //defines the payout type we'll be returning as a part of the royalty standards. #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-contract-skeleton/src/royalty.rs b/nft-contract-skeleton/src/royalty.rs index 7646f9e..beb2fc2 100644 --- a/nft-contract-skeleton/src/royalty.rs +++ b/nft-contract-skeleton/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout; } @@ -20,7 +20,7 @@ pub trait NonFungibleTokenCore { impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -35,7 +35,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: U128, + balance: NearToken, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-series/Cargo.toml b/nft-series/Cargo.toml index 7ad0b08..9ca0535 100644 --- a/nft-series/Cargo.toml +++ b/nft-series/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -near-sdk = { version = "5.0.0", features = ["legacy"] } +near-sdk = { version = "5.1.0", features = ["legacy"] } serde_json = "1.0.113" [dev-dependencies] diff --git a/nft-series/src/enumeration.rs b/nft-series/src/enumeration.rs index 0ef1b50..6cf4fba 100644 --- a/nft-series/src/enumeration.rs +++ b/nft-series/src/enumeration.rs @@ -19,15 +19,15 @@ pub struct JsonSeries { #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> U128 { + pub fn nft_total_supply(&self) -> u64 { //return the length of the tokens by id - U128(self.tokens_by_id.len() as u128) + self.tokens_by_id.len() } //Query for nft tokens on the contract regardless of the owner using pagination - pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through each token using an iterator self.tokens_by_id @@ -43,16 +43,16 @@ impl Contract { } //get the total supply of NFTs for a given owner - pub fn nft_supply_for_owner(&self, account_id: AccountId) -> U128 { + pub fn nft_supply_for_owner(&self, account_id: AccountId) -> u64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); - //if there is some set of tokens, we'll return the length as a U128 + //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - U128(tokens_for_owner_set.len() as u128) + tokens_for_owner_set.len() } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - U128(0) + 0 } } @@ -60,7 +60,7 @@ impl Contract { pub fn nft_tokens_for_owner( &self, account_id: AccountId, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { //get the set of tokens for the passed in owner @@ -74,7 +74,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through the keys vector tokens @@ -95,9 +95,9 @@ impl Contract { } // Paginate through all the series on the contract and return the a vector of JsonSeries - pub fn get_series(&self, from_index: Option, limit: Option) -> Vec { + pub fn get_series(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through each series using an iterator self.series_by_id @@ -131,15 +131,15 @@ impl Contract { } //get the total supply of NFTs on a current series - pub fn nft_supply_for_series(&self, id: u64) -> U128 { + pub fn nft_supply_for_series(&self, id: u64) -> u64 { //get the series let series = self.series_by_id.get(&id); //if there is some series, get the length of the tokens. Otherwise return - if let Some(series) = series { - U128(series.tokens.len() as u128) + series.tokens.len() } else { - U128(0) + 0 } } @@ -147,7 +147,7 @@ impl Contract { pub fn nft_tokens_for_series( &self, id: u64, - from_index: Option, + from_index: Option, limit: Option, ) -> Vec { // Get the series and its tokens @@ -159,7 +159,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(U128(0))); + let start = u128::from(from_index.unwrap_or(0)); //iterate through the tokens tokens diff --git a/nft-series/src/lib.rs b/nft-series/src/lib.rs index a9f374d..9b4b5c9 100644 --- a/nft-series/src/lib.rs +++ b/nft-series/src/lib.rs @@ -1,6 +1,6 @@ use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LazyOption, LookupMap, LookupSet, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::json_types::Base64VecU8; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ env, near_bindgen, require, AccountId, NearToken, BorshStorageKey, CryptoHash, PanicOnDefault, diff --git a/nft-series/src/series.rs b/nft-series/src/series.rs index 33679bc..e833e82 100644 --- a/nft-series/src/series.rs +++ b/nft-series/src/series.rs @@ -1,5 +1,3 @@ -use near_sdk::json_types::U64; - use crate::*; #[near_bindgen] @@ -60,12 +58,12 @@ impl Contract { /// Mint a new NFT that is part of a series. The caller must be an approved minter. /// The series ID must exist and if the metadata specifies a copy limit, you cannot exceed it. #[payable] - pub fn nft_mint(&mut self, id: U64, receiver_id: AccountId) { + pub fn nft_mint(&mut self, id: u64, receiver_id: AccountId) { // Measure the initial storage being used on the contract let initial_storage_usage = env::storage_usage(); // Get the series and how many tokens currently exist (edition number = cur_len + 1) - let mut series = self.series_by_id.get(&id.0).expect("Not a series"); + let mut series = self.series_by_id.get(&id).expect("Not a series"); // Check if the series has a price per token. If it does, ensure the caller has attached at least that amount let mut price_per_token = NearToken::from_yoctonear(0); @@ -92,14 +90,14 @@ impl Contract { } // The token ID is stored internally as `${series_id}:${edition}` - let token_id = format!("{}:{}", id.0, cur_len + 1); + let token_id = format!("{}:{}", id, cur_len + 1); series.tokens.insert(&token_id); - self.series_by_id.insert(&id.0, &series); + self.series_by_id.insert(&id, &series); //specify the token struct that contains the owner ID let token = Token { // Series ID that the token belongs to - series_id: id.0, + series_id: id, //set the owner ID equal to the receiver ID passed into the function owner_id: receiver_id, //we set the approved account IDs to the default value (an empty map) From 6092c1d0c2ea1e5ad00cf460c83767336b9c9f62 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 1 Apr 2024 21:53:16 +0200 Subject: [PATCH 17/28] fixed rust integration tests after migration --- integration-tests/rs/Cargo.toml | 1 + integration-tests/rs/src/helpers.rs | 19 +++++++--- integration-tests/rs/src/tests.rs | 52 +++++++++++++++++----------- market-contract/src/sale.rs | 3 +- nft-contract-royalty/src/internal.rs | 6 ++-- nft-series/Cargo.toml | 2 +- 6 files changed, 53 insertions(+), 30 deletions(-) diff --git a/integration-tests/rs/Cargo.toml b/integration-tests/rs/Cargo.toml index 76220f3..4fdd7de 100644 --- a/integration-tests/rs/Cargo.toml +++ b/integration-tests/rs/Cargo.toml @@ -5,6 +5,7 @@ publish = false edition = "2021" [dev-dependencies] +near-sdk = { version = "5.1.0", features = ["unit-testing"] } near-workspaces = { version = "0.10.0", features = ["unstable"] } tokio = { version = "1.12.0", features = ["full"] } serde_json = "1" diff --git a/integration-tests/rs/src/helpers.rs b/integration-tests/rs/src/helpers.rs index a8bab32..bd3a329 100644 --- a/integration-tests/rs/src/helpers.rs +++ b/integration-tests/rs/src/helpers.rs @@ -1,7 +1,7 @@ use serde_json::json; -use near_workspaces::{types::{NearToken, AccountDetails}, Account, Contract}; +use near_workspaces::{types::{NearToken, AccountDetails}, Account, Contract, result::ExecutionFinalResult}; -pub const DEFAULT_DEPOSIT: u128 = 6760000000000000000000 as u128; +pub const DEFAULT_DEPOSIT: u128 = 10000000000000000000000 as u128; pub const ONE_YOCTO_NEAR: NearToken = NearToken::from_yoctonear(1); pub async fn mint_nft( @@ -70,13 +70,14 @@ pub async fn place_nft_for_sale( market_contract: &Contract, nft_contract: &Contract, token_id: &str, - price: NearToken, + approval_id: u128, + price: &NearToken, ) -> Result<(), Box> { let request_payload = json!({ "nft_contract_id": nft_contract.id(), "token_id": token_id, - "approval_id": 0, - "msg": format!(r#"{{ "sale_conditions" : "{}" }}"#, price.to_string()), + "approval_id": approval_id, + "msg": format!(r#"{{ "sale_conditions" : "{}" }}"#, NearToken::as_yoctonear(price)), }); let _ = user.call(market_contract.id(), "list_nft_for_sale") .args_json(request_payload) @@ -152,4 +153,12 @@ pub async fn get_nft_token_info( .unwrap(); Ok(token_info) +} + +pub fn round_to_near_dp( + amount: u128, + sf: u128, +) -> String { + let near_amount = amount as f64 / 1_000_000_000_000_000_000_000_000.0; // yocto in 1 NEAR + return format!("{:.1$}", near_amount, sf as usize); } \ No newline at end of file diff --git a/integration-tests/rs/src/tests.rs b/integration-tests/rs/src/tests.rs index c28eba5..049c7d8 100644 --- a/integration-tests/rs/src/tests.rs +++ b/integration-tests/rs/src/tests.rs @@ -9,7 +9,7 @@ async fn main() -> Result<(), Box> { let worker = near_workspaces::sandbox().await?; // deploy contracts - let nft_wasm = near_workspaces::compile_project("../../nft-contract/.").await?; + let nft_wasm = near_workspaces::compile_project("../../nft-contract-royalty/.").await?; let nft_contract = worker.dev_deploy(&nft_wasm).await?; let market_wasm = near_workspaces::compile_project("../../market-contract/.").await?; @@ -172,11 +172,13 @@ async fn test_sell_nft_listed_on_marketplace( buyer: &Account, ) -> Result<(), Box> { let token_id = "4"; - let sale_price: NearToken = NearToken::from_millinear(300); + let approval_id = 0; + let sale_price: NearToken = NearToken::from_yoctonear(10000000000000000000000000); + helpers::mint_nft(seller, nft_contract, token_id).await?; - helpers::pay_for_storage(seller, market_contract, NearToken::from_millinear(10)).await?; + helpers::pay_for_storage(seller, market_contract, NearToken::from_yoctonear(1000000000000000000000000)).await?; helpers::approve_nft(market_contract, seller, nft_contract, token_id).await?; - helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; + helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, approval_id, &sale_price).await?; let before_seller_balance: NearToken = helpers::get_user_balance(seller).await; let before_buyer_balance: NearToken = helpers::get_user_balance(buyer).await; @@ -186,8 +188,9 @@ async fn test_sell_nft_listed_on_marketplace( let after_seller_balance: NearToken = helpers::get_user_balance(seller).await; let after_buyer_balance: NearToken = helpers::get_user_balance(buyer).await; - assert_eq!(after_seller_balance, before_seller_balance.saturating_add(sale_price), "seller did not receive the sale price"); - assert_eq!(after_buyer_balance, before_buyer_balance.saturating_sub(sale_price), "buyer did not send the sale price"); + let dp = 1; // being exact requires keeping track of gas usage + assert_eq!(helpers::round_to_near_dp(after_seller_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_seller_balance.saturating_add(sale_price).as_yoctonear(), dp), "seller did not receive the sale price"); + assert_eq!(helpers::round_to_near_dp(after_buyer_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_buyer_balance.saturating_sub(sale_price).as_yoctonear(), dp), "buyer did not send the sale price"); println!(" Passed ✅ test_sell_nft_listed_on_marketplace"); Ok(()) @@ -201,11 +204,13 @@ async fn test_transfer_nft_when_listed_on_marketplace( market_contract: &Contract, ) -> Result<(), Box> { let token_id = "5"; + let approval_id = 0; let sale_price = NearToken::from_near(3); + helpers::mint_nft(seller, nft_contract, token_id).await?; helpers::pay_for_storage(seller, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, seller, nft_contract, token_id).await?; - helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, sale_price).await?; + helpers::place_nft_for_sale(seller, market_contract, nft_contract, token_id, approval_id, &sale_price).await?; helpers::transfer_nft(seller, first_buyer, nft_contract, token_id).await?; @@ -222,8 +227,9 @@ async fn test_transfer_nft_when_listed_on_marketplace( assert_eq!(owner_id, first_buyer.id().to_string(), "token owner is not first_buyer"); // assert balances remain equal - assert_eq!(after_seller_balance, before_seller_balance, "seller balance changed"); - assert_eq!(after_buyer_balance, before_buyer_balance, "buyer balance changed"); + let dp = 1; // being exact requires keeping track of gas usage + assert_eq!(helpers::round_to_near_dp(after_seller_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_seller_balance.as_yoctonear(), dp), "seller balance changed"); + assert_eq!(helpers::round_to_near_dp(after_buyer_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_buyer_balance.as_yoctonear(), dp), "buyer balance changed"); println!(" Passed ✅ test_transfer_nft_when_listed_on_marketplace"); @@ -237,10 +243,12 @@ async fn test_approval_revoke( market_contract: &Contract, ) -> Result<(), Box> { let token_id = "6"; + let approval_id = 0; let sale_price = NearToken::from_near(3); + helpers::mint_nft(first_user, nft_contract, token_id).await?; helpers::pay_for_storage(first_user, market_contract, NearToken::from_millinear(10)).await?; - helpers::place_nft_for_sale(first_user, market_contract, nft_contract, token_id, sale_price).await?; + helpers::place_nft_for_sale(first_user, market_contract, nft_contract, token_id, approval_id, &sale_price).await?; // nft_revoke market_contract call let revoke_payload = json!({ @@ -268,8 +276,9 @@ async fn test_approval_revoke( assert_eq!(owner_id, first_user.id().to_string(), "token owner is not first_user"); // assert balances unchanged - assert_eq!(after_seller_balance, before_seller_balance, "seller balance changed"); - assert_eq!(after_buyer_balance, before_buyer_balance, "buyer balance changed"); + let dp = 1; // being exact requires keeping track of gas usage + assert_eq!(helpers::round_to_near_dp(after_seller_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_seller_balance.as_yoctonear(), dp), "seller balance changed"); + assert_eq!(helpers::round_to_near_dp(after_buyer_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_buyer_balance.as_yoctonear(), dp), "buyer balance changed"); println!(" Passed ✅ test_approval_revoke"); Ok(()) @@ -283,7 +292,8 @@ async fn test_reselling_and_royalties( market_contract: &Contract, ) -> Result<(), Box> { let token_id = "7"; - let sale_price: NearToken = NearToken::from_near(3); // 3 NEAR in yoctoNEAR + let approval_id = 0; + let sale_price: NearToken = NearToken::from_near(1); // 1 NEAR in yoctoNEAR // mint with royalties let request_payload = json!({ @@ -306,7 +316,7 @@ async fn test_reselling_and_royalties( helpers::pay_for_storage(user, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, user, nft_contract, token_id).await?; - helpers::place_nft_for_sale(user, market_contract, nft_contract, token_id, sale_price).await?; + helpers::place_nft_for_sale(user, market_contract, nft_contract, token_id, approval_id, &sale_price).await?; // first_buyer purchases NFT let mut before_seller_balance: NearToken = helpers::get_user_balance(user).await; @@ -321,13 +331,15 @@ async fn test_reselling_and_royalties( assert_eq!(owner_id, first_buyer.id().to_string(), "token owner is not first_buyer"); // assert balances changed - assert_eq!(after_seller_balance, before_seller_balance.saturating_add(sale_price), "seller balance unchanged"); - assert_eq!(after_buyer_balance, before_buyer_balance.saturating_sub(sale_price), "buyer balance unchanged"); + let dp = 1; // being exact requires keeping track of gas usage + assert_eq!(helpers::round_to_near_dp(after_seller_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_seller_balance.saturating_add(sale_price).as_yoctonear(), dp), "seller balance unchanged"); + assert_eq!(helpers::round_to_near_dp(after_buyer_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_buyer_balance.saturating_sub(sale_price).as_yoctonear(), dp), "buyer balance unchanged"); // first buyer lists nft for sale + let approval_id = 1; helpers::pay_for_storage(first_buyer, market_contract, NearToken::from_millinear(10)).await?; helpers::approve_nft(market_contract, first_buyer, nft_contract, token_id).await?; - helpers::place_nft_for_sale(first_buyer, market_contract, nft_contract, token_id, sale_price).await?; + helpers::place_nft_for_sale(first_buyer, market_contract, nft_contract, token_id, approval_id, &sale_price).await?; // second_buyer purchases NFT let resale_price = sale_price.saturating_mul(5); // 15 NEAR @@ -346,9 +358,9 @@ async fn test_reselling_and_royalties( // assert balances changed let royalty_fee = resale_price.saturating_div(5); - assert_eq!(after_seller_balance, before_seller_balance.saturating_add(resale_price).saturating_sub(royalty_fee), "seller balance unchanged"); - assert_eq!(after_buyer_balance, before_buyer_balance.saturating_sub(resale_price), "buyer balance unchanged"); - assert_eq!(after_user_balance, before_user_balance.saturating_add(royalty_fee), "user balance unchanged"); + assert_eq!(helpers::round_to_near_dp(after_seller_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_seller_balance.saturating_add(resale_price).saturating_sub(royalty_fee).as_yoctonear(), dp), "seller balance unchanged"); + assert_eq!(helpers::round_to_near_dp(after_buyer_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_buyer_balance.saturating_sub(resale_price).as_yoctonear(), dp), "buyer balance unchanged"); + assert_eq!(helpers::round_to_near_dp(after_user_balance.as_yoctonear(), dp), helpers::round_to_near_dp(before_user_balance.saturating_add(royalty_fee).as_yoctonear(), dp), "user balance unchanged"); println!(" Passed ✅ test_reselling_and_royalties"); Ok(()) diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index 7782ab2..f356887 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -130,7 +130,7 @@ impl Contract { let price = sale.sale_conditions; //make sure the deposit is greater than the price - assert!(deposit.ge(&price), "Attached deposit must be greater than or equal to the current price: {:?}", price); + assert!(deposit.ge(&price), "Attached deposit must be greater than or equal to the current price: {:?}. Your deposit: {:?}", price, deposit); //process the purchase (which will remove the sale, transfer and get the payout from the nft contract, and then distribute royalties) self.process_purchase( @@ -204,6 +204,7 @@ impl Contract { .ok() //returns None if the none. Otherwise executes the following logic .and_then(|payout_object| { + env::log_str(&format!("payout_object: {:?}", payout_object).to_string()); //we'll check if length of the payout object is > 10 or it's empty. In either case, we return None if payout_object.payout.len() > 10 || payout_object.payout.is_empty() { env::log_str("Cannot have more than 10 royalties"); diff --git a/nft-contract-royalty/src/internal.rs b/nft-contract-royalty/src/internal.rs index d50efe5..2aee3f6 100644 --- a/nft-contract-royalty/src/internal.rs +++ b/nft-contract-royalty/src/internal.rs @@ -4,7 +4,7 @@ use std::mem::size_of; //convert the royalty percentage and amount to pay into a payout pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { - amount_to_pay.saturating_mul(royalty_percentage) + amount_to_pay.saturating_mul(royalty_percentage).saturating_div(10000) } //calculate how many bytes the account ID is taking up @@ -68,8 +68,8 @@ pub(crate) fn refund_deposit(storage_used: u128) { //make sure that the attached deposit is greater than or equal to the required cost assert!( - required_cost <= attached_deposit, - "Must attach {} yoctoNEAR to cover storage", + required_cost.le(&attached_deposit), + "Must attach {} to cover storage", required_cost, ); diff --git a/nft-series/Cargo.toml b/nft-series/Cargo.toml index 9ca0535..97e5048 100644 --- a/nft-series/Cargo.toml +++ b/nft-series/Cargo.toml @@ -12,7 +12,7 @@ near-sdk = { version = "5.1.0", features = ["legacy"] } serde_json = "1.0.113" [dev-dependencies] -near-sdk = { version = "5.0.0", features = ["unit-testing"] } +near-sdk = { version = "5.1.0", features = ["unit-testing"] } near-workspaces = { version = "0.10.0", features = ["unstable"] } tokio = { version = "1.12.0", features = ["full"] } serde_json = "1" From 3c330b7e6458fb634663bfbde2bc98a1acd58a4c Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 1 Apr 2024 23:25:43 +0200 Subject: [PATCH 18/28] fixed ts tests --- integration-tests/ts/ava.config.cjs | 8 ++-- integration-tests/ts/package.json | 17 +++++--- integration-tests/ts/src/main.ava.ts | 61 ++++++++++----------------- integration-tests/ts/src/utils.ts | 26 +++++++++--- market-contract/src/sale.rs | 1 - out/main.wasm | Bin 303671 -> 0 bytes out/market.wasm | Bin 260117 -> 0 bytes out/series.wasm | Bin 341261 -> 0 bytes 8 files changed, 58 insertions(+), 55 deletions(-) delete mode 100755 out/main.wasm delete mode 100755 out/market.wasm delete mode 100755 out/series.wasm diff --git a/integration-tests/ts/ava.config.cjs b/integration-tests/ts/ava.config.cjs index 07ee8c4..2d36032 100644 --- a/integration-tests/ts/ava.config.cjs +++ b/integration-tests/ts/ava.config.cjs @@ -1,9 +1,9 @@ -require("util").inspect.defaultOptions.depth = 5; // Increase AVA's printing depth +require('util').inspect.defaultOptions.depth = 5; // Increase AVA's printing depth module.exports = { - timeout: "300000", + timeout: '300000', files: ["./src/main.ava.ts"], failWithoutAssertions: false, extensions: ["ts"], - require: ["ts-node/register"], -}; + require: ['ts-node/register', 'near-workspaces'], +}; \ No newline at end of file diff --git a/integration-tests/ts/package.json b/integration-tests/ts/package.json index 0eebcc0..80762d6 100644 --- a/integration-tests/ts/package.json +++ b/integration-tests/ts/package.json @@ -6,11 +6,16 @@ "test": "ava" }, "devDependencies": { - "ava": "^4.3.3", - "near-workspaces": "^3.2.2", - "typescript": "^4.6.4", - "ts-node": "^10.8.0", - "@types/bn.js": "^5.1.0" + "@ava/typescript": "^4.1.0", + "ava": "^6.1.2", + "near-workspaces": "^3.5.0", + "ts-morph": "^21.0.1", + "ts-node": "^10.9.2", + "tsimp": "^2.0.11", + "typescript": "^5.3.3" }, - "dependencies": {} + "dependencies": { + "near-cli": "^4.0.8", + "near-sdk-js": "1.0.0" + } } diff --git a/integration-tests/ts/src/main.ava.ts b/integration-tests/ts/src/main.ava.ts index 68d3ab1..25ab4a8 100644 --- a/integration-tests/ts/src/main.ava.ts +++ b/integration-tests/ts/src/main.ava.ts @@ -1,9 +1,11 @@ +import { setDefaultResultOrder } from 'dns'; setDefaultResultOrder('ipv4first'); // temp fix for node > v17 + import anyTest, { TestFn } from "ava"; import { NEAR, NearAccount, Worker, BN } from "near-workspaces"; import path from "path"; import { approveNFT, defaultCallOptions, DEFAULT_GAS, mintNFT, payForStorage, - placeNFTForSale, purchaseListedNFT, transferNFT + approveNFTForSale, placeNFTForSale, purchaseListedNFT, transferNFT } from "./utils"; const test = anyTest as TestFn<{ @@ -12,10 +14,13 @@ const test = anyTest as TestFn<{ }>; test.beforeEach(async (t) => { + // Init the worker and start a Sandbox server const worker = await Worker.init(); + + // Deploy contract const root = worker.rootAccount; - const nftContractLocation = path.join(__dirname, "../../../out/main.wasm"); + const nftContractLocation = path.join(__dirname, "../../../nft-contract-royalty/target/wasm32-unknown-unknown/release/nft_contract_skeleton.wasm"); const nft_contract = await root.devDeploy( nftContractLocation, { @@ -25,7 +30,7 @@ test.beforeEach(async (t) => { } ); - const marketContractLocation = path.join(__dirname, "../../../out/market.wasm"); + const marketContractLocation = path.join(__dirname, "../../../market-contract/target/wasm32-unknown-unknown/release/nft_market_contract.wasm"); const market_contract = await root.devDeploy( marketContractLocation, { @@ -52,8 +57,9 @@ test.beforeEach(async (t) => { }); test.afterEach.always(async (t) => { + // Stop Sandbox server await t.context.worker.tearDown().catch((error) => { - console.log("Failed to tear down the worker:", error); + console.log('Failed to stop the Sandbox:', error); }); }); @@ -134,41 +140,14 @@ test("nft contract: nft approve call", async (t) => { t.true(approved, "Failed to approve NFT"); }); -test("nft contract: nft approve call long msg string", async (t) => { - const { alice, nft_contract, market_contract } = t.context.accounts; - await mintNFT(alice, nft_contract); - await payForStorage(alice, market_contract); - - // approve NFT - const approve_payload = { - token_id: "TEST123", - account_id: market_contract, - msg: "sample message".repeat(10 * 1024), - }; - const result = await alice.callRaw( - nft_contract, - "nft_approve", - approve_payload, - defaultCallOptions() - ); - t.regex(result.receiptFailureMessages.join("\n"), /Not valid SaleArgs+/); - - // test if approved - const view_payload = { - token_id: "TEST123", - approved_account_id: market_contract, - }; - const approved = await nft_contract.view("nft_is_approved", view_payload); - t.true(approved, "NFT approval apss without sale args"); -}); - test("cross contract: sell NFT listed on marketplace", async (t) => { const { alice, nft_contract, market_contract, bob } = t.context.accounts; await mintNFT(alice, nft_contract); await payForStorage(alice, market_contract); const sale_price = "300000000000000000000000"; // sale price string in yoctoNEAR is 0.3 NEAR - await placeNFTForSale(market_contract, alice, nft_contract, sale_price); + await approveNFTForSale(market_contract, alice, nft_contract, sale_price); + await placeNFTForSale(nft_contract, 0, market_contract, alice, sale_price); const alice_balance_before = await alice.availableBalance(); const bob_balance_before = await bob.availableBalance(); @@ -199,7 +178,7 @@ test("cross contract: sell NFT listed on marketplace", async (t) => { t.is(token_info.owner_id, bob.accountId, "NFT should have been sold"); // nothing left for sale on market const sale_supply = await market_contract.view("get_supply_sales"); - t.is(sale_supply, "0", "Expected no sales to be left on market"); + t.is(sale_supply, 0, "Expected no sales to be left on market"); }); test("cross contract: transfer NFT when listed on marketplace", async (t) => { @@ -208,7 +187,8 @@ test("cross contract: transfer NFT when listed on marketplace", async (t) => { await payForStorage(alice, market_contract); const sale_price = "300000000000000000000000"; // sale price string in yoctoNEAR is 0.3 NEAR - await placeNFTForSale(market_contract, alice, nft_contract, sale_price); + await approveNFTForSale(market_contract, alice, nft_contract, sale_price); + await placeNFTForSale(nft_contract, 0, market_contract, alice, sale_price); await transferNFT(bob, market_contract, nft_contract); @@ -222,7 +202,7 @@ test("cross contract: transfer NFT when listed on marketplace", async (t) => { "offer", offer_payload, defaultCallOptions( - DEFAULT_GAS + "0", // 10X default amount for XCC + DEFAULT_GAS, sale_price // Attached deposit must be greater than or equal to the current price ) ); @@ -246,7 +226,7 @@ test("cross contract: approval revoke", async (t) => { const { alice, nft_contract, market_contract, bob } = t.context.accounts; await mintNFT(alice, nft_contract); await payForStorage(alice, market_contract); - await placeNFTForSale( + await approveNFTForSale( market_contract, alice, nft_contract, @@ -290,7 +270,8 @@ test("cross contract: reselling and royalties", async (t) => { await mintNFT(alice, nft_contract, royalties); await payForStorage(alice, market_contract); const ask_price = "300000000000000000000000"; - await placeNFTForSale(market_contract, alice, nft_contract, ask_price); + await approveNFTForSale(market_contract, alice, nft_contract, ask_price); + await placeNFTForSale(nft_contract, 0, market_contract, alice, ask_price); const bid_price = ask_price + "0"; @@ -316,7 +297,9 @@ test("cross contract: reselling and royalties", async (t) => { // bob relists NFT for higher price await payForStorage(bob, market_contract); const resell_ask_price = bid_price + "0"; - await placeNFTForSale(market_contract, bob, nft_contract, resell_ask_price); + await approveNFTForSale(market_contract, bob, nft_contract, resell_ask_price); + await placeNFTForSale(nft_contract, 1, market_contract, bob, resell_ask_price); + // bob updates price to lower ask const lowered_resell_ask_price = "600000000000000000000000"; diff --git a/integration-tests/ts/src/utils.ts b/integration-tests/ts/src/utils.ts index fbf6465..cce11f2 100644 --- a/integration-tests/ts/src/utils.ts +++ b/integration-tests/ts/src/utils.ts @@ -1,6 +1,6 @@ import { BN, NearAccount } from "near-workspaces"; -export const DEFAULT_GAS: string = "30000000000000"; +export const DEFAULT_GAS: string = "300000000000000"; export const DEFAULT_DEPOSIT: string = "9050000000000000000000"; @@ -18,11 +18,11 @@ export async function purchaseListedNFT( market_contract, "offer", offer_payload, - defaultCallOptions(DEFAULT_GAS + "0", bid_price) + defaultCallOptions(DEFAULT_GAS, bid_price) ); } -export async function placeNFTForSale( +export async function approveNFTForSale( market_contract: NearAccount, owner: NearAccount, nft_contract: NearAccount, @@ -36,13 +36,29 @@ export async function placeNFTForSale( ); } +export async function placeNFTForSale( + nft_contract_id: NearAccount, + approval_id: number, + market_contract: NearAccount, + owner: NearAccount, + price: string // sale price string in yoctoNEAR +) { + const payload = { + nft_contract_id, + token_id: "TEST123", + approval_id, + msg: '{"sale_conditions": ' + `"${price}"` + " }" // msg string trigger XCC + }; + await owner.call(market_contract, "list_nft_for_sale", payload, defaultCallOptions()); +} + export function defaultCallOptions( gas: string = DEFAULT_GAS, deposit: string = DEFAULT_DEPOSIT ) { return { - gas: new BN(gas), - attachedDeposit: new BN(deposit), + gas: gas, + attachedDeposit: deposit, }; } export async function approveNFT( diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index f356887..d744f95 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -204,7 +204,6 @@ impl Contract { .ok() //returns None if the none. Otherwise executes the following logic .and_then(|payout_object| { - env::log_str(&format!("payout_object: {:?}", payout_object).to_string()); //we'll check if length of the payout object is > 10 or it's empty. In either case, we return None if payout_object.payout.len() > 10 || payout_object.payout.is_empty() { env::log_str("Cannot have more than 10 royalties"); diff --git a/out/main.wasm b/out/main.wasm deleted file mode 100755 index 7a912b83773dd88bfe0bf617fe036eba060e7fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303671 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%0D7lBxm2rOT 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ÇI!qs!U2tan}eq_|Up+H&m{^`6Kj79;o=>40> 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 AO8@`> diff --git a/out/series.wasm b/out/series.wasm deleted file mode 100755 index 4a83f38f0ea6d97785bd9c729106cb70f447d0d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341261 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 z 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

  • ZFKFh9>TlgD=9(3ftDM}Wmp?Y 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 g Date: Tue, 2 Apr 2024 14:10:12 +0200 Subject: [PATCH 19/28] fixed styles, added events.rs file to the skeleton --- nft-contract-skeleton/src/events.rs | 138 +++++++++++++++++++++++++++ nft-contract-skeleton/src/royalty.rs | 5 +- 2 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 nft-contract-skeleton/src/events.rs diff --git a/nft-contract-skeleton/src/events.rs b/nft-contract-skeleton/src/events.rs new file mode 100644 index 0000000..f65a3f4 --- /dev/null +++ b/nft-contract-skeleton/src/events.rs @@ -0,0 +1,138 @@ +use std::fmt; + +use near_sdk::serde::{Deserialize, Serialize}; + +/// Enum that represents the data type of the EventLog. +/// The enum can either be an NftMint or an NftTransfer. +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "event", content = "data")] +#[serde(rename_all = "snake_case")] +#[serde(crate = "near_sdk::serde")] +#[non_exhaustive] +pub enum EventLogVariant { + NftMint(Vec), + NftTransfer(Vec), +} + +/// Interface to capture data about an event +/// +/// Arguments: +/// * `standard`: name of standard e.g. nep171 +/// * `version`: e.g. 1.0.0 +/// * `event`: associate event data +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct EventLog { + pub standard: String, + pub version: String, + + // `flatten` to not have "event": {} in the JSON, just have the contents of {}. + #[serde(flatten)] + pub event: EventLogVariant, +} + +impl fmt::Display for EventLog { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!( + "EVENT_JSON:{}", + &serde_json::to_string(self).map_err(|_| fmt::Error)? + )) + } +} + +/// An event log to capture token minting +/// +/// Arguments +/// * `owner_id`: "account.near" +/// * `token_ids`: ["1", "abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftMintLog { + pub owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +/// An event log to capture token transfer +/// +/// Arguments +/// * `authorized_id`: approved account to transfer +/// * `old_owner_id`: "owner.near" +/// * `new_owner_id`: "receiver.near" +/// * `token_ids`: ["1", "12345abc"] +/// * `memo`: optional message +#[derive(Serialize, Deserialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct NftTransferLog { + #[serde(skip_serializing_if = "Option::is_none")] + pub authorized_id: Option, + + pub old_owner_id: String, + pub new_owner_id: String, + pub token_ids: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub memo: Option, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn nep_format_vector() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]},{"owner_id":"user1.near","token_ids":["meme"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![ + NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }, + NftMintLog { + owner_id: "user1.near".to_owned(), + token_ids: vec!["meme".to_string()], + memo: None, + }, + ]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_mint() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_mint","data":[{"owner_id":"foundation.near","token_ids":["aurora","proximitylabs"]}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftMint(vec![NftMintLog { + owner_id: "foundation.near".to_owned(), + token_ids: vec!["aurora".to_string(), "proximitylabs".to_string()], + memo: None, + }]), + }; + assert_eq!(expected, log.to_string()); + } + + #[test] + fn nep_format_transfer_all_fields() { + let expected = r#"EVENT_JSON:{"standard":"nep171","version":"1.0.0","event":"nft_transfer","data":[{"authorized_id":"market.near","old_owner_id":"user1.near","new_owner_id":"user2.near","token_ids":["token"],"memo":"Go Team!"}]}"#; + let log = EventLog { + standard: "nep171".to_string(), + version: "1.0.0".to_string(), + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + authorized_id: Some("market.near".to_string()), + old_owner_id: "user1.near".to_string(), + new_owner_id: "user2.near".to_string(), + token_ids: vec!["token".to_string()], + memo: Some("Go Team!".to_owned()), + }]), + }; + assert_eq!(expected, log.to_string()); + } +} \ No newline at end of file diff --git a/nft-contract-skeleton/src/royalty.rs b/nft-contract-skeleton/src/royalty.rs index beb2fc2..6dcbb1c 100644 --- a/nft-contract-skeleton/src/royalty.rs +++ b/nft-contract-skeleton/src/royalty.rs @@ -18,14 +18,13 @@ pub trait NonFungibleTokenCore { #[near_bindgen] impl NonFungibleTokenCore for Contract { - //calculates the payout for a token given the passed in balance. This is a view method fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { - /* + /* FILL THIS IN */ todo!(); //remove once code is filled in. - } + } //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. #[payable] From f02c43704c95355502563d8e6d6993b2750aa7de Mon Sep 17 00:00:00 2001 From: garikbesson Date: Tue, 2 Apr 2024 19:51:51 +0200 Subject: [PATCH 20/28] moved events functionality to separate folder --- nft-contract-basic/src/internal.rs | 33 --- nft-contract-basic/src/lib.rs | 2 - nft-contract-basic/src/mint.rs | 36 --- nft-contract-basic/src/nft_core.rs | 43 ---- nft-contract-events/Cargo.toml | 22 ++ nft-contract-events/README.md | 1 + nft-contract-events/res/nft_simple.wasm | Bin 0 -> 211520 bytes nft-contract-events/src/approval.rs | 73 ++++++ nft-contract-events/src/enumeration.rs | 77 ++++++ .../src/events.rs | 0 nft-contract-events/src/internal.rs | 161 ++++++++++++ nft-contract-events/src/lib.rs | 117 +++++++++ nft-contract-events/src/metadata.rs | 70 +++++ nft-contract-events/src/mint.rs | 59 +++++ nft-contract-events/src/nft_core.rs | 242 ++++++++++++++++++ nft-contract-events/src/royalty.rs | 46 ++++ 16 files changed, 868 insertions(+), 114 deletions(-) create mode 100644 nft-contract-events/Cargo.toml create mode 100644 nft-contract-events/README.md create mode 100755 nft-contract-events/res/nft_simple.wasm create mode 100644 nft-contract-events/src/approval.rs create mode 100644 nft-contract-events/src/enumeration.rs rename {nft-contract-basic => nft-contract-events}/src/events.rs (100%) create mode 100644 nft-contract-events/src/internal.rs create mode 100644 nft-contract-events/src/lib.rs create mode 100644 nft-contract-events/src/metadata.rs create mode 100644 nft-contract-events/src/mint.rs create mode 100644 nft-contract-events/src/nft_core.rs create mode 100644 nft-contract-events/src/royalty.rs diff --git a/nft-contract-basic/src/internal.rs b/nft-contract-basic/src/internal.rs index fb8747d..48ade4e 100644 --- a/nft-contract-basic/src/internal.rs +++ b/nft-contract-basic/src/internal.rs @@ -100,7 +100,6 @@ impl Contract { sender_id: &AccountId, receiver_id: &AccountId, token_id: &TokenId, - memo: Option, ) -> Token { //get the token object by passing in the token_id let token = self.tokens_by_id.get(token_id).expect("No token"); @@ -122,38 +121,6 @@ impl Contract { }; //insert that new token into the tokens_by_id, replacing the old entry self.tokens_by_id.insert(token_id, &new_token); - - //if there was some memo attached, we log it. - if let Some(memo) = memo.as_ref() { - env::log_str(&format!("Memo: {}", memo).to_string()); - } - - // Default the authorized ID to be None for the logs. // We will return here in the future when we study the approval functionality - let mut authorized_id = None; - - // Construct the transfer log as per the events standard. - let nft_transfer_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - // The optional authorized account ID to transfer the token on behalf of the old owner. - authorized_id, - // The old owner's account ID. - old_owner_id: token.owner_id.to_string(), - // The account ID of the new owner of the token. - new_owner_id: receiver_id.to_string(), - // A vector containing the token IDs as strings. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo, - }]), - }; - - // Log the serialized json. - env::log_str(&nft_transfer_log.to_string()); //return the previous token object that was transferred. token diff --git a/nft-contract-basic/src/lib.rs b/nft-contract-basic/src/lib.rs index a37235c..6ca71a4 100644 --- a/nft-contract-basic/src/lib.rs +++ b/nft-contract-basic/src/lib.rs @@ -13,7 +13,6 @@ pub use crate::mint::*; pub use crate::nft_core::*; pub use crate::approval::*; pub use crate::royalty::*; -pub use crate::events::*; mod internal; mod enumeration; @@ -22,7 +21,6 @@ mod mint; mod nft_core; mod approval; mod royalty; -mod events; /// This spec can be treated like a version of the standard. pub const NFT_METADATA_SPEC: &str = "1.0.0"; diff --git a/nft-contract-basic/src/mint.rs b/nft-contract-basic/src/mint.rs index 44fa334..ae0b238 100644 --- a/nft-contract-basic/src/mint.rs +++ b/nft-contract-basic/src/mint.rs @@ -8,26 +8,10 @@ impl Contract { token_id: TokenId, metadata: TokenMetadata, receiver_id: AccountId, - //we add an optional parameter for perpetual royalties - perpetual_royalties: Option>, ) { //measure the initial storage being used on the contract let initial_storage_usage = env::storage_usage(); - // create a royalty map to store in the token - let mut royalty = HashMap::new(); - - // if perpetual royalties were passed into the function: - if let Some(perpetual_royalties) = perpetual_royalties { - //make sure that the length of the perpetual royalties is below 7 since we won't have enough GAS to pay out that many people - assert!(perpetual_royalties.len() < 7, "Cannot add more than 6 perpetual royalty amounts"); - - //iterate through the perpetual royalties and insert the account and amount in the royalty map - for (account, amount) in perpetual_royalties { - royalty.insert(account, amount); - } - } - //specify the token struct that contains the owner ID let token = Token { //set the owner ID equal to the receiver ID passed into the function @@ -46,26 +30,6 @@ impl Contract { //call the internal method for adding the token to the owner self.internal_add_token_to_owner(&token.owner_id, &token_id); - // Construct the mint log as per the events standard. - let nft_mint_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftMint(vec![NftMintLog { - // Owner of the token. - owner_id: token.owner_id.to_string(), - // Vector of token IDs that were minted. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo: None, - }]), - }; - - // Log the serialized json. - env::log_str(&nft_mint_log.to_string()); - //calculate the required storage which was the used - initial let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; diff --git a/nft-contract-basic/src/nft_core.rs b/nft-contract-basic/src/nft_core.rs index a74afb1..6c1531b 100644 --- a/nft-contract-basic/src/nft_core.rs +++ b/nft-contract-basic/src/nft_core.rs @@ -49,13 +49,9 @@ trait NonFungibleTokenResolver { */ fn nft_resolve_transfer( &mut self, - //we introduce an authorized ID for logging the transfer event - authorized_id: Option, owner_id: AccountId, receiver_id: AccountId, token_id: TokenId, - //we introduce a memo for logging the transfer event - memo: Option, ) -> bool; } @@ -79,7 +75,6 @@ impl NonFungibleTokenCore for Contract { &sender_id, &receiver_id, &token_id, - memo, ); } @@ -103,12 +98,8 @@ impl NonFungibleTokenCore for Contract { &sender_id, &receiver_id, &token_id, - memo.clone(), ); - //default the authorized_id to none - let mut authorized_id = None; - // Initiating receiver's call and the callback // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. ext_non_fungible_token_receiver::ext(receiver_id.clone()) @@ -125,11 +116,9 @@ impl NonFungibleTokenCore for Contract { Self::ext(env::current_account_id()) .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) .nft_resolve_transfer( - authorized_id, // we introduce an authorized ID so that we can log the transfer previous_token.owner_id, receiver_id, token_id, - memo, // we introduce a memo for logging in the events standard ) ).into() } @@ -159,13 +148,9 @@ impl NonFungibleTokenResolver for Contract { #[private] fn nft_resolve_transfer( &mut self, - //we introduce an authorized ID for logging the transfer event - authorized_id: Option, owner_id: AccountId, receiver_id: AccountId, token_id: TokenId, - //we introduce a memo for logging the transfer event - memo: Option, ) -> bool { // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` // call result. @@ -208,34 +193,6 @@ impl NonFungibleTokenResolver for Contract { //we inset the token back into the tokens_by_id collection self.tokens_by_id.insert(&token_id, &token); - /* - We need to log that the NFT was reverted back to the original owner. - The old_owner_id will be the receiver and the new_owner_id will be the - original owner of the token since we're reverting the transfer. - */ - let nft_transfer_log: EventLog = EventLog { - // Standard name ("nep171"). - standard: NFT_STANDARD_NAME.to_string(), - // Version of the standard ("nft-1.0.0"). - version: NFT_METADATA_SPEC.to_string(), - // The data related with the event stored in a vector. - event: EventLogVariant::NftTransfer(vec![NftTransferLog { - // The optional authorized account ID to transfer the token on behalf of the old owner. - authorized_id, - // The old owner's account ID. - old_owner_id: receiver_id.to_string(), - // The account ID of the new owner of the token. - new_owner_id: owner_id.to_string(), - // A vector containing the token IDs as strings. - token_ids: vec![token_id.to_string()], - // An optional memo to include. - memo, - }]), - }; - - //we perform the actual logging - env::log_str(&nft_transfer_log.to_string()); - //return false false } diff --git a/nft-contract-events/Cargo.toml b/nft-contract-events/Cargo.toml new file mode 100644 index 0000000..b1b459a --- /dev/null +++ b/nft-contract-events/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "nft_contract_skeleton" +version = "0.1.0" +authors = ["Near Inc "] +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = { version = "5.1.0", features = ["legacy"] } +serde_json = "1.0.113" + +[profile.release] +codegen-units = 1 +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +debug = false +panic = "abort" +# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801 +overflow-checks = true diff --git a/nft-contract-events/README.md b/nft-contract-events/README.md new file mode 100644 index 0000000..7064491 --- /dev/null +++ b/nft-contract-events/README.md @@ -0,0 +1 @@ +# TBD diff --git a/nft-contract-events/res/nft_simple.wasm b/nft-contract-events/res/nft_simple.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f68c929bd483f1dc1d8f73986c7cdfbd91ce2947 GIT binary patch literal 211520 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 + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool; + + //revoke a specific account from transferring the token on your behalf + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId); + + //revoke all accounts from transferring the token on your behalf + fn nft_revoke_all(&mut self, token_id: TokenId); +} + +#[ext_contract(ext_non_fungible_approval_receiver)] +trait NonFungibleTokenApprovalsReceiver { + //cross contract call to an external contract that is initiated during nft_approve + fn nft_on_approve( + &mut self, + token_id: TokenId, + owner_id: AccountId, + approval_id: u64, + msg: String, + ); +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //allow a specific account ID to approve a token on your behalf + #[payable] + fn nft_approve(&mut self, token_id: TokenId, account_id: AccountId, msg: Option) { + /* + FILL THIS IN + */ + } + + //check if the passed in account has access to approve the token ID + fn nft_is_approved( + &self, + token_id: TokenId, + approved_account_id: AccountId, + approval_id: Option, + ) -> bool { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //revoke a specific account from transferring the token on your behalf + #[payable] + fn nft_revoke(&mut self, token_id: TokenId, account_id: AccountId) { + /* + FILL THIS IN + */ + } + + //revoke all accounts from transferring the token on your behalf + #[payable] + fn nft_revoke_all(&mut self, token_id: TokenId) { + /* + FILL THIS IN + */ + } +} \ No newline at end of file diff --git a/nft-contract-events/src/enumeration.rs b/nft-contract-events/src/enumeration.rs new file mode 100644 index 0000000..859d21d --- /dev/null +++ b/nft-contract-events/src/enumeration.rs @@ -0,0 +1,77 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + //Query for the total supply of NFTs on the contract + pub fn nft_total_supply(&self) -> u64 { + //return the length of the token metadata by ID + self.token_metadata_by_id.len() + } + + //Query for nft tokens on the contract regardless of the owner using pagination + pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(0)); + + //iterate through each token using an iterator + self.token_metadata_by_id.keys() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } + + //get the total supply of NFTs for a given owner + pub fn nft_supply_for_owner( + &self, + account_id: AccountId, + ) -> u64 { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + + //if there is some set of tokens, we'll return the length + if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set.len() + } else { + //if there isn't a set of tokens for the passed in account ID, we'll return 0 + 0 + } + } + + //Query for all the tokens for an owner + //Query for all the tokens for an owner + pub fn nft_tokens_for_owner( + &self, + account_id: AccountId, + from_index: Option, + limit: Option, + ) -> Vec { + //get the set of tokens for the passed in owner + let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); + //if there is some set of tokens, we'll set the tokens variable equal to that set + let tokens = if let Some(tokens_for_owner_set) = tokens_for_owner_set { + tokens_for_owner_set + } else { + //if there is no set of tokens, we'll simply return an empty vector. + return vec![]; + }; + + //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index + let start = u128::from(from_index.unwrap_or(0)); + + //iterate through the keys vector + tokens.iter() + //skip to the index we specified in the start variable + .skip(start as usize) + //take the first "limit" elements in the vector. If we didn't specify a limit, use 50 + .take(limit.unwrap_or(50) as usize) + //we'll map the token IDs which are strings into Json Tokens + .map(|token_id| self.nft_token(token_id.clone()).unwrap()) + //since we turned the keys into an iterator, we need to turn it back into a vector to return + .collect() + } +} \ No newline at end of file diff --git a/nft-contract-basic/src/events.rs b/nft-contract-events/src/events.rs similarity index 100% rename from nft-contract-basic/src/events.rs rename to nft-contract-events/src/events.rs diff --git a/nft-contract-events/src/internal.rs b/nft-contract-events/src/internal.rs new file mode 100644 index 0000000..fb8747d --- /dev/null +++ b/nft-contract-events/src/internal.rs @@ -0,0 +1,161 @@ +use crate::*; +use near_sdk::{CryptoHash}; +use std::mem::size_of; + +//used to generate a unique prefix in our storage collections (this is to avoid data collisions) +pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { + //get the default hash + let mut hash = CryptoHash::default(); + //we hash the account ID and return it + hash.copy_from_slice(&env::sha256(account_id.as_bytes())); + hash +} + +//used to make sure the user attached exactly 1 yoctoNEAR +pub(crate) fn assert_one_yocto() { + assert_eq!( + env::attached_deposit(), + NearToken::from_yoctonear(1), + "Requires attached deposit of exactly 1 yoctoNEAR", + ) +} + +//refund the initial deposit based on the amount of storage that was used up +pub(crate) fn refund_deposit(storage_used: u128) { + //get how much it would cost to store the information + let required_cost = env::storage_byte_cost().saturating_mul(storage_used); + //get the attached deposit + let attached_deposit = env::attached_deposit(); + + //make sure that the attached deposit is greater than or equal to the required cost + assert!( + required_cost <= attached_deposit, + "Must attach {} yoctoNEAR to cover storage", + required_cost, + ); + + //get the refund amount from the attached deposit - required cost + let refund = attached_deposit.saturating_sub(required_cost); + + //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount + if refund.gt(&ONE_YOCTONEAR) { + Promise::new(env::predecessor_account_id()).transfer(refund); + } +} + +impl Contract { + //add a token to the set of tokens an owner has + pub(crate) fn internal_add_token_to_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //get the set of tokens for the given account + let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { + //if the account doesn't have any tokens, we create a new unordered set + UnorderedSet::new( + StorageKey::TokenPerOwnerInner { + //we get a new unique prefix for the collection + account_id_hash: hash_account_id(&account_id), + }, + ) + }); + + //we insert the token ID into the set + tokens_set.insert(token_id); + + //we insert that set for the given account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + + //remove a token from an owner (internal method and can't be called directly via CLI). + pub(crate) fn internal_remove_token_from_owner( + &mut self, + account_id: &AccountId, + token_id: &TokenId, + ) { + //we get the set of tokens that the owner has + let mut tokens_set = self + .tokens_per_owner + .get(account_id) + //if there is no set of tokens for the owner, we panic with the following message: + .expect("Token should be owned by the sender"); + + //we remove the the token_id from the set of tokens + tokens_set.remove(token_id); + + //if the token set is now empty, we remove the owner from the tokens_per_owner collection + if tokens_set.is_empty() { + self.tokens_per_owner.remove(account_id); + } else { + //if the token set is not empty, we simply insert it back for the account ID. + self.tokens_per_owner.insert(account_id, &tokens_set); + } + } + + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). + pub(crate) fn internal_transfer( + &mut self, + sender_id: &AccountId, + receiver_id: &AccountId, + token_id: &TokenId, + memo: Option, + ) -> Token { + //get the token object by passing in the token_id + let token = self.tokens_by_id.get(token_id).expect("No token"); + + //we make sure that the sender isn't sending the token to themselves + assert_ne!( + &token.owner_id, receiver_id, + "The token owner and the receiver should be different" + ); + + //we remove the token from it's current owner's set + self.internal_remove_token_from_owner(&token.owner_id, token_id); + //we then add the token to the receiver_id's set + self.internal_add_token_to_owner(receiver_id, token_id); + + //we create a new token struct + let new_token = Token { + owner_id: receiver_id.clone(), + }; + //insert that new token into the tokens_by_id, replacing the old entry + self.tokens_by_id.insert(token_id, &new_token); + + //if there was some memo attached, we log it. + if let Some(memo) = memo.as_ref() { + env::log_str(&format!("Memo: {}", memo).to_string()); + } + + // Default the authorized ID to be None for the logs. // We will return here in the future when we study the approval functionality + let mut authorized_id = None; + + // Construct the transfer log as per the events standard. + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: token.owner_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: receiver_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_transfer_log.to_string()); + + //return the previous token object that was transferred. + token + } +} \ No newline at end of file diff --git a/nft-contract-events/src/lib.rs b/nft-contract-events/src/lib.rs new file mode 100644 index 0000000..a37235c --- /dev/null +++ b/nft-contract-events/src/lib.rs @@ -0,0 +1,117 @@ +use std::collections::HashMap; +use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; +use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; +use near_sdk::json_types::Base64VecU8; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema +}; + +use crate::internal::*; +pub use crate::metadata::*; +pub use crate::mint::*; +pub use crate::nft_core::*; +pub use crate::approval::*; +pub use crate::royalty::*; +pub use crate::events::*; + +mod internal; +mod enumeration; +mod metadata; +mod mint; +mod nft_core; +mod approval; +mod royalty; +mod events; + +/// This spec can be treated like a version of the standard. +pub const NFT_METADATA_SPEC: &str = "1.0.0"; +/// This is the name of the NFT standard we're using +pub const NFT_STANDARD_NAME: &str = "nep171"; + +//Basic NEAR amounts as constants +const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); + +#[near_bindgen] +#[derive(BorshSerialize, BorshDeserialize, PanicOnDefault)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Contract { + //contract owner + pub owner_id: AccountId, + + //keeps track of all the token IDs for a given account + pub tokens_per_owner: LookupMap>, + + //keeps track of the token struct for a given token ID + pub tokens_by_id: LookupMap, + + //keeps track of the token metadata for a given token ID + pub token_metadata_by_id: UnorderedMap, + + //keeps track of the metadata for the contract + pub metadata: LazyOption, +} + +/// Helper structure for keys of the persistent collections. +#[derive(BorshSerialize, BorshStorageKey)] +#[borsh(crate = "near_sdk::borsh")] +pub enum StorageKey { + TokensPerOwner, + TokenPerOwnerInner { account_id_hash: CryptoHash }, + TokensById, + TokenMetadataById, + NFTContractMetadata, + TokensPerType, + TokensPerTypeInner { token_type_hash: CryptoHash }, + TokenTypesLocked, +} + +#[near_bindgen] +impl Contract { + /* + initialization function (can only be called once). + this initializes the contract with default metadata so the + user doesn't have to manually type metadata. + */ + #[init] + pub fn new_default_meta(owner_id: AccountId) -> Self { + //calls the other function "new: with some default metadata and the owner_id passed in + Self::new( + owner_id, + NFTContractMetadata { + spec: "nft-1.0.0".to_string(), + name: "NFT Tutorial Contract".to_string(), + symbol: "GOTEAM".to_string(), + icon: None, + base_uri: None, + reference: None, + reference_hash: None, + }, + ) + } + + /* + initialization function (can only be called once). + this initializes the contract with metadata that was passed in and + the owner_id. + */ + #[init] + pub fn new(owner_id: AccountId, metadata: NFTContractMetadata) -> Self { + //create a variable of type Self with all the fields initialized. + let this = Self { + //Storage keys are simply the prefixes used for the collections. This helps avoid data collision + tokens_per_owner: LookupMap::new(StorageKey::TokensPerOwner), + tokens_by_id: LookupMap::new(StorageKey::TokensById), + token_metadata_by_id: UnorderedMap::new(StorageKey::TokenMetadataById), + //set the owner_id field equal to the passed in owner_id. + owner_id, + metadata: LazyOption::new( + StorageKey::NFTContractMetadata, + Some(&metadata), + ), + }; + + //return the Contract object + this + } +} \ No newline at end of file diff --git a/nft-contract-events/src/metadata.rs b/nft-contract-events/src/metadata.rs new file mode 100644 index 0000000..1578d88 --- /dev/null +++ b/nft-contract-events/src/metadata.rs @@ -0,0 +1,70 @@ +use crate::*; +pub type TokenId = String; +//defines the payout type we'll be returning as a part of the royalty standards. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct Payout { + pub payout: HashMap, +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct NFTContractMetadata { + pub spec: String, // required, essentially a version like "nft-1.0.0" + pub name: String, // required, ex. "Mosaics" + pub symbol: String, // required, ex. "MOSAIC" + pub icon: Option, // Data URL + pub base_uri: Option, // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs + pub reference: Option, // URL to a JSON file with more info + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, NearSchema)] +#[borsh(crate = "near_sdk::borsh")] +#[serde(crate = "near_sdk::serde")] +pub struct TokenMetadata { + pub title: Option, // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + pub description: Option, // free-form description + pub media: Option, // URL to associated media, preferably to decentralized, content-addressed storage + pub media_hash: Option, // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + pub copies: Option, // number of copies of this set of metadata in existence when token was minted. + pub issued_at: Option, // When token was issued or minted, Unix epoch in milliseconds + pub expires_at: Option, // When token expires, Unix epoch in milliseconds + pub starts_at: Option, // When token starts being valid, Unix epoch in milliseconds + pub updated_at: Option, // When token was last updated, Unix epoch in milliseconds + pub extra: Option, // anything extra the NFT wants to store on-chain. Can be stringified JSON. + pub reference: Option, // URL to an off-chain JSON file with more info. + pub reference_hash: Option, // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. +} + +#[derive(BorshDeserialize, BorshSerialize)] +#[borsh(crate = "near_sdk::borsh")] +pub struct Token { + //owner of the token + pub owner_id: AccountId, +} + +//The Json token is what will be returned from view calls. +#[derive(Serialize, Deserialize, NearSchema)] +#[serde(crate = "near_sdk::serde")] +pub struct JsonToken { + //token ID + pub token_id: TokenId, + //owner of the token + pub owner_id: AccountId, + //token metadata + pub metadata: TokenMetadata, +} + +pub trait NonFungibleTokenMetadata { + //view call for returning the contract metadata + fn nft_metadata(&self) -> NFTContractMetadata; +} + +#[near_bindgen] +impl NonFungibleTokenMetadata for Contract { + fn nft_metadata(&self) -> NFTContractMetadata { + self.metadata.get().unwrap() + } +} \ No newline at end of file diff --git a/nft-contract-events/src/mint.rs b/nft-contract-events/src/mint.rs new file mode 100644 index 0000000..51fd42d --- /dev/null +++ b/nft-contract-events/src/mint.rs @@ -0,0 +1,59 @@ +use crate::*; + +#[near_bindgen] +impl Contract { + #[payable] + pub fn nft_mint( + &mut self, + token_id: TokenId, + metadata: TokenMetadata, + receiver_id: AccountId, + ) { + //measure the initial storage being used on the contract + let initial_storage_usage = env::storage_usage(); + + //specify the token struct that contains the owner ID + let token = Token { + //set the owner ID equal to the receiver ID passed into the function + owner_id: receiver_id, + }; + + //insert the token ID and token struct and make sure that the token doesn't exist + assert!( + self.tokens_by_id.insert(&token_id, &token).is_none(), + "Token already exists" + ); + + //insert the token ID and metadata + self.token_metadata_by_id.insert(&token_id, &metadata); + + //call the internal method for adding the token to the owner + self.internal_add_token_to_owner(&token.owner_id, &token_id); + + // Construct the mint log as per the events standard. + let nft_mint_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftMint(vec![NftMintLog { + // Owner of the token. + owner_id: token.owner_id.to_string(), + // Vector of token IDs that were minted. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo: None, + }]), + }; + + // Log the serialized json. + env::log_str(&nft_mint_log.to_string()); + + //calculate the required storage which was the used - initial + let required_storage_in_bytes = env::storage_usage() - initial_storage_usage; + + //refund any excess storage if the user attached too much. Panic if they didn't attach enough to cover the required. + refund_deposit(required_storage_in_bytes.into()); + } +} \ No newline at end of file diff --git a/nft-contract-events/src/nft_core.rs b/nft-contract-events/src/nft_core.rs new file mode 100644 index 0000000..a74afb1 --- /dev/null +++ b/nft-contract-events/src/nft_core.rs @@ -0,0 +1,242 @@ +use crate::*; +use near_sdk::{ext_contract, Gas, log, PromiseResult}; + +const GAS_FOR_RESOLVE_TRANSFER: Gas = Gas::from_tgas(10); +const GAS_FOR_NFT_ON_TRANSFER: Gas = Gas::from_tgas(25); + +pub trait NonFungibleTokenCore { + //transfers an NFT to a receiver ID + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + ); + + //transfers an NFT to a receiver and calls a function on the receiver ID's contract + /// Returns `true` if the token was transferred from the sender's account. + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + msg: String, + ) -> PromiseOrValue; + + //get information about the NFT token passed in + fn nft_token(&self, token_id: TokenId) -> Option; +} + +#[ext_contract(ext_non_fungible_token_receiver)] +trait NonFungibleTokenReceiver { + //Method stored on the receiver contract that is called via cross contract call when nft_transfer_call is called + /// Returns `true` if the token should be returned back to the sender. + fn nft_on_transfer( + &mut self, + sender_id: AccountId, + previous_owner_id: AccountId, + token_id: TokenId, + msg: String, + ) -> Promise; +} + +#[ext_contract(ext_self)] +trait NonFungibleTokenResolver { + /* + resolves the promise of the cross contract call to the receiver contract + this is stored on THIS contract and is meant to analyze what happened in the cross contract call when nft_on_transfer was called + as part of the nft_transfer_call method + */ + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + //implementation of the nft_transfer method. This transfers the NFT from the current owner to the receiver. + #[payable] + fn nft_transfer( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + ) { + //assert that the user attached exactly 1 yoctoNEAR. This is for security and so that the user will be redirected to the NEAR wallet. + assert_one_yocto(); + //get the sender to transfer the token from the sender to the receiver + let sender_id = env::predecessor_account_id(); + + //call the internal transfer method + self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + memo, + ); + } + + //implementation of the transfer call method. This will transfer the NFT and call a method on the receiver_id contract + #[payable] + fn nft_transfer_call( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + memo: Option, + msg: String, + ) -> PromiseOrValue { + //assert that the user attached exactly 1 yocto for security reasons. + assert_one_yocto(); + + //get the sender ID + let sender_id = env::predecessor_account_id(); + + //transfer the token and get the previous token object + let previous_token = self.internal_transfer( + &sender_id, + &receiver_id, + &token_id, + memo.clone(), + ); + + //default the authorized_id to none + let mut authorized_id = None; + + // Initiating receiver's call and the callback + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for nft on transfer. + ext_non_fungible_token_receiver::ext(receiver_id.clone()) + .with_static_gas(GAS_FOR_NFT_ON_TRANSFER) + .nft_on_transfer( + sender_id, + previous_token.owner_id.clone(), + token_id.clone(), + msg + ) + // We then resolve the promise and call nft_resolve_transfer on our own contract + .then( + // Defaulting GAS weight to 1, no attached deposit, and static GAS equal to the GAS for resolve transfer + Self::ext(env::current_account_id()) + .with_static_gas(GAS_FOR_RESOLVE_TRANSFER) + .nft_resolve_transfer( + authorized_id, // we introduce an authorized ID so that we can log the transfer + previous_token.owner_id, + receiver_id, + token_id, + memo, // we introduce a memo for logging in the events standard + ) + ).into() + } + + //get the information for a specific token ID + fn nft_token(&self, token_id: TokenId) -> Option { + //if there is some token ID in the tokens_by_id collection + if let Some(token) = self.tokens_by_id.get(&token_id) { + //we'll get the metadata for that token + let metadata = self.token_metadata_by_id.get(&token_id).unwrap(); + //we return the JsonToken (wrapped by Some since we return an option) + Some(JsonToken { + token_id, + owner_id: token.owner_id, + metadata, + }) + } else { //if there wasn't a token ID in the tokens_by_id collection, we return None + None + } + } +} + +#[near_bindgen] +impl NonFungibleTokenResolver for Contract { + //resolves the cross contract call when calling nft_on_transfer in the nft_transfer_call method + //returns true if the token was successfully transferred to the receiver_id + #[private] + fn nft_resolve_transfer( + &mut self, + //we introduce an authorized ID for logging the transfer event + authorized_id: Option, + owner_id: AccountId, + receiver_id: AccountId, + token_id: TokenId, + //we introduce a memo for logging the transfer event + memo: Option, + ) -> bool { + // Whether receiver wants to return token back to the sender, based on `nft_on_transfer` + // call result. + if let PromiseResult::Successful(value) = env::promise_result(0) { + //As per the standard, the nft_on_transfer should return whether we should return the token to it's owner or not + if let Ok(return_token) = near_sdk::serde_json::from_slice::(&value) { + //if we need don't need to return the token, we simply return true meaning everything went fine + if !return_token { + /* + since we've already transferred the token and nft_on_transfer returned false, we don't have to + revert the original transfer and thus we can just return true since nothing went wrong. + */ + return true; + } + } + } + + //get the token object if there is some token object + let mut token = if let Some(token) = self.tokens_by_id.get(&token_id) { + if token.owner_id != receiver_id { + // The token is not owner by the receiver anymore. Can't return it. + return true; + } + token + //if there isn't a token object, it was burned and so we return true + } else { + return true; + }; + + //if at the end, we haven't returned true, that means that we should return the token to it's original owner + log!("Return {} from @{} to @{}", token_id, receiver_id, owner_id); + + //we remove the token from the receiver + self.internal_remove_token_from_owner(&receiver_id, &token_id); + //we add the token to the original owner + self.internal_add_token_to_owner(&owner_id, &token_id); + + //we change the token struct's owner to be the original owner + token.owner_id = owner_id.clone(); + //we inset the token back into the tokens_by_id collection + self.tokens_by_id.insert(&token_id, &token); + + /* + We need to log that the NFT was reverted back to the original owner. + The old_owner_id will be the receiver and the new_owner_id will be the + original owner of the token since we're reverting the transfer. + */ + let nft_transfer_log: EventLog = EventLog { + // Standard name ("nep171"). + standard: NFT_STANDARD_NAME.to_string(), + // Version of the standard ("nft-1.0.0"). + version: NFT_METADATA_SPEC.to_string(), + // The data related with the event stored in a vector. + event: EventLogVariant::NftTransfer(vec![NftTransferLog { + // The optional authorized account ID to transfer the token on behalf of the old owner. + authorized_id, + // The old owner's account ID. + old_owner_id: receiver_id.to_string(), + // The account ID of the new owner of the token. + new_owner_id: owner_id.to_string(), + // A vector containing the token IDs as strings. + token_ids: vec![token_id.to_string()], + // An optional memo to include. + memo, + }]), + }; + + //we perform the actual logging + env::log_str(&nft_transfer_log.to_string()); + + //return false + false + } +} diff --git a/nft-contract-events/src/royalty.rs b/nft-contract-events/src/royalty.rs new file mode 100644 index 0000000..beb2fc2 --- /dev/null +++ b/nft-contract-events/src/royalty.rs @@ -0,0 +1,46 @@ +use crate::*; + +pub trait NonFungibleTokenCore { + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: NearToken, + max_len_payout: u32, + ) -> Payout; +} + +#[near_bindgen] +impl NonFungibleTokenCore for Contract { + + //calculates the payout for a token given the passed in balance. This is a view method + fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + #[payable] + fn nft_transfer_payout( + &mut self, + receiver_id: AccountId, + token_id: TokenId, + approval_id: u64, + memo: Option, + balance: NearToken, + max_len_payout: u32, + ) -> Payout { + /* + FILL THIS IN + */ + todo!(); //remove once code is filled in. + } +} From ea86984b47c4ac68d7687fb5c1b53d966b5ae919 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Tue, 2 Apr 2024 20:42:24 +0200 Subject: [PATCH 21/28] removed duplicated comments --- nft-contract-basic/Cargo.toml | 1 - nft-contract-basic/src/enumeration.rs | 1 - nft-contract-basic/src/internal.rs | 1 - nft-contract-events/src/enumeration.rs | 1 - nft-contract-events/src/internal.rs | 1 - nft-contract-royalty/src/enumeration.rs | 1 - nft-contract-skeleton/src/internal.rs | 139 ------------------------ 7 files changed, 145 deletions(-) delete mode 100644 nft-contract-skeleton/src/internal.rs diff --git a/nft-contract-basic/Cargo.toml b/nft-contract-basic/Cargo.toml index b1b459a..6a5b5c8 100644 --- a/nft-contract-basic/Cargo.toml +++ b/nft-contract-basic/Cargo.toml @@ -9,7 +9,6 @@ crate-type = ["cdylib", "rlib"] [dependencies] near-sdk = { version = "5.1.0", features = ["legacy"] } -serde_json = "1.0.113" [profile.release] codegen-units = 1 diff --git a/nft-contract-basic/src/enumeration.rs b/nft-contract-basic/src/enumeration.rs index 859d21d..c7f3633 100644 --- a/nft-contract-basic/src/enumeration.rs +++ b/nft-contract-basic/src/enumeration.rs @@ -42,7 +42,6 @@ impl Contract { } } - //Query for all the tokens for an owner //Query for all the tokens for an owner pub fn nft_tokens_for_owner( &self, diff --git a/nft-contract-basic/src/internal.rs b/nft-contract-basic/src/internal.rs index 48ade4e..c8fd58c 100644 --- a/nft-contract-basic/src/internal.rs +++ b/nft-contract-basic/src/internal.rs @@ -93,7 +93,6 @@ impl Contract { } } - //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). pub(crate) fn internal_transfer( &mut self, diff --git a/nft-contract-events/src/enumeration.rs b/nft-contract-events/src/enumeration.rs index 859d21d..c7f3633 100644 --- a/nft-contract-events/src/enumeration.rs +++ b/nft-contract-events/src/enumeration.rs @@ -42,7 +42,6 @@ impl Contract { } } - //Query for all the tokens for an owner //Query for all the tokens for an owner pub fn nft_tokens_for_owner( &self, diff --git a/nft-contract-events/src/internal.rs b/nft-contract-events/src/internal.rs index fb8747d..56de327 100644 --- a/nft-contract-events/src/internal.rs +++ b/nft-contract-events/src/internal.rs @@ -93,7 +93,6 @@ impl Contract { } } - //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). pub(crate) fn internal_transfer( &mut self, diff --git a/nft-contract-royalty/src/enumeration.rs b/nft-contract-royalty/src/enumeration.rs index 859d21d..c7f3633 100644 --- a/nft-contract-royalty/src/enumeration.rs +++ b/nft-contract-royalty/src/enumeration.rs @@ -42,7 +42,6 @@ impl Contract { } } - //Query for all the tokens for an owner //Query for all the tokens for an owner pub fn nft_tokens_for_owner( &self, diff --git a/nft-contract-skeleton/src/internal.rs b/nft-contract-skeleton/src/internal.rs deleted file mode 100644 index ece73cc..0000000 --- a/nft-contract-skeleton/src/internal.rs +++ /dev/null @@ -1,139 +0,0 @@ -use crate::*; -use near_sdk::{CryptoHash}; -use std::mem::size_of; - -//used to generate a unique prefix in our storage collections (this is to avoid data collisions) -pub(crate) fn hash_account_id(account_id: &AccountId) -> CryptoHash { - //get the default hash - let mut hash = CryptoHash::default(); - //we hash the account ID and return it - hash.copy_from_slice(&env::sha256(account_id.as_bytes())); - hash -} - -//used to make sure the user attached exactly 1 yoctoNEAR -pub(crate) fn assert_one_yocto() { - assert_eq!( - env::attached_deposit(), - 1, - "Requires attached deposit of exactly 1 yoctoNEAR", - ) -} - -//refund the initial deposit based on the amount of storage that was used up -pub(crate) fn refund_deposit(storage_used: u128) { - //get how much it would cost to store the information - let required_cost = env::storage_byte_cost().saturating_mul(storage_used); - //get the attached deposit - let attached_deposit = env::attached_deposit(); - - //make sure that the attached deposit is greater than or equal to the required cost - assert!( - required_cost <= attached_deposit, - "Must attach {} yoctoNEAR to cover storage", - required_cost, - ); - - //get the refund amount from the attached deposit - required cost - let refund = attached_deposit - required_cost; - - //if the refund is greater than 1 yocto NEAR, we refund the predecessor that amount - if refund > 1 { - Promise::new(env::predecessor_account_id()).transfer(refund); - } -} - -impl Contract { - //add a token to the set of tokens an owner has - pub(crate) fn internal_add_token_to_owner( - &mut self, - account_id: &AccountId, - token_id: &TokenId, - ) { - //get the set of tokens for the given account - let mut tokens_set = self.tokens_per_owner.get(account_id).unwrap_or_else(|| { - //if the account doesn't have any tokens, we create a new unordered set - UnorderedSet::new( - StorageKey::TokenPerOwnerInner { - //we get a new unique prefix for the collection - account_id_hash: hash_account_id(&account_id), - } - .try_to_vec() - .unwrap(), - ) - }); - - //we insert the token ID into the set - tokens_set.insert(token_id); - - //we insert that set for the given account ID. - self.tokens_per_owner.insert(account_id, &tokens_set); - } - - //remove a token from an owner (internal method and can't be called directly via CLI). - pub(crate) fn internal_remove_token_from_owner( - &mut self, - account_id: &AccountId, - token_id: &TokenId, - ) { - //we get the set of tokens that the owner has - let mut tokens_set = self - .tokens_per_owner - .get(account_id) - //if there is no set of tokens for the owner, we panic with the following message: - .expect("Token should be owned by the sender"); - - //we remove the the token_id from the set of tokens - tokens_set.remove(token_id); - - //if the token set is now empty, we remove the owner from the tokens_per_owner collection - if tokens_set.is_empty() { - self.tokens_per_owner.remove(account_id); - } else { - //if the token set is not empty, we simply insert it back for the account ID. - self.tokens_per_owner.insert(account_id, &tokens_set); - } - } - - //transfers the NFT to the receiver_id (internal method and can't be called directly via CLI). - pub(crate) fn internal_transfer( - &mut self, - sender_id: &AccountId, - receiver_id: &AccountId, - token_id: &TokenId, - memo: Option, - ) -> Token { - //get the token object by passing in the token_id - let token = self.tokens_by_id.get(token_id).expect("No token"); - - //if the sender doesn't equal the owner, we panic - if sender_id != &token.owner_id { - env::panic_str("Unauthorized"); - } - //we make sure that the sender isn't sending the token to themselves - assert_ne!( - &token.owner_id, receiver_id, - "The token owner and the receiver should be different" - ); - - //we remove the token from it's current owner's set - self.internal_remove_token_from_owner(&token.owner_id, token_id); - //we then add the token to the receiver_id's set - self.internal_add_token_to_owner(receiver_id, token_id); - - //we create a new token struct - let new_token = Token { - owner_id: receiver_id.clone(), - }; - //insert that new token into the tokens_by_id, replacing the old entry - self.tokens_by_id.insert(token_id, &new_token); - - //if there was some memo attached, we log it. - if let Some(memo) = memo { - env::log_str(&format!("Memo: {}", memo).to_string()); - } - - //return the previous token object that was transferred. - token - } -} \ No newline at end of file From 237983c1d7de44a64fc7cd68591d7210cafb4e4c Mon Sep 17 00:00:00 2001 From: garikbesson Date: Fri, 26 Apr 2024 12:11:28 +0200 Subject: [PATCH 22/28] added option parameter memo to internal_transfer (basic contract) --- nft-contract-basic/src/internal.rs | 6 ++++++ nft-contract-basic/src/nft_core.rs | 2 ++ 2 files changed, 8 insertions(+) diff --git a/nft-contract-basic/src/internal.rs b/nft-contract-basic/src/internal.rs index c8fd58c..f2bb2da 100644 --- a/nft-contract-basic/src/internal.rs +++ b/nft-contract-basic/src/internal.rs @@ -99,6 +99,7 @@ impl Contract { sender_id: &AccountId, receiver_id: &AccountId, token_id: &TokenId, + memo: Option, ) -> Token { //get the token object by passing in the token_id let token = self.tokens_by_id.get(token_id).expect("No token"); @@ -121,6 +122,11 @@ impl Contract { //insert that new token into the tokens_by_id, replacing the old entry self.tokens_by_id.insert(token_id, &new_token); + //if there was some memo attached, we log it. + if let Some(memo) = memo.as_ref() { + env::log_str(&format!("Memo: {}", memo).to_string()); + } + //return the previous token object that was transferred. token } diff --git a/nft-contract-basic/src/nft_core.rs b/nft-contract-basic/src/nft_core.rs index 6c1531b..1c91a14 100644 --- a/nft-contract-basic/src/nft_core.rs +++ b/nft-contract-basic/src/nft_core.rs @@ -75,6 +75,7 @@ impl NonFungibleTokenCore for Contract { &sender_id, &receiver_id, &token_id, + memo ); } @@ -98,6 +99,7 @@ impl NonFungibleTokenCore for Contract { &sender_id, &receiver_id, &token_id, + memo.clone(), ); // Initiating receiver's call and the callback From 01c73d06d80e88ae6324c5edc537c62845be85bf Mon Sep 17 00:00:00 2001 From: gagdiez Date: Fri, 26 Apr 2024 16:31:53 +0200 Subject: [PATCH 23/28] improved listing logic --- .github/workflows/tests.yml | 39 +- integration-tests/{rs => }/Cargo.toml | 1 - .../{rs => }/rust-toolchain.toml | 0 integration-tests/{rs => }/src/helpers.rs | 4 +- integration-tests/{rs => }/src/tests.rs | 4 +- integration-tests/ts/ava.config.cjs | 9 - integration-tests/ts/package.json | 21 -- integration-tests/ts/src/main.ava.ts | 341 ------------------ integration-tests/ts/src/utils.ts | 130 ------- market-contract/src/lib.rs | 33 +- market-contract/src/sale.rs | 51 +-- package.json | 17 - 12 files changed, 51 insertions(+), 599 deletions(-) rename integration-tests/{rs => }/Cargo.toml (99%) rename integration-tests/{rs => }/rust-toolchain.toml (100%) rename integration-tests/{rs => }/src/helpers.rs (96%) rename integration-tests/{rs => }/src/tests.rs (98%) delete mode 100644 integration-tests/ts/ava.config.cjs delete mode 100644 integration-tests/ts/package.json delete mode 100644 integration-tests/ts/src/main.ava.ts delete mode 100644 integration-tests/ts/src/utils.ts delete mode 100644 package.json diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b707dd9..c921c4c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,38 +15,19 @@ jobs: steps: - name: Checkout branch uses: actions/checkout@v2 - - name: Install Node - uses: actions/setup-node@v2 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable target: wasm32-unknown-unknown - - name: Build smart contract - run: npm run build + - name: Run integration test + run: cd integration-tests && cargo run --example integration-tests - name: Run unit tests - run: npm run test:unit - integration-tests: - name: Integration tests - strategy: - matrix: - platform: [ubuntu-latest] # , windows-latest, macos-latest] - runs-on: ${{ matrix.platform }} - env: - RUST_BACKTRACE: 1 - steps: - - name: Checkout branch - uses: actions/checkout@v2 - - name: Install Node - uses: actions/setup-node@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - target: wasm32-unknown-unknown - - name: Build smart contract - run: npm run build - - name: Run Rust integration tests - run: npm run test:integration:rs - - name: Run TS integration tests - run: npm run test:integration:ts + run: cd market-contract && cargo test + run: cd ../nft-contract && cargo test + run: cd ../nft-contract-approval && cargo test + run: cd ../nft-contract-basic && cargo test + run: cd ../nft-contract-events && cargo test + run: cd ../nft-contract-royalty && cargo test + run: cd ../nft-contract-skeleton && cargo test + run: cd ../nft-series && cargo test \ No newline at end of file diff --git a/integration-tests/rs/Cargo.toml b/integration-tests/Cargo.toml similarity index 99% rename from integration-tests/rs/Cargo.toml rename to integration-tests/Cargo.toml index 4fdd7de..a9659d5 100644 --- a/integration-tests/rs/Cargo.toml +++ b/integration-tests/Cargo.toml @@ -10,7 +10,6 @@ near-workspaces = { version = "0.10.0", features = ["unstable"] } tokio = { version = "1.12.0", features = ["full"] } serde_json = "1" - [[example]] name = "integration-tests" path = "src/tests.rs" \ No newline at end of file diff --git a/integration-tests/rs/rust-toolchain.toml b/integration-tests/rust-toolchain.toml similarity index 100% rename from integration-tests/rs/rust-toolchain.toml rename to integration-tests/rust-toolchain.toml diff --git a/integration-tests/rs/src/helpers.rs b/integration-tests/src/helpers.rs similarity index 96% rename from integration-tests/rs/src/helpers.rs rename to integration-tests/src/helpers.rs index bd3a329..9be15c4 100644 --- a/integration-tests/rs/src/helpers.rs +++ b/integration-tests/src/helpers.rs @@ -1,5 +1,5 @@ use serde_json::json; -use near_workspaces::{types::{NearToken, AccountDetails}, Account, Contract, result::ExecutionFinalResult}; +use near_workspaces::{types::{NearToken, AccountDetails}, Account, Contract}; pub const DEFAULT_DEPOSIT: u128 = 10000000000000000000000 as u128; pub const ONE_YOCTO_NEAR: NearToken = NearToken::from_yoctonear(1); @@ -77,7 +77,7 @@ pub async fn place_nft_for_sale( "nft_contract_id": nft_contract.id(), "token_id": token_id, "approval_id": approval_id, - "msg": format!(r#"{{ "sale_conditions" : "{}" }}"#, NearToken::as_yoctonear(price)), + "sale_conditions": NearToken::as_yoctonear(price).to_string(), }); let _ = user.call(market_contract.id(), "list_nft_for_sale") .args_json(request_payload) diff --git a/integration-tests/rs/src/tests.rs b/integration-tests/src/tests.rs similarity index 98% rename from integration-tests/rs/src/tests.rs rename to integration-tests/src/tests.rs index 049c7d8..3021568 100644 --- a/integration-tests/rs/src/tests.rs +++ b/integration-tests/src/tests.rs @@ -9,10 +9,10 @@ async fn main() -> Result<(), Box> { let worker = near_workspaces::sandbox().await?; // deploy contracts - let nft_wasm = near_workspaces::compile_project("../../nft-contract-royalty/.").await?; + let nft_wasm = near_workspaces::compile_project("../nft-contract-royalty/.").await?; let nft_contract = worker.dev_deploy(&nft_wasm).await?; - let market_wasm = near_workspaces::compile_project("../../market-contract/.").await?; + let market_wasm = near_workspaces::compile_project("../market-contract/.").await?; let market_contract = worker.dev_deploy(&market_wasm).await?; // create accounts diff --git a/integration-tests/ts/ava.config.cjs b/integration-tests/ts/ava.config.cjs deleted file mode 100644 index 2d36032..0000000 --- a/integration-tests/ts/ava.config.cjs +++ /dev/null @@ -1,9 +0,0 @@ -require('util').inspect.defaultOptions.depth = 5; // Increase AVA's printing depth - -module.exports = { - timeout: '300000', - files: ["./src/main.ava.ts"], - failWithoutAssertions: false, - extensions: ["ts"], - require: ['ts-node/register', 'near-workspaces'], -}; \ No newline at end of file diff --git a/integration-tests/ts/package.json b/integration-tests/ts/package.json deleted file mode 100644 index 80762d6..0000000 --- a/integration-tests/ts/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "nft-tutorial-integration-tests-ts", - "version": "0.1.0", - "license": "(MIT AND Apache-2.0)", - "scripts": { - "test": "ava" - }, - "devDependencies": { - "@ava/typescript": "^4.1.0", - "ava": "^6.1.2", - "near-workspaces": "^3.5.0", - "ts-morph": "^21.0.1", - "ts-node": "^10.9.2", - "tsimp": "^2.0.11", - "typescript": "^5.3.3" - }, - "dependencies": { - "near-cli": "^4.0.8", - "near-sdk-js": "1.0.0" - } -} diff --git a/integration-tests/ts/src/main.ava.ts b/integration-tests/ts/src/main.ava.ts deleted file mode 100644 index 25ab4a8..0000000 --- a/integration-tests/ts/src/main.ava.ts +++ /dev/null @@ -1,341 +0,0 @@ -import { setDefaultResultOrder } from 'dns'; setDefaultResultOrder('ipv4first'); // temp fix for node > v17 - -import anyTest, { TestFn } from "ava"; -import { NEAR, NearAccount, Worker, BN } from "near-workspaces"; -import path from "path"; -import { - approveNFT, defaultCallOptions, DEFAULT_GAS, mintNFT, payForStorage, - approveNFTForSale, placeNFTForSale, purchaseListedNFT, transferNFT -} from "./utils"; - -const test = anyTest as TestFn<{ - worker: Worker; - accounts: Record; -}>; - -test.beforeEach(async (t) => { - // Init the worker and start a Sandbox server - const worker = await Worker.init(); - - // Deploy contract - const root = worker.rootAccount; - - const nftContractLocation = path.join(__dirname, "../../../nft-contract-royalty/target/wasm32-unknown-unknown/release/nft_contract_skeleton.wasm"); - const nft_contract = await root.devDeploy( - nftContractLocation, - { - method: "new_default_meta", - args: { owner_id: root }, - initialBalance: NEAR.parse("100 N").toJSON() - } - ); - - const marketContractLocation = path.join(__dirname, "../../../market-contract/target/wasm32-unknown-unknown/release/nft_market_contract.wasm"); - const market_contract = await root.devDeploy( - marketContractLocation, - { - method: "new", - args: { owner_id: root }, - initialBalance: NEAR.parse("100 N").toJSON() - } - ); - - const alice = await root.createSubAccount("alice", { - initialBalance: NEAR.parse("100 N").toJSON(), - }); - - const bob = await root.createSubAccount("bob", { - initialBalance: NEAR.parse("100 N").toJSON(), - }); - - const charlie = await root.createSubAccount("charlie", { - initialBalance: NEAR.parse("100 N").toJSON(), - }); - - t.context.worker = worker; - t.context.accounts = { root, nft_contract, market_contract, alice, bob, charlie }; -}); - -test.afterEach.always(async (t) => { - // Stop Sandbox server - await t.context.worker.tearDown().catch((error) => { - console.log('Failed to stop the Sandbox:', error); - }); -}); - -test("nft contract: nft metadata view", async (t) => { - const { root, nft_contract } = t.context.accounts; - const expected = { - base_uri: null, - icon: null, - name: "NFT Tutorial Contract", - reference: null, - reference_hash: null, - spec: "nft-1.0.0", - symbol: "GOTEAM", - }; - t.deepEqual( - await nft_contract.view("nft_metadata", { account_id: root }), - expected - ); -}); - -test("nft contract: nft mint call", async (t) => { - const { alice, nft_contract } = t.context.accounts; - const request_payload = { - token_id: "TEST123", - metadata: { - title: "LEEROYYYMMMJENKINSSS", - description: "Alright time's up, let's do this.", - media: - "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse3.mm.bing.net%2Fth%3Fid%3DOIP.Fhp4lHufCdTzTeGCAblOdgHaF7%26pid%3DApi&f=1", - }, - receiver_id: alice, - }; - await alice.call( - nft_contract, - "nft_mint", - request_payload, - defaultCallOptions() - ); - - const tokens = await nft_contract.view("nft_tokens"); - const expected = [ - { - approved_account_ids: {}, - metadata: { - copies: null, - description: "Alright time's up, let's do this.", - expires_at: null, - extra: null, - issued_at: null, - media: - "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse3.mm.bing.net%2Fth%3Fid%3DOIP.Fhp4lHufCdTzTeGCAblOdgHaF7%26pid%3DApi&f=1", - media_hash: null, - reference: null, - reference_hash: null, - starts_at: null, - title: "LEEROYYYMMMJENKINSSS", - updated_at: null, - }, - owner_id: alice.accountId, - royalty: {}, - token_id: "TEST123", - }, - ]; - t.deepEqual(tokens, expected, "Expected to find one minted NFT"); -}); - -test("nft contract: nft approve call", async (t) => { - const { alice, nft_contract, market_contract } = t.context.accounts; - await mintNFT(alice, nft_contract); - await approveNFT(market_contract, alice, nft_contract); - - // test if approved - const view_payload = { - token_id: "TEST123", - approved_account_id: market_contract, - }; - const approved = await nft_contract.view("nft_is_approved", view_payload); - t.true(approved, "Failed to approve NFT"); -}); - -test("cross contract: sell NFT listed on marketplace", async (t) => { - const { alice, nft_contract, market_contract, bob } = t.context.accounts; - await mintNFT(alice, nft_contract); - await payForStorage(alice, market_contract); - - const sale_price = "300000000000000000000000"; // sale price string in yoctoNEAR is 0.3 NEAR - await approveNFTForSale(market_contract, alice, nft_contract, sale_price); - await placeNFTForSale(nft_contract, 0, market_contract, alice, sale_price); - - const alice_balance_before = await alice.availableBalance(); - const bob_balance_before = await bob.availableBalance(); - await purchaseListedNFT(nft_contract, bob, market_contract, sale_price); - const alice_balance_after = await alice.availableBalance(); - const bob_balance_after = await bob.availableBalance(); - - // assert alice balance increased by sale price - const test_precision_dp_near = 1; - const slice_val = test_precision_dp_near - 24; - t.is( - alice_balance_after.toString().slice(0, slice_val), - alice_balance_before.add(NEAR.from(sale_price)).toString().slice(0, slice_val), - "Alice balance should increase by sale price" - ); - // bob balance should decrease by sale price - t.is( - bob_balance_after.toString().slice(0, slice_val), - bob_balance_before.sub(NEAR.from(sale_price)).toString().slice(0, slice_val), - "Bob balance should decrease by sale price" - ); - - // NFT has new owner - const view_payload = { - token_id: "TEST123", - }; - const token_info: any = await nft_contract.view("nft_token", view_payload); - t.is(token_info.owner_id, bob.accountId, "NFT should have been sold"); - // nothing left for sale on market - const sale_supply = await market_contract.view("get_supply_sales"); - t.is(sale_supply, 0, "Expected no sales to be left on market"); -}); - -test("cross contract: transfer NFT when listed on marketplace", async (t) => { - const { alice, nft_contract, market_contract, bob, charlie } = t.context.accounts; - await mintNFT(alice, nft_contract); - await payForStorage(alice, market_contract); - - const sale_price = "300000000000000000000000"; // sale price string in yoctoNEAR is 0.3 NEAR - await approveNFTForSale(market_contract, alice, nft_contract, sale_price); - await placeNFTForSale(nft_contract, 0, market_contract, alice, sale_price); - - await transferNFT(bob, market_contract, nft_contract); - - // purchase NFT - const offer_payload = { - nft_contract_id: nft_contract, - token_id: "TEST123", - }; - const result = await charlie.callRaw( - market_contract, - "offer", - offer_payload, - defaultCallOptions( - DEFAULT_GAS, - sale_price // Attached deposit must be greater than or equal to the current price - ) - ); - - // assert expectations - // NFT has same owner - const view_payload = { - token_id: "TEST123", - }; - const token_info: any = await nft_contract.view("nft_token", view_payload); - t.is( - token_info.owner_id, - bob.accountId, // NFT was transferred to bob - "NFT should have bob as owner" - ); - // Unauthorized error should be found - t.regex(result.receiptFailureMessages.join("\n"), /Unauthorized+/); -}); - -test("cross contract: approval revoke", async (t) => { - const { alice, nft_contract, market_contract, bob } = t.context.accounts; - await mintNFT(alice, nft_contract); - await payForStorage(alice, market_contract); - await approveNFTForSale( - market_contract, - alice, - nft_contract, - "300000000000000000000000" - ); - - // revoke approval - const revoke_payload = { - token_id: "TEST123", - account_id: market_contract, // revoke market contract authorization - }; - await alice.call( - nft_contract, - "nft_revoke", - revoke_payload, - defaultCallOptions(DEFAULT_GAS, "1") // Requires attached deposit of exactly 1 yoctoNEAR - ); - - // transfer NFT - const transfer_payload = { - receiver_id: bob, - token_id: "TEST123", - approval_id: 1, - }; - const result = await market_contract.callRaw( - nft_contract, - "nft_transfer", - transfer_payload, - defaultCallOptions(DEFAULT_GAS, "1") - ); - - // assert expectations - // Unauthorized error should be found - t.regex(result.receiptFailureMessages.join("\n"), /Unauthorized+/); -}); - -test("cross contract: reselling and royalties", async (t) => { - const { alice, nft_contract, market_contract, bob, charlie } = t.context.accounts; - const royalties_string = `{"${alice.accountId}":2000}`; - const royalties = JSON.parse(royalties_string); - await mintNFT(alice, nft_contract, royalties); - await payForStorage(alice, market_contract); - const ask_price = "300000000000000000000000"; - await approveNFTForSale(market_contract, alice, nft_contract, ask_price); - await placeNFTForSale(nft_contract, 0, market_contract, alice, ask_price); - - const bid_price = ask_price + "0"; - - const alice_balance_before = await alice.availableBalance(); - const bob_balance_before = await bob.availableBalance(); - await purchaseListedNFT(nft_contract, bob, market_contract, bid_price); - const alice_balance_after = await alice.availableBalance(); - const bob_balance_after = await bob.availableBalance(); - - const test_precision_dp_near = 1; - const slice_val = test_precision_dp_near - 24; - t.is( - alice_balance_after.toString().slice(0, slice_val), - alice_balance_before.add(NEAR.from(bid_price)).toString().slice(0, slice_val), - "Alice balance should increase by sale price" - ); - t.is( - bob_balance_after.toString().slice(0, slice_val), - bob_balance_before.sub(NEAR.from(bid_price)).toString().slice(0, slice_val), - "Bob balance should decrease by sale price" - ); - - // bob relists NFT for higher price - await payForStorage(bob, market_contract); - const resell_ask_price = bid_price + "0"; - await approveNFTForSale(market_contract, bob, nft_contract, resell_ask_price); - await placeNFTForSale(nft_contract, 1, market_contract, bob, resell_ask_price); - - - // bob updates price to lower ask - const lowered_resell_ask_price = "600000000000000000000000"; - const update_price_payload = { - nft_contract_id: nft_contract, - token_id: "TEST123", - price: lowered_resell_ask_price, - }; - await bob.call( - market_contract, - "update_price", - update_price_payload, - defaultCallOptions(DEFAULT_GAS, "1") - ); - - const alice_balance_before_2 = await alice.availableBalance(); - const bob_balance_before_2 = await bob.availableBalance(); - const charlie_balance_before_2 = await charlie.availableBalance(); - await purchaseListedNFT(nft_contract, charlie, market_contract, resell_ask_price); - const alice_balance_after_2 = await alice.availableBalance(); - const bob_balance_after_2 = await bob.availableBalance(); - const charlie_balance_after_2 = await charlie.availableBalance(); - - t.is( - alice_balance_after_2.sub(alice_balance_before_2).toHuman(), - "6 N", - "Alice balance should increase by royalty fee of 20% of sale price" - ) - t.is( - bob_balance_after_2.sub(bob_balance_before_2).toHuman().slice(0, 2), - "24", - "Bob balance should decrease by sale price minus royalty fee of 20% of sale price" - ) - t.is( - charlie_balance_before_2.sub(charlie_balance_after_2).toHuman().slice(0, 2), - "30", - "Charlie balance should decrease by sale price" - ) -}); diff --git a/integration-tests/ts/src/utils.ts b/integration-tests/ts/src/utils.ts deleted file mode 100644 index cce11f2..0000000 --- a/integration-tests/ts/src/utils.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { BN, NearAccount } from "near-workspaces"; - -export const DEFAULT_GAS: string = "300000000000000"; -export const DEFAULT_DEPOSIT: string = "9050000000000000000000"; - - -export async function purchaseListedNFT( - nft_contract: NearAccount, - bidder_account: NearAccount, - market_contract: NearAccount, - bid_price: string -) { - const offer_payload = { - nft_contract_id: nft_contract, - token_id: "TEST123", - }; - await bidder_account.callRaw( - market_contract, - "offer", - offer_payload, - defaultCallOptions(DEFAULT_GAS, bid_price) - ); -} - -export async function approveNFTForSale( - market_contract: NearAccount, - owner: NearAccount, - nft_contract: NearAccount, - ask_price: string // sale price string in yoctoNEAR -) { - await approveNFT( - market_contract, - owner, - nft_contract, - '{"sale_conditions": ' + `"${ask_price}"` + " }" // msg string trigger XCC - ); -} - -export async function placeNFTForSale( - nft_contract_id: NearAccount, - approval_id: number, - market_contract: NearAccount, - owner: NearAccount, - price: string // sale price string in yoctoNEAR -) { - const payload = { - nft_contract_id, - token_id: "TEST123", - approval_id, - msg: '{"sale_conditions": ' + `"${price}"` + " }" // msg string trigger XCC - }; - await owner.call(market_contract, "list_nft_for_sale", payload, defaultCallOptions()); -} - -export function defaultCallOptions( - gas: string = DEFAULT_GAS, - deposit: string = DEFAULT_DEPOSIT -) { - return { - gas: gas, - attachedDeposit: deposit, - }; -} -export async function approveNFT( - account_to_approve: NearAccount, - owner: NearAccount, - nft_contract: NearAccount, - message?: string -) { - const approve_payload = { - token_id: "TEST123", - account_id: account_to_approve, - msg: message, - }; - await owner.call( - nft_contract, - "nft_approve", - approve_payload, - defaultCallOptions() - ); -} - -export async function mintNFT( - user: NearAccount, - nft_contract: NearAccount, - royalties?: object -) { - const mint_payload = { - token_id: "TEST123", - metadata: { - title: "LEEROYYYMMMJENKINSSS", - description: "Alright time's up, let's do this.", - media: - "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse3.mm.bing.net%2Fth%3Fid%3DOIP.Fhp4lHufCdTzTeGCAblOdgHaF7%26pid%3DApi&f=1", - }, - receiver_id: user, - perpetual_royalties: royalties, - }; - await user.call(nft_contract, "nft_mint", mint_payload, defaultCallOptions()); -} - -export async function payForStorage( - alice: NearAccount, - market_contract: NearAccount -) { - await alice.call( - market_contract, - "storage_deposit", - {}, - defaultCallOptions(DEFAULT_GAS, "10000000000000000000000") // Requires minimum deposit of 10000000000000000000000 - ); -} - -export async function transferNFT( - receiver: NearAccount, - sender: NearAccount, - nft_contract: NearAccount -) { - const transfer_payload = { - receiver_id: receiver, - token_id: "TEST123", - approval_id: 0, // first and only approval done in line 224 - }; - await sender.call( - nft_contract, - "nft_transfer", - transfer_payload, - defaultCallOptions(DEFAULT_GAS, "1") - ); -} diff --git a/market-contract/src/lib.rs b/market-contract/src/lib.rs index f7b5b73..eae6810 100644 --- a/market-contract/src/lib.rs +++ b/market-contract/src/lib.rs @@ -2,8 +2,8 @@ use near_sdk::borsh::{BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LookupMap, UnorderedMap, UnorderedSet}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ - assert_one_yocto, env, ext_contract, near_bindgen, AccountId, NearToken, Gas, PanicOnDefault, - Promise, CryptoHash, BorshStorageKey, + assert_one_yocto, env, ext_contract, near_bindgen, AccountId, BorshStorageKey, CryptoHash, Gas, + NearToken, PanicOnDefault, Promise, }; use std::collections::HashMap; @@ -28,18 +28,18 @@ const ONE_YOCTONEAR: NearToken = NearToken::from_yoctonear(1); //every sale will have a unique ID which is `CONTRACT + DELIMITER + TOKEN_ID` static DELIMETER: &str = "."; -//Creating custom types to use within the contract. This makes things more readable. +//Creating custom types to use within the contract. This makes things more readable. pub type SalePriceInYoctoNear = NearToken; pub type TokenId = String; pub type FungibleTokenId = AccountId; pub type ContractAndTokenId = String; + //defines the payout type we'll be parsing from the NFT contract as a part of the royalty standard. #[derive(Serialize, Deserialize)] #[serde(crate = "near_sdk::serde")] pub struct Payout { pub payout: HashMap, -} - +} //main contract struct to store all the information #[near_bindgen] @@ -48,14 +48,14 @@ pub struct Payout { pub struct Contract { //keep track of the owner of the contract pub owner_id: AccountId, - + /* - to keep track of the sales, we map the ContractAndTokenId to a Sale. + to keep track of the sales, we map the ContractAndTokenId to a Sale. the ContractAndTokenId is the unique identifier for every sale. It is made up of the `contract ID + DELIMITER + token ID` */ pub sales: UnorderedMap, - + //keep track of all the Sale IDs for every account ID pub by_owner_id: LookupMap>, @@ -91,7 +91,7 @@ impl Contract { #[init] pub fn new(owner_id: AccountId) -> Self { let this = Self { - //set the owner_id field equal to the passed in owner_id. + //set the owner_id field equal to the passed in owner_id. owner_id, //Storage keys are simply the prefixes used for the collections. This helps avoid data collision @@ -110,7 +110,7 @@ impl Contract { #[payable] pub fn storage_deposit(&mut self, account_id: Option) { //get the account ID to pay for storage for - let storage_account_id = account_id + let storage_account_id = account_id //convert the valid account ID into an account ID .map(|a| a.into()) //if we didn't specify an account ID, we simply use the caller of the function @@ -127,7 +127,10 @@ impl Contract { ); //get the balance of the account (if the account isn't in the map we default to a balance of 0) - let mut balance: NearToken = self.storage_deposits.get(&storage_account_id).unwrap_or(ZERO_NEAR); + let mut balance: NearToken = self + .storage_deposits + .get(&storage_account_id) + .unwrap_or(ZERO_NEAR); //add the deposit to their balance balance = balance.saturating_add(deposit); //insert the balance back into the map for that account ID @@ -136,21 +139,21 @@ impl Contract { //Allows users to withdraw any excess storage that they're not using. Say Bob pays 0.01N for 1 sale //Alice then buys Bob's token. This means bob has paid 0.01N for a sale that's no longer on the marketplace - //Bob could then withdraw this 0.01N back into his account. + //Bob could then withdraw this 0.01N back into his account. #[payable] pub fn storage_withdraw(&mut self) { //make sure the user attaches exactly 1 yoctoNEAR for security purposes. - //this will redirect them to the NEAR wallet (or requires a full access key). + //this will redirect them to the NEAR wallet (or requires a full access key). assert_one_yocto(); //the account to withdraw storage to is always the function caller let owner_id = env::predecessor_account_id(); //get the amount that the user has by removing them from the map. If they're not in the map, default to 0 let mut amount = self.storage_deposits.remove(&owner_id).unwrap_or(ZERO_NEAR); - + //how many sales is that user taking up currently. This returns a set let sales = self.by_owner_id.get(&owner_id); - //get the length of that set. + //get the length of that set. let len = sales.map(|s| s.len()).unwrap_or_default(); //how much NEAR is being used up for all the current sales on the account let diff = storage_per_sale().saturating_mul(u128::from(len)); diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index d744f95..8da76fd 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -27,13 +27,6 @@ pub struct JsonToken { pub owner_id: AccountId, } -//struct for keeping track of the sale conditions for a Sale -#[derive(Serialize, Deserialize)] -#[serde(crate = "near_sdk::serde")] -pub struct SaleArgs { - pub sale_conditions: SalePriceInYoctoNear, -} - #[near_bindgen] impl Contract { // lists a nft for sale on the market @@ -43,10 +36,26 @@ impl Contract { nft_contract_id: AccountId, token_id: TokenId, approval_id: u64, - msg: String, + sale_conditions: SalePriceInYoctoNear, ) { let owner_id = env::predecessor_account_id(); + //we need to enforce that the user has enough storage for 1 EXTRA sale. + + //get the storage for a sale + let storage_amount = self.storage_minimum_balance(); + //get the total storage paid by the owner + let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(ZERO_NEAR); + //get the storage required which is simply the storage for the number of sales they have + 1 + let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()) + 1).into()); + + //make sure that the total paid is >= the required storage + assert!( + owner_paid_storage.ge(&signer_storage_required), + "Insufficient storage paid: {}, for {} sales at {} rate of per sale", + owner_paid_storage, signer_storage_required.saturating_div(storage_per_sale().as_yoctonear()), storage_per_sale() + ); + let nft_token_promise = Promise::new(nft_contract_id.clone()).function_call( "nft_token".to_owned(), json!({ "token_id": token_id }).to_string().into_bytes(), @@ -61,7 +70,7 @@ impl Contract { ); nft_token_promise .and(nft_is_approved_promise) - .then(Self::ext(env::current_account_id()).process_listing(owner_id.clone(), nft_contract_id, token_id, approval_id, msg)); + .then(Self::ext(env::current_account_id()).process_listing(owner_id.clone(), nft_contract_id, token_id, approval_id, sale_conditions)); } //removes a sale from the market. @@ -259,7 +268,7 @@ impl Contract { nft_contract_id: AccountId, token_id: TokenId, approval_id: u64, - msg: String, + sale_conditions: SalePriceInYoctoNear, #[callback_result] nft_token_result: Result, #[callback_result] nft_is_approved_result: Result, ) { @@ -282,28 +291,6 @@ impl Contract { log!("nft_is_approved call failed"); } - //we need to enforce that the user has enough storage for 1 EXTRA sale. - - //get the storage for a sale - let storage_amount = self.storage_minimum_balance(); - //get the total storage paid by the owner - let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(ZERO_NEAR); - //get the storage required which is simply the storage for the number of sales they have + 1 - let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()) + 1).into()); - - //make sure that the total paid is >= the required storage - assert!( - owner_paid_storage.ge(&signer_storage_required), - "Insufficient storage paid: {}, for {} sales at {} rate of per sale", - owner_paid_storage, signer_storage_required.saturating_div(storage_per_sale().as_yoctonear()), storage_per_sale() - ); - - //if all these checks pass we can create the sale conditions object. - let SaleArgs { sale_conditions } = - //the sale conditions come from the msg field. The market assumes that the user passed - //in a proper msg. If they didn't, it panics. - near_sdk::serde_json::from_str(&msg).expect("Not valid SaleArgs"); - //create the unique sale ID which is the contract + DELIMITER + token ID let contract_and_token_id = format!("{}{}{}", nft_contract_id, DELIMETER, token_id); diff --git a/package.json b/package.json deleted file mode 100644 index 15c2b35..0000000 --- a/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "nft-tutorial", - "version": "1.0.0", - "description": "Zero to Hero NFT Tutorial", - "author": "Ben Kurrek", - "license": "ISC", - "scripts": { - "build": "cd nft-contract && bash build.sh && cd .. && ls && cd market-contract && bash build.sh && cd .. && cd nft-series && bash build.sh && cd ..", - "test": "npm run test:unit && npm run test:integration", - "test:unit": "npm run test:unit:nft && npm run test:unit:market", - "test:unit:nft": "cd nft-contract && cargo test -- --nocapture --color=always && cd ..", - "test:unit:market": "cd market-contract && cargo test -- --nocapture --color=always && cd ..", - "test:integration": "npm run test:integration:ts && npm run test:integration:rs", - "test:integration:ts": "cd integration-tests/ts && npm i && npm run test", - "test:integration:rs": "cd integration-tests/rs && cargo run --example integration-tests" - } -} From 5dc216109692a569b2f3714002a8b99002024169 Mon Sep 17 00:00:00 2001 From: gagdiez Date: Mon, 29 Apr 2024 14:00:19 +0200 Subject: [PATCH 24/28] format --- nft-contract-royalty/src/royalty.rs | 57 +++++++++++++++++------------ 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/nft-contract-royalty/src/royalty.rs b/nft-contract-royalty/src/royalty.rs index a80d6d4..2894319 100644 --- a/nft-contract-royalty/src/royalty.rs +++ b/nft-contract-royalty/src/royalty.rs @@ -3,8 +3,8 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; - - //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( &mut self, receiver_id: AccountId, @@ -29,34 +29,42 @@ impl NonFungibleTokenCore for Contract { let mut total_perpetual = 0; //keep track of the payout object to send back let mut payout_object = Payout { - payout: HashMap::new() + payout: HashMap::new(), }; //get the royalty object from token let royalty = token.royalty; //make sure we're not paying out to too many people (GAS limits this) - assert!(royalty.len() as u32 <= max_len_payout, "Market cannot payout to that many receivers"); + assert!( + royalty.len() as u32 <= max_len_payout, + "Market cannot payout to that many receivers" + ); - //go through each key and value in the royalty object + //go through each key and value in the royalty object for (k, v) in royalty.iter() { //get the key let key = k.clone(); //only insert into the payout if the key isn't the token owner (we add their payout at the end) if key != owner_id { - payout_object.payout.insert(key, royalty_to_payout(*v as u128, balance)); + payout_object + .payout + .insert(key, royalty_to_payout(*v as u128, balance)); total_perpetual += *v; } } // payout to previous owner who gets 100% - total perpetual royalties - payout_object.payout.insert(owner_id, royalty_to_payout((10000 - total_perpetual).into(), balance)); + payout_object.payout.insert( + owner_id, + royalty_to_payout((10000 - total_perpetual).into(), balance), + ); //return the payout object payout_object } - //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. + //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. #[payable] fn nft_transfer_payout( &mut self, @@ -66,19 +74,14 @@ impl NonFungibleTokenCore for Contract { memo: Option, balance: NearToken, max_len_payout: u32, - ) -> Payout { + ) -> Payout { //assert that the user attached 1 yocto NEAR for security reasons assert_one_yocto(); //get the sender ID let sender_id = env::predecessor_account_id(); //transfer the token to the passed in receiver and get the previous token object back - let previous_token = self.internal_transfer( - &sender_id, - &receiver_id, - &token_id, - Some(approval_id), - memo, - ); + let previous_token = + self.internal_transfer(&sender_id, &receiver_id, &token_id, Some(approval_id), memo); //refund the previous token owner for the storage used up by the previous approved account IDs refund_approved_account_ids( @@ -90,15 +93,18 @@ impl NonFungibleTokenCore for Contract { let owner_id = previous_token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; - //keep track of the payout object to send back + //keep track of the payout object to send back let mut payout_object = Payout { - payout: HashMap::new() + payout: HashMap::new(), }; //get the royalty object from token - let royalty = previous_token.royalty; + let royalty = previous_token.royalty; //make sure we're not paying out to too many people (GAS limits this) - assert!(royalty.len() as u32 <= max_len_payout, "Market cannot payout to that many receivers"); + assert!( + royalty.len() as u32 <= max_len_payout, + "Market cannot payout to that many receivers" + ); //go through each key and value in the royalty object for (k, v) in royalty.iter() { @@ -107,15 +113,20 @@ impl NonFungibleTokenCore for Contract { //only insert into the payout if the key isn't the token owner (we add their payout at the end) if key != owner_id { - payout_object.payout.insert(key, royalty_to_payout(*v as u128, balance)); + payout_object + .payout + .insert(key, royalty_to_payout(*v as u128, balance)); total_perpetual += *v; } } // payout to previous owner who gets 100% - total perpetual royalties - payout_object.payout.insert(owner_id, royalty_to_payout((10000 - total_perpetual).into(), balance)); + payout_object.payout.insert( + owner_id, + royalty_to_payout((10000 - total_perpetual).into(), balance), + ); //return the payout object payout_object } -} \ No newline at end of file +} From 04e517c8b562f638dcc9c2bfb24a934b1b9c4bb7 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 29 Apr 2024 22:27:19 +0200 Subject: [PATCH 25/28] returned the use U128/U64 --- market-contract/src/external.rs | 2 +- market-contract/src/lib.rs | 5 +++-- market-contract/src/sale.rs | 18 +++++++++--------- market-contract/src/sale_views.rs | 16 ++++++++-------- market-contract/src/tests.rs | 5 +++-- nft-contract-approval/src/enumeration.rs | 10 +++++----- nft-contract-approval/src/internal.rs | 2 +- nft-contract-approval/src/lib.rs | 2 +- nft-contract-basic/src/enumeration.rs | 10 +++++----- nft-contract-basic/src/lib.rs | 2 +- nft-contract-events/src/enumeration.rs | 10 +++++----- nft-contract-events/src/lib.rs | 2 +- nft-contract-royalty/src/enumeration.rs | 10 +++++----- nft-contract-royalty/src/internal.rs | 2 +- nft-contract-royalty/src/lib.rs | 2 +- nft-contract-skeleton/src/enumeration.rs | 4 ++-- nft-contract-skeleton/src/lib.rs | 2 +- nft-series/src/enumeration.rs | 20 ++++++++++---------- nft-series/src/internal.rs | 2 +- nft-series/src/lib.rs | 2 +- 20 files changed, 65 insertions(+), 63 deletions(-) diff --git a/market-contract/src/external.rs b/market-contract/src/external.rs index b921c19..7700642 100644 --- a/market-contract/src/external.rs +++ b/market-contract/src/external.rs @@ -16,7 +16,7 @@ trait ExtContract { the price that the token was purchased for. This will be used in conjunction with the royalty percentages for the token in order to determine how much money should go to which account. */ - balance: NearToken, + balance: U128, //the maximum amount of accounts the market can payout at once (this is limited by GAS) max_len_payout: u32, ); diff --git a/market-contract/src/lib.rs b/market-contract/src/lib.rs index eae6810..3a6904f 100644 --- a/market-contract/src/lib.rs +++ b/market-contract/src/lib.rs @@ -1,5 +1,6 @@ use near_sdk::borsh::{BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LookupMap, UnorderedMap, UnorderedSet}; +use near_sdk::json_types::{U128, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ assert_one_yocto, env, ext_contract, near_bindgen, AccountId, BorshStorageKey, CryptoHash, Gas, @@ -180,8 +181,8 @@ impl Contract { } //return how much storage an account has paid for - pub fn storage_balance_of(&self, account_id: AccountId) -> NearToken { - self.storage_deposits.get(&account_id).unwrap_or(ZERO_NEAR) + pub fn storage_balance_of(&self, account_id: AccountId) -> U128 { + U128(self.storage_deposits.get(&account_id).unwrap_or(ZERO_NEAR).as_yoctonear()) } } diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index 8da76fd..addba71 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -47,7 +47,7 @@ impl Contract { //get the total storage paid by the owner let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(ZERO_NEAR); //get the storage required which is simply the storage for the number of sales they have + 1 - let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()) + 1).into()); + let signer_storage_required = storage_amount.saturating_mul((self.get_supply_by_owner_id(owner_id.clone()).0 + 1).into()); //make sure that the total paid is >= the required storage assert!( @@ -145,7 +145,7 @@ impl Contract { self.process_purchase( contract_id, token_id, - deposit, + U128(deposit.as_yoctonear()), buyer_id, ); } @@ -157,7 +157,7 @@ impl Contract { &mut self, nft_contract_id: AccountId, token_id: String, - price: NearToken, + price: U128, buyer_id: AccountId, ) -> Promise { //get the sale object by removing the sale @@ -203,8 +203,8 @@ impl Contract { pub fn resolve_purchase( &mut self, buyer_id: AccountId, - price: NearToken, - ) -> NearToken { + price: U128, + ) -> U128 { // checking for payout information returned from the nft_transfer_payout method let payout_option = promise_result_as_success().and_then(|value| { //if we set the payout_option to None, that means something went wrong and we should refund the buyer @@ -221,17 +221,17 @@ impl Contract { //if the payout object is the correct length, we move forward } else { //we'll keep track of how much the nft contract wants us to payout. Starting at the full price payed by the buyer - let mut remainder = price; + let mut remainder = price.0; //loop through the payout and subtract the values from the remainder. for &value in payout_object.payout.values() { //checked sub checks for overflow or any errors and returns None if there are problems - remainder = remainder.checked_sub(value)?; + remainder = remainder.checked_sub(value.as_yoctonear())?; } //Check to see if the NFT contract sent back a faulty payout that requires us to pay more or too little. //The remainder will be 0 if the payout summed to the total price. The remainder will be 1 if the royalties //we something like 3333 + 3333 + 3333. - if remainder.is_zero() || remainder.eq(&ONE_YOCTONEAR) { + if remainder == 0 || remainder == 1 { //set the payout_option to be the payout because nothing went wrong Some(payout_object.payout) } else { @@ -247,7 +247,7 @@ impl Contract { payout_option //if the payout option was None, we refund the buyer for the price they payed and return } else { - Promise::new(buyer_id).transfer(price); + Promise::new(buyer_id).transfer(NearToken::from_yoctonear(u128::from(price))); // leave function and return the price that was refunded return price; }; diff --git a/market-contract/src/sale_views.rs b/market-contract/src/sale_views.rs index ac60f42..1415faa 100644 --- a/market-contract/src/sale_views.rs +++ b/market-contract/src/sale_views.rs @@ -7,24 +7,24 @@ impl Contract { //returns the number of sales the marketplace has up (as a string) pub fn get_supply_sales( &self, - ) -> u64 { + ) -> U64 { //returns the sales object length - self.sales.len() + U64(self.sales.len()) } //returns the number of sales for a given account (result is a string) pub fn get_supply_by_owner_id( &self, account_id: AccountId, - ) -> u64 { + ) -> U64 { //get the set of sales for the given owner Id let by_owner_id = self.by_owner_id.get(&account_id); //if there as some set, we return the length but if there wasn't a set, we return 0 if let Some(by_owner_id) = by_owner_id { - by_owner_id.len() + U64(by_owner_id.len()) } else { - 0 + U64(0) } } @@ -66,15 +66,15 @@ impl Contract { pub fn get_supply_by_nft_contract_id( &self, nft_contract_id: AccountId, - ) -> u64 { + ) -> U64 { //get the set of tokens for associated with the given nft contract let by_nft_contract_id = self.by_nft_contract_id.get(&nft_contract_id); //if there was some set, return it's length. Otherwise return 0 if let Some(by_nft_contract_id) = by_nft_contract_id { - by_nft_contract_id.len() + U64(by_nft_contract_id.len()) } else { - 0 + U64(0) } } diff --git a/market-contract/src/tests.rs b/market-contract/src/tests.rs index 345c9fd..3d1bf59 100644 --- a/market-contract/src/tests.rs +++ b/market-contract/src/tests.rs @@ -4,6 +4,7 @@ use crate::sale::Sale; use crate::Contract; use near_sdk::{ collections::UnorderedSet, + json_types::U128, env, NearToken, test_utils::{accounts, VMContextBuilder}, @@ -71,7 +72,7 @@ fn test_storage_balance_of() { .build()); contract.storage_deposit(Some(accounts(0))); let balance = contract.storage_balance_of(accounts(0)); - assert!(balance.eq(&MIN_REQUIRED_STORAGE_YOCTO)); + assert_eq!(balance, U128(MIN_REQUIRED_STORAGE_YOCTO.as_yoctonear())); } #[test] @@ -97,7 +98,7 @@ fn test_storage_withdraw() { contract.storage_withdraw(); let remaining_amount = contract.storage_balance_of(accounts(0)); - assert!(remaining_amount.is_zero()) + assert_eq!(remaining_amount, U128(0)) } #[test] diff --git a/nft-contract-approval/src/enumeration.rs b/nft-contract-approval/src/enumeration.rs index c7f3633..c7b4869 100644 --- a/nft-contract-approval/src/enumeration.rs +++ b/nft-contract-approval/src/enumeration.rs @@ -3,9 +3,9 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> u64 { + pub fn nft_total_supply(&self) -> U64 { //return the length of the token metadata by ID - self.token_metadata_by_id.len() + U64(self.token_metadata_by_id.len()) } //Query for nft tokens on the contract regardless of the owner using pagination @@ -29,16 +29,16 @@ impl Contract { pub fn nft_supply_for_owner( &self, account_id: AccountId, - ) -> u64 { + ) -> U64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set.len() + U64(tokens_for_owner_set.len()) } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - 0 + U64(0) } } diff --git a/nft-contract-approval/src/internal.rs b/nft-contract-approval/src/internal.rs index ca112f7..d1695d8 100644 --- a/nft-contract-approval/src/internal.rs +++ b/nft-contract-approval/src/internal.rs @@ -14,7 +14,7 @@ pub(crate) fn refund_approved_account_ids_iter<'a, I>( approved_account_ids: I, //the approved account IDs must be passed in as an iterator ) -> Promise where I: Iterator { //get the storage total by going through and summing all the bytes for each approved account IDs - let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + let storage_released = approved_account_ids.map(bytes_for_approved_account_id).sum(); //transfer the account the storage that is released Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) } diff --git a/nft-contract-approval/src/lib.rs b/nft-contract-approval/src/lib.rs index a37235c..b9642cb 100644 --- a/nft-contract-approval/src/lib.rs +++ b/nft-contract-approval/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::Base64VecU8; +use near_sdk::json_types::{Base64VecU8, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-basic/src/enumeration.rs b/nft-contract-basic/src/enumeration.rs index c7f3633..c7b4869 100644 --- a/nft-contract-basic/src/enumeration.rs +++ b/nft-contract-basic/src/enumeration.rs @@ -3,9 +3,9 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> u64 { + pub fn nft_total_supply(&self) -> U64 { //return the length of the token metadata by ID - self.token_metadata_by_id.len() + U64(self.token_metadata_by_id.len()) } //Query for nft tokens on the contract regardless of the owner using pagination @@ -29,16 +29,16 @@ impl Contract { pub fn nft_supply_for_owner( &self, account_id: AccountId, - ) -> u64 { + ) -> U64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set.len() + U64(tokens_for_owner_set.len()) } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - 0 + U64(0) } } diff --git a/nft-contract-basic/src/lib.rs b/nft-contract-basic/src/lib.rs index 6ca71a4..132b004 100644 --- a/nft-contract-basic/src/lib.rs +++ b/nft-contract-basic/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::Base64VecU8; +use near_sdk::json_types::{Base64VecU8, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-events/src/enumeration.rs b/nft-contract-events/src/enumeration.rs index c7f3633..c7b4869 100644 --- a/nft-contract-events/src/enumeration.rs +++ b/nft-contract-events/src/enumeration.rs @@ -3,9 +3,9 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> u64 { + pub fn nft_total_supply(&self) -> U64 { //return the length of the token metadata by ID - self.token_metadata_by_id.len() + U64(self.token_metadata_by_id.len()) } //Query for nft tokens on the contract regardless of the owner using pagination @@ -29,16 +29,16 @@ impl Contract { pub fn nft_supply_for_owner( &self, account_id: AccountId, - ) -> u64 { + ) -> U64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set.len() + U64(tokens_for_owner_set.len()) } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - 0 + U64(0) } } diff --git a/nft-contract-events/src/lib.rs b/nft-contract-events/src/lib.rs index a37235c..b9642cb 100644 --- a/nft-contract-events/src/lib.rs +++ b/nft-contract-events/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::Base64VecU8; +use near_sdk::json_types::{Base64VecU8, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-royalty/src/enumeration.rs b/nft-contract-royalty/src/enumeration.rs index c7f3633..c7b4869 100644 --- a/nft-contract-royalty/src/enumeration.rs +++ b/nft-contract-royalty/src/enumeration.rs @@ -3,9 +3,9 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> u64 { + pub fn nft_total_supply(&self) -> U64 { //return the length of the token metadata by ID - self.token_metadata_by_id.len() + U64(self.token_metadata_by_id.len()) } //Query for nft tokens on the contract regardless of the owner using pagination @@ -29,16 +29,16 @@ impl Contract { pub fn nft_supply_for_owner( &self, account_id: AccountId, - ) -> u64 { + ) -> U64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set.len() + U64(tokens_for_owner_set.len()) } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - 0 + U64(0) } } diff --git a/nft-contract-royalty/src/internal.rs b/nft-contract-royalty/src/internal.rs index 2aee3f6..ed6f076 100644 --- a/nft-contract-royalty/src/internal.rs +++ b/nft-contract-royalty/src/internal.rs @@ -19,7 +19,7 @@ pub(crate) fn refund_approved_account_ids_iter<'a, I>( approved_account_ids: I, //the approved account IDs must be passed in as an iterator ) -> Promise where I: Iterator { //get the storage total by going through and summing all the bytes for each approved account IDs - let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + let storage_released = approved_account_ids.map(bytes_for_approved_account_id).sum(); //transfer the account the storage that is released Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) } diff --git a/nft-contract-royalty/src/lib.rs b/nft-contract-royalty/src/lib.rs index a37235c..b9642cb 100644 --- a/nft-contract-royalty/src/lib.rs +++ b/nft-contract-royalty/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::Base64VecU8; +use near_sdk::json_types::{Base64VecU8, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-skeleton/src/enumeration.rs b/nft-contract-skeleton/src/enumeration.rs index 0a8a990..d80f47a 100644 --- a/nft-contract-skeleton/src/enumeration.rs +++ b/nft-contract-skeleton/src/enumeration.rs @@ -3,7 +3,7 @@ use crate::*; #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> u64 { + pub fn nft_total_supply(&self) -> U64 { /* FILL THIS IN */ @@ -22,7 +22,7 @@ impl Contract { pub fn nft_supply_for_owner( &self, account_id: AccountId, - ) -> u64 { + ) -> U64 { /* FILL THIS IN */ diff --git a/nft-contract-skeleton/src/lib.rs b/nft-contract-skeleton/src/lib.rs index fc2958b..f847e3f 100644 --- a/nft-contract-skeleton/src/lib.rs +++ b/nft-contract-skeleton/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::Base64VecU8; +use near_sdk::json_types::{Base64VecU8, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, NearToken, AccountId, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-series/src/enumeration.rs b/nft-series/src/enumeration.rs index 6cf4fba..e931878 100644 --- a/nft-series/src/enumeration.rs +++ b/nft-series/src/enumeration.rs @@ -19,9 +19,9 @@ pub struct JsonSeries { #[near_bindgen] impl Contract { //Query for the total supply of NFTs on the contract - pub fn nft_total_supply(&self) -> u64 { + pub fn nft_total_supply(&self) -> U64 { //return the length of the tokens by id - self.tokens_by_id.len() + U64(self.tokens_by_id.len()) } //Query for nft tokens on the contract regardless of the owner using pagination @@ -43,16 +43,16 @@ impl Contract { } //get the total supply of NFTs for a given owner - pub fn nft_supply_for_owner(&self, account_id: AccountId) -> u64 { + pub fn nft_supply_for_owner(&self, account_id: AccountId) -> U64 { //get the set of tokens for the passed in owner let tokens_for_owner_set = self.tokens_per_owner.get(&account_id); //if there is some set of tokens, we'll return the length if let Some(tokens_for_owner_set) = tokens_for_owner_set { - tokens_for_owner_set.len() + U64(tokens_for_owner_set.len()) } else { //if there isn't a set of tokens for the passed in account ID, we'll return 0 - 0 + U64(0) } } @@ -90,8 +90,8 @@ impl Contract { } // Get the total supply of series on the contract - pub fn get_series_total_supply(&self) -> u64 { - self.series_by_id.len() + pub fn get_series_total_supply(&self) -> U64 { + U64(self.series_by_id.len()) } // Paginate through all the series on the contract and return the a vector of JsonSeries @@ -131,15 +131,15 @@ impl Contract { } //get the total supply of NFTs on a current series - pub fn nft_supply_for_series(&self, id: u64) -> u64 { + pub fn nft_supply_for_series(&self, id: u64) -> U64 { //get the series let series = self.series_by_id.get(&id); //if there is some series, get the length of the tokens. Otherwise return - if let Some(series) = series { - series.tokens.len() + U64(series.tokens.len()) } else { - 0 + U64(0) } } diff --git a/nft-series/src/internal.rs b/nft-series/src/internal.rs index a3a3e90..b6f702e 100644 --- a/nft-series/src/internal.rs +++ b/nft-series/src/internal.rs @@ -23,7 +23,7 @@ pub(crate) fn refund_approved_account_ids_iter<'a, I>( approved_account_ids: I, //the approved account IDs must be passed in as an iterator ) -> Promise where I: Iterator { //get the storage total by going through and summing all the bytes for each approved account IDs - let storage_released: u128 = approved_account_ids.map(bytes_for_approved_account_id).sum(); + let storage_released = approved_account_ids.map(bytes_for_approved_account_id).sum(); //transfer the account the storage that is released Promise::new(account_id).transfer(env::storage_byte_cost().saturating_mul(storage_released)) } diff --git a/nft-series/src/lib.rs b/nft-series/src/lib.rs index 9b4b5c9..9ec1068 100644 --- a/nft-series/src/lib.rs +++ b/nft-series/src/lib.rs @@ -1,6 +1,6 @@ use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LazyOption, LookupMap, LookupSet, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::Base64VecU8; +use near_sdk::json_types::{Base64VecU8, U64}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ env, near_bindgen, require, AccountId, NearToken, BorshStorageKey, CryptoHash, PanicOnDefault, From 51a28681f4dd4c8924e87911e842dd5eb0e87276 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 29 Apr 2024 23:49:52 +0200 Subject: [PATCH 26/28] using U types for payouts --- market-contract/res/nft_simple.wasm | Bin 211520 -> 0 bytes market-contract/src/lib.rs | 6 +++--- market-contract/src/sale.rs | 12 ++++++------ market-contract/src/sale_views.rs | 2 +- market-contract/src/tests.rs | 2 +- nft-contract-approval/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-contract-approval/src/enumeration.rs | 2 +- nft-contract-approval/src/lib.rs | 2 +- nft-contract-approval/src/metadata.rs | 2 +- nft-contract-approval/src/royalty.rs | 8 ++++---- nft-contract-basic/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-contract-basic/src/enumeration.rs | 2 +- nft-contract-basic/src/lib.rs | 2 +- nft-contract-basic/src/metadata.rs | 2 +- nft-contract-basic/src/royalty.rs | 8 ++++---- nft-contract-events/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-contract-events/src/enumeration.rs | 2 +- nft-contract-events/src/lib.rs | 2 +- nft-contract-events/src/metadata.rs | 2 +- nft-contract-events/src/royalty.rs | 8 ++++---- nft-contract-royalty/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-contract-royalty/src/enumeration.rs | 2 +- nft-contract-royalty/src/internal.rs | 4 ++-- nft-contract-royalty/src/lib.rs | 2 +- nft-contract-royalty/src/metadata.rs | 2 +- nft-contract-royalty/src/royalty.rs | 20 ++++++++++++-------- nft-contract-skeleton/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-contract-skeleton/src/lib.rs | 2 +- nft-contract-skeleton/src/metadata.rs | 2 +- nft-contract-skeleton/src/royalty.rs | 8 ++++---- nft-series/res/nft_simple.wasm | Bin 211520 -> 0 bytes nft-series/src/enumeration.rs | 2 +- nft-series/src/internal.rs | 4 ++-- nft-series/src/lib.rs | 2 +- nft-series/src/metadata.rs | 2 +- nft-series/src/royalty.rs | 20 ++++++++++++-------- 36 files changed, 72 insertions(+), 64 deletions(-) delete mode 100755 market-contract/res/nft_simple.wasm delete mode 100755 nft-contract-approval/res/nft_simple.wasm delete mode 100755 nft-contract-basic/res/nft_simple.wasm delete mode 100755 nft-contract-events/res/nft_simple.wasm delete mode 100755 nft-contract-royalty/res/nft_simple.wasm delete mode 100755 nft-contract-skeleton/res/nft_simple.wasm delete mode 100755 nft-series/res/nft_simple.wasm diff --git a/market-contract/res/nft_simple.wasm b/market-contract/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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, + pub payout: HashMap, } //main contract struct to store all the information @@ -176,8 +176,8 @@ impl Contract { /// views //return the minimum storage for 1 sale - pub fn storage_minimum_balance(&self) -> NearToken { - storage_per_sale() + pub fn storage_minimum_balance(&self) -> U128 { + U128(storage_per_sale().as_yoctonear()) } //return how much storage an account has paid for diff --git a/market-contract/src/sale.rs b/market-contract/src/sale.rs index addba71..051fe0e 100644 --- a/market-contract/src/sale.rs +++ b/market-contract/src/sale.rs @@ -43,7 +43,7 @@ impl Contract { //we need to enforce that the user has enough storage for 1 EXTRA sale. //get the storage for a sale - let storage_amount = self.storage_minimum_balance(); + let storage_amount = self.storage_minimum_balance().0; //get the total storage paid by the owner let owner_paid_storage = self.storage_deposits.get(&owner_id).unwrap_or(ZERO_NEAR); //get the storage required which is simply the storage for the number of sales they have + 1 @@ -51,7 +51,7 @@ impl Contract { //make sure that the total paid is >= the required storage assert!( - owner_paid_storage.ge(&signer_storage_required), + owner_paid_storage.ge(&NearToken::from_yoctonear(signer_storage_required)), "Insufficient storage paid: {}, for {} sales at {} rate of per sale", owner_paid_storage, signer_storage_required.saturating_div(storage_per_sale().as_yoctonear()), storage_per_sale() ); @@ -92,7 +92,7 @@ impl Contract { &mut self, nft_contract_id: AccountId, token_id: String, - price: NearToken, + price: U128, ) { //assert that the user has attached exactly 1 yoctoNEAR (for security reasons) assert_one_yocto(); @@ -112,7 +112,7 @@ impl Contract { ); //set the sale conditions equal to the passed in price - sale.sale_conditions = price; + sale.sale_conditions = NearToken::from_yoctonear(price.0); //insert the sale back into the map for the unique sale ID self.sales.insert(&contract_and_token_id, &sale); } @@ -226,7 +226,7 @@ impl Contract { //loop through the payout and subtract the values from the remainder. for &value in payout_object.payout.values() { //checked sub checks for overflow or any errors and returns None if there are problems - remainder = remainder.checked_sub(value.as_yoctonear())?; + remainder = remainder.checked_sub(value.0)?; } //Check to see if the NFT contract sent back a faulty payout that requires us to pay more or too little. //The remainder will be 0 if the payout summed to the total price. The remainder will be 1 if the royalties @@ -254,7 +254,7 @@ impl Contract { // NEAR payouts for (receiver_id, amount) in payout { - Promise::new(receiver_id).transfer(amount); + Promise::new(receiver_id).transfer(NearToken::from_yoctonear(amount.0)); } //return the price payout out diff --git a/market-contract/src/sale_views.rs b/market-contract/src/sale_views.rs index 1415faa..53082f6 100644 --- a/market-contract/src/sale_views.rs +++ b/market-contract/src/sale_views.rs @@ -48,7 +48,7 @@ impl Contract { let keys = sales.as_vector(); //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through the keys vector keys.iter() diff --git a/market-contract/src/tests.rs b/market-contract/src/tests.rs index 3d1bf59..6adc0f7 100644 --- a/market-contract/src/tests.rs +++ b/market-contract/src/tests.rs @@ -195,7 +195,7 @@ fn test_update_price() { .attached_deposit(ONE_YOCTONEAR) .predecessor_account_id(accounts(0)) // bob to buy NFT from alice .build()); - contract.update_price(nft_contract_id, token_id, new_price); + contract.update_price(nft_contract_id, token_id, U128(new_price.as_yoctonear())); // test update price success let sale = contract.sales.get(&contract_and_token_id).expect("No sale"); diff --git a/nft-contract-approval/res/nft_simple.wasm b/nft-contract-approval/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through each token using an iterator self.token_metadata_by_id.keys() diff --git a/nft-contract-approval/src/lib.rs b/nft-contract-approval/src/lib.rs index b9642cb..309e8f1 100644 --- a/nft-contract-approval/src/lib.rs +++ b/nft-contract-approval/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U64}; +use near_sdk::json_types::{Base64VecU8, U64, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-approval/src/metadata.rs b/nft-contract-approval/src/metadata.rs index dc74200..1c9ab53 100644 --- a/nft-contract-approval/src/metadata.rs +++ b/nft-contract-approval/src/metadata.rs @@ -4,7 +4,7 @@ pub type TokenId = String; #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-contract-approval/src/royalty.rs b/nft-contract-approval/src/royalty.rs index beb2fc2..7646f9e 100644 --- a/nft-contract-approval/src/royalty.rs +++ b/nft-contract-approval/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout; } @@ -20,7 +20,7 @@ pub trait NonFungibleTokenCore { impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -35,7 +35,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-contract-basic/res/nft_simple.wasm b/nft-contract-basic/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through each token using an iterator self.token_metadata_by_id.keys() diff --git a/nft-contract-basic/src/lib.rs b/nft-contract-basic/src/lib.rs index 132b004..06f2f8b 100644 --- a/nft-contract-basic/src/lib.rs +++ b/nft-contract-basic/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U64}; +use near_sdk::json_types::{Base64VecU8, U64, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-basic/src/metadata.rs b/nft-contract-basic/src/metadata.rs index 1578d88..41de708 100644 --- a/nft-contract-basic/src/metadata.rs +++ b/nft-contract-basic/src/metadata.rs @@ -4,7 +4,7 @@ pub type TokenId = String; #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-contract-basic/src/royalty.rs b/nft-contract-basic/src/royalty.rs index beb2fc2..7646f9e 100644 --- a/nft-contract-basic/src/royalty.rs +++ b/nft-contract-basic/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout; } @@ -20,7 +20,7 @@ pub trait NonFungibleTokenCore { impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -35,7 +35,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-contract-events/res/nft_simple.wasm b/nft-contract-events/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-contract-events/src/royalty.rs b/nft-contract-events/src/royalty.rs index beb2fc2..7646f9e 100644 --- a/nft-contract-events/src/royalty.rs +++ b/nft-contract-events/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout; } @@ -20,7 +20,7 @@ pub trait NonFungibleTokenCore { impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -35,7 +35,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-contract-royalty/res/nft_simple.wasm b/nft-contract-royalty/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through each token using an iterator self.token_metadata_by_id.keys() diff --git a/nft-contract-royalty/src/internal.rs b/nft-contract-royalty/src/internal.rs index ed6f076..0f3895b 100644 --- a/nft-contract-royalty/src/internal.rs +++ b/nft-contract-royalty/src/internal.rs @@ -3,8 +3,8 @@ use near_sdk::{CryptoHash}; use std::mem::size_of; //convert the royalty percentage and amount to pay into a payout -pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: NearToken) -> NearToken { - amount_to_pay.saturating_mul(royalty_percentage).saturating_div(10000) +pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: u128) -> U128 { + U128(amount_to_pay.saturating_mul(royalty_percentage).saturating_div(10000)) } //calculate how many bytes the account ID is taking up diff --git a/nft-contract-royalty/src/lib.rs b/nft-contract-royalty/src/lib.rs index b9642cb..309e8f1 100644 --- a/nft-contract-royalty/src/lib.rs +++ b/nft-contract-royalty/src/lib.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use near_sdk::borsh::{BorshSerialize, BorshDeserialize}; use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U64}; +use near_sdk::json_types::{Base64VecU8, U64, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ near_bindgen, env, AccountId, NearToken, CryptoHash, PanicOnDefault, Promise, PromiseOrValue, BorshStorageKey, NearSchema diff --git a/nft-contract-royalty/src/metadata.rs b/nft-contract-royalty/src/metadata.rs index 6f7add6..3153b89 100644 --- a/nft-contract-royalty/src/metadata.rs +++ b/nft-contract-royalty/src/metadata.rs @@ -4,7 +4,7 @@ pub type TokenId = String; #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-contract-royalty/src/royalty.rs b/nft-contract-royalty/src/royalty.rs index 2894319..6e6cbb8 100644 --- a/nft-contract-royalty/src/royalty.rs +++ b/nft-contract-royalty/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout; } @@ -19,7 +19,7 @@ pub trait NonFungibleTokenCore { #[near_bindgen] impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { //get the token object let token = self.tokens_by_id.get(&token_id).expect("No token"); @@ -27,6 +27,8 @@ impl NonFungibleTokenCore for Contract { let owner_id = token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; + //get the u128 version of the passed in balance (which was U128 before) + let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new(), @@ -49,7 +51,7 @@ impl NonFungibleTokenCore for Contract { if key != owner_id { payout_object .payout - .insert(key, royalty_to_payout(*v as u128, balance)); + .insert(key, royalty_to_payout(*v as u128, balance_u128)); total_perpetual += *v; } } @@ -57,7 +59,7 @@ impl NonFungibleTokenCore for Contract { // payout to previous owner who gets 100% - total perpetual royalties payout_object.payout.insert( owner_id, - royalty_to_payout((10000 - total_perpetual).into(), balance), + royalty_to_payout((10000 - total_perpetual).into(), balance_u128), ); //return the payout object @@ -72,7 +74,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout { //assert that the user attached 1 yocto NEAR for security reasons @@ -93,6 +95,8 @@ impl NonFungibleTokenCore for Contract { let owner_id = previous_token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; + //get the u128 version of the passed in balance (which was U128 before) + let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new(), @@ -115,7 +119,7 @@ impl NonFungibleTokenCore for Contract { if key != owner_id { payout_object .payout - .insert(key, royalty_to_payout(*v as u128, balance)); + .insert(key, royalty_to_payout(*v as u128, balance_u128)); total_perpetual += *v; } } @@ -123,7 +127,7 @@ impl NonFungibleTokenCore for Contract { // payout to previous owner who gets 100% - total perpetual royalties payout_object.payout.insert( owner_id, - royalty_to_payout((10000 - total_perpetual).into(), balance), + royalty_to_payout((10000 - total_perpetual).into(), balance_u128), ); //return the payout object diff --git a/nft-contract-skeleton/res/nft_simple.wasm b/nft-contract-skeleton/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-contract-skeleton/src/royalty.rs b/nft-contract-skeleton/src/royalty.rs index 6dcbb1c..b71f42e 100644 --- a/nft-contract-skeleton/src/royalty.rs +++ b/nft-contract-skeleton/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout; } @@ -19,7 +19,7 @@ pub trait NonFungibleTokenCore { #[near_bindgen] impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { /* FILL THIS IN */ @@ -34,7 +34,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout { /* diff --git a/nft-series/res/nft_simple.wasm b/nft-series/res/nft_simple.wasm deleted file mode 100755 index f68c929bd483f1dc1d8f73986c7cdfbd91ce2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211520 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 NearToken { - amount_to_pay.saturating_mul(royalty_percentage) +pub(crate) fn royalty_to_payout(royalty_percentage: u128, amount_to_pay: u128) -> U128 { + U128(amount_to_pay.saturating_mul(royalty_percentage)) } //calculate how many bytes the account ID is taking up diff --git a/nft-series/src/lib.rs b/nft-series/src/lib.rs index 9ec1068..e1f1c02 100644 --- a/nft-series/src/lib.rs +++ b/nft-series/src/lib.rs @@ -1,6 +1,6 @@ use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; use near_sdk::collections::{LazyOption, LookupMap, LookupSet, UnorderedMap, UnorderedSet}; -use near_sdk::json_types::{Base64VecU8, U64}; +use near_sdk::json_types::{Base64VecU8, U64, U128}; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::{ env, near_bindgen, require, AccountId, NearToken, BorshStorageKey, CryptoHash, PanicOnDefault, diff --git a/nft-series/src/metadata.rs b/nft-series/src/metadata.rs index 0934281..4f2f025 100644 --- a/nft-series/src/metadata.rs +++ b/nft-series/src/metadata.rs @@ -4,7 +4,7 @@ pub type TokenId = String; #[derive(Serialize, Deserialize, NearSchema)] #[serde(crate = "near_sdk::serde")] pub struct Payout { - pub payout: HashMap, + pub payout: HashMap, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Clone, NearSchema)] diff --git a/nft-series/src/royalty.rs b/nft-series/src/royalty.rs index 0670c55..7e3ab35 100644 --- a/nft-series/src/royalty.rs +++ b/nft-series/src/royalty.rs @@ -2,7 +2,7 @@ use crate::*; pub trait NonFungibleTokenCore { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout; + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout; //transfers the token to the receiver ID and returns the payout object that should be payed given the passed in balance. fn nft_transfer_payout( @@ -11,7 +11,7 @@ pub trait NonFungibleTokenCore { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout; } @@ -19,7 +19,7 @@ pub trait NonFungibleTokenCore { #[near_bindgen] impl NonFungibleTokenCore for Contract { //calculates the payout for a token given the passed in balance. This is a view method - fn nft_payout(&self, token_id: TokenId, balance: NearToken, max_len_payout: u32) -> Payout { + fn nft_payout(&self, token_id: TokenId, balance: U128, max_len_payout: u32) -> Payout { //get the token object let token = self.tokens_by_id.get(&token_id).expect("No token"); @@ -27,6 +27,8 @@ impl NonFungibleTokenCore for Contract { let owner_id = token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; + //get the u128 version of the passed in balance (which was U128 before) + let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new(), @@ -64,7 +66,7 @@ impl NonFungibleTokenCore for Contract { // payout_object .payout - .insert(key, royalty_to_payout(*v as u128, balance)); + .insert(key, royalty_to_payout(*v as u128, balance_u128)); total_perpetual += *v; } } @@ -72,7 +74,7 @@ impl NonFungibleTokenCore for Contract { // payout to previous owner who gets 100% - total perpetual royalties payout_object.payout.insert( owner_id, - royalty_to_payout((10000 - total_perpetual).into(), balance) + royalty_to_payout((10000 - total_perpetual).into(), balance_u128) ); //return the payout object @@ -87,7 +89,7 @@ impl NonFungibleTokenCore for Contract { token_id: TokenId, approval_id: u64, memo: Option, - balance: NearToken, + balance: U128, max_len_payout: u32, ) -> Payout { //assert that the user attached 1 yocto NEAR for security reasons @@ -108,6 +110,8 @@ impl NonFungibleTokenCore for Contract { let owner_id = previous_token.owner_id; //keep track of the total perpetual royalties let mut total_perpetual = 0; + //get the u128 version of the passed in balance (which was U128 before) + let balance_u128 = u128::from(balance); //keep track of the payout object to send back let mut payout_object = Payout { payout: HashMap::new(), @@ -146,7 +150,7 @@ impl NonFungibleTokenCore for Contract { // payout_object .payout - .insert(key, royalty_to_payout(*v as u128, balance)); + .insert(key, royalty_to_payout(*v as u128, balance_u128)); total_perpetual += *v; } } @@ -154,7 +158,7 @@ impl NonFungibleTokenCore for Contract { // payout to previous owner who gets 100% - total perpetual royalties payout_object.payout.insert( owner_id, - royalty_to_payout((10000 - total_perpetual).into(), balance) + royalty_to_payout((10000 - total_perpetual).into(), balance_u128) ); //return the payout object From b74c2f498748d5659bc967d2b77f8b58ac963449 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 29 Apr 2024 23:54:19 +0200 Subject: [PATCH 27/28] removed unnecessary type cast --- market-contract/src/sale_views.rs | 2 +- nft-contract-approval/src/enumeration.rs | 2 +- nft-contract-basic/src/enumeration.rs | 2 +- nft-contract-events/src/enumeration.rs | 2 +- nft-contract-royalty/src/enumeration.rs | 2 +- nft-series/src/enumeration.rs | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/market-contract/src/sale_views.rs b/market-contract/src/sale_views.rs index 53082f6..9dcf7b4 100644 --- a/market-contract/src/sale_views.rs +++ b/market-contract/src/sale_views.rs @@ -99,7 +99,7 @@ impl Contract { let keys = sales.as_vector(); //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through the keys vector keys.iter() diff --git a/nft-contract-approval/src/enumeration.rs b/nft-contract-approval/src/enumeration.rs index 5ebbcbb..5926561 100644 --- a/nft-contract-approval/src/enumeration.rs +++ b/nft-contract-approval/src/enumeration.rs @@ -60,7 +60,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through the keys vector tokens.iter() diff --git a/nft-contract-basic/src/enumeration.rs b/nft-contract-basic/src/enumeration.rs index 5ebbcbb..5926561 100644 --- a/nft-contract-basic/src/enumeration.rs +++ b/nft-contract-basic/src/enumeration.rs @@ -60,7 +60,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through the keys vector tokens.iter() diff --git a/nft-contract-events/src/enumeration.rs b/nft-contract-events/src/enumeration.rs index a7f3df3..5926561 100644 --- a/nft-contract-events/src/enumeration.rs +++ b/nft-contract-events/src/enumeration.rs @@ -11,7 +11,7 @@ impl Contract { //Query for nft tokens on the contract regardless of the owner using pagination pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through each token using an iterator self.token_metadata_by_id.keys() diff --git a/nft-contract-royalty/src/enumeration.rs b/nft-contract-royalty/src/enumeration.rs index 5ebbcbb..5926561 100644 --- a/nft-contract-royalty/src/enumeration.rs +++ b/nft-contract-royalty/src/enumeration.rs @@ -60,7 +60,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through the keys vector tokens.iter() diff --git a/nft-series/src/enumeration.rs b/nft-series/src/enumeration.rs index 875c7d4..2dd505b 100644 --- a/nft-series/src/enumeration.rs +++ b/nft-series/src/enumeration.rs @@ -27,7 +27,7 @@ impl Contract { //Query for nft tokens on the contract regardless of the owner using pagination pub fn nft_tokens(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through each token using an iterator self.tokens_by_id @@ -97,7 +97,7 @@ impl Contract { // Paginate through all the series on the contract and return the a vector of JsonSeries pub fn get_series(&self, from_index: Option, limit: Option) -> Vec { //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through each series using an iterator self.series_by_id @@ -159,7 +159,7 @@ impl Contract { }; //where to start pagination - if we have a from_index, we'll use that - otherwise start from 0 index - let start = u128::from(from_index.unwrap_or(0)); + let start = from_index.unwrap_or(0); //iterate through the tokens tokens From a389954151ee0401611b47c8a59fd6faa8006ddc Mon Sep 17 00:00:00 2001 From: garikbesson Date: Tue, 30 Apr 2024 00:20:15 +0200 Subject: [PATCH 28/28] using U128 in creating series --- nft-series/src/series.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nft-series/src/series.rs b/nft-series/src/series.rs index e833e82..72b7f9b 100644 --- a/nft-series/src/series.rs +++ b/nft-series/src/series.rs @@ -13,7 +13,7 @@ impl Contract { id: u64, metadata: TokenMetadata, royalty: Option>, - price: Option + price: Option ) { // Measure the initial storage being used on the contract let initial_storage_usage = env::storage_usage(); @@ -41,7 +41,7 @@ impl Contract { )), }), owner_id: caller, - price: price.map(|p| p.into()), + price: price.map(|p| NearToken::from_yoctonear(p.0)), } ) .is_none(),