pathfinder_common/
event.rs

1use std::str::FromStr;
2
3use fake::Dummy;
4use num_bigint::BigUint;
5use pathfinder_crypto::Felt;
6use pathfinder_tagged::Tagged;
7use pathfinder_tagged_debug_derive::TaggedDebug;
8use serde_with::serde_conv;
9
10use crate::{ContractAddress, EventData, EventKey};
11
12#[serde_with::serde_as]
13#[derive(Clone, serde::Deserialize, serde::Serialize, PartialEq, Eq, Dummy, TaggedDebug)]
14#[serde(deny_unknown_fields)]
15pub struct Event {
16    #[serde_as(as = "Vec<EventDataAsDecimalStr>")]
17    pub data: Vec<EventData>,
18    pub from_address: ContractAddress,
19    #[serde_as(as = "Vec<EventKeyAsDecimalStr>")]
20    pub keys: Vec<EventKey>,
21}
22
23#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
24pub struct EventIndex(pub u64);
25
26serde_conv!(
27    EventDataAsDecimalStr,
28    EventData,
29    |serialize_me: &EventData| starkhash_to_dec_str(&serialize_me.0),
30    |s: &str| starkhash_from_dec_str(s).map(EventData)
31);
32
33serde_conv!(
34    EventKeyAsDecimalStr,
35    EventKey,
36    |serialize_me: &EventKey| starkhash_to_dec_str(&serialize_me.0),
37    |s: &str| starkhash_from_dec_str(s).map(EventKey)
38);
39
40/// A helper conversion function. Only use with __sequencer API related types__.
41fn starkhash_to_dec_str(h: &Felt) -> String {
42    let b = h.to_be_bytes();
43    let b = BigUint::from_bytes_be(&b);
44    b.to_str_radix(10)
45}
46
47/// A helper conversion function. Only use with __sequencer API related types__.
48fn starkhash_from_dec_str(s: &str) -> Result<Felt, anyhow::Error> {
49    match BigUint::from_str(s) {
50        Ok(b) => {
51            let h = Felt::from_be_slice(&b.to_bytes_be())?;
52            Ok(h)
53        }
54        Err(_) => {
55            let h = Felt::from_hex_str(s)?;
56            Ok(h)
57        }
58    }
59}