avail_rust_core/rpc/system/
fetch_events.rs

1use crate::{rpc::Error, types::RuntimePhase};
2use primitive_types::H256;
3use serde::{Deserialize, Serialize};
4use subxt_rpcs::{RpcClient, rpc_params};
5
6pub async fn fetch_events_v1(client: &RpcClient, at: H256, opts: &Options) -> Result<Vec<BlockPhaseEvent>, Error> {
7	let params = rpc_params![at, opts];
8	let value: Vec<RpcPhaseEvents> = client.request("system_fetchEventsV1", params).await?;
9	Ok(value.into_iter().map(BlockPhaseEvent::from).collect())
10}
11
12#[derive(Default, Clone, Debug, Serialize, Deserialize)]
13pub struct Options {
14	pub filter: Option<Filter>,
15	pub enable_encoding: Option<bool>,
16	pub enable_decoding: Option<bool>,
17}
18
19impl Options {
20	pub fn new() -> Self {
21		Self::default()
22	}
23
24	pub fn filter(mut self, value: impl Into<Filter>) -> Self {
25		self.filter = Some(value.into());
26		self
27	}
28
29	pub fn enable_encoding(mut self) -> Self {
30		self.enable_encoding = Some(true);
31		self
32	}
33
34	pub fn enable_decoding(mut self) -> Self {
35		self.enable_decoding = Some(true);
36		self
37	}
38}
39
40#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
41#[repr(u8)]
42pub enum Filter {
43	All = 0,
44	OnlyExtrinsics = 1,
45	OnlyNonExtrinsics = 2,
46	Only(Vec<u32>) = 3,
47}
48
49impl Default for Filter {
50	fn default() -> Self {
51		Self::All
52	}
53}
54
55impl From<u32> for Filter {
56	fn from(value: u32) -> Self {
57		Self::Only(vec![value])
58	}
59}
60
61impl From<Vec<u32>> for Filter {
62	fn from(value: Vec<u32>) -> Self {
63		Self::Only(value)
64	}
65}
66
67#[derive(Clone, Debug, PartialEq)]
68pub struct BlockPhaseEvent {
69	pub phase: RuntimePhase,
70	pub events: Vec<PhaseEvent>,
71}
72
73impl From<RpcPhaseEvents> for BlockPhaseEvent {
74	fn from(value: RpcPhaseEvents) -> Self {
75		Self {
76			phase: value.phase,
77			events: value.events.into_iter().map(PhaseEvent::from).collect(),
78		}
79	}
80}
81
82#[derive(Clone, Debug, PartialEq)]
83pub struct PhaseEvent {
84	pub index: u32,
85	pub pallet_id: u8,
86	pub variant_id: u8,
87	pub encoded_data: Option<String>,
88	pub decoded_data: Option<String>,
89}
90
91impl From<RuntimeEvent> for PhaseEvent {
92	fn from(value: RuntimeEvent) -> Self {
93		Self {
94			index: value.index,
95			pallet_id: value.emitted_index.0,
96			variant_id: value.emitted_index.1,
97			encoded_data: value.encoded,
98			decoded_data: value.decoded,
99		}
100	}
101}
102
103#[derive(Clone, Debug, PartialEq, Deserialize)]
104struct RpcPhaseEvents {
105	pub phase: RuntimePhase,
106	pub events: Vec<RuntimeEvent>,
107}
108
109#[derive(Clone, Debug, PartialEq, Deserialize)]
110struct RuntimeEvent {
111	pub index: u32,
112	// (Pallet Id, Event Id)
113	pub emitted_index: (u8, u8),
114	pub encoded: Option<String>,
115	pub decoded: Option<String>,
116}