avail_rust_core/rpc/system/
fetch_events.rs1use 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 pub emitted_index: (u8, u8),
114 pub encoded: Option<String>,
115 pub decoded: Option<String>,
116}