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 let data: CreateRefungibleExData<T::CrossAccountId> = create_max_item_data(users);35 <Pallet<T>>::create_item(&collection, sender, data)?;36 Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))37}3839fn create_collection<T: Config>(owner: T::AccountId) -> Result<RefungibleHandle<T>, DispatchError> {40 create_collection_raw(41 owner,42 CollectionMode::NFT,43 <Pallet<T>>::init_collection,44 RefungibleHandle::cast,45 )46}47benchmarks! {48 create_item {49 bench_init!{50 owner: sub; collection: collection(owner);51 sender: cross_from_sub(owner); to: cross_sub;52 };53 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}5455 create_multiple_items {56 let b in 0..MAX_ITEMS_PER_BATCH;57 bench_init!{58 owner: sub; collection: collection(owner);59 sender: cross_from_sub(owner); to: cross_sub;60 };61 let data = (0..b).map(|_| create_max_item_data([(to.clone(), 200)])).collect();62 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data)?}6364 create_multiple_items_ex_multiple_items {65 let b in 0..MAX_ITEMS_PER_BATCH;66 bench_init!{67 owner: sub; collection: collection(owner);68 sender: cross_from_sub(owner);69 };70 let data = (0..b).map(|t| {71 bench_init!(to: cross_sub(t););72 create_max_item_data([(to, 200)])73 }).collect();74 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data)?}7576 create_multiple_items_ex_multiple_owners {77 let b in 0..MAX_ITEMS_PER_BATCH;78 bench_init!{79 owner: sub; collection: collection(owner);80 sender: cross_from_sub(owner);81 };82 let data = vec![create_max_item_data((0..b).map(|u| {83 bench_init!(to: cross_sub(u););84 (to, 200)85 }))].try_into().unwrap();86 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data)?}8788 89 burn_item_partial {90 bench_init!{91 owner: sub; collection: collection(owner);92 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;93 };94 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;95 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}96 97 burn_item_fully {98 bench_init!{99 owner: sub; collection: collection(owner);100 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;101 };102 let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;103 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}104105 transfer_normal {106 bench_init!{107 owner: sub; collection: collection(owner);108 sender: cross_from_sub(owner); receiver: cross_sub;109 };110 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;111 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100)?}112 113 transfer_creating {114 bench_init!{115 owner: sub; collection: collection(owner);116 sender: cross_from_sub(owner); receiver: cross_sub;117 };118 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;119 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100)?}120 121 transfer_removing {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, 200)?}128 129 transfer_creating_removing {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, 200)?}136137 approve {138 bench_init!{139 owner: sub; collection: collection(owner);140 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;141 };142 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;143 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}144145 transfer_from_normal {146 bench_init!{147 owner: sub; collection: collection(owner);148 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;149 };150 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;151 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;152 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100)?}153 154 transfer_from_creating {155 bench_init!{156 owner: sub; collection: collection(owner);157 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;158 };159 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;160 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;161 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100)?}162 163 transfer_from_removing {164 bench_init!{165 owner: sub; collection: collection(owner);166 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;167 };168 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;169 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;170 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200)?}171 172 transfer_from_creating_removing {173 bench_init!{174 owner: sub; collection: collection(owner);175 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;176 };177 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;178 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;179 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200)?}180181 182 burn_from {183 bench_init!{184 owner: sub; collection: collection(owner);185 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;186 };187 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;188 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;189 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200)?}190191 set_variable_metadata {192 let b in 0..CUSTOM_DATA_LIMIT;193 bench_init!{194 owner: sub; collection: collection(owner);195 sender: cross_from_sub(owner);196 };197 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;198 let data = create_var_data(b).try_into().unwrap();199 }: {<Pallet<T>>::set_variable_metadata(&collection, &sender, item, data)?}200}