// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Substrate is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . //! Vesting pallet benchmarking. #![cfg(feature = "runtime-benchmarks")] use super::*; use frame_system::{RawOrigin, Module as System}; use sp_io::hashing::blake2_256; use frame_benchmarking::{benchmarks, account}; use crate::Module as Vesting; const SEED: u32 = 0; const MAX_LOCKS: u32 = 20; fn add_locks(l: u32) { for id in 0..l { let lock_id = <[u8; 8]>::decode(&mut &id.using_encoded(blake2_256)[..]) .unwrap_or_default(); let locker = account("locker", 0, SEED); let locked = 1; let reasons = WithdrawReason::Transfer | WithdrawReason::Reserve; T::Currency::set_lock(lock_id, &locker, locked.into(), reasons); } } fn setup(b: u32) -> T::AccountId { let locked = 1; let per_block = 1; let starting_block = 0; let caller = account("caller", 0, SEED); System::::set_block_number(0.into()); // Add schedule to avoid `NotVesting` error. let _ = Vesting::::add_vesting_schedule( &caller, locked.into(), per_block.into(), starting_block.into(), ); // Set lock and block number to take different code paths. let reasons = WithdrawReason::Transfer | WithdrawReason::Reserve; T::Currency::set_lock(VESTING_ID, &caller, locked.into(), reasons); System::::set_block_number(b.into()); caller } benchmarks! { _ { // Number of previous locks. // It doesn't seems to influence the timings for lower values. let l in 0 .. MAX_LOCKS => add_locks::(l); } vest_locked { let l in ...; let caller = setup::(0u32); }: vest(RawOrigin::Signed(caller)) vest_not_locked { let l in ...; let caller = setup::(1u32); }: vest(RawOrigin::Signed(caller)) vest_other_locked { let l in ...; let other: T::AccountId = setup::(0u32); let other_lookup: ::Source = T::Lookup::unlookup(other.clone()); let caller = account("caller", 0, SEED); }: vest_other(RawOrigin::Signed(caller), other_lookup) vest_other_not_locked { let l in ...; let other: T::AccountId = setup::(1u32); let other_lookup: ::Source = T::Lookup::unlookup(other.clone()); let caller = account("caller", 0, SEED); }: vest_other(RawOrigin::Signed(caller), other_lookup) vested_transfer { let u in 0 .. 1000; let from = account("from", u, SEED); let to = account("to", u, SEED); let to_lookup: ::Source = T::Lookup::unlookup(to); let transfer_amount = T::MinVestedTransfer::get(); let vesting_schedule = VestingInfo { locked: transfer_amount, per_block: 1.into(), starting_block: 0.into(), }; let _ = T::Currency::make_free_balance_be(&from, transfer_amount * 10.into()); }: _(RawOrigin::Signed(from), to_lookup, vesting_schedule) } #[cfg(test)] mod tests { use super::*; use crate::tests::{ExtBuilder, Test}; use frame_support::assert_ok; #[test] fn test_benchmarks() { ExtBuilder::default().existential_deposit(256).build().execute_with(|| { assert_ok!(test_benchmark_vest_locked::()); assert_ok!(test_benchmark_vest_not_locked::()); assert_ok!(test_benchmark_vest_other_locked::()); assert_ok!(test_benchmark_vest_other_not_locked::()); assert_ok!(test_benchmark_vested_transfer::()); }); } }