use serde::{Deserialize, de::DeserializeOwned};
#[derive(Debug, Deserialize)]
pub struct RpcNodeWssResponse<T>
where
T: DeserializeOwned,
{
pub jsonrpc: String,
pub method: String,
#[serde(bound(deserialize = ""))]
pub params: RpcNodeSubscriptionResponse<T>,
}
#[derive(Debug, Deserialize)]
pub struct RpcNodeSubscriptionResponse<T>
where
T: DeserializeOwned,
{
pub subscription: String,
#[serde(bound(deserialize = ""))]
pub result: T,
}
#[derive(Debug, Deserialize)]
pub struct RpcNodeHttpResponse<T>
where
T: DeserializeOwned,
{
pub jsonrpc: Option<String>,
pub id: Option<u64>,
#[serde(bound(deserialize = ""))]
pub result: Option<T>,
pub error: Option<RpcError>,
pub code: Option<i32>,
pub message: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct RpcError {
pub code: i32,
pub message: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RpcLog {
pub removed: bool,
pub log_index: Option<String>,
pub transaction_index: Option<String>,
pub transaction_hash: Option<String>,
pub block_hash: Option<String>,
pub block_number: Option<String>,
pub address: String,
pub data: String,
pub topics: Vec<String>,
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
fn test_rpc_log_deserialize_pool_created_block_185() {
let json = r#"{
"removed": false,
"logIndex": "0x0",
"transactionIndex": "0x0",
"transactionHash": "0x24058dde7caf5b8b70041de8b27731f20f927365f210247c3e720e947b9098e7",
"blockHash": "0xd371b6c7b04ec33d6470f067a82e87d7b294b952bea7a46d7b939b4c7addc275",
"blockNumber": "0xb9",
"address": "0x1f98431c8ad98523631ae4a59f267346ea31f984",
"data": "0x000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000b9fc136980d98c034a529aadbd5651c087365d5f",
"topics": [
"0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118",
"0x0000000000000000000000002e5353426c89f4ecd52d1036da822d47e73376c4",
"0x000000000000000000000000838930cfe7502dd36b0b1ebbef8001fbf94f3bfb",
"0x0000000000000000000000000000000000000000000000000000000000000bb8"
]
}"#;
let log: RpcLog = serde_json::from_str(json).expect("Failed to deserialize RpcLog");
assert!(!log.removed);
assert_eq!(log.log_index, Some("0x0".to_string()));
assert_eq!(log.transaction_index, Some("0x0".to_string()));
assert_eq!(
log.transaction_hash,
Some("0x24058dde7caf5b8b70041de8b27731f20f927365f210247c3e720e947b9098e7".to_string())
);
assert_eq!(
log.block_hash,
Some("0xd371b6c7b04ec33d6470f067a82e87d7b294b952bea7a46d7b939b4c7addc275".to_string())
);
assert_eq!(log.block_number, Some("0xb9".to_string()));
assert_eq!(log.address, "0x1f98431c8ad98523631ae4a59f267346ea31f984");
assert_eq!(
log.data,
"0x000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000b9fc136980d98c034a529aadbd5651c087365d5f"
);
assert_eq!(log.topics.len(), 4);
assert_eq!(
log.topics[0],
"0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118"
);
assert_eq!(
log.topics[1],
"0x0000000000000000000000002e5353426c89f4ecd52d1036da822d47e73376c4"
);
assert_eq!(
log.topics[2],
"0x000000000000000000000000838930cfe7502dd36b0b1ebbef8001fbf94f3bfb"
);
assert_eq!(
log.topics[3],
"0x0000000000000000000000000000000000000000000000000000000000000bb8"
);
}
#[rstest]
fn test_rpc_log_deserialize_pool_created_block_540() {
let json = r#"{
"removed": false,
"logIndex": "0x0",
"transactionIndex": "0x0",
"transactionHash": "0x0810b3488eba9b0264d3544b4548b70d0c8667e05ac4a5d90686f4a9f70509df",
"blockHash": "0x59bb10cdfd586affc6aa4a0b12f0662ec04599a1a459ac5b33129bc2c8705ccd",
"blockNumber": "0x21c",
"address": "0x1f98431c8ad98523631ae4a59f267346ea31f984",
"data": "0x000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007d25de0bb3e4e4d5f7b399db5a0bca9f60dd66e4",
"topics": [
"0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118",
"0x0000000000000000000000008dd7c686b11c115ffaba245cbfc418b371087f68",
"0x000000000000000000000000be5381d826375492e55e05039a541eb2cb978e76",
"0x00000000000000000000000000000000000000000000000000000000000001f4"
]
}"#;
let log: RpcLog = serde_json::from_str(json).expect("Failed to deserialize RpcLog");
assert!(!log.removed);
assert_eq!(log.log_index, Some("0x0".to_string()));
assert_eq!(log.transaction_index, Some("0x0".to_string()));
assert_eq!(
log.transaction_hash,
Some("0x0810b3488eba9b0264d3544b4548b70d0c8667e05ac4a5d90686f4a9f70509df".to_string())
);
assert_eq!(
log.block_hash,
Some("0x59bb10cdfd586affc6aa4a0b12f0662ec04599a1a459ac5b33129bc2c8705ccd".to_string())
);
assert_eq!(log.block_number, Some("0x21c".to_string()));
assert_eq!(log.address, "0x1f98431c8ad98523631ae4a59f267346ea31f984");
assert_eq!(
log.data,
"0x000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007d25de0bb3e4e4d5f7b399db5a0bca9f60dd66e4"
);
assert_eq!(log.topics.len(), 4);
assert_eq!(
log.topics[0],
"0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118"
);
assert_eq!(
log.topics[1],
"0x0000000000000000000000008dd7c686b11c115ffaba245cbfc418b371087f68"
);
assert_eq!(
log.topics[2],
"0x000000000000000000000000be5381d826375492e55e05039a541eb2cb978e76"
);
assert_eq!(
log.topics[3],
"0x00000000000000000000000000000000000000000000000000000000000001f4"
);
}
}