Skip to content

Commit 7f242df

Browse files
committed
Mono-hop unidirectional payments
1 parent 7e6537f commit 7f242df

File tree

15 files changed

+288
-31
lines changed

15 files changed

+288
-31
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,12 @@ jobs:
2121
- name: Run Infrastructure tests on BouncyCastle
2222
run: |
2323
dotnet test tests/DotNetLightning.Infrastructure.Tests -p:BouncyCastle=True
24-
- name: Restore NSec and Secp256k1.Net
25-
run: git checkout src/NSec src/Secp256k1.Net
26-
- name: Clean to prepare for NSec build
27-
run: |
28-
dotnet clean
29-
- name: Run tests
30-
run: |
31-
dotnet test
32-
- name: Package NSec build
33-
run: |
34-
cd $GITHUB_WORKSPACE/src/DotNetLightning.Core
35-
dotnet pack -p:Configuration=Release -p:Version=1.1.0-date`date +%Y%m%d-%H%M`.git-`echo $GITHUB_SHA | cut -c 1-7`
36-
- name: Upload nuget packages (BouncyCastle and native)
24+
- name: Upload BouncyCastle nuget package
3725
run: |
3826
cd $GITHUB_WORKSPACE/src/DotNetLightning.Core
39-
if [ ${{ secrets.NUGET_API_KEY }} ] && [ $GITHUB_REF == "refs/heads/master" ]; then
40-
dotnet nuget push ./bin/Release/DotNetLightning.1*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json
41-
dotnet nuget push ./bin/Release/DotNetLightning.Core.1*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json
27+
# NOTE:
28+
# the geewallet-payments branch reference here can be removed once this
29+
# is merged to master
30+
if [ ${{ secrets.NUGET_API_KEY }} ] && [ $GITHUB_REF == "refs/heads/master" -o $GITHUB_REF == "refs/heads/geewallet-payments" ]; then
31+
dotnet nuget push ./bin/Release/DotNetLightning.Kiss.1*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json
4232
fi

src/DotNetLightning.Core/Channel/Channel.fs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,32 @@ module Channel =
388388
[] |> Ok
389389

390390
// ---------- normal operation ---------
391+
| ChannelState.Normal state, MonoHopUnidirectionalPayment cmd when state.LocalShutdown.IsSome || state.RemoteShutdown.IsSome ->
392+
sprintf "Could not send mono-hop unidirectional payment %A since shutdown is already in progress." cmd
393+
|> apiMisuse
394+
| ChannelState.Normal state, MonoHopUnidirectionalPayment cmd ->
395+
result {
396+
let payment: MonoHopUnidirectionalPayment = {
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.Waiting 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.checkOurMonoHopUnidirectionalPaymentIsAcceptableWithCurrentSpec reduced commitments1 payment
408+
return [ WeAcceptedCMDMonoHopUnidirectionalPayment(payment, commitments1) ]
409+
}
410+
| ChannelState.Normal state, ApplyMonoHopUnidirectionalPayment 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.checkTheirMonoHopUnidirectionalPaymentIsAcceptableWithCurrentSpec reduced commitments1 msg
415+
return [ WeAcceptedMonoHopUnidirectionalPayment 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
@@ -484,10 +510,9 @@ module Channel =
484510
RemoteCommit = theirNextCommit
485511
RemoteNextCommitInfo = RemoteNextCommitInfo.Revoked(msg.NextPerCommitmentPoint)
486512
RemotePerCommitmentSecrets = cm.RemotePerCommitmentSecrets.AddHash (msg.PerCommitmentSecret.ToByteArray(), 0xffffffffffffUL - cm.RemoteCommit.Index) }
513+
Console.WriteLine("WARNING: revocation is not implemented yet")
487514
let result = [ WeAcceptedRevokeAndACK(commitments1) ]
488515
result |> Ok
489-
failwith "needs update"
490-
491516

492517
| ChannelState.Normal state, ChannelCommand.Close cmd ->
493518
let localSPK = cmd.ScriptPubKey |> Option.defaultValue (state.Commitments.LocalParams.DefaultFinalScriptPubKey)
@@ -730,8 +755,12 @@ module Channel =
730755
{ c with State = ChannelState.Normal data }
731756

732757
// ----- normal operation --------
758+
| WeAcceptedCMDMonoHopUnidirectionalPayment(_, newCommitments), ChannelState.Normal normalData ->
759+
{ c with State = ChannelState.Normal({ normalData with Commitments = newCommitments }) }
733760
| WeAcceptedCMDAddHTLC(_, newCommitments), ChannelState.Normal d ->
734761
{ c with State = ChannelState.Normal({ d with Commitments = newCommitments }) }
762+
| WeAcceptedMonoHopUnidirectionalPayment(newCommitments), ChannelState.Normal normalData ->
763+
{ c with State = ChannelState.Normal({ normalData with Commitments = newCommitments }) }
735764
| WeAcceptedUpdateAddHTLC(newCommitments), ChannelState.Normal d ->
736765
{ c with State = ChannelState.Normal({ d with Commitments = newCommitments }) }
737766

src/DotNetLightning.Core/Channel/ChannelCommands.fs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ open NBitcoin
2121
// Y88b d88P Y88b. .d88P 888 " 888 888 " 888 d8888888888 888 Y8888 888 .d88P Y88b d88P
2222
// "Y8888P" "Y88888P" 888 888 888 888 d88P 888 888 Y888 8888888P" "Y8888P"
2323

24+
type CMDMonoHopUnidirectionalPayment = {
25+
Amount: LNMoney
26+
}
27+
2428
type CMDAddHTLC = {
2529
AmountMSat: LNMoney
2630
PaymentHash: PaymentHash
@@ -206,6 +210,8 @@ type ChannelCommand =
206210
| CreateChannelReestablish
207211

208212
// normal
213+
| MonoHopUnidirectionalPayment of CMDMonoHopUnidirectionalPayment
214+
| ApplyMonoHopUnidirectionalPayment of msg: MonoHopUnidirectionalPayment
209215
| AddHTLC of CMDAddHTLC
210216
| ApplyUpdateAddHTLC of msg: UpdateAddHTLC * currentHeight: BlockHeight
211217
| FulfillHTLC of CMDFulfillHTLC
@@ -229,4 +235,4 @@ type ChannelCommand =
229235
// else
230236
| ForceClose
231237
| GetState
232-
| GetStateData
238+
| GetStateData

src/DotNetLightning.Core/Channel/ChannelError.fs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type ChannelError =
3636
// --- case they sent unacceptable msg ---
3737
| InvalidOpenChannel of InvalidOpenChannelError
3838
| InvalidAcceptChannel of InvalidAcceptChannelError
39+
| InvalidMonoHopUnidirectionalPayment of InvalidMonoHopUnidirectionalPaymentError
3940
| InvalidUpdateAddHTLC of InvalidUpdateAddHTLCError
4041
| InvalidRevokeAndACK of InvalidRevokeAndACKError
4142
| InvalidUpdateFee of InvalidUpdateFeeError
@@ -69,6 +70,7 @@ type ChannelError =
6970
| TheyCannotAffordFee (_, _, _) -> Close
7071
| InvalidOpenChannel _ -> DistrustPeer
7172
| InvalidAcceptChannel _ -> DistrustPeer
73+
| InvalidMonoHopUnidirectionalPayment _ -> Close
7274
| InvalidUpdateAddHTLC _ -> Close
7375
| InvalidRevokeAndACK _ -> Close
7476
| InvalidUpdateFee _ -> Close
@@ -145,6 +147,15 @@ and InvalidAcceptChannelError = {
145147
Errors = e
146148
}
147149

150+
and InvalidMonoHopUnidirectionalPaymentError = {
151+
Msg: MonoHopUnidirectionalPayment
152+
Errors: string list
153+
}
154+
with
155+
static member Create msg e = {
156+
Msg = msg
157+
Errors = e
158+
}
148159
and InvalidUpdateAddHTLCError = {
149160
Msg: UpdateAddHTLC
150161
Errors: string list
@@ -458,6 +469,22 @@ module internal AcceptChannelMsgValidation =
458469

459470
(check1 |> Validation.ofResult) *^> check2 *^> check3 *^> check4 *^> check5 *^> check6 *^> check7
460471

472+
module UpdateMonoHopUnidirectionalPaymentWithContext =
473+
let internal checkWeHaveSufficientFunds (state: Commitments) (currentSpec) =
474+
let fees =
475+
if state.LocalParams.IsFunder then
476+
Transactions.commitTxFee (state.RemoteParams.DustLimitSatoshis) currentSpec
477+
else
478+
Money.Zero
479+
let missing = currentSpec.ToRemote.ToMoney() - state.RemoteParams.ChannelReserveSatoshis - fees
480+
if missing < Money.Zero then
481+
sprintf "We don't have sufficient funds to send mono-hop unidirectional payment. current to_remote amount is: %A. Remote Channel Reserve is: %A. and fee is %A"
482+
(currentSpec.ToRemote.ToMoney())
483+
state.RemoteParams.ChannelReserveSatoshis
484+
fees
485+
|> Error
486+
else
487+
Ok()
461488

462489
module UpdateAddHTLCValidation =
463490
let internal checkExpiryIsNotPast (current: BlockHeight) (expiry) =
@@ -472,7 +499,23 @@ module UpdateAddHTLCValidation =
472499
let internal checkAmountIsLargerThanMinimum (htlcMinimum: LNMoney) (amount) =
473500
check (amount) (<) (htlcMinimum) "htlc value (%A) is too small. must be greater or equal to %A"
474501

475-
502+
module internal MonoHopUnidirectionalPaymentValidationWithContext =
503+
let checkWeHaveSufficientFunds (state: Commitments) (currentSpec) =
504+
let fees =
505+
if state.LocalParams.IsFunder then
506+
Transactions.commitTxFee state.RemoteParams.DustLimitSatoshis currentSpec
507+
else
508+
Money.Zero
509+
let missing = currentSpec.ToRemote.ToMoney() - state.RemoteParams.ChannelReserveSatoshis - fees
510+
if missing < Money.Zero then
511+
sprintf "We don't have sufficient funds to send mono-hop unidirectional payment. current to_remote amount is: %A. Remote Channel Reserve is: %A. and fee is %A"
512+
(currentSpec.ToRemote.ToMoney())
513+
state.RemoteParams.ChannelReserveSatoshis
514+
fees
515+
|> Error
516+
else
517+
Ok()
518+
476519
module internal UpdateAddHTLCValidationWithContext =
477520
let checkLessThanHTLCValueInFlightLimit (currentSpec: CommitmentSpec) (limit) (add: UpdateAddHTLC) =
478521
let htlcValueInFlight = currentSpec.HTLCs |> Map.toSeq |> Seq.sumBy (fun (_, v) -> v.Add.AmountMSat)

src/DotNetLightning.Core/Channel/ChannelTypes.fs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ type ChannelEvent =
264264
| BothFundingLocked of nextState: Data.NormalData
265265

266266
// -------- normal operation ------
267+
| WeAcceptedCMDMonoHopUnidirectionalPayment of msg: MonoHopUnidirectionalPayment * newCommitments: Commitments
268+
| WeAcceptedMonoHopUnidirectionalPayment of newCommitments: Commitments
269+
267270
| WeAcceptedCMDAddHTLC of msg: UpdateAddHTLC * newCommitments: Commitments
268271
| WeAcceptedUpdateAddHTLC of newCommitments: Commitments
269272

@@ -355,6 +358,26 @@ type ChannelState =
355358
(fun v cc -> match cc with
356359
| Normal _ -> Normal v
357360
| _ -> cc )
361+
member this.ChannelId: Option<ChannelId> =
362+
match this with
363+
| WaitForInitInternal
364+
| WaitForOpenChannel _
365+
| WaitForAcceptChannel _
366+
| WaitForFundingCreated _ -> None
367+
| WaitForFundingSigned data -> Some data.ChannelId
368+
| WaitForFundingConfirmed data -> Some data.ChannelId
369+
| WaitForFundingLocked data -> Some data.ChannelId
370+
| Normal data -> Some data.ChannelId
371+
| Shutdown data -> Some data.ChannelId
372+
| Negotiating data -> Some data.ChannelId
373+
| Closing data -> Some data.ChannelId
374+
| Closed _
375+
| Offline _
376+
| Syncing _
377+
| ErrFundingLost _
378+
| ErrFundingTimeOut _
379+
| ErrInformationLeak _ -> None
380+
358381
member this.Phase =
359382
match this with
360383
| WaitForInitInternal

src/DotNetLightning.Core/Channel/ChannelValidation.fs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,13 @@ module internal Validation =
169169
*> AcceptChannelMsgValidation.checkConfigPermits conf.PeerChannelConfigLimits msg
170170
|> Result.mapError(InvalidAcceptChannelError.Create msg >> InvalidAcceptChannel)
171171

172+
let checkOurMonoHopUnidirectionalPaymentIsAcceptableWithCurrentSpec (currentSpec) (state: Commitments) (payment: MonoHopUnidirectionalPayment) =
173+
Validation.ofResult(MonoHopUnidirectionalPaymentValidationWithContext.checkWeHaveSufficientFunds state currentSpec)
174+
|> Result.mapError(InvalidMonoHopUnidirectionalPaymentError.Create payment >> InvalidMonoHopUnidirectionalPayment)
175+
176+
let checkTheirMonoHopUnidirectionalPaymentIsAcceptableWithCurrentSpec (currentSpec) (state: Commitments) (payment: MonoHopUnidirectionalPayment) =
177+
Validation.ofResult(MonoHopUnidirectionalPaymentValidationWithContext.checkWeHaveSufficientFunds state currentSpec)
178+
|> Result.mapError(InvalidMonoHopUnidirectionalPaymentError.Create payment >> InvalidMonoHopUnidirectionalPayment)
172179

173180
let checkCMDAddHTLC (state: NormalData) (cmd: CMDAddHTLC) =
174181
Validation.ofResult(UpdateAddHTLCValidation.checkExpiryIsNotPast cmd.CurrentHeight cmd.Expiry)

src/DotNetLightning.Core/Crypto/ShaChain.fs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
namespace DotNetLightning.Crypto
22

3+
open System
4+
35
type Node = {
46
Value: byte[]
57
Height: int32
@@ -16,8 +18,9 @@ module ShaChain =
1618
let flip (_input: byte[]) (_index: uint64): byte[] =
1719
failwith "Not implemented: ShaChain::flip"
1820

19-
let addHash (_receiver: ShaChain) (_hash: byte[]) (_index: uint64) =
20-
failwith "Not implemented: ShaChain::addHash"
21+
let addHash (receiver: ShaChain) (_hash: byte[]) (_index: uint64) =
22+
Console.WriteLine("WARNING: Not implemented: ShaChain::addHash")
23+
receiver
2124

2225
let getHash (_receiver: ShaChain)(_index: uint64) =
2326
failwith "Not implemented: ShaChain::getHash"

src/DotNetLightning.Core/DotNetLightning.Core.fsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<When Condition="'$(BouncyCastle)'=='true'">
88
<PropertyGroup>
99
<OtherFlags>$(OtherFlags) -d:BouncyCastle</OtherFlags>
10-
<PackageId>DotNetLightning</PackageId>
10+
<PackageId>DotNetLightning.Kiss</PackageId>
1111
</PropertyGroup>
1212
</When>
1313
<Otherwise>

src/DotNetLightning.Core/Serialize/Features.fs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ type FeatureBit private (bitArray) =
181181
bytes <- this.BitArray.ToByteArray()
182182
bytes
183183
and set(v: byte[]) = bytes <- v
184+
new() =
185+
FeatureBit(
186+
let b: bool array = [||]
187+
BitArray(b)
188+
)
184189
static member TryCreate(ba: BitArray) =
185190
result {
186191
do! Feature.validateFeatureGraph(ba)
@@ -192,9 +197,7 @@ type FeatureBit private (bitArray) =
192197
else
193198
return (FeatureBit(ba))
194199
}
195-
static member Zero =
196-
let b: bool array = [||]
197-
b |> BitArray |> FeatureBit
200+
static member Zero = FeatureBit()
198201
static member TryCreate(bytes: byte[]) =
199202
result {
200203
let! fb = FeatureBit.TryCreate(BitArray.FromBytes(bytes))

src/DotNetLightning.Core/Serialize/Msgs/Msgs.fs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ module internal TypeFlag =
8282
let ReplyChannelRange = 264us
8383
[<Literal>]
8484
let GossipTimestampFilter = 265us
85+
[<Literal>]
86+
let MonoHopUnidirectionalPayment = 42198us
8587

8688
type ILightningMsg = interface end
8789
type ISetupMsg = inherit ILightningMsg
@@ -173,6 +175,8 @@ module ILightningSerializable =
173175
deserialize<ReplyChannelRange>(ls) :> ILightningMsg
174176
| TypeFlag.GossipTimestampFilter ->
175177
deserialize<GossipTimestampFilter>(ls) :> ILightningMsg
178+
| TypeFlag.MonoHopUnidirectionalPayment ->
179+
deserialize<MonoHopUnidirectionalPayment>(ls) :> ILightningMsg
176180
| x ->
177181
raise <| FormatException(sprintf "Unknown message type %d" x)
178182
let serializeWithFlags (ls: LightningWriterStream) (data: ILightningMsg) =
@@ -261,6 +265,9 @@ module ILightningSerializable =
261265
| :? GossipTimestampFilter as d ->
262266
ls.Write(TypeFlag.GossipTimestampFilter, false)
263267
(d :> ILightningSerializable<GossipTimestampFilter>).Serialize(ls)
268+
| :? MonoHopUnidirectionalPayment as d ->
269+
ls.Write(TypeFlag.MonoHopUnidirectionalPayment, false)
270+
(d :> ILightningSerializable<MonoHopUnidirectionalPayment>).Serialize(ls)
264271
| x -> failwithf "%A is not known lightning message. This should never happen" x
265272

266273
module LightningMsg =
@@ -1477,3 +1484,19 @@ type GossipTimestampFilter = {
14771484
ls.Write(this.FirstTimestamp, false)
14781485
ls.Write(this.TimestampRange, false)
14791486

1487+
[<CLIMutable>]
1488+
type MonoHopUnidirectionalPayment = {
1489+
mutable ChannelId: ChannelId
1490+
mutable Amount: LNMoney
1491+
}
1492+
with
1493+
interface IHTLCMsg
1494+
interface IUpdateMsg
1495+
interface ILightningSerializable<MonoHopUnidirectionalPayment> with
1496+
member this.Deserialize(ls) =
1497+
this.ChannelId <- ls.ReadUInt256(true) |> ChannelId
1498+
this.Amount <- ls.ReadUInt64(false) |> LNMoney.MilliSatoshis
1499+
member this.Serialize(ls) =
1500+
ls.Write(this.ChannelId.Value.ToBytes())
1501+
ls.Write(this.Amount.MilliSatoshi, false)
1502+

src/DotNetLightning.Core/Transactions/CommitmentSpec.fs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ type CommitmentSpec = {
5252
member this.TotalFunds =
5353
this.ToLocal + this.ToRemote + (this.HTLCs |> Seq.sumBy(fun h -> h.Value.Add.AmountMSat))
5454

55+
member internal this.MonoHopUnidirectionalPayment(direction: Direction, update: MonoHopUnidirectionalPayment) =
56+
match direction with
57+
| Out -> { this with ToLocal = this.ToLocal - update.Amount; ToRemote = this.ToRemote + update.Amount }
58+
| In -> { this with ToLocal = this.ToLocal + update.Amount; ToRemote = this.ToRemote - update.Amount }
59+
5560
member internal this.AddHTLC(direction: Direction, update: UpdateAddHTLC) =
5661
let htlc = { DirectedHTLC.Direction = direction; Add = update }
5762
match direction with
@@ -81,14 +86,32 @@ type CommitmentSpec = {
8186
UnknownHTLC htlcId |> Error
8287

8388
member internal this.Reduce(localChanges: #IUpdateMsg list, remoteChanges: #IUpdateMsg list) =
89+
let specMonoHopUnidirectionalPaymentLocal =
90+
localChanges
91+
|> List.fold(fun (acc: CommitmentSpec) updateMsg ->
92+
match box updateMsg with
93+
| :? MonoHopUnidirectionalPayment as u -> acc.MonoHopUnidirectionalPayment(Out, u)
94+
| _ -> acc
95+
)
96+
this
97+
98+
let specMonoHopUnidirectionalPaymentRemote =
99+
remoteChanges
100+
|> List.fold(fun (acc: CommitmentSpec) updateMsg ->
101+
match box updateMsg with
102+
| :? MonoHopUnidirectionalPayment as u -> acc.MonoHopUnidirectionalPayment(In, u)
103+
| _ -> acc
104+
)
105+
specMonoHopUnidirectionalPaymentLocal
106+
84107
let spec1 =
85108
localChanges
86109
|> List.fold(fun (acc: CommitmentSpec) updateMsg ->
87110
match box updateMsg with
88111
| :? UpdateAddHTLC as u -> acc.AddHTLC(Out, u)
89112
| _ -> acc
90113
)
91-
this
114+
specMonoHopUnidirectionalPaymentRemote
92115

93116
let spec2 =
94117
remoteChanges

src/DotNetLightning.Infrastructure/ActorManagers/ChannelManager.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ type ChannelManager(log: ILogger<ChannelManager>,
202202
return! (this.Actors.[e.NodeId.Value] :> IActor<_>).Put(ChannelCommand.RemoteShutdown m)
203203
| :? ClosingSigned as m ->
204204
return! (this.Actors.[e.NodeId.Value] :> IActor<_>).Put(ChannelCommand.ApplyClosingSigned m)
205+
| :? MonoHopUnidirectionalPayment as m ->
206+
return! (this.Actors.[e.NodeId.Value] :> IActor<_>).Put(ChannelCommand.ApplyMonoHopUnidirectionalPayment m)
205207
| :? UpdateAddHTLC as m ->
206208
return! (this.Actors.[e.NodeId.Value] :> IActor<_>).Put(ChannelCommand.ApplyUpdateAddHTLC (m, this.CurrentBlockHeight))
207209
| :? UpdateFulfillHTLC as m ->

0 commit comments

Comments
 (0)