1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
// This file is part of Gear.
//
// Copyright (C) 2021-2024 Gear Technologies Inc.
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
//
// This program 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.
//
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
//! Events api
use crate::{
config::GearConfig,
metadata::{system::Event as SystemEvent, Event},
result::{Error, Result},
Api,
};
use subxt::{
blocks::ExtrinsicEvents as TxEvents,
error::{DispatchError, Error as SubxtError},
events::EventDetails,
tx::TxInBlock,
OnlineClient,
};
impl Api {
/// Capture the dispatch info of any extrinsic and display the weight spent
pub async fn capture_dispatch_info(
&self,
tx: &TxInBlock<GearConfig, OnlineClient<GearConfig>>,
) -> Result<TxEvents<GearConfig>> {
let events = tx.fetch_events().await?;
for ev in events.iter() {
let ev = ev?;
if ev.pallet_name() == "System" {
if ev.variant_name() == "ExtrinsicFailed" {
Self::capture_weight_info(&ev)?;
return Err(SubxtError::from(DispatchError::decode_from(
ev.field_bytes(),
self.metadata(),
)?)
.into());
}
if ev.variant_name() == "ExtrinsicSuccess" {
Self::capture_weight_info(&ev)?;
break;
}
}
}
Ok(events)
}
/// Parse transaction fee from InBlockEvents
pub fn capture_weight_info(details: &EventDetails<GearConfig>) -> Result<()> {
let event: Event = details.as_root_event::<Event>()?;
if let Event::System(SystemEvent::ExtrinsicSuccess { dispatch_info })
| Event::System(SystemEvent::ExtrinsicFailed { dispatch_info, .. }) = event
{
log::info!(" Weight cost: {:?}", dispatch_info.weight);
}
Err(Error::EventNotFound)
}
}