@@ -31,6 +31,7 @@ use bitcoin::util::{bip158, bip32};
3131use bitcoin:: { Address , Amount , PrivateKey , PublicKey , Script , SignedAmount , Transaction } ;
3232use serde:: de:: Error as SerdeError ;
3333use serde:: { Deserialize , Serialize } ;
34+ use std:: fmt;
3435
3536//TODO(stevenroose) consider using a Time type
3637
@@ -225,6 +226,264 @@ pub struct GetBlockHeaderResult {
225226 pub next_block_hash : Option < bitcoin:: BlockHash > ,
226227}
227228
229+ #[ derive( Clone , PartialEq , Debug , Deserialize , Serialize ) ]
230+ pub struct GetBlockStatsResult {
231+ #[ serde( rename = "avgfee" , with = "bitcoin::util::amount::serde::as_sat" ) ]
232+ pub avg_fee : Amount ,
233+ #[ serde( rename = "avgfeerate" , with = "bitcoin::util::amount::serde::as_sat" ) ]
234+ pub avg_fee_rate : Amount ,
235+ #[ serde( rename = "avgtxsize" ) ]
236+ pub avg_tx_size : u32 ,
237+ #[ serde( rename = "blockhash" ) ]
238+ pub block_hash : bitcoin:: BlockHash ,
239+ #[ serde( rename = "feerate_percentiles" ) ]
240+ pub fee_rate_percentiles : FeeRatePercentiles ,
241+ pub height : u64 ,
242+ pub ins : usize ,
243+ #[ serde( rename = "maxfee" , with = "bitcoin::util::amount::serde::as_sat" ) ]
244+ pub max_fee : Amount ,
245+ #[ serde( rename = "maxfeerate" , with = "bitcoin::util::amount::serde::as_sat" ) ]
246+ pub max_fee_rate : Amount ,
247+ #[ serde( rename = "maxtxsize" ) ]
248+ pub max_tx_size : u32 ,
249+ #[ serde( rename = "medianfee" , with = "bitcoin::util::amount::serde::as_sat" ) ]
250+ pub median_fee : Amount ,
251+ #[ serde( rename = "mediantime" ) ]
252+ pub median_time : u64 ,
253+ #[ serde( rename = "mediantxsize" ) ]
254+ pub median_tx_size : u32 ,
255+ #[ serde( rename = "minfee" , with = "bitcoin::util::amount::serde::as_sat" ) ]
256+ pub min_fee : Amount ,
257+ #[ serde( rename = "minfeerate" , with = "bitcoin::util::amount::serde::as_sat" ) ]
258+ pub min_fee_rate : Amount ,
259+ #[ serde( rename = "mintxsize" ) ]
260+ pub min_tx_size : u32 ,
261+ pub outs : usize ,
262+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
263+ pub subsidy : Amount ,
264+ #[ serde( rename = "swtotal_size" ) ]
265+ pub sw_total_size : usize ,
266+ #[ serde( rename = "swtotal_weight" ) ]
267+ pub sw_total_weight : usize ,
268+ #[ serde( rename = "swtxs" ) ]
269+ pub sw_txs : usize ,
270+ pub time : u64 ,
271+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
272+ pub total_out : Amount ,
273+ pub total_size : usize ,
274+ pub total_weight : usize ,
275+ #[ serde( rename = "totalfee" , with = "bitcoin::util::amount::serde::as_sat" ) ]
276+ pub total_fee : Amount ,
277+ pub txs : usize ,
278+ pub utxo_increase : i32 ,
279+ pub utxo_size_inc : i32 ,
280+ }
281+
282+ #[ derive( Clone , PartialEq , Debug , Deserialize , Serialize ) ]
283+ pub struct GetBlockStatsResultPartial {
284+ #[ serde(
285+ default ,
286+ rename = "avgfee" ,
287+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
288+ skip_serializing_if = "Option::is_none"
289+ ) ]
290+ pub avg_fee : Option < Amount > ,
291+ #[ serde(
292+ default ,
293+ rename = "avgfeerate" ,
294+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
295+ skip_serializing_if = "Option::is_none"
296+ ) ]
297+ pub avg_fee_rate : Option < Amount > ,
298+ #[ serde( default , rename = "avgtxsize" , skip_serializing_if = "Option::is_none" ) ]
299+ pub avg_tx_size : Option < u32 > ,
300+ #[ serde( default , rename = "blockhash" , skip_serializing_if = "Option::is_none" ) ]
301+ pub block_hash : Option < bitcoin:: BlockHash > ,
302+ #[ serde( default , rename = "feerate_percentiles" , skip_serializing_if = "Option::is_none" ) ]
303+ pub fee_rate_percentiles : Option < FeeRatePercentiles > ,
304+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
305+ pub height : Option < u64 > ,
306+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
307+ pub ins : Option < usize > ,
308+ #[ serde(
309+ default ,
310+ rename = "maxfee" ,
311+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
312+ skip_serializing_if = "Option::is_none"
313+ ) ]
314+ pub max_fee : Option < Amount > ,
315+ #[ serde(
316+ default ,
317+ rename = "maxfeerate" ,
318+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
319+ skip_serializing_if = "Option::is_none"
320+ ) ]
321+ pub max_fee_rate : Option < Amount > ,
322+ #[ serde( default , rename = "maxtxsize" , skip_serializing_if = "Option::is_none" ) ]
323+ pub max_tx_size : Option < u32 > ,
324+ #[ serde(
325+ default ,
326+ rename = "medianfee" ,
327+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
328+ skip_serializing_if = "Option::is_none"
329+ ) ]
330+ pub median_fee : Option < Amount > ,
331+ #[ serde( default , rename = "mediantime" , skip_serializing_if = "Option::is_none" ) ]
332+ pub median_time : Option < u64 > ,
333+ #[ serde( default , rename = "mediantxsize" , skip_serializing_if = "Option::is_none" ) ]
334+ pub median_tx_size : Option < u32 > ,
335+ #[ serde(
336+ default ,
337+ rename = "minfee" ,
338+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
339+ skip_serializing_if = "Option::is_none"
340+ ) ]
341+ pub min_fee : Option < Amount > ,
342+ #[ serde(
343+ default ,
344+ rename = "minfeerate" ,
345+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
346+ skip_serializing_if = "Option::is_none"
347+ ) ]
348+ pub min_fee_rate : Option < Amount > ,
349+ #[ serde( default , rename = "mintxsize" , skip_serializing_if = "Option::is_none" ) ]
350+ pub min_tx_size : Option < u32 > ,
351+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
352+ pub outs : Option < usize > ,
353+ #[ serde(
354+ default ,
355+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
356+ skip_serializing_if = "Option::is_none"
357+ ) ]
358+ pub subsidy : Option < Amount > ,
359+ #[ serde( default , rename = "swtotal_size" , skip_serializing_if = "Option::is_none" ) ]
360+ pub sw_total_size : Option < usize > ,
361+ #[ serde( default , rename = "swtotal_weight" , skip_serializing_if = "Option::is_none" ) ]
362+ pub sw_total_weight : Option < usize > ,
363+ #[ serde( default , rename = "swtxs" , skip_serializing_if = "Option::is_none" ) ]
364+ pub sw_txs : Option < usize > ,
365+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
366+ pub time : Option < u64 > ,
367+ #[ serde(
368+ default ,
369+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
370+ skip_serializing_if = "Option::is_none"
371+ ) ]
372+ pub total_out : Option < Amount > ,
373+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
374+ pub total_size : Option < usize > ,
375+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
376+ pub total_weight : Option < usize > ,
377+ #[ serde(
378+ default ,
379+ rename = "totalfee" ,
380+ with = "bitcoin::util::amount::serde::as_sat::opt" ,
381+ skip_serializing_if = "Option::is_none"
382+ ) ]
383+ pub total_fee : Option < Amount > ,
384+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
385+ pub txs : Option < usize > ,
386+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
387+ pub utxo_increase : Option < i32 > ,
388+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
389+ pub utxo_size_inc : Option < i32 > ,
390+ }
391+
392+ #[ derive( Clone , PartialEq , Debug , Deserialize , Serialize ) ]
393+ pub struct FeeRatePercentiles {
394+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
395+ pub fr_10th : Amount ,
396+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
397+ pub fr_25th : Amount ,
398+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
399+ pub fr_50th : Amount ,
400+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
401+ pub fr_75th : Amount ,
402+ #[ serde( with = "bitcoin::util::amount::serde::as_sat" ) ]
403+ pub fr_90th : Amount ,
404+ }
405+
406+ #[ derive( Clone ) ]
407+ pub enum BlockStatsFields {
408+ AverageFee ,
409+ AverageFeeRate ,
410+ AverageTxSize ,
411+ BlockHash ,
412+ FeeRatePercentiles ,
413+ Height ,
414+ Ins ,
415+ MaxFee ,
416+ MaxFeeRate ,
417+ MaxTxSize ,
418+ MedianFee ,
419+ MedianTime ,
420+ MedianTxSize ,
421+ MinFee ,
422+ MinFeeRate ,
423+ MinTxSize ,
424+ Outs ,
425+ Subsidy ,
426+ SegWitTotalSize ,
427+ SegWitTotalWeight ,
428+ SegWitTxs ,
429+ Time ,
430+ TotalOut ,
431+ TotalSize ,
432+ TotalWeight ,
433+ TotalFee ,
434+ Txs ,
435+ UtxoIncrease ,
436+ UtxoSizeIncrease ,
437+ }
438+
439+ impl BlockStatsFields {
440+ fn get_rpc_keyword ( & self ) -> & str {
441+ match * self {
442+ BlockStatsFields :: AverageFee => "avgfee" ,
443+ BlockStatsFields :: AverageFeeRate => "avgfeerate" ,
444+ BlockStatsFields :: AverageTxSize => "avgtxsize" ,
445+ BlockStatsFields :: BlockHash => "blockhash" ,
446+ BlockStatsFields :: FeeRatePercentiles => "feerate_percentiles" ,
447+ BlockStatsFields :: Height => "height" ,
448+ BlockStatsFields :: Ins => "ins" ,
449+ BlockStatsFields :: MaxFee => "maxfee" ,
450+ BlockStatsFields :: MaxFeeRate => "maxfeerate" ,
451+ BlockStatsFields :: MaxTxSize => "maxtxsize" ,
452+ BlockStatsFields :: MedianFee => "medianfee" ,
453+ BlockStatsFields :: MedianTime => "mediantime" ,
454+ BlockStatsFields :: MedianTxSize => "mediantxsize" ,
455+ BlockStatsFields :: MinFee => "minfee" ,
456+ BlockStatsFields :: MinFeeRate => "minfeerate" ,
457+ BlockStatsFields :: MinTxSize => "minfeerate" ,
458+ BlockStatsFields :: Outs => "outs" ,
459+ BlockStatsFields :: Subsidy => "subsidy" ,
460+ BlockStatsFields :: SegWitTotalSize => "swtotal_size" ,
461+ BlockStatsFields :: SegWitTotalWeight => "swtotal_weight" ,
462+ BlockStatsFields :: SegWitTxs => "swtxs" ,
463+ BlockStatsFields :: Time => "time" ,
464+ BlockStatsFields :: TotalOut => "total_out" ,
465+ BlockStatsFields :: TotalSize => "total_size" ,
466+ BlockStatsFields :: TotalWeight => "total_weight" ,
467+ BlockStatsFields :: TotalFee => "totalfee" ,
468+ BlockStatsFields :: Txs => "txs" ,
469+ BlockStatsFields :: UtxoIncrease => "utxo_increase" ,
470+ BlockStatsFields :: UtxoSizeIncrease => "utxo_size_inc" ,
471+ }
472+ }
473+ }
474+
475+ impl fmt:: Display for BlockStatsFields {
476+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
477+ write ! ( f, "{}" , self . get_rpc_keyword( ) )
478+ }
479+ }
480+
481+ impl From < BlockStatsFields > for serde_json:: Value {
482+ fn from ( bsf : BlockStatsFields ) -> Self {
483+ Self :: from ( bsf. to_string ( ) )
484+ }
485+ }
486+
228487#[ derive( Clone , PartialEq , Debug , Deserialize , Serialize ) ]
229488#[ serde( rename_all = "camelCase" ) ]
230489pub struct GetMiningInfoResult {
@@ -912,7 +1171,6 @@ impl<'de> serde::Deserialize<'de> for ImportMultiRescanSince {
9121171 D : serde:: Deserializer < ' de > ,
9131172 {
9141173 use serde:: de;
915- use std:: fmt;
9161174 struct Visitor ;
9171175 impl < ' de > de:: Visitor < ' de > for Visitor {
9181176 type Value = ImportMultiRescanSince ;
0 commit comments