2
0
mirror of https://github.com/lightninglabs/loop synced 2024-11-17 21:25:56 +00:00

liquidity: xpub support for autoloop

This commit is contained in:
Slyghtning 2023-07-04 18:47:21 +02:00
parent 647333ac64
commit 21281e3eb8
No known key found for this signature in database
GPG Key ID: F82D456EA023C9BF
3 changed files with 65 additions and 5 deletions

View File

@ -157,6 +157,15 @@ var (
// set together are specified.
ErrExclusiveRules = errors.New("channel and peer rules must be " +
"exclusive")
// ErrAmbiguousDestAddr is returned when a destination address and
// a extended public key account is set.
ErrAmbiguousDestAddr = errors.New("ambiguous destination address")
// ErrAccountAndAddrType indicates if an account is set but the
// account address type is not or vice versa.
ErrAccountAndAddrType = errors.New("account and address type have " +
"to be both either set or unset")
)
// Config contains the external functionality required to run the

View File

@ -154,9 +154,15 @@ func (b *loopOutBuilder) buildSwap(ctx context.Context, pubkey route.Vertex,
request.Label = labels.EasyAutoloopLabel(swap.TypeOut)
}
account := ""
addrType := walletrpc.AddressType_WITNESS_PUBKEY_HASH
if len(params.Account) > 0 {
account = params.Account
addrType = params.AccountAddrType
}
addr, err := b.cfg.Lnd.WalletKit.NextAddr(
ctx, "", walletrpc.AddressType_WITNESS_PUBKEY_HASH,
false,
ctx, account, addrType, false,
)
if err != nil {
return nil, err

View File

@ -3,6 +3,7 @@ package liquidity
import (
"errors"
"fmt"
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
"strings"
"time"
@ -42,10 +43,18 @@ type Parameters struct {
// Autoloop enables automatic dispatch of swaps.
Autoloop bool
// DestAddr is the address to be used for sweeping the on-chain HTLC that
// is related with a loop out.
// DestAddr is the address to be used for sweeping the on-chain HTLC
// that is related with a loop out.
DestAddr btcutil.Address
// An alternative destination address source for the swap. This field
// represents the name of the account in the backing lnd instance.
// Refer to lnd's wallet import functions for reference.
Account string
// The address type of the account specified in the account field.
AccountAddrType walletrpc.AddressType
// AutoFeeBudget is the total amount we allow to be spent on
// automatically dispatched swaps. Once this budget has been used, we
// will stop dispatching swaps until the budget is refreshed.
@ -227,6 +236,21 @@ func (p Parameters) validate(minConfs int32, openChans []lndclient.ChannelInfo,
return ErrZeroInFlight
}
// Destination address and account cannot be set at the same time.
if p.DestAddr != nil && len(p.DestAddr.String()) > 0 &&
len(p.Account) > 0 {
return ErrAmbiguousDestAddr
}
// If an account is specified the respective address type must be
// specified as well, or both must be unset.
if len(p.Account) == 0 !=
(p.AccountAddrType == walletrpc.AddressType_UNKNOWN) {
return ErrAccountAndAddrType
}
err := validateRestrictions(server, &p.ClientRestrictions)
if err != nil {
return err
@ -376,13 +400,20 @@ func RpcToParameters(req *clientrpc.LiquidityParameters) (*Parameters,
if req.AutoloopDestAddress == "default" {
destaddr = nil
} else {
destaddr, err = btcutil.DecodeAddress(req.AutoloopDestAddress, nil)
destaddr, err = btcutil.DecodeAddress(
req.AutoloopDestAddress, nil,
)
if err != nil {
return nil, err
}
}
}
addrType := walletrpc.AddressType_UNKNOWN
if req.AccountAddrType == clientrpc.AddressType_TAPROOT_PUBKEY {
addrType = walletrpc.AddressType_TAPROOT_PUBKEY
}
params := &Parameters{
FeeLimit: feeLimit,
SweepConfTarget: req.SweepConfTarget,
@ -393,6 +424,8 @@ func RpcToParameters(req *clientrpc.LiquidityParameters) (*Parameters,
int64(req.AutoloopBudgetLastRefresh), 0,
),
DestAddr: destaddr,
Account: req.Account,
AccountAddrType: addrType,
AutoFeeBudget: btcutil.Amount(req.AutoloopBudgetSat),
MaxAutoInFlight: int(req.AutoMaxInFlight),
ChannelRules: make(
@ -487,6 +520,16 @@ func ParametersToRpc(cfg Parameters) (*clientrpc.LiquidityParameters,
destaddr = cfg.DestAddr.String()
}
var addrType clientrpc.AddressType
switch cfg.AccountAddrType {
case walletrpc.AddressType_TAPROOT_PUBKEY:
addrType = clientrpc.AddressType_TAPROOT_PUBKEY
default:
addrType = clientrpc.AddressType_ADDRESS_TYPE_UNKNOWN
}
rpcCfg := &clientrpc.LiquidityParameters{
SweepConfTarget: cfg.SweepConfTarget,
FailureBackoffSec: uint64(cfg.FailureBackOff.Seconds()),
@ -512,6 +555,8 @@ func ParametersToRpc(cfg Parameters) (*clientrpc.LiquidityParameters,
HtlcConfTarget: cfg.HtlcConfTarget,
EasyAutoloop: cfg.EasyAutoloop,
EasyAutoloopLocalTargetSat: uint64(cfg.EasyAutoloopTarget),
Account: cfg.Account,
AccountAddrType: addrType,
}
switch f := cfg.FeeLimit.(type) {