git.delta.rocks / unique-network / refs/commits / 549eb4c11dfd

difftreelog

source

pallets/nft/src/benchmarking.rs15.3 KiBsourcehistory
1#![cfg(feature = "runtime-benchmarks")]23use super::*;4use crate::Pallet;5use frame_system::RawOrigin;6use frame_benchmarking::{benchmarks, account};7use nft_data_structs::*;8use core::convert::TryInto;9use sp_runtime::DispatchError;1011const SEED: u32 = 1;1213fn create_data(size: usize) -> Vec<u8> {14	(0..size).map(|v| (v & 0xff) as u8).collect()15}16fn create_u16_data(size: usize) -> Vec<u16> {17	(0..size).map(|v| (v & 0xffff) as u16).collect()18}1920fn default_nft_data() -> CreateItemData {21	CreateItemData::NFT(CreateNftData {22		const_data: create_data(CUSTOM_DATA_LIMIT as usize).try_into().unwrap(),23		variable_data: create_data(CUSTOM_DATA_LIMIT as usize).try_into().unwrap(),24	})25}2627fn default_fungible_data() -> CreateItemData {28	CreateItemData::Fungible(CreateFungibleData { value: 1000 })29}3031fn default_re_fungible_data() -> CreateItemData {32	CreateItemData::ReFungible(CreateReFungibleData {33		const_data: create_data(CUSTOM_DATA_LIMIT as usize).try_into().unwrap(),34		variable_data: create_data(CUSTOM_DATA_LIMIT as usize).try_into().unwrap(),35		pieces: 1000,36	})37}3839fn create_collection_helper<T: Config>(40	owner: T::AccountId,41	mode: CollectionMode,42) -> Result<CollectionId, DispatchError> {43	T::Currency::deposit_creating(&owner, T::CollectionCreationPrice::get());44	let col_name = create_u16_data(MAX_COLLECTION_NAME_LENGTH)45		.try_into()46		.unwrap();47	let col_desc = create_u16_data(MAX_COLLECTION_DESCRIPTION_LENGTH)48		.try_into()49		.unwrap();50	let token_prefix = create_data(MAX_TOKEN_PREFIX_LENGTH).try_into().unwrap();51	<Pallet<T>>::create_collection(52		RawOrigin::Signed(owner).into(),53		col_name,54		col_desc,55		token_prefix,56		mode,57	)?;58	Ok(CreatedCollectionCount::get())59}60fn create_nft_collection<T: Config>(owner: T::AccountId) -> Result<CollectionId, DispatchError> {61	create_collection_helper::<T>(owner, CollectionMode::NFT)62}63fn create_fungible_collection<T: Config>(64	owner: T::AccountId,65) -> Result<CollectionId, DispatchError> {66	create_collection_helper::<T>(owner, CollectionMode::Fungible(0))67}68fn create_refungible_collection<T: Config>(69	owner: T::AccountId,70) -> Result<CollectionId, DispatchError> {71	create_collection_helper::<T>(owner, CollectionMode::ReFungible)72}7374benchmarks! {7576	create_collection {77		let col_name: Vec<u16> = create_u16_data(MAX_COLLECTION_NAME_LENGTH);78		let col_desc: Vec<u16> = create_u16_data(MAX_COLLECTION_DESCRIPTION_LENGTH);79		let token_prefix: Vec<u8> = create_data(MAX_TOKEN_PREFIX_LENGTH);80		let mode: CollectionMode = CollectionMode::NFT;81		let caller: T::AccountId = account("caller", 0, SEED);82		T::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());83	}: _(RawOrigin::Signed(caller.clone()), col_name.clone(), col_desc.clone(), token_prefix.clone(), mode)84	verify {85		assert_eq!(<Pallet<T>>::collection_id(2).unwrap().owner, caller);86	}8788	destroy_collection {89		let caller: T::AccountId = account("caller", 0, SEED);90		let collection = create_nft_collection::<T>(caller.clone())?;91	}: _(RawOrigin::Signed(caller.clone()), collection)9293	add_to_white_list {94		let caller: T::AccountId = account("caller", 0, SEED);95		let whitelist_account: T::AccountId = account("admin", 0, SEED);96		let collection = create_nft_collection::<T>(caller.clone())?;97	}: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(whitelist_account))9899	remove_from_white_list {100		let caller: T::AccountId = account("caller", 0, SEED);101		let whitelist_account: T::AccountId = account("admin", 0, SEED);102		let collection = create_nft_collection::<T>(caller.clone())?;103		<Pallet<T>>::add_to_white_list(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(whitelist_account.clone()))?;104	}: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(whitelist_account))105106	set_public_access_mode {107		let caller: T::AccountId = account("caller", 0, SEED);108		let collection = create_nft_collection::<T>(caller.clone())?;109	}: _(RawOrigin::Signed(caller.clone()), collection, AccessMode::WhiteList)110111	set_mint_permission {112		let caller: T::AccountId = account("caller", 0, SEED);113		let collection = create_nft_collection::<T>(caller.clone())?;114	}: _(RawOrigin::Signed(caller.clone()), collection, true)115116	change_collection_owner {117		let caller: T::AccountId = account("caller", 0, SEED);118		let collection = create_nft_collection::<T>(caller.clone())?;119		let new_owner: T::AccountId = account("admin", 0, SEED);120	}: _(RawOrigin::Signed(caller.clone()), collection, new_owner)121122	add_collection_admin {123		let caller: T::AccountId = account("caller", 0, SEED);124		let collection = create_nft_collection::<T>(caller.clone())?;125		let new_admin: T::AccountId = account("admin", 0, SEED);126	}: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(new_admin))127128	remove_collection_admin {129		let caller: T::AccountId = account("caller", 0, SEED);130		let collection = create_nft_collection::<T>(caller.clone())?;131		let new_admin: T::AccountId = account("admin", 0, SEED);132		<Pallet<T>>::add_collection_admin(RawOrigin::Signed(caller.clone()).into(), 2, T::CrossAccountId::from_sub(new_admin.clone()))?;133	}: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(new_admin))134135	set_collection_sponsor {136		let caller: T::AccountId = account("caller", 0, SEED);137		let collection = create_nft_collection::<T>(caller.clone())?;138	}: _(RawOrigin::Signed(caller.clone()), collection, caller.clone())139140	confirm_sponsorship {141		let caller: T::AccountId = account("caller", 0, SEED);142		let collection = create_nft_collection::<T>(caller.clone())?;143		<Pallet<T>>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;144	}: _(RawOrigin::Signed(caller.clone()), collection)145146	remove_collection_sponsor {147		let caller: T::AccountId = account("caller", 0, SEED);148		let collection = create_nft_collection::<T>(caller.clone())?;149		<Pallet<T>>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;150		<Pallet<T>>::confirm_sponsorship(RawOrigin::Signed(caller.clone()).into(), 2)?;151	}: _(RawOrigin::Signed(caller.clone()), collection)152153	// nft item154	create_item_nft {155		let b in 0..(CUSTOM_DATA_LIMIT * 2);156157		let caller: T::AccountId = account("caller", 0, SEED);158		let collection = create_nft_collection::<T>(caller.clone())?;159		let data = CreateItemData::NFT(CreateNftData {160			const_data: create_data(b.min(CUSTOM_DATA_LIMIT) as usize).try_into().unwrap(),161			variable_data: create_data(b.saturating_sub(CUSTOM_DATA_LIMIT) as usize).try_into().unwrap(),162		});163	}: create_item(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(caller.clone()), data)164165	create_multiple_items_nft {166		// TODO: Take item data size into account. As create_item_nft bench shows, this parameter has no effect on execution time,167		// but it may if we increase CUSTOM_DATA_LIMIT168		let b in 1..1000;169170		let caller: T::AccountId = account("caller", 0, SEED);171		let collection = create_nft_collection::<T>(caller.clone())?;172		let data = (0..b).map(|_| default_nft_data()).collect();173	}: create_multiple_items(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(caller.clone()), data)174175	// fungible item176	create_item_fungible {177		let caller: T::AccountId = account("caller", 0, SEED);178		let collection = create_fungible_collection::<T>(caller.clone())?;179		let data = CreateItemData::Fungible(CreateFungibleData {180			value: 1000,181		});182	}: create_item(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(caller.clone()), data)183184	create_multiple_items_fungible {185		let b in 1..1000;186187		let caller: T::AccountId = account("caller", 0, SEED);188		let collection = create_fungible_collection::<T>(caller.clone())?;189		let data = (0..b).map(|_| default_fungible_data()).collect();190	}: create_multiple_items(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(caller.clone()), data)191192	// refungible item193	create_item_refungible {194		let b in 0..(CUSTOM_DATA_LIMIT * 2);195196		let caller: T::AccountId = account("caller", 0, SEED);197		let collection = create_refungible_collection::<T>(caller.clone())?;198		let data = CreateItemData::ReFungible(CreateReFungibleData {199			const_data: create_data(b.min(CUSTOM_DATA_LIMIT) as usize).try_into().unwrap(),200			variable_data: create_data(b.saturating_sub(CUSTOM_DATA_LIMIT) as usize).try_into().unwrap(),201			pieces: 1000,202		});203	}: create_item(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(caller.clone()), data)204205	create_multiple_items_refungible {206		// TODO: Take item data size into account. As create_item_nft bench shows, this parameter has no effect on execution time,207		// but it may if we increase CUSTOM_DATA_LIMIT208		let b in 1..1000;209210		let caller: T::AccountId = account("caller", 0, SEED);211		let collection = create_refungible_collection::<T>(caller.clone())?;212		let data = (0..b).map(|_| default_re_fungible_data()).collect();213	}: create_multiple_items(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(caller.clone()), data)214215	burn_item_nft {216		let caller: T::AccountId = account("caller", 0, SEED);217		let collection = create_nft_collection::<T>(caller.clone())?;218		let data = default_nft_data();219		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(caller.clone()), data)?;220	}: burn_item(RawOrigin::Signed(caller.clone()), collection, 1, 1)221222	transfer_nft {223		let caller: T::AccountId = account("caller", 0, SEED);224		let collection = create_nft_collection::<T>(caller.clone())?;225		let recipient: T::AccountId = account("recipient", 0, SEED);226		let data = default_nft_data();227		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(caller.clone()), data)?;228	}: transfer(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), collection, 1, 1)229230	transfer_fungible {231		let caller: T::AccountId = account("caller", 0, SEED);232		let collection = create_fungible_collection::<T>(caller.clone())?;233		let recipient: T::AccountId = account("recipient", 0, SEED);234		let data = default_fungible_data();235		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(caller.clone()), data)?;236	}: transfer(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), collection, 1, 1)237238	transfer_refungible {239		let caller: T::AccountId = account("caller", 0, SEED);240		let collection = create_refungible_collection::<T>(caller.clone())?;241		let recipient: T::AccountId = account("recipient", 0, SEED);242		let data = default_re_fungible_data();243		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(caller.clone()), data)?;244	}: transfer(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), collection, 1, 1)245246	set_transfers_enabled_flag {247		let caller: T::AccountId = account("caller", 0, SEED);248		let collection = create_nft_collection::<T>(caller.clone())?;249	}: _(RawOrigin::Signed(caller.clone()), collection, false)250251	approve_nft {252		let caller: T::AccountId = account("caller", 0, SEED);253		let collection = create_nft_collection::<T>(caller.clone())?;254		let recipient: T::AccountId = account("recipient", 0, SEED);255		let data = default_nft_data();256		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, T::CrossAccountId::from_sub(caller.clone()), data)?;257	}: approve(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), collection, 1, 1)258259	// Nft260	transfer_from_nft {261		let caller: T::AccountId = account("caller", 0, SEED);262		let collection = create_nft_collection::<T>(caller.clone())?;263		let recipient: T::AccountId = account("recipient", 0, SEED);264		let data = default_nft_data();265		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, T::CrossAccountId::from_sub(caller.clone()), data)?;266		<Pallet<T>>::approve(RawOrigin::Signed(caller.clone()).into(), T::CrossAccountId::from_sub(recipient.clone()), 2, 1, 1)?;267	}: transfer_from(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), 2, 1, 1)268269	// Fungible270	transfer_from_fungible {271		let caller: T::AccountId = account("caller", 0, SEED);272		let collection = create_fungible_collection::<T>(caller.clone())?;273		let recipient: T::AccountId = account("recipient", 0, SEED);274		let data = default_fungible_data();275		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, T::CrossAccountId::from_sub(caller.clone()), data)?;276		<Pallet<T>>::approve(RawOrigin::Signed(caller.clone()).into(), T::CrossAccountId::from_sub(recipient.clone()), 2, 1, 1)?;277	}: transfer_from(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), 2, 1, 1)278279	// ReFungible280	transfer_from_refungible {281		let caller: T::AccountId = account("caller", 0, SEED);282		let collection = create_refungible_collection::<T>(caller.clone())?;283		let recipient: T::AccountId = account("recipient", 0, SEED);284		let data = default_re_fungible_data();285		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, T::CrossAccountId::from_sub(caller.clone()), data)?;286		<Pallet<T>>::approve(RawOrigin::Signed(caller.clone()).into(), T::CrossAccountId::from_sub(recipient.clone()), 2, 1, 1)?;287	}: transfer_from(RawOrigin::Signed(caller.clone()), T::CrossAccountId::from_sub(caller.clone()), T::CrossAccountId::from_sub(recipient.clone()), 2, 1, 1)288289	set_offchain_schema {290		let b in 0..OFFCHAIN_SCHEMA_LIMIT;291292		let caller: T::AccountId = account("caller", 0, SEED);293		let collection = create_nft_collection::<T>(caller.clone())?;294		let data = create_data(b as usize);295	}: set_offchain_schema(RawOrigin::Signed(caller.clone()), collection, data)296297	set_const_on_chain_schema {298		let b in 0..CONST_ON_CHAIN_SCHEMA_LIMIT;299300		let caller: T::AccountId = account("caller", 0, SEED);301		let collection = create_nft_collection::<T>(caller.clone())?;302		let data = create_data(b as usize);303	}: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), collection, data)304305	set_variable_on_chain_schema {306		let b in 0..VARIABLE_ON_CHAIN_SCHEMA_LIMIT;307308		let caller: T::AccountId = account("caller", 0, SEED);309		let collection = create_nft_collection::<T>(caller.clone())?;310		let data = create_data(b as usize);311	}: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, data)312313	set_variable_meta_data_nft {314		let b in 0..CUSTOM_DATA_LIMIT;315316		let caller: T::AccountId = account("caller", 0, SEED);317		let collection = create_nft_collection::<T>(caller.clone())?;318		let data = default_nft_data();319		<Pallet<T>>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, T::CrossAccountId::from_sub(caller.clone()), data)?;320		let data = create_data(b as usize);321	}: set_variable_meta_data(RawOrigin::Signed(caller.clone()), collection, 1, data)322323	set_schema_version {324		let caller: T::AccountId = account("caller", 0, SEED);325		let collection = create_nft_collection::<T>(caller.clone())?;326	}: set_schema_version(RawOrigin::Signed(caller.clone()), 2, SchemaVersion::Unique)327328	set_collection_limits{329		let caller: T::AccountId = account("caller", 0, SEED);330		let collection = create_nft_collection::<T>(caller.clone())?;331332		let cl = CollectionLimits {333			account_token_ownership_limit: 0,334			sponsored_data_size: 0,335			token_limit: 1,336			sponsor_transfer_timeout: 0,337			owner_can_destroy: true,338			owner_can_transfer: true,339			sponsored_data_rate_limit: None,340		};341	}: set_collection_limits(RawOrigin::Signed(caller.clone()), 2, cl)342}