@@ -29,17 +29,15 @@ use bdk::database::BatchDatabase;
29
29
use bdk:: wallet:: AddressIndex ;
30
30
use bdk:: { Balance , SignOptions , SyncOptions } ;
31
31
32
- use bitcoin:: address:: { Payload , WitnessVersion } ;
33
32
use bitcoin:: blockdata:: constants:: WITNESS_SCALE_FACTOR ;
34
33
use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
35
- use bitcoin:: hash_types:: WPubkeyHash ;
36
34
use bitcoin:: hashes:: Hash ;
37
35
use bitcoin:: key:: XOnlyPublicKey ;
38
36
use bitcoin:: psbt:: PartiallySignedTransaction ;
39
37
use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
40
38
use bitcoin:: secp256k1:: ecdsa:: { RecoverableSignature , Signature } ;
41
39
use bitcoin:: secp256k1:: { PublicKey , Scalar , Secp256k1 , SecretKey , Signing } ;
42
- use bitcoin:: { ScriptBuf , Transaction , TxOut , Txid } ;
40
+ use bitcoin:: { ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash , WitnessProgram , WitnessVersion } ;
43
41
44
42
use std:: ops:: { Deref , DerefMut } ;
45
43
use std:: sync:: { Arc , Mutex , RwLock } ;
@@ -399,46 +397,58 @@ where
399
397
. filter ( |u| confirmed_txs. iter ( ) . find ( |t| t. txid == u. outpoint . txid ) . is_some ( ) ) ;
400
398
401
399
for u in unspent_confirmed_utxos {
402
- let payload = Payload :: from_script ( & u. txout . script_pubkey ) . map_err ( |e| {
403
- log_error ! ( self . logger, "Failed to retrieve script payload: {}" , e) ;
404
- } ) ?;
405
-
406
- match payload {
407
- Payload :: WitnessProgram ( program) => match program. version ( ) {
408
- WitnessVersion :: V0 if program. program ( ) . len ( ) == 20 => {
409
- let wpkh =
410
- WPubkeyHash :: from_slice ( program. program ( ) . as_bytes ( ) ) . map_err ( |e| {
411
- log_error ! ( self . logger, "Failed to retrieve script payload: {}" , e) ;
412
- } ) ?;
413
- let utxo = Utxo :: new_v0_p2wpkh ( u. outpoint , u. txout . value , & wpkh) ;
414
- utxos. push ( utxo) ;
415
- } ,
416
- WitnessVersion :: V1 => {
417
- XOnlyPublicKey :: from_slice ( program. program ( ) . as_bytes ( ) ) . map_err ( |e| {
400
+ let script_pubkey = u. txout . script_pubkey ;
401
+ match script_pubkey. witness_version ( ) {
402
+ Some ( version @ WitnessVersion :: V0 ) => {
403
+ let witness_program = WitnessProgram :: new ( version, script_pubkey. as_bytes ( ) )
404
+ . map_err ( |e| {
418
405
log_error ! ( self . logger, "Failed to retrieve script payload: {}" , e) ;
419
406
} ) ?;
420
407
421
- let utxo = Utxo {
422
- outpoint : u. outpoint ,
423
- output : TxOut {
424
- value : u. txout . value ,
425
- script_pubkey : ScriptBuf :: new_witness_program ( & program) ,
426
- } ,
427
- satisfaction_weight : 1 /* empty script_sig */ * WITNESS_SCALE_FACTOR as u64 +
428
- 1 /* witness items */ + 1 /* schnorr sig len */ + 64 , /* schnorr sig */
429
- } ;
430
- utxos. push ( utxo) ;
431
- } ,
432
- _ => {
408
+ let program_length = witness_program. program ( ) . len ( ) ;
409
+ if program_length != 20 {
433
410
log_error ! (
434
411
self . logger,
435
- "Unexpected witness version or length. Version: {}, Length: {}" ,
436
- program. version( ) ,
437
- program. program( ) . len( )
412
+ "Unexpected witness program length: {}" ,
413
+ program_length
438
414
) ;
439
- } ,
415
+ continue ;
416
+ }
417
+
418
+ let wpkh = WPubkeyHash :: from_slice ( & witness_program. program ( ) . as_bytes ( ) )
419
+ . map_err ( |e| {
420
+ log_error ! ( self . logger, "Failed to retrieve script payload: {}" , e) ;
421
+ } ) ?;
422
+ let utxo = Utxo :: new_v0_p2wpkh ( u. outpoint , u. txout . value , & wpkh) ;
423
+ utxos. push ( utxo) ;
424
+ } ,
425
+ Some ( version @ WitnessVersion :: V1 ) => {
426
+ let witness_program = WitnessProgram :: new ( version, script_pubkey. as_bytes ( ) )
427
+ . map_err ( |e| {
428
+ log_error ! ( self . logger, "Failed to retrieve script payload: {}" , e) ;
429
+ } ) ?;
430
+
431
+ XOnlyPublicKey :: from_slice ( & witness_program. program ( ) . as_bytes ( ) ) . map_err (
432
+ |e| {
433
+ log_error ! ( self . logger, "Failed to retrieve script payload: {}" , e) ;
434
+ } ,
435
+ ) ?;
436
+
437
+ let utxo = Utxo {
438
+ outpoint : u. outpoint ,
439
+ output : TxOut {
440
+ value : u. txout . value ,
441
+ script_pubkey : ScriptBuf :: new_witness_program ( & witness_program) ,
442
+ } ,
443
+ satisfaction_weight : 1 /* empty script_sig */ * WITNESS_SCALE_FACTOR as u64 +
444
+ 1 /* witness items */ + 1 /* schnorr sig len */ + 64 , /* schnorr sig */
445
+ } ;
446
+ utxos. push ( utxo) ;
447
+ } ,
448
+ Some ( version) => {
449
+ log_error ! ( self . logger, "Unexpected witness version: {}" , version, ) ;
440
450
} ,
441
- _ => {
451
+ None => {
442
452
log_error ! (
443
453
self . logger,
444
454
"Tried to use a non-witness script. This must never happen."
@@ -649,11 +659,10 @@ where
649
659
log_error ! ( self . logger, "Failed to retrieve new address from wallet: {}" , e) ;
650
660
} ) ?;
651
661
652
- match address. payload {
653
- Payload :: WitnessProgram ( program) => ShutdownScript :: new_witness_program ( & program)
654
- . map_err ( |e| {
655
- log_error ! ( self . logger, "Invalid shutdown script: {:?}" , e) ;
656
- } ) ,
662
+ match address. witness_program ( ) {
663
+ Some ( program) => ShutdownScript :: new_witness_program ( & program) . map_err ( |e| {
664
+ log_error ! ( self . logger, "Invalid shutdown script: {:?}" , e) ;
665
+ } ) ,
657
666
_ => {
658
667
log_error ! (
659
668
self . logger,
0 commit comments