@@ -31,6 +31,7 @@ use bitcoin::util::{bip158, bip32};
31
31
use bitcoin:: { Address , Amount , PrivateKey , PublicKey , Script , SignedAmount , Transaction } ;
32
32
use serde:: de:: Error as SerdeError ;
33
33
use serde:: { Deserialize , Serialize } ;
34
+ use std:: fmt;
34
35
35
36
//TODO(stevenroose) consider using a Time type
36
37
@@ -225,6 +226,264 @@ pub struct GetBlockHeaderResult {
225
226
pub next_block_hash : Option < bitcoin:: BlockHash > ,
226
227
}
227
228
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
+
228
487
#[ derive( Clone , PartialEq , Debug , Deserialize , Serialize ) ]
229
488
#[ serde( rename_all = "camelCase" ) ]
230
489
pub struct GetMiningInfoResult {
@@ -912,7 +1171,6 @@ impl<'de> serde::Deserialize<'de> for ImportMultiRescanSince {
912
1171
D : serde:: Deserializer < ' de > ,
913
1172
{
914
1173
use serde:: de;
915
- use std:: fmt;
916
1174
struct Visitor ;
917
1175
impl < ' de > de:: Visitor < ' de > for Visitor {
918
1176
type Value = ImportMultiRescanSince ;
0 commit comments