@@ -223,7 +223,7 @@ module Channel =
223223 RemoteNextHTLCId = HTLCId.Zero
224224 OriginChannels = Map.empty
225225 // we will receive their next per-commitment point in the next msg, so we temporarily put a random byte array
226- RemoteNextCommitInfo = DataEncoders.HexEncoder() .DecodeData( " 0101010101010101010101010101010101010101010101010101010101010101" ) |> Key |> fun k -> k.PubKey |> Choice2Of2
226+ RemoteNextCommitInfo = DataEncoders.HexEncoder() .DecodeData( " 0101010101010101010101010101010101010101010101010101010101010101" ) |> Key |> fun k -> k.PubKey |> RemoteNextCommitInfo.Revoked
227227 RemotePerCommitmentSecrets = ShaChain.Zero
228228 ChannelId =
229229 msg.ChannelId }
@@ -316,7 +316,7 @@ module Channel =
316316 LocalNextHTLCId = HTLCId.Zero
317317 RemoteNextHTLCId = HTLCId.Zero
318318 OriginChannels = Map.empty
319- RemoteNextCommitInfo = DataEncoders.HexEncoder() .DecodeData( " 0101010101010101010101010101010101010101010101010101010101010101" ) |> Key |> fun k -> k.PubKey |> Choice2Of2
319+ RemoteNextCommitInfo = DataEncoders.HexEncoder() .DecodeData( " 0101010101010101010101010101010101010101010101010101010101010101" ) |> Key |> fun k -> k.PubKey |> RemoteNextCommitInfo.Revoked
320320 RemotePerCommitmentSecrets = ShaChain.Zero
321321 ChannelId = channelId }
322322 let nextState = { WaitForFundingConfirmedData.Commitments = commitments
@@ -376,7 +376,7 @@ module Channel =
376376 true ,
377377 None)
378378 let nextState = { NormalData.Buried = true
379- Commitments = { state.Commitments with RemoteNextCommitInfo = Choice2Of2 ( msg.NextPerCommitmentPoint) }
379+ Commitments = { state.Commitments with RemoteNextCommitInfo = RemoteNextCommitInfo.Revoked ( msg.NextPerCommitmentPoint) }
380380 ShortChannelId = state.ShortChannelId
381381 ChannelAnnouncement = None
382382 ChannelUpdate = initialChannelUpdate
@@ -388,6 +388,32 @@ module Channel =
388388 [] |> Ok
389389
390390 // ---------- normal operation ---------
391+ | ChannelState.Normal state, GeewalletPayment cmd when state.LocalShutdown.IsSome || state.RemoteShutdown.IsSome ->
392+ sprintf " Could not send geewallet payment %A since shutdown is already in progress." cmd
393+ |> apiMisuse
394+ | ChannelState.Normal state, GeewalletPayment cmd ->
395+ result {
396+ let payment : GeewalletPayment = {
397+ ChannelId = state.Commitments.ChannelId
398+ Amount = cmd.Amount
399+ }
400+ let commitments1 = state.Commitments.AddLocalProposal( payment)
401+
402+ let remoteCommit1 =
403+ match commitments1.RemoteNextCommitInfo with
404+ | RemoteNextCommitInfo.WaitingForRevocation info -> info.NextRemoteCommit
405+ | RemoteNextCommitInfo.Revoked _ info -> commitments1.RemoteCommit
406+ let! reduced = remoteCommit1.Spec.Reduce( commitments1.RemoteChanges.ACKed, commitments1.LocalChanges.Proposed) |> expectTransactionError
407+ do ! Validation.checkOurGeewalletPaymentIsAcceptableWithCurrentSpec reduced commitments1 payment
408+ return [ WeAcceptedCMDGeewalletPayment( payment, commitments1) ]
409+ }
410+ | ChannelState.Normal state, ApplyGeewalletPayment msg ->
411+ result {
412+ let commitments1 = state.Commitments.AddRemoteProposal( msg)
413+ let! reduced = commitments1.LocalCommit.Spec.Reduce ( commitments1.LocalChanges.ACKed, commitments1.RemoteChanges.Proposed) |> expectTransactionError
414+ do ! Validation.checkTheirGeewalletPaymentIsAcceptableWithCurrentSpec reduced commitments1 msg
415+ return [ WeAcceptedGeewalletPayment commitments1 ]
416+ }
391417 | ChannelState.Normal state, AddHTLC cmd when state.LocalShutdown.IsSome || state.RemoteShutdown.IsSome ->
392418 sprintf " Could not add new HTLC %A since shutdown is already in progress." cmd
393419 |> apiMisuse
@@ -409,8 +435,8 @@ module Channel =
409435 // we need to base the next current commitment on the last sig we sent, even if we didn't yet receive their revocation
410436 let remoteCommit1 =
411437 match commitments1.RemoteNextCommitInfo with
412- | Choice1Of2 info -> info.NextRemoteCommit
413- | Choice2Of2 _ info -> commitments1.RemoteCommit
438+ | RemoteNextCommitInfo.WaitingForRevocation info -> info.NextRemoteCommit
439+ | RemoteNextCommitInfo.Revoked _ info -> commitments1.RemoteCommit
414440 let! reduced = remoteCommit1.Spec.Reduce( commitments1.RemoteChanges.ACKed, commitments1.LocalChanges.Proposed) |> expectTransactionError
415441 do ! Validation.checkOurUpdateAddHTLCIsAcceptableWithCurrentSpec reduced commitments1 add
416442 return [ WeAcceptedCMDAddHTLC( add, commitments1) ]
@@ -459,9 +485,9 @@ module Channel =
459485 | _ when ( cm.LocalHasChanges() |> not ) ->
460486 // Ignore SignCommitment Command (nothing to sign)
461487 return []
462- | Choice2Of2 _ ->
488+ | RemoteNextCommitInfo.Revoked _ ->
463489 return ! cm |> Commitments.sendCommit ( cs.Secp256k1Context) ( cs.KeysRepository) ( cs.Network)
464- | Choice1Of2 _ ->
490+ | RemoteNextCommitInfo.WaitingForRevocation _ ->
465491 // Already in the process of signing
466492 return []
467493 }
@@ -472,17 +498,17 @@ module Channel =
472498 | ChannelState.Normal state, ApplyRevokeAndACK msg ->
473499 let cm = state.Commitments
474500 match cm.RemoteNextCommitInfo with
475- | Choice1Of2 _ when ( msg.PerCommitmentSecret.ToPubKey() <> cm.RemoteCommit.RemotePerCommitmentPoint) ->
501+ | RemoteNextCommitInfo.WaitingForRevocation _ when ( msg.PerCommitmentSecret.ToPubKey() <> cm.RemoteCommit.RemotePerCommitmentPoint) ->
476502 let errorMsg = sprintf " Invalid revoke_and_ack %A ; must be %A " msg.PerCommitmentSecret cm.RemoteCommit.RemotePerCommitmentPoint
477503 invalidRevokeAndACK msg errorMsg
478- | Choice2Of2 _ ->
504+ | RemoteNextCommitInfo.Revoked _ ->
479505 let errorMsg = sprintf " Unexpected revocation"
480506 invalidRevokeAndACK msg errorMsg
481- | Choice1Of2 ({ NextRemoteCommit = theirNextCommit }) ->
507+ | RemoteNextCommitInfo.WaitingForRevocation ({ NextRemoteCommit = theirNextCommit }) ->
482508 let commitments1 = { cm with LocalChanges = { cm.LocalChanges with Signed = []; ACKed = cm.LocalChanges.ACKed @ cm.LocalChanges.Signed }
483509 RemoteChanges = { cm.RemoteChanges with Signed = [] }
484510 RemoteCommit = theirNextCommit
485- RemoteNextCommitInfo = Choice2Of2 ( msg.NextPerCommitmentPoint)
511+ RemoteNextCommitInfo = RemoteNextCommitInfo.Revoked ( msg.NextPerCommitmentPoint)
486512 RemotePerCommitmentSecrets = cm.RemotePerCommitmentSecrets.AddHash ( msg.PerCommitmentSecret.ToByteArray(), 0xffffffffffff UL - cm.RemoteCommit.Index) }
487513 let result = [ WeAcceptedRevokeAndACK( commitments1) ]
488514 result |> Ok
@@ -528,12 +554,12 @@ module Channel =
528554 // Are we in the middle of a signature?
529555 match cm.RemoteNextCommitInfo with
530556 // yes.
531- | Choice1Of2 waitingForRevocation ->
557+ | RemoteNextCommitInfo.WaitingForRevocation waitingForRevocation ->
532558 let nextCommitments = { state.Commitments with
533- RemoteNextCommitInfo = Choice1Of2 ({ waitingForRevocation with ReSignASAP = true }) }
559+ RemoteNextCommitInfo = RemoteNextCommitInfo.WaitingForRevocation ({ waitingForRevocation with ReSignASAP = true }) }
534560 return [ AcceptedShutdownWhileWeHaveUnsignedOutgoingHTLCs( msg, nextCommitments) ]
535561 // No. let's sign right away.
536- | Choice2Of2 _ ->
562+ | RemoteNextCommitInfo.Revoked _ ->
537563 return [ ChannelStateRequestedSignCommitment; AcceptedShutdownWhileWeHaveUnsignedOutgoingHTLCs( msg, cm) ]
538564 else
539565 let ( localShutdown , sendList ) = match state.LocalShutdown with
@@ -600,9 +626,9 @@ module Channel =
600626 | _ when ( not <| cm.LocalHasChanges()) ->
601627 // nothing to sign
602628 [] |> Ok
603- | Choice2Of2 _ ->
629+ | RemoteNextCommitInfo.Revoked _ ->
604630 cm |> Commitments.sendCommit ( cs.Secp256k1Context) ( cs.KeysRepository) ( cs.Network)
605- | Choice1Of2 _ waitForRevocation ->
631+ | RemoteNextCommitInfo.WaitingForRevocation _ waitForRevocation ->
606632 // Already in the process of signing.
607633 [] |> Ok
608634 | Shutdown state, ApplyCommitmentSigned msg ->
@@ -730,8 +756,12 @@ module Channel =
730756 { c with State = ChannelState.Normal data }
731757
732758 // ----- normal operation --------
759+ | WeAcceptedCMDGeewalletPayment(_, newCommitments), ChannelState.Normal d ->
760+ { c with State = ChannelState.Normal({ d with Commitments = newCommitments }) }
733761 | WeAcceptedCMDAddHTLC(_, newCommitments), ChannelState.Normal d ->
734762 { c with State = ChannelState.Normal({ d with Commitments = newCommitments }) }
763+ | WeAcceptedGeewalletPayment( newCommitments), ChannelState.Normal d ->
764+ { c with State = ChannelState.Normal({ d with Commitments = newCommitments }) }
735765 | WeAcceptedUpdateAddHTLC( newCommitments), ChannelState.Normal d ->
736766 { c with State = ChannelState.Normal({ d with Commitments = newCommitments }) }
737767
0 commit comments