1234567891011121314151617use 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::{28 CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited,29 PropertyPermission,30};3132const SEED: u32 = 1;3334fn create_max_item_data<T: Config>(owner: T::CrossAccountId) -> CreateItemData<T> {35 CreateItemData::<T> {36 owner,37 properties: Default::default(),38 }39}40fn create_max_item<T: Config>(41 collection: &NonfungibleHandle<T>,42 sender: &T::CrossAccountId,43 owner: T::CrossAccountId,44) -> Result<TokenId, DispatchError> {45 <Pallet<T>>::create_item(46 collection,47 sender,48 create_max_item_data::<T>(owner),49 &Unlimited,50 )?;51 Ok(TokenId(<TokensMinted<T>>::get(collection.id)))52}5354fn create_collection<T: Config>(55 owner: T::CrossAccountId,56) -> Result<NonfungibleHandle<T>, DispatchError> {57 create_collection_raw(58 owner,59 CollectionMode::NFT,60 |owner: T::CrossAccountId, data| <Pallet<T>>::init_collection(owner.clone(), owner, data),61 NonfungibleHandle::cast,62 )63}6465benchmarks! {66 create_item {67 bench_init!{68 owner: sub; collection: collection(owner);69 sender: cross_from_sub(owner); to: cross_sub;70 };71 }: {create_max_item(&collection, &sender, to.clone())?}7273 create_multiple_items {74 let b in 0..MAX_ITEMS_PER_BATCH;75 bench_init!{76 owner: sub; collection: collection(owner);77 sender: cross_from_sub(owner); to: cross_sub;78 };79 let data = (0..b).map(|_| create_max_item_data::<T>(to.clone())).collect();80 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8182 create_multiple_items_ex {83 let b in 0..MAX_ITEMS_PER_BATCH;84 bench_init!{85 owner: sub; collection: collection(owner);86 sender: cross_from_sub(owner);87 };88 let data = (0..b).map(|i| {89 bench_init!(to: cross_sub(i););90 create_max_item_data::<T>(to)91 }).collect();92 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9394 burn_item {95 bench_init!{96 owner: sub; collection: collection(owner);97 sender: cross_from_sub(owner); burner: cross_sub;98 };99 let item = create_max_item(&collection, &sender, burner.clone())?;100 }: {<Pallet<T>>::burn(&collection, &burner, item)?}101102 burn_recursively_self_raw {103 bench_init!{104 owner: sub; collection: collection(owner);105 sender: cross_from_sub(owner); burner: cross_sub;106 };107 let item = create_max_item(&collection, &sender, burner.clone())?;108 }: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}109110 burn_recursively_breadth_plus_self_plus_self_per_each_raw {111 let b in 0..200;112 bench_init!{113 owner: sub; collection: collection(owner);114 sender: cross_from_sub(owner); burner: cross_sub;115 };116 let item = create_max_item(&collection, &sender, burner.clone())?;117 for i in 0..b {118 create_max_item(&collection, &sender, T::CrossTokenAddressMapping::token_to_address(collection.id, item))?;119 }120 }: {<Pallet<T>>::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?}121122 transfer_raw {123 bench_init!{124 owner: sub; collection: collection(owner);125 owner: cross_from_sub; sender: cross_sub; receiver: cross_sub;126 };127 let item = create_max_item(&collection, &owner, sender.clone())?;128 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, &Unlimited)?}129130 approve {131 bench_init!{132 owner: sub; collection: collection(owner);133 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;134 };135 let item = create_max_item(&collection, &owner, sender.clone())?;136 }: {<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?}137138 approve_from {139 bench_init!{140 owner: sub; collection: collection(owner);141 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;142 };143 let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());144 let item = create_max_item(&collection, &owner, owner_eth.clone())?;145 }: {<Pallet<T>>::set_allowance_from(&collection, &sender, &owner_eth, item, Some(&spender))?}146147 check_allowed_raw {148 bench_init!{149 owner: sub; collection: collection(owner);150 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;151 };152 let item = create_max_item(&collection, &owner, sender.clone())?;153 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?;154 }: {<Pallet<T>>::check_allowed(&collection, &spender, &sender, item, &Unlimited)?}155156 burn_from {157 bench_init!{158 owner: sub; collection: collection(owner);159 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;160 };161 let item = create_max_item(&collection, &owner, sender.clone())?;162 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&burner))?;163 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, &Unlimited)?}164165 set_token_property_permissions {166 let b in 0..MAX_PROPERTIES_PER_ITEM;167 bench_init!{168 owner: sub; collection: collection(owner);169 owner: cross_from_sub;170 };171 let perms = (0..b).map(|k| PropertyKeyPermission {172 key: property_key(k as usize),173 permission: PropertyPermission {174 mutable: false,175 collection_admin: false,176 token_owner: false,177 },178 }).collect::<Vec<_>>();179 }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}180181 set_token_properties {182 let b in 0..MAX_PROPERTIES_PER_ITEM;183 bench_init!{184 owner: sub; collection: collection(owner);185 owner: cross_from_sub;186 };187 let perms = (0..b).map(|k| PropertyKeyPermission {188 key: property_key(k as usize),189 permission: PropertyPermission {190 mutable: false,191 collection_admin: true,192 token_owner: true,193 },194 }).collect::<Vec<_>>();195 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;196 let props = (0..b).map(|k| Property {197 key: property_key(k as usize),198 value: property_value(),199 }).collect::<Vec<_>>();200 let item = create_max_item(&collection, &owner, owner.clone())?;201 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?}202203 delete_token_properties {204 let b in 0..MAX_PROPERTIES_PER_ITEM;205 bench_init!{206 owner: sub; collection: collection(owner);207 owner: cross_from_sub;208 };209 let perms = (0..b).map(|k| PropertyKeyPermission {210 key: property_key(k as usize),211 permission: PropertyPermission {212 mutable: true,213 collection_admin: true,214 token_owner: true,215 },216 }).collect::<Vec<_>>();217 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;218 let props = (0..b).map(|k| Property {219 key: property_key(k as usize),220 value: property_value(),221 }).collect::<Vec<_>>();222 let item = create_max_item(&collection, &owner, owner.clone())?;223 <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?;224 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();225 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}226227 token_owner {228 bench_init!{229 owner: sub; collection: collection(owner);230 owner: cross_from_sub;231 };232 let item = create_max_item(&collection, &owner, owner.clone())?;233 }: {collection.token_owner(item).unwrap()}234235 set_allowance_for_all {236 bench_init!{237 owner: sub; collection: collection(owner); owner: cross_from_sub;238 operator: cross_sub;239 };240 }: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}241242 allowance_for_all {243 bench_init!{244 owner: sub; collection: collection(owner); owner: cross_from_sub;245 operator: cross_sub;246 };247 }: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}248249 repair_item {250 bench_init!{251 owner: sub; collection: collection(owner);252 owner: cross_from_sub;253 };254 let item = create_max_item(&collection, &owner, owner.clone())?;255 }: {<Pallet<T>>::repair_item(&collection, item)?}256}