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 properties: Default::default(),42 }43}44fn create_max_item<T: Config>(45 collection: &RefungibleHandle<T>,46 sender: &T::CrossAccountId,47 users: impl IntoIterator<Item = (T::CrossAccountId, u128)>,48) -> Result<TokenId, DispatchError> {49 let data: CreateRefungibleExData<T::CrossAccountId> = create_max_item_data(users);50 <Pallet<T>>::create_item(&collection, sender, data, &Unlimited)?;51 Ok(TokenId(<TokensMinted<T>>::get(&collection.id)))52}5354fn create_collection<T: Config>(55 owner: T::CrossAccountId,56) -> Result<RefungibleHandle<T>, DispatchError> {57 create_collection_raw(58 owner,59 CollectionMode::NFT,60 <Pallet<T>>::init_collection,61 RefungibleHandle::cast,62 )63}64benchmarks! {65 create_item {66 bench_init!{67 owner: sub; collection: collection(owner);68 sender: cross_from_sub(owner); to: cross_sub;69 };70 }: {create_max_item(&collection, &sender, [(to.clone(), 200)])?}7172 create_multiple_items {73 let b in 0..MAX_ITEMS_PER_BATCH;74 bench_init!{75 owner: sub; collection: collection(owner);76 sender: cross_from_sub(owner); to: cross_sub;77 };78 let data = (0..b).map(|_| create_max_item_data([(to.clone(), 200)])).collect();79 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}8081 create_multiple_items_ex_multiple_items {82 let b in 0..MAX_ITEMS_PER_BATCH;83 bench_init!{84 owner: sub; collection: collection(owner);85 sender: cross_from_sub(owner);86 };87 let data = (0..b).map(|t| {88 bench_init!(to: cross_sub(t););89 create_max_item_data([(to, 200)])90 }).collect();91 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}9293 create_multiple_items_ex_multiple_owners {94 let b in 0..MAX_ITEMS_PER_BATCH;95 bench_init!{96 owner: sub; collection: collection(owner);97 sender: cross_from_sub(owner);98 };99 let data = vec![create_max_item_data((0..b).map(|u| {100 bench_init!(to: cross_sub(u););101 (to, 200)102 }))].try_into().unwrap();103 }: {<Pallet<T>>::create_multiple_items(&collection, &sender, data, &Unlimited)?}104105 106 burn_item_partial {107 bench_init!{108 owner: sub; collection: collection(owner);109 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;110 };111 let item = create_max_item(&collection, &sender, [(burner.clone(), 200), (another_owner, 200)])?;112 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}113 114 burn_item_fully {115 bench_init!{116 owner: sub; collection: collection(owner);117 sender: cross_from_sub(owner); burner: cross_sub; another_owner: cross_sub;118 };119 let item = create_max_item(&collection, &sender, [(burner.clone(), 200)])?;120 }: {<Pallet<T>>::burn(&collection, &burner, item, 200)?}121122 transfer_normal {123 bench_init!{124 owner: sub; collection: collection(owner);125 sender: cross_from_sub(owner); receiver: cross_sub;126 };127 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;128 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}129 130 transfer_creating {131 bench_init!{132 owner: sub; collection: collection(owner);133 sender: cross_from_sub(owner); receiver: cross_sub;134 };135 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;136 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 100, &Unlimited)?}137 138 transfer_removing {139 bench_init!{140 owner: sub; collection: collection(owner);141 sender: cross_from_sub(owner); receiver: cross_sub;142 };143 let item = create_max_item(&collection, &sender, [(sender.clone(), 200), (receiver.clone(), 200)])?;144 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}145 146 transfer_creating_removing {147 bench_init!{148 owner: sub; collection: collection(owner);149 sender: cross_from_sub(owner); receiver: cross_sub;150 };151 let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?;152 }: {<Pallet<T>>::transfer(&collection, &sender, &receiver, item, 200, &Unlimited)?}153154 approve {155 bench_init!{156 owner: sub; collection: collection(owner);157 owner: cross_from_sub; sender: cross_sub; spender: cross_sub;158 };159 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;160 }: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}161162 transfer_from_normal {163 bench_init!{164 owner: sub; collection: collection(owner);165 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;166 };167 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;168 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;169 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}170 171 transfer_from_creating {172 bench_init!{173 owner: sub; collection: collection(owner);174 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;175 };176 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;177 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?;178 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 100, &Unlimited)?}179 180 transfer_from_removing {181 bench_init!{182 owner: sub; collection: collection(owner);183 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;184 };185 let item = create_max_item(&collection, &owner, [(sender.clone(), 200), (receiver.clone(), 200)])?;186 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;187 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}188 189 transfer_from_creating_removing {190 bench_init!{191 owner: sub; collection: collection(owner);192 owner: cross_from_sub; sender: cross_sub; spender: cross_sub; receiver: cross_sub;193 };194 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;195 <Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 200)?;196 }: {<Pallet<T>>::transfer_from(&collection, &spender, &sender, &receiver, item, 200, &Unlimited)?}197198 199 burn_from {200 bench_init!{201 owner: sub; collection: collection(owner);202 owner: cross_from_sub; sender: cross_sub; burner: cross_sub;203 };204 let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;205 <Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;206 }: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}207208 repartition_item {209 bench_init!{210 owner: sub; collection: collection(owner);211 sender: cross_from_sub(owner); owner: cross_sub;212 };213 let item = create_max_item(&collection, &sender, [(owner.clone(), 100)])?;214 }: {<Pallet<T>>::repartition(&collection, &owner, item, 200)?}215}