1234567891011121314151617#![cfg(feature = "runtime-benchmarks")]1819use frame_benchmarking::v2::{account, benchmarks, BenchmarkError};20use frame_support::traits::{fungible::Balanced, tokens::Precision, Get};21use frame_system::RawOrigin;22use pallet_common::{23 benchmarking::{create_data, create_u16_data},24 erc::CrossAccountId,25 Config as CommonConfig,26};27use sp_runtime::DispatchError;28use up_data_structs::{29 CollectionId, CollectionLimits, CollectionMode, MAX_COLLECTION_DESCRIPTION_LENGTH,30 MAX_COLLECTION_NAME_LENGTH, MAX_TOKEN_PREFIX_LENGTH,31};3233use super::*;34use crate::Pallet;3536const SEED: u32 = 1;3738fn create_collection_helper<T: Config>(39 owner: T::AccountId,40 mode: CollectionMode,41) -> Result<CollectionId, DispatchError> {42 let _ = <T as CommonConfig>::Currency::deposit(43 &owner,44 T::CollectionCreationPrice::get(),45 Precision::Exact,46 )47 .unwrap();48 let col_name = create_u16_data::<{ MAX_COLLECTION_NAME_LENGTH }>();49 let col_desc = create_u16_data::<{ MAX_COLLECTION_DESCRIPTION_LENGTH }>();50 let token_prefix = create_data::<{ MAX_TOKEN_PREFIX_LENGTH }>();51 <Pallet<T>>::create_collection(52 RawOrigin::Signed(owner).into(),53 col_name,54 col_desc,55 token_prefix,56 mode,57 )?;58 Ok(<pallet_common::CreatedCollectionCount<T>>::get())59}60pub fn create_nft_collection<T: Config>(61 owner: T::AccountId,62) -> Result<CollectionId, DispatchError> {63 create_collection_helper::<T>(owner, CollectionMode::NFT)64}6566#[benchmarks]67mod benchmarks {68 use super::*;6970 #[benchmark]71 fn create_collection() -> Result<(), BenchmarkError> {72 let col_name = create_u16_data::<{ MAX_COLLECTION_NAME_LENGTH }>();73 let col_desc = create_u16_data::<{ MAX_COLLECTION_DESCRIPTION_LENGTH }>();74 let token_prefix = create_data::<{ MAX_TOKEN_PREFIX_LENGTH }>();75 let mode: CollectionMode = CollectionMode::NFT;76 let caller: T::AccountId = account("caller", 0, SEED);77 let _ = <T as CommonConfig>::Currency::deposit(78 &caller,79 T::CollectionCreationPrice::get(),80 Precision::Exact,81 )82 .unwrap();8384 #[extrinsic_call]85 _(86 RawOrigin::Signed(caller.clone()),87 col_name,88 col_desc,89 token_prefix,90 mode,91 );9293 assert_eq!(94 <pallet_common::CollectionById<T>>::get(CollectionId(1))95 .unwrap()96 .owner,97 caller98 );99100 Ok(())101 }102103 #[benchmark]104 fn destroy_collection() -> Result<(), BenchmarkError> {105 let caller: T::AccountId = account("caller", 0, SEED);106 let collection = create_nft_collection::<T>(caller.clone())?;107108 #[extrinsic_call]109 _(RawOrigin::Signed(caller.clone()), collection);110111 Ok(())112 }113114 #[benchmark]115 fn add_to_allow_list() -> Result<(), BenchmarkError> {116 let caller: T::AccountId = account("caller", 0, SEED);117 let allowlist_account: T::AccountId = account("admin", 0, SEED);118 let collection = create_nft_collection::<T>(caller.clone())?;119120 #[extrinsic_call]121 _(122 RawOrigin::Signed(caller.clone()),123 collection,124 T::CrossAccountId::from_sub(allowlist_account),125 );126127 Ok(())128 }129130 #[benchmark]131 fn remove_from_allow_list() -> Result<(), BenchmarkError> {132 let caller: T::AccountId = account("caller", 0, SEED);133 let allowlist_account: T::AccountId = account("admin", 0, SEED);134 let collection = create_nft_collection::<T>(caller.clone())?;135 <Pallet<T>>::add_to_allow_list(136 RawOrigin::Signed(caller.clone()).into(),137 collection,138 T::CrossAccountId::from_sub(allowlist_account.clone()),139 )?;140141 #[extrinsic_call]142 _(143 RawOrigin::Signed(caller.clone()),144 collection,145 T::CrossAccountId::from_sub(allowlist_account),146 );147148 Ok(())149 }150151 #[benchmark]152 fn change_collection_owner() -> Result<(), BenchmarkError> {153 let caller: T::AccountId = account("caller", 0, SEED);154 let collection = create_nft_collection::<T>(caller.clone())?;155 let new_owner: T::AccountId = account("admin", 0, SEED);156157 #[extrinsic_call]158 _(RawOrigin::Signed(caller.clone()), collection, new_owner);159160 Ok(())161 }162163 #[benchmark]164 fn add_collection_admin() -> Result<(), BenchmarkError> {165 let caller: T::AccountId = account("caller", 0, SEED);166 let collection = create_nft_collection::<T>(caller.clone())?;167 let new_admin: T::AccountId = account("admin", 0, SEED);168169 #[extrinsic_call]170 _(171 RawOrigin::Signed(caller.clone()),172 collection,173 T::CrossAccountId::from_sub(new_admin),174 );175176 Ok(())177 }178179 #[benchmark]180 fn remove_collection_admin() -> Result<(), BenchmarkError> {181 let caller: T::AccountId = account("caller", 0, SEED);182 let collection = create_nft_collection::<T>(caller.clone())?;183 let new_admin: T::AccountId = account("admin", 0, SEED);184 <Pallet<T>>::add_collection_admin(185 RawOrigin::Signed(caller.clone()).into(),186 collection,187 T::CrossAccountId::from_sub(new_admin.clone()),188 )?;189190 #[extrinsic_call]191 _(192 RawOrigin::Signed(caller.clone()),193 collection,194 T::CrossAccountId::from_sub(new_admin),195 );196197 Ok(())198 }199200 #[benchmark]201 fn set_collection_sponsor() -> Result<(), BenchmarkError> {202 let caller: T::AccountId = account("caller", 0, SEED);203 let collection = create_nft_collection::<T>(caller.clone())?;204205 #[extrinsic_call]206 _(207 RawOrigin::Signed(caller.clone()),208 collection,209 caller.clone(),210 );211212 Ok(())213 }214215 #[benchmark]216 fn confirm_sponsorship() -> Result<(), BenchmarkError> {217 let caller: T::AccountId = account("caller", 0, SEED);218 let collection = create_nft_collection::<T>(caller.clone())?;219 <Pallet<T>>::set_collection_sponsor(220 RawOrigin::Signed(caller.clone()).into(),221 collection,222 caller.clone(),223 )?;224225 #[extrinsic_call]226 _(RawOrigin::Signed(caller.clone()), collection);227228 Ok(())229 }230231 #[benchmark]232 fn remove_collection_sponsor() -> Result<(), BenchmarkError> {233 let caller: T::AccountId = account("caller", 0, SEED);234 let collection = create_nft_collection::<T>(caller.clone())?;235 <Pallet<T>>::set_collection_sponsor(236 RawOrigin::Signed(caller.clone()).into(),237 collection,238 caller.clone(),239 )?;240 <Pallet<T>>::confirm_sponsorship(RawOrigin::Signed(caller.clone()).into(), collection)?;241242 #[extrinsic_call]243 _(RawOrigin::Signed(caller.clone()), collection);244245 Ok(())246 }247248 #[benchmark]249 fn set_transfers_enabled_flag() -> Result<(), BenchmarkError> {250 let caller: T::AccountId = account("caller", 0, SEED);251 let collection = create_nft_collection::<T>(caller.clone())?;252253 #[extrinsic_call]254 _(RawOrigin::Signed(caller.clone()), collection, false);255256 Ok(())257 }258259 #[benchmark]260 fn set_collection_limits() -> Result<(), BenchmarkError> {261 let caller: T::AccountId = account("caller", 0, SEED);262 let collection = create_nft_collection::<T>(caller.clone())?;263264 let cl = CollectionLimits {265 account_token_ownership_limit: Some(0),266 sponsored_data_size: Some(0),267 token_limit: Some(1),268 sponsor_transfer_timeout: Some(0),269 sponsor_approve_timeout: None,270 owner_can_destroy: Some(true),271 owner_can_transfer: Some(true),272 sponsored_data_rate_limit: None,273 transfers_enabled: Some(true),274 };275276 #[extrinsic_call]277 set_collection_limits(RawOrigin::Signed(caller.clone()), collection, cl);278279 Ok(())280 }281282 #[benchmark]283 fn force_repair_collection() -> Result<(), BenchmarkError> {284 let caller: T::AccountId = account("caller", 0, SEED);285 let collection = create_nft_collection::<T>(caller)?;286287 #[extrinsic_call]288 _(RawOrigin::Root, collection);289290 Ok(())291 }292}