@@ -3,7 +3,8 @@ use bdk_wallet::{
33 bitcoin:: { Amount , FeeRate , Network } ,
44 psbt:: PsbtUtils ,
55 rusqlite:: Connection ,
6- KeychainKind , SignOptions , Wallet ,
6+ KeyRing , KeychainKind , SignOptions , Wallet ,
7+ descriptor:: IntoWalletDescriptor ,
78} ;
89use std:: { collections:: BTreeSet , io:: Write } ;
910use tokio:: time:: { sleep, Duration } ;
@@ -24,17 +25,21 @@ async fn main() -> Result<(), anyhow::Error> {
2425 let wallet_opt = Wallet :: load ( )
2526 . descriptor ( KeychainKind :: External , Some ( EXTERNAL_DESC ) )
2627 . descriptor ( KeychainKind :: Internal , Some ( INTERNAL_DESC ) )
27- . extract_keys ( )
2828 . check_network ( NETWORK )
2929 . load_wallet ( & mut db) ?;
3030 let mut wallet = match wallet_opt {
3131 Some ( wallet) => wallet,
32- None => Wallet :: create ( EXTERNAL_DESC , INTERNAL_DESC )
33- . network ( NETWORK )
34- . create_wallet ( & mut db) ?,
32+ None => {
33+ let mut keyring = KeyRing :: new ( NETWORK ) ;
34+ keyring. add_descriptor ( KeychainKind :: External , EXTERNAL_DESC ) ?;
35+ keyring. add_descriptor ( KeychainKind :: Internal , INTERNAL_DESC ) ?;
36+ keyring. into_params ( ) ?. create_wallet ( & mut db) ?
37+ }
3538 } ;
3639
37- let address = wallet. next_unused_address ( KeychainKind :: External ) ;
40+ let address = wallet
41+ . next_unused_address ( KeychainKind :: External )
42+ . expect ( "keychain must exist" ) ;
3843 wallet. persist ( & mut db) ?;
3944 println ! ( "Next unused address: ({}) {address}" , address. index) ;
4045
@@ -83,7 +88,14 @@ async fn main() -> Result<(), anyhow::Error> {
8388 tx_builder. fee_rate ( target_fee_rate) ;
8489
8590 let mut psbt = tx_builder. finish ( ) ?;
86- let finalized = wallet. sign ( & mut psbt, SignOptions :: default ( ) ) ?;
91+ let finalized = wallet. sign_with_signers (
92+ & mut psbt,
93+ & [
94+ & get_signers ( EXTERNAL_DESC , & wallet) ,
95+ & get_signers ( INTERNAL_DESC , & wallet) ,
96+ ] ,
97+ SignOptions :: default ( ) ,
98+ ) ?;
8799 assert ! ( finalized) ;
88100 let original_fee = psbt. fee_amount ( ) . unwrap ( ) ;
89101 let tx_feerate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -117,7 +129,14 @@ async fn main() -> Result<(), anyhow::Error> {
117129 let mut builder = wallet. build_fee_bump ( txid) . expect ( "failed to bump tx" ) ;
118130 builder. fee_rate ( feerate) ;
119131 let mut bumped_psbt = builder. finish ( ) . unwrap ( ) ;
120- let finalize_btx = wallet. sign ( & mut bumped_psbt, SignOptions :: default ( ) ) ?;
132+ let finalize_btx = wallet. sign_with_signers (
133+ & mut bumped_psbt,
134+ & [
135+ & get_signers ( EXTERNAL_DESC , & wallet) ,
136+ & get_signers ( INTERNAL_DESC , & wallet) ,
137+ ] ,
138+ SignOptions :: default ( ) ,
139+ ) ?;
121140 assert ! ( finalize_btx) ;
122141 let new_fee = bumped_psbt. fee_amount ( ) . unwrap ( ) ;
123142 let bumped_tx = bumped_psbt. extract_tx ( ) ?;
@@ -185,3 +204,14 @@ async fn main() -> Result<(), anyhow::Error> {
185204
186205 Ok ( ( ) )
187206}
207+
208+ pub fn get_signers (
209+ desc : impl IntoWalletDescriptor ,
210+ wallet : & Wallet < KeychainKind >
211+ ) -> bdk_wallet:: signer:: SignersContainer {
212+ use bdk_wallet:: signer:: SignersContainer ;
213+
214+ let ( descriptor, keymap) = desc. into_wallet_descriptor ( wallet. secp_ctx ( ) , wallet. network ( ) . into ( ) )
215+ . unwrap ( ) ;
216+ SignersContainer :: build ( keymap, & descriptor, wallet. secp_ctx ( ) )
217+ }
0 commit comments