difftreelog
feat add reset_token_properties benchmark
in: master
4 files changed
pallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use super::*;18use crate::{Pallet, Config, NonfungibleHandle};1920use frame_benchmarking::{benchmarks, account};21use pallet_common::{22 bench_init,23 benchmarking::{create_collection_raw, property_key, property_value},24 CommonCollectionOperations,25};26use sp_std::prelude::*;27use up_data_structs::{28 CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited,29 PropertyPermission,30};3132const SEED: u32 = 1;3334fn create_max_item_data<T: Config>(owner: T::CrossAccountId) -> CreateItemData<T> {35 CreateItemData::<T> {36 owner,37 properties: Default::default(),38 }39}40fn create_max_item<T: Config>(41 collection: &NonfungibleHandle<T>,42 sender: &T::CrossAccountId,43 owner: T::CrossAccountId,44) -> Result<TokenId, DispatchError> {45 <Pallet<T>>::create_item(46 collection,47 sender,48 create_max_item_data::<T>(owner),49 &Unlimited,50 )?;51 Ok(TokenId(<TokensMinted<T>>::get(collection.id)))52}5354fn create_collection<T: Config>(55 owner: T::CrossAccountId,56) -> Result<NonfungibleHandle<T>, DispatchError> {57 create_collection_raw(58 owner,59 CollectionMode::NFT,60 |owner: T::CrossAccountId, data| <Pallet<T>>::init_collection(owner.clone(), owner, data),61 NonfungibleHandle::cast,62 )63}6465benchmarks! {66 create_item {67 bench_init!{68 owner: sub; collection: collection(owner);69 sender: cross_from_sub(owner); to: cross_sub;70 };71 }: {create_max_item(&collection, &sender, to.clone())?}7273 create_multiple_items {74 let b in 0..MAX_ITEMS_PER_BATCH;75 bench_init!{76 owner: sub; collection: collection(owner);77 sender: cross_from_sub(owner); to: cross_sub;78 };79 let data = (0..b).map(|_| create_max_item_data::<T>(to.clone())).collect();80 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8182 create_multiple_items_ex {83 let b in 0..MAX_ITEMS_PER_BATCH;84 bench_init!{85 owner: sub; collection: collection(owner);86 sender: cross_from_sub(owner);87 };88 let data = (0..b).map(|i| {89 bench_init!(to: cross_sub(i););90 create_max_item_data::<T>(to)91 }).collect();92 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9394 burn_item {95 bench_init!{96 owner: sub; collection: collection(owner);97 sender: cross_from_sub(owner); burner: cross_sub;98 };99 let item = create_max_item(&collection, &sender, burner.clone())?;100 }: {<Pallet<T>>::burn(&collection, &burner, item)?}101102 burn_recursively_self_raw {103 bench_init!{104 owner: sub; collection: collection(owner);105 sender: cross_from_sub(owner); burner: cross_sub;106 };107 let item = create_max_item(&collection, &sender, burner.clone())?;108 }: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}109110 burn_recursively_breadth_plus_self_plus_self_per_each_raw {111 let b in 0..200;112 bench_init!{113 owner: sub; collection: collection(owner);114 sender: cross_from_sub(owner); burner: cross_sub;115 };116 let item = create_max_item(&collection, &sender, burner.clone())?;117 for i in 0..b {118 create_max_item(&collection, &sender, T::CrossTokenAddressMapping::token_to_address(collection.id, item))?;119 }120 }: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}121122 transfer_raw {123 bench_init!{124 owner: sub; collection: collection(owner);125 owner: cross_from_sub; sender: cross_sub; receiver: cross_sub;126 };127 let item = create_max_item(&collection, &owner, sender.clone())?;128 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, &Unlimited)?}129130 approve {131 bench_init!{132 owner: sub; collection: collection(owner);133 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;134 };135 let item = create_max_item(&collection, &owner, sender.clone())?;136 }: {<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?}137138 approve_from {139 bench_init!{140 owner: sub; collection: collection(owner);141 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;142 };143 let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());144 let item = create_max_item(&collection, &owner, owner_eth.clone())?;145 }: {<Pallet<T>>::set_allowance_from(&collection, &sender, &owner_eth, item, Some(&spender))?}146147 check_allowed_raw {148 bench_init!{149 owner: sub; collection: collection(owner);150 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;151 };152 let item = create_max_item(&collection, &owner, sender.clone())?;153 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?;154 }: {<Pallet<T>>::check_allowed(&collection, &spender, &sender, item, &Unlimited)?}155156 burn_from {157 bench_init!{158 owner: sub; collection: collection(owner);159 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;160 };161 let item = create_max_item(&collection, &owner, sender.clone())?;162 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&burner))?;163 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, &Unlimited)?}164165 set_token_property_permissions {166 let b in 0..MAX_PROPERTIES_PER_ITEM;167 bench_init!{168 owner: sub; collection: collection(owner);169 owner: cross_from_sub;170 };171 let perms = (0..b).map(|k| PropertyKeyPermission {172 key: property_key(k as usize),173 permission: PropertyPermission {174 mutable: false,175 collection_admin: false,176 token_owner: false,177 },178 }).collect::<Vec<_>>();179 }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}180181 set_token_properties {182 let b in 0..MAX_PROPERTIES_PER_ITEM;183 bench_init!{184 owner: sub; collection: collection(owner);185 owner: cross_from_sub;186 };187 let perms = (0..b).map(|k| PropertyKeyPermission {188 key: property_key(k as usize),189 permission: PropertyPermission {190 mutable: false,191 collection_admin: true,192 token_owner: true,193 },194 }).collect::<Vec<_>>();195 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;196 let props = (0..b).map(|k| Property {197 key: property_key(k as usize),198 value: property_value(),199 }).collect::<Vec<_>>();200 let item = create_max_item(&collection, &owner, owner.clone())?;201 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?}202203 delete_token_properties {204 let b in 0..MAX_PROPERTIES_PER_ITEM;205 bench_init!{206 owner: sub; collection: collection(owner);207 owner: cross_from_sub;208 };209 let perms = (0..b).map(|k| PropertyKeyPermission {210 key: property_key(k as usize),211 permission: PropertyPermission {212 mutable: true,213 collection_admin: true,214 token_owner: true,215 },216 }).collect::<Vec<_>>();217 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;218 let props = (0..b).map(|k| Property {219 key: property_key(k as usize),220 value: property_value(),221 }).collect::<Vec<_>>();222 let item = create_max_item(&collection, &owner, owner.clone())?;223 <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?;224 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();225 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}226227 token_owner {228 bench_init!{229 owner: sub; collection: collection(owner);230 owner: cross_from_sub;231 };232 let item = create_max_item(&collection, &owner, owner.clone())?;233 }: {collection.token_owner(item).unwrap()}234235 set_allowance_for_all {236 bench_init!{237 owner: sub; collection: collection(owner); owner: cross_from_sub;238 operator: cross_sub;239 };240 }: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}241242 allowance_for_all {243 bench_init!{244 owner: sub; collection: collection(owner); owner: cross_from_sub;245 operator: cross_sub;246 };247 }: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}248249 repair_item {250 bench_init!{251 owner: sub; collection: collection(owner);252 owner: cross_from_sub;253 };254 let item = create_max_item(&collection, &owner, owner.clone())?;255 }: {<Pallet<T>>::repair_item(&collection, item)?}256}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use super::*;18use crate::{Pallet, Config, NonfungibleHandle};1920use frame_benchmarking::{benchmarks, account};21use pallet_common::{22 bench_init,23 benchmarking::{create_collection_raw, property_key, property_value},24 CommonCollectionOperations,25};26use sp_std::prelude::*;27use up_data_structs::{28 CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited,29 PropertyPermission,30};3132const SEED: u32 = 1;3334fn create_max_item_data<T: Config>(owner: T::CrossAccountId) -> CreateItemData<T> {35 CreateItemData::<T> {36 owner,37 properties: Default::default(),38 }39}40fn create_max_item<T: Config>(41 collection: &NonfungibleHandle<T>,42 sender: &T::CrossAccountId,43 owner: T::CrossAccountId,44) -> Result<TokenId, DispatchError> {45 <Pallet<T>>::create_item(46 collection,47 sender,48 create_max_item_data::<T>(owner),49 &Unlimited,50 )?;51 Ok(TokenId(<TokensMinted<T>>::get(collection.id)))52}5354fn create_collection<T: Config>(55 owner: T::CrossAccountId,56) -> Result<NonfungibleHandle<T>, DispatchError> {57 create_collection_raw(58 owner,59 CollectionMode::NFT,60 |owner: T::CrossAccountId, data| <Pallet<T>>::init_collection(owner.clone(), owner, data),61 NonfungibleHandle::cast,62 )63}6465benchmarks! {66 create_item {67 bench_init!{68 owner: sub; collection: collection(owner);69 sender: cross_from_sub(owner); to: cross_sub;70 };71 }: {create_max_item(&collection, &sender, to.clone())?}7273 create_multiple_items {74 let b in 0..MAX_ITEMS_PER_BATCH;75 bench_init!{76 owner: sub; collection: collection(owner);77 sender: cross_from_sub(owner); to: cross_sub;78 };79 let data = (0..b).map(|_| create_max_item_data::<T>(to.clone())).collect();80 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8182 create_multiple_items_ex {83 let b in 0..MAX_ITEMS_PER_BATCH;84 bench_init!{85 owner: sub; collection: collection(owner);86 sender: cross_from_sub(owner);87 };88 let data = (0..b).map(|i| {89 bench_init!(to: cross_sub(i););90 create_max_item_data::<T>(to)91 }).collect();92 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9394 burn_item {95 bench_init!{96 owner: sub; collection: collection(owner);97 sender: cross_from_sub(owner); burner: cross_sub;98 };99 let item = create_max_item(&collection, &sender, burner.clone())?;100 }: {<Pallet<T>>::burn(&collection, &burner, item)?}101102 burn_recursively_self_raw {103 bench_init!{104 owner: sub; collection: collection(owner);105 sender: cross_from_sub(owner); burner: cross_sub;106 };107 let item = create_max_item(&collection, &sender, burner.clone())?;108 }: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}109110 burn_recursively_breadth_plus_self_plus_self_per_each_raw {111 let b in 0..200;112 bench_init!{113 owner: sub; collection: collection(owner);114 sender: cross_from_sub(owner); burner: cross_sub;115 };116 let item = create_max_item(&collection, &sender, burner.clone())?;117 for i in 0..b {118 create_max_item(&collection, &sender, T::CrossTokenAddressMapping::token_to_address(collection.id, item))?;119 }120 }: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}121122 transfer_raw {123 bench_init!{124 owner: sub; collection: collection(owner);125 owner: cross_from_sub; sender: cross_sub; receiver: cross_sub;126 };127 let item = create_max_item(&collection, &owner, sender.clone())?;128 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, &Unlimited)?}129130 approve {131 bench_init!{132 owner: sub; collection: collection(owner);133 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;134 };135 let item = create_max_item(&collection, &owner, sender.clone())?;136 }: {<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?}137138 approve_from {139 bench_init!{140 owner: sub; collection: collection(owner);141 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;142 };143 let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());144 let item = create_max_item(&collection, &owner, owner_eth.clone())?;145 }: {<Pallet<T>>::set_allowance_from(&collection, &sender, &owner_eth, item, Some(&spender))?}146147 check_allowed_raw {148 bench_init!{149 owner: sub; collection: collection(owner);150 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;151 };152 let item = create_max_item(&collection, &owner, sender.clone())?;153 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?;154 }: {<Pallet<T>>::check_allowed(&collection, &spender, &sender, item, &Unlimited)?}155156 burn_from {157 bench_init!{158 owner: sub; collection: collection(owner);159 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;160 };161 let item = create_max_item(&collection, &owner, sender.clone())?;162 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&burner))?;163 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, &Unlimited)?}164165 set_token_property_permissions {166 let b in 0..MAX_PROPERTIES_PER_ITEM;167 bench_init!{168 owner: sub; collection: collection(owner);169 owner: cross_from_sub;170 };171 let perms = (0..b).map(|k| PropertyKeyPermission {172 key: property_key(k as usize),173 permission: PropertyPermission {174 mutable: false,175 collection_admin: false,176 token_owner: false,177 },178 }).collect::<Vec<_>>();179 }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}180181 set_token_properties {182 let b in 0..MAX_PROPERTIES_PER_ITEM;183 bench_init!{184 owner: sub; collection: collection(owner);185 owner: cross_from_sub;186 };187 let perms = (0..b).map(|k| PropertyKeyPermission {188 key: property_key(k as usize),189 permission: PropertyPermission {190 mutable: false,191 collection_admin: true,192 token_owner: true,193 },194 }).collect::<Vec<_>>();195 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;196 let props = (0..b).map(|k| Property {197 key: property_key(k as usize),198 value: property_value(),199 }).collect::<Vec<_>>();200 let item = create_max_item(&collection, &owner, owner.clone())?;201 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?}202203 reset_token_properties {204 let b in 0..MAX_PROPERTIES_PER_ITEM;205 bench_init!{206 owner: sub; collection: collection(owner);207 owner: cross_from_sub;208 };209 let perms = (0..b).map(|k| PropertyKeyPermission {210 key: property_key(k as usize),211 permission: PropertyPermission {212 mutable: false,213 collection_admin: true,214 token_owner: true,215 },216 }).collect::<Vec<_>>();217 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;218 let props = (0..b).map(|k| Property {219 key: property_key(k as usize),220 value: property_value(),221 }).collect::<Vec<_>>();222 let item = create_max_item(&collection, &owner, owner.clone())?;223 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::NewToken { mint_target_is_sender: true }, &Unlimited)?}224225 delete_token_properties {226 let b in 0..MAX_PROPERTIES_PER_ITEM;227 bench_init!{228 owner: sub; collection: collection(owner);229 owner: cross_from_sub;230 };231 let perms = (0..b).map(|k| PropertyKeyPermission {232 key: property_key(k as usize),233 permission: PropertyPermission {234 mutable: true,235 collection_admin: true,236 token_owner: true,237 },238 }).collect::<Vec<_>>();239 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;240 let props = (0..b).map(|k| Property {241 key: property_key(k as usize),242 value: property_value(),243 }).collect::<Vec<_>>();244 let item = create_max_item(&collection, &owner, owner.clone())?;245 <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?;246 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();247 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}248249 token_owner {250 bench_init!{251 owner: sub; collection: collection(owner);252 owner: cross_from_sub;253 };254 let item = create_max_item(&collection, &owner, owner.clone())?;255 }: {collection.token_owner(item).unwrap()}256257 set_allowance_for_all {258 bench_init!{259 owner: sub; collection: collection(owner); owner: cross_from_sub;260 operator: cross_sub;261 };262 }: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}263264 allowance_for_all {265 bench_init!{266 owner: sub; collection: collection(owner); owner: cross_from_sub;267 operator: cross_sub;268 };269 }: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}270271 repair_item {272 bench_init!{273 owner: sub; collection: collection(owner);274 owner: cross_from_sub;275 };276 let item = create_max_item(&collection, &owner, owner.clone())?;277 }: {<Pallet<T>>::repair_item(&collection, item)?}278}pallets/nonfungible/src/common.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -42,7 +42,9 @@
+ t.iter()
.filter_map(|t| {
if t.properties.len() > 0 {
- Some(Self::set_token_properties(t.properties.len() as u32))
+ Some(<SelfWeightOf<T>>::reset_token_properties(
+ t.properties.len() as u32,
+ ))
} else {
None
}
@@ -58,9 +60,9 @@
+ data
.iter()
.filter_map(|t| match t {
- up_data_structs::CreateItemData::NFT(n) if n.properties.len() > 0 => {
- Some(Self::set_token_properties(n.properties.len() as u32))
- }
+ up_data_structs::CreateItemData::NFT(n) if n.properties.len() > 0 => Some(
+ <SelfWeightOf<T>>::reset_token_properties(n.properties.len() as u32),
+ ),
_ => None,
})
.fold(Weight::zero(), |a, b| a.saturating_add(b))
pallets/refungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/refungible/src/benchmarking.rs
+++ b/pallets/refungible/src/benchmarking.rs
@@ -257,6 +257,28 @@
let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;
}: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?}
+ reset_token_properties {
+ let b in 0..MAX_PROPERTIES_PER_ITEM;
+ bench_init!{
+ owner: sub; collection: collection(owner);
+ owner: cross_from_sub;
+ };
+ let perms = (0..b).map(|k| PropertyKeyPermission {
+ key: property_key(k as usize),
+ permission: PropertyPermission {
+ mutable: false,
+ collection_admin: true,
+ token_owner: true,
+ },
+ }).collect::<Vec<_>>();
+ <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;
+ let props = (0..b).map(|k| Property {
+ key: property_key(k as usize),
+ value: property_value(),
+ }).collect::<Vec<_>>();
+ let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;
+ }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::NewToken { mint_target_is_sender: true }, &Unlimited)?}
+
delete_token_properties {
let b in 0..MAX_PROPERTIES_PER_ITEM;
bench_init!{
pallets/refungible/src/common.rsdiffbeforeafterboth--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -47,7 +47,7 @@
fn properties_weight<T: Config>(properties: &CollectionPropertiesVec) -> Weight {
if properties.len() > 0 {
- <CommonWeights<T>>::set_token_properties(properties.len() as u32)
+ <SelfWeightOf<T>>::reset_token_properties(properties.len() as u32)
} else {
Weight::zero()
}