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 154 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 167 168 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 176 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 193 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 207 208 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 260 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 270 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 280 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}