diff --git a/rpc/src/v1/types/block_template.rs b/rpc/src/v1/types/block_template.rs index 0647f1a7..7f74fc32 100644 --- a/rpc/src/v1/types/block_template.rs +++ b/rpc/src/v1/types/block_template.rs @@ -10,6 +10,7 @@ use super::raw_transaction::RawTransaction; /// https://github.com/bitcoin/bips/blob/master/bip-0023.mediawiki /// https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki#getblocktemplate_changes /// https://github.com/bitcoin/bips/blob/master/bip-0145.mediawiki +#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)] pub struct BlockTemplate { /// The preferred block version pub version: u32, @@ -56,6 +57,7 @@ pub struct BlockTemplate { } /// Transaction data as included in `BlockTemplate` +#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)] pub struct BlockTemplateTransaction { /// Transaction data encoded in hexadecimal pub data: RawTransaction, @@ -68,12 +70,73 @@ pub struct BlockTemplateTransaction { /// Difference in value between transaction inputs and outputs (in Satoshis). /// For coinbase transactions, this is a negative Number of the total collected block fees (ie, not including the block subsidy). /// If key is not present, fee is unknown and clients MUST NOT assume there isn't one - pub fee: Option>, + pub fee: Option, /// Total SigOps cost, as counted for purposes of block limits. /// If key is not present, sigop cost is unknown and clients MUST NOT assume it is zero. - pub sigops: Option>, + pub sigops: Option, /// Total transaction weight, as counted for purposes of block limits. pub weight: Option, /// If provided and true, this transaction must be in the final block - pub required: Option>, + pub required: bool, +} + +#[cfg(test)] +mod tests { + use serde_json; + use super::super::hash::H256; + use super::super::bytes::Bytes; + use rustc_serialize::hex::FromHex; + use super::*; + + #[test] + fn block_template_transaction_serialize() { + assert_eq!(serde_json::to_string(&BlockTemplateTransaction { + data: Bytes("00010203".from_hex().unwrap()), + txid: None, + hash: None, + depends: None, + fee: None, + sigops: None, + weight: None, + required: false, + }).unwrap(), r#"{"data":"00010203","txid":null,"hash":null,"depends":null,"fee":null,"sigops":null,"weight":null,"required":false}"#); + assert_eq!(serde_json::to_string(&BlockTemplateTransaction { + data: Bytes("00010203".from_hex().unwrap()), + txid: Some(H256::from(1)), + hash: Some(H256::from(2)), + depends: Some(vec![1, 2]), + fee: Some(100), + sigops: Some(200), + weight: Some(300), + required: true, + }).unwrap(), r#"{"data":"00010203","txid":"0100000000000000000000000000000000000000000000000000000000000000","hash":"0200000000000000000000000000000000000000000000000000000000000000","depends":[1,2],"fee":100,"sigops":200,"weight":300,"required":true}"#); + } + + #[test] + fn block_template_transaction_deserialize() { + assert_eq!( + serde_json::from_str::(r#"{"data":"00010203","txid":null,"hash":null,"depends":null,"fee":null,"sigops":null,"weight":null,"required":false}"#).unwrap(), + BlockTemplateTransaction { + data: Bytes("00010203".from_hex().unwrap()), + txid: None, + hash: None, + depends: None, + fee: None, + sigops: None, + weight: None, + required: false, + }); + assert_eq!( + serde_json::from_str::(r#"{"data":"00010203","txid":"0100000000000000000000000000000000000000000000000000000000000000","hash":"0200000000000000000000000000000000000000000000000000000000000000","depends":[1,2],"fee":100,"sigops":200,"weight":300,"required":true}"#).unwrap(), + BlockTemplateTransaction { + data: Bytes("00010203".from_hex().unwrap()), + txid: Some(H256::from(1)), + hash: Some(H256::from(2)), + depends: Some(vec![1, 2]), + fee: Some(100), + sigops: Some(200), + weight: Some(300), + required: true, + }); + } } diff --git a/rpc/src/v1/types/block_template_request.rs b/rpc/src/v1/types/block_template_request.rs index 0684de0c..2305076c 100644 --- a/rpc/src/v1/types/block_template_request.rs +++ b/rpc/src/v1/types/block_template_request.rs @@ -21,7 +21,7 @@ pub enum BlockTemplateRequestMode { /// https://github.com/bitcoin/bips/blob/master/bip-0023.mediawiki /// https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki#getblocktemplate_changes /// https://github.com/bitcoin/bips/blob/master/bip-0145.mediawiki -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)] pub struct BlockTemplateRequest { /// Request mode pub mode: Option, @@ -50,11 +50,7 @@ mod tests { #[test] fn block_template_request_serialize() { - assert_eq!(serde_json::to_string(&BlockTemplateRequest { - mode: None, - capabilities: None, - rules: None, - }).unwrap(), r#"{"mode":null,"capabilities":null,"rules":null}"#); + assert_eq!(serde_json::to_string(&BlockTemplateRequest::default()).unwrap(), r#"{"mode":null,"capabilities":null,"rules":null}"#); assert_eq!(serde_json::to_string(&BlockTemplateRequest { mode: Some(BlockTemplateRequestMode::Template), capabilities: Some(vec!["a".to_owned()].into_iter().collect()),