1234567891011121314151617use 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::{CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited};2930const SEED: u32 = 1;3132fn create_max_item_data<T: Config>(33 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,34) -> CreateItemData<T> {35 CreateItemData::<T> {36 users: users37 .into_iter()38 .collect::<BTreeMap<_, _>>()39 .try_into()40 .unwrap(),41 properties: Default::default(),42 }43}4445fn create_max_item<T: Config>(46 collection: &RefungibleHandle<T>,47 sender: &T::CrossAccountId,48 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,49) -> Result<TokenId, DispatchError> {50 let data: CreateItemData<T> = create_max_item_data::<T>(users);51 <Pallet<T>>::create_item(&collection, sender, data, &Unlimited)?;52 Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))53}5455fn create_collection<T: Config>(56 owner: T::CrossAccountId,57) -> Result<RefungibleHandle<T>, DispatchError> {58 create_collection_raw(59 owner,60 CollectionMode::ReFungible,61 |owner: T::CrossAccountId, data| {62 <Pallet<T>>::init_collection(owner.clone(), owner, data, Default::default())63 },64 RefungibleHandle::cast,65 )66}6768benchmarks! {69 create_item {70 bench_init!{71 owner: sub; collection: collection(owner);72 sender: cross_from_sub(owner); to: cross_sub;73 };74 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}7576 create_multiple_items {77 let b in 0..MAX_ITEMS_PER_BATCH;78 bench_init!{79 owner: sub; collection: collection(owner);80 sender: cross_from_sub(owner); to: cross_sub;81 };82 let data = (0..b).map(|_| create_max_item_data::<T>([(to.clone(), 200)])).collect();83 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8485 create_multiple_items_ex_multiple_items {86 let b in 0..MAX_ITEMS_PER_BATCH;87 bench_init!{88 owner: sub; collection: collection(owner);89 sender: cross_from_sub(owner);90 };91 let data = (0..b).map(|t| {92 bench_init!(to: cross_sub(t););93 create_max_item_data::<T>([(to, 200)])94 }).collect();95 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9697 create_multiple_items_ex_multiple_owners {98 let b in 0..MAX_ITEMS_PER_BATCH;99 bench_init!{100 owner: sub; collection: collection(owner);101 sender: cross_from_sub(owner);102 };103 let data = vec![create_max_item_data::<T>((0..b).map(|u| {104 bench_init!(to: cross_sub(u););105 (to, 200)106 }))].try_into().unwrap();107 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}108109 110 burn_item_partial {111 bench_init!{112 owner: sub; collection: collection(owner);113 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;114 };115 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;116 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}117 118 burn_item_fully {119 bench_init!{120 owner: sub; collection: collection(owner);121 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;122 };123 let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;124 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}125126 transfer_normal {127 bench_init!{128 owner: sub; collection: collection(owner);129 sender: cross_from_sub(owner); receiver: cross_sub;130 };131 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;132 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}133 134 transfer_creating {135 bench_init!{136 owner: sub; collection: collection(owner);137 sender: cross_from_sub(owner); receiver: cross_sub;138 };139 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;140 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}141 142 transfer_removing {143 bench_init!{144 owner: sub; collection: collection(owner);145 sender: cross_from_sub(owner); receiver: cross_sub;146 };147 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;148 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}149 150 transfer_creating_removing {151 bench_init!{152 owner: sub; collection: collection(owner);153 sender: cross_from_sub(owner); receiver: cross_sub;154 };155 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;156 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}157158 approve {159 bench_init!{160 owner: sub; collection: collection(owner);161 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;162 };163 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;164 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}165166 transfer_from_normal {167 bench_init!{168 owner: sub; collection: collection(owner);169 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;170 };171 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;172 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;173 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}174 175 transfer_from_creating {176 bench_init!{177 owner: sub; collection: collection(owner);178 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;179 };180 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;181 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;182 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}183 184 transfer_from_removing {185 bench_init!{186 owner: sub; collection: collection(owner);187 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;188 };189 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;190 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;191 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}192 193 transfer_from_creating_removing {194 bench_init!{195 owner: sub; collection: collection(owner);196 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;197 };198 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;199 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;200 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}201202 203 burn_from {204 bench_init!{205 owner: sub; collection: collection(owner);206 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;207 };208 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;209 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;210 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}211212 set_token_property_permissions {213 let b in 0..MAX_PROPERTIES_PER_ITEM;214 bench_init!{215 owner: sub; collection: collection(owner);216 owner: cross_from_sub;217 };218 let perms = (0..b).map(|k| PropertyKeyPermission {219 key: property_key(k as usize),220 permission: PropertyPermission {221 mutable: false,222 collection_admin: false,223 token_owner: false,224 },225 }).collect::<Vec<_>>();226 }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}227228 set_token_properties {229 let b in 0..MAX_PROPERTIES_PER_ITEM;230 bench_init!{231 owner: sub; collection: collection(owner);232 owner: cross_from_sub;233 };234 let perms = (0..b).map(|k| PropertyKeyPermission {235 key: property_key(k as usize),236 permission: PropertyPermission {237 mutable: false,238 collection_admin: true,239 token_owner: true,240 },241 }).collect::<Vec<_>>();242 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;243 let props = (0..b).map(|k| Property {244 key: property_key(k as usize),245 value: property_value(),246 }).collect::<Vec<_>>();247 let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;248 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}249250 delete_token_properties {251 let b in 0..MAX_PROPERTIES_PER_ITEM;252 bench_init!{253 owner: sub; collection: collection(owner);254 owner: cross_from_sub;255 };256 let perms = (0..b).map(|k| PropertyKeyPermission {257 key: property_key(k as usize),258 permission: PropertyPermission {259 mutable: true,260 collection_admin: true,261 token_owner: true,262 },263 }).collect::<Vec<_>>();264 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;265 let props = (0..b).map(|k| Property {266 key: property_key(k as usize),267 value: property_value(),268 }).collect::<Vec<_>>();269 let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;270 <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;271 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();272 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}273274 repartition_item {275 bench_init!{276 owner: sub; collection: collection(owner);277 sender: cross_from_sub(owner); owner: cross_sub;278 };279 let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;280 }: {<Pallet<T>>::repartition(&collection, &owner, item, 200)?}281282 token_owner {283 bench_init!{284 owner: sub; collection: collection(owner);285 sender: cross_from_sub(owner); owner: cross_sub;286 };287 let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;288 }: {<Pallet<T>>::token_owner(collection.id, item)}289290 set_allowance_for_all {291 bench_init!{292 owner: sub; collection: collection(owner); owner: cross_from_sub;293 operator: cross_sub;294 };295 }: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}296297 allowance_for_all {298 bench_init!{299 owner: sub; collection: collection(owner); owner: cross_from_sub;300 operator: cross_sub;301 };302 }: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}303304 repair_item {305 bench_init!{306 owner: sub; collection: collection(owner);307 owner: cross_from_sub;308 };309 let item = create_max_item(&collection, &owner, [(owner.clone(), 100)])?;310 }: {<Pallet<T>>::repair_item(&collection, item)?}311}