@@ -102,33 +102,33 @@ impl ChannelOrderState {
102102
103103 /// Transition: ExpectingPayment -> OrderPaid
104104 ///
105- /// Updates the specified payment method's state to PAID .
105+ /// Updates the specified payment method's state to HOLD .
106106 pub ( super ) fn payment_received (
107107 & mut self , method : PaymentMethod ,
108108 ) -> Result < ( ) , ChannelOrderStateError > {
109109 match self {
110110 ChannelOrderState :: ExpectingPayment { payment_details } => {
111- // Update the payment state for the specified method
111+ // Update the payment state for the specified method to HOLD
112112 let method_exists = match method {
113113 PaymentMethod :: Bolt11 => {
114114 if let Some ( ref mut bolt11) = payment_details. bolt11 {
115- bolt11. state = LSPS1PaymentState :: Paid ;
115+ bolt11. state = LSPS1PaymentState :: Hold ;
116116 true
117117 } else {
118118 false
119119 }
120120 } ,
121121 PaymentMethod :: Bolt12 => {
122122 if let Some ( ref mut bolt12) = payment_details. bolt12 {
123- bolt12. state = LSPS1PaymentState :: Paid ;
123+ bolt12. state = LSPS1PaymentState :: Hold ;
124124 true
125125 } else {
126126 false
127127 }
128128 } ,
129129 PaymentMethod :: Onchain => {
130130 if let Some ( ref mut onchain) = payment_details. onchain {
131- onchain. state = LSPS1PaymentState :: Paid ;
131+ onchain. state = LSPS1PaymentState :: Hold ;
132132 true
133133 } else {
134134 false
@@ -152,13 +152,33 @@ impl ChannelOrderState {
152152 }
153153
154154 /// Transition: OrderPaid -> CompletedAndChannelOpened
155+ ///
156+ /// Updates payment states from HOLD to PAID.
155157 pub ( super ) fn channel_opened (
156158 & mut self , channel_info : LSPS1ChannelInfo ,
157159 ) -> Result < ( ) , ChannelOrderStateError > {
158160 match self {
159161 ChannelOrderState :: OrderPaid { payment_details } => {
162+ // Update payment states from HOLD to PAID
163+ let mut paid_details = payment_details. clone ( ) ;
164+ if let Some ( ref mut bolt11) = paid_details. bolt11 {
165+ if bolt11. state == LSPS1PaymentState :: Hold {
166+ bolt11. state = LSPS1PaymentState :: Paid ;
167+ }
168+ }
169+ if let Some ( ref mut bolt12) = paid_details. bolt12 {
170+ if bolt12. state == LSPS1PaymentState :: Hold {
171+ bolt12. state = LSPS1PaymentState :: Paid ;
172+ }
173+ }
174+ if let Some ( ref mut onchain) = paid_details. onchain {
175+ if onchain. state == LSPS1PaymentState :: Hold {
176+ onchain. state = LSPS1PaymentState :: Paid ;
177+ }
178+ }
179+
160180 * self = ChannelOrderState :: CompletedAndChannelOpened {
161- payment_details : payment_details . clone ( ) ,
181+ payment_details : paid_details ,
162182 channel_info,
163183 } ;
164184 Ok ( ( ) )
@@ -276,7 +296,7 @@ impl PeerState {
276296
277297 /// Transition: ExpectingPayment -> OrderPaid
278298 ///
279- /// Updates the specified payment method's state to PAID .
299+ /// Updates the specified payment method's state to HOLD .
280300 pub ( super ) fn order_payment_received (
281301 & mut self , order_id : & LSPS1OrderId , method : PaymentMethod ,
282302 ) -> Result < ( ) , PeerStateError > {
@@ -530,7 +550,8 @@ mod tests {
530550
531551 assert ! ( matches!( state, ChannelOrderState :: OrderPaid { .. } ) ) ;
532552 assert_eq ! ( state. order_state( ) , LSPS1OrderState :: Created ) ;
533- assert_eq ! ( state. payment_details( ) . bolt11. as_ref( ) . unwrap( ) . state, LSPS1PaymentState :: Paid ) ;
553+ // Payment state should be HOLD (not PAID) until channel is opened
554+ assert_eq ! ( state. payment_details( ) . bolt11. as_ref( ) . unwrap( ) . state, LSPS1PaymentState :: Hold ) ;
534555 }
535556
536557 // Test valid transition: ExpectingPayment -> OrderPaid via payment_received (Onchain)
@@ -542,9 +563,10 @@ mod tests {
542563 state. payment_received ( PaymentMethod :: Onchain ) . unwrap ( ) ;
543564
544565 assert ! ( matches!( state, ChannelOrderState :: OrderPaid { .. } ) ) ;
566+ // Payment state should be HOLD (not PAID) until channel is opened
545567 assert_eq ! (
546568 state. payment_details( ) . onchain. as_ref( ) . unwrap( ) . state,
547- LSPS1PaymentState :: Paid
569+ LSPS1PaymentState :: Hold
548570 ) ;
549571 }
550572
@@ -555,12 +577,17 @@ mod tests {
555577 let mut state = ChannelOrderState :: new ( payment_info) ;
556578 state. payment_received ( PaymentMethod :: Bolt11 ) . unwrap ( ) ;
557579
580+ // Verify payment state is HOLD before channel opens
581+ assert_eq ! ( state. payment_details( ) . bolt11. as_ref( ) . unwrap( ) . state, LSPS1PaymentState :: Hold ) ;
582+
558583 let channel_info = create_test_channel_info ( ) ;
559584 state. channel_opened ( channel_info. clone ( ) ) . unwrap ( ) ;
560585
561586 assert ! ( matches!( state, ChannelOrderState :: CompletedAndChannelOpened { .. } ) ) ;
562587 assert_eq ! ( state. order_state( ) , LSPS1OrderState :: Completed ) ;
563588 assert_eq ! ( state. channel_info( ) , Some ( & channel_info) ) ;
589+ // Payment state should now be PAID after channel is opened
590+ assert_eq ! ( state. payment_details( ) . bolt11. as_ref( ) . unwrap( ) . state, LSPS1PaymentState :: Paid ) ;
564591 }
565592
566593 // Test valid transition: ExpectingPayment -> FailedAndRefunded
@@ -586,10 +613,14 @@ mod tests {
586613 let mut state = ChannelOrderState :: new ( payment_info) ;
587614 state. payment_received ( PaymentMethod :: Bolt11 ) . unwrap ( ) ;
588615
616+ // Verify payment state is HOLD before failure
617+ assert_eq ! ( state. payment_details( ) . bolt11. as_ref( ) . unwrap( ) . state, LSPS1PaymentState :: Hold ) ;
618+
589619 state. mark_failed_and_refunded ( ) . unwrap ( ) ;
590620
591621 assert ! ( matches!( state, ChannelOrderState :: FailedAndRefunded { .. } ) ) ;
592622 assert_eq ! ( state. order_state( ) , LSPS1OrderState :: Failed ) ;
623+ // Payment state should now be REFUNDED
593624 assert_eq ! (
594625 state. payment_details( ) . bolt11. as_ref( ) . unwrap( ) . state,
595626 LSPS1PaymentState :: Refunded
0 commit comments