1234567891011121314151617use super::*;18use crate::{Pallet, Config, RefungibleHandle};1920use sp_std::prelude::*;21use pallet_common::benchmarking::{create_collection_raw, create_data};22use frame_benchmarking::{benchmarks, account};23use up_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH, CUSTOM_DATA_LIMIT, budget::Unlimited};24use pallet_common::bench_init;25use core::convert::TryInto;26use core::iter::IntoIterator;2728const SEED: u32 = 1;2930fn create_max_item_data<CrossAccountId: Ord>(31 users: impl IntoIterator<Item = (CrossAccountId, u128)>,32) -> CreateRefungibleExData<CrossAccountId> {33 let const_data = create_data::<CUSTOM_DATA_LIMIT>();34 CreateRefungibleExData {35 const_data,36 users: users37 .into_iter()38 .collect::<BTreeMap<_, _>>()39 .try_into()40 .unwrap(),41 }42}43fn create_max_item<T: Config>(44 collection: &RefungibleHandle<T>,45 sender: &T::CrossAccountId,46 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,47) -> Result<TokenId, DispatchError> {48 let data: CreateRefungibleExData<T::CrossAccountId> = create_max_item_data(users);49 <Pallet<T>>::create_item(&collection, sender, data, &Unlimited)?;50 Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))51}5253fn create_collection<T: Config>(owner: T::AccountId) -> Result<RefungibleHandle<T>, DispatchError> {54 create_collection_raw(55 owner,56 CollectionMode::NFT,57 <Pallet<T>>::init_collection,58 RefungibleHandle::cast,59 )60}61benchmarks! {62 create_item {63 bench_init!{64 owner: sub; collection: collection(owner);65 sender: cross_from_sub(owner); to: cross_sub;66 };67 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}6869 create_multiple_items {70 let b in 0..MAX_ITEMS_PER_BATCH;71 bench_init!{72 owner: sub; collection: collection(owner);73 sender: cross_from_sub(owner); to: cross_sub;74 };75 let data = (0..b).map(|_| create_max_item_data([(to.clone(), 200)])).collect();76 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}7778 create_multiple_items_ex_multiple_items {79 let b in 0..MAX_ITEMS_PER_BATCH;80 bench_init!{81 owner: sub; collection: collection(owner);82 sender: cross_from_sub(owner);83 };84 let data = (0..b).map(|t| {85 bench_init!(to: cross_sub(t););86 create_max_item_data([(to, 200)])87 }).collect();88 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8990 create_multiple_items_ex_multiple_owners {91 let b in 0..MAX_ITEMS_PER_BATCH;92 bench_init!{93 owner: sub; collection: collection(owner);94 sender: cross_from_sub(owner);95 };96 let data = vec![create_max_item_data((0..b).map(|u| {97 bench_init!(to: cross_sub(u););98 (to, 200)99 }))].try_into().unwrap();100 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}101102 103 burn_item_partial {104 bench_init!{105 owner: sub; collection: collection(owner);106 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;107 };108 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;109 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}110 111 burn_item_fully {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)])?;117 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}118119 transfer_normal {120 bench_init!{121 owner: sub; collection: collection(owner);122 sender: cross_from_sub(owner); receiver: cross_sub;123 };124 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;125 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}126 127 transfer_creating {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)])?;133 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}134 135 transfer_removing {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), (receiver.clone(), 200)])?;141 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}142 143 transfer_creating_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)])?;149 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}150151 approve {152 bench_init!{153 owner: sub; collection: collection(owner);154 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;155 };156 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;157 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}158159 transfer_from_normal {160 bench_init!{161 owner: sub; collection: collection(owner);162 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;163 };164 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;165 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;166 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}167 168 transfer_from_creating {169 bench_init!{170 owner: sub; collection: collection(owner);171 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;172 };173 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;174 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;175 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}176 177 transfer_from_removing {178 bench_init!{179 owner: sub; collection: collection(owner);180 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;181 };182 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;183 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;184 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}185 186 transfer_from_creating_removing {187 bench_init!{188 owner: sub; collection: collection(owner);189 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;190 };191 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;192 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;193 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}194195 196 burn_from {197 bench_init!{198 owner: sub; collection: collection(owner);199 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;200 };201 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;202 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;203 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}204}