@@ -5,6 +5,7 @@ use anyhow::{anyhow, Context, Result};
55use payjoin:: bitcoin:: consensus:: encode:: serialize_hex;
66use payjoin:: bitcoin:: { Amount , FeeRate } ;
77use payjoin:: persist:: { OptionalTransitionOutcome , SessionPersister } ;
8+ use payjoin:: receive:: check_references;
89use payjoin:: receive:: v2:: {
910 replay_event_log as replay_receiver_event_log, HasReplyableError , Initialized ,
1011 MaybeInputsOwned , MaybeInputsSeen , Monitor , OutputsUnknown , PayjoinProposal ,
@@ -702,13 +703,11 @@ impl App {
702703 persister : & ReceiverPersister ,
703704 ) -> Result < ( ) > {
704705 let wallet = self . wallet ( ) ;
705- let proposal = proposal
706- . check_broadcast_suitability ( None , |tx| {
707- wallet
708- . can_broadcast ( tx)
709- . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
710- } )
711- . save ( persister) ?;
706+ let is_broadcast_suitable = wallet
707+ . can_broadcast ( & proposal. extract_tx_to_check_broadcast_suitability ( ) )
708+ . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) ) ?;
709+ let proposal =
710+ proposal. apply_broadcast_suitability ( None , is_broadcast_suitable) . save ( persister) ?;
712711
713712 println ! ( "Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:" ) ;
714713 println ! ( "{}" , serialize_hex( & proposal. extract_tx_to_schedule_broadcast( ) ) ) ;
@@ -721,13 +720,11 @@ impl App {
721720 persister : & ReceiverPersister ,
722721 ) -> Result < ( ) > {
723722 let wallet = self . wallet ( ) ;
724- let proposal = proposal
725- . check_inputs_not_owned ( & mut |input| {
726- wallet
727- . is_mine ( input)
728- . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
729- } )
730- . save ( persister) ?;
723+ let refs = proposal. get_input_script_refs ( ) ?;
724+ let checked_refs = check_references ( refs, & mut |input| {
725+ wallet. is_mine ( input) . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
726+ } ) ?;
727+ let proposal = proposal. apply_input_owned_checks ( checked_refs) . save ( persister) ?;
731728 self . check_no_inputs_seen_before ( proposal, persister) . await
732729 }
733730
@@ -736,11 +733,10 @@ impl App {
736733 proposal : Receiver < MaybeInputsSeen > ,
737734 persister : & ReceiverPersister ,
738735 ) -> Result < ( ) > {
739- let proposal = proposal
740- . check_no_inputs_seen_before ( & mut |input| {
741- Ok ( self . db . insert_input_seen_before ( * input) ?)
742- } )
743- . save ( persister) ?;
736+ let refs = proposal. get_input_outpoint_refs ( ) ;
737+ let checked_refs =
738+ check_references ( refs, & mut |input| Ok ( self . db . insert_input_seen_before ( * input) ?) ) ?;
739+ let proposal = proposal. apply_input_seen_checks ( checked_refs) . save ( persister) ?;
744740 self . identify_receiver_outputs ( proposal, persister) . await
745741 }
746742
@@ -750,13 +746,13 @@ impl App {
750746 persister : & ReceiverPersister ,
751747 ) -> Result < ( ) > {
752748 let wallet = self . wallet ( ) ;
753- let proposal = proposal
754- . identify_receiver_outputs ( & mut |output_script| {
755- wallet
756- . is_mine ( output_script)
757- . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
758- } )
759- . save ( persister) ?;
749+ let refs = proposal. get_output_script_refs ( ) ;
750+ let checked_refs = check_references ( refs , & mut |output_script| {
751+ wallet
752+ . is_mine ( output_script)
753+ . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
754+ } ) ? ;
755+ let proposal = proposal . apply_output_owned_checks ( checked_refs ) . save ( persister) ?;
760756 self . commit_outputs ( proposal, persister) . await
761757 }
762758
@@ -804,13 +800,11 @@ impl App {
804800 persister : & ReceiverPersister ,
805801 ) -> Result < ( ) > {
806802 let wallet = self . wallet ( ) ;
807- let proposal = proposal
808- . finalize_proposal ( |psbt| {
809- wallet
810- . process_psbt ( psbt)
811- . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
812- } )
813- . save ( persister) ?;
803+ let psbt = proposal. psbt_to_sign ( ) ;
804+ let signed_psbt = wallet
805+ . process_psbt ( & psbt)
806+ . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) ) ?;
807+ let proposal = proposal. finalize_signed_proposal ( & signed_psbt) . save ( persister) ?;
814808 self . send_payjoin_proposal ( proposal, persister) . await
815809 }
816810
@@ -847,27 +841,32 @@ impl App {
847841
848842 tracing:: debug!( "Polling for payment confirmation" ) ;
849843
844+ let fallback_txid = proposal. extract_fallback_txid ( ) ;
845+ let payjoin_txid = proposal. extract_payjoin_proposal_txid ( ) ;
846+ let get_raw_tx = |txid| {
847+ self . wallet ( )
848+ . get_raw_transaction ( & txid)
849+ . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
850+ } ;
851+ match proposal. check_fallback_monitorable ( ) . save ( persister) ? {
852+ OptionalTransitionOutcome :: Progress ( _) => {
853+ println ! ( "Unable to monitor for fallback tx containing non-segwit inputs, completing session" ) ;
854+ return Ok ( ( ) ) ;
855+ }
856+ OptionalTransitionOutcome :: Stasis ( _) => { }
857+ }
850858 let result = tokio:: time:: timeout ( timeout_duration, async {
851859 loop {
852860 interval. tick ( ) . await ;
853- let check_result = proposal
854- . check_payment ( |txid| {
855- self . wallet ( )
856- . get_raw_transaction ( & txid)
857- . map_err ( |e| ImplementationError :: from ( e. into_boxed_dyn_error ( ) ) )
858- } )
859- . save ( persister) ;
860-
861- match check_result {
862- Ok ( _) => {
863- println ! ( "Payjoin transaction detected in the mempool!" ) ;
864- return Ok ( ( ) ) ;
865- }
866- Err ( _) => {
867- // keep polling
868-
869- continue ;
870- }
861+ if let Some ( tx) = get_raw_tx ( payjoin_txid) ? {
862+ proposal. payjoin_tx_exists ( tx) . save ( persister) ?;
863+ println ! ( "Payjoin transaction detected in the mempool!" ) ;
864+ return Ok ( ( ) ) ;
865+ } ;
866+ if get_raw_tx ( fallback_txid) ?. is_some ( ) {
867+ proposal. fallback_tx_exists ( ) . save ( persister) ?;
868+ println ! ( "Fallback transaction detected in the mempool!" ) ;
869+ return Ok ( ( ) ) ;
871870 }
872871 }
873872 } )
0 commit comments