1use super::*;2use crate::{Pallet, Config, RefungibleHandle};34use sp_std::prelude::*;5use pallet_common::benchmarking::{create_collection_raw, create_data, create_var_data};6use frame_benchmarking::{benchmarks, account};7use up_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH, CUSTOM_DATA_LIMIT};8use pallet_common::bench_init;9use core::convert::TryInto;10use core::iter::IntoIterator;1112const SEED: u32 = 1;1314fn create_max_item_data<CrossAccountId: Ord>(15 users: impl IntoIterator<Item = (CrossAccountId, u128)>,16) -> CreateRefungibleExData<CrossAccountId> {17 let const_data = create_data::<CUSTOM_DATA_LIMIT>();18 let variable_data = create_data::<CUSTOM_DATA_LIMIT>();19 CreateRefungibleExData {20 const_data,21 variable_data,22 users: users23 .into_iter()24 .collect::<BTreeMap<_, _>>()25 .try_into()26 .unwrap(),27 }28}29fn create_max_item<T: Config>(30 collection: &RefungibleHandle<T>,31 sender: &T::CrossAccountId,32 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,33) -> Result<TokenId, DispatchError> {34 <Pallet<T>>::create_item(&collection, sender, create_max_item_data(users))?;35 Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))36}3738fn create_collection<T: Config>(owner: T::AccountId) -> Result<RefungibleHandle<T>, DispatchError> {39 create_collection_raw(40 owner,41 CollectionMode::NFT,42 <Pallet<T>>::init_collection,43 RefungibleHandle::cast,44 )45}46benchmarks! {47 create_item {48 bench_init!{49 owner: sub; collection: collection(owner);50 sender: cross_from_sub(owner); to: cross_sub;51 };52 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}5354 create_multiple_items {55 let b in 0..MAX_ITEMS_PER_BATCH;56 bench_init!{57 owner: sub; collection: collection(owner);58 sender: cross_from_sub(owner); to: cross_sub;59 };60 let data = (0..b).map(|_| create_max_item_data([(to.clone(), 200)])).collect();61 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data)?}6263 64 burn_item_partial {65 bench_init!{66 owner: sub; collection: collection(owner);67 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;68 };69 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;70 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}71 72 burn_item_fully {73 bench_init!{74 owner: sub; collection: collection(owner);75 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;76 };77 let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;78 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}7980 transfer_normal {81 bench_init!{82 owner: sub; collection: collection(owner);83 sender: cross_from_sub(owner); receiver: cross_sub;84 };85 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;86 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100)?}87 88 transfer_creating {89 bench_init!{90 owner: sub; collection: collection(owner);91 sender: cross_from_sub(owner); receiver: cross_sub;92 };93 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;94 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100)?}95 96 transfer_removing {97 bench_init!{98 owner: sub; collection: collection(owner);99 sender: cross_from_sub(owner); receiver: cross_sub;100 };101 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;102 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200)?}103 104 transfer_creating_removing {105 bench_init!{106 owner: sub; collection: collection(owner);107 sender: cross_from_sub(owner); receiver: cross_sub;108 };109 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;110 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200)?}111112 approve {113 bench_init!{114 owner: sub; collection: collection(owner);115 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;116 };117 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;118 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}119120 transfer_from_normal {121 bench_init!{122 owner: sub; collection: collection(owner);123 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;124 };125 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;126 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;127 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100)?}128 129 transfer_from_creating {130 bench_init!{131 owner: sub; collection: collection(owner);132 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;133 };134 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;135 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;136 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100)?}137 138 transfer_from_removing {139 bench_init!{140 owner: sub; collection: collection(owner);141 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;142 };143 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;144 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;145 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200)?}146 147 transfer_from_creating_removing {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(), 200)])?;153 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;154 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200)?}155156 157 burn_from {158 bench_init!{159 owner: sub; collection: collection(owner);160 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;161 };162 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;163 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;164 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200)?}165166 set_variable_metadata {167 let b in 0..CUSTOM_DATA_LIMIT;168 bench_init!{169 owner: sub; collection: collection(owner);170 sender: cross_from_sub(owner);171 };172 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;173 let data = create_data(b as usize);174 }: {<Pallet<T>>::set_variable_metadata(&collection, &sender, item, data)?}175}