diff --git a/src/api.rs b/src/api.rs index 296835c..fe634db 100644 --- a/src/api.rs +++ b/src/api.rs @@ -10,6 +10,7 @@ pub use bitcoin::{ }; use serde::Deserialize; +use serde::Deserializer; #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] pub struct PrevOut { @@ -19,6 +20,7 @@ pub struct PrevOut { #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Vin { + #[serde(deserialize_with = "deserialize_txid")] pub txid: Txid, pub vout: u32, // None if coinbase @@ -68,6 +70,7 @@ pub struct BlockStatus { #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Tx { + #[serde(deserialize_with = "deserialize_txid")] pub txid: Txid, pub version: i32, pub locktime: u32, @@ -198,3 +201,17 @@ where .collect::>, _>>() .map_err(serde::de::Error::custom) } + +fn deserialize_txid<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + use bitcoin::hashes::Hash; + use std::str::FromStr; + + let s = String::deserialize(deserializer)?; + if s.is_empty() { + return Ok(Txid::all_zeros()); + } + Txid::from_str(&s).map_err(serde::de::Error::custom) +}