Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

pallet-token-gateway benchmarks #351

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 14 additions & 2 deletions modules/ismp/pallets/token-gateway/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ readme = "./README.md"
[dependencies]
frame-support = { workspace = true }
frame-system = { workspace = true }
frame-benchmarking = { workspace = true}
sp-runtime = { workspace = true }
sp-core = { workspace = true }
sp-io = { workspace = true }
Expand All @@ -33,12 +34,15 @@ alloy-sol-types = { workspace = true }

token-gateway-primitives = { workspace = true }
pallet-hyperbridge = { workspace = true }
pallet-balances = { workspace = true }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can't move these pallets to dev-dependencies if you are still calling them in the benchmarks, use the trait methods as suggested and remove them completely.

pallet-assets = { workspace = true}
MrishoLukamba marked this conversation as resolved.
Show resolved Hide resolved

[features]
default = ["std"]
std = [
"frame-support/std",
"frame-system/std",
"frame-benchmarking/std",
"sp-runtime/std",
"sp-core/std",
"sp-io/std",
Expand All @@ -50,6 +54,14 @@ std = [
"anyhow/std",
"alloy-primitives/std",
"pallet-hyperbridge/std",
"token-gateway-primitives/std"
"token-gateway-primitives/std",
"pallet-balances/std",
"pallet-assets/std"
]
try-runtime = []
runtime-benchmarks = [
"frame-benchmarking/runtime-benchmarks",
"frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
]
try-runtime = []
191 changes: 191 additions & 0 deletions modules/ismp/pallets/token-gateway/src/benchmarking.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
#![cfg(feature = "runtime-benchmarks")]

use crate::*;
use frame_benchmarking::v2::*;
use frame_support::BoundedVec;
use frame_system::RawOrigin;
use ismp::host::StateMachine;
use pallet_balances::AdjustmentDirection;
use scale_info::prelude::collections::BTreeMap;
use sp_runtime::{traits::StaticLookup, AccountId32};
use token_gateway_primitives::{GatewayAssetRegistration, GatewayAssetUpdate};

fn dummy_teleport_asset<T>(
) -> TeleportParams<AssetId<T>, <<T as Config>::NativeCurrency as Currency<T::AccountId>>::Balance>
where
T: Config,
<<T as Config>::Assets as fungibles::Inspect<T::AccountId>>::AssetId: From<H256>,
<<T as Config>::NativeCurrency as Currency<T::AccountId>>::Balance: From<u128>,
{
TeleportParams {
asset_id: <<T as Config>::Assets as fungibles::Inspect<T::AccountId>>::AssetId::from(
H256::zero(),
),
destination: StateMachine::Evm(100),
recepient: H256::from([1u8; 32]),
amount: 1100000000u128.into(),
timeout: 10,
token_gateway: vec![1, 2, 3, 4, 5],
relayer_fee: 1000000002u128.into(),
}
}

fn create_dummy_asset<T: Config>(
asset_details: GatewayAssetRegistration,
) -> AssetRegistration<AssetId<T>>
where
<<T as Config>::Assets as fungibles::Inspect<T::AccountId>>::AssetId: From<H256>,
{
AssetRegistration { local_id: H256::zero().into(), reg: asset_details }
}

#[benchmarks(
where
T: pallet_balances::Config<Balance = u128>,
T: pallet_assets::Config<AssetIdParameter = sp_core::H256,Balance = u128>,
<<T as Config>::Assets as fungibles::Inspect<T::AccountId>>::AssetId: From<H256>,
<<T as Config>::NativeCurrency as Currency<T::AccountId>>::Balance: From<u128>,
<T as frame_system::Config>::AccountId: From<[u8; 32]>,
u128: From<<<T as Config>::NativeCurrency as Currency<T::AccountId>>::Balance>,
<T as pallet_ismp::Config>::Balance: From<<<T as Config>::NativeCurrency as Currency<T::AccountId>>::Balance>,
<<T as Config>::Assets as fungibles::Inspect<T::AccountId>>::Balance: From<<<T as Config>::NativeCurrency as Currency<T::AccountId>>::Balance>,
<<T as Config>::Assets as fungibles::Inspect<T::AccountId>>::Balance: From<u128>,
[u8; 32]: From<<T as frame_system::Config>::AccountId>,
<T as frame_system::Config>::RuntimeOrigin: From<frame_system::RawOrigin<AccountId32>>,
)]
mod benches {
use super::*;

#[benchmark]
fn create_erc6160_asset() -> Result<(), BenchmarkError> {
let account: T::AccountId = whitelisted_caller();

let asset_details = GatewayAssetRegistration {
name: BoundedVec::try_from(b"Spectre".to_vec()).unwrap(),
symbol: BoundedVec::try_from(b"SPC".to_vec()).unwrap(),
chains: vec![StateMachine::Evm(100)],
minimum_balance: Some(10),
};
let asset = create_dummy_asset::<T>(asset_details);

// Set balances
let ed = <T as pallet_balances::Config>::ExistentialDeposit::get();

// Adjust total issuance
pallet_balances::Pallet::<T>::force_adjust_total_issuance(
RawOrigin::Root.into(),
AdjustmentDirection::Increase,
ed * 1000,
)?;

let acc = <<T as frame_system::Config>::Lookup as StaticLookup>::unlookup(account.clone());

pallet_balances::Pallet::<T>::force_set_balance(RawOrigin::Root.into(), acc, ed * 100u128)?;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of pulling in the pallet-balances crate, just use <<T as pallet_ismp::Config>::Currency as frame_support::fungible::Mutate>::set_balance to set the account balance.


#[extrinsic_call]
_(RawOrigin::Signed(account), asset);

Ok(())
}

#[benchmark]
fn teleport() -> Result<(), BenchmarkError> {
let account: T::AccountId = whitelisted_caller();

let asset_details = GatewayAssetRegistration {
name: BoundedVec::try_from(b"Spectre".to_vec()).unwrap(),
symbol: BoundedVec::try_from(b"SPC".to_vec()).unwrap(),
chains: vec![StateMachine::Evm(100)],
minimum_balance: None,
};
let asset = create_dummy_asset::<T>(asset_details);

Pallet::<T>::create_erc6160_asset(RawOrigin::Signed(account.clone()).into(), asset)?;

let dummy_teleport_params = dummy_teleport_asset::<T>();

// Set balances
let ed = <T as pallet_balances::Config>::ExistentialDeposit::get();

// Adjust total issuance
pallet_balances::Pallet::<T>::force_adjust_total_issuance(
RawOrigin::Root.into(),
AdjustmentDirection::Increase,
ed * 1000,
)?;

let acc = <<T as frame_system::Config>::Lookup as StaticLookup>::unlookup(account.clone());

pallet_balances::Pallet::<T>::force_set_balance(
RawOrigin::Root.into(),
acc.clone(),
ed * 100u128,
)?;

#[extrinsic_call]
teleport(RawOrigin::Signed(account), dummy_teleport_params);
Ok(())
}

#[benchmark]
fn set_token_gateway_addresses(x: Linear<5, 100>) -> Result<(), BenchmarkError> {
let mut addresses = BTreeMap::new();
for i in 0..x {
let addr = i.to_string().as_bytes().to_vec();
addresses.insert(StateMachine::Evm(100), addr);
}

#[extrinsic_call]
_(RawOrigin::Root, addresses);
Ok(())
}

#[benchmark]
fn update_erc6160_asset() -> Result<(), BenchmarkError> {
let acc_origin: T::AccountId = whitelisted_caller();

let asset_details = GatewayAssetRegistration {
name: BoundedVec::try_from(b"Spectre".to_vec()).unwrap(),
symbol: BoundedVec::try_from(b"SPC".to_vec()).unwrap(),
chains: vec![StateMachine::Evm(100)],
minimum_balance: None,
};
let asset = create_dummy_asset::<T>(asset_details);
let asset_id: H256 = sp_io::hashing::keccak_256(asset.reg.symbol.as_ref()).into();

// set balances

let acc_o =
<<T as frame_system::Config>::Lookup as StaticLookup>::unlookup(acc_origin.clone());
let ed = <T as pallet_balances::Config>::ExistentialDeposit::get();
pallet_balances::Pallet::<T>::force_set_balance(
RawOrigin::Root.into(),
acc_o.clone(),
ed * 100u128,
)?;

// set asset balance
pallet_assets::Pallet::<T>::create(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the fungibles::Mutate trait to also do this instead of pulling in pallet-assets

RawOrigin::Signed(acc_origin.clone()).into(),
H256::zero().into(),
acc_o.clone(),
1000000000,
)?;

Pallet::<T>::create_erc6160_asset(
RawOrigin::Signed(acc_origin.clone()).into(),
asset.clone(),
)?;

let asset_update = GatewayAssetUpdate {
asset_id,
add_chains: BoundedVec::try_from(vec![StateMachine::Evm(200)]).unwrap(),
remove_chains: BoundedVec::try_from(Vec::new()).unwrap(),
new_admins: BoundedVec::try_from(Vec::new()).unwrap(),
};

#[extrinsic_call]
_(RawOrigin::Signed(acc_origin), asset_update);
Ok(())
}
}
Loading
Loading