Skip to content

Commit add9019

Browse files
committed
f RB: Account for Payload being removed
1 parent b8db48b commit add9019

File tree

1 file changed

+50
-41
lines changed

1 file changed

+50
-41
lines changed

src/wallet/mod.rs

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,15 @@ use bdk::database::BatchDatabase;
2929
use bdk::wallet::AddressIndex;
3030
use bdk::{Balance, SignOptions, SyncOptions};
3131

32-
use bitcoin::address::{Payload, WitnessVersion};
3332
use bitcoin::blockdata::constants::WITNESS_SCALE_FACTOR;
3433
use bitcoin::blockdata::locktime::absolute::LockTime;
35-
use bitcoin::hash_types::WPubkeyHash;
3634
use bitcoin::hashes::Hash;
3735
use bitcoin::key::XOnlyPublicKey;
3836
use bitcoin::psbt::PartiallySignedTransaction;
3937
use bitcoin::secp256k1::ecdh::SharedSecret;
4038
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
4139
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};
4341

4442
use std::ops::{Deref, DerefMut};
4543
use std::sync::{Arc, Mutex, RwLock};
@@ -399,46 +397,58 @@ where
399397
.filter(|u| confirmed_txs.iter().find(|t| t.txid == u.outpoint.txid).is_some());
400398

401399
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| {
418405
log_error!(self.logger, "Failed to retrieve script payload: {}", e);
419406
})?;
420407

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 {
433410
log_error!(
434411
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
438414
);
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,);
440450
},
441-
_ => {
451+
None => {
442452
log_error!(
443453
self.logger,
444454
"Tried to use a non-witness script. This must never happen."
@@ -649,11 +659,10 @@ where
649659
log_error!(self.logger, "Failed to retrieve new address from wallet: {}", e);
650660
})?;
651661

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+
}),
657666
_ => {
658667
log_error!(
659668
self.logger,

0 commit comments

Comments
 (0)