From bf7d59b3b8c8d8205b8552bda0ec29454ebdc3d5 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 08:31:32 +0200 Subject: [PATCH 01/31] multiple approvals --- bin/node/runtime/src/lib.rs | 2 + frame/nfts/src/functions.rs | 7 +++- frame/nfts/src/lib.rs | 80 +++++++++++++++++++++++++++++++------ frame/nfts/src/mock.rs | 1 + frame/nfts/src/types.rs | 6 +-- 5 files changed, 79 insertions(+), 17 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 28cc2452039ac..1ffe28a2ac416 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -1453,6 +1453,7 @@ parameter_types! { pub const ItemDeposit: Balance = 1 * DOLLARS; pub const KeyLimit: u32 = 32; pub const ValueLimit: u32 = 256; + pub const ApprovalsLimit: u32 = 20; } impl pallet_uniques::Config for Runtime { @@ -1490,6 +1491,7 @@ impl pallet_nfts::Config for Runtime { type StringLimit = StringLimit; type KeyLimit = KeyLimit; type ValueLimit = ValueLimit; + type ApprovalsLimit = ApprovalsLimit; type WeightInfo = pallet_nfts::weights::SubstrateWeight; #[cfg(feature = "runtime-benchmarks")] type Helper = (); diff --git a/frame/nfts/src/functions.rs b/frame/nfts/src/functions.rs index 107214558307f..d15467a1fef65 100644 --- a/frame/nfts/src/functions.rs +++ b/frame/nfts/src/functions.rs @@ -168,7 +168,12 @@ impl, I: 'static> Pallet { let owner = owner.clone(); Account::::insert((&owner, &collection, &item), ()); - let details = ItemDetails { owner, approved: None, is_frozen: false, deposit }; + let details = ItemDetails { + owner, + approvals: ApprovalsOf::::default(), + is_frozen: false, + deposit, + }; Item::::insert(&collection, &item, details); Ok(()) }, diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index cb96e8138ba5e..45c5514832291 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -46,7 +46,7 @@ use frame_support::{ traits::{ tokens::Locker, BalanceStatus::Reserved, Currency, EnsureOriginWithArg, ReservableCurrency, }, - transactional, + transactional, BoundedBTreeMap, }; use frame_system::Config as SystemConfig; use sp_runtime::{ @@ -149,6 +149,10 @@ pub mod pallet { #[pallet::constant] type ValueLimit: Get; + /// The maximum approvals an item could have. + #[pallet::constant] + type ApprovalsLimit: Get; + #[cfg(feature = "runtime-benchmarks")] /// A set of helper functions for benchmarking. type Helper: BenchmarkHelper; @@ -157,6 +161,12 @@ pub mod pallet { type WeightInfo: WeightInfo; } + pub type ApprovalsOf = BoundedBTreeMap< + ::AccountId, + Option<::BlockNumber>, + >::ApprovalsLimit, + >; + #[pallet::storage] #[pallet::storage_prefix = "Class"] /// Details of a collection. @@ -209,7 +219,7 @@ pub mod pallet { T::CollectionId, Blake2_128Concat, T::ItemId, - ItemDetails>, + ItemDetails, ApprovalsOf>, OptionQuery, >; @@ -320,6 +330,12 @@ pub mod pallet { owner: T::AccountId, delegate: T::AccountId, }, + // All approvals of an item got cancelled. + AllApprovalsCancelled { + collection: T::CollectionId, + item: T::ItemId, + owner: T::AccountId, + }, /// A `collection` has had its attributes changed by the `Force` origin. ItemStatusChanged { collection: T::CollectionId }, /// New metadata has been set for a `collection`. @@ -393,6 +409,8 @@ pub mod pallet { InUse, /// The item or collection is frozen. Frozen, + /// The provided account is not a delegate. + NotDelegate, /// The delegate turned out to be different to what was expected. WrongDelegate, /// There is no delegate approved. @@ -415,6 +433,8 @@ pub mod pallet { NotForSale, /// The provided bid is too low. BidTooLow, + /// The item has reached its approval limit. + ReachedApprovalLimit, } impl, I: 'static> Pallet { @@ -630,8 +650,8 @@ pub mod pallet { Self::do_transfer(collection, item, dest, |collection_details, details| { if details.owner != origin && collection_details.admin != origin { - let approved = details.approved.take().map_or(false, |i| i == origin); - ensure!(approved, Error::::NoPermission); + let approved = details.approvals.get(&origin); + ensure!(approved.is_some(), Error::::NoPermission); } Ok(()) }) @@ -939,10 +959,12 @@ pub mod pallet { ensure!(permitted, Error::::NoPermission); } - details.approved = Some(delegate); + let _ = details + .approvals + .try_insert(delegate.clone(), None) + .map_err(|_| Error::::ReachedApprovalLimit)?; Item::::insert(&collection, &item, &details); - let delegate = details.approved.expect("set as Some above; qed"); Self::deposit_event(Event::ApprovedTransfer { collection, item, @@ -974,12 +996,14 @@ pub mod pallet { origin: OriginFor, collection: T::CollectionId, item: T::ItemId, - maybe_check_delegate: Option>, + delegate: AccountIdLookupOf, ) -> DispatchResult { let maybe_check: Option = T::ForceOrigin::try_origin(origin) .map(|_| None) .or_else(|origin| ensure_signed(origin).map(Some).map_err(DispatchError::from))?; + let delegate = T::Lookup::lookup(delegate)?; + let collection_details = Collection::::get(&collection).ok_or(Error::::UnknownCollection)?; let mut details = @@ -988,18 +1012,48 @@ pub mod pallet { let permitted = check == collection_details.admin || check == details.owner; ensure!(permitted, Error::::NoPermission); } - let maybe_check_delegate = maybe_check_delegate.map(T::Lookup::lookup).transpose()?; - let old = details.approved.take().ok_or(Error::::NoDelegate)?; - if let Some(check_delegate) = maybe_check_delegate { - ensure!(check_delegate == old, Error::::WrongDelegate); - } + ensure!(details.approvals.get(&delegate).is_some(), Error::::NotDelegate); + + details.approvals.remove(&delegate); + //details.approvals.retain(|d| *d != delegate); Item::::insert(&collection, &item, &details); Self::deposit_event(Event::ApprovalCancelled { collection, item, owner: details.owner, - delegate: old, + delegate, + }); + + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn clear_all_transfer_approvals( + origin: OriginFor, + collection: T::CollectionId, + item: T::ItemId, + ) -> DispatchResult { + let maybe_check: Option = T::ForceOrigin::try_origin(origin) + .map(|_| None) + .or_else(|origin| ensure_signed(origin).map(Some).map_err(DispatchError::from))?; + + let collection_details = + Collection::::get(&collection).ok_or(Error::::UnknownCollection)?; + let mut details = + Item::::get(&collection, &item).ok_or(Error::::UnknownCollection)?; + if let Some(check) = maybe_check { + let permitted = check == collection_details.admin || check == details.owner; + ensure!(permitted, Error::::NoPermission); + } + + // clear all approvals. + details.approvals = ApprovalsOf::::default(); + Item::::insert(&collection, &item, &details); + Self::deposit_event(Event::AllApprovalsCancelled { + collection, + item, + owner: details.owner, }); Ok(()) diff --git a/frame/nfts/src/mock.rs b/frame/nfts/src/mock.rs index f3040faac5f40..ad7a94b3eed50 100644 --- a/frame/nfts/src/mock.rs +++ b/frame/nfts/src/mock.rs @@ -100,6 +100,7 @@ impl Config for Test { type StringLimit = ConstU32<50>; type KeyLimit = ConstU32<50>; type ValueLimit = ConstU32<50>; + type ApprovalsLimit = ConstU32<10>; type WeightInfo = (); #[cfg(feature = "runtime-benchmarks")] type Helper = (); diff --git a/frame/nfts/src/types.rs b/frame/nfts/src/types.rs index 1081ec8110288..db1c351c4a9c5 100644 --- a/frame/nfts/src/types.rs +++ b/frame/nfts/src/types.rs @@ -29,7 +29,7 @@ pub(super) type DepositBalanceOf = pub(super) type CollectionDetailsFor = CollectionDetails<::AccountId, DepositBalanceOf>; pub(super) type ItemDetailsFor = - ItemDetails<::AccountId, DepositBalanceOf>; + ItemDetails<::AccountId, DepositBalanceOf, ApprovalsOf>; pub(super) type ItemPrice = <>::Currency as Currency<::AccountId>>::Balance; @@ -84,11 +84,11 @@ impl CollectionDetails { /// Information concerning the ownership of a single unique item. #[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, Default, TypeInfo, MaxEncodedLen)] -pub struct ItemDetails { +pub struct ItemDetails { /// The owner of this item. pub(super) owner: AccountId, /// The approved transferrer of this item, if one is set. - pub(super) approved: Option, + pub(super) approvals: Approvals, /// Whether the item can be transferred or not. pub(super) is_frozen: bool, /// The amount held in the pallet's default account for this item. Free-hold items will have From cf08222ac24219696086bf743e088c4b890373b6 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 08:44:45 +0200 Subject: [PATCH 02/31] clear --- frame/nfts/src/lib.rs | 2 +- frame/nfts/src/tests.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 45c5514832291..0c2a61dd2f15e 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1048,7 +1048,7 @@ pub mod pallet { } // clear all approvals. - details.approvals = ApprovalsOf::::default(); + details.approvals.clear(); Item::::insert(&collection, &item, &details); Self::deposit_event(Event::AllApprovalsCancelled { collection, diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 2b20d124bd9ae..5eb085667ca30 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -538,7 +538,7 @@ fn approval_lifecycle_works() { assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); assert_ok!(Nfts::transfer(Origin::signed(3), 0, 42, 4)); assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 3), Error::::NoPermission); - assert!(Item::::get(0, 42).unwrap().approved.is_none()); + assert!(Item::::get(0, 42).unwrap().approvals.is_none()); assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 2)); assert_ok!(Nfts::transfer(Origin::signed(2), 0, 42, 2)); From b296ba38e39c20e198006f668174e7ac78e7d186 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 09:03:36 +0200 Subject: [PATCH 03/31] tests & clean up --- frame/nfts/src/lib.rs | 12 +++---- frame/nfts/src/tests.rs | 78 ++++++++++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 0c2a61dd2f15e..df337626f5e76 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -413,8 +413,6 @@ pub mod pallet { NotDelegate, /// The delegate turned out to be different to what was expected. WrongDelegate, - /// There is no delegate approved. - NoDelegate, /// No approval exists that would allow the transfer. Unapproved, /// The named owner has not signed ownership of the collection is acceptable. @@ -650,8 +648,8 @@ pub mod pallet { Self::do_transfer(collection, item, dest, |collection_details, details| { if details.owner != origin && collection_details.admin != origin { - let approved = details.approvals.get(&origin); - ensure!(approved.is_some(), Error::::NoPermission); + let approved = details.approvals.contains_key(&origin); + ensure!(approved, Error::::NoPermission); } Ok(()) }) @@ -959,7 +957,7 @@ pub mod pallet { ensure!(permitted, Error::::NoPermission); } - let _ = details + details .approvals .try_insert(delegate.clone(), None) .map_err(|_| Error::::ReachedApprovalLimit)?; @@ -1013,10 +1011,9 @@ pub mod pallet { ensure!(permitted, Error::::NoPermission); } - ensure!(details.approvals.get(&delegate).is_some(), Error::::NotDelegate); + ensure!(details.approvals.contains_key(&delegate), Error::::NotDelegate); details.approvals.remove(&delegate); - //details.approvals.retain(|d| *d != delegate); Item::::insert(&collection, &item, &details); Self::deposit_event(Event::ApprovalCancelled { collection, @@ -1047,7 +1044,6 @@ pub mod pallet { ensure!(permitted, Error::::NoPermission); } - // clear all approvals. details.approvals.clear(); Item::::insert(&collection, &item, &details); Self::deposit_event(Event::AllApprovalsCancelled { diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 5eb085667ca30..46e8f7c754ef9 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -538,7 +538,7 @@ fn approval_lifecycle_works() { assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); assert_ok!(Nfts::transfer(Origin::signed(3), 0, 42, 4)); assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 3), Error::::NoPermission); - assert!(Item::::get(0, 42).unwrap().approvals.is_none()); + assert!(Item::::get(0, 42).unwrap().approvals.is_empty()); assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 2)); assert_ok!(Nfts::transfer(Origin::signed(2), 0, 42, 2)); @@ -553,26 +553,59 @@ fn cancel_approval_works() { assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); assert_noop!( - Nfts::cancel_approval(Origin::signed(2), 1, 42, None), + Nfts::cancel_approval(Origin::signed(2), 1, 42, 3), Error::::UnknownCollection ); assert_noop!( - Nfts::cancel_approval(Origin::signed(2), 0, 43, None), + Nfts::cancel_approval(Origin::signed(2), 0, 43, 3), Error::::UnknownCollection ); assert_noop!( - Nfts::cancel_approval(Origin::signed(3), 0, 42, None), + Nfts::cancel_approval(Origin::signed(3), 0, 42, 3), Error::::NoPermission ); assert_noop!( - Nfts::cancel_approval(Origin::signed(2), 0, 42, Some(4)), - Error::::WrongDelegate + Nfts::cancel_approval(Origin::signed(2), 0, 42, 4), + Error::::NotDelegate ); - assert_ok!(Nfts::cancel_approval(Origin::signed(2), 0, 42, Some(3))); + assert_ok!(Nfts::cancel_approval(Origin::signed(2), 0, 42, 3)); assert_noop!( - Nfts::cancel_approval(Origin::signed(2), 0, 42, None), - Error::::NoDelegate + Nfts::cancel_approval(Origin::signed(2), 0, 42, 3), + Error::::NotDelegate + ); + }); +} + +#[test] +fn approving_multiple_accounts_works() { + new_test_ext().execute_with(|| { + assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); + assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); + + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 4)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 5)); + + assert_ok!(Nfts::transfer(Origin::signed(4), 0, 42, 6)); + assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 7), Error::::NoPermission); + assert_noop!(Nfts::transfer(Origin::signed(5), 0, 42, 8), Error::::NoPermission); + }); +} + +#[test] +fn approvals_limit_works() { + new_test_ext().execute_with(|| { + assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); + assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); + + for i in 3..13 { + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, i)); + } + // the limit is 10 + assert_noop!( + Nfts::approve_transfer(Origin::signed(2), 0, 42, 14), + Error::::ReachedApprovalLimit ); }); } @@ -585,22 +618,22 @@ fn cancel_approval_works_with_admin() { assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); assert_noop!( - Nfts::cancel_approval(Origin::signed(1), 1, 42, None), + Nfts::cancel_approval(Origin::signed(1), 1, 42, 1), Error::::UnknownCollection ); assert_noop!( - Nfts::cancel_approval(Origin::signed(1), 0, 43, None), + Nfts::cancel_approval(Origin::signed(1), 0, 43, 1), Error::::UnknownCollection ); assert_noop!( - Nfts::cancel_approval(Origin::signed(1), 0, 42, Some(4)), - Error::::WrongDelegate + Nfts::cancel_approval(Origin::signed(1), 0, 42, 4), + Error::::NotDelegate ); - assert_ok!(Nfts::cancel_approval(Origin::signed(1), 0, 42, Some(3))); + assert_ok!(Nfts::cancel_approval(Origin::signed(1), 0, 42, 3)); assert_noop!( - Nfts::cancel_approval(Origin::signed(1), 0, 42, None), - Error::::NoDelegate + Nfts::cancel_approval(Origin::signed(1), 0, 42, 1), + Error::::NotDelegate ); }); } @@ -613,20 +646,17 @@ fn cancel_approval_works_with_force() { assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); assert_noop!( - Nfts::cancel_approval(Origin::root(), 1, 42, None), + Nfts::cancel_approval(Origin::root(), 1, 42, 1), Error::::UnknownCollection ); assert_noop!( - Nfts::cancel_approval(Origin::root(), 0, 43, None), + Nfts::cancel_approval(Origin::root(), 0, 43, 1), Error::::UnknownCollection ); - assert_noop!( - Nfts::cancel_approval(Origin::root(), 0, 42, Some(4)), - Error::::WrongDelegate - ); + assert_noop!(Nfts::cancel_approval(Origin::root(), 0, 42, 4), Error::::NotDelegate); - assert_ok!(Nfts::cancel_approval(Origin::root(), 0, 42, Some(3))); - assert_noop!(Nfts::cancel_approval(Origin::root(), 0, 42, None), Error::::NoDelegate); + assert_ok!(Nfts::cancel_approval(Origin::root(), 0, 42, 3)); + assert_noop!(Nfts::cancel_approval(Origin::root(), 0, 42, 1), Error::::NotDelegate); }); } From a8c71d402d36d456281d0dbd9fd2efd0214e1c4e Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 09:08:15 +0200 Subject: [PATCH 04/31] fix in logic & fmt --- frame/nfts/src/functions.rs | 6 +++ frame/nfts/src/lib.rs | 83 +++++++++++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 17 deletions(-) diff --git a/frame/nfts/src/functions.rs b/frame/nfts/src/functions.rs index d15467a1fef65..27ab752dbabf6 100644 --- a/frame/nfts/src/functions.rs +++ b/frame/nfts/src/functions.rs @@ -48,6 +48,12 @@ impl, I: 'static> Pallet { Account::::insert((&dest, &collection, &item), ()); let origin = details.owner; details.owner = dest; + + // The approved accounts have to be reset to None, because otherwise pre-approve attack + // would be possible, where the owner can approve his second account before making the + // transaction and then claiming the item back. + details.approvals.clear(); + Item::::insert(&collection, &item, &details); ItemPriceOf::::remove(&collection, &item); diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index df337626f5e76..14f3e700c290c 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -281,13 +281,26 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event, I: 'static = ()> { /// A `collection` was created. - Created { collection: T::CollectionId, creator: T::AccountId, owner: T::AccountId }, + Created { + collection: T::CollectionId, + creator: T::AccountId, + owner: T::AccountId, + }, /// A `collection` was force-created. - ForceCreated { collection: T::CollectionId, owner: T::AccountId }, + ForceCreated { + collection: T::CollectionId, + owner: T::AccountId, + }, /// A `collection` was destroyed. - Destroyed { collection: T::CollectionId }, + Destroyed { + collection: T::CollectionId, + }, /// An `item` was issued. - Issued { collection: T::CollectionId, item: T::ItemId, owner: T::AccountId }, + Issued { + collection: T::CollectionId, + item: T::ItemId, + owner: T::AccountId, + }, /// An `item` was transferred. Transferred { collection: T::CollectionId, @@ -296,17 +309,34 @@ pub mod pallet { to: T::AccountId, }, /// An `item` was destroyed. - Burned { collection: T::CollectionId, item: T::ItemId, owner: T::AccountId }, + Burned { + collection: T::CollectionId, + item: T::ItemId, + owner: T::AccountId, + }, /// Some `item` was frozen. - Frozen { collection: T::CollectionId, item: T::ItemId }, + Frozen { + collection: T::CollectionId, + item: T::ItemId, + }, /// Some `item` was thawed. - Thawed { collection: T::CollectionId, item: T::ItemId }, + Thawed { + collection: T::CollectionId, + item: T::ItemId, + }, /// Some `collection` was frozen. - CollectionFrozen { collection: T::CollectionId }, + CollectionFrozen { + collection: T::CollectionId, + }, /// Some `collection` was thawed. - CollectionThawed { collection: T::CollectionId }, + CollectionThawed { + collection: T::CollectionId, + }, /// The owner changed. - OwnerChanged { collection: T::CollectionId, new_owner: T::AccountId }, + OwnerChanged { + collection: T::CollectionId, + new_owner: T::AccountId, + }, /// The management team changed. TeamChanged { collection: T::CollectionId, @@ -337,7 +367,9 @@ pub mod pallet { owner: T::AccountId, }, /// A `collection` has had its attributes changed by the `Force` origin. - ItemStatusChanged { collection: T::CollectionId }, + ItemStatusChanged { + collection: T::CollectionId, + }, /// New metadata has been set for a `collection`. CollectionMetadataSet { collection: T::CollectionId, @@ -345,7 +377,9 @@ pub mod pallet { is_frozen: bool, }, /// Metadata has been cleared for a `collection`. - CollectionMetadataCleared { collection: T::CollectionId }, + CollectionMetadataCleared { + collection: T::CollectionId, + }, /// New metadata has been set for an item. MetadataSet { collection: T::CollectionId, @@ -354,9 +388,15 @@ pub mod pallet { is_frozen: bool, }, /// Metadata has been cleared for an item. - MetadataCleared { collection: T::CollectionId, item: T::ItemId }, + MetadataCleared { + collection: T::CollectionId, + item: T::ItemId, + }, /// Metadata has been cleared for an item. - Redeposited { collection: T::CollectionId, successful_items: Vec }, + Redeposited { + collection: T::CollectionId, + successful_items: Vec, + }, /// New attribute metadata has been set for a `collection` or `item`. AttributeSet { collection: T::CollectionId, @@ -371,9 +411,15 @@ pub mod pallet { key: BoundedVec, }, /// Ownership acceptance has changed for an account. - OwnershipAcceptanceChanged { who: T::AccountId, maybe_collection: Option }, + OwnershipAcceptanceChanged { + who: T::AccountId, + maybe_collection: Option, + }, /// Max supply has been set for a collection. - CollectionMaxSupplySet { collection: T::CollectionId, max_supply: u32 }, + CollectionMaxSupplySet { + collection: T::CollectionId, + max_supply: u32, + }, /// The price was set for the instance. ItemPriceSet { collection: T::CollectionId, @@ -382,7 +428,10 @@ pub mod pallet { whitelisted_buyer: Option, }, /// The price for the instance was removed. - ItemPriceRemoved { collection: T::CollectionId, item: T::ItemId }, + ItemPriceRemoved { + collection: T::CollectionId, + item: T::ItemId, + }, /// An item was bought. ItemBought { collection: T::CollectionId, From 3cfe0cca57e0eb6a2247ccba5a4fac714c8e7fb7 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 09:11:38 +0200 Subject: [PATCH 05/31] fix benchmarks --- frame/nfts/src/benchmarking.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/nfts/src/benchmarking.rs b/frame/nfts/src/benchmarking.rs index e30b5ebbd3fe5..6b145e787a071 100644 --- a/frame/nfts/src/benchmarking.rs +++ b/frame/nfts/src/benchmarking.rs @@ -380,7 +380,7 @@ benchmarks_instance_pallet! { let delegate_lookup = T::Lookup::unlookup(delegate.clone()); let origin = SystemOrigin::Signed(caller.clone()).into(); Nfts::::approve_transfer(origin, collection, item, delegate_lookup.clone())?; - }: _(SystemOrigin::Signed(caller.clone()), collection, item, Some(delegate_lookup)) + }: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup) verify { assert_last_event::(Event::ApprovalCancelled { collection, item, owner: caller, delegate }.into()); } From 7a8391acfac1e9d2850050471d75672cc5e92a74 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 18:52:55 +0200 Subject: [PATCH 06/31] deadline --- frame/nfts/src/lib.rs | 12 +++++++++++- frame/nfts/src/tests.rs | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 14f3e700c290c..2093c1d1e5d26 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -450,6 +450,8 @@ pub mod pallet { UnknownCollection, /// The item ID has already been used for an item. AlreadyExists, + /// The approval had a deadline that expired, so the approval isn't valid anymore. + ApprovalExpired, /// The owner turned out to be different to what was expected. WrongOwner, /// Invalid witness data given. @@ -699,6 +701,13 @@ pub mod pallet { if details.owner != origin && collection_details.admin != origin { let approved = details.approvals.contains_key(&origin); ensure!(approved, Error::::NoPermission); + + let deadline = + details.approvals.get(&origin).ok_or(Error::::NoPermission)?; + if let Some(d) = deadline { + let block_number = frame_system::Pallet::::block_number(); + ensure!(*d >= block_number, Error::::ApprovalExpired); + } } Ok(()) }) @@ -989,6 +998,7 @@ pub mod pallet { collection: T::CollectionId, item: T::ItemId, delegate: AccountIdLookupOf, + deadline: Option<::BlockNumber>, ) -> DispatchResult { let maybe_check: Option = T::ForceOrigin::try_origin(origin) .map(|_| None) @@ -1008,7 +1018,7 @@ pub mod pallet { details .approvals - .try_insert(delegate.clone(), None) + .try_insert(delegate.clone(), deadline) .map_err(|_| Error::::ReachedApprovalLimit)?; Item::::insert(&collection, &item, &details); diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 46e8f7c754ef9..32f6a30302749 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -180,7 +180,7 @@ fn transfer_should_work() { assert_eq!(items(), vec![(3, 0, 42)]); assert_noop!(Nfts::transfer(Origin::signed(2), 0, 42, 4), Error::::NoPermission); - assert_ok!(Nfts::approve_transfer(Origin::signed(3), 0, 42, 2)); + assert_ok!(Nfts::approve_transfer(Origin::signed(3), 0, 42, 2, None)); assert_ok!(Nfts::transfer(Origin::signed(2), 0, 42, 4)); }); } @@ -535,12 +535,12 @@ fn approval_lifecycle_works() { new_test_ext().execute_with(|| { assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); assert_ok!(Nfts::transfer(Origin::signed(3), 0, 42, 4)); assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 3), Error::::NoPermission); assert!(Item::::get(0, 42).unwrap().approvals.is_empty()); - assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 2)); + assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 2, None)); assert_ok!(Nfts::transfer(Origin::signed(2), 0, 42, 2)); }); } @@ -551,7 +551,7 @@ fn cancel_approval_works() { assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); assert_noop!( Nfts::cancel_approval(Origin::signed(2), 1, 42, 3), Error::::UnknownCollection @@ -583,9 +583,9 @@ fn approving_multiple_accounts_works() { assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 4)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 5)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 4, None)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 5, None)); assert_ok!(Nfts::transfer(Origin::signed(4), 0, 42, 6)); assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 7), Error::::NoPermission); @@ -600,11 +600,11 @@ fn approvals_limit_works() { assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); for i in 3..13 { - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, i)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, i, None)); } // the limit is 10 assert_noop!( - Nfts::approve_transfer(Origin::signed(2), 0, 42, 14), + Nfts::approve_transfer(Origin::signed(2), 0, 42, 14, None), Error::::ReachedApprovalLimit ); }); @@ -616,7 +616,7 @@ fn cancel_approval_works_with_admin() { assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); assert_noop!( Nfts::cancel_approval(Origin::signed(1), 1, 42, 1), Error::::UnknownCollection @@ -644,7 +644,7 @@ fn cancel_approval_works_with_force() { assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); assert_noop!( Nfts::cancel_approval(Origin::root(), 1, 42, 1), Error::::UnknownCollection From 21d5b81c4ea1377fdbea2bb85faf83de5548aea6 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sat, 3 Sep 2022 19:13:17 +0200 Subject: [PATCH 07/31] test deadline --- frame/nfts/src/tests.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 32f6a30302749..078e3ed5bd884 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -610,6 +610,31 @@ fn approvals_limit_works() { }); } +#[test] +fn approval_deadline_works() { + new_test_ext().execute_with(|| { + System::set_block_number(0); + assert!(System::block_number().is_zero()); + + assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); + assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); + + // the approval expires after the 2nd block. + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, Some(2))); + + System::set_block_number(3); + assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 4), Error::::ApprovalExpired); + System::set_block_number(1); + assert_ok!(Nfts::transfer(Origin::signed(3), 0, 42, 4)); + + // make a new approval with a deadline at the 4th block. + assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 6, Some(4))); + // this should still work. + System::set_block_number(4); + assert_ok!(Nfts::transfer(Origin::signed(6), 0, 42, 5)); + }); +} + #[test] fn cancel_approval_works_with_admin() { new_test_ext().execute_with(|| { From 62e6371a60d9c1bd945e10c2470c419e8c311019 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sun, 4 Sep 2022 09:27:37 +0200 Subject: [PATCH 08/31] current_block + deadline --- frame/nfts/src/lib.rs | 8 +++++++- frame/nfts/src/tests.rs | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 2093c1d1e5d26..d28de63ae022d 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -988,6 +988,7 @@ pub mod pallet { /// - `collection`: The collection of the item to be approved for delegated transfer. /// - `item`: The item of the item to be approved for delegated transfer. /// - `delegate`: The account to delegate permission to transfer the item. + /// - `maybe_deadline`: Optional deadline for the approval. /// /// Emits `ApprovedTransfer` on success. /// @@ -998,7 +999,7 @@ pub mod pallet { collection: T::CollectionId, item: T::ItemId, delegate: AccountIdLookupOf, - deadline: Option<::BlockNumber>, + maybe_deadline: Option<::BlockNumber>, ) -> DispatchResult { let maybe_check: Option = T::ForceOrigin::try_origin(origin) .map(|_| None) @@ -1016,6 +1017,11 @@ pub mod pallet { ensure!(permitted, Error::::NoPermission); } + let deadline = match maybe_deadline { + Some(d) => Some(d.saturating_add(frame_system::Pallet::::block_number())), + None => None, + }; + details .approvals .try_insert(delegate.clone(), deadline) diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 078e3ed5bd884..07f21b8208930 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -627,10 +627,11 @@ fn approval_deadline_works() { System::set_block_number(1); assert_ok!(Nfts::transfer(Origin::signed(3), 0, 42, 4)); - // make a new approval with a deadline at the 4th block. + assert_eq!(System::block_number(), 1); + // make a new approval with a deadline after 4 blocks, so it will expire after the 5th block. assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 6, Some(4))); // this should still work. - System::set_block_number(4); + System::set_block_number(5); assert_ok!(Nfts::transfer(Origin::signed(6), 0, 42, 5)); }); } From 8067c3b874eedc131b73c8b1f709039628ed2c33 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sun, 4 Sep 2022 09:56:16 +0200 Subject: [PATCH 09/31] update ApprovedTransfer event --- frame/nfts/src/lib.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index d28de63ae022d..0fe7e34abf941 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -59,7 +59,7 @@ pub use pallet::*; pub use types::*; pub use weights::WeightInfo; -type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; +type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; #[frame_support::pallet] pub mod pallet { @@ -162,8 +162,8 @@ pub mod pallet { } pub type ApprovalsOf = BoundedBTreeMap< - ::AccountId, - Option<::BlockNumber>, + ::AccountId, + Option<::BlockNumber>, >::ApprovalsLimit, >; @@ -351,6 +351,7 @@ pub mod pallet { item: T::ItemId, owner: T::AccountId, delegate: T::AccountId, + deadline: Option<::BlockNumber>, }, /// An approval for a `delegate` account to transfer the `item` of an item /// `collection` was cancelled by its `owner`. @@ -999,7 +1000,7 @@ pub mod pallet { collection: T::CollectionId, item: T::ItemId, delegate: AccountIdLookupOf, - maybe_deadline: Option<::BlockNumber>, + maybe_deadline: Option<::BlockNumber>, ) -> DispatchResult { let maybe_check: Option = T::ForceOrigin::try_origin(origin) .map(|_| None) @@ -1024,7 +1025,7 @@ pub mod pallet { details .approvals - .try_insert(delegate.clone(), deadline) + .try_insert(delegate.clone(), deadline.clone()) .map_err(|_| Error::::ReachedApprovalLimit)?; Item::::insert(&collection, &item, &details); @@ -1033,6 +1034,7 @@ pub mod pallet { item, owner: details.owner, delegate, + deadline, }); Ok(()) From d4d1fe26fa6433eb4301ae005a98746e7422ec53 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Mon, 5 Sep 2022 09:15:38 +0200 Subject: [PATCH 10/31] benchmark --- frame/nfts/src/benchmarking.rs | 21 ++++++++++++++++++--- frame/nfts/src/lib.rs | 2 +- frame/nfts/src/tests.rs | 3 ++- frame/nfts/src/weights.rs | 9 +++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/frame/nfts/src/benchmarking.rs b/frame/nfts/src/benchmarking.rs index 6b145e787a071..ca38851222e8d 100644 --- a/frame/nfts/src/benchmarking.rs +++ b/frame/nfts/src/benchmarking.rs @@ -368,9 +368,10 @@ benchmarks_instance_pallet! { let (item, ..) = mint_item::(0); let delegate: T::AccountId = account("delegate", 0, SEED); let delegate_lookup = T::Lookup::unlookup(delegate.clone()); - }: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup) + let deadline = T::BlockNumber::max_value(); + }: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup, Some(deadline)) verify { - assert_last_event::(Event::ApprovedTransfer { collection, item, owner: caller, delegate }.into()); + assert_last_event::(Event::ApprovedTransfer { collection, item, owner: caller, delegate, deadline: Some(deadline) }.into()); } cancel_approval { @@ -379,12 +380,26 @@ benchmarks_instance_pallet! { let delegate: T::AccountId = account("delegate", 0, SEED); let delegate_lookup = T::Lookup::unlookup(delegate.clone()); let origin = SystemOrigin::Signed(caller.clone()).into(); - Nfts::::approve_transfer(origin, collection, item, delegate_lookup.clone())?; + let deadline = T::BlockNumber::max_value(); + Nfts::::approve_transfer(origin, collection, item, delegate_lookup.clone(), Some(deadline))?; }: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup) verify { assert_last_event::(Event::ApprovalCancelled { collection, item, owner: caller, delegate }.into()); } + clear_all_transfer_approvals { + let (collection, caller, _) = create_collection::(); + let (item, ..) = mint_item::(0); + let delegate: T::AccountId = account("delegate", 0, SEED); + let delegate_lookup = T::Lookup::unlookup(delegate.clone()); + let origin = SystemOrigin::Signed(caller.clone()).into(); + let deadline = T::BlockNumber::max_value(); + Nfts::::approve_transfer(origin, collection, item, delegate_lookup.clone(), Some(deadline))?; + }: _(SystemOrigin::Signed(caller.clone()), collection, item) + verify { + assert_last_event::(Event::AllApprovalsCancelled {collection, item, owner: caller}.into()); + } + set_accept_ownership { let caller: T::AccountId = whitelisted_caller(); T::Currency::make_free_balance_be(&caller, DepositBalanceOf::::max_value()); diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 0fe7e34abf941..8f3722e63cb84 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1092,7 +1092,7 @@ pub mod pallet { Ok(()) } - #[pallet::weight(10_000)] + #[pallet::weight(T::WeightInfo::clear_all_transfer_approvals())] pub fn clear_all_transfer_approvals( origin: OriginFor, collection: T::CollectionId, diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 07f21b8208930..8ee77e39e35a4 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -628,7 +628,8 @@ fn approval_deadline_works() { assert_ok!(Nfts::transfer(Origin::signed(3), 0, 42, 4)); assert_eq!(System::block_number(), 1); - // make a new approval with a deadline after 4 blocks, so it will expire after the 5th block. + // make a new approval with a deadline after 4 blocks, so it will expire after the 5th + // block. assert_ok!(Nfts::approve_transfer(Origin::signed(4), 0, 42, 6, Some(4))); // this should still work. System::set_block_number(5); diff --git a/frame/nfts/src/weights.rs b/frame/nfts/src/weights.rs index 7537cd3b03e6b..8b9e0bfb87435 100644 --- a/frame/nfts/src/weights.rs +++ b/frame/nfts/src/weights.rs @@ -68,6 +68,7 @@ pub trait WeightInfo { fn clear_collection_metadata() -> Weight; fn approve_transfer() -> Weight; fn cancel_approval() -> Weight; + fn clear_all_transfer_approvals() -> Weight; fn set_accept_ownership() -> Weight; fn set_collection_max_supply() -> Weight; fn set_price() -> Weight; @@ -261,6 +262,10 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // NOTE: this is hand written, need to run the benchmark! + fn clear_all_transfer_approvals() -> Weight { + 10_000_000 as Weight + } // Storage: Uniques OwnershipAcceptance (r:1 w:1) fn set_accept_ownership() -> Weight { (24_076_000 as Weight) @@ -478,6 +483,10 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } + // NOTE: this is hand written, need to run the benchmark! + fn clear_all_transfer_approvals() -> Weight { + 10_000_000 as Weight + } // Storage: Uniques OwnershipAcceptance (r:1 w:1) fn set_accept_ownership() -> Weight { (24_076_000 as Weight) From 2d06e766a35e5a138fc0edd99641f538130aa99e Mon Sep 17 00:00:00 2001 From: Szegoo Date: Mon, 5 Sep 2022 09:42:55 +0200 Subject: [PATCH 11/31] docs --- frame/nfts/src/lib.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 8f3722e63cb84..036e11a30d513 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1040,7 +1040,7 @@ pub mod pallet { Ok(()) } - /// Cancel the prior approval for the transfer of an item by a delegate. + /// Cancel one of the transfer approvals for a specific item. /// /// Origin must be either: /// - the `Force` origin; @@ -1049,9 +1049,8 @@ pub mod pallet { /// /// Arguments: /// - `collection`: The collection of the item of whose approval will be cancelled. - /// - `item`: The item of the item of whose approval will be cancelled. - /// - `maybe_check_delegate`: If `Some` will ensure that the given account is the one to - /// which permission of transfer is delegated. + /// - `item`: The item of the collection of whose approval will be cancelled. + /// - `delegate`: The account that is going to loose their approval. /// /// Emits `ApprovalCancelled` on success. /// @@ -1092,6 +1091,20 @@ pub mod pallet { Ok(()) } + /// Cancel all the approvals of a specific item. + /// + /// Origin must be either: + /// - the `Force` origin; + /// - `Signed` with the signer being the Admin of the `collection`; + /// - `Signed` with the signer being the Owner of the `item`; + /// + /// Arguments: + /// - `collection`: The collection of the item of whose approvals will be cleared. + /// - `item`: The item of the collection of whose approvals will be cleared. + /// + /// Emits `AllApprovalsCancelled` on success. + /// + /// Weight: `O(1)` #[pallet::weight(T::WeightInfo::clear_all_transfer_approvals())] pub fn clear_all_transfer_approvals( origin: OriginFor, From 111adbbc204e9ba842dba4b1c92b5f917c03922b Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:54:10 +0200 Subject: [PATCH 12/31] Update frame/nfts/src/lib.rs Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> --- frame/nfts/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 036e11a30d513..6e5c8a14c09a7 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -361,7 +361,7 @@ pub mod pallet { owner: T::AccountId, delegate: T::AccountId, }, - // All approvals of an item got cancelled. + /// All approvals of an item got cancelled. AllApprovalsCancelled { collection: T::CollectionId, item: T::ItemId, From 3e7101d3717666036066aaa958c100a8e35e3e46 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Tue, 6 Sep 2022 19:54:08 +0200 Subject: [PATCH 13/31] fmt fix --- frame/nfts/src/lib.rs | 89 +++++++++---------------------------------- 1 file changed, 18 insertions(+), 71 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 6e5c8a14c09a7..378b7c494cdb0 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -281,26 +281,13 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event, I: 'static = ()> { /// A `collection` was created. - Created { - collection: T::CollectionId, - creator: T::AccountId, - owner: T::AccountId, - }, + Created { collection: T::CollectionId, creator: T::AccountId, owner: T::AccountId }, /// A `collection` was force-created. - ForceCreated { - collection: T::CollectionId, - owner: T::AccountId, - }, + ForceCreated { collection: T::CollectionId, owner: T::AccountId }, /// A `collection` was destroyed. - Destroyed { - collection: T::CollectionId, - }, + Destroyed { collection: T::CollectionId }, /// An `item` was issued. - Issued { - collection: T::CollectionId, - item: T::ItemId, - owner: T::AccountId, - }, + Issued { collection: T::CollectionId, item: T::ItemId, owner: T::AccountId }, /// An `item` was transferred. Transferred { collection: T::CollectionId, @@ -309,34 +296,17 @@ pub mod pallet { to: T::AccountId, }, /// An `item` was destroyed. - Burned { - collection: T::CollectionId, - item: T::ItemId, - owner: T::AccountId, - }, + Burned { collection: T::CollectionId, item: T::ItemId, owner: T::AccountId }, /// Some `item` was frozen. - Frozen { - collection: T::CollectionId, - item: T::ItemId, - }, + Frozen { collection: T::CollectionId, item: T::ItemId }, /// Some `item` was thawed. - Thawed { - collection: T::CollectionId, - item: T::ItemId, - }, + Thawed { collection: T::CollectionId, item: T::ItemId }, /// Some `collection` was frozen. - CollectionFrozen { - collection: T::CollectionId, - }, + CollectionFrozen { collection: T::CollectionId }, /// Some `collection` was thawed. - CollectionThawed { - collection: T::CollectionId, - }, + CollectionThawed { collection: T::CollectionId }, /// The owner changed. - OwnerChanged { - collection: T::CollectionId, - new_owner: T::AccountId, - }, + OwnerChanged { collection: T::CollectionId, new_owner: T::AccountId }, /// The management team changed. TeamChanged { collection: T::CollectionId, @@ -362,15 +332,9 @@ pub mod pallet { delegate: T::AccountId, }, /// All approvals of an item got cancelled. - AllApprovalsCancelled { - collection: T::CollectionId, - item: T::ItemId, - owner: T::AccountId, - }, + AllApprovalsCancelled { collection: T::CollectionId, item: T::ItemId, owner: T::AccountId }, /// A `collection` has had its attributes changed by the `Force` origin. - ItemStatusChanged { - collection: T::CollectionId, - }, + ItemStatusChanged { collection: T::CollectionId }, /// New metadata has been set for a `collection`. CollectionMetadataSet { collection: T::CollectionId, @@ -378,9 +342,7 @@ pub mod pallet { is_frozen: bool, }, /// Metadata has been cleared for a `collection`. - CollectionMetadataCleared { - collection: T::CollectionId, - }, + CollectionMetadataCleared { collection: T::CollectionId }, /// New metadata has been set for an item. MetadataSet { collection: T::CollectionId, @@ -389,15 +351,9 @@ pub mod pallet { is_frozen: bool, }, /// Metadata has been cleared for an item. - MetadataCleared { - collection: T::CollectionId, - item: T::ItemId, - }, + MetadataCleared { collection: T::CollectionId, item: T::ItemId }, /// Metadata has been cleared for an item. - Redeposited { - collection: T::CollectionId, - successful_items: Vec, - }, + Redeposited { collection: T::CollectionId, successful_items: Vec }, /// New attribute metadata has been set for a `collection` or `item`. AttributeSet { collection: T::CollectionId, @@ -412,15 +368,9 @@ pub mod pallet { key: BoundedVec, }, /// Ownership acceptance has changed for an account. - OwnershipAcceptanceChanged { - who: T::AccountId, - maybe_collection: Option, - }, + OwnershipAcceptanceChanged { who: T::AccountId, maybe_collection: Option }, /// Max supply has been set for a collection. - CollectionMaxSupplySet { - collection: T::CollectionId, - max_supply: u32, - }, + CollectionMaxSupplySet { collection: T::CollectionId, max_supply: u32 }, /// The price was set for the instance. ItemPriceSet { collection: T::CollectionId, @@ -429,10 +379,7 @@ pub mod pallet { whitelisted_buyer: Option, }, /// The price for the instance was removed. - ItemPriceRemoved { - collection: T::CollectionId, - item: T::ItemId, - }, + ItemPriceRemoved { collection: T::CollectionId, item: T::ItemId }, /// An item was bought. ItemBought { collection: T::CollectionId, From 2247ee5f1c8ad8995936f7aa660ea4ee16de3f18 Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Wed, 7 Sep 2022 14:18:05 +0200 Subject: [PATCH 14/31] Update frame/nfts/src/lib.rs Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> --- frame/nfts/src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 378b7c494cdb0..dc8a4c01fffc3 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -965,10 +965,8 @@ pub mod pallet { ensure!(permitted, Error::::NoPermission); } - let deadline = match maybe_deadline { - Some(d) => Some(d.saturating_add(frame_system::Pallet::::block_number())), - None => None, - }; + let now = frame_system::Pallet::::block_number(); + let deadline = maybe_deadline.map(|d| d.saturating_add(now)); details .approvals From 0a307321186bfdff887938aa907bee413a3ebcbf Mon Sep 17 00:00:00 2001 From: Szegoo Date: Wed, 7 Sep 2022 19:38:12 +0200 Subject: [PATCH 15/31] update tests --- frame/nfts/src/tests.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 8ee77e39e35a4..b046f839ae96b 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -70,6 +70,12 @@ fn attributes(collection: u32) -> Vec<(Option, Vec, Vec)> { s } +fn approvals(collection_id: u32, item_id: u32) -> Vec<(u64, Option)> { + let item = Item::::get(collection_id, item_id).unwrap(); + let s: Vec<_> = item.approvals.into_iter().collect(); + s +} + fn events() -> Vec> { let result = System::events() .into_iter() @@ -583,9 +589,12 @@ fn approving_multiple_accounts_works() { assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); + let current_block = 1; + System::set_block_number(current_block); assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 4, None)); - assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 5, None)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 5, Some(2))); + assert_eq!(approvals(0, 42), vec![(3, None), (4, None), (5, Some(current_block + 2))]); assert_ok!(Nfts::transfer(Origin::signed(4), 0, 42, 6)); assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 7), Error::::NoPermission); @@ -687,6 +696,33 @@ fn cancel_approval_works_with_force() { }); } +#[test] +fn clear_all_transfer_approvals_works() { + new_test_ext().execute_with(|| { + assert_ok!(Nfts::force_create(Origin::root(), 0, 1, true)); + assert_ok!(Nfts::mint(Origin::signed(1), 0, 42, 2)); + + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, None)); + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 4, None)); + + assert_noop!( + Nfts::clear_all_transfer_approvals(Origin::signed(3), 0, 42), + Error::::NoPermission + ); + + assert_ok!(Nfts::clear_all_transfer_approvals(Origin::signed(2), 0, 42)); + + assert!(events().contains(&Event::::AllApprovalsCancelled { + collection: 0, + item: 42, + owner: 2, + })); + + assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 5), Error::::NoPermission); + assert_noop!(Nfts::transfer(Origin::signed(4), 0, 42, 5), Error::::NoPermission); + }); +} + #[test] fn max_supply_should_work() { new_test_ext().execute_with(|| { From 7bf02608acc60441a3b42f3cb05240b6dde34729 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Thu, 8 Sep 2022 08:32:26 +0200 Subject: [PATCH 16/31] anyone can cancel --- frame/nfts/src/lib.rs | 11 +++++++++-- frame/nfts/src/tests.rs | 12 ++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index dc8a4c01fffc3..e9dd6413163e4 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1018,8 +1018,15 @@ pub mod pallet { let mut details = Item::::get(&collection, &item).ok_or(Error::::UnknownCollection)?; if let Some(check) = maybe_check { - let permitted = check == collection_details.admin || check == details.owner; - ensure!(permitted, Error::::NoPermission); + let deadline = + details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; + if let Some(d) = deadline { + let now = frame_system::Pallet::::block_number(); + ensure!(*d < now, Error::::NoPermission); + }else { + let permitted = check == collection_details.admin || check == details.owner; + ensure!(permitted, Error::::NoPermission); + } } ensure!(details.approvals.contains_key(&delegate), Error::::NotDelegate); diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index b046f839ae96b..41921ea5db5f1 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -580,6 +580,18 @@ fn cancel_approval_works() { Nfts::cancel_approval(Origin::signed(2), 0, 42, 3), Error::::NotDelegate ); + + let current_block = 1; + System::set_block_number(current_block); + assert_ok!(Nfts::mint(Origin::signed(1), 0, 69, 2)); + // approval expires after 2 blocks. + assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, Some(2))); + assert_noop!(Nfts::cancel_approval(Origin::signed(5), 0, 42, 3), Error::::NoPermission); + + System::set_block_number(current_block + 3); + // 5 can cancel the approval since the deadline has passed. + assert_ok!(Nfts::cancel_approval(Origin::signed(5), 0, 42, 3)); + assert_eq!(approvals(0, 69), vec![]); }); } From b7a50f354acfffa4f50268eece48d2b8f9613b37 Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Thu, 8 Sep 2022 08:47:29 +0200 Subject: [PATCH 17/31] Update frame/nfts/src/tests.rs Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> --- frame/nfts/src/tests.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index 41921ea5db5f1..cb7b8ce0c5d20 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -729,6 +729,7 @@ fn clear_all_transfer_approvals_works() { item: 42, owner: 2, })); + assert_eq!(approvals(0, 42), vec![]); assert_noop!(Nfts::transfer(Origin::signed(3), 0, 42, 5), Error::::NoPermission); assert_noop!(Nfts::transfer(Origin::signed(4), 0, 42, 5), Error::::NoPermission); From 9c57d52247ebb4d084002029890e140ba52486cc Mon Sep 17 00:00:00 2001 From: Szegoo Date: Thu, 8 Sep 2022 08:49:19 +0200 Subject: [PATCH 18/31] fmt --- frame/nfts/src/lib.rs | 2 +- frame/nfts/src/tests.rs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index e9dd6413163e4..00f5fb0c73ce0 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1023,7 +1023,7 @@ pub mod pallet { if let Some(d) = deadline { let now = frame_system::Pallet::::block_number(); ensure!(*d < now, Error::::NoPermission); - }else { + } else { let permitted = check == collection_details.admin || check == details.owner; ensure!(permitted, Error::::NoPermission); } diff --git a/frame/nfts/src/tests.rs b/frame/nfts/src/tests.rs index cb7b8ce0c5d20..9fb29d0e95c26 100644 --- a/frame/nfts/src/tests.rs +++ b/frame/nfts/src/tests.rs @@ -586,7 +586,10 @@ fn cancel_approval_works() { assert_ok!(Nfts::mint(Origin::signed(1), 0, 69, 2)); // approval expires after 2 blocks. assert_ok!(Nfts::approve_transfer(Origin::signed(2), 0, 42, 3, Some(2))); - assert_noop!(Nfts::cancel_approval(Origin::signed(5), 0, 42, 3), Error::::NoPermission); + assert_noop!( + Nfts::cancel_approval(Origin::signed(5), 0, 42, 3), + Error::::NoPermission + ); System::set_block_number(current_block + 3); // 5 can cancel the approval since the deadline has passed. From a8371b34a70d157e6cca2a4252a0dba367b97fa9 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Thu, 8 Sep 2022 09:08:17 +0200 Subject: [PATCH 19/31] fix logic --- frame/nfts/src/lib.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 00f5fb0c73ce0..08b3a4c2b7bf2 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1017,13 +1017,19 @@ pub mod pallet { Collection::::get(&collection).ok_or(Error::::UnknownCollection)?; let mut details = Item::::get(&collection, &item).ok_or(Error::::UnknownCollection)?; - if let Some(check) = maybe_check { - let deadline = - details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; - if let Some(d) = deadline { - let now = frame_system::Pallet::::block_number(); - ensure!(*d < now, Error::::NoPermission); - } else { + + let mut is_past_deadline = false; + let deadline = details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; + + if let Some(d) = deadline { + let now = frame_system::Pallet::::block_number(); + if *d < now { + is_past_deadline = true; + } + } + + if !is_past_deadline { + if let Some(check) = maybe_check { let permitted = check == collection_details.admin || check == details.owner; ensure!(permitted, Error::::NoPermission); } From b552b2e5e826af1561f54a32a6b65c9d0547d0d0 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Thu, 8 Sep 2022 10:42:50 +0200 Subject: [PATCH 20/31] unnecessary line --- frame/nfts/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 08b3a4c2b7bf2..ff1839bf31ae6 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1035,8 +1035,6 @@ pub mod pallet { } } - ensure!(details.approvals.contains_key(&delegate), Error::::NotDelegate); - details.approvals.remove(&delegate); Item::::insert(&collection, &item, &details); Self::deposit_event(Event::ApprovalCancelled { From 00a271c495ced66d68aa63945c341d332d33fb21 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Thu, 8 Sep 2022 12:38:43 +0000 Subject: [PATCH 21/31] ".git/.scripts/bench-bot.sh" pallet dev pallet_nfts --- frame/nfts/src/weights.rs | 408 +++++++++++++++++++------------------- 1 file changed, 207 insertions(+), 201 deletions(-) diff --git a/frame/nfts/src/weights.rs b/frame/nfts/src/weights.rs index 8b9e0bfb87435..ad3173b11f262 100644 --- a/frame/nfts/src/weights.rs +++ b/frame/nfts/src/weights.rs @@ -18,12 +18,12 @@ //! Autogenerated weights for pallet_nfts //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-07-13, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! HOSTNAME: `test-bench-bot`, CPU: `Intel(R) Xeon(R) CPU @ 3.10GHz` +//! DATE: 2022-09-08, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: -// target/production/substrate +// /home/benchbot/cargo_target_dir/production/substrate // benchmark // pallet // --steps=50 @@ -78,39 +78,39 @@ pub trait WeightInfo { /// Weights for pallet_nfts using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:1) fn create() -> Weight { - (33_075_000 as Weight) + (32_564_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:1) fn force_create() -> Weight { - (19_528_000 as Weight) + (20_448_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques Asset (r:1 w:0) - // Storage: Uniques ClassAccount (r:0 w:1) - // Storage: Uniques Attribute (r:0 w:1000) - // Storage: Uniques ClassMetadataOf (r:0 w:1) - // Storage: Uniques InstanceMetadataOf (r:0 w:1000) - // Storage: Uniques CollectionMaxSupply (r:0 w:1) - // Storage: Uniques Account (r:0 w:20) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts Asset (r:1 w:0) + // Storage: Nfts ClassAccount (r:0 w:1) + // Storage: Nfts Attribute (r:0 w:1000) + // Storage: Nfts ClassMetadataOf (r:0 w:1) + // Storage: Nfts InstanceMetadataOf (r:0 w:1000) + // Storage: Nfts CollectionMaxSupply (r:0 w:1) + // Storage: Nfts Account (r:0 w:20) /// The range of component `n` is `[0, 1000]`. /// The range of component `m` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { (0 as Weight) - // Standard Error: 25_000 - .saturating_add((13_639_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 25_000 - .saturating_add((2_393_000 as Weight).saturating_mul(m as Weight)) - // Standard Error: 25_000 - .saturating_add((2_217_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 13_000 + .saturating_add((9_842_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 13_000 + .saturating_add((1_695_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 13_000 + .saturating_add((1_617_000 as Weight).saturating_mul(a as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(n as Weight))) .saturating_add(T::DbWeight::get().writes(4 as Weight)) @@ -118,180 +118,183 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(m as Weight))) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques CollectionMaxSupply (r:1 w:0) - // Storage: Uniques Account (r:0 w:1) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts CollectionMaxSupply (r:1 w:0) + // Storage: Nfts Account (r:0 w:1) fn mint() -> Weight { - (42_146_000 as Weight) + (41_868_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Account (r:0 w:1) - // Storage: Uniques ItemPriceOf (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Account (r:0 w:1) + // Storage: Nfts ItemPriceOf (r:0 w:1) fn burn() -> Weight { - (42_960_000 as Weight) + (42_815_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Account (r:0 w:2) - // Storage: Uniques ItemPriceOf (r:0 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Account (r:0 w:2) + // Storage: Nfts ItemPriceOf (r:0 w:1) fn transfer() -> Weight { - (33_025_000 as Weight) + (33_593_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques Asset (r:100 w:100) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts Asset (r:102 w:102) /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { (0 as Weight) - // Standard Error: 24_000 - .saturating_add((15_540_000 as Weight).saturating_mul(i as Weight)) + // Standard Error: 12_000 + .saturating_add((11_005_000 as Weight).saturating_mul(i as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(i as Weight))) .saturating_add(T::DbWeight::get().writes(1 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) fn freeze() -> Weight { - (25_194_000 as Weight) + (26_807_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) fn thaw() -> Weight { - (25_397_000 as Weight) + (26_654_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) fn freeze_collection() -> Weight { - (19_278_000 as Weight) + (22_118_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) fn thaw_collection() -> Weight { - (19_304_000 as Weight) + (21_747_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques OwnershipAcceptance (r:1 w:1) - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:2) + // Storage: Nfts OwnershipAcceptance (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:2) fn transfer_ownership() -> Weight { - (28_615_000 as Weight) + (30_510_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } - // Storage: Uniques Class (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) fn set_team() -> Weight { - (19_943_000 as Weight) + (23_375_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:1) fn force_item_status() -> Weight { - (22_583_000 as Weight) + (24_905_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:0) - // Storage: Uniques Attribute (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:0) + // Storage: Nfts Attribute (r:1 w:1) fn set_attribute() -> Weight { - (47_520_000 as Weight) + (47_436_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:0) - // Storage: Uniques Attribute (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:0) + // Storage: Nfts Attribute (r:1 w:1) fn clear_attribute() -> Weight { - (45_316_000 as Weight) + (46_314_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn set_metadata() -> Weight { - (38_391_000 as Weight) + (39_100_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn clear_metadata() -> Weight { - (38_023_000 as Weight) + (40_551_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassMetadataOf (r:1 w:1) fn set_collection_metadata() -> Weight { - (37_398_000 as Weight) + (38_086_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques ClassMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts ClassMetadataOf (r:1 w:1) fn clear_collection_metadata() -> Weight { - (35_621_000 as Weight) + (37_407_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) fn approve_transfer() -> Weight { - (25_856_000 as Weight) + (29_241_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) fn cancel_approval() -> Weight { - (26_098_000 as Weight) + (28_857_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // NOTE: this is hand written, need to run the benchmark! + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) fn clear_all_transfer_approvals() -> Weight { - 10_000_000 as Weight + (27_779_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques OwnershipAcceptance (r:1 w:1) + // Storage: Nfts OwnershipAcceptance (r:1 w:1) fn set_accept_ownership() -> Weight { - (24_076_000 as Weight) + (25_718_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques CollectionMaxSupply (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) + // Storage: Nfts CollectionMaxSupply (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) fn set_collection_max_supply() -> Weight { - (22_035_000 as Weight) + (23_601_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Asset (r:1 w:0) - // Storage: Uniques ItemPriceOf (r:0 w:1) + // Storage: Nfts Asset (r:1 w:0) + // Storage: Nfts ItemPriceOf (r:0 w:1) fn set_price() -> Weight { - (22_534_000 as Weight) + (25_306_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques ItemPriceOf (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Account (r:0 w:2) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts ItemPriceOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Account (r:0 w:2) fn buy_item() -> Weight { - (45_272_000 as Weight) + (45_058_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -299,39 +302,39 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:1) fn create() -> Weight { - (33_075_000 as Weight) + (32_564_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:1) fn force_create() -> Weight { - (19_528_000 as Weight) + (20_448_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques Asset (r:1 w:0) - // Storage: Uniques ClassAccount (r:0 w:1) - // Storage: Uniques Attribute (r:0 w:1000) - // Storage: Uniques ClassMetadataOf (r:0 w:1) - // Storage: Uniques InstanceMetadataOf (r:0 w:1000) - // Storage: Uniques CollectionMaxSupply (r:0 w:1) - // Storage: Uniques Account (r:0 w:20) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts Asset (r:1 w:0) + // Storage: Nfts ClassAccount (r:0 w:1) + // Storage: Nfts Attribute (r:0 w:1000) + // Storage: Nfts ClassMetadataOf (r:0 w:1) + // Storage: Nfts InstanceMetadataOf (r:0 w:1000) + // Storage: Nfts CollectionMaxSupply (r:0 w:1) + // Storage: Nfts Account (r:0 w:20) /// The range of component `n` is `[0, 1000]`. /// The range of component `m` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { (0 as Weight) - // Standard Error: 25_000 - .saturating_add((13_639_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 25_000 - .saturating_add((2_393_000 as Weight).saturating_mul(m as Weight)) - // Standard Error: 25_000 - .saturating_add((2_217_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 13_000 + .saturating_add((9_842_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 13_000 + .saturating_add((1_695_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 13_000 + .saturating_add((1_617_000 as Weight).saturating_mul(a as Weight)) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(n as Weight))) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) @@ -339,180 +342,183 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(m as Weight))) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques CollectionMaxSupply (r:1 w:0) - // Storage: Uniques Account (r:0 w:1) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts CollectionMaxSupply (r:1 w:0) + // Storage: Nfts Account (r:0 w:1) fn mint() -> Weight { - (42_146_000 as Weight) + (41_868_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Account (r:0 w:1) - // Storage: Uniques ItemPriceOf (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Account (r:0 w:1) + // Storage: Nfts ItemPriceOf (r:0 w:1) fn burn() -> Weight { - (42_960_000 as Weight) + (42_815_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Account (r:0 w:2) - // Storage: Uniques ItemPriceOf (r:0 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Account (r:0 w:2) + // Storage: Nfts ItemPriceOf (r:0 w:1) fn transfer() -> Weight { - (33_025_000 as Weight) + (33_593_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques Asset (r:100 w:100) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts Asset (r:102 w:102) /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { (0 as Weight) - // Standard Error: 24_000 - .saturating_add((15_540_000 as Weight).saturating_mul(i as Weight)) + // Standard Error: 12_000 + .saturating_add((11_005_000 as Weight).saturating_mul(i as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(i as Weight))) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) fn freeze() -> Weight { - (25_194_000 as Weight) + (26_807_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) fn thaw() -> Weight { - (25_397_000 as Weight) + (26_654_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) fn freeze_collection() -> Weight { - (19_278_000 as Weight) + (22_118_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) fn thaw_collection() -> Weight { - (19_304_000 as Weight) + (21_747_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques OwnershipAcceptance (r:1 w:1) - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:2) + // Storage: Nfts OwnershipAcceptance (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:2) fn transfer_ownership() -> Weight { - (28_615_000 as Weight) + (30_510_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } - // Storage: Uniques Class (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) fn set_team() -> Weight { - (19_943_000 as Weight) + (23_375_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassAccount (r:0 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassAccount (r:0 w:1) fn force_item_status() -> Weight { - (22_583_000 as Weight) + (24_905_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:0) - // Storage: Uniques Attribute (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:0) + // Storage: Nfts Attribute (r:1 w:1) fn set_attribute() -> Weight { - (47_520_000 as Weight) + (47_436_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:0) - // Storage: Uniques Attribute (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:0) + // Storage: Nfts Attribute (r:1 w:1) fn clear_attribute() -> Weight { - (45_316_000 as Weight) + (46_314_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn set_metadata() -> Weight { - (38_391_000 as Weight) + (39_100_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques InstanceMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn clear_metadata() -> Weight { - (38_023_000 as Weight) + (40_551_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:1) - // Storage: Uniques ClassMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:1) + // Storage: Nfts ClassMetadataOf (r:1 w:1) fn set_collection_metadata() -> Weight { - (37_398_000 as Weight) + (38_086_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques ClassMetadataOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts ClassMetadataOf (r:1 w:1) fn clear_collection_metadata() -> Weight { - (35_621_000 as Weight) + (37_407_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) fn approve_transfer() -> Weight { - (25_856_000 as Weight) + (29_241_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Asset (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) fn cancel_approval() -> Weight { - (26_098_000 as Weight) + (28_857_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // NOTE: this is hand written, need to run the benchmark! + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Asset (r:1 w:1) fn clear_all_transfer_approvals() -> Weight { - 10_000_000 as Weight + (27_779_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(2 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques OwnershipAcceptance (r:1 w:1) + // Storage: Nfts OwnershipAcceptance (r:1 w:1) fn set_accept_ownership() -> Weight { - (24_076_000 as Weight) + (25_718_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques CollectionMaxSupply (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) + // Storage: Nfts CollectionMaxSupply (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) fn set_collection_max_supply() -> Weight { - (22_035_000 as Weight) + (23_601_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Asset (r:1 w:0) - // Storage: Uniques ItemPriceOf (r:0 w:1) + // Storage: Nfts Asset (r:1 w:0) + // Storage: Nfts ItemPriceOf (r:0 w:1) fn set_price() -> Weight { - (22_534_000 as Weight) + (25_306_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } - // Storage: Uniques Asset (r:1 w:1) - // Storage: Uniques ItemPriceOf (r:1 w:1) - // Storage: Uniques Class (r:1 w:0) - // Storage: Uniques Account (r:0 w:2) + // Storage: Nfts Asset (r:1 w:1) + // Storage: Nfts ItemPriceOf (r:1 w:1) + // Storage: Nfts Class (r:1 w:0) + // Storage: Nfts Account (r:0 w:2) fn buy_item() -> Weight { - (45_272_000 as Weight) + (45_058_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } From 2a4775ca497485e44ed27857013deb1b6427b45b Mon Sep 17 00:00:00 2001 From: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Date: Thu, 8 Sep 2022 17:02:41 +0300 Subject: [PATCH 22/31] Update frame/nfts/src/lib.rs --- frame/nfts/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index ff1839bf31ae6..6ae8da24dfb88 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -970,7 +970,7 @@ pub mod pallet { details .approvals - .try_insert(delegate.clone(), deadline.clone()) + .try_insert(delegate.clone(), deadline) .map_err(|_| Error::::ReachedApprovalLimit)?; Item::::insert(&collection, &item, &details); From 5c8d01a5e512159dcf493fe0be46886e31db94f8 Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Thu, 8 Sep 2022 18:11:24 +0200 Subject: [PATCH 23/31] Update lib.rs --- frame/nfts/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 6ae8da24dfb88..ef16b0f7e1bc9 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -936,7 +936,8 @@ pub mod pallet { /// - `collection`: The collection of the item to be approved for delegated transfer. /// - `item`: The item of the item to be approved for delegated transfer. /// - `delegate`: The account to delegate permission to transfer the item. - /// - `maybe_deadline`: Optional deadline for the approval. + /// - `maybe_deadline`: Optional deadline for the approval. Specified by providing the + /// number of blocks after which the approval will expire /// /// Emits `ApprovedTransfer` on success. /// From 0629062fb9da35e599fffe81e9ec32ffe15297c8 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Thu, 8 Sep 2022 18:11:57 +0200 Subject: [PATCH 24/31] fmt --- frame/nfts/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index ef16b0f7e1bc9..1ed88dd4fdb07 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -936,7 +936,7 @@ pub mod pallet { /// - `collection`: The collection of the item to be approved for delegated transfer. /// - `item`: The item of the item to be approved for delegated transfer. /// - `delegate`: The account to delegate permission to transfer the item. - /// - `maybe_deadline`: Optional deadline for the approval. Specified by providing the + /// - `maybe_deadline`: Optional deadline for the approval. Specified by providing the /// number of blocks after which the approval will expire /// /// Emits `ApprovedTransfer` on success. From e8eec8b70196092aa4043fec12834417ebfae262 Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Fri, 9 Sep 2022 11:18:38 +0200 Subject: [PATCH 25/31] Update frame/nfts/src/lib.rs Co-authored-by: Squirrel --- frame/nfts/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 1ed88dd4fdb07..fabbcf3f86db3 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -647,8 +647,6 @@ pub mod pallet { Self::do_transfer(collection, item, dest, |collection_details, details| { if details.owner != origin && collection_details.admin != origin { - let approved = details.approvals.contains_key(&origin); - ensure!(approved, Error::::NoPermission); let deadline = details.approvals.get(&origin).ok_or(Error::::NoPermission)?; From 5ec3892604c1c19bc8fd16a57c6f0bef015c305e Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Fri, 9 Sep 2022 11:19:12 +0200 Subject: [PATCH 26/31] Update frame/nfts/src/lib.rs Co-authored-by: Squirrel --- frame/nfts/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index fabbcf3f86db3..bfaf91416bf31 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -652,7 +652,7 @@ pub mod pallet { details.approvals.get(&origin).ok_or(Error::::NoPermission)?; if let Some(d) = deadline { let block_number = frame_system::Pallet::::block_number(); - ensure!(*d >= block_number, Error::::ApprovalExpired); + ensure!(block_number <= *d, Error::::ApprovalExpired); } } Ok(()) From f496fa79e3f17f7027f60cbd5a5d0c13a2ac790c Mon Sep 17 00:00:00 2001 From: Szegoo Date: Fri, 9 Sep 2022 11:39:13 +0200 Subject: [PATCH 27/31] fmt --- frame/nfts/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index bfaf91416bf31..525b914a49fd0 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -647,7 +647,6 @@ pub mod pallet { Self::do_transfer(collection, item, dest, |collection_details, details| { if details.owner != origin && collection_details.admin != origin { - let deadline = details.approvals.get(&origin).ok_or(Error::::NoPermission)?; if let Some(d) = deadline { From 5697cbba158b12c362407a5388ede848469a48dc Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Fri, 9 Sep 2022 11:42:29 +0200 Subject: [PATCH 28/31] Update frame/nfts/src/lib.rs Co-authored-by: Squirrel --- frame/nfts/src/lib.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 525b914a49fd0..1c515a3e19550 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1016,17 +1016,15 @@ pub mod pallet { let mut details = Item::::get(&collection, &item).ok_or(Error::::UnknownCollection)?; - let mut is_past_deadline = false; let deadline = details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; - - if let Some(d) = deadline { + let is_before_deadline = if let Some(d) = deadline { let now = frame_system::Pallet::::block_number(); - if *d < now { - is_past_deadline = true; - } - } + now <= *d + } else { + false + }; - if !is_past_deadline { + if is_before_deadline { if let Some(check) = maybe_check { let permitted = check == collection_details.admin || check == details.owner; ensure!(permitted, Error::::NoPermission); From 5be3e146f2b3b9447eefc78182d2b95df4ed75ff Mon Sep 17 00:00:00 2001 From: Szegoo Date: Fri, 9 Sep 2022 11:55:42 +0200 Subject: [PATCH 29/31] suggestion --- frame/nfts/src/lib.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 1c515a3e19550..646d8418eb642 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1016,15 +1016,16 @@ pub mod pallet { let mut details = Item::::get(&collection, &item).ok_or(Error::::UnknownCollection)?; - let deadline = details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; - let is_before_deadline = if let Some(d) = deadline { + let maybe_deadline = + details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; + let is_past_deadline = if let Some(deadline) = maybe_deadline { let now = frame_system::Pallet::::block_number(); - now <= *d - } else { - false + now > *deadline + } else { + false }; - if is_before_deadline { + if !is_past_deadline { if let Some(check) = maybe_check { let permitted = check == collection_details.admin || check == details.owner; ensure!(permitted, Error::::NoPermission); From f8319df674fb84e73ae9b07c2791431901ee8699 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Fri, 9 Sep 2022 12:16:53 +0200 Subject: [PATCH 30/31] new line --- frame/nfts/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/frame/nfts/src/lib.rs b/frame/nfts/src/lib.rs index 646d8418eb642..14691c21a0ef2 100644 --- a/frame/nfts/src/lib.rs +++ b/frame/nfts/src/lib.rs @@ -1018,6 +1018,7 @@ pub mod pallet { let maybe_deadline = details.approvals.get(&delegate).ok_or(Error::::NotDelegate)?; + let is_past_deadline = if let Some(deadline) = maybe_deadline { let now = frame_system::Pallet::::block_number(); now > *deadline From 550f9344ce2d751f19fd8e6718320620c3718249 Mon Sep 17 00:00:00 2001 From: command-bot <> Date: Fri, 9 Sep 2022 16:04:33 +0000 Subject: [PATCH 31/31] ".git/.scripts/bench-bot.sh" pallet dev pallet_nfts --- frame/nfts/src/weights.rs | 130 +++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/frame/nfts/src/weights.rs b/frame/nfts/src/weights.rs index 2325d9265f8b6..2c90ab54fe9fb 100644 --- a/frame/nfts/src/weights.rs +++ b/frame/nfts/src/weights.rs @@ -18,7 +18,7 @@ //! Autogenerated weights for pallet_nfts //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-09-08, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-09-09, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 @@ -81,14 +81,14 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:1) fn create() -> Weight { - Weight::from_ref_time(32_564_000 as u64) + Weight::from_ref_time(33_018_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:1) fn force_create() -> Weight { - Weight::from_ref_time(20_448_000 as u64) + Weight::from_ref_time(20_957_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } @@ -105,12 +105,12 @@ impl WeightInfo for SubstrateWeight { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { Weight::from_ref_time(0 as u64) - // Standard Error: 13_000 - .saturating_add(Weight::from_ref_time(9_842_000 as u64).saturating_mul(n as u64)) - // Standard Error: 13_000 - .saturating_add(Weight::from_ref_time(1_695_000 as u64).saturating_mul(m as u64)) - // Standard Error: 13_000 - .saturating_add(Weight::from_ref_time(1_617_000 as u64).saturating_mul(a as u64)) + // Standard Error: 12_000 + .saturating_add(Weight::from_ref_time(10_091_000 as u64).saturating_mul(n as u64)) + // Standard Error: 12_000 + .saturating_add(Weight::from_ref_time(1_748_000 as u64).saturating_mul(m as u64)) + // Standard Error: 12_000 + .saturating_add(Weight::from_ref_time(1_621_000 as u64).saturating_mul(a as u64)) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(n as u64))) .saturating_add(T::DbWeight::get().writes(4 as u64)) @@ -123,7 +123,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts CollectionMaxSupply (r:1 w:0) // Storage: Nfts Account (r:0 w:1) fn mint() -> Weight { - Weight::from_ref_time(41_868_000 as u64) + Weight::from_ref_time(43_007_000 as u64) .saturating_add(T::DbWeight::get().reads(3 as u64)) .saturating_add(T::DbWeight::get().writes(3 as u64)) } @@ -132,7 +132,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts Account (r:0 w:1) // Storage: Nfts ItemPriceOf (r:0 w:1) fn burn() -> Weight { - Weight::from_ref_time(42_815_000 as u64) + Weight::from_ref_time(43_922_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(4 as u64)) } @@ -141,7 +141,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts Account (r:0 w:2) // Storage: Nfts ItemPriceOf (r:0 w:1) fn transfer() -> Weight { - Weight::from_ref_time(33_593_000 as u64) + Weight::from_ref_time(33_951_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(4 as u64)) } @@ -151,7 +151,7 @@ impl WeightInfo for SubstrateWeight { fn redeposit(i: u32, ) -> Weight { Weight::from_ref_time(0 as u64) // Standard Error: 12_000 - .saturating_add(Weight::from_ref_time(11_005_000 as u64).saturating_mul(i as u64)) + .saturating_add(Weight::from_ref_time(11_194_000 as u64).saturating_mul(i as u64)) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(i as u64))) .saturating_add(T::DbWeight::get().writes(1 as u64)) @@ -160,26 +160,26 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts Asset (r:1 w:1) // Storage: Nfts Class (r:1 w:0) fn freeze() -> Weight { - Weight::from_ref_time(26_807_000 as u64) + Weight::from_ref_time(26_745_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Asset (r:1 w:1) // Storage: Nfts Class (r:1 w:0) fn thaw() -> Weight { - Weight::from_ref_time(26_654_000 as u64) + Weight::from_ref_time(27_466_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:1) fn freeze_collection() -> Weight { - Weight::from_ref_time(22_118_000 as u64) + Weight::from_ref_time(22_591_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:1) fn thaw_collection() -> Weight { - Weight::from_ref_time(21_747_000 as u64) + Weight::from_ref_time(22_392_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } @@ -187,20 +187,20 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:2) fn transfer_ownership() -> Weight { - Weight::from_ref_time(30_510_000 as u64) + Weight::from_ref_time(31_202_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(4 as u64)) } // Storage: Nfts Class (r:1 w:1) fn set_team() -> Weight { - Weight::from_ref_time(23_375_000 as u64) + Weight::from_ref_time(23_063_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:1) fn force_item_status() -> Weight { - Weight::from_ref_time(24_905_000 as u64) + Weight::from_ref_time(25_598_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } @@ -208,7 +208,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts InstanceMetadataOf (r:1 w:0) // Storage: Nfts Attribute (r:1 w:1) fn set_attribute() -> Weight { - Weight::from_ref_time(47_436_000 as u64) + Weight::from_ref_time(48_684_000 as u64) .saturating_add(T::DbWeight::get().reads(3 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } @@ -216,76 +216,76 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts InstanceMetadataOf (r:1 w:0) // Storage: Nfts Attribute (r:1 w:1) fn clear_attribute() -> Weight { - Weight::from_ref_time(46_314_000 as u64) + Weight::from_ref_time(47_267_000 as u64) .saturating_add(T::DbWeight::get().reads(3 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn set_metadata() -> Weight { - Weight::from_ref_time(39_100_000 as u64) + Weight::from_ref_time(40_174_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn clear_metadata() -> Weight { - Weight::from_ref_time(40_551_000 as u64) + Weight::from_ref_time(41_611_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassMetadataOf (r:1 w:1) fn set_collection_metadata() -> Weight { - Weight::from_ref_time(38_086_000 as u64) + Weight::from_ref_time(40_073_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts ClassMetadataOf (r:1 w:1) fn clear_collection_metadata() -> Weight { - Weight::from_ref_time(37_407_000 as u64) + Weight::from_ref_time(38_191_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Asset (r:1 w:1) fn approve_transfer() -> Weight { - Weight::from_ref_time(29_241_000 as u64) + Weight::from_ref_time(29_461_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Asset (r:1 w:1) fn cancel_approval() -> Weight { - Weight::from_ref_time(28_857_000 as u64) + Weight::from_ref_time(29_690_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Asset (r:1 w:1) fn clear_all_transfer_approvals() -> Weight { - Weight::from_ref_time(27_779_000 as u64) + Weight::from_ref_time(27_758_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts OwnershipAcceptance (r:1 w:1) fn set_accept_ownership() -> Weight { - Weight::from_ref_time(25_718_000 as u64) + Weight::from_ref_time(26_425_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts CollectionMaxSupply (r:1 w:1) // Storage: Nfts Class (r:1 w:0) fn set_collection_max_supply() -> Weight { - Weight::from_ref_time(23_601_000 as u64) + Weight::from_ref_time(24_533_000 as u64) .saturating_add(T::DbWeight::get().reads(2 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: Nfts Asset (r:1 w:0) // Storage: Nfts ItemPriceOf (r:0 w:1) fn set_price() -> Weight { - Weight::from_ref_time(25_306_000 as u64) + Weight::from_ref_time(24_745_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } @@ -294,7 +294,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Account (r:0 w:2) fn buy_item() -> Weight { - Weight::from_ref_time(45_058_000 as u64) + Weight::from_ref_time(47_967_000 as u64) .saturating_add(T::DbWeight::get().reads(3 as u64)) .saturating_add(T::DbWeight::get().writes(4 as u64)) } @@ -305,14 +305,14 @@ impl WeightInfo for () { // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:1) fn create() -> Weight { - Weight::from_ref_time(32_564_000 as u64) + Weight::from_ref_time(33_018_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:1) fn force_create() -> Weight { - Weight::from_ref_time(20_448_000 as u64) + Weight::from_ref_time(20_957_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } @@ -329,12 +329,12 @@ impl WeightInfo for () { /// The range of component `a` is `[0, 1000]`. fn destroy(n: u32, m: u32, a: u32, ) -> Weight { Weight::from_ref_time(0 as u64) - // Standard Error: 13_000 - .saturating_add(Weight::from_ref_time(9_842_000 as u64).saturating_mul(n as u64)) - // Standard Error: 13_000 - .saturating_add(Weight::from_ref_time(1_695_000 as u64).saturating_mul(m as u64)) - // Standard Error: 13_000 - .saturating_add(Weight::from_ref_time(1_617_000 as u64).saturating_mul(a as u64)) + // Standard Error: 12_000 + .saturating_add(Weight::from_ref_time(10_091_000 as u64).saturating_mul(n as u64)) + // Standard Error: 12_000 + .saturating_add(Weight::from_ref_time(1_748_000 as u64).saturating_mul(m as u64)) + // Standard Error: 12_000 + .saturating_add(Weight::from_ref_time(1_621_000 as u64).saturating_mul(a as u64)) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(n as u64))) .saturating_add(RocksDbWeight::get().writes(4 as u64)) @@ -347,7 +347,7 @@ impl WeightInfo for () { // Storage: Nfts CollectionMaxSupply (r:1 w:0) // Storage: Nfts Account (r:0 w:1) fn mint() -> Weight { - Weight::from_ref_time(41_868_000 as u64) + Weight::from_ref_time(43_007_000 as u64) .saturating_add(RocksDbWeight::get().reads(3 as u64)) .saturating_add(RocksDbWeight::get().writes(3 as u64)) } @@ -356,7 +356,7 @@ impl WeightInfo for () { // Storage: Nfts Account (r:0 w:1) // Storage: Nfts ItemPriceOf (r:0 w:1) fn burn() -> Weight { - Weight::from_ref_time(42_815_000 as u64) + Weight::from_ref_time(43_922_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(4 as u64)) } @@ -365,7 +365,7 @@ impl WeightInfo for () { // Storage: Nfts Account (r:0 w:2) // Storage: Nfts ItemPriceOf (r:0 w:1) fn transfer() -> Weight { - Weight::from_ref_time(33_593_000 as u64) + Weight::from_ref_time(33_951_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(4 as u64)) } @@ -375,7 +375,7 @@ impl WeightInfo for () { fn redeposit(i: u32, ) -> Weight { Weight::from_ref_time(0 as u64) // Standard Error: 12_000 - .saturating_add(Weight::from_ref_time(11_005_000 as u64).saturating_mul(i as u64)) + .saturating_add(Weight::from_ref_time(11_194_000 as u64).saturating_mul(i as u64)) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(i as u64))) .saturating_add(RocksDbWeight::get().writes(1 as u64)) @@ -384,26 +384,26 @@ impl WeightInfo for () { // Storage: Nfts Asset (r:1 w:1) // Storage: Nfts Class (r:1 w:0) fn freeze() -> Weight { - Weight::from_ref_time(26_807_000 as u64) + Weight::from_ref_time(26_745_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Asset (r:1 w:1) // Storage: Nfts Class (r:1 w:0) fn thaw() -> Weight { - Weight::from_ref_time(26_654_000 as u64) + Weight::from_ref_time(27_466_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:1) fn freeze_collection() -> Weight { - Weight::from_ref_time(22_118_000 as u64) + Weight::from_ref_time(22_591_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:1) fn thaw_collection() -> Weight { - Weight::from_ref_time(21_747_000 as u64) + Weight::from_ref_time(22_392_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } @@ -411,20 +411,20 @@ impl WeightInfo for () { // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:2) fn transfer_ownership() -> Weight { - Weight::from_ref_time(30_510_000 as u64) + Weight::from_ref_time(31_202_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(4 as u64)) } // Storage: Nfts Class (r:1 w:1) fn set_team() -> Weight { - Weight::from_ref_time(23_375_000 as u64) + Weight::from_ref_time(23_063_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassAccount (r:0 w:1) fn force_item_status() -> Weight { - Weight::from_ref_time(24_905_000 as u64) + Weight::from_ref_time(25_598_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } @@ -432,7 +432,7 @@ impl WeightInfo for () { // Storage: Nfts InstanceMetadataOf (r:1 w:0) // Storage: Nfts Attribute (r:1 w:1) fn set_attribute() -> Weight { - Weight::from_ref_time(47_436_000 as u64) + Weight::from_ref_time(48_684_000 as u64) .saturating_add(RocksDbWeight::get().reads(3 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } @@ -440,76 +440,76 @@ impl WeightInfo for () { // Storage: Nfts InstanceMetadataOf (r:1 w:0) // Storage: Nfts Attribute (r:1 w:1) fn clear_attribute() -> Weight { - Weight::from_ref_time(46_314_000 as u64) + Weight::from_ref_time(47_267_000 as u64) .saturating_add(RocksDbWeight::get().reads(3 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn set_metadata() -> Weight { - Weight::from_ref_time(39_100_000 as u64) + Weight::from_ref_time(40_174_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts InstanceMetadataOf (r:1 w:1) fn clear_metadata() -> Weight { - Weight::from_ref_time(40_551_000 as u64) + Weight::from_ref_time(41_611_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:1) // Storage: Nfts ClassMetadataOf (r:1 w:1) fn set_collection_metadata() -> Weight { - Weight::from_ref_time(38_086_000 as u64) + Weight::from_ref_time(40_073_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(2 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts ClassMetadataOf (r:1 w:1) fn clear_collection_metadata() -> Weight { - Weight::from_ref_time(37_407_000 as u64) + Weight::from_ref_time(38_191_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Asset (r:1 w:1) fn approve_transfer() -> Weight { - Weight::from_ref_time(29_241_000 as u64) + Weight::from_ref_time(29_461_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Asset (r:1 w:1) fn cancel_approval() -> Weight { - Weight::from_ref_time(28_857_000 as u64) + Weight::from_ref_time(29_690_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Asset (r:1 w:1) fn clear_all_transfer_approvals() -> Weight { - Weight::from_ref_time(27_779_000 as u64) + Weight::from_ref_time(27_758_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts OwnershipAcceptance (r:1 w:1) fn set_accept_ownership() -> Weight { - Weight::from_ref_time(25_718_000 as u64) + Weight::from_ref_time(26_425_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts CollectionMaxSupply (r:1 w:1) // Storage: Nfts Class (r:1 w:0) fn set_collection_max_supply() -> Weight { - Weight::from_ref_time(23_601_000 as u64) + Weight::from_ref_time(24_533_000 as u64) .saturating_add(RocksDbWeight::get().reads(2 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: Nfts Asset (r:1 w:0) // Storage: Nfts ItemPriceOf (r:0 w:1) fn set_price() -> Weight { - Weight::from_ref_time(25_306_000 as u64) + Weight::from_ref_time(24_745_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } @@ -518,7 +518,7 @@ impl WeightInfo for () { // Storage: Nfts Class (r:1 w:0) // Storage: Nfts Account (r:0 w:2) fn buy_item() -> Weight { - Weight::from_ref_time(45_058_000 as u64) + Weight::from_ref_time(47_967_000 as u64) .saturating_add(RocksDbWeight::get().reads(3 as u64)) .saturating_add(RocksDbWeight::get().writes(4 as u64)) }