git.delta.rocks / unique-network / refs/commits / dc6f0e24d331

difftreelog

source

pallets/refungible/src/benchmarking.rs11.7 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, RefungibleHandle};1920use core::convert::TryInto;21use core::iter::IntoIterator;22use frame_benchmarking::{benchmarks, account};23use pallet_common::{24	bench_init,25	benchmarking::{create_collection_raw, property_key, property_value},26};27use sp_std::prelude::*;28use up_data_structs::{29	CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited,30	PropertyPermission,31};3233const SEED: u32 = 1;3435fn create_max_item_data<T: Config>(36	users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,37) -> CreateItemData<T> {38	CreateItemData::<T> {39		users: users40			.into_iter()41			.collect::<BTreeMap<_, _>>()42			.try_into()43			.unwrap(),44		properties: Default::default(),45	}46}4748fn create_max_item<T: Config>(49	collection: &RefungibleHandle<T>,50	sender: &T::CrossAccountId,51	users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,52) -> Result<TokenId, DispatchError> {53	let data: CreateItemData<T> = create_max_item_data::<T>(users);54	<Pallet<T>>::create_item(collection, sender, data, &Unlimited)?;55	Ok(TokenId(<TokensMinted<T>>::get(collection.id)))56}5758fn create_collection<T: Config>(59	owner: T::CrossAccountId,60) -> Result<RefungibleHandle<T>, DispatchError> {61	create_collection_raw(62		owner,63		CollectionMode::ReFungible,64		|owner: T::CrossAccountId, data| <Pallet<T>>::init_collection(owner.clone(), owner, data),65		RefungibleHandle::cast,66	)67}6869benchmarks! {70	create_item {71		bench_init!{72			owner: sub; collection: collection(owner);73			sender: cross_from_sub(owner); to: cross_sub;74		};75	}: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}7677	create_multiple_items {78		let b in 0..MAX_ITEMS_PER_BATCH;79		bench_init!{80			owner: sub; collection: collection(owner);81			sender: cross_from_sub(owner); to: cross_sub;82		};83		let data = (0..b).map(|_| create_max_item_data::<T>([(to.clone(), 200)])).collect();84	}: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8586	create_multiple_items_ex_multiple_items {87		let b in 0..MAX_ITEMS_PER_BATCH;88		bench_init!{89			owner: sub; collection: collection(owner);90			sender: cross_from_sub(owner);91		};92		let data = (0..b).map(|t| {93			bench_init!(to: cross_sub(t););94			create_max_item_data::<T>([(to, 200)])95		}).collect();96	}: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9798	create_multiple_items_ex_multiple_owners {99		let b in 0..MAX_ITEMS_PER_BATCH;100		bench_init!{101			owner: sub; collection: collection(owner);102			sender: cross_from_sub(owner);103		};104		let data = vec![create_max_item_data::<T>((0..b).map(|u| {105			bench_init!(to: cross_sub(u););106			(to, 200)107		}))];108	}: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}109110	// Other user left, token data is kept111	burn_item_partial {112		bench_init!{113			owner: sub; collection: collection(owner);114			sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;115		};116		let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;117	}: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}118	// No users remaining, token is destroyed119	burn_item_fully {120		bench_init!{121			owner: sub; collection: collection(owner);122			sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;123		};124		let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;125	}: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}126127	transfer_normal {128		bench_init!{129			owner: sub; collection: collection(owner);130			sender: cross_from_sub(owner); receiver: cross_sub;131		};132		let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;133	}: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}134	// Target account is created135	transfer_creating {136		bench_init!{137			owner: sub; collection: collection(owner);138			sender: cross_from_sub(owner); receiver: cross_sub;139		};140		let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;141	}: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}142	// Source account is destroyed143	transfer_removing {144		bench_init!{145			owner: sub; collection: collection(owner);146			sender: cross_from_sub(owner); receiver: cross_sub;147		};148		let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;149	}: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}150	// Source account destroyed, target created151	transfer_creating_removing {152		bench_init!{153			owner: sub; collection: collection(owner);154			sender: cross_from_sub(owner); receiver: cross_sub;155		};156		let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;157	}: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}158159	approve {160		bench_init!{161			owner: sub; collection: collection(owner);162			owner: cross_from_sub; sender: cross_sub; spender: cross_sub;163		};164		let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;165	}: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}166167	approve_from {168		bench_init!{169			owner: sub; collection: collection(owner);170			owner: cross_from_sub; sender: cross_sub; spender: cross_sub;171		};172		let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());173		let item = create_max_item(&collection, &owner, [(owner_eth.clone(), 200)])?;174	}: {<Pallet<T>>::set_allowance_from(&collection, &sender, &owner_eth, &spender, item, 100)?}175176	transfer_from_normal {177		bench_init!{178			owner: sub; collection: collection(owner);179			owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;180		};181		let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;182		<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;183	}: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}184	// Target account is created185	transfer_from_creating {186		bench_init!{187			owner: sub; collection: collection(owner);188			owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;189		};190		let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;191		<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;192	}: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}193	// Source account is destroyed194	transfer_from_removing {195		bench_init!{196			owner: sub; collection: collection(owner);197			owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;198		};199		let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;200		<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;201	}: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}202	// Source account destroyed, target created203	transfer_from_creating_removing {204		bench_init!{205			owner: sub; collection: collection(owner);206			owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;207		};208		let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;209		<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;210	}: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}211212	// Both source account and token is destroyed213	burn_from {214		bench_init!{215			owner: sub; collection: collection(owner);216			owner: cross_from_sub; sender: cross_sub; burner: cross_sub;217		};218		let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;219		<Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;220	}: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}221222	set_token_property_permissions {223		let b in 0..MAX_PROPERTIES_PER_ITEM;224		bench_init!{225			owner: sub; collection: collection(owner);226			owner: cross_from_sub;227		};228		let perms = (0..b).map(|k| PropertyKeyPermission {229			key: property_key(k as usize),230			permission: PropertyPermission {231				mutable: false,232				collection_admin: false,233				token_owner: false,234			},235		}).collect::<Vec<_>>();236	}: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}237238	set_token_properties {239		let b in 0..MAX_PROPERTIES_PER_ITEM;240		bench_init!{241			owner: sub; collection: collection(owner);242			owner: cross_from_sub;243		};244		let perms = (0..b).map(|k| PropertyKeyPermission {245			key: property_key(k as usize),246			permission: PropertyPermission {247				mutable: false,248				collection_admin: true,249				token_owner: true,250			},251		}).collect::<Vec<_>>();252		<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;253		let props = (0..b).map(|k| Property {254			key: property_key(k as usize),255			value: property_value(),256		}).collect::<Vec<_>>();257		let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;258	}: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?}259260	delete_token_properties {261		let b in 0..MAX_PROPERTIES_PER_ITEM;262		bench_init!{263			owner: sub; collection: collection(owner);264			owner: cross_from_sub;265		};266		let perms = (0..b).map(|k| PropertyKeyPermission {267			key: property_key(k as usize),268			permission: PropertyPermission {269				mutable: true,270				collection_admin: true,271				token_owner: true,272			},273		}).collect::<Vec<_>>();274		<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;275		let props = (0..b).map(|k| Property {276			key: property_key(k as usize),277			value: property_value(),278		}).collect::<Vec<_>>();279		let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;280		<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?;281		let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();282	}: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}283284	repartition_item {285		bench_init!{286			owner: sub; collection: collection(owner);287			sender: cross_from_sub(owner); owner: cross_sub;288		};289		let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;290	}: {<Pallet<T>>::repartition(&collection, &owner, item, 200)?}291292	token_owner {293		bench_init!{294			owner: sub; collection: collection(owner);295			sender: cross_from_sub(owner); owner: cross_sub;296		};297		let item = create_max_item(&collection, &sender, [(owner, 100)])?;298	}: {<Pallet<T>>::token_owner(collection.id, item).unwrap()}299300	set_allowance_for_all {301		bench_init!{302			owner: sub; collection: collection(owner); owner: cross_from_sub;303			operator: cross_sub;304		};305	}: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}306307	allowance_for_all {308		bench_init!{309			owner: sub; collection: collection(owner); owner: cross_from_sub;310			operator: cross_sub;311		};312	}: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}313314	repair_item {315		bench_init!{316			owner: sub; collection: collection(owner);317			owner: cross_from_sub;318		};319		let item = create_max_item(&collection, &owner, [(owner.clone(), 100)])?;320	}: {<Pallet<T>>::repair_item(&collection, item)?}321}