1use sp_std::vec;23use frame_benchmarking::{benchmarks, account};4use frame_system::RawOrigin;5use frame_support::{6 traits::{Currency, Get},7 BoundedVec,8};9use sp_runtime::Permill;1011use up_data_structs::*;1213use super::*;1415const SEED: u32 = 1;1617fn create_data<S: Get<u32>>() -> BoundedVec<u8, S> {18 vec![b'A'; S::get() as usize].try_into().expect("size == S")19}2021fn create_u32_array<S: Get<u32>>() -> BoundedVec<u32, S> {22 vec![0; S::get() as usize].try_into().expect("size == S")23}2425fn create_basic_resource() -> RmrkBasicResource {26 RmrkBasicResource {27 src: Some(create_data()),28 metadata: Some(create_data()),29 license: Some(create_data()),30 thumb: Some(create_data()),31 }32}3334fn create_composable_resource() -> RmrkComposableResource {35 RmrkComposableResource {36 parts: create_u32_array(),37 base: 100,38 src: Some(create_data()),39 metadata: Some(create_data()),40 license: Some(create_data()),41 thumb: Some(create_data()),42 }43}4445fn create_slot_resource() -> RmrkSlotResource {46 RmrkSlotResource {47 base: 100,48 slot: 200,49 src: Some(create_data()),50 metadata: Some(create_data()),51 license: Some(create_data()),52 thumb: Some(create_data()),53 }54}5556fn create_max_collection<T: Config>(owner: &T::AccountId) -> DispatchResult {57 <T as pallet_common::Config>::Currency::deposit_creating(58 owner,59 T::CollectionCreationPrice::get(),60 );6162 let metadata = create_data();63 let max = None;64 let symbol = create_data();6566 <Pallet<T>>::create_collection(67 RawOrigin::Signed(owner.clone()).into(),68 metadata,69 max,70 symbol,71 )72}7374fn create_max_nft<T: Config>(75 owner: &T::AccountId,76 collection_id: RmrkCollectionId,77) -> DispatchResult {78 let royalty_recipient = Some(owner.clone());79 let royalty_amount = Some(Permill::from_percent(25));80 let metadata = create_data();81 let transferable = true;8283 <Pallet<T>>::mint_nft(84 RawOrigin::Signed(owner.clone()).into(),85 owner.clone(),86 collection_id,87 royalty_recipient,88 royalty_amount,89 metadata,90 transferable,91 )92}9394struct NftBuilder {95 collection_id: RmrkCollectionId,96 current_nft_id: RmrkNftId,97}9899impl NftBuilder {100 fn new(collection_id: RmrkCollectionId) -> Self {101 Self {102 collection_id,103 current_nft_id: 0,104 }105 }106107 fn current_nft_id(&self) -> RmrkNftId {108 self.current_nft_id109 }110111 fn build<T: Config>(&mut self, owner: &T::AccountId) -> Result<RmrkNftId, DispatchError> {112 create_max_nft::<T>(owner, self.collection_id)?;113 self.current_nft_id += 1;114115 Ok(self.current_nft_id)116 }117118 fn build_tower<T: Config>(119 &mut self,120 owner: &T::AccountId,121 height: u32,122 ) -> Result<(RmrkNftId, RmrkNftId), DispatchError> {123 self.build::<T>(owner)?;124125 let root_nft_id = self.current_nft_id;126 let mut prev_nft_id = root_nft_id;127128 for _ in 0..height {129 self.build::<T>(owner)?;130131 let new_owner =132 <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::CollectionAndNftTuple(133 self.collection_id,134 prev_nft_id,135 );136137 <Pallet<T>>::send(138 RawOrigin::Signed(owner.clone()).into(),139 self.collection_id,140 self.current_nft_id,141 new_owner,142 )?;143144 prev_nft_id = self.current_nft_id;145 }146147 let deepest_nft_id = self.current_nft_id;148149 Ok((root_nft_id, deepest_nft_id))150 }151}152153benchmarks! {154 create_collection {155 let caller = account("caller", 0, SEED);156 <T as pallet_common::Config>::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());157 let metadata = create_data();158 let max = None;159 let symbol = create_data();160 }: _(RawOrigin::Signed(caller), metadata, max, symbol)161162 destroy_collection {163 let caller = account("caller", 0, SEED);164165 create_max_collection::<T>(&caller)?;166 let collection_id = 0;167 }: _(RawOrigin::Signed(caller), collection_id)168169 change_collection_issuer {170 let caller: T::AccountId = account("caller", 0, SEED);171172 create_max_collection::<T>(&caller)?;173 let collection_id = 0;174175 let new_owner: T::AccountId = account("new_owner", 0, SEED);176177 let new_owner_source = T::Lookup::unlookup(new_owner);178 }: _(RawOrigin::Signed(caller), collection_id, new_owner_source)179180 lock_collection {181 let caller: T::AccountId = account("caller", 0, SEED);182183 create_max_collection::<T>(&caller)?;184 let collection_id = 0;185 }: _(RawOrigin::Signed(caller), collection_id)186187 mint_nft {188 let caller: T::AccountId = account("caller", 0, SEED);189190 create_max_collection::<T>(&caller)?;191 let collection_id = 0;192 let owner = caller.clone();193194 let royalty_recipient = Some(caller.clone());195 let royalty_amount = Some(Permill::from_percent(25));196 let metadata = create_data();197 let transferable = true;198 }: _(199 RawOrigin::Signed(caller),200 owner,201 collection_id,202 royalty_recipient,203 royalty_amount,204 metadata,205 transferable206 )207208 send {209 let caller: T::AccountId = account("caller", 0, SEED);210 create_max_collection::<T>(&caller)?;211 let collection_id = 0;212213 let mut nft_builder = NftBuilder::new(collection_id);214 let src_nft_id = nft_builder.build::<T>(&caller)?;215 let (_, target_nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 2)?;216 }: _(217 RawOrigin::Signed(caller),218 collection_id,219 src_nft_id,220 <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::CollectionAndNftTuple(collection_id, target_nft_id)221 )222223 accept_nft {224 let caller: T::AccountId = account("caller", 0, SEED);225 let sender: T::AccountId = account("sender", 0, SEED);226227 create_max_collection::<T>(&sender)?;228 let src_collection_id = 0;229230 create_max_collection::<T>(&caller)?;231 let target_collection_id = 1;232233 let mut src_nft_builder = NftBuilder::new(src_collection_id);234 let src_nft_id = src_nft_builder.build::<T>(&sender)?;235236 let mut target_nft_builder = NftBuilder::new(target_collection_id);237 let fake_target_nft_id = target_nft_builder.build::<T>(&caller)?;238 let (_, target_nft_id) = target_nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;239240 let new_owner = <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::CollectionAndNftTuple(241 target_collection_id,242 fake_target_nft_id243 );244245 let actual_new_owner = <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::CollectionAndNftTuple(246 target_collection_id,247 target_nft_id248 );249250 <Pallet<T>>::send(251 RawOrigin::Signed(sender.clone()).into(),252 src_collection_id,253 src_nft_id,254 new_owner,255 )?;256 }: _(257 RawOrigin::Signed(caller),258 src_collection_id,259 src_nft_id,260 actual_new_owner261 )262263 reject_nft {264 let caller: T::AccountId = account("caller", 0, SEED);265 let sender: T::AccountId = account("sender", 0, SEED);266267 create_max_collection::<T>(&sender)?;268 let src_collection_id = 0;269270 create_max_collection::<T>(&caller)?;271 let target_collection_id = 1;272273 let mut src_nft_builder = NftBuilder::new(src_collection_id);274 let (src_root_nft_id, _) = src_nft_builder.build_tower::<T>(&sender, NESTING_BUDGET - 1)?;275276 let mut target_nft_builder = NftBuilder::new(target_collection_id);277 let target_nft_id = target_nft_builder.build::<T>(&caller)?;278279 let new_owner = <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::CollectionAndNftTuple(280 target_collection_id,281 target_nft_id282 );283284 <Pallet<T>>::send(285 RawOrigin::Signed(sender.clone()).into(),286 src_collection_id,287 src_root_nft_id,288 new_owner,289 )?;290 }: _(291 RawOrigin::Signed(caller),292 src_collection_id,293 src_root_nft_id294 )295296 set_property {297 let caller: T::AccountId = account("caller", 0, SEED);298 create_max_collection::<T>(&caller)?;299 let collection_id = 0;300301 let mut nft_builder = NftBuilder::new(collection_id);302 let (_, nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;303304 let key = create_data();305 let value = create_data();306 }: _(307 RawOrigin::Signed(caller),308 collection_id,309 Some(nft_id),310 key,311 value312 )313314 set_priority {315 let caller: T::AccountId = account("caller", 0, SEED);316 create_max_collection::<T>(&caller)?;317 let collection_id = 0;318319 let mut nft_builder = NftBuilder::new(collection_id);320 let (_, nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;321 let priorities = create_u32_array();322 }: _(323 RawOrigin::Signed(caller),324 collection_id,325 nft_id,326 priorities327 )328329 add_basic_resource {330 let caller: T::AccountId = account("caller", 0, SEED);331 <T as pallet_common::Config>::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());332333 create_max_collection::<T>(&caller)?;334 let collection_id = 0;335336 let mut nft_builder = NftBuilder::new(collection_id);337 let (_, nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;338 let resource = create_basic_resource();339 }: _(340 RawOrigin::Signed(caller),341 collection_id,342 nft_id,343 resource344 )345346 add_composable_resource {347 let caller: T::AccountId = account("caller", 0, SEED);348 <T as pallet_common::Config>::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());349350 create_max_collection::<T>(&caller)?;351 let collection_id = 0;352353 let mut nft_builder = NftBuilder::new(collection_id);354 let (_, nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;355 let resource = create_composable_resource();356 }: _(357 RawOrigin::Signed(caller),358 collection_id,359 nft_id,360 resource361 )362363 add_slot_resource {364 let caller: T::AccountId = account("caller", 0, SEED);365 <T as pallet_common::Config>::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());366367 create_max_collection::<T>(&caller)?;368 let collection_id = 0;369370 let mut nft_builder = NftBuilder::new(collection_id);371 let (_, nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;372 let resource = create_slot_resource();373 }: _(374 RawOrigin::Signed(caller),375 collection_id,376 nft_id,377 resource378 )379380 remove_resource {381 let caller: T::AccountId = account("caller", 0, SEED);382 <T as pallet_common::Config>::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());383384 create_max_collection::<T>(&caller)?;385 let collection_id = 0;386387 let mut nft_builder = NftBuilder::new(collection_id);388 let (_, nft_id) = nft_builder.build_tower::<T>(&caller, NESTING_BUDGET - 1)?;389 let resource = create_basic_resource();390391 <Pallet<T>>::add_basic_resource(392 RawOrigin::Signed(caller.clone()).into(),393 collection_id,394 nft_id,395 resource396 )?;397398 let resource_id = 1;399 }: _(400 RawOrigin::Signed(caller),401 collection_id,402 nft_id,403 resource_id404 )405406 accept_resource {407 let caller: T::AccountId = account("caller", 0, SEED);408 let admin: T::AccountId = account("admin", 0, SEED);409410 <T as pallet_common::Config>::Currency::deposit_creating(&admin, T::CollectionCreationPrice::get());411412 create_max_collection::<T>(&admin)?;413 let collection_id = 0;414415 let mut nft_builder = NftBuilder::new(collection_id);416 let root_nft_id = 1;417 let (_, nested_nft_id) = nft_builder.build_tower::<T>(&admin, NESTING_BUDGET - 1)?;418 let resource = create_basic_resource();419420 let new_owner = <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::AccountId(caller.clone());421422 <Pallet<T>>::send(423 RawOrigin::Signed(admin.clone()).into(),424 collection_id,425 root_nft_id,426 new_owner,427 )?;428429 <Pallet<T>>::add_basic_resource(430 RawOrigin::Signed(admin.clone()).into(),431 collection_id,432 nested_nft_id,433 resource434 )?;435436 let resource_id = 1;437 }: _(438 RawOrigin::Signed(caller),439 collection_id,440 nested_nft_id,441 resource_id442 )443444 accept_resource_removal {445 let caller: T::AccountId = account("caller", 0, SEED);446 let admin: T::AccountId = account("admin", 0, SEED);447448 <T as pallet_common::Config>::Currency::deposit_creating(&admin, T::CollectionCreationPrice::get());449450 create_max_collection::<T>(&admin)?;451 let collection_id = 0;452453 let mut nft_builder = NftBuilder::new(collection_id);454 let root_nft_id = 1;455 let (_, nested_nft_id) = nft_builder.build_tower::<T>(&admin, NESTING_BUDGET - 1)?;456 let resource = create_basic_resource();457458 <Pallet<T>>::add_basic_resource(459 RawOrigin::Signed(admin.clone()).into(),460 collection_id,461 nested_nft_id,462 resource463 )?;464465 let resource_id = 1;466467 let new_owner = <RmrkAccountIdOrCollectionNftTuple<T::AccountId>>::AccountId(caller.clone());468469 <Pallet<T>>::send(470 RawOrigin::Signed(admin.clone()).into(),471 collection_id,472 root_nft_id,473 new_owner,474 )?;475476 <Pallet<T>>::remove_resource(477 RawOrigin::Signed(admin).into(),478 collection_id,479 nested_nft_id,480 resource_id481 )?;482 }: _(483 RawOrigin::Signed(caller),484 collection_id,485 nested_nft_id,486 resource_id487 )488}