Skip to content

Commit 47642ff

Browse files
committed
add do_not_finalize to SignOptions
1 parent 9995830 commit 47642ff

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
- Add traits to reuse `Blockchain`s across multiple wallets (`BlockchainFactory` and `StatelessBlockchain`).
1313
- Upgrade to rust-bitcoin `0.28`
1414
- If using the `sqlite-db` feature all cached wallet data is deleted due to a possible UTXO inconsistency, a wallet.sync will recreate it
15-
- Added `do_not_remove_partial_sigs` to `SignOptions`
15+
- Added `do_not_remove_partial_sigs` and `do_not_finalize` to `SignOptions`
1616

1717
## [v0.18.0] - [v0.17.0]
1818

src/wallet/mod.rs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,11 @@ where
10461046
}
10471047

10481048
// attempt to finalize
1049-
self.finalize_psbt(psbt, sign_options)
1049+
if sign_options.do_not_finalize {
1050+
Ok(false)
1051+
} else {
1052+
self.finalize_psbt(psbt, sign_options)
1053+
}
10501054
}
10511055

10521056
/// Return the spending policies for the wallet's descriptor
@@ -3836,6 +3840,56 @@ pub(crate) mod test {
38363840
.for_each(|input| assert!(!input.partial_sigs.is_empty()));
38373841
}
38383842

3843+
#[test]
3844+
fn test_do_not_finalize_sign_option() {
3845+
let (wallet, _, _) = get_funded_wallet("wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)");
3846+
3847+
fn create_psbt(wallet: &Wallet<AnyDatabase>) -> psbt::PartiallySignedTransaction {
3848+
let addr = wallet.get_address(New).unwrap();
3849+
// only sign and finalize if do_not_finalize is set as false in SignOptions
3850+
let mut builder = wallet.build_tx();
3851+
builder.drain_to(addr.script_pubkey()).drain_wallet();
3852+
builder.finish().unwrap().0
3853+
}
3854+
3855+
let mut psbt_1 = create_psbt(&wallet);
3856+
3857+
let finalized = wallet
3858+
.sign(
3859+
&mut psbt_1,
3860+
SignOptions {
3861+
do_not_finalize: false,
3862+
..Default::default()
3863+
},
3864+
)
3865+
.unwrap();
3866+
assert!(finalized);
3867+
3868+
psbt_1.inputs.iter().for_each(|input| {
3869+
assert!(input.final_script_sig.is_some());
3870+
assert!(input.final_script_witness.is_some());
3871+
});
3872+
3873+
// only sign and do not finalize if do_not_finalize is set as true in SignOptions
3874+
let mut psbt_2 = create_psbt(&wallet);
3875+
3876+
let finalized = wallet
3877+
.sign(
3878+
&mut psbt_2,
3879+
SignOptions {
3880+
do_not_finalize: true,
3881+
..Default::default()
3882+
},
3883+
)
3884+
.unwrap();
3885+
assert!(!finalized);
3886+
3887+
psbt_2.inputs.iter().for_each(|input| {
3888+
assert!(input.final_script_sig.is_none());
3889+
assert!(input.final_script_witness.is_none());
3890+
});
3891+
}
3892+
38393893
#[test]
38403894
fn test_sign_nonstandard_sighash() {
38413895
let sighash = EcdsaSighashType::NonePlusAnyoneCanPay;

src/wallet/signer.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,10 @@ pub struct SignOptions {
497497
/// Whether partial_sigs in input should be removed when the psbt_input is signed in finalizing psbt.
498498
/// Defaults to `false` which will partial_sigs will be removed after signing.
499499
pub do_not_remove_partial_sigs: bool,
500+
/// Whether the wallet should try to finalize psbt input should be removed when the psbt_input is signed after
501+
///
502+
/// Defaults to `false` which will partial_sigs after input is signed
503+
pub do_not_finalize: bool,
500504
}
501505

502506
#[allow(clippy::derivable_impls)]
@@ -507,6 +511,7 @@ impl Default for SignOptions {
507511
assume_height: None,
508512
allow_all_sighashes: false,
509513
do_not_remove_partial_sigs: false,
514+
do_not_finalize: false,
510515
}
511516
}
512517
}

0 commit comments

Comments
 (0)