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>(54 owner: T::CrossAccountId,55) -> Result<RefungibleHandle<T>, DispatchError> {56 create_collection_raw(57 owner,58 CollectionMode::NFT,59 <Pallet<T>>::init_collection,60 RefungibleHandle::cast,61 )62}63benchmarks! {64 create_item {65 bench_init!{66 owner: sub; collection: collection(owner);67 sender: cross_from_sub(owner); to: cross_sub;68 };69 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}7071 create_multiple_items {72 let b in 0..MAX_ITEMS_PER_BATCH;73 bench_init!{74 owner: sub; collection: collection(owner);75 sender: cross_from_sub(owner); to: cross_sub;76 };77 let data = (0..b).map(|_| create_max_item_data([(to.clone(), 200)])).collect();78 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}7980 create_multiple_items_ex_multiple_items {81 let b in 0..MAX_ITEMS_PER_BATCH;82 bench_init!{83 owner: sub; collection: collection(owner);84 sender: cross_from_sub(owner);85 };86 let data = (0..b).map(|t| {87 bench_init!(to: cross_sub(t););88 create_max_item_data([(to, 200)])89 }).collect();90 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9192 create_multiple_items_ex_multiple_owners {93 let b in 0..MAX_ITEMS_PER_BATCH;94 bench_init!{95 owner: sub; collection: collection(owner);96 sender: cross_from_sub(owner);97 };98 let data = vec![create_max_item_data((0..b).map(|u| {99 bench_init!(to: cross_sub(u););100 (to, 200)101 }))].try_into().unwrap();102 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}103104 105 burn_item_partial {106 bench_init!{107 owner: sub; collection: collection(owner);108 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;109 };110 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;111 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}112 113 burn_item_fully {114 bench_init!{115 owner: sub; collection: collection(owner);116 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;117 };118 let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;119 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}120121 transfer_normal {122 bench_init!{123 owner: sub; collection: collection(owner);124 sender: cross_from_sub(owner); receiver: cross_sub;125 };126 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;127 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}128 129 transfer_creating {130 bench_init!{131 owner: sub; collection: collection(owner);132 sender: cross_from_sub(owner); receiver: cross_sub;133 };134 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;135 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}136 137 transfer_removing {138 bench_init!{139 owner: sub; collection: collection(owner);140 sender: cross_from_sub(owner); receiver: cross_sub;141 };142 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;143 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}144 145 transfer_creating_removing {146 bench_init!{147 owner: sub; collection: collection(owner);148 sender: cross_from_sub(owner); receiver: cross_sub;149 };150 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;151 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}152153 approve {154 bench_init!{155 owner: sub; collection: collection(owner);156 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;157 };158 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;159 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}160161 transfer_from_normal {162 bench_init!{163 owner: sub; collection: collection(owner);164 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;165 };166 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;167 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;168 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}169 170 transfer_from_creating {171 bench_init!{172 owner: sub; collection: collection(owner);173 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;174 };175 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;176 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;177 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}178 179 transfer_from_removing {180 bench_init!{181 owner: sub; collection: collection(owner);182 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;183 };184 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;185 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;186 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}187 188 transfer_from_creating_removing {189 bench_init!{190 owner: sub; collection: collection(owner);191 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;192 };193 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;194 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;195 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}196197 198 burn_from {199 bench_init!{200 owner: sub; collection: collection(owner);201 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;202 };203 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;204 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;205 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}206}