Merge pull request #331 from carlaKC/autoloop-0-refactoring

autoloop: refactoring to prepare for loopin
pull/334/head
Carla Kirk-Cohen 3 years ago committed by GitHub
commit 9af61481ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -225,10 +225,10 @@ var setParamsCommand = cli.Command{
"included in suggestions.", "included in suggestions.",
}, },
cli.BoolFlag{ cli.BoolFlag{
Name: "autoout", Name: "autoloop",
Usage: "set to true to enable automated dispatch " + Usage: "set to true to enable automated dispatch " +
"of loop out swaps, limited to the budget " + "of swaps, limited to the budget set by " +
"set by autobudget", "autobudget",
}, },
cli.Uint64Flag{ cli.Uint64Flag{
Name: "autobudget", Name: "autobudget",
@ -338,18 +338,18 @@ func setParams(ctx *cli.Context) error {
flagSet = true flagSet = true
} }
if ctx.IsSet("autoout") { if ctx.IsSet("autoloop") {
params.AutoLoopOut = ctx.Bool("autoout") params.Autoloop = ctx.Bool("autoloop")
flagSet = true flagSet = true
} }
if ctx.IsSet("autobudget") { if ctx.IsSet("autobudget") {
params.AutoOutBudgetSat = ctx.Uint64("autobudget") params.AutoloopBudgetSat = ctx.Uint64("autobudget")
flagSet = true flagSet = true
} }
if ctx.IsSet("budgetstart") { if ctx.IsSet("budgetstart") {
params.AutoOutBudgetStartSec = ctx.Uint64("budgetstart") params.AutoloopBudgetStartSec = ctx.Uint64("budgetstart")
flagSet = true flagSet = true
} }

@ -6,7 +6,7 @@ budget of your choosing.
The autoloop functionality is disabled by default, and can be enabled using the The autoloop functionality is disabled by default, and can be enabled using the
following command: following command:
``` ```
loop setparams --autoout=true loop setparams --autoloop=true
``` ```
Swaps that are dispatched by the autolooper can be identified in the output of Swaps that are dispatched by the autolooper can be identified in the output of

@ -4,6 +4,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"strings" "strings"
"github.com/lightninglabs/loop/swap"
) )
const ( const (
@ -17,6 +19,10 @@ const (
// autoOut is the label used for loop out swaps that are automatically // autoOut is the label used for loop out swaps that are automatically
// dispatched. // dispatched.
autoOut = "autoloop-out" autoOut = "autoloop-out"
// autoIn is the label used for loop in swaps that are automatically
// dispatched.
autoIn = "autoloop-in"
) )
var ( var (
@ -28,10 +34,14 @@ var (
ErrReservedPrefix = errors.New("label contains reserved prefix") ErrReservedPrefix = errors.New("label contains reserved prefix")
) )
// AutoOutLabel returns a label with the reserved prefix that identifies // AutoloopLabel returns a label with the reserved prefix that identifies
// automatically dispatched loop outs. // automatically dispatched swaps depending on the type of swap being executed.
func AutoOutLabel() string { func AutoloopLabel(swapType swap.Type) string {
return fmt.Sprintf("%v: %v", Reserved, autoOut) if swapType == swap.TypeOut {
return fmt.Sprintf("%v: %v", Reserved, autoOut)
}
return fmt.Sprintf("%v: %v", Reserved, autoIn)
} }
// Validate checks that a label is of appropriate length and is not in our list // Validate checks that a label is of appropriate length and is not in our list

@ -8,6 +8,7 @@ import (
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/labels" "github.com/lightninglabs/loop/labels"
"github.com/lightninglabs/loop/loopdb" "github.com/lightninglabs/loop/loopdb"
"github.com/lightninglabs/loop/swap"
"github.com/lightninglabs/loop/test" "github.com/lightninglabs/loop/test"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
@ -75,7 +76,7 @@ func TestAutoLoopEnabled(t *testing.T) {
// is set to allow exactly 2 swaps at the prices that we set in our // is set to allow exactly 2 swaps at the prices that we set in our
// test quotes. // test quotes.
params := Parameters{ params := Parameters{
AutoOut: true, Autoloop: true,
AutoFeeBudget: 40066, AutoFeeBudget: 40066,
AutoFeeStartDate: testTime, AutoFeeStartDate: testTime,
MaxAutoInFlight: 2, MaxAutoInFlight: 2,
@ -145,7 +146,7 @@ func TestAutoLoopEnabled(t *testing.T) {
MaxMinerFee: params.MaximumMinerFee, MaxMinerFee: params.MaximumMinerFee,
SweepConfTarget: params.SweepConfTarget, SweepConfTarget: params.SweepConfTarget,
OutgoingChanSet: loopdb.ChannelSet{chanID1.ToUint64()}, OutgoingChanSet: loopdb.ChannelSet{chanID1.ToUint64()},
Label: labels.AutoOutLabel(), Label: labels.AutoloopLabel(swap.TypeOut),
Initiator: autoloopSwapInitiator, Initiator: autoloopSwapInitiator,
} }
@ -161,7 +162,7 @@ func TestAutoLoopEnabled(t *testing.T) {
MaxMinerFee: params.MaximumMinerFee, MaxMinerFee: params.MaximumMinerFee,
SweepConfTarget: params.SweepConfTarget, SweepConfTarget: params.SweepConfTarget,
OutgoingChanSet: loopdb.ChannelSet{chanID2.ToUint64()}, OutgoingChanSet: loopdb.ChannelSet{chanID2.ToUint64()},
Label: labels.AutoOutLabel(), Label: labels.AutoloopLabel(swap.TypeOut),
Initiator: autoloopSwapInitiator, Initiator: autoloopSwapInitiator,
} }

@ -8,6 +8,7 @@ import (
"github.com/lightninglabs/lndclient" "github.com/lightninglabs/lndclient"
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/loopdb" "github.com/lightninglabs/loop/loopdb"
"github.com/lightninglabs/loop/swap"
"github.com/lightninglabs/loop/test" "github.com/lightninglabs/loop/test"
"github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/clock"
"github.com/lightningnetwork/lnd/ticker" "github.com/lightningnetwork/lnd/ticker"
@ -91,8 +92,10 @@ func newAutoloopTestCtx(t *testing.T, parameters Parameters,
testCtx.lnd.Channels = channels testCtx.lnd.Channels = channels
cfg := &Config{ cfg := &Config{
AutoOutTicker: ticker.NewForce(DefaultAutoOutTicker), AutoloopTicker: ticker.NewForce(DefaultAutoloopTicker),
LoopOutRestrictions: func(context.Context) (*Restrictions, error) { Restrictions: func(context.Context, swap.Type) (*Restrictions,
error) {
return <-testCtx.loopOutRestrictions, nil return <-testCtx.loopOutRestrictions, nil
}, },
ListLoopOut: func() ([]*loopdb.LoopOut, error) { ListLoopOut: func() ([]*loopdb.LoopOut, error) {
@ -182,7 +185,7 @@ func (c *autoloopTestCtx) autoloop(minAmt, maxAmt btcutil.Amount,
expectedSwaps []loopOutRequestResp) { expectedSwaps []loopOutRequestResp) {
// Tick our autoloop ticker to force assessing whether we want to loop. // Tick our autoloop ticker to force assessing whether we want to loop.
c.manager.cfg.AutoOutTicker.Force <- testTime c.manager.cfg.AutoloopTicker.Force <- testTime
// Send a mocked response from the server with the swap size limits. // Send a mocked response from the server with the swap size limits.
c.loopOutRestrictions <- NewRestrictions(minAmt, maxAmt) c.loopOutRestrictions <- NewRestrictions(minAmt, maxAmt)

@ -46,6 +46,7 @@ import (
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/labels" "github.com/lightninglabs/loop/labels"
"github.com/lightninglabs/loop/loopdb" "github.com/lightninglabs/loop/loopdb"
"github.com/lightninglabs/loop/swap"
"github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/clock"
"github.com/lightningnetwork/lnd/funding" "github.com/lightningnetwork/lnd/funding"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
@ -96,9 +97,9 @@ const (
// suggestions as a dry-run). // suggestions as a dry-run).
defaultMaxInFlight = 1 defaultMaxInFlight = 1
// DefaultAutoOutTicker is the default amount of time between automated // DefaultAutoloopTicker is the default amount of time between automated
// loop out checks. // swap checks.
DefaultAutoOutTicker = time.Minute * 10 DefaultAutoloopTicker = time.Minute * 10
// autoloopSwapInitiator is the value we send in the initiator field of // autoloopSwapInitiator is the value we send in the initiator field of
// a swap request when issuing an automatic swap. // a swap request when issuing an automatic swap.
@ -182,14 +183,15 @@ var (
// Config contains the external functionality required to run the // Config contains the external functionality required to run the
// liquidity manager. // liquidity manager.
type Config struct { type Config struct {
// AutoOutTicker determines how often we should check whether we want // AutoloopTicker determines how often we should check whether we want
// to dispatch an automated loop out. We use a force ticker so that // to dispatch an automated swap. We use a force ticker so that we can
// we can trigger autoloop in itests. // trigger autoloop in itests.
AutoOutTicker *ticker.Force AutoloopTicker *ticker.Force
// LoopOutRestrictions returns the restrictions that the server applies // Restrictions returns the restrictions that the server applies to
// to loop out swaps. // swaps.
LoopOutRestrictions func(ctx context.Context) (*Restrictions, error) Restrictions func(ctx context.Context, swapType swap.Type) (
*Restrictions, error)
// Lnd provides us with access to lnd's rpc servers. // Lnd provides us with access to lnd's rpc servers.
Lnd *lndclient.LndServices Lnd *lndclient.LndServices
@ -220,8 +222,8 @@ type Config struct {
// Parameters is a set of parameters provided by the user which guide // Parameters is a set of parameters provided by the user which guide
// how we assess liquidity. // how we assess liquidity.
type Parameters struct { type Parameters struct {
// AutoOut enables automatic dispatch of loop out swaps. // Autoloop enables automatic dispatch of swaps.
AutoOut bool Autoloop bool
// AutoFeeBudget is the total amount we allow to be spent on // AutoFeeBudget is the total amount we allow to be spent on
// automatically dispatched swaps. Once this budget has been used, we // automatically dispatched swaps. Once this budget has been used, we
@ -431,12 +433,12 @@ type Manager struct {
// We run this loop even if automated swaps are not currently enabled rather // We run this loop even if automated swaps are not currently enabled rather
// than managing starting and stopping the ticker as our parameters are updated. // than managing starting and stopping the ticker as our parameters are updated.
func (m *Manager) Run(ctx context.Context) error { func (m *Manager) Run(ctx context.Context) error {
m.cfg.AutoOutTicker.Resume() m.cfg.AutoloopTicker.Resume()
defer m.cfg.AutoOutTicker.Stop() defer m.cfg.AutoloopTicker.Stop()
for { for {
select { select {
case <-m.cfg.AutoOutTicker.Ticks(): case <-m.cfg.AutoloopTicker.Ticks():
if err := m.autoloop(ctx); err != nil { if err := m.autoloop(ctx); err != nil {
log.Errorf("autoloop failed: %v", err) log.Errorf("autoloop failed: %v", err)
} }
@ -466,7 +468,7 @@ func (m *Manager) GetParameters() Parameters {
// SetParameters updates our current set of parameters if the new parameters // SetParameters updates our current set of parameters if the new parameters
// provided are valid. // provided are valid.
func (m *Manager) SetParameters(ctx context.Context, params Parameters) error { func (m *Manager) SetParameters(ctx context.Context, params Parameters) error {
restrictions, err := m.cfg.LoopOutRestrictions(ctx) restrictions, err := m.cfg.Restrictions(ctx, swap.TypeOut)
if err != nil { if err != nil {
return err return err
} }
@ -510,6 +512,15 @@ func (m *Manager) autoloop(ctx context.Context) error {
} }
for _, swap := range swaps { for _, swap := range swaps {
// If we don't actually have dispatch of swaps enabled, log
// suggestions.
if !m.params.Autoloop {
log.Debugf("recommended autoloop: %v sats over "+
"%v", swap.Amount, swap.OutgoingChanSet)
continue
}
// Create a copy of our range var so that we can reference it. // Create a copy of our range var so that we can reference it.
swap := swap swap := swap
loopOut, err := m.cfg.LoopOut(ctx, &swap) loopOut, err := m.cfg.LoopOut(ctx, &swap)
@ -528,7 +539,7 @@ func (m *Manager) autoloop(ctx context.Context) error {
// ForceAutoLoop force-ticks our auto-out ticker. // ForceAutoLoop force-ticks our auto-out ticker.
func (m *Manager) ForceAutoLoop(ctx context.Context) error { func (m *Manager) ForceAutoLoop(ctx context.Context) error {
select { select {
case m.cfg.AutoOutTicker.Force <- m.cfg.Clock.Now(): case m.cfg.AutoloopTicker.Force <- m.cfg.Clock.Now():
return nil return nil
case <-ctx.Done(): case <-ctx.Done():
@ -538,11 +549,11 @@ func (m *Manager) ForceAutoLoop(ctx context.Context) error {
// SuggestSwaps returns a set of swap suggestions based on our current liquidity // SuggestSwaps returns a set of swap suggestions based on our current liquidity
// balance for the set of rules configured for the manager, failing if there are // balance for the set of rules configured for the manager, failing if there are
// no rules set. It takes an autoOut boolean that indicates whether the // no rules set. It takes an autoloop boolean that indicates whether the
// suggestions are being used for our internal autolooper. This boolean is used // suggestions are being used for our internal autolooper. This boolean is used
// to determine the information we add to our swap suggestion and whether we // to determine the information we add to our swap suggestion and whether we
// return any suggestions. // return any suggestions.
func (m *Manager) SuggestSwaps(ctx context.Context, autoOut bool) ( func (m *Manager) SuggestSwaps(ctx context.Context, autoloop bool) (
[]loop.OutRequest, error) { []loop.OutRequest, error) {
m.paramsLock.Lock() m.paramsLock.Lock()
@ -587,7 +598,7 @@ func (m *Manager) SuggestSwaps(ctx context.Context, autoOut bool) (
// Get the current server side restrictions, combined with the client // Get the current server side restrictions, combined with the client
// set restrictions, if any. // set restrictions, if any.
outRestrictions, err := m.getLoopOutRestrictions(ctx) restrictions, err := m.getSwapRestrictions(ctx, swap.TypeOut)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -646,7 +657,7 @@ func (m *Manager) SuggestSwaps(ctx context.Context, autoOut bool) (
balance := newBalances(channel) balance := newBalances(channel)
suggestion := rule.suggestSwap(balance, outRestrictions) suggestion := rule.suggestSwap(balance, restrictions)
// We can have nil suggestions in the case where no action is // We can have nil suggestions in the case where no action is
// required, so we skip over them. // required, so we skip over them.
@ -681,7 +692,7 @@ func (m *Manager) SuggestSwaps(ctx context.Context, autoOut bool) (
} }
outRequest, err := m.makeLoopOutRequest( outRequest, err := m.makeLoopOutRequest(
ctx, suggestion, quote, autoOut, ctx, suggestion, quote, autoloop,
) )
if err != nil { if err != nil {
return nil, err return nil, err
@ -728,29 +739,17 @@ func (m *Manager) SuggestSwaps(ctx context.Context, autoOut bool) (
} }
} }
// If we are getting suggestions for automatically dispatched swaps,
// and they are not enabled in our parameters, we just log the swap
// suggestions and return an empty set of suggestions.
if autoOut && !m.params.AutoOut {
for _, swap := range inBudget {
log.Debugf("recommended autoloop: %v sats over "+
"%v", swap.Amount, swap.OutgoingChanSet)
}
return nil, nil
}
return inBudget, nil return inBudget, nil
} }
// getLoopOutRestrictions queries the server for its latest swap size // getSwapRestrictions queries the server for its latest swap size restrictions,
// restrictions, validates client restrictions (if present) against these // validates client restrictions (if present) against these values and merges
// values and merges the client's custom requirements with the server's limits // the client's custom requirements with the server's limits to produce a single
// to produce a single set of limitations for our swap. // set of limitations for our swap.
func (m *Manager) getLoopOutRestrictions(ctx context.Context) (*Restrictions, func (m *Manager) getSwapRestrictions(ctx context.Context, swapType swap.Type) (
error) { *Restrictions, error) {
restrictions, err := m.cfg.LoopOutRestrictions(ctx) restrictions, err := m.cfg.Restrictions(ctx, swapType)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -791,7 +790,7 @@ func (m *Manager) getLoopOutRestrictions(ctx context.Context) (*Restrictions,
// non-auto requests, because the client api will set it anyway). // non-auto requests, because the client api will set it anyway).
func (m *Manager) makeLoopOutRequest(ctx context.Context, func (m *Manager) makeLoopOutRequest(ctx context.Context,
suggestion *LoopOutRecommendation, quote *loop.LoopOutQuote, suggestion *LoopOutRecommendation, quote *loop.LoopOutQuote,
autoOut bool) (loop.OutRequest, error) { autoloop bool) (loop.OutRequest, error) {
prepayMaxFee := ppmToSat( prepayMaxFee := ppmToSat(
quote.PrepayAmount, m.params.MaximumPrepayRoutingFeePPM, quote.PrepayAmount, m.params.MaximumPrepayRoutingFeePPM,
@ -815,8 +814,8 @@ func (m *Manager) makeLoopOutRequest(ctx context.Context,
Initiator: autoloopSwapInitiator, Initiator: autoloopSwapInitiator,
} }
if autoOut { if autoloop {
request.Label = labels.AutoOutLabel() request.Label = labels.AutoloopLabel(swap.TypeOut)
addr, err := m.cfg.Lnd.WalletKit.NextAddr(ctx) addr, err := m.cfg.Lnd.WalletKit.NextAddr(ctx)
if err != nil { if err != nil {
@ -882,7 +881,7 @@ func (m *Manager) checkExistingAutoLoops(ctx context.Context,
var summary existingAutoLoopSummary var summary existingAutoLoopSummary
for _, out := range loopOuts { for _, out := range loopOuts {
if out.Contract.Label != labels.AutoOutLabel() { if out.Contract.Label != labels.AutoloopLabel(swap.TypeOut) {
continue continue
} }

@ -10,6 +10,7 @@ import (
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/labels" "github.com/lightninglabs/loop/labels"
"github.com/lightninglabs/loop/loopdb" "github.com/lightninglabs/loop/loopdb"
"github.com/lightninglabs/loop/swap"
"github.com/lightninglabs/loop/test" "github.com/lightninglabs/loop/test"
"github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/clock"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
@ -99,7 +100,7 @@ var (
// and restricted to a channel that we do not use in our tests. // and restricted to a channel that we do not use in our tests.
autoOutContract = &loopdb.LoopOutContract{ autoOutContract = &loopdb.LoopOutContract{
SwapContract: loopdb.SwapContract{ SwapContract: loopdb.SwapContract{
Label: labels.AutoOutLabel(), Label: labels.AutoloopLabel(swap.TypeOut),
InitiationTime: testBudgetStart, InitiationTime: testBudgetStart,
}, },
OutgoingChanSet: loopdb.ChannelSet{999}, OutgoingChanSet: loopdb.ChannelSet{999},
@ -120,7 +121,7 @@ func newTestConfig() (*Config, *test.LndMockServices) {
) )
return &Config{ return &Config{
LoopOutRestrictions: func(_ context.Context) (*Restrictions, Restrictions: func(_ context.Context, _ swap.Type) (*Restrictions,
error) { error) {
return testRestrictions, nil return testRestrictions, nil
@ -867,7 +868,7 @@ func TestSizeRestrictions(t *testing.T) {
Maximum: 10000, Maximum: 10000,
} }
swap = loop.OutRequest{ outSwap = loop.OutRequest{
OutgoingChanSet: loopdb.ChannelSet{chanID1.ToUint64()}, OutgoingChanSet: loopdb.ChannelSet{chanID1.ToUint64()},
MaxPrepayRoutingFee: prepayFee, MaxPrepayRoutingFee: prepayFee,
MaxMinerFee: defaultMaximumMinerFee, MaxMinerFee: defaultMaximumMinerFee,
@ -966,7 +967,7 @@ func TestSizeRestrictions(t *testing.T) {
// our restrictions endpoint. // our restrictions endpoint.
var callCount int var callCount int
cfg.LoopOutRestrictions = func(_ context.Context) ( cfg.Restrictions = func(_ context.Context, _ swap.Type) (
*Restrictions, error) { *Restrictions, error) {
restrictions := testCase.serverRestrictions[callCount] restrictions := testCase.serverRestrictions[callCount]
@ -980,14 +981,14 @@ func TestSizeRestrictions(t *testing.T) {
// and fee accordingly. // and fee accordingly.
var expectedSwaps []loop.OutRequest var expectedSwaps []loop.OutRequest
if testCase.expectedAmount != 0 { if testCase.expectedAmount != 0 {
swap.Amount = testCase.expectedAmount outSwap.Amount = testCase.expectedAmount
swap.MaxSwapRoutingFee = ppmToSat( outSwap.MaxSwapRoutingFee = ppmToSat(
testCase.expectedAmount, testCase.expectedAmount,
defaultRoutingFeePPM, defaultRoutingFeePPM,
) )
expectedSwaps = append(expectedSwaps, swap) expectedSwaps = append(expectedSwaps, outSwap)
} }
testSuggestSwaps( testSuggestSwaps(

@ -581,8 +581,8 @@ func (s *swapClientServer) GetLiquidityParams(_ context.Context,
SweepFeeRateSatPerVbyte: uint64(satPerByte), SweepFeeRateSatPerVbyte: uint64(satPerByte),
SweepConfTarget: cfg.SweepConfTarget, SweepConfTarget: cfg.SweepConfTarget,
FailureBackoffSec: uint64(cfg.FailureBackOff.Seconds()), FailureBackoffSec: uint64(cfg.FailureBackOff.Seconds()),
AutoLoopOut: cfg.AutoOut, Autoloop: cfg.Autoloop,
AutoOutBudgetSat: uint64(cfg.AutoFeeBudget), AutoloopBudgetSat: uint64(cfg.AutoFeeBudget),
AutoMaxInFlight: uint64(cfg.MaxAutoInFlight), AutoMaxInFlight: uint64(cfg.MaxAutoInFlight),
Rules: make( Rules: make(
[]*looprpc.LiquidityRule, 0, len(cfg.ChannelRules), []*looprpc.LiquidityRule, 0, len(cfg.ChannelRules),
@ -594,7 +594,7 @@ func (s *swapClientServer) GetLiquidityParams(_ context.Context,
// Zero golang time is different to a zero unix time, so we only set // Zero golang time is different to a zero unix time, so we only set
// our start date if it is non-zero. // our start date if it is non-zero.
if !cfg.AutoFeeStartDate.IsZero() { if !cfg.AutoFeeStartDate.IsZero() {
rpcCfg.AutoOutBudgetStartSec = uint64( rpcCfg.AutoloopBudgetStartSec = uint64(
cfg.AutoFeeStartDate.Unix(), cfg.AutoFeeStartDate.Unix(),
) )
} }
@ -633,8 +633,8 @@ func (s *swapClientServer) SetLiquidityParams(ctx context.Context,
SweepConfTarget: in.Parameters.SweepConfTarget, SweepConfTarget: in.Parameters.SweepConfTarget,
FailureBackOff: time.Duration(in.Parameters.FailureBackoffSec) * FailureBackOff: time.Duration(in.Parameters.FailureBackoffSec) *
time.Second, time.Second,
AutoOut: in.Parameters.AutoLoopOut, Autoloop: in.Parameters.Autoloop,
AutoFeeBudget: btcutil.Amount(in.Parameters.AutoOutBudgetSat), AutoFeeBudget: btcutil.Amount(in.Parameters.AutoloopBudgetSat),
MaxAutoInFlight: int(in.Parameters.AutoMaxInFlight), MaxAutoInFlight: int(in.Parameters.AutoMaxInFlight),
ChannelRules: make( ChannelRules: make(
map[lnwire.ShortChannelID]*liquidity.ThresholdRule, map[lnwire.ShortChannelID]*liquidity.ThresholdRule,
@ -647,9 +647,9 @@ func (s *swapClientServer) SetLiquidityParams(ctx context.Context,
} }
// Zero unix time is different to zero golang time. // Zero unix time is different to zero golang time.
if in.Parameters.AutoOutBudgetStartSec != 0 { if in.Parameters.AutoloopBudgetStartSec != 0 {
params.AutoFeeStartDate = time.Unix( params.AutoFeeStartDate = time.Unix(
int64(in.Parameters.AutoOutBudgetStartSec), 0, int64(in.Parameters.AutoloopBudgetStartSec), 0,
) )
} }

@ -7,6 +7,7 @@ import (
"github.com/lightninglabs/lndclient" "github.com/lightninglabs/lndclient"
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/liquidity" "github.com/lightninglabs/loop/liquidity"
"github.com/lightninglabs/loop/swap"
"github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/clock"
"github.com/lightningnetwork/lnd/ticker" "github.com/lightningnetwork/lnd/ticker"
) )
@ -36,18 +37,29 @@ func getClient(config *Config, lnd *lndclient.LndServices) (*loop.Client,
func getLiquidityManager(client *loop.Client) *liquidity.Manager { func getLiquidityManager(client *loop.Client) *liquidity.Manager {
mngrCfg := &liquidity.Config{ mngrCfg := &liquidity.Config{
AutoOutTicker: ticker.NewForce(liquidity.DefaultAutoOutTicker), AutoloopTicker: ticker.NewForce(liquidity.DefaultAutoloopTicker),
LoopOut: client.LoopOut, LoopOut: client.LoopOut,
LoopOutRestrictions: func(ctx context.Context) ( Restrictions: func(ctx context.Context,
*liquidity.Restrictions, error) { swapType swap.Type) (*liquidity.Restrictions, error) {
outTerms, err := client.Server.GetLoopOutTerms(ctx) if swapType == swap.TypeOut {
outTerms, err := client.Server.GetLoopOutTerms(ctx)
if err != nil {
return nil, err
}
return liquidity.NewRestrictions(
outTerms.MinSwapAmount, outTerms.MaxSwapAmount,
), nil
}
inTerms, err := client.Server.GetLoopInTerms(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return liquidity.NewRestrictions( return liquidity.NewRestrictions(
outTerms.MinSwapAmount, outTerms.MaxSwapAmount, inTerms.MinSwapAmount, inTerms.MaxSwapAmount,
), nil ), nil
}, },
Lnd: client.LndServices, Lnd: client.LndServices,

@ -1609,20 +1609,20 @@ type LiquidityParameters struct {
//suggestions again, expressed in seconds. //suggestions again, expressed in seconds.
FailureBackoffSec uint64 `protobuf:"varint,9,opt,name=failure_backoff_sec,json=failureBackoffSec,proto3" json:"failure_backoff_sec,omitempty"` FailureBackoffSec uint64 `protobuf:"varint,9,opt,name=failure_backoff_sec,json=failureBackoffSec,proto3" json:"failure_backoff_sec,omitempty"`
// //
//Set to true to enable automatic dispatch of loop out swaps. All swaps will //Set to true to enable automatic dispatch of swaps. All swaps will be limited
//be limited to the fee categories set by these parameters, and total //to the fee categories set by these parameters, and total expenditure will
//expenditure will be limited to the auto out budget. //be limited to the autoloop budget.
AutoLoopOut bool `protobuf:"varint,10,opt,name=auto_loop_out,json=autoLoopOut,proto3" json:"auto_loop_out,omitempty"` Autoloop bool `protobuf:"varint,10,opt,name=autoloop,proto3" json:"autoloop,omitempty"`
// //
//The total budget for automatically dispatched swaps since the budget start //The total budget for automatically dispatched swaps since the budget start
//time, expressed in satoshis. //time, expressed in satoshis.
AutoOutBudgetSat uint64 `protobuf:"varint,11,opt,name=auto_out_budget_sat,json=autoOutBudgetSat,proto3" json:"auto_out_budget_sat,omitempty"` AutoloopBudgetSat uint64 `protobuf:"varint,11,opt,name=autoloop_budget_sat,json=autoloopBudgetSat,proto3" json:"autoloop_budget_sat,omitempty"`
// //
//The start time for auto-out budget, expressed as a unix timestamp in //The start time for autoloop budget, expressed as a unix timestamp in
//seconds. If this value is 0, the budget will be applied for all //seconds. If this value is 0, the budget will be applied for all
//automatically dispatched swaps. Swaps that were completed before this date //automatically dispatched swaps. Swaps that were completed before this date
//will not be included in budget calculations. //will not be included in budget calculations.
AutoOutBudgetStartSec uint64 `protobuf:"varint,12,opt,name=auto_out_budget_start_sec,json=autoOutBudgetStartSec,proto3" json:"auto_out_budget_start_sec,omitempty"` AutoloopBudgetStartSec uint64 `protobuf:"varint,12,opt,name=autoloop_budget_start_sec,json=autoloopBudgetStartSec,proto3" json:"autoloop_budget_start_sec,omitempty"`
// //
//The maximum number of automatically dispatched swaps that we allow to be in //The maximum number of automatically dispatched swaps that we allow to be in
//flight at any point in time. //flight at any point in time.
@ -1730,23 +1730,23 @@ func (m *LiquidityParameters) GetFailureBackoffSec() uint64 {
return 0 return 0
} }
func (m *LiquidityParameters) GetAutoLoopOut() bool { func (m *LiquidityParameters) GetAutoloop() bool {
if m != nil { if m != nil {
return m.AutoLoopOut return m.Autoloop
} }
return false return false
} }
func (m *LiquidityParameters) GetAutoOutBudgetSat() uint64 { func (m *LiquidityParameters) GetAutoloopBudgetSat() uint64 {
if m != nil { if m != nil {
return m.AutoOutBudgetSat return m.AutoloopBudgetSat
} }
return 0 return 0
} }
func (m *LiquidityParameters) GetAutoOutBudgetStartSec() uint64 { func (m *LiquidityParameters) GetAutoloopBudgetStartSec() uint64 {
if m != nil { if m != nil {
return m.AutoOutBudgetStartSec return m.AutoloopBudgetStartSec
} }
return 0 return 0
} }
@ -2029,157 +2029,157 @@ func init() {
func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) } func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) }
var fileDescriptor_014de31d7ac8c57c = []byte{ var fileDescriptor_014de31d7ac8c57c = []byte{
// 2396 bytes of a gzipped FileDescriptorProto // 2389 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4b, 0x6f, 0x23, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcd, 0x6f, 0xe3, 0xc6,
0x11, 0x5e, 0xbe, 0x44, 0xb2, 0xf8, 0x1a, 0xb5, 0x76, 0x57, 0x14, 0x2d, 0xc3, 0xda, 0xb1, 0x37, 0x15, 0x5f, 0x7d, 0x59, 0xd2, 0x13, 0x45, 0xd1, 0xe3, 0x5d, 0x5b, 0x56, 0x1c, 0xc4, 0xcb, 0x64,
0x96, 0x65, 0x7b, 0x19, 0xcb, 0x97, 0xc4, 0xb0, 0x03, 0x68, 0x29, 0xca, 0xe2, 0x46, 0x22, 0x99, 0x1b, 0xc7, 0x49, 0xac, 0xc6, 0x39, 0x25, 0x48, 0x0a, 0x68, 0x65, 0x39, 0x96, 0x6b, 0x4b, 0x2a,
0x21, 0xb5, 0x86, 0x83, 0x00, 0x83, 0x16, 0xd9, 0x92, 0x06, 0xe6, 0x3c, 0x3c, 0xd3, 0xdc, 0xd5, 0x25, 0x6f, 0x90, 0xa2, 0x00, 0x31, 0x96, 0xc6, 0x16, 0x11, 0xf1, 0x23, 0xe4, 0x68, 0xd7, 0x46,
0xc2, 0x48, 0x02, 0x04, 0xc8, 0x39, 0x87, 0xfc, 0x83, 0xdc, 0x73, 0xcb, 0x2d, 0xf9, 0x09, 0xc9, 0xd0, 0x16, 0x28, 0xd0, 0x73, 0x0f, 0xfd, 0x0f, 0x7a, 0xef, 0xad, 0xb7, 0xf6, 0xde, 0x4b, 0x4f,
0x25, 0x39, 0xe6, 0x9a, 0x4b, 0x0e, 0xf9, 0x0f, 0x41, 0x55, 0xcf, 0x0c, 0x67, 0x28, 0x52, 0x46, 0xed, 0xb1, 0xd7, 0x5e, 0x7a, 0xe8, 0xff, 0x50, 0xcc, 0x1b, 0x92, 0x22, 0x65, 0xc9, 0x41, 0x0f,
0x0e, 0xb9, 0x71, 0xaa, 0xbe, 0xae, 0xae, 0xae, 0x77, 0x11, 0xaa, 0x93, 0x99, 0x25, 0x1c, 0xf9, 0xbd, 0x89, 0xef, 0xfd, 0xe6, 0xcd, 0x9b, 0xf7, 0xfd, 0x04, 0xca, 0x78, 0x66, 0x31, 0x87, 0x1f,
0xcc, 0xf3, 0x5d, 0xe9, 0xb2, 0xe2, 0xcc, 0x75, 0x3d, 0xdf, 0x9b, 0xb4, 0x76, 0xaf, 0x5d, 0xf7, 0x79, 0xbe, 0xcb, 0x5d, 0x52, 0x9c, 0xb9, 0xae, 0xe7, 0x7b, 0xe3, 0xc6, 0xde, 0xad, 0xeb, 0xde,
0x7a, 0x26, 0xda, 0xdc, 0xb3, 0xda, 0xdc, 0x71, 0x5c, 0xc9, 0xa5, 0xe5, 0x3a, 0x81, 0x82, 0xe9, 0xce, 0x58, 0x93, 0x7a, 0x56, 0x93, 0x3a, 0x8e, 0xcb, 0x29, 0xb7, 0x5c, 0x27, 0x90, 0x30, 0xfd,
0x7f, 0xcc, 0x43, 0xfd, 0xcc, 0x75, 0xbd, 0xc1, 0x5c, 0x1a, 0xe2, 0xdb, 0xb9, 0x08, 0x24, 0xd3, 0x8f, 0x79, 0x50, 0x2f, 0x5c, 0xd7, 0xeb, 0xcf, 0xb9, 0xc1, 0xbe, 0x9b, 0xb3, 0x80, 0x13, 0x0d,
0x20, 0xc7, 0x6d, 0xd9, 0xcc, 0xec, 0x65, 0xf6, 0x73, 0x06, 0xfe, 0x64, 0x0c, 0xf2, 0x53, 0x11, 0x72, 0xd4, 0xe6, 0xf5, 0xcc, 0x7e, 0xe6, 0x20, 0x67, 0x88, 0x9f, 0x84, 0x40, 0x7e, 0xc2, 0x02,
0xc8, 0x66, 0x76, 0x2f, 0xb3, 0x5f, 0x36, 0xe8, 0x37, 0x6b, 0xc3, 0x43, 0x9b, 0xdf, 0x9a, 0xc1, 0x5e, 0xcf, 0xee, 0x67, 0x0e, 0xca, 0x06, 0xfe, 0x26, 0x4d, 0x78, 0x6a, 0xd3, 0x3b, 0x33, 0x78,
0x6b, 0xee, 0x99, 0xbe, 0x3b, 0x97, 0x96, 0x73, 0x6d, 0x5e, 0x09, 0xd1, 0xcc, 0xd1, 0xb1, 0x4d, 0x43, 0x3d, 0xd3, 0x77, 0xe7, 0xdc, 0x72, 0x6e, 0xcd, 0x1b, 0xc6, 0xea, 0x39, 0x3c, 0xb6, 0x69,
0x9b, 0xdf, 0x8e, 0x5e, 0x73, 0xcf, 0x50, 0x9c, 0x13, 0x21, 0xd8, 0xa7, 0xf0, 0x18, 0x0f, 0x78, 0xd3, 0xbb, 0xe1, 0x1b, 0xea, 0x19, 0x92, 0x73, 0xca, 0x18, 0xf9, 0x14, 0xb6, 0xc5, 0x01, 0xcf,
0xbe, 0xf0, 0xf8, 0x9b, 0xd4, 0x91, 0x3c, 0x1d, 0xd9, 0xb2, 0xf9, 0xed, 0x90, 0x98, 0x89, 0x43, 0x67, 0x1e, 0xbd, 0x4f, 0x1d, 0xc9, 0xe3, 0x91, 0x2d, 0x9b, 0xde, 0x0d, 0x90, 0x99, 0x38, 0xb4,
0x7b, 0x50, 0x8d, 0x6f, 0x41, 0x68, 0x81, 0xa0, 0x10, 0x4a, 0x47, 0xc4, 0x7b, 0x50, 0x4f, 0x88, 0x0f, 0x4a, 0x7c, 0x8b, 0x80, 0x16, 0x10, 0x0a, 0xa1, 0x74, 0x81, 0x78, 0x0f, 0xd4, 0x84, 0x58,
0x45, 0xc5, 0x37, 0x08, 0x53, 0x8d, 0xc5, 0x1d, 0xd9, 0x92, 0xe9, 0x50, 0x43, 0x94, 0x6d, 0x39, 0xa1, 0xf8, 0x06, 0x62, 0x94, 0x58, 0x5c, 0xcb, 0xe6, 0x44, 0x87, 0xaa, 0x40, 0xd9, 0x96, 0xc3,
0xc2, 0x27, 0x41, 0x45, 0x02, 0x55, 0x6c, 0x7e, 0x7b, 0x8e, 0x34, 0x94, 0xf4, 0x11, 0x68, 0x68, 0x7c, 0x14, 0x54, 0x44, 0x50, 0xc5, 0xa6, 0x77, 0x97, 0x82, 0x26, 0x24, 0x7d, 0x04, 0x9a, 0xb0,
0x33, 0xd3, 0x9d, 0x4b, 0x73, 0x72, 0xc3, 0x1d, 0x47, 0xcc, 0x9a, 0xa5, 0xbd, 0xcc, 0x7e, 0xfe, 0x99, 0xe9, 0xce, 0xb9, 0x39, 0x9e, 0x52, 0xc7, 0x61, 0xb3, 0x7a, 0x69, 0x3f, 0x73, 0x90, 0x7f,
0x79, 0xb6, 0x99, 0x31, 0xea, 0x33, 0x65, 0xa5, 0x8e, 0xe2, 0xb0, 0x03, 0xd8, 0x74, 0xe7, 0xf2, 0x99, 0xad, 0x67, 0x0c, 0x75, 0x26, 0xad, 0xd4, 0x96, 0x1c, 0x72, 0x08, 0x9b, 0xee, 0x9c, 0xdf,
0xda, 0xc5, 0x47, 0x20, 0xda, 0x0c, 0x84, 0x6c, 0x56, 0xf6, 0x72, 0xfb, 0x79, 0xa3, 0x11, 0x31, 0xba, 0xe2, 0x11, 0x02, 0x6d, 0x06, 0x8c, 0xd7, 0x2b, 0xfb, 0xb9, 0x83, 0xbc, 0x51, 0x8b, 0x18,
0x10, 0x3b, 0x12, 0x12, 0xb1, 0xc1, 0x6b, 0x21, 0x3c, 0x73, 0xe2, 0x3a, 0x57, 0xa6, 0xe4, 0xfe, 0x02, 0x3b, 0x64, 0x5c, 0x60, 0x83, 0x37, 0x8c, 0x79, 0xe6, 0xd8, 0x75, 0x6e, 0x4c, 0x4e, 0xfd,
0xb5, 0x90, 0xcd, 0xf2, 0x5e, 0x66, 0xbf, 0x60, 0x34, 0x88, 0xd1, 0x71, 0x9d, 0xab, 0x31, 0x91, 0x5b, 0xc6, 0xeb, 0xe5, 0xfd, 0xcc, 0x41, 0xc1, 0xa8, 0x21, 0xa3, 0xed, 0x3a, 0x37, 0x23, 0x24,
0xd9, 0xc7, 0xc0, 0x6e, 0xe4, 0x6c, 0x42, 0x50, 0xcb, 0xb7, 0x95, 0xb3, 0x9a, 0x35, 0x02, 0x6f, 0x93, 0x8f, 0x81, 0x4c, 0xf9, 0x6c, 0x8c, 0x50, 0xcb, 0xb7, 0xa5, 0xb3, 0xea, 0x55, 0x04, 0x6f,
0x22, 0xa7, 0x93, 0x64, 0xb0, 0xcf, 0x60, 0x87, 0x8c, 0xe3, 0xcd, 0x2f, 0x67, 0xd6, 0x84, 0x88, 0x0a, 0x4e, 0x3b, 0xc9, 0x20, 0x9f, 0xc3, 0x2e, 0x1a, 0xc7, 0x9b, 0x5f, 0xcf, 0xac, 0x31, 0x12,
0xe6, 0x54, 0xf0, 0xe9, 0xcc, 0x72, 0x44, 0x13, 0x50, 0x7b, 0x63, 0x1b, 0x01, 0xc3, 0x05, 0xff, 0xcd, 0x09, 0xa3, 0x93, 0x99, 0xe5, 0xb0, 0x3a, 0x08, 0xed, 0x8d, 0x1d, 0x01, 0x18, 0x2c, 0xf8,
0x38, 0x64, 0xb3, 0x87, 0x50, 0x98, 0xf1, 0x4b, 0x31, 0x6b, 0x56, 0xc9, 0xaf, 0xea, 0x83, 0xed, 0x27, 0x21, 0x9b, 0x3c, 0x85, 0xc2, 0x8c, 0x5e, 0xb3, 0x59, 0x5d, 0x41, 0xbf, 0xca, 0x0f, 0xb2,
0x42, 0xd9, 0x72, 0x2c, 0x69, 0x71, 0xe9, 0xfa, 0xcd, 0x3a, 0x71, 0x16, 0x04, 0xfd, 0xb7, 0x59, 0x07, 0x65, 0xcb, 0xb1, 0xb8, 0x45, 0xb9, 0xeb, 0xd7, 0x55, 0xe4, 0x2c, 0x08, 0xfa, 0x6f, 0xb3,
0xa8, 0x61, 0xbc, 0xf4, 0x9c, 0xf5, 0xe1, 0xb2, 0xec, 0xb4, 0xec, 0x1d, 0xa7, 0xdd, 0x71, 0x47, 0x50, 0x15, 0xf1, 0xd2, 0x75, 0xd6, 0x87, 0xcb, 0xb2, 0xd3, 0xb2, 0x0f, 0x9c, 0xf6, 0xc0, 0x1d,
0xee, 0xae, 0x3b, 0x76, 0xa0, 0x34, 0xe3, 0x81, 0x34, 0x6f, 0x5c, 0x8f, 0x22, 0xa4, 0x6a, 0x14, 0xb9, 0x87, 0xee, 0xd8, 0x85, 0xd2, 0x8c, 0x06, 0xdc, 0x9c, 0xba, 0x1e, 0x46, 0x88, 0x62, 0x14,
0xf1, 0xfb, 0xd4, 0xf5, 0xd8, 0xbb, 0x50, 0x13, 0xb7, 0x52, 0xf8, 0x0e, 0x9f, 0x99, 0x68, 0x12, 0xc5, 0xf7, 0x99, 0xeb, 0x91, 0x77, 0xa1, 0xca, 0xee, 0x38, 0xf3, 0x1d, 0x3a, 0x33, 0x85, 0x49,
0x0a, 0x8b, 0x92, 0x51, 0x8d, 0x88, 0xa7, 0x72, 0x36, 0x61, 0xfb, 0xa0, 0xc5, 0x86, 0x8c, 0x6c, 0x30, 0x2c, 0x4a, 0x86, 0x12, 0x11, 0xcf, 0xf8, 0x6c, 0x4c, 0x0e, 0x40, 0x8b, 0x0d, 0x19, 0xd9,
0xbe, 0x41, 0x66, 0xac, 0x47, 0x66, 0x0c, 0x4d, 0x1e, 0xdb, 0xa1, 0xb8, 0xd6, 0x0e, 0xa5, 0x65, 0x7c, 0x03, 0xcd, 0xa8, 0x46, 0x66, 0x0c, 0x4d, 0x1e, 0xdb, 0xa1, 0xb8, 0xd6, 0x0e, 0xa5, 0x65,
0x3b, 0xfc, 0x3b, 0x03, 0x55, 0x0a, 0x70, 0x11, 0x78, 0xae, 0x13, 0x08, 0xc6, 0x20, 0x6b, 0x4d, 0x3b, 0xfc, 0x3b, 0x03, 0x0a, 0x06, 0x38, 0x0b, 0x3c, 0xd7, 0x09, 0x18, 0x21, 0x90, 0xb5, 0x26,
0xc9, 0x0a, 0x65, 0x8a, 0x97, 0xac, 0x35, 0xc5, 0x27, 0x58, 0x53, 0xf3, 0xf2, 0x8d, 0x14, 0x01, 0x68, 0x85, 0x32, 0xc6, 0x4b, 0xd6, 0x9a, 0x88, 0x27, 0x58, 0x13, 0xf3, 0xfa, 0x9e, 0xb3, 0x00,
0xbd, 0xb0, 0x6a, 0x14, 0xad, 0xe9, 0x73, 0xfc, 0x64, 0x4f, 0xa1, 0x4a, 0xda, 0xf1, 0xe9, 0xd4, 0x5f, 0xa8, 0x18, 0x45, 0x6b, 0xf2, 0x52, 0x7c, 0x92, 0x17, 0xa0, 0xa0, 0x76, 0x74, 0x32, 0xf1,
0x17, 0x41, 0xa0, 0x52, 0x8b, 0x0e, 0x56, 0x90, 0x7e, 0xa4, 0xc8, 0xec, 0x19, 0x6c, 0x25, 0x61, 0x59, 0x10, 0xc8, 0xd4, 0xc2, 0x83, 0x15, 0x41, 0x6f, 0x49, 0x32, 0x39, 0x82, 0xad, 0x24, 0xcc,
0xa6, 0xe3, 0x1d, 0xbe, 0x0e, 0x6e, 0xc8, 0x1e, 0x65, 0x15, 0x0e, 0x21, 0xb2, 0x4f, 0x0c, 0xf6, 0x74, 0xbc, 0xe3, 0x37, 0xc1, 0x14, 0xed, 0x51, 0x96, 0xe1, 0x10, 0x22, 0x7b, 0xc8, 0x20, 0x1f,
0x51, 0x18, 0x3d, 0x11, 0x5e, 0xc1, 0x0b, 0x04, 0xd7, 0x12, 0xf0, 0x21, 0xa1, 0x9f, 0x42, 0x3d, 0x85, 0xd1, 0x13, 0xe1, 0x25, 0xbc, 0x80, 0x70, 0x2d, 0x01, 0x1f, 0x20, 0xfa, 0x05, 0xa8, 0x01,
0x10, 0xfe, 0x2b, 0xe1, 0x9b, 0xb6, 0x08, 0x02, 0x7e, 0x2d, 0xc8, 0x40, 0x65, 0xa3, 0xa6, 0xa8, 0xf3, 0x5f, 0x33, 0xdf, 0xb4, 0x59, 0x10, 0xd0, 0x5b, 0x86, 0x06, 0x2a, 0x1b, 0x55, 0x49, 0xbd,
0xe7, 0x8a, 0xa8, 0x6b, 0x50, 0x3f, 0x77, 0x1d, 0x4b, 0xba, 0x7e, 0xe8, 0x73, 0xfd, 0x4f, 0x79, 0x94, 0x44, 0x5d, 0x03, 0xf5, 0xd2, 0x75, 0x2c, 0xee, 0xfa, 0xa1, 0xcf, 0xf5, 0x3f, 0xe5, 0x01,
0x00, 0x7c, 0xfd, 0x48, 0x72, 0x39, 0x0f, 0x56, 0x56, 0x0c, 0xb4, 0x46, 0x76, 0xad, 0x35, 0x2a, 0xc4, 0xeb, 0x87, 0x9c, 0xf2, 0x79, 0xb0, 0xb2, 0x62, 0x08, 0x6b, 0x64, 0xd7, 0x5a, 0xa3, 0xb2,
0xcb, 0xd6, 0xc8, 0xcb, 0x37, 0x9e, 0x0a, 0x83, 0xfa, 0xe1, 0xe6, 0xb3, 0xb0, 0x76, 0x3d, 0xc3, 0x6c, 0x8d, 0x3c, 0xbf, 0xf7, 0x64, 0x18, 0xa8, 0xc7, 0x9b, 0x47, 0x61, 0xed, 0x3a, 0x12, 0x77,
0x3b, 0xc6, 0x6f, 0x3c, 0x61, 0x10, 0x9b, 0xed, 0x43, 0x21, 0x90, 0x5c, 0xaa, 0x8a, 0x51, 0x3f, 0x8c, 0xee, 0x3d, 0x66, 0x20, 0x9b, 0x1c, 0x40, 0x21, 0xe0, 0x94, 0xcb, 0x8a, 0xa1, 0x1e, 0x93,
0x64, 0x29, 0x1c, 0xea, 0x22, 0x0c, 0x05, 0x60, 0x5f, 0x40, 0xfd, 0x8a, 0x5b, 0xb3, 0xb9, 0x2f, 0x14, 0x4e, 0xe8, 0xc2, 0x0c, 0x09, 0x20, 0x5f, 0x82, 0x7a, 0x43, 0xad, 0xd9, 0xdc, 0x67, 0xa6,
0x4c, 0x5f, 0xf0, 0xc0, 0x75, 0x28, 0x92, 0xeb, 0x87, 0x8f, 0xe3, 0x23, 0x27, 0x8a, 0x6d, 0x10, 0xcf, 0x68, 0xe0, 0x3a, 0x18, 0xc9, 0xea, 0xf1, 0x76, 0x7c, 0xe4, 0x54, 0xb2, 0x0d, 0xe4, 0x1a,
0xd7, 0xa8, 0x5d, 0x25, 0x3f, 0xd9, 0xfb, 0xd0, 0x08, 0x5d, 0x8d, 0xf9, 0x24, 0x2d, 0x3b, 0xaa, 0xd5, 0x9b, 0xe4, 0x27, 0x79, 0x1f, 0x6a, 0xa1, 0xab, 0x45, 0x3e, 0x71, 0xcb, 0x8e, 0x2a, 0x8f,
0x3c, 0xf5, 0x05, 0x79, 0x6c, 0xd9, 0xa8, 0x91, 0x46, 0x41, 0x3a, 0xf7, 0xa6, 0x5c, 0x0a, 0x85, 0xba, 0x20, 0x8f, 0x2c, 0x5b, 0x68, 0xa4, 0x61, 0x90, 0xce, 0xbd, 0x09, 0xe5, 0x4c, 0x22, 0x65,
0x54, 0xf5, 0xa7, 0x8e, 0xf4, 0x0b, 0x22, 0x13, 0x72, 0xd9, 0xe1, 0xc5, 0xd5, 0x0e, 0x5f, 0xed, 0xfd, 0x51, 0x05, 0xfd, 0x0a, 0xc9, 0x88, 0x5c, 0x76, 0x78, 0x71, 0xb5, 0xc3, 0x57, 0x3b, 0x50,
0xc0, 0xea, 0x1a, 0x07, 0xae, 0x09, 0x8f, 0xda, 0xba, 0xf0, 0x78, 0x07, 0x2a, 0x13, 0x37, 0x90, 0x59, 0xe3, 0xc0, 0x35, 0xe1, 0x51, 0x5d, 0x17, 0x1e, 0xef, 0x40, 0x65, 0xec, 0x06, 0xdc, 0x94,
0xa6, 0xf2, 0x2f, 0x45, 0x75, 0xce, 0x00, 0x24, 0x8d, 0x88, 0xc2, 0x9e, 0x40, 0x95, 0x00, 0xae, 0xfe, 0xc5, 0xa8, 0xce, 0x19, 0x20, 0x48, 0x43, 0xa4, 0x90, 0xe7, 0xa0, 0x20, 0xc0, 0x75, 0xc6,
0x33, 0xb9, 0xe1, 0x96, 0x43, 0x45, 0x2a, 0x67, 0xd0, 0xa1, 0x81, 0x22, 0x61, 0xf2, 0x29, 0xc8, 0x53, 0x6a, 0x39, 0x58, 0xa4, 0x72, 0x06, 0x1e, 0xea, 0x4b, 0x92, 0x48, 0x3e, 0x09, 0xb9, 0xb9,
0xd5, 0x95, 0xc2, 0x80, 0xaa, 0xb7, 0x84, 0x09, 0x69, 0x8b, 0x94, 0x6a, 0x24, 0x52, 0x4a, 0x67, 0x91, 0x18, 0x90, 0xf5, 0x16, 0x31, 0x21, 0x6d, 0x91, 0x52, 0xb5, 0x44, 0x4a, 0xe9, 0x04, 0xb4,
0xa0, 0x9d, 0x59, 0x81, 0x44, 0x6f, 0x05, 0x51, 0x28, 0xfd, 0x04, 0x36, 0x13, 0xb4, 0x30, 0x99, 0x0b, 0x2b, 0xe0, 0xc2, 0x5b, 0x41, 0x14, 0x4a, 0x3f, 0x81, 0xcd, 0x04, 0x2d, 0x4c, 0xa6, 0x0f,
0x3e, 0x80, 0x02, 0x56, 0x8f, 0xa0, 0x99, 0xd9, 0xcb, 0xed, 0x57, 0x0e, 0xb7, 0xee, 0x38, 0x7a, 0xa0, 0x20, 0xaa, 0x47, 0x50, 0xcf, 0xec, 0xe7, 0x0e, 0x2a, 0xc7, 0x5b, 0x0f, 0x1c, 0x3d, 0x0f,
0x1e, 0x18, 0x0a, 0xa1, 0x3f, 0x81, 0x06, 0x12, 0x7b, 0xce, 0x95, 0x1b, 0x55, 0xa4, 0x7a, 0x9c, 0x0c, 0x89, 0xd0, 0x9f, 0x43, 0x4d, 0x10, 0xbb, 0xce, 0x8d, 0x1b, 0x55, 0x24, 0x35, 0x4e, 0x45,
0x8a, 0x55, 0x0c, 0x3c, 0xbd, 0x0e, 0xd5, 0xb1, 0xf0, 0xed, 0xf8, 0xca, 0x5f, 0x43, 0xa3, 0xe7, 0x45, 0x04, 0x9e, 0xae, 0x82, 0x32, 0x62, 0xbe, 0x1d, 0x5f, 0xf9, 0x6b, 0xa8, 0x75, 0x9d, 0x90,
0x84, 0x94, 0xf0, 0xc2, 0x1f, 0x40, 0xc3, 0xb6, 0x1c, 0x55, 0xb2, 0xb8, 0xed, 0xce, 0x1d, 0x19, 0x12, 0x5e, 0xf8, 0x23, 0xa8, 0xd9, 0x96, 0x23, 0x4b, 0x16, 0xb5, 0xdd, 0xb9, 0xc3, 0x43, 0x87,
0x3a, 0xbc, 0x66, 0x5b, 0x0e, 0xca, 0x3f, 0x22, 0x22, 0xe1, 0xa2, 0xd2, 0x16, 0xe2, 0x36, 0x42, 0x57, 0x6d, 0xcb, 0x11, 0xf2, 0x5b, 0x48, 0x44, 0x5c, 0x54, 0xda, 0x42, 0xdc, 0x46, 0x88, 0x93,
0x9c, 0xaa, 0x6e, 0x0a, 0xf7, 0x22, 0x5f, 0xca, 0x68, 0xd9, 0x17, 0xf9, 0x52, 0x56, 0xcb, 0xbd, 0xd5, 0x4d, 0xe2, 0xce, 0xf3, 0xa5, 0x8c, 0x96, 0x3d, 0xcf, 0x97, 0xb2, 0x5a, 0xee, 0x3c, 0x5f,
0xc8, 0x97, 0x72, 0x5a, 0xfe, 0x45, 0xbe, 0x94, 0xd7, 0x0a, 0x2f, 0xf2, 0xa5, 0xa2, 0x56, 0xd2, 0xca, 0x69, 0xf9, 0xf3, 0x7c, 0x29, 0xaf, 0x15, 0xce, 0xf3, 0xa5, 0xa2, 0x56, 0xd2, 0xff, 0x96,
0xff, 0x9a, 0x01, 0x6d, 0x30, 0x97, 0xff, 0x57, 0x15, 0xa8, 0x31, 0x5a, 0x8e, 0x39, 0x99, 0xc9, 0x01, 0xad, 0x3f, 0xe7, 0xff, 0x57, 0x15, 0xb0, 0x31, 0x5a, 0x8e, 0x39, 0x9e, 0xf1, 0xd7, 0xe6,
0x57, 0xe6, 0x54, 0xcc, 0x24, 0x27, 0x77, 0x17, 0x8c, 0xaa, 0x6d, 0x39, 0x9d, 0x99, 0x7c, 0x75, 0x84, 0xcd, 0x38, 0x45, 0x77, 0x17, 0x0c, 0xc5, 0xb6, 0x9c, 0xf6, 0x8c, 0xbf, 0x3e, 0x11, 0xb4,
0x8c, 0xb4, 0xa8, 0x7d, 0x26, 0x50, 0xe5, 0x10, 0xc5, 0x6f, 0x63, 0xd4, 0xf7, 0x3c, 0xe7, 0x0f, 0xa8, 0x7d, 0x26, 0x50, 0xe5, 0x10, 0x45, 0xef, 0x62, 0xd4, 0x0f, 0x3c, 0xe7, 0x0f, 0x19, 0x50,
0x19, 0xa8, 0xfe, 0x6c, 0xee, 0x4a, 0xb1, 0xbe, 0x25, 0x50, 0xe0, 0x2d, 0xea, 0x70, 0x96, 0xee, 0x7e, 0x36, 0x77, 0x39, 0x5b, 0xdf, 0x12, 0x30, 0xf0, 0x16, 0x75, 0x38, 0x8b, 0x77, 0xc0, 0x78,
0x80, 0xc9, 0xa2, 0x06, 0xdf, 0x29, 0xe9, 0xb9, 0x15, 0x25, 0xfd, 0xde, 0x66, 0x97, 0xbf, 0xb7, 0x51, 0x83, 0x1f, 0x94, 0xf4, 0xdc, 0x8a, 0x92, 0xfe, 0x68, 0xb3, 0xcb, 0x3f, 0xda, 0xec, 0xf4,
0xd9, 0xe9, 0xbf, 0xcb, 0xa0, 0xd7, 0x43, 0x35, 0x43, 0x93, 0xef, 0x41, 0x35, 0x6a, 0x52, 0x66, 0xdf, 0x65, 0x84, 0xd7, 0x43, 0x35, 0x43, 0x93, 0xef, 0x83, 0x12, 0x35, 0x29, 0x33, 0xa0, 0x91,
0xc0, 0x23, 0x85, 0x21, 0x50, 0x5d, 0x6a, 0xc4, 0x69, 0xca, 0xa1, 0x04, 0xa3, 0x1b, 0x83, 0x9b, 0xc2, 0x10, 0xc8, 0x2e, 0x35, 0xa4, 0x38, 0xe5, 0x60, 0x82, 0xe1, 0x8d, 0xc1, 0x34, 0x46, 0x86,
0x18, 0x19, 0x4e, 0x39, 0xc8, 0x1b, 0x2a, 0x56, 0x78, 0xe0, 0x6d, 0x80, 0x84, 0x2d, 0x0b, 0xf4, 0x53, 0x8e, 0xe0, 0x0d, 0x24, 0x2b, 0x3c, 0xf0, 0x36, 0x40, 0xc2, 0x96, 0x05, 0x7c, 0x67, 0x79,
0xce, 0xf2, 0x24, 0x61, 0x48, 0x65, 0xc2, 0xbc, 0x56, 0xd0, 0xff, 0xae, 0xa2, 0xe0, 0x7f, 0x55, 0x9c, 0x30, 0xa4, 0x34, 0x61, 0x5e, 0x2b, 0xe8, 0x7f, 0x97, 0x51, 0xf0, 0xbf, 0xaa, 0xf4, 0x1e,
0xe9, 0x3d, 0xa8, 0x2f, 0x86, 0x1d, 0xc2, 0xa8, 0xfe, 0x5a, 0xf5, 0xa2, 0x69, 0x07, 0x51, 0x1f, 0xa8, 0x8b, 0x61, 0x07, 0x31, 0xb2, 0xbf, 0x2a, 0x5e, 0x34, 0xed, 0x08, 0xd4, 0x87, 0x61, 0x1d,
0x86, 0x75, 0x44, 0xcd, 0x1d, 0x69, 0xb5, 0x1b, 0xc8, 0x19, 0x21, 0x23, 0x14, 0x49, 0xf3, 0x09, 0x91, 0x73, 0x47, 0x5a, 0xed, 0x9a, 0xe0, 0x0c, 0x05, 0x23, 0x14, 0x89, 0xf3, 0x89, 0xb0, 0x2b,
0xda, 0x95, 0xbf, 0xb1, 0x85, 0x23, 0x4d, 0x1a, 0xf6, 0x54, 0xcf, 0x6d, 0x90, 0x3d, 0x15, 0xfd, 0xbd, 0xb7, 0x99, 0xc3, 0x4d, 0x1c, 0xf6, 0x64, 0xcf, 0xad, 0xa1, 0x3d, 0x25, 0xfd, 0x44, 0xf8,
0x18, 0x7d, 0x7b, 0xff, 0x03, 0xf5, 0x06, 0xd4, 0xc6, 0xee, 0x37, 0xc2, 0x89, 0x93, 0xed, 0x73, 0xf6, 0xf1, 0x07, 0xea, 0x35, 0xa8, 0x8e, 0xdc, 0x6f, 0x99, 0x13, 0x27, 0xdb, 0x17, 0xa0, 0x46,
0xa8, 0x47, 0x84, 0xf0, 0x89, 0x07, 0xb0, 0x21, 0x89, 0x12, 0x66, 0xf7, 0xa2, 0x8c, 0x9f, 0x05, 0x84, 0xf0, 0x89, 0x87, 0xb0, 0xc1, 0x91, 0x12, 0x66, 0xf7, 0xa2, 0x8c, 0x5f, 0x04, 0x94, 0x23,
0x5c, 0x12, 0xd8, 0x08, 0x11, 0xfa, 0x9f, 0xb3, 0x50, 0x8e, 0xa9, 0x18, 0x24, 0x97, 0x3c, 0x10, 0xd8, 0x08, 0x11, 0xfa, 0x9f, 0xb3, 0x50, 0x8e, 0xa9, 0x22, 0x48, 0xae, 0x69, 0xc0, 0x4c, 0x9b,
0xa6, 0xcd, 0x27, 0xdc, 0x77, 0x5d, 0x27, 0xcc, 0xf1, 0x2a, 0x12, 0xcf, 0x43, 0x1a, 0x96, 0xb0, 0x8e, 0xa9, 0xef, 0xba, 0x4e, 0x98, 0xe3, 0x8a, 0x20, 0x5e, 0x86, 0x34, 0x51, 0xc2, 0xa2, 0x77,
0xe8, 0x1d, 0x37, 0x3c, 0xb8, 0x21, 0xeb, 0x54, 0x8d, 0x4a, 0x48, 0x3b, 0xe5, 0xc1, 0x0d, 0xfb, 0x4c, 0x69, 0x30, 0x45, 0xeb, 0x28, 0x46, 0x25, 0xa4, 0x9d, 0xd1, 0x60, 0x4a, 0x3e, 0x00, 0x2d,
0x00, 0xb4, 0x08, 0xe2, 0xf9, 0xc2, 0xb2, 0xb1, 0xf3, 0xa9, 0xfe, 0xdc, 0x08, 0xe9, 0xc3, 0x90, 0x82, 0x78, 0x3e, 0xb3, 0x6c, 0xd1, 0xf9, 0x64, 0x7f, 0xae, 0x85, 0xf4, 0x41, 0x48, 0x16, 0x05,
0x8c, 0x05, 0x5e, 0x25, 0x99, 0xe9, 0x71, 0x6b, 0x6a, 0xda, 0x68, 0x45, 0x35, 0xaf, 0xd6, 0x15, 0x5e, 0x26, 0x99, 0xe9, 0x51, 0x6b, 0x62, 0xda, 0xc2, 0x8a, 0x72, 0x5e, 0x55, 0x25, 0x7d, 0x40,
0x7d, 0xc8, 0xad, 0xe9, 0x79, 0xc0, 0x25, 0xfb, 0x04, 0x1e, 0x25, 0x86, 0xda, 0x04, 0x5c, 0x65, 0xad, 0xc9, 0x65, 0x40, 0x39, 0xf9, 0x04, 0x9e, 0x25, 0x86, 0xda, 0x04, 0x5c, 0x66, 0x31, 0xf1,
0x31, 0xf3, 0xe3, 0xa9, 0x36, 0x3e, 0xf2, 0x04, 0xaa, 0xd8, 0x31, 0xcc, 0x89, 0x2f, 0xb8, 0x14, 0xe3, 0xa9, 0x36, 0x3e, 0xf2, 0x1c, 0x14, 0xd1, 0x31, 0xcc, 0xb1, 0xcf, 0x28, 0x67, 0x93, 0x30,
0xd3, 0x30, 0x8f, 0x2b, 0x48, 0xeb, 0x28, 0x12, 0x6b, 0x42, 0x51, 0xdc, 0x7a, 0x96, 0x2f, 0xa6, 0x8f, 0x2b, 0x82, 0xd6, 0x96, 0x24, 0x52, 0x87, 0x22, 0xbb, 0xf3, 0x2c, 0x9f, 0x4d, 0xb0, 0x63,
0xd4, 0x31, 0x4a, 0x46, 0xf4, 0x89, 0x87, 0x03, 0xe9, 0xfa, 0xfc, 0x5a, 0x98, 0x0e, 0xb7, 0x45, 0x94, 0x8c, 0xe8, 0x53, 0x1c, 0x0e, 0xb8, 0xeb, 0xd3, 0x5b, 0x66, 0x3a, 0xd4, 0x66, 0xe1, 0x88,
0x38, 0xa2, 0x54, 0x42, 0x5a, 0x9f, 0xdb, 0x42, 0x7f, 0x0b, 0x76, 0xbe, 0x14, 0xf2, 0xcc, 0xfa, 0x52, 0x09, 0x69, 0x3d, 0x6a, 0x33, 0xfd, 0x2d, 0xd8, 0xfd, 0x8a, 0xf1, 0x0b, 0xeb, 0xbb, 0xb9,
0x76, 0x6e, 0x4d, 0x2d, 0xf9, 0x66, 0xc8, 0x7d, 0xbe, 0xa8, 0x82, 0x7f, 0x2b, 0xc0, 0x56, 0x9a, 0x35, 0xb1, 0xf8, 0xfd, 0x80, 0xfa, 0x74, 0x51, 0x05, 0xff, 0x5a, 0x80, 0xad, 0x34, 0x8b, 0x71,
0x25, 0xa4, 0xf0, 0xb1, 0x03, 0x15, 0xfc, 0xf9, 0x4c, 0x44, 0xde, 0x59, 0x74, 0xcc, 0x18, 0x6c, 0xe6, 0x8b, 0x0e, 0x54, 0xf0, 0xe7, 0x33, 0x16, 0x79, 0x67, 0xd1, 0x31, 0x63, 0xb0, 0x31, 0x9f,
0xcc, 0x67, 0xc2, 0x50, 0x20, 0xf6, 0x05, 0xec, 0x2e, 0x42, 0xcc, 0xc7, 0x1e, 0x18, 0x70, 0x69, 0x31, 0x43, 0x82, 0xc8, 0x97, 0xb0, 0xb7, 0x08, 0x31, 0x5f, 0xf4, 0xc0, 0x80, 0x72, 0xd3, 0x63,
0x7a, 0xc2, 0x37, 0x5f, 0x61, 0xa7, 0x27, 0xeb, 0x53, 0x56, 0xaa, 0x68, 0x33, 0xb8, 0xc4, 0x88, 0xbe, 0xf9, 0x5a, 0x74, 0x7a, 0xb4, 0x3e, 0x66, 0xa5, 0x8c, 0x36, 0x83, 0x72, 0x11, 0x71, 0x03,
0x1b, 0x0a, 0xff, 0x25, 0xb2, 0xd9, 0xfb, 0xa0, 0x25, 0x47, 0x45, 0xd3, 0xf3, 0x6c, 0xf2, 0x44, 0xe6, 0xbf, 0x12, 0x6c, 0xf2, 0x3e, 0x68, 0xc9, 0x51, 0xd1, 0xf4, 0x3c, 0x1b, 0x3d, 0x91, 0x8f,
0x3e, 0xae, 0x66, 0x68, 0x2f, 0xcf, 0x66, 0x1f, 0x03, 0xee, 0x07, 0x66, 0xca, 0xc2, 0x9e, 0x1d, 0xab, 0x99, 0xb0, 0x97, 0x67, 0x93, 0x8f, 0x41, 0xec, 0x07, 0x66, 0xca, 0xc2, 0x9e, 0x1d, 0x26,
0x26, 0x3d, 0xca, 0x58, 0x2c, 0x0d, 0x08, 0xff, 0x0c, 0x5a, 0xab, 0x97, 0x0d, 0x3a, 0x55, 0xa0, 0xbd, 0x90, 0xb1, 0x58, 0x1a, 0x04, 0xfc, 0x73, 0x68, 0xac, 0x5e, 0x36, 0xf0, 0x54, 0x01, 0x4f,
0x53, 0x8f, 0x57, 0x2c, 0x1c, 0x78, 0x36, 0xbd, 0x51, 0xa0, 0x07, 0x37, 0x08, 0xbf, 0xd8, 0x28, 0x6d, 0xaf, 0x58, 0x38, 0xc4, 0xd9, 0xf4, 0x46, 0x21, 0x3c, 0xb8, 0x81, 0xf8, 0xc5, 0x46, 0x21,
0x30, 0x67, 0x3e, 0x80, 0xcd, 0xd4, 0x08, 0x4b, 0xc0, 0x22, 0x01, 0xeb, 0x89, 0x31, 0x36, 0x4e, 0x72, 0xe6, 0x03, 0xd8, 0x4c, 0x8d, 0xb0, 0x08, 0x2c, 0x22, 0x50, 0x4d, 0x8c, 0xb1, 0x71, 0x7a,
0xaf, 0xe5, 0xf1, 0xbf, 0xb4, 0x7a, 0xfc, 0x7f, 0x06, 0x5b, 0xd1, 0xe0, 0x72, 0xc9, 0x27, 0xdf, 0x2d, 0x8f, 0xff, 0xa5, 0xd5, 0xe3, 0xff, 0x11, 0x6c, 0x45, 0x83, 0xcb, 0x35, 0x1d, 0x7f, 0xeb,
0xb8, 0x57, 0x57, 0x66, 0x20, 0x26, 0x54, 0x94, 0xf3, 0xc6, 0x66, 0xc8, 0x7a, 0xae, 0x38, 0x23, 0xde, 0xdc, 0x98, 0x01, 0x1b, 0x63, 0x51, 0xce, 0x1b, 0x9b, 0x21, 0xeb, 0xa5, 0xe4, 0x0c, 0xd9,
0x31, 0xc1, 0x49, 0x9a, 0xcf, 0xa5, 0x6b, 0x46, 0x9b, 0x0b, 0x75, 0xe3, 0x92, 0x51, 0x41, 0x62, 0x98, 0x34, 0xa0, 0x44, 0xe7, 0xdc, 0x15, 0x3e, 0xc2, 0x46, 0x5c, 0x32, 0xe2, 0x6f, 0x21, 0x2b,
0xb8, 0xd7, 0xa1, 0xed, 0x08, 0x83, 0x8b, 0xcd, 0xe5, 0x7c, 0x7a, 0x2d, 0x54, 0xd9, 0xa8, 0x28, 0xfa, 0x6d, 0x5e, 0xcf, 0x27, 0xb7, 0x4c, 0x96, 0x8b, 0x8a, 0x94, 0x15, 0xb1, 0x5e, 0x22, 0x47,
0xdb, 0x21, 0x6b, 0x30, 0x97, 0xcf, 0x89, 0x81, 0xea, 0xfe, 0x08, 0x76, 0xee, 0xc0, 0x25, 0xf7, 0xe8, 0xf9, 0x19, 0xec, 0x3e, 0xc0, 0x73, 0xea, 0x73, 0xd4, 0x40, 0x91, 0x36, 0x5b, 0x3a, 0x25,
0x25, 0x29, 0x52, 0xa5, 0x43, 0x8f, 0xd2, 0x87, 0x90, 0x8b, 0xca, 0x7c, 0x08, 0x8c, 0x4e, 0xa2, 0xd8, 0x42, 0x8d, 0x0f, 0x81, 0x08, 0x8e, 0x29, 0x4c, 0x62, 0x39, 0xe6, 0xcd, 0xcc, 0xba, 0x9d,
0x61, 0x2c, 0xc7, 0xbc, 0x9a, 0x59, 0xd7, 0x37, 0x92, 0xa6, 0x91, 0xbc, 0xd1, 0x40, 0xce, 0x39, 0x72, 0x9c, 0x43, 0xf2, 0x46, 0x4d, 0x70, 0x2e, 0xe9, 0x5d, 0xd7, 0x39, 0x45, 0xf2, 0xaa, 0x4e,
0xbf, 0xed, 0x39, 0x27, 0x44, 0x5e, 0xd5, 0xef, 0xea, 0xa1, 0xe7, 0xbf, 0xaf, 0xdf, 0x35, 0x52, 0xa7, 0x86, 0x3e, 0xff, 0xa1, 0x4e, 0x57, 0x4b, 0xc5, 0x86, 0xc4, 0xe9, 0x7f, 0xc9, 0x40, 0x35,
0x11, 0xa2, 0x70, 0xfa, 0x5f, 0x32, 0x50, 0x4b, 0x85, 0x28, 0x95, 0x2a, 0xb5, 0xad, 0x99, 0xe1, 0x15, 0x9c, 0x58, 0xa4, 0xe4, 0x9e, 0x66, 0x86, 0x93, 0x40, 0xde, 0x28, 0x87, 0x94, 0xee, 0x84,
0x3c, 0x90, 0x37, 0xca, 0x21, 0xa5, 0x37, 0x65, 0xcf, 0xc2, 0xa1, 0x33, 0x4b, 0x93, 0x61, 0x6b, 0x1c, 0x85, 0xe3, 0x66, 0x16, 0x67, 0xc2, 0xc6, 0xea, 0x08, 0x4f, 0xcc, 0x9d, 0x1f, 0x03, 0xb1,
0x75, 0x9c, 0x27, 0xa6, 0xcf, 0x8f, 0x81, 0x59, 0xce, 0xc4, 0xb5, 0x31, 0x92, 0xe4, 0x8d, 0x2f, 0x9c, 0xb1, 0x6b, 0x8b, 0x18, 0xe2, 0x53, 0x9f, 0x05, 0x53, 0x77, 0x36, 0xc1, 0x38, 0xad, 0x1a,
0x82, 0x1b, 0x77, 0x36, 0xa5, 0x68, 0xad, 0x19, 0x9b, 0x11, 0x67, 0x1c, 0x31, 0x10, 0x1e, 0x2f, 0x9b, 0x11, 0x67, 0x14, 0x31, 0x04, 0x3c, 0x5e, 0x0d, 0x17, 0xf0, 0xbc, 0x84, 0x47, 0x9c, 0x18,
0x88, 0x0b, 0x78, 0x5e, 0xc1, 0x23, 0x4e, 0x0c, 0xd7, 0xbf, 0x86, 0x9d, 0xd1, 0xba, 0x5c, 0x65, 0xae, 0x7f, 0x03, 0xbb, 0xc3, 0x75, 0x59, 0x4a, 0xbe, 0x00, 0xf0, 0xe2, 0xdc, 0xc4, 0x97, 0x54,
0x9f, 0x03, 0x78, 0x71, 0x86, 0xd2, 0x4b, 0x2a, 0x87, 0xbb, 0x77, 0x15, 0x5e, 0x64, 0xb1, 0x91, 0x8e, 0xf7, 0x1e, 0x2a, 0xbc, 0xc8, 0x5f, 0x23, 0x81, 0xd7, 0xf7, 0xa0, 0xb1, 0x4a, 0xb4, 0x2c,
0xc0, 0xeb, 0xbb, 0xd0, 0x5a, 0x25, 0x5a, 0x95, 0x63, 0xfd, 0x11, 0x6c, 0x8d, 0xe6, 0xd7, 0xd7, 0xc4, 0xfa, 0x33, 0xd8, 0x1a, 0xce, 0x6f, 0x6f, 0xd9, 0xd2, 0x44, 0x76, 0x0e, 0x4f, 0xd3, 0xe4,
0x62, 0x69, 0x2e, 0x7b, 0x01, 0x0f, 0xd3, 0xe4, 0xb0, 0x7a, 0x1f, 0x42, 0x29, 0x8e, 0x35, 0x55, 0xb0, 0x6e, 0x1f, 0x43, 0x29, 0xda, 0x8f, 0xc3, 0xda, 0xb0, 0xb3, 0x50, 0x24, 0xf5, 0x17, 0x82,
0x21, 0xb6, 0x17, 0x8a, 0xa4, 0xfe, 0x48, 0x30, 0x8a, 0xe1, 0xca, 0x7c, 0xf0, 0x14, 0x4a, 0xd1, 0x51, 0x0c, 0x97, 0xe5, 0xc3, 0x17, 0x50, 0x8a, 0x66, 0x78, 0xa2, 0x40, 0xe9, 0xa2, 0xdf, 0x1f,
0x24, 0xcf, 0xaa, 0x50, 0x3a, 0x1b, 0x0c, 0x86, 0xe6, 0xe0, 0x62, 0xac, 0x3d, 0x60, 0x15, 0x28, 0x98, 0xfd, 0xab, 0x91, 0xf6, 0x84, 0x54, 0xa0, 0x88, 0x5f, 0xdd, 0x9e, 0x96, 0x39, 0x0c, 0xa0,
0xd2, 0x57, 0xaf, 0xaf, 0x65, 0x0e, 0x02, 0x28, 0xc7, 0x83, 0x3c, 0xab, 0x41, 0xb9, 0xd7, 0xef, 0x1c, 0x8f, 0xf0, 0xa4, 0x0a, 0xe5, 0x6e, 0xaf, 0x3b, 0xea, 0xb6, 0x46, 0x9d, 0x13, 0xed, 0x09,
0x8d, 0x7b, 0x47, 0xe3, 0xee, 0xb1, 0xf6, 0x80, 0x3d, 0x82, 0xcd, 0xa1, 0xd1, 0xed, 0x9d, 0x1f, 0x79, 0x06, 0x9b, 0x03, 0xa3, 0xd3, 0xbd, 0x6c, 0x7d, 0xd5, 0x31, 0x8d, 0xce, 0xab, 0x4e, 0xeb,
0x7d, 0xd9, 0x35, 0x8d, 0xee, 0xcb, 0xee, 0xd1, 0x59, 0xf7, 0x58, 0xcb, 0x30, 0x06, 0xf5, 0xd3, 0xa2, 0x73, 0xa2, 0x65, 0x08, 0x01, 0xf5, 0x6c, 0x74, 0xd1, 0x36, 0x07, 0x57, 0x2f, 0x2f, 0xba,
0xf1, 0x59, 0xc7, 0x1c, 0x5e, 0x3c, 0x3f, 0xeb, 0x8d, 0x4e, 0xbb, 0xc7, 0x5a, 0x16, 0x65, 0x8e, 0xc3, 0xb3, 0xce, 0x89, 0x96, 0x15, 0x32, 0x87, 0x57, 0xed, 0x76, 0x67, 0x38, 0xd4, 0x72, 0x04,
0x2e, 0x3a, 0x9d, 0xee, 0x68, 0xa4, 0xe5, 0x18, 0xc0, 0xc6, 0xc9, 0x51, 0x0f, 0xc1, 0x79, 0xb6, 0x60, 0xe3, 0xb4, 0xd5, 0x15, 0xe0, 0x3c, 0xd9, 0x82, 0x5a, 0xb7, 0xf7, 0xaa, 0xdf, 0x6d, 0x77,
0x05, 0x8d, 0x5e, 0xff, 0xe5, 0xa0, 0xd7, 0xe9, 0x9a, 0xa3, 0xee, 0x78, 0x8c, 0xc4, 0xc2, 0xc1, 0xcc, 0x61, 0x67, 0x34, 0x12, 0xc4, 0xc2, 0xe1, 0x7f, 0x32, 0x50, 0x4d, 0x6d, 0x01, 0x64, 0x07,
0x7f, 0x32, 0x50, 0x4b, 0xed, 0x02, 0x6c, 0x1b, 0xb6, 0xf0, 0xc8, 0x85, 0x81, 0x37, 0x1d, 0x8d, 0xb6, 0xc4, 0x91, 0x2b, 0x43, 0xdc, 0xd4, 0x1a, 0xf6, 0x7b, 0x66, 0xaf, 0xdf, 0xeb, 0x68, 0x4f,
0x06, 0x7d, 0xb3, 0x3f, 0xe8, 0x77, 0xb5, 0x07, 0xec, 0x2d, 0xd8, 0x5e, 0x62, 0x0c, 0x4e, 0x4e, 0xc8, 0x5b, 0xb0, 0xb3, 0xc4, 0xe8, 0x9f, 0x9e, 0xb6, 0xcf, 0x5a, 0x42, 0x79, 0xd2, 0x80, 0xed,
0x3a, 0xa7, 0x47, 0xa8, 0x3c, 0x6b, 0xc1, 0xe3, 0x25, 0xe6, 0xb8, 0x77, 0xde, 0xc5, 0x57, 0x66, 0x25, 0xe6, 0xa8, 0x7b, 0xd9, 0x11, 0xaf, 0xcc, 0x92, 0x7d, 0xd8, 0x5b, 0xe2, 0x0d, 0xbf, 0xee,
0xd9, 0x1e, 0xec, 0x2e, 0xf1, 0x46, 0x5f, 0x75, 0xbb, 0xc3, 0x18, 0x91, 0x63, 0x4f, 0xe1, 0xc9, 0x74, 0x06, 0x31, 0x22, 0x47, 0x5e, 0xc0, 0xf3, 0x25, 0x44, 0xb7, 0x37, 0xbc, 0x3a, 0x3d, 0xed,
0x12, 0xa2, 0xd7, 0x1f, 0x5d, 0x9c, 0x9c, 0xf4, 0x3a, 0xbd, 0x6e, 0x7f, 0x6c, 0xbe, 0x3c, 0x3a, 0xb6, 0xbb, 0x9d, 0xde, 0xc8, 0x7c, 0xd5, 0xba, 0xb8, 0xea, 0x68, 0x79, 0xb2, 0x07, 0xf5, 0xe5,
0xbb, 0xe8, 0x6a, 0x79, 0xb6, 0x0b, 0xcd, 0xe5, 0x4b, 0xba, 0xe7, 0xc3, 0x81, 0x71, 0x64, 0x7c, 0x4b, 0x3a, 0x97, 0x83, 0xbe, 0xd1, 0x32, 0xbe, 0xd1, 0x0a, 0xe4, 0x5d, 0x78, 0xe7, 0x81, 0x90,
0xad, 0x15, 0xd8, 0xbb, 0xf0, 0xce, 0x1d, 0x21, 0x9d, 0x81, 0x61, 0x74, 0x3b, 0x63, 0xf3, 0xe8, 0x76, 0xdf, 0x30, 0x3a, 0xed, 0x91, 0xd9, 0xba, 0xec, 0x5f, 0xf5, 0x46, 0xda, 0xc6, 0x61, 0x53,
0x7c, 0x70, 0xd1, 0x1f, 0x6b, 0x1b, 0x07, 0x6d, 0x9c, 0xb7, 0x97, 0x02, 0x1c, 0x4d, 0x76, 0xd1, 0x4c, 0xda, 0x4b, 0x01, 0x2e, 0x4c, 0x76, 0xd5, 0xfb, 0x69, 0xaf, 0xff, 0x75, 0x4f, 0x7b, 0x22,
0xff, 0x69, 0x7f, 0xf0, 0x55, 0x5f, 0x7b, 0x80, 0x96, 0x1f, 0x9f, 0x1a, 0xdd, 0xd1, 0xe9, 0xe0, 0x2c, 0x3f, 0x3a, 0x33, 0x3a, 0xc3, 0xb3, 0xfe, 0xc5, 0x89, 0x96, 0x39, 0xfe, 0x67, 0x59, 0x6e,
0xec, 0x58, 0xcb, 0x1c, 0xfe, 0xb3, 0xac, 0x76, 0xbd, 0x0e, 0xfd, 0xbb, 0xc4, 0x0c, 0x28, 0x46, 0x79, 0x6d, 0xfc, 0x5f, 0x89, 0x18, 0x50, 0x0c, 0xdd, 0x4c, 0xd6, 0x39, 0xbe, 0xf1, 0x2c, 0x35,
0x75, 0x65, 0x9d, 0xe3, 0x5b, 0x8f, 0x52, 0xf3, 0x7a, 0x1c, 0x69, 0xdb, 0xbf, 0xf9, 0xc7, 0xbf, 0xa9, 0xc7, 0x91, 0xb6, 0xf3, 0x9b, 0x7f, 0xfc, 0xeb, 0xf7, 0xd9, 0x4d, 0x5d, 0x69, 0xbe, 0xfe,
0x7e, 0x9f, 0xdd, 0xd4, 0xab, 0xed, 0x57, 0x9f, 0xb4, 0x11, 0xd1, 0x76, 0xe7, 0xf2, 0xb3, 0xcc, 0xa4, 0x29, 0x10, 0x4d, 0x77, 0xce, 0x3f, 0xcf, 0x1c, 0x92, 0x3e, 0x6c, 0xc8, 0x7f, 0x13, 0xc8,
0x01, 0x1b, 0xc0, 0x86, 0xfa, 0x4f, 0x81, 0x3d, 0x4e, 0x89, 0x8c, 0xff, 0x64, 0x58, 0x27, 0xf1, 0x76, 0x4a, 0x64, 0xfc, 0xf7, 0xc2, 0x3a, 0x89, 0xdb, 0x28, 0x51, 0xd3, 0x2b, 0xb1, 0x44, 0xcb,
0x31, 0x49, 0xd4, 0xf4, 0x4a, 0x2c, 0xd1, 0x72, 0x50, 0xe0, 0x8f, 0xa1, 0x18, 0x6e, 0xac, 0x09, 0x11, 0x02, 0x3f, 0x83, 0x62, 0xb8, 0xab, 0x26, 0x94, 0x4c, 0x6f, 0xaf, 0x8d, 0x55, 0xeb, 0xc4,
0x25, 0xd3, 0x3b, 0x6c, 0x6b, 0xd5, 0x52, 0xf1, 0xc3, 0x0c, 0xfb, 0x39, 0x94, 0xe3, 0x7d, 0x84, 0x8f, 0x33, 0xe4, 0xe7, 0x50, 0x8e, 0x37, 0x11, 0xb2, 0x9b, 0xc8, 0xb1, 0x74, 0x7e, 0x34, 0x1a,
0xed, 0x24, 0x72, 0x2c, 0x9d, 0x1f, 0xad, 0xd6, 0x2a, 0x56, 0x5a, 0x2d, 0x56, 0x8f, 0xd5, 0xa2, 0xab, 0x58, 0x69, 0xb5, 0x88, 0x1a, 0xab, 0x85, 0x5b, 0x0a, 0xb9, 0x92, 0x79, 0x20, 0xb6, 0x14,
0x5d, 0x85, 0x5d, 0xa8, 0x3c, 0xc0, 0x5d, 0x85, 0x35, 0x53, 0xd7, 0x27, 0xd6, 0x97, 0x95, 0x8a, 0x52, 0x4f, 0x5d, 0x9f, 0x58, 0x5c, 0x56, 0x2a, 0xa6, 0x37, 0x50, 0xe4, 0x53, 0x42, 0x52, 0x22,
0xe9, 0x2d, 0x12, 0xf9, 0x90, 0xb1, 0x94, 0xc8, 0xf6, 0x77, 0xd6, 0xf4, 0x97, 0xec, 0x17, 0x50, 0x9b, 0xdf, 0x5b, 0x93, 0x5f, 0x92, 0x5f, 0x80, 0x12, 0x3a, 0x00, 0x77, 0x09, 0xb2, 0x30, 0x56,
0x0d, 0x1d, 0x40, 0x1b, 0x05, 0x5b, 0x18, 0x2b, 0xb9, 0xf6, 0xb4, 0x16, 0x8f, 0x59, 0xde, 0x3d, 0x72, 0xe1, 0x69, 0x2c, 0x1e, 0xb3, 0xbc, 0x75, 0xac, 0x90, 0xee, 0xce, 0x79, 0x93, 0xa3, 0xb4,
0x56, 0x48, 0x77, 0xe7, 0xb2, 0x2d, 0x49, 0xda, 0x65, 0x2c, 0x9d, 0x26, 0xd5, 0x84, 0xf4, 0xe4, 0xeb, 0x58, 0x3a, 0xce, 0xa8, 0x09, 0xe9, 0xc9, 0x69, 0x3f, 0x2d, 0x3d, 0x35, 0xcd, 0xea, 0xfb,
0xcc, 0x9f, 0x96, 0x9e, 0x9a, 0x69, 0xf5, 0x3d, 0x92, 0xde, 0x62, 0xcd, 0x94, 0xf4, 0x6f, 0x11, 0x28, 0xbd, 0x41, 0xea, 0x29, 0xe9, 0xdf, 0x09, 0x4c, 0xf3, 0x7b, 0x6a, 0x73, 0xf1, 0x02, 0x55,
0xd3, 0xfe, 0x8e, 0xdb, 0x12, 0x5f, 0x50, 0xc7, 0x41, 0x85, 0x5c, 0x7e, 0xef, 0x1b, 0x16, 0x56, 0x8c, 0x28, 0xe8, 0xf2, 0x47, 0xdf, 0xb0, 0xb0, 0xda, 0xd2, 0xee, 0xa6, 0xef, 0xe2, 0x25, 0x5b,
0x5b, 0xda, 0xe0, 0xf4, 0x1d, 0xba, 0x64, 0x8b, 0x6d, 0x26, 0x42, 0x21, 0x7e, 0xc1, 0x42, 0xfa, 0x64, 0x33, 0x11, 0x0a, 0xf1, 0x0b, 0x16, 0xd2, 0x1f, 0x7d, 0x43, 0x52, 0x7a, 0xfa, 0x09, 0xef,
0xbd, 0x6f, 0x48, 0x4a, 0x4f, 0x3f, 0xe1, 0x1d, 0x92, 0xbe, 0xc3, 0xb6, 0x93, 0xd2, 0x93, 0x2f, 0xa0, 0xf4, 0x5d, 0xb2, 0x93, 0x94, 0x9e, 0x7c, 0xc1, 0x37, 0x50, 0x15, 0x77, 0x44, 0x43, 0x6a,
0xf8, 0x1a, 0x6a, 0x78, 0x47, 0x34, 0xaa, 0x06, 0x89, 0x48, 0x4e, 0xcd, 0xc3, 0xad, 0xed, 0x3b, 0x90, 0x88, 0xe4, 0xd4, 0x24, 0xdc, 0xd8, 0x79, 0x40, 0x4f, 0x67, 0x07, 0xa9, 0xe1, 0x15, 0x01,
0xf4, 0x74, 0x76, 0xb0, 0x06, 0x5d, 0x11, 0x70, 0xd9, 0x56, 0x33, 0x30, 0x93, 0xc0, 0xee, 0x4e, 0xe5, 0x4d, 0x39, 0xfd, 0x12, 0x0e, 0xe4, 0xe1, 0xfc, 0x46, 0xf4, 0x58, 0xce, 0xda, 0xe1, 0xae,
0x71, 0x4c, 0x8f, 0xe5, 0xac, 0x1d, 0xf1, 0x5a, 0xf7, 0xb6, 0x08, 0x7d, 0x97, 0x2e, 0x7c, 0xcc, 0xf1, 0x68, 0x8b, 0xd0, 0xf7, 0xf0, 0xc2, 0x6d, 0xf2, 0x14, 0x2f, 0x8c, 0x00, 0x4d, 0x4f, 0xca,
0x1e, 0xd2, 0x85, 0x11, 0xa0, 0xed, 0x29, 0xf9, 0xbf, 0x02, 0x36, 0xba, 0xef, 0xd6, 0xb5, 0xcd, 0xff, 0x15, 0x90, 0xe1, 0x63, 0xb7, 0xae, 0x6d, 0x56, 0x8d, 0x77, 0x1f, 0xc5, 0xa4, 0x0d, 0xaa,
0xaa, 0xf5, 0xee, 0xbd, 0x98, 0xb4, 0x41, 0xf5, 0x95, 0x97, 0x63, 0x0a, 0x0b, 0xa8, 0x26, 0xfb, 0xaf, 0xbc, 0x5c, 0xa4, 0x30, 0x03, 0x25, 0xd9, 0x7f, 0xc8, 0xe2, 0x2d, 0x2b, 0xba, 0x55, 0xe3,
0x0f, 0x5b, 0xbc, 0x65, 0x45, 0xb7, 0x6a, 0xbd, 0xbd, 0x86, 0x1b, 0xde, 0xd6, 0xa4, 0xdb, 0x18, 0xed, 0x35, 0xdc, 0xf0, 0xb6, 0x3a, 0xde, 0x46, 0x88, 0x26, 0x6e, 0x13, 0x83, 0x48, 0x33, 0x90,
0xd3, 0xf0, 0x36, 0x1c, 0x44, 0xda, 0x81, 0x82, 0x5d, 0x6e, 0xd0, 0xdf, 0xe0, 0x9f, 0xfe, 0x37, 0xb0, 0xeb, 0x0d, 0xfc, 0x03, 0xfc, 0xd3, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x03, 0x91,
0x00, 0x00, 0xff, 0xff, 0x79, 0xf0, 0xb4, 0xfa, 0x3d, 0x17, 0x00, 0x00, 0x2d, 0x37, 0x17, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -783,25 +783,25 @@ message LiquidityParameters {
uint64 failure_backoff_sec = 9; uint64 failure_backoff_sec = 9;
/* /*
Set to true to enable automatic dispatch of loop out swaps. All swaps will Set to true to enable automatic dispatch of swaps. All swaps will be limited
be limited to the fee categories set by these parameters, and total to the fee categories set by these parameters, and total expenditure will
expenditure will be limited to the auto out budget. be limited to the autoloop budget.
*/ */
bool auto_loop_out = 10; bool autoloop = 10;
/* /*
The total budget for automatically dispatched swaps since the budget start The total budget for automatically dispatched swaps since the budget start
time, expressed in satoshis. time, expressed in satoshis.
*/ */
uint64 auto_out_budget_sat = 11; uint64 autoloop_budget_sat = 11;
/* /*
The start time for auto-out budget, expressed as a unix timestamp in The start time for autoloop budget, expressed as a unix timestamp in
seconds. If this value is 0, the budget will be applied for all seconds. If this value is 0, the budget will be applied for all
automatically dispatched swaps. Swaps that were completed before this date automatically dispatched swaps. Swaps that were completed before this date
will not be included in budget calculations. will not be included in budget calculations.
*/ */
uint64 auto_out_budget_start_sec = 12; uint64 autoloop_budget_start_sec = 12;
/* /*
The maximum number of automatically dispatched swaps that we allow to be in The maximum number of automatically dispatched swaps that we allow to be in

@ -494,20 +494,20 @@
"format": "uint64", "format": "uint64",
"description": "The amount of time we require pass since a channel was part of a failed\nswap due to off chain payment failure until it will be considered for swap\nsuggestions again, expressed in seconds." "description": "The amount of time we require pass since a channel was part of a failed\nswap due to off chain payment failure until it will be considered for swap\nsuggestions again, expressed in seconds."
}, },
"auto_loop_out": { "autoloop": {
"type": "boolean", "type": "boolean",
"format": "boolean", "format": "boolean",
"description": "Set to true to enable automatic dispatch of loop out swaps. All swaps will\nbe limited to the fee categories set by these parameters, and total\nexpenditure will be limited to the auto out budget." "description": "Set to true to enable automatic dispatch of swaps. All swaps will be limited \nto the fee categories set by these parameters, and total expenditure will \nbe limited to the autoloop budget."
}, },
"auto_out_budget_sat": { "autoloop_budget_sat": {
"type": "string", "type": "string",
"format": "uint64", "format": "uint64",
"description": "The total budget for automatically dispatched swaps since the budget start\ntime, expressed in satoshis." "description": "The total budget for automatically dispatched swaps since the budget start\ntime, expressed in satoshis."
}, },
"auto_out_budget_start_sec": { "autoloop_budget_start_sec": {
"type": "string", "type": "string",
"format": "uint64", "format": "uint64",
"description": "The start time for auto-out budget, expressed as a unix timestamp in\nseconds. If this value is 0, the budget will be applied for all\nautomatically dispatched swaps. Swaps that were completed before this date\nwill not be included in budget calculations." "description": "The start time for autoloop budget, expressed as a unix timestamp in\nseconds. If this value is 0, the budget will be applied for all\nautomatically dispatched swaps. Swaps that were completed before this date\nwill not be included in budget calculations."
}, },
"auto_max_in_flight": { "auto_max_in_flight": {
"type": "string", "type": "string",

@ -20,5 +20,10 @@ This file tracks release notes for the loop client.
unlocked. Previous versions would exit with an error. unlocked. Previous versions would exit with an error.
#### Breaking Changes #### Breaking Changes
* The `AutoOut`, `AutoOutBudgetSat` and `AutoOutBudgetStartSec` fields in the
`LiquidityParameters` message used in the experimental autoloop API have
been renamed to `Autoloop`, `AutoloopBudgetSat` and `AutoloopBudgetStartSec`.
* The `autoout` flag for enabling automatic dispatch of loop out swaps has been
renamed to `autoloop` so that it can cover loop out and loop in.
#### Bug Fixes #### Bug Fixes

Loading…
Cancel
Save