1234567891011121314151617use super::*;18use crate::{Pallet, Config, NonfungibleHandle};1920use sp_std::prelude::*;21use pallet_common::benchmarking::{create_collection_raw, create_data, property_key, property_value};22use frame_benchmarking::{benchmarks, account};23use up_data_structs::{24 CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, CUSTOM_DATA_LIMIT,25 budget::Unlimited,26};27use pallet_common::bench_init;2829const SEED: u32 = 1;3031fn create_max_item_data<T: Config>(owner: T::CrossAccountId) -> CreateItemData<T> {32 let const_data = create_data::<CUSTOM_DATA_LIMIT>();33 CreateItemData::<T> {34 const_data,35 owner,36 properties: Default::default(),37 }38}39fn create_max_item<T: Config>(40 collection: &NonfungibleHandle<T>,41 sender: &T::CrossAccountId,42 owner: T::CrossAccountId,43) -> Result<TokenId, DispatchError> {44 <Pallet<T>>::create_item(45 &collection,46 sender,47 create_max_item_data::<T>(owner),48 &Unlimited,49 )?;50 Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))51}5253fn create_collection<T: Config>(54 owner: T::AccountId,55) -> Result<NonfungibleHandle<T>, DispatchError> {56 create_collection_raw(57 owner,58 CollectionMode::NFT,59 <Pallet<T>>::init_collection,60 NonfungibleHandle::cast,61 )62}6364benchmarks! {65 create_item {66 bench_init!{67 owner: sub; collection: collection(owner);68 sender: cross_from_sub(owner); to: cross_sub;69 };70 }: {create_max_item(&collection, &sender, to.clone())?}7172 create_multiple_items {73 let b in 0..MAX_ITEMS_PER_BATCH;74 bench_init!{75 owner: sub; collection: collection(owner);76 sender: cross_from_sub(owner); to: cross_sub;77 };78 let data = (0..b).map(|_| create_max_item_data::<T>(to.clone())).collect();79 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8081 create_multiple_items_ex {82 let b in 0..MAX_ITEMS_PER_BATCH;83 bench_init!{84 owner: sub; collection: collection(owner);85 sender: cross_from_sub(owner);86 };87 let data = (0..b).map(|i| {88 bench_init!(to: cross_sub(i););89 create_max_item_data::<T>(to)90 }).collect();91 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9293 burn_item {94 bench_init!{95 owner: sub; collection: collection(owner);96 sender: cross_from_sub(owner); burner: cross_sub;97 };98 let item = create_max_item(&collection, &sender, burner.clone())?;99 }: {<Pallet<T>>::burn(&collection, &burner, item)?}100101 transfer {102 bench_init!{103 owner: sub; collection: collection(owner);104 owner: cross_from_sub; sender: cross_sub; receiver: cross_sub;105 };106 let item = create_max_item(&collection, &owner, sender.clone())?;107 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, &Unlimited)?}108109 approve {110 bench_init!{111 owner: sub; collection: collection(owner);112 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;113 };114 let item = create_max_item(&collection, &owner, sender.clone())?;115 }: {<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?}116117 transfer_from {118 bench_init!{119 owner: sub; collection: collection(owner);120 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;121 };122 let item = create_max_item(&collection, &owner, sender.clone())?;123 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?;124 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, &Unlimited)?}125126 burn_from {127 bench_init!{128 owner: sub; collection: collection(owner);129 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;130 };131 let item = create_max_item(&collection, &owner, sender.clone())?;132 <Pallet<T>>::set_allowance(&collection, &sender, item, Some(&burner))?;133 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, &Unlimited)?}134135 set_property_permissions {136 let b in 0..MAX_PROPERTIES_PER_ITEM;137 bench_init!{138 owner: sub; collection: collection(owner);139 owner: cross_from_sub;140 };141 let perms = (0..b).map(|k| PropertyKeyPermission {142 key: property_key(k as usize),143 permission: PropertyPermission {144 mutable: false,145 collection_admin: false,146 token_owner: false,147 },148 }).collect::<Vec<_>>();149 }: {<Pallet<T>>::set_property_permissions(&collection, &owner, perms)?}150151 set_token_properties {152 let b in 0..MAX_PROPERTIES_PER_ITEM;153 bench_init!{154 owner: sub; collection: collection(owner);155 owner: cross_from_sub;156 };157 let perms = (0..b).map(|k| PropertyKeyPermission {158 key: property_key(k as usize),159 permission: PropertyPermission {160 mutable: false,161 collection_admin: true,162 token_owner: true,163 },164 }).collect::<Vec<_>>();165 <Pallet<T>>::set_property_permissions(&collection, &owner, perms)?;166 let props = (0..b).map(|k| Property {167 key: property_key(k as usize),168 value: property_value(),169 }).collect::<Vec<_>>();170 let item = create_max_item(&collection, &owner, owner.clone())?;171 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props)?}172173 delete_token_properties {174 let b in 0..MAX_PROPERTIES_PER_ITEM;175 bench_init!{176 owner: sub; collection: collection(owner);177 owner: cross_from_sub;178 };179 let perms = (0..b).map(|k| PropertyKeyPermission {180 key: property_key(k as usize),181 permission: PropertyPermission {182 mutable: true,183 collection_admin: true,184 token_owner: true,185 },186 }).collect::<Vec<_>>();187 <Pallet<T>>::set_property_permissions(&collection, &owner, perms)?;188 let props = (0..b).map(|k| Property {189 key: property_key(k as usize),190 value: property_value(),191 }).collect::<Vec<_>>();192 let item = create_max_item(&collection, &owner, owner.clone())?;193 <Pallet<T>>::set_token_properties(&collection, &owner, item, props)?;194 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();195 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete)?}196}