Skip to content

Commit

Permalink
feat(benchmarks) pallet token gateway
Browse files Browse the repository at this point in the history
  • Loading branch information
MrishoLukamba committed Dec 22, 2024
1 parent a2cb646 commit 8a7868b
Show file tree
Hide file tree
Showing 10 changed files with 420 additions and 12 deletions.
5 changes: 5 additions & 0 deletions Cargo.lock

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

14 changes: 13 additions & 1 deletion 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 }
pallet-assets = { workspace = true}

[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"
]
runtime-benchmarks = [
"frame-benchmarking/runtime-benchmarks",
"frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
]
try-runtime = []
193 changes: 193 additions & 0 deletions modules/ismp/pallets/token-gateway/src/benchmarking.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
#![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)?;

#[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() -> Result<(), BenchmarkError> {
let mut addresses = BTreeMap::new();
for i in 0..50 {
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(
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(())
}

}

20 changes: 11 additions & 9 deletions modules/ismp/pallets/token-gateway/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@ extern crate alloc;

pub mod impls;
pub mod types;

mod benchmarking;
mod weights;
pub use weights::WeightInfo;
use crate::impls::{convert_to_balance, convert_to_erc20};
use alloy_sol_types::SolValue;
use anyhow::anyhow;
use codec::Decode;
use frame_support::{
ensure,
pallet_prelude::Weight,
traits::{
fungibles::{self, Mutate},
tokens::{fungible::Mutate as FungibleMutate, Preservation},
Expand Down Expand Up @@ -113,6 +116,9 @@ pub mod pallet {
/// The decimals of the native currency
#[pallet::constant]
type Decimals: Get<u8>;

/// weights
type WeightInfo: WeightInfo;
}

/// Assets supported by this instance of token gateway
Expand Down Expand Up @@ -218,7 +224,7 @@ pub mod pallet {
/// Teleports a registered asset
/// locks the asset and dispatches a request to token gateway on the destination
#[pallet::call_index(0)]
#[pallet::weight(weight())]
#[pallet::weight(T::WeightInfo::teleport())]
pub fn teleport(
origin: OriginFor<T>,
params: TeleportParams<
Expand Down Expand Up @@ -301,7 +307,7 @@ pub mod pallet {

/// Set the token gateway address for specified chains
#[pallet::call_index(1)]
#[pallet::weight(weight())]
#[pallet::weight(T::WeightInfo::set_token_gateway_addresses())]
pub fn set_token_gateway_addresses(
origin: OriginFor<T>,
addresses: BTreeMap<StateMachine, Vec<u8>>,
Expand All @@ -318,7 +324,7 @@ pub mod pallet {
/// This works by dispatching a request to the TokenGateway module on each requested chain
/// to create the asset.
#[pallet::call_index(2)]
#[pallet::weight(weight())]
#[pallet::weight(T::WeightInfo::create_erc6160_asset())]
pub fn create_erc6160_asset(
origin: OriginFor<T>,
asset: AssetRegistration<AssetId<T>>,
Expand Down Expand Up @@ -371,7 +377,7 @@ pub mod pallet {
/// This works by dispatching a request to the TokenGateway module on each requested chain
/// to create the asset.
#[pallet::call_index(3)]
#[pallet::weight(weight())]
#[pallet::weight(T::WeightInfo::update_erc6160_asset())]
pub fn update_erc6160_asset(
origin: OriginFor<T>,
asset: GatewayAssetUpdate,
Expand Down Expand Up @@ -654,10 +660,6 @@ where
}
}

/// Static weights because benchmarks suck, and we'll be getting PolkaVM soon anyways
fn weight() -> Weight {
Weight::from_parts(300_000_000, 0)
}

impl<T: Config> Pallet<T> {
/// Ensure the signer is the asset admin
Expand Down
28 changes: 28 additions & 0 deletions modules/ismp/pallets/token-gateway/src/weights.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use frame_support::weights::Weight;

// ============================== INTERFACE ============================================ //
/// Weight functions needed for `pallet_token_gateway.
pub trait WeightInfo {
fn create_erc6160_asset() -> Weight;
fn teleport() -> Weight;
fn set_token_gateway_addresses() -> Weight;
fn update_erc6160_asset() -> Weight;
}

impl WeightInfo for () {
fn create_erc6160_asset() -> Weight {
Weight::zero()
}

fn teleport() -> Weight {
Weight::zero()
}

fn set_token_gateway_addresses() -> Weight {
Weight::zero()
}

fn update_erc6160_asset() -> Weight {
Weight::zero()
}
}
7 changes: 6 additions & 1 deletion parachain/runtimes/gargantua/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ sp-mmr-primitives = { workspace = true }
simnode-runtime-api = { workspace = true }
hyperbridge-client-machine = { workspace = true }
pallet-token-gateway-inspector = { workspace = true }
pallet-token-gateway = { workspace = true }
pallet-hyperbridge = { workspace = true }

[features]
default = [
Expand Down Expand Up @@ -188,7 +190,9 @@ std = [
"simnode-runtime-api/std",
"hyperbridge-client-machine/std",
"frame-metadata-hash-extension/std",
"anyhow/std"
"anyhow/std",
"pallet-token-gateway/std",
"pallet-hyperbridge/std"
]

runtime-benchmarks = [
Expand Down Expand Up @@ -216,6 +220,7 @@ runtime-benchmarks = [
"pallet-sudo/runtime-benchmarks",
"parachains-common/runtime-benchmarks",
"ismp-grandpa/runtime-benchmarks",
"pallet-token-gateway/runtime-benchmarks"
]

try-runtime = [
Expand Down
Loading

0 comments on commit 8a7868b

Please sign in to comment.