loop/liquidity/easy_autoloop_exclusions_test.go
Boris Nagaev 7cf0a87c2b
liquidity: count static loop-ins
Teach the liquidity manager to include persisted static loop-ins
in budget accounting, in-flight limits, and peer traffic backoff.
This adds the static fee model used for conservative accounting
and passes storage errors through the relevant planner helpers.

The daemon wiring now exposes static loop-ins to liquidity so the
manager can see the same ongoing swaps that the static-address
subsystem persists, while easy autoloop keeps working with the new
fallible traffic lookup path.
2026-05-22 02:20:36 -05:00

118 lines
3.6 KiB
Go

package liquidity
import (
"testing"
"github.com/btcsuite/btcd/btcutil"
"github.com/lightninglabs/lndclient"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/routing/route"
"github.com/stretchr/testify/require"
)
// TestEasyAutoloopExcludedPeers ensures that peers listed in
// Parameters.EasyAutoloopExcludedPeers are not selected by
// pickEasyAutoloopChannel even if they would otherwise be preferred.
func TestEasyAutoloopExcludedPeers(t *testing.T) {
// Two channels, peer1 has the higher local balance and would be picked
// if not excluded.
ch1 := lndclient.ChannelInfo{
Active: true,
ChannelID: lnwire.NewShortChanIDFromInt(11).ToUint64(),
PubKeyBytes: peer1,
LocalBalance: 90000,
RemoteBalance: 0,
Capacity: 100000,
}
ch2 := lndclient.ChannelInfo{
Active: true,
ChannelID: lnwire.NewShortChanIDFromInt(22).ToUint64(),
PubKeyBytes: peer2,
LocalBalance: 80000,
RemoteBalance: 0,
Capacity: 100000,
}
params := defaultParameters
params.Autoloop = true
params.EasyAutoloop = true
params.EasyAutoloopTarget = 80000
params.ClientRestrictions.Minimum = btcutil.Amount(1)
params.ClientRestrictions.Maximum = btcutil.Amount(10000)
// Exclude peer1, even though its channel has more local balance.
params.EasyAutoloopExcludedPeers = []route.Vertex{peer1}
c := newAutoloopTestCtx(
t, params, []lndclient.ChannelInfo{ch1, ch2}, testRestrictions,
)
// Picking a channel should not pick the excluded peer's channel.
picked, err := c.manager.pickEasyAutoloopChannel(
t.Context(), []lndclient.ChannelInfo{ch1, ch2},
&params.ClientRestrictions, nil, nil, 1,
)
require.NoError(t, err)
require.NotNil(t, picked)
require.Equal(
t, ch2.ChannelID, picked.ChannelID,
"should pick non-excluded peer's channel",
)
}
// TestEasyAutoloopIncludeAllPeers simulates the --includealleasypeers flag by
// clearing the exclusion list and ensuring a previously excluded peer can be
// selected again.
func TestEasyAutoloopIncludeAllPeers(t *testing.T) {
ch1 := lndclient.ChannelInfo{
Active: true,
ChannelID: lnwire.NewShortChanIDFromInt(33).ToUint64(),
PubKeyBytes: peer1,
LocalBalance: 90000,
RemoteBalance: 0,
Capacity: 100000,
}
ch2 := lndclient.ChannelInfo{
Active: true,
ChannelID: lnwire.NewShortChanIDFromInt(44).ToUint64(),
PubKeyBytes: peer2,
LocalBalance: 80000,
RemoteBalance: 0,
Capacity: 100000,
}
params := defaultParameters
params.Autoloop = true
params.EasyAutoloop = true
params.EasyAutoloopTarget = 80000
params.ClientRestrictions.Minimum = btcutil.Amount(1)
params.ClientRestrictions.Maximum = btcutil.Amount(10000)
params.EasyAutoloopExcludedPeers = []route.Vertex{peer1}
c := newAutoloopTestCtx(
t, params, []lndclient.ChannelInfo{ch1, ch2}, testRestrictions,
)
// With exclusion active, peer1 should not be picked.
picked, err := c.manager.pickEasyAutoloopChannel(
t.Context(), []lndclient.ChannelInfo{ch1, ch2},
&params.ClientRestrictions, nil, nil, 1,
)
require.NoError(t, err)
require.NotNil(t, picked)
require.Equal(t, ch2.ChannelID, picked.ChannelID)
// Simulate --includealleasypeers by clearing the exclusion list as the
// CLI does before sending to the server.
c.manager.params.EasyAutoloopExcludedPeers = nil
picked, err = c.manager.pickEasyAutoloopChannel(
t.Context(), []lndclient.ChannelInfo{ch1, ch2},
&params.ClientRestrictions, nil, nil, 1,
)
require.NoError(t, err)
require.NotNil(t, picked)
require.Equal(
t, ch1.ChannelID, picked.ChannelID,
"after include-all, highest local balance should win again",
)
}