From 1542ad80ec3845eada9a3f154c2599d16cc003aa Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 21:11:06 +0000 Subject: [PATCH 01/19] Add getblockstats RPC call --- client/src/client.rs | 16 ++++++++ json/src/lib.rs | 90 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index de6c111..06831ac 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -353,6 +353,22 @@ pub trait RpcApi: Sized { self.call("getblockheader", &[into_json(hash)?, true.into()]).await } + /// Compute per block statistics for a given window. All amounts are in satoshis. + /// https://developer.bitcoin.org/reference/rpc/getblockstats.html + async fn get_block_stats( + &self, + block_hash: Option<&bitcoin::BlockHash>, + block_height: Option, + ) -> Result { + if let Some(hash) = block_hash { + self.call("getblockstats", &[into_json(hash)?, true.into()]).await + } else if let Some(height) = block_height { + self.call("getblockstats", &[into_json(height)?, true.into()]).await + } else { + self.call("getblockstats", &[]).await + } + } + async fn get_mining_info(&self) -> Result { self.call("getmininginfo", &[]).await } diff --git a/json/src/lib.rs b/json/src/lib.rs index a184cc6..a14b693 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -13,9 +13,8 @@ //! This is a client library for the Bitcoin Core JSON-RPC API. //! - -use std::collections::HashMap; pub use bitcoin; +use std::collections::HashMap; use bitcoin::consensus::encode; use bitcoin::hashes::hex::{FromHex, ToHex}; @@ -212,6 +211,93 @@ pub struct GetBlockHeaderResult { pub next_block_hash: Option, } +/// `getblockstats` RPC call. +/// https://developer.bitcoin.org/reference/rpc/getblockstats.html +#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct GetBlockStatsResult { + /// Average fee in the block + #[serde(rename = "avgfee")] + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + avg_fee: Amount, + /// Average feerate (in satoshis per virtual byte) + #[serde(rename = "avgfeerate")] + avg_fee_rate: usize, + /// Average transaction size + #[serde(rename = "avgtxsize")] + avg_tx_size: u64, + /// The block hash (to check for potential reorgs) + #[serde(rename = "blockhash")] + block_hash: bitcoin::BlockHash, + /// Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit (in satoshis per + /// virtual byte) + #[serde(rename = "feerate_percentiles")] + fee_rate_percentiles: [u8; 5], + /// The height of the block + height: usize, + /// The number of inputs (excluding coinbase) + ins: usize, + /// Maximum fee in the block + #[serde(rename = "maxfee")] + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + max_fee: Amount, + /// Maximum feerate (in satoshis per virtual byte) + #[serde(rename = "maxfeerate")] + max_fee_rate: usize, + /// Maximum transaction size + #[serde(rename = "maxtxsize")] + max_tx_size: usize, + /// Truncated median fee in the block + #[serde(rename = "medianfee")] + median_fee: usize, + /// The block median time past + #[serde(rename = "mediantime")] + median_time: usize, + /// Truncated median transaction size + #[serde(rename = "mediantxsize")] + median_tx_size: usize, + /// Minimum fee in the block + #[serde(rename = "minfee")] + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + min_fee: Amount, + /// Minimum feerate (in satoshis per virtual byte) + #[serde(rename = "minfeerate")] + min_fee_rate: usize, + /// Minimum transaction size + #[serde(rename = "mintxsize")] + min_tx_size: usize, + /// The number of outputs + outs: usize, + /// The block subsidy + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + subsidy: Amount, + /// Total size of all segwit transactions + #[serde(rename = "swtotal_size")] + sw_total_size: usize, + /// Total weight of all segwit transactions + #[serde(rename = "swtotal_weight")] + sw_total_weight: usize, + /// The number of segwit transactions + sw_txs: usize, + /// The block time + time: usize, + /// Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee]) + total_out: usize, + /// Total size of all non-coinbase transactions + total_size: usize, + /// Total weight of all non-coinbase transactions + total_weight: usize, + /// The fee total + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + total_fee: Amount, + /// The number of transactions (including coinbase) + txs: usize, + /// The increase/decrease in the number of unspent outputs + utxo_increase: usize, + /// The increase/decrease in size for the + utxo_size_inc: usize, +} + #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetMiningInfoResult { From b77dd6eabdb0b28c53efbdd1b337ae982eb1145e Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:08:33 +0000 Subject: [PATCH 02/19] Rm member field doc cmts-messes up result printing --- json/src/lib.rs | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index a14b693..8f9f193 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -216,85 +216,55 @@ pub struct GetBlockHeaderResult { #[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetBlockStatsResult { - /// Average fee in the block #[serde(rename = "avgfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] avg_fee: Amount, - /// Average feerate (in satoshis per virtual byte) #[serde(rename = "avgfeerate")] avg_fee_rate: usize, - /// Average transaction size #[serde(rename = "avgtxsize")] avg_tx_size: u64, - /// The block hash (to check for potential reorgs) #[serde(rename = "blockhash")] block_hash: bitcoin::BlockHash, - /// Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit (in satoshis per - /// virtual byte) #[serde(rename = "feerate_percentiles")] fee_rate_percentiles: [u8; 5], - /// The height of the block height: usize, - /// The number of inputs (excluding coinbase) ins: usize, - /// Maximum fee in the block #[serde(rename = "maxfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] max_fee: Amount, - /// Maximum feerate (in satoshis per virtual byte) #[serde(rename = "maxfeerate")] max_fee_rate: usize, - /// Maximum transaction size #[serde(rename = "maxtxsize")] max_tx_size: usize, - /// Truncated median fee in the block #[serde(rename = "medianfee")] median_fee: usize, - /// The block median time past #[serde(rename = "mediantime")] median_time: usize, - /// Truncated median transaction size #[serde(rename = "mediantxsize")] median_tx_size: usize, - /// Minimum fee in the block #[serde(rename = "minfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] min_fee: Amount, - /// Minimum feerate (in satoshis per virtual byte) #[serde(rename = "minfeerate")] min_fee_rate: usize, - /// Minimum transaction size #[serde(rename = "mintxsize")] min_tx_size: usize, - /// The number of outputs outs: usize, - /// The block subsidy #[serde(with = "bitcoin::util::amount::serde::as_btc")] subsidy: Amount, - /// Total size of all segwit transactions #[serde(rename = "swtotal_size")] sw_total_size: usize, - /// Total weight of all segwit transactions #[serde(rename = "swtotal_weight")] sw_total_weight: usize, - /// The number of segwit transactions sw_txs: usize, - /// The block time time: usize, - /// Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee]) total_out: usize, - /// Total size of all non-coinbase transactions total_size: usize, - /// Total weight of all non-coinbase transactions total_weight: usize, - /// The fee total #[serde(with = "bitcoin::util::amount::serde::as_btc")] total_fee: Amount, - /// The number of transactions (including coinbase) txs: usize, - /// The increase/decrease in the number of unspent outputs utxo_increase: usize, - /// The increase/decrease in size for the utxo_size_inc: usize, } From ec84c98f40050537ac9149d33f83fc8cc239f2af Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:12:21 +0000 Subject: [PATCH 03/19] Rm extra arg from getblockstats call --- client/src/client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 06831ac..b5a4b98 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -361,9 +361,9 @@ pub trait RpcApi: Sized { block_height: Option, ) -> Result { if let Some(hash) = block_hash { - self.call("getblockstats", &[into_json(hash)?, true.into()]).await + self.call("getblockstats", &[into_json(hash)?]).await } else if let Some(height) = block_height { - self.call("getblockstats", &[into_json(height)?, true.into()]).await + self.call("getblockstats", &[into_json(height)?]).await } else { self.call("getblockstats", &[]).await } From db28d7712b847a55fc0647209be4c11ad2684445 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:29:21 +0000 Subject: [PATCH 04/19] Serde rename member field sw_txs -> swtxs --- json/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/json/src/lib.rs b/json/src/lib.rs index 8f9f193..c23427b 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -256,6 +256,7 @@ pub struct GetBlockStatsResult { sw_total_size: usize, #[serde(rename = "swtotal_weight")] sw_total_weight: usize, + #[serde(rename = "swtxs")] sw_txs: usize, time: usize, total_out: usize, From 5631b3b0fbd25c9f05ace97b559439216780e5b0 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:33:02 +0000 Subject: [PATCH 05/19] Error if no provided hash or height --- client/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/client.rs b/client/src/client.rs index b5a4b98..ebd7ffc 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -365,7 +365,7 @@ pub trait RpcApi: Sized { } else if let Some(height) = block_height { self.call("getblockstats", &[into_json(height)?]).await } else { - self.call("getblockstats", &[]).await + panic!("TODO: Which error to use?") } } From 0f25a6faab68d55956030bb2c99051c9d1974c3d Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:33:23 +0000 Subject: [PATCH 06/19] total_out not registering, force rename --- json/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index c23427b..0e4bb3f 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -259,7 +259,7 @@ pub struct GetBlockStatsResult { #[serde(rename = "swtxs")] sw_txs: usize, time: usize, - total_out: usize, + totalOut: usize, total_size: usize, total_weight: usize, #[serde(with = "bitcoin::util::amount::serde::as_btc")] From 87523c36e50e865ac8331c730d36db72e4e8c545 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:43:04 +0000 Subject: [PATCH 07/19] Tmp: Try adding empty array for optional fields --- client/src/client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index ebd7ffc..5fb367d 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -361,9 +361,9 @@ pub trait RpcApi: Sized { block_height: Option, ) -> Result { if let Some(hash) = block_hash { - self.call("getblockstats", &[into_json(hash)?]).await + self.call("getblockstats", &[into_json(hash)?, empty_arr()]).await } else if let Some(height) = block_height { - self.call("getblockstats", &[into_json(height)?]).await + self.call("getblockstats", &[into_json(height)?, empty_arr()]).await } else { panic!("TODO: Which error to use?") } From ed19110a6820c3536f6de5f9a03beed4ad70123a Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:52:37 +0000 Subject: [PATCH 08/19] Serde rename total_fee -> totalfee --- json/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index 0e4bb3f..4ebef64 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -259,9 +259,10 @@ pub struct GetBlockStatsResult { #[serde(rename = "swtxs")] sw_txs: usize, time: usize, - totalOut: usize, + total_out: usize, total_size: usize, total_weight: usize, + #[serde(rename = "totalfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] total_fee: Amount, txs: usize, From 00188db9cb7efae393ed7553436d8c2fedaf4151 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:54:26 +0000 Subject: [PATCH 09/19] Try total_out usize -> u64 --- json/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index 4ebef64..29a1734 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -259,7 +259,7 @@ pub struct GetBlockStatsResult { #[serde(rename = "swtxs")] sw_txs: usize, time: usize, - total_out: usize, + total_out: u64, total_size: usize, total_weight: usize, #[serde(rename = "totalfee")] From 07219d04afe2fb3f4b1205d5f204bdd2c41bb9f8 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:55:47 +0000 Subject: [PATCH 10/19] Revent type, try force rename --- json/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index 29a1734..d08ad1a 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -259,7 +259,8 @@ pub struct GetBlockStatsResult { #[serde(rename = "swtxs")] sw_txs: usize, time: usize, - total_out: u64, + #[serde(rename = "total_out")] + total_out: usize, total_size: usize, total_weight: usize, #[serde(rename = "totalfee")] From a751774b5cedc84bc67dc3969726146da59867f0 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:57:13 +0000 Subject: [PATCH 11/19] Force total_size serde rename --- json/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/json/src/lib.rs b/json/src/lib.rs index d08ad1a..d84771a 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -261,6 +261,7 @@ pub struct GetBlockStatsResult { time: usize, #[serde(rename = "total_out")] total_out: usize, + #[serde(rename = "total_size")] total_size: usize, total_weight: usize, #[serde(rename = "totalfee")] From c24ecb3bcb4673bfaed921f3b31ab4bae64174b5 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 22:59:12 +0000 Subject: [PATCH 12/19] Force total_weight serde rename --- json/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/json/src/lib.rs b/json/src/lib.rs index d84771a..7a6dc81 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -263,6 +263,7 @@ pub struct GetBlockStatsResult { total_out: usize, #[serde(rename = "total_size")] total_size: usize, + #[serde(rename = "total_weight")] total_weight: usize, #[serde(rename = "totalfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] From 7773a1e930ace6e52da26c550053d979ac26fe6e Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 23:00:50 +0000 Subject: [PATCH 13/19] Force utxo_increase serde rename --- json/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/json/src/lib.rs b/json/src/lib.rs index 7a6dc81..7eb117a 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -269,6 +269,7 @@ pub struct GetBlockStatsResult { #[serde(with = "bitcoin::util::amount::serde::as_btc")] total_fee: Amount, txs: usize, + #[serde(rename = "utxo_increase")] utxo_increase: usize, utxo_size_inc: usize, } From 00a5570d7aa6bf868e3b6eb09492758bf9a61bde Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 23:01:55 +0000 Subject: [PATCH 14/19] Force utxo_size_inc serde rename --- json/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/json/src/lib.rs b/json/src/lib.rs index 7eb117a..7c10e40 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -271,6 +271,7 @@ pub struct GetBlockStatsResult { txs: usize, #[serde(rename = "utxo_increase")] utxo_increase: usize, + #[serde(rename = "utxo_size_inc")] utxo_size_inc: usize, } From 8f61f8f5b30fd4572d211ffeb8264d7349631cde Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 23:03:04 +0000 Subject: [PATCH 15/19] Rm empty array --- client/src/client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 5fb367d..ebd7ffc 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -361,9 +361,9 @@ pub trait RpcApi: Sized { block_height: Option, ) -> Result { if let Some(hash) = block_hash { - self.call("getblockstats", &[into_json(hash)?, empty_arr()]).await + self.call("getblockstats", &[into_json(hash)?]).await } else if let Some(height) = block_height { - self.call("getblockstats", &[into_json(height)?, empty_arr()]).await + self.call("getblockstats", &[into_json(height)?]).await } else { panic!("TODO: Which error to use?") } From 43f73ec99753f760ef6671d9284ba0555573d472 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 23:09:22 +0000 Subject: [PATCH 16/19] Add member field doc comments --- json/src/lib.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/json/src/lib.rs b/json/src/lib.rs index 7c10e40..a1c9fad 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -216,61 +216,91 @@ pub struct GetBlockHeaderResult { #[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetBlockStatsResult { + /// Average fee in the block #[serde(rename = "avgfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] avg_fee: Amount, + /// Average feerate (in satoshis per virtual byte) #[serde(rename = "avgfeerate")] avg_fee_rate: usize, + /// Average transaction size #[serde(rename = "avgtxsize")] avg_tx_size: u64, + /// The block hash (to check for potential reorgs) #[serde(rename = "blockhash")] block_hash: bitcoin::BlockHash, + /// Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit (in satoshis per + /// virtual byte) #[serde(rename = "feerate_percentiles")] fee_rate_percentiles: [u8; 5], + /// The height of the block height: usize, + /// The number of inputs (excluding coinbase) ins: usize, + /// Maximum fee in the block #[serde(rename = "maxfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] max_fee: Amount, + /// Maximum feerate (in satoshis per virtual byte) #[serde(rename = "maxfeerate")] max_fee_rate: usize, + /// Maximum transaction size #[serde(rename = "maxtxsize")] max_tx_size: usize, + /// Truncated median fee in the block #[serde(rename = "medianfee")] median_fee: usize, + /// The block median time past #[serde(rename = "mediantime")] median_time: usize, + /// Truncated median transaction size #[serde(rename = "mediantxsize")] median_tx_size: usize, + /// Minimum fee in the block #[serde(rename = "minfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] min_fee: Amount, + /// Minimum feerate (in satoshis per virtual byte) #[serde(rename = "minfeerate")] min_fee_rate: usize, + /// Minimum transaction size #[serde(rename = "mintxsize")] min_tx_size: usize, + /// The number of outputs outs: usize, + /// The block subsidy #[serde(with = "bitcoin::util::amount::serde::as_btc")] subsidy: Amount, + /// Total size of all segwit transactions #[serde(rename = "swtotal_size")] sw_total_size: usize, + /// Total weight of all segwit transactions #[serde(rename = "swtotal_weight")] sw_total_weight: usize, + /// The number of segwit transactions #[serde(rename = "swtxs")] sw_txs: usize, + /// The block time time: usize, + /// Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee]) #[serde(rename = "total_out")] total_out: usize, + /// Total size of all non-coinbase transactions #[serde(rename = "total_size")] total_size: usize, + /// Total weight of all non-coinbase transactions #[serde(rename = "total_weight")] total_weight: usize, + /// The fee total #[serde(rename = "totalfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] total_fee: Amount, + /// The number of transactions (including coinbase) txs: usize, + /// The increase/decrease in the number of unspent outputs #[serde(rename = "utxo_increase")] utxo_increase: usize, + /// The increase/decrease in size for the #[serde(rename = "utxo_size_inc")] utxo_size_inc: usize, } From 2e44766d4e2ff48fbafcea4e6961607e458b0b22 Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 23:42:45 +0000 Subject: [PATCH 17/19] Make member fields public --- json/src/lib.rs | 58 ++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index a1c9fad..8ada3b8 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -219,90 +219,90 @@ pub struct GetBlockStatsResult { /// Average fee in the block #[serde(rename = "avgfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] - avg_fee: Amount, + pub avg_fee: Amount, /// Average feerate (in satoshis per virtual byte) #[serde(rename = "avgfeerate")] - avg_fee_rate: usize, + pub avg_fee_rate: usize, /// Average transaction size #[serde(rename = "avgtxsize")] - avg_tx_size: u64, + pub avg_tx_size: u64, /// The block hash (to check for potential reorgs) #[serde(rename = "blockhash")] - block_hash: bitcoin::BlockHash, + pub block_hash: bitcoin::BlockHash, /// Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit (in satoshis per /// virtual byte) #[serde(rename = "feerate_percentiles")] - fee_rate_percentiles: [u8; 5], + pub fee_rate_percentiles: [u8; 5], /// The height of the block - height: usize, + pub height: usize, /// The number of inputs (excluding coinbase) - ins: usize, + pub ins: usize, /// Maximum fee in the block #[serde(rename = "maxfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] - max_fee: Amount, + pub max_fee: Amount, /// Maximum feerate (in satoshis per virtual byte) #[serde(rename = "maxfeerate")] - max_fee_rate: usize, + pub max_fee_rate: usize, /// Maximum transaction size #[serde(rename = "maxtxsize")] - max_tx_size: usize, + pub max_tx_size: usize, /// Truncated median fee in the block #[serde(rename = "medianfee")] - median_fee: usize, + pub median_fee: usize, /// The block median time past #[serde(rename = "mediantime")] - median_time: usize, + pub median_time: usize, /// Truncated median transaction size #[serde(rename = "mediantxsize")] - median_tx_size: usize, + pub median_tx_size: usize, /// Minimum fee in the block #[serde(rename = "minfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] - min_fee: Amount, + pub min_fee: Amount, /// Minimum feerate (in satoshis per virtual byte) #[serde(rename = "minfeerate")] - min_fee_rate: usize, + pub min_fee_rate: usize, /// Minimum transaction size #[serde(rename = "mintxsize")] - min_tx_size: usize, + pub min_tx_size: usize, /// The number of outputs - outs: usize, + pub outs: usize, /// The block subsidy #[serde(with = "bitcoin::util::amount::serde::as_btc")] - subsidy: Amount, + pub subsidy: Amount, /// Total size of all segwit transactions #[serde(rename = "swtotal_size")] - sw_total_size: usize, + pub sw_total_size: usize, /// Total weight of all segwit transactions #[serde(rename = "swtotal_weight")] - sw_total_weight: usize, + pub sw_total_weight: usize, /// The number of segwit transactions #[serde(rename = "swtxs")] - sw_txs: usize, + pub sw_txs: usize, /// The block time - time: usize, + pub time: usize, /// Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee]) #[serde(rename = "total_out")] - total_out: usize, + pub total_out: usize, /// Total size of all non-coinbase transactions #[serde(rename = "total_size")] - total_size: usize, + pub total_size: usize, /// Total weight of all non-coinbase transactions #[serde(rename = "total_weight")] - total_weight: usize, + pub total_weight: usize, /// The fee total #[serde(rename = "totalfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] - total_fee: Amount, + pub total_fee: Amount, /// The number of transactions (including coinbase) - txs: usize, + pub txs: usize, /// The increase/decrease in the number of unspent outputs #[serde(rename = "utxo_increase")] - utxo_increase: usize, + pub utxo_increase: usize, /// The increase/decrease in size for the #[serde(rename = "utxo_size_inc")] - utxo_size_inc: usize, + pub utxo_size_inc: usize, } #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] From ba366a0513dc7a7ea3fb28ac7cad02347ec8501b Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sat, 5 Nov 2022 23:46:23 +0000 Subject: [PATCH 18/19] More accurate member field types --- json/src/lib.rs | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index 8ada3b8..273d2af 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -222,10 +222,11 @@ pub struct GetBlockStatsResult { pub avg_fee: Amount, /// Average feerate (in satoshis per virtual byte) #[serde(rename = "avgfeerate")] - pub avg_fee_rate: usize, + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + pub avg_fee_rate: Amount, /// Average transaction size #[serde(rename = "avgtxsize")] - pub avg_tx_size: u64, + pub avg_tx_size: u32, /// The block hash (to check for potential reorgs) #[serde(rename = "blockhash")] pub block_hash: bitcoin::BlockHash, @@ -234,7 +235,7 @@ pub struct GetBlockStatsResult { #[serde(rename = "feerate_percentiles")] pub fee_rate_percentiles: [u8; 5], /// The height of the block - pub height: usize, + pub height: u64, /// The number of inputs (excluding coinbase) pub ins: usize, /// Maximum fee in the block @@ -243,29 +244,32 @@ pub struct GetBlockStatsResult { pub max_fee: Amount, /// Maximum feerate (in satoshis per virtual byte) #[serde(rename = "maxfeerate")] - pub max_fee_rate: usize, + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + pub max_fee_rate: Amount, /// Maximum transaction size #[serde(rename = "maxtxsize")] - pub max_tx_size: usize, + pub max_tx_size: u32, /// Truncated median fee in the block #[serde(rename = "medianfee")] - pub median_fee: usize, + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + pub median_fee: Amount, /// The block median time past #[serde(rename = "mediantime")] - pub median_time: usize, + pub median_time: u64, /// Truncated median transaction size #[serde(rename = "mediantxsize")] - pub median_tx_size: usize, + pub median_tx_size: u32, /// Minimum fee in the block #[serde(rename = "minfee")] #[serde(with = "bitcoin::util::amount::serde::as_btc")] pub min_fee: Amount, /// Minimum feerate (in satoshis per virtual byte) #[serde(rename = "minfeerate")] - pub min_fee_rate: usize, + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + pub min_fee_rate: Amount, /// Minimum transaction size #[serde(rename = "mintxsize")] - pub min_tx_size: usize, + pub min_tx_size: u32, /// The number of outputs pub outs: usize, /// The block subsidy @@ -281,10 +285,11 @@ pub struct GetBlockStatsResult { #[serde(rename = "swtxs")] pub sw_txs: usize, /// The block time - pub time: usize, + pub time: u64, /// Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee]) #[serde(rename = "total_out")] - pub total_out: usize, + #[serde(with = "bitcoin::util::amount::serde::as_btc")] + pub total_out: Amount, /// Total size of all non-coinbase transactions #[serde(rename = "total_size")] pub total_size: usize, @@ -299,10 +304,10 @@ pub struct GetBlockStatsResult { pub txs: usize, /// The increase/decrease in the number of unspent outputs #[serde(rename = "utxo_increase")] - pub utxo_increase: usize, + pub utxo_increase: i32, /// The increase/decrease in size for the #[serde(rename = "utxo_size_inc")] - pub utxo_size_inc: usize, + pub utxo_size_inc: i32, } #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] From 6a8cf7773cfcce2fc99028cfcfcbdc0e9ec68e6f Mon Sep 17 00:00:00 2001 From: Rachel Rybarczyk Date: Sun, 6 Nov 2022 00:19:55 +0000 Subject: [PATCH 19/19] Attempt address amount too big response error --- json/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/json/src/lib.rs b/json/src/lib.rs index 273d2af..a96d4ff 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -288,8 +288,8 @@ pub struct GetBlockStatsResult { pub time: u64, /// Total amount in all outputs (excluding coinbase and thus reward [ie subsidy + totalfee]) #[serde(rename = "total_out")] - #[serde(with = "bitcoin::util::amount::serde::as_btc")] - pub total_out: Amount, + // #[serde(with = "bitcoin::util::amount::serde::as_btc")] + pub total_out: usize, /// Total size of all non-coinbase transactions #[serde(rename = "total_size")] pub total_size: usize,