1234567891011121314151617#![cfg(feature = "runtime-benchmarks")]1819use super::*;20use crate::Pallet as PromototionPallet;2122use sp_runtime::traits::Bounded;23use sp_std::vec;2425use frame_benchmarking::{benchmarks, account};26use frame_support::traits::OnInitialize;27use frame_system::{Origin, RawOrigin};28use pallet_unique::benchmarking::create_nft_collection;29use pallet_evm_migration::Pallet as EvmMigrationPallet;3031const SEED: u32 = 0;3233fn set_admin<T>() -> Result<T::AccountId, sp_runtime::DispatchError>34where35 T: Config + pallet_unique::Config + pallet_evm_migration::Config,36 T::BlockNumber: From<u32> + Into<u32>,37 <<T as Config>::Currency as Currency<T::AccountId>>::Balance: Sum + From<u128>,38{39 let pallet_admin = account::<T::AccountId>("admin", 0, SEED);4041 <T as Config>::Currency::make_free_balance_be(42 &pallet_admin,43 Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value(),44 );4546 PromototionPallet::<T>::set_admin_address(47 RawOrigin::Root.into(),48 T::CrossAccountId::from_sub(pallet_admin.clone()),49 )?;5051 Ok(pallet_admin)52}5354benchmarks! {55 where_clause{56 where T: Config + pallet_unique::Config + pallet_evm_migration::Config ,57 T::BlockNumber: From<u32> + Into<u32>,58 <<T as Config>::Currency as Currency<T::AccountId>>::Balance: Sum + From<u128>59 }6061 on_initialize {62 let b in 0..PENDING_LIMIT_PER_BLOCK;63 set_admin::<T>()?;6465 (0..b).try_for_each(|index| {66 let staker = account::<T::AccountId>("staker", index, SEED);67 <T as Config>::Currency::make_free_balance_be(&staker, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());68 PromototionPallet::<T>::stake(RawOrigin::Signed(staker.clone()).into(), Into::<BalanceOf<T>>::into(100u128) * T::Nominal::get())?;69 PromototionPallet::<T>::unstake(RawOrigin::Signed(staker.clone()).into()).map_err(|e| e.error)?;70 Result::<(), sp_runtime::DispatchError>::Ok(())71 })?;72 let block_number = <frame_system::Pallet<T>>::current_block_number() + T::PendingInterval::get();73 }: {PromototionPallet::<T>::on_initialize(block_number)}7475 set_admin_address {76 let pallet_admin = account::<T::AccountId>("admin", 0, SEED);77 let _ = <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());78 } : _(RawOrigin::Root, T::CrossAccountId::from_sub(pallet_admin))7980 payout_stakers{81 let b in 1..101;8283 let pallet_admin = account::<T::AccountId>("admin", 1, SEED);84 let share = Perbill::from_rational(1u32, 20);85 PromototionPallet::<T>::set_admin_address(RawOrigin::Root.into(), T::CrossAccountId::from_sub(pallet_admin.clone()))?;86 <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());8788 let staker: T::AccountId = account("caller", 0, SEED);89 <T as Config>::Currency::make_free_balance_be(&staker, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());90 let stakers: Vec<T::AccountId> = (0..b).map(|index| account("staker", index, SEED)).collect();91 stakers.iter().for_each(|staker| {92 <T as Config>::Currency::make_free_balance_be(&staker, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());93 });94 (0..10).try_for_each(|_| {95 stakers.iter()96 .map(|staker| {97 PromototionPallet::<T>::stake(RawOrigin::Signed(staker.clone()).into(), Into::<BalanceOf<T>>::into(100u128) * T::Nominal::get())98 }).collect::<Result<Vec<_>, _>>()?;99 <frame_system::Pallet<T>>::finalize();100 Result::<(), sp_runtime::DispatchError>::Ok(())101 })?;102 } : _(RawOrigin::Signed(pallet_admin.clone()), Some(b as u8))103104 stake {105 let caller = account::<T::AccountId>("caller", 0, SEED);106 let share = Perbill::from_rational(1u32, 10);107 let _ = <T as Config>::Currency::make_free_balance_be(&caller, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());108 } : _(RawOrigin::Signed(caller.clone()), share * <T as Config>::Currency::total_balance(&caller))109110 unstake {111 let caller = account::<T::AccountId>("caller", 0, SEED);112 let share = Perbill::from_rational(1u32, 20);113 let _ = <T as Config>::Currency::make_free_balance_be(&caller, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());114 (0..10).map(|_| {115 116 <frame_system::Pallet<T>>::finalize();117 PromototionPallet::<T>::stake(RawOrigin::Signed(caller.clone()).into(), share * <T as Config>::Currency::total_balance(&caller))118 }).collect::<Result<Vec<_>, _>>()?;119120 } : _(RawOrigin::Signed(caller.clone()))121122 sponsor_collection {123 let pallet_admin = account::<T::AccountId>("admin", 0, SEED);124 PromototionPallet::<T>::set_admin_address(RawOrigin::Root.into(), T::CrossAccountId::from_sub(pallet_admin.clone()))?;125 let _ = <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());126 let caller: T::AccountId = account("caller", 0, SEED);127 let _ = <T as Config>::Currency::make_free_balance_be(&caller, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());128 let collection = create_nft_collection::<T>(caller.clone())?;129 } : _(RawOrigin::Signed(pallet_admin.clone()), collection)130131 stop_sponsoring_collection {132 let pallet_admin = account::<T::AccountId>("admin", 0, SEED);133 PromototionPallet::<T>::set_admin_address(RawOrigin::Root.into(), T::CrossAccountId::from_sub(pallet_admin.clone()))?;134 let _ = <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());135 let caller: T::AccountId = account("caller", 0, SEED);136 let _ = <T as Config>::Currency::make_free_balance_be(&caller, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());137 let collection = create_nft_collection::<T>(caller.clone())?;138 PromototionPallet::<T>::sponsor_collection(RawOrigin::Signed(pallet_admin.clone()).into(), collection)?;139 } : _(RawOrigin::Signed(pallet_admin.clone()), collection)140141 sponsor_contract {142 let pallet_admin = account::<T::AccountId>("admin", 0, SEED);143 PromototionPallet::<T>::set_admin_address(RawOrigin::Root.into(), T::CrossAccountId::from_sub(pallet_admin.clone()))?;144145 let _ = <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());146 let address = H160::from_low_u64_be(SEED as u64);147 let data: Vec<u8> = (0..20 as u8).collect();148 <EvmMigrationPallet<T>>::begin(RawOrigin::Root.into(), address)?;149 <EvmMigrationPallet<T>>::finish(RawOrigin::Root.into(), address, data)?;150 } : _(RawOrigin::Signed(pallet_admin.clone()), address)151152 stop_sponsoring_contract {153 let pallet_admin = account::<T::AccountId>("admin", 0, SEED);154 PromototionPallet::<T>::set_admin_address(RawOrigin::Root.into(), T::CrossAccountId::from_sub(pallet_admin.clone()))?;155156 let _ = <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());157 let address = H160::from_low_u64_be(SEED as u64);158 let data: Vec<u8> = (0..20 as u8).collect();159 <EvmMigrationPallet<T>>::begin(RawOrigin::Root.into(), address)?;160 <EvmMigrationPallet<T>>::finish(RawOrigin::Root.into(), address, data)?;161 PromototionPallet::<T>::sponsor_contract(RawOrigin::Signed(pallet_admin.clone()).into(), address)?;162 } : _(RawOrigin::Signed(pallet_admin.clone()), address)163}