glin_indexer/
event_decoder.rs1use anyhow::{anyhow, Result};
6use glin_client::GlinClient;
7use scale::Decode;
8use serde::{Deserialize, Serialize};
9use subxt::events::EventDetails;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct DecodedEvent {
14 pub pallet: String,
16 pub method: String,
18 pub data: serde_json::Value,
20 pub block_number: u64,
22 pub event_index: u32,
24}
25
26pub struct EventDecoder {
49 _client: GlinClient,
51}
52
53impl EventDecoder {
54 pub fn new(client: &GlinClient) -> Result<Self> {
56 Ok(Self {
57 _client: client.clone(),
58 })
59 }
60
61 pub fn decode(&self, event: &EventDetails<subxt::PolkadotConfig>) -> Result<DecodedEvent> {
63 let pallet = event.pallet_name();
64 let method = event.variant_name();
65
66 let field_bytes = event.field_bytes();
68
69 let data = match (pallet, method) {
71 ("Balances", "Transfer") => self.decode_transfer(field_bytes)?,
72 ("Contracts", "Instantiated") => self.decode_instantiated(field_bytes)?,
73 ("Contracts", "ContractEmitted") => self.decode_contract_emitted(field_bytes)?,
74 _ => {
75 serde_json::json!({
77 "raw": format!("0x{}", hex::encode(field_bytes))
78 })
79 }
80 };
81
82 Ok(DecodedEvent {
83 pallet: pallet.to_string(),
84 method: method.to_string(),
85 data,
86 block_number: 0, event_index: event.index(),
88 })
89 }
90
91 fn decode_transfer(&self, bytes: &[u8]) -> Result<serde_json::Value> {
92 #[derive(Decode)]
93 struct Transfer {
94 from: [u8; 32],
95 to: [u8; 32],
96 amount: u128,
97 }
98
99 let transfer = Transfer::decode(&mut &bytes[..])
100 .map_err(|e| anyhow!("Failed to decode Transfer event: {}", e))?;
101
102 Ok(serde_json::json!({
103 "from": format!("0x{}", hex::encode(transfer.from)),
104 "to": format!("0x{}", hex::encode(transfer.to)),
105 "amount": transfer.amount.to_string(),
106 }))
107 }
108
109 fn decode_instantiated(&self, bytes: &[u8]) -> Result<serde_json::Value> {
110 #[derive(Decode)]
111 struct Instantiated {
112 deployer: [u8; 32],
113 contract: [u8; 32],
114 }
115
116 let inst = Instantiated::decode(&mut &bytes[..])
117 .map_err(|e| anyhow!("Failed to decode Instantiated event: {}", e))?;
118
119 Ok(serde_json::json!({
120 "deployer": format!("0x{}", hex::encode(inst.deployer)),
121 "contract": format!("0x{}", hex::encode(inst.contract)),
122 }))
123 }
124
125 fn decode_contract_emitted(&self, bytes: &[u8]) -> Result<serde_json::Value> {
126 #[derive(Decode)]
127 struct ContractEmitted {
128 contract: [u8; 32],
129 data: Vec<u8>,
130 }
131
132 let emitted = ContractEmitted::decode(&mut &bytes[..])
133 .map_err(|e| anyhow!("Failed to decode ContractEmitted event: {}", e))?;
134
135 Ok(serde_json::json!({
136 "contract": format!("0x{}", hex::encode(emitted.contract)),
137 "data": format!("0x{}", hex::encode(emitted.data)),
138 }))
139 }
140}
141
142#[cfg(test)]
143mod tests {
144 #[test]
145 fn test_decoder_creation() {
146 }
148}