Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Migrated benchmarking of vstoken-conversion from v1 to v2. #1535

Merged
merged 2 commits into from
Dec 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
230 changes: 145 additions & 85 deletions pallets/vstoken-conversion/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#![cfg(feature = "runtime-benchmarks")]

use bifrost_primitives::{CurrencyId, TokenSymbol};
use frame_benchmarking::v1::{account, benchmarks, BenchmarkError};
use frame_benchmarking::v2::*;
use frame_support::{
assert_ok,
traits::{EnsureOrigin, Get},
Expand All @@ -36,106 +36,166 @@ use crate::{
pub const VS_BOND: CurrencyId = CurrencyId::VSBond(TokenSymbol::BNC, 2001, 0, 8);
pub const VS_KSM: CurrencyId = CurrencyId::VSToken(TokenSymbol::KSM);

benchmarks! {
set_exchange_fee {
let origin = T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
let fee: VstokenConversionExchangeFee<BalanceOf<T>> =
VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};
}: _<T::RuntimeOrigin>(origin,fee)

set_exchange_rate {
let origin = T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
let fee: VstokenConversionExchangeFee<BalanceOf<T>> =
VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};
#[benchmarks]
mod benchmarks {
use super::*;

#[benchmark]
fn set_exchange_fee() -> Result<(), BenchmarkError> {
let origin =
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
let fee: VstokenConversionExchangeFee<BalanceOf<T>> = VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};

#[extrinsic_call]
_(origin as <T as frame_system::Config>::RuntimeOrigin, fee);

Ok(())
}

#[benchmark]
fn set_exchange_rate() -> Result<(), BenchmarkError> {
let origin =
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
let rate: VstokenConversionExchangeRate = VstokenConversionExchangeRate {
vsbond_convert_to_vstoken: Percent::from_percent(5),
vstoken_convert_to_vsbond: Percent::from_percent(5),
};
}: _<T::RuntimeOrigin>(origin,1,rate)

set_relaychain_lease {
let origin = T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
}: _<T::RuntimeOrigin>(origin,1)

vsbond_convert_to_vstoken {
let test_account: T::AccountId = account("seed",1,1);
let fee: VstokenConversionExchangeFee<BalanceOf<T>> =
VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};

#[extrinsic_call]
_(origin as <T as frame_system::Config>::RuntimeOrigin, 1, rate);

Ok(())
}

#[benchmark]
fn set_relaychain_lease() -> Result<(), BenchmarkError> {
let origin =
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;

#[extrinsic_call]
_(origin as <T as frame_system::Config>::RuntimeOrigin, 1);

Ok(())
}

#[benchmark]
fn vsbond_convert_to_vstoken() -> Result<(), BenchmarkError> {
let test_account: T::AccountId = account("seed", 1, 1);
let fee: VstokenConversionExchangeFee<BalanceOf<T>> = VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};
let rate: VstokenConversionExchangeRate = VstokenConversionExchangeRate {
vsbond_convert_to_vstoken: Percent::from_percent(95),
vstoken_convert_to_vsbond: Percent::from_percent(95),
};
assert_ok!(
VstokenConversion::<T>::set_exchange_fee(
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
fee
));

assert_ok!(
VstokenConversion::<T>::set_exchange_rate(
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
8,
rate
));

assert_ok!(
VstokenConversion::<T>::set_relaychain_lease(
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
1
));

let origin =
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;

// Setup initial conditions
assert_ok!(VstokenConversion::<T>::set_exchange_fee(
origin.clone() as <T as frame_system::Config>::RuntimeOrigin,
fee
));
assert_ok!(VstokenConversion::<T>::set_exchange_rate(
origin.clone() as <T as frame_system::Config>::RuntimeOrigin,
8,
rate
));
assert_ok!(VstokenConversion::<T>::set_relaychain_lease(
origin as <T as frame_system::Config>::RuntimeOrigin,
1
));

let vsbond_account: T::AccountId =
<T as Config>::VsbondAccount::get().into_account_truncating();
T::MultiCurrency::deposit(VS_KSM, &vsbond_account, BalanceOf::<T>::unique_saturated_from(1000000000000u128))?;
T::MultiCurrency::deposit(VS_BOND, &test_account, BalanceOf::<T>::unique_saturated_from(1000000000000u128))?;
}: _(RawOrigin::Signed(test_account),VS_BOND,BalanceOf::<T>::unique_saturated_from(100000000000u128),BalanceOf::<T>::unique_saturated_from(10000000000u128))

vstoken_convert_to_vsbond {
let test_account: T::AccountId = account("seed",1,1);
let fee: VstokenConversionExchangeFee<BalanceOf<T>> =
VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};
T::MultiCurrency::deposit(
VS_KSM,
&vsbond_account,
BalanceOf::<T>::unique_saturated_from(1000000000000u128),
)?;
T::MultiCurrency::deposit(
VS_BOND,
&test_account,
BalanceOf::<T>::unique_saturated_from(1000000000000u128),
)?;

#[extrinsic_call]
_(
RawOrigin::Signed(test_account),
VS_BOND,
BalanceOf::<T>::unique_saturated_from(100000000000u128),
BalanceOf::<T>::unique_saturated_from(10000000000u128),
);

Ok(())
}

#[benchmark]
fn vstoken_convert_to_vsbond() -> Result<(), BenchmarkError> {
let test_account: T::AccountId = account("seed", 1, 1);
let fee: VstokenConversionExchangeFee<BalanceOf<T>> = VstokenConversionExchangeFee {
vstoken_exchange_fee: 10u32.into(),
vsbond_exchange_fee_of_vstoken: 10u32.into(),
};
let rate: VstokenConversionExchangeRate = VstokenConversionExchangeRate {
vsbond_convert_to_vstoken: Percent::from_percent(5),
vstoken_convert_to_vsbond: Percent::from_percent(5),
};
assert_ok!(
VstokenConversion::<T>::set_exchange_fee(
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
fee
));

assert_ok!(
VstokenConversion::<T>::set_exchange_rate(
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
8,
rate
));

assert_ok!(
VstokenConversion::<T>::set_relaychain_lease(
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
1
));

let origin =
T::ControlOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;

// Setup initial conditions
assert_ok!(VstokenConversion::<T>::set_exchange_fee(
origin.clone() as <T as frame_system::Config>::RuntimeOrigin,
fee
));
assert_ok!(VstokenConversion::<T>::set_exchange_rate(
origin.clone() as <T as frame_system::Config>::RuntimeOrigin,
8,
rate
));
assert_ok!(VstokenConversion::<T>::set_relaychain_lease(
origin as <T as frame_system::Config>::RuntimeOrigin,
1
));

let vsbond_account: T::AccountId =
<T as Config>::VsbondAccount::get().into_account_truncating();
T::MultiCurrency::deposit(VS_BOND, &vsbond_account, BalanceOf::<T>::unique_saturated_from(100000000000000u128))?;
T::MultiCurrency::deposit(VS_KSM, &test_account, BalanceOf::<T>::unique_saturated_from(100000000000000u128))?;

}: _(RawOrigin::Signed(test_account),VS_BOND,BalanceOf::<T>::unique_saturated_from(1000000000000u128),BalanceOf::<T>::unique_saturated_from(100000000000u128))


impl_benchmark_test_suite!(VstokenConversion,crate::mock::ExtBuilder::default().build(),crate::mock::Runtime);
T::MultiCurrency::deposit(
VS_BOND,
&vsbond_account,
BalanceOf::<T>::unique_saturated_from(100000000000000u128),
)?;
T::MultiCurrency::deposit(
VS_KSM,
&test_account,
BalanceOf::<T>::unique_saturated_from(100000000000000u128),
)?;

#[extrinsic_call]
_(
RawOrigin::Signed(test_account),
VS_BOND,
BalanceOf::<T>::unique_saturated_from(1000000000000u128),
BalanceOf::<T>::unique_saturated_from(100000000000u128),
);

Ok(())
}

// This line generates test cases for benchmarking, and could be run by:
// `cargo test -p pallet-example-basic --all-features`, you will see one line per case:
// `test benchmarking::bench_sort_vector ... ok`
// `test benchmarking::bench_accumulate_dummy ... ok`
// `test benchmarking::bench_set_dummy_benchmark ... ok` in the result.
//
// The line generates three steps per benchmark, with repeat=1 and the three steps are
// [low, mid, high] of the range.
impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext_benchmark(), crate::mock::Runtime);
}
5 changes: 5 additions & 0 deletions pallets/vstoken-conversion/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,8 @@ impl ExtBuilder {
t.into()
}
}

#[cfg(feature = "runtime-benchmarks")]
pub fn new_test_ext_benchmark() -> sp_io::TestExternalities {
ExtBuilder::default().build()
}
Loading