git.delta.rocks / unique-network / refs/commits / 6a7d5b108992

difftreelog

source

pallets/nonfungible/src/benchmarking.rs7.4 KiBsourcehistory
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::{CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited};2829const SEED: u32 = 1;3031fn create_max_item_data<T: Config>(owner: T::CrossAccountId) -> CreateItemData<T> {32	CreateItemData::<T> {33		owner,34		properties: Default::default(),35	}36}37fn create_max_item<T: Config>(38	collection: &NonfungibleHandle<T>,39	sender: &T::CrossAccountId,40	owner: T::CrossAccountId,41) -> Result<TokenId, DispatchError> {42	<Pallet<T>>::create_item(43		&collection,44		sender,45		create_max_item_data::<T>(owner),46		&Unlimited,47	)?;48	Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))49}5051fn create_collection<T: Config>(52	owner: T::CrossAccountId,53) -> Result<NonfungibleHandle<T>, DispatchError> {54	create_collection_raw(55		owner,56		CollectionMode::NFT,57		|owner, data| <Pallet<T>>::init_collection(owner, data, true),58		NonfungibleHandle::cast,59	)60}6162benchmarks! {63	create_item {64		bench_init!{65			owner: sub; collection: collection(owner);66			sender: cross_from_sub(owner); to: cross_sub;67		};68	}: {create_max_item(&collection, &sender, to.clone())?}6970	create_multiple_items {71		let b in 0..MAX_ITEMS_PER_BATCH;72		bench_init!{73			owner: sub; collection: collection(owner);74			sender: cross_from_sub(owner); to: cross_sub;75		};76		let data = (0..b).map(|_| create_max_item_data::<T>(to.clone())).collect();77	}: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}7879	create_multiple_items_ex {80		let b in 0..MAX_ITEMS_PER_BATCH;81		bench_init!{82			owner: sub; collection: collection(owner);83			sender: cross_from_sub(owner);84		};85		let data = (0..b).map(|i| {86			bench_init!(to: cross_sub(i););87			create_max_item_data::<T>(to)88		}).collect();89	}: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9091	burn_item {92		bench_init!{93			owner: sub; collection: collection(owner);94			sender: cross_from_sub(owner); burner: cross_sub;95		};96		let item = create_max_item(&collection, &sender, burner.clone())?;97	}: {<Pallet<T>>::burn(&collection, &burner, item)?}9899	burn_recursively_self_raw {100		bench_init!{101			owner: sub; collection: collection(owner);102			sender: cross_from_sub(owner); burner: cross_sub;103		};104		let item = create_max_item(&collection, &sender, burner.clone())?;105	}: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}106107	burn_recursively_breadth_plus_self_plus_self_per_each_raw {108		let b in 0..200;109		bench_init!{110			owner: sub; collection: collection(owner);111			sender: cross_from_sub(owner); burner: cross_sub;112		};113		let item = create_max_item(&collection, &sender, burner.clone())?;114		for i in 0..b {115			create_max_item(&collection, &sender, T::CrossTokenAddressMapping::token_to_address(collection.id, item))?;116		}117	}: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}118119	transfer {120		bench_init!{121			owner: sub; collection: collection(owner);122			owner: cross_from_sub; sender: cross_sub; receiver: cross_sub;123		};124		let item = create_max_item(&collection, &owner, sender.clone())?;125	}: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, &Unlimited)?}126127	approve {128		bench_init!{129			owner: sub; collection: collection(owner);130			owner: cross_from_sub; sender: cross_sub; spender: cross_sub;131		};132		let item = create_max_item(&collection, &owner, sender.clone())?;133	}: {<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?}134135	transfer_from {136		bench_init!{137			owner: sub; collection: collection(owner);138			owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;139		};140		let item = create_max_item(&collection, &owner, sender.clone())?;141		<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?;142	}: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, &Unlimited)?}143144	burn_from {145		bench_init!{146			owner: sub; collection: collection(owner);147			owner: cross_from_sub; sender: cross_sub; burner: cross_sub;148		};149		let item = create_max_item(&collection, &owner, sender.clone())?;150		<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&burner))?;151	}: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, &Unlimited)?}152153	set_token_property_permissions {154		let b in 0..MAX_PROPERTIES_PER_ITEM;155		bench_init!{156			owner: sub; collection: collection(owner);157			owner: cross_from_sub;158		};159		let perms = (0..b).map(|k| PropertyKeyPermission {160			key: property_key(k as usize),161			permission: PropertyPermission {162				mutable: false,163				collection_admin: false,164				token_owner: false,165			},166		}).collect::<Vec<_>>();167	}: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}168169	set_token_properties {170		let b in 0..MAX_PROPERTIES_PER_ITEM;171		bench_init!{172			owner: sub; collection: collection(owner);173			owner: cross_from_sub;174		};175		let perms = (0..b).map(|k| PropertyKeyPermission {176			key: property_key(k as usize),177			permission: PropertyPermission {178				mutable: false,179				collection_admin: true,180				token_owner: true,181			},182		}).collect::<Vec<_>>();183		<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;184		let props = (0..b).map(|k| Property {185			key: property_key(k as usize),186			value: property_value(),187		}).collect::<Vec<_>>();188		let item = create_max_item(&collection, &owner, owner.clone())?;189	}: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}190191	delete_token_properties {192		let b in 0..MAX_PROPERTIES_PER_ITEM;193		bench_init!{194			owner: sub; collection: collection(owner);195			owner: cross_from_sub;196		};197		let perms = (0..b).map(|k| PropertyKeyPermission {198			key: property_key(k as usize),199			permission: PropertyPermission {200				mutable: true,201				collection_admin: true,202				token_owner: true,203			},204		}).collect::<Vec<_>>();205		<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;206		let props = (0..b).map(|k| Property {207			key: property_key(k as usize),208			value: property_value(),209		}).collect::<Vec<_>>();210		let item = create_max_item(&collection, &owner, owner.clone())?;211		<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;212		let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();213	}: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}214215	token_owner {216		bench_init!{217			owner: sub; collection: collection(owner);218			owner: cross_from_sub;219		};220		let item = create_max_item(&collection, &owner, owner.clone())?;221222	}: {collection.token_owner(item)}223}