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::{29 CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, budget::Unlimited,30 PropertyPermission,31};3233const SEED: u32 = 1;3435fn create_max_item_data<T: Config>(36 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,37) -> CreateItemData<T> {38 CreateItemData::<T> {39 users: users40 .into_iter()41 .collect::<BTreeMap<_, _>>()42 .try_into()43 .unwrap(),44 properties: Default::default(),45 }46}4748fn create_max_item<T: Config>(49 collection: &RefungibleHandle<T>,50 sender: &T::CrossAccountId,51 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,52) -> Result<TokenId, DispatchError> {53 let data: CreateItemData<T> = create_max_item_data::<T>(users);54 <Pallet<T>>::create_item(collection, sender, data, &Unlimited)?;55 Ok(TokenId(<TokensMinted<T>>::get(collection.id)))56}5758fn create_collection<T: Config>(59 owner: T::CrossAccountId,60) -> Result<RefungibleHandle<T>, DispatchError> {61 create_collection_raw(62 owner,63 CollectionMode::ReFungible,64 |owner: T::CrossAccountId, data| <Pallet<T>>::init_collection(owner.clone(), owner, data),65 RefungibleHandle::cast,66 )67}6869benchmarks! {70 create_item {71 bench_init!{72 owner: sub; collection: collection(owner);73 sender: cross_from_sub(owner); to: cross_sub;74 };75 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}7677 create_multiple_items {78 let b in 0..MAX_ITEMS_PER_BATCH;79 bench_init!{80 owner: sub; collection: collection(owner);81 sender: cross_from_sub(owner); to: cross_sub;82 };83 let data = (0..b).map(|_| create_max_item_data::<T>([(to.clone(), 200)])).collect();84 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8586 create_multiple_items_ex_multiple_items {87 let b in 0..MAX_ITEMS_PER_BATCH;88 bench_init!{89 owner: sub; collection: collection(owner);90 sender: cross_from_sub(owner);91 };92 let data = (0..b).map(|t| {93 bench_init!(to: cross_sub(t););94 create_max_item_data::<T>([(to, 200)])95 }).collect();96 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9798 create_multiple_items_ex_multiple_owners {99 let b in 0..MAX_ITEMS_PER_BATCH;100 bench_init!{101 owner: sub; collection: collection(owner);102 sender: cross_from_sub(owner);103 };104 let data = vec![create_max_item_data::<T>((0..b).map(|u| {105 bench_init!(to: cross_sub(u););106 (to, 200)107 }))];108 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}109110 111 burn_item_partial {112 bench_init!{113 owner: sub; collection: collection(owner);114 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;115 };116 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;117 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}118 119 burn_item_fully {120 bench_init!{121 owner: sub; collection: collection(owner);122 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;123 };124 let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;125 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}126127 transfer_normal {128 bench_init!{129 owner: sub; collection: collection(owner);130 sender: cross_from_sub(owner); receiver: cross_sub;131 };132 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;133 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}134 135 transfer_creating {136 bench_init!{137 owner: sub; collection: collection(owner);138 sender: cross_from_sub(owner); receiver: cross_sub;139 };140 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;141 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}142 143 transfer_removing {144 bench_init!{145 owner: sub; collection: collection(owner);146 sender: cross_from_sub(owner); receiver: cross_sub;147 };148 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;149 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}150 151 transfer_creating_removing {152 bench_init!{153 owner: sub; collection: collection(owner);154 sender: cross_from_sub(owner); receiver: cross_sub;155 };156 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;157 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}158159 approve {160 bench_init!{161 owner: sub; collection: collection(owner);162 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;163 };164 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;165 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}166167 approve_from {168 bench_init!{169 owner: sub; collection: collection(owner);170 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;171 };172 let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());173 let item = create_max_item(&collection, &owner, [(owner_eth.clone(), 200)])?;174 }: {<Pallet<T>>::set_allowance_from(&collection, &sender, &owner_eth, &spender, item, 100)?}175176 transfer_from_normal {177 bench_init!{178 owner: sub; collection: collection(owner);179 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;180 };181 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;182 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;183 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}184 185 transfer_from_creating {186 bench_init!{187 owner: sub; collection: collection(owner);188 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;189 };190 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;191 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;192 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}193 194 transfer_from_removing {195 bench_init!{196 owner: sub; collection: collection(owner);197 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;198 };199 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;200 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;201 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}202 203 transfer_from_creating_removing {204 bench_init!{205 owner: sub; collection: collection(owner);206 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;207 };208 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;209 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;210 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}211212 213 burn_from {214 bench_init!{215 owner: sub; collection: collection(owner);216 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;217 };218 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;219 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;220 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}221222 set_token_property_permissions {223 let b in 0..MAX_PROPERTIES_PER_ITEM;224 bench_init!{225 owner: sub; collection: collection(owner);226 owner: cross_from_sub;227 };228 let perms = (0..b).map(|k| PropertyKeyPermission {229 key: property_key(k as usize),230 permission: PropertyPermission {231 mutable: false,232 collection_admin: false,233 token_owner: false,234 },235 }).collect::<Vec<_>>();236 }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}237238 set_token_properties {239 let b in 0..MAX_PROPERTIES_PER_ITEM;240 bench_init!{241 owner: sub; collection: collection(owner);242 owner: cross_from_sub;243 };244 let perms = (0..b).map(|k| PropertyKeyPermission {245 key: property_key(k as usize),246 permission: PropertyPermission {247 mutable: false,248 collection_admin: true,249 token_owner: true,250 },251 }).collect::<Vec<_>>();252 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;253 let props = (0..b).map(|k| Property {254 key: property_key(k as usize),255 value: property_value(),256 }).collect::<Vec<_>>();257 let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;258 }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?}259260 delete_token_properties {261 let b in 0..MAX_PROPERTIES_PER_ITEM;262 bench_init!{263 owner: sub; collection: collection(owner);264 owner: cross_from_sub;265 };266 let perms = (0..b).map(|k| PropertyKeyPermission {267 key: property_key(k as usize),268 permission: PropertyPermission {269 mutable: true,270 collection_admin: true,271 token_owner: true,272 },273 }).collect::<Vec<_>>();274 <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;275 let props = (0..b).map(|k| Property {276 key: property_key(k as usize),277 value: property_value(),278 }).collect::<Vec<_>>();279 let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;280 <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?;281 let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();282 }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}283284 repartition_item {285 bench_init!{286 owner: sub; collection: collection(owner);287 sender: cross_from_sub(owner); owner: cross_sub;288 };289 let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;290 }: {<Pallet<T>>::repartition(&collection, &owner, item, 200)?}291292 token_owner {293 bench_init!{294 owner: sub; collection: collection(owner);295 sender: cross_from_sub(owner); owner: cross_sub;296 };297 let item = create_max_item(&collection, &sender, [(owner, 100)])?;298 }: {<Pallet<T>>::token_owner(collection.id, item).unwrap()}299300 set_allowance_for_all {301 bench_init!{302 owner: sub; collection: collection(owner); owner: cross_from_sub;303 operator: cross_sub;304 };305 }: {<Pallet<T>>::set_allowance_for_all(&collection, &owner, &operator, true)?}306307 allowance_for_all {308 bench_init!{309 owner: sub; collection: collection(owner); owner: cross_from_sub;310 operator: cross_sub;311 };312 }: {<Pallet<T>>::allowance_for_all(&collection, &owner, &operator)}313314 repair_item {315 bench_init!{316 owner: sub; collection: collection(owner);317 owner: cross_from_sub;318 };319 let item = create_max_item(&collection, &owner, [(owner.clone(), 100)])?;320 }: {<Pallet<T>>::repair_item(&collection, item)?}321}