@@ -454,7 +454,7 @@ pub trait WalletSourceSync {
454
454
}
455
455
456
456
/// A wrapper around [`WalletSourceSync`] to allow for async calls.
457
- pub struct WalletSourceSyncWrapper < T : Deref > ( T )
457
+ pub ( crate ) struct WalletSourceSyncWrapper < T : Deref > ( T )
458
458
where
459
459
T :: Target : WalletSourceSync ;
460
460
@@ -494,6 +494,67 @@ where
494
494
}
495
495
}
496
496
497
+ /// A synchronous wrapper around [`Wallet`] to be used in contexts where async is not available.
498
+ pub struct WalletSync < W : Deref + MaybeSync + MaybeSend , L : Deref + MaybeSync + MaybeSend >
499
+ where
500
+ W :: Target : WalletSourceSync + MaybeSend ,
501
+ L :: Target : Logger + MaybeSend ,
502
+ {
503
+ wallet : Wallet < Arc < WalletSourceSyncWrapper < W > > , L > ,
504
+ }
505
+
506
+ impl < W : Deref + MaybeSync + MaybeSend , L : Deref + MaybeSync + MaybeSend > WalletSync < W , L >
507
+ where
508
+ W :: Target : WalletSourceSync + MaybeSend ,
509
+ L :: Target : Logger + MaybeSend ,
510
+ {
511
+ /// Constructs a new [`WalletSync`] instance.
512
+ pub fn new ( source : W , logger : L ) -> Self {
513
+ Self { wallet : Wallet :: new ( Arc :: new ( WalletSourceSyncWrapper :: new ( source) ) , logger) }
514
+ }
515
+ }
516
+
517
+ impl < W : Deref + MaybeSync + MaybeSend , L : Deref + MaybeSync + MaybeSend > CoinSelectionSourceSync
518
+ for WalletSync < W , L >
519
+ where
520
+ W :: Target : WalletSourceSync + MaybeSend + MaybeSync ,
521
+ L :: Target : Logger + MaybeSend + MaybeSync ,
522
+ {
523
+ fn select_confirmed_utxos (
524
+ & self , claim_id : ClaimId , must_spend : Vec < Input > , must_pay_to : & [ TxOut ] ,
525
+ target_feerate_sat_per_1000_weight : u32 ,
526
+ ) -> Result < CoinSelection , ( ) > {
527
+ let mut fut = Box :: pin ( self . wallet . select_confirmed_utxos (
528
+ claim_id,
529
+ must_spend,
530
+ must_pay_to,
531
+ target_feerate_sat_per_1000_weight,
532
+ ) ) ;
533
+ let mut waker = dummy_waker ( ) ;
534
+ let mut ctx = task:: Context :: from_waker ( & mut waker) ;
535
+ match fut. as_mut ( ) . poll ( & mut ctx) {
536
+ task:: Poll :: Ready ( result) => result,
537
+ task:: Poll :: Pending => {
538
+ unreachable ! (
539
+ "Wallet::select_confirmed_utxos should not be pending in a sync context"
540
+ ) ;
541
+ } ,
542
+ }
543
+ }
544
+
545
+ fn sign_psbt ( & self , psbt : Psbt ) -> Result < Transaction , ( ) > {
546
+ let mut fut = Box :: pin ( self . wallet . sign_psbt ( psbt) ) ;
547
+ let mut waker = dummy_waker ( ) ;
548
+ let mut ctx = task:: Context :: from_waker ( & mut waker) ;
549
+ match fut. as_mut ( ) . poll ( & mut ctx) {
550
+ task:: Poll :: Ready ( result) => result,
551
+ task:: Poll :: Pending => {
552
+ unreachable ! ( "Wallet::sign_psbt should not be pending in a sync context" ) ;
553
+ } ,
554
+ }
555
+ }
556
+ }
557
+
497
558
/// A wrapper over [`WalletSource`] that implements [`CoinSelection`] by preferring UTXOs that would
498
559
/// avoid conflicting double spends. If not enough UTXOs are available to do so, conflicting double
499
560
/// spends may happen.
0 commit comments