@@ -119,6 +119,43 @@ module Channel =
119
119
}
120
120
[ WeSentChannelReestablish ourChannelReestablish ] |> Ok
121
121
122
+ let getSpendableBalance ( cs : Channel ): Option < Money > =
123
+ match cs.State.Commitments with
124
+ | None -> None
125
+ | Some commitments ->
126
+ let remoteCommit =
127
+ match commitments.RemoteNextCommitInfo with
128
+ | RemoteNextCommitInfo.Waiting info -> info.NextRemoteCommit
129
+ | RemoteNextCommitInfo.Revoked _ info -> commitments.RemoteCommit
130
+ let reducedRes =
131
+ remoteCommit.Spec.Reduce(
132
+ commitments.RemoteChanges.ACKed,
133
+ commitments.LocalChanges.Proposed
134
+ )
135
+ let reduced =
136
+ match reducedRes with
137
+ | Error err ->
138
+ failwithf
139
+ " reducing commit failed even though we have not proposed any changes\
140
+ error: %A "
141
+ err
142
+ | Ok reduced -> reduced
143
+ let dustLimit = commitments.RemoteParams.DustLimitSatoshis
144
+ let fees =
145
+ if commitments.LocalParams.IsFunder then
146
+ Transactions.commitTxFee dustLimit reduced
147
+ else
148
+ Money.Zero
149
+ let channelReserve = commitments.RemoteParams.ChannelReserveSatoshis
150
+ let totalBalance = reduced.ToRemote.ToMoney()
151
+ let untrimmedSpendableBalance = totalBalance - channelReserve - fees
152
+ let htlcSuccessFee = reduced.FeeRatePerKw.ToFee( Transactions.Constants.HTLC_ SUCCESS_ WEIGHT)
153
+ let htlcFee = reduced.FeeRatePerKw.ToFee( Transactions.Constants.COMMITMENT_ TX_ WEIGHT_ PER_ HTLC)
154
+ let untrimmedMax = Money.Min( untrimmedSpendableBalance, htlcSuccessFee + dustLimit)
155
+ let trimmedSpendableBalance = untrimmedSpendableBalance - htlcFee
156
+ let spendableBalance = Money.Max( untrimmedMax, trimmedSpendableBalance)
157
+ Some spendableBalance
158
+
122
159
let executeCommand ( cs : Channel ) ( command : ChannelCommand ): Result < ChannelEvent list , ChannelError > =
123
160
match cs.State, command with
124
161
0 commit comments