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 approve_from {167 bench_init!{168 owner: sub; collection: collection(owner);169 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;170 };171 let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());172 let item = create_max_item(&collection, &owner, [(owner_eth.clone(), 200)])?;173 }: {<Pallet<T>>::set_allowance_from(&collection, &sender, &owner_eth, &spender, item, 100)?}174175 transfer_from_normal {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), (receiver.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_creating {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)])?;190 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;191 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}192 193 transfer_from_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), (receiver.clone(), 200)])?;199 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;200 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}201 202 transfer_from_creating_removing {203 bench_init!{204 owner: sub; collection: collection(owner);205 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;206 };207 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;208 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;209 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}210211 212 burn_from {213 bench_init!{214 owner: sub; collection: collection(owner);215 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;216 };217 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;218 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;219 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}220221 set_token_property_permissions {222 let b in 0..MAX_PROPERTIES_PER_ITEM;223 bench_init!{224 owner: sub; collection: collection(owner);225 owner: cross_from_sub;226 };227 let perms = (0..b).map(|k| PropertyKeyPermission {228 key: property_key(k as usize),229 permission: PropertyPermission {230 mutable: false,231 collection_admin: false,232 token_owner: false,233 },234 }).collect::<Vec<_>>();235 }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}236237 set_token_properties {238 let b in 0..MAX_PROPERTIES_PER_ITEM;239 bench_init!{240 owner: sub; collection: collection(owner);241 owner: cross_from_sub;242 };243 let perms = (0..b).map(|k| PropertyKeyPermission {244 key: property_key(k as usize),245 permission: PropertyPermission {246 mutable: false,247 collection_admin: true,248 token_owner: true,249 },250 }).collect::<Vec<_>>();251 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;252 let props = (0..b).map(|k| Property {253 key: property_key(k as usize),254 value: property_value(),255 }).collect::<Vec<_>>();256 let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;257 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}258259 delete_token_properties {260 let b in 0..MAX_PROPERTIES_PER_ITEM;261 bench_init!{262 owner: sub; collection: collection(owner);263 owner: cross_from_sub;264 };265 let perms = (0..b).map(|k| PropertyKeyPermission {266 key: property_key(k as usize),267 permission: PropertyPermission {268 mutable: true,269 collection_admin: true,270 token_owner: true,271 },272 }).collect::<Vec<_>>();273 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;274 let props = (0..b).map(|k| Property {275 key: property_key(k as usize),276 value: property_value(),277 }).collect::<Vec<_>>();278 let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;279 <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;280 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();281 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}282283 repartition_item {284 bench_init!{285 owner: sub; collection: collection(owner);286 sender: cross_from_sub(owner); owner: cross_sub;287 };288 let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;289 }: {<Pallet<T>>::repartition(&collection, &owner, item, 200)?}290291 token_owner {292 bench_init!{293 owner: sub; collection: collection(owner);294 sender: cross_from_sub(owner); owner: cross_sub;295 };296 let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;297 }: {<Pallet<T>>::token_owner(collection.id, item)}298299 set_allowance_for_all {300 bench_init!{301 owner: sub; collection: collection(owner); owner: cross_from_sub;302 operator: cross_sub;303 };304 }: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}305306 allowance_for_all {307 bench_init!{308 owner: sub; collection: collection(owner); owner: cross_from_sub;309 operator: cross_sub;310 };311 }: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}312313 repair_item {314 bench_init!{315 owner: sub; collection: collection(owner);316 owner: cross_from_sub;317 };318 let item = create_max_item(&collection, &owner, [(owner.clone(), 100)])?;319 }: {<Pallet<T>>::repair_item(&collection, item)?}320}