|
|
|
package liquidity
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/btcsuite/btcutil"
|
|
|
|
"github.com/lightninglabs/loop"
|
|
|
|
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
|
|
|
"github.com/lightningnetwork/lnd/lnwire"
|
|
|
|
)
|
|
|
|
|
|
|
|
// FeeLimit is an interface implemented by different strategies for limiting
|
|
|
|
// the fees we pay for autoloops.
|
|
|
|
type FeeLimit interface {
|
|
|
|
// String returns the string representation of fee limits.
|
|
|
|
String() string
|
|
|
|
|
|
|
|
// validate returns an error if the values provided are invalid.
|
|
|
|
validate() error
|
|
|
|
|
|
|
|
// mayLoopOut checks whether we may dispatch a loop out swap based on
|
|
|
|
// the current fee conditions.
|
|
|
|
mayLoopOut(estimate chainfee.SatPerKWeight) error
|
|
|
|
|
|
|
|
// loopOutLimits checks whether the quote provided is within our fee
|
|
|
|
// limits for the swap amount.
|
|
|
|
loopOutLimits(amount btcutil.Amount, quote *loop.LoopOutQuote) error
|
|
|
|
|
|
|
|
// loopOutFees return the maximum prepay and invoice routing fees for
|
|
|
|
// a swap amount and quote.
|
|
|
|
loopOutFees(amount btcutil.Amount, quote *loop.LoopOutQuote) (
|
|
|
|
btcutil.Amount, btcutil.Amount, btcutil.Amount)
|
|
|
|
}
|
|
|
|
|
|
|
|
// swapSuggestion is an interface implemented by suggested swaps for our
|
|
|
|
// different swap types. This interface is used to allow us to handle different
|
|
|
|
// swap types with the same autoloop logic.
|
|
|
|
type swapSuggestion interface {
|
|
|
|
// fees returns the highest possible fee amount we could pay for a swap
|
|
|
|
// in satoshis.
|
|
|
|
fees() btcutil.Amount
|
|
|
|
|
|
|
|
// amount returns the swap amount in satoshis.
|
|
|
|
amount() btcutil.Amount
|
|
|
|
|
|
|
|
// channels returns the set of channels involved in the swap.
|
|
|
|
channels() []lnwire.ShortChannelID
|
|
|
|
}
|
|
|
|
|
|
|
|
type loopOutSwapSuggestion struct {
|
|
|
|
loop.OutRequest
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *loopOutSwapSuggestion) amount() btcutil.Amount {
|
|
|
|
return l.Amount
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *loopOutSwapSuggestion) fees() btcutil.Amount {
|
|
|
|
return worstCaseOutFees(
|
|
|
|
l.MaxPrepayRoutingFee, l.MaxSwapRoutingFee, l.MaxSwapFee,
|
|
|
|
l.MaxMinerFee, l.MaxPrepayAmount,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *loopOutSwapSuggestion) channels() []lnwire.ShortChannelID {
|
|
|
|
channels := make([]lnwire.ShortChannelID, len(l.OutgoingChanSet))
|
|
|
|
|
|
|
|
for i, id := range l.OutgoingChanSet {
|
|
|
|
channels[i] = lnwire.NewShortChanIDFromInt(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
return channels
|
|
|
|
}
|