Merge pull request #265 from carlaKC/205-autoloop

liquidity: add liquidity manager with updatable runtime parameters
pull/287/head
Carla Kirk-Cohen 4 years ago committed by GitHub
commit 7a3dcc3a89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,172 @@
package main
import (
"context"
"fmt"
"strconv"
"github.com/lightninglabs/loop/looprpc"
"github.com/urfave/cli"
)
var getLiquidityParamsCommand = cli.Command{
Name: "getparams",
Usage: "show liquidity manager parameters",
Description: "Displays the current set of parameters that are set " +
"for the liquidity manager.",
Action: getParams,
}
func getParams(ctx *cli.Context) error {
client, cleanup, err := getClient(ctx)
if err != nil {
return err
}
defer cleanup()
cfg, err := client.GetLiquidityParams(
context.Background(), &looprpc.GetLiquidityParamsRequest{},
)
if err != nil {
return err
}
printRespJSON(cfg)
return nil
}
var setLiquidityParamCommand = cli.Command{
Name: "setparam",
Usage: "set liquidity manager rule for a channel",
Description: "Update or remove the liquidity rule for a channel.",
ArgsUsage: "shortchanid",
Flags: []cli.Flag{
cli.IntFlag{
Name: "incoming_threshold",
Usage: "the minimum percentage of incoming liquidity " +
"to total capacity beneath which to " +
"recommend loop out to acquire incoming.",
},
cli.IntFlag{
Name: "outgoing_threshold",
Usage: "the minimum percentage of outbound liquidity " +
"that we do not want to drop below.",
},
cli.BoolFlag{
Name: "clear",
Usage: "remove the rule currently set for the channel.",
},
},
Action: setParam,
}
func setParam(ctx *cli.Context) error {
// We require that a channel ID is set for this rule update.
if ctx.NArg() != 1 {
return fmt.Errorf("please set a channel id for the rule " +
"update")
}
chanID, err := strconv.ParseUint(ctx.Args().First(), 10, 64)
if err != nil {
return fmt.Errorf("could not parse channel ID: %v", err)
}
client, cleanup, err := getClient(ctx)
if err != nil {
return err
}
defer cleanup()
// We need to set the full set of current parameters every time we call
// SetParameters. To allow users to set only individual fields on the
// cli, we lookup our current params, then update individual values.
params, err := client.GetLiquidityParams(
context.Background(), &looprpc.GetLiquidityParamsRequest{},
)
if err != nil {
return err
}
var (
inboundSet = ctx.IsSet("incoming_threshold")
outboundSet = ctx.IsSet("outgoing_threshold")
ruleSet bool
otherRules []*looprpc.LiquidityRule
)
// Run through our current set of rules and check whether we have a rule
// currently set for this channel. We also track a slice containing all
// of the rules we currently have set for other channels, because we
// want to leave these rules untouched.
for _, rule := range params.Rules {
if rule.ChannelId == chanID {
ruleSet = true
} else {
otherRules = append(otherRules, rule)
}
}
// If we want to clear the rule for this channel, check that we had a
// rule set in the first place, and set our parameters to the current
// set excluding the channel specified.
if ctx.IsSet("clear") {
if !ruleSet {
return fmt.Errorf("cannot clear channel: %v, no rule "+
"set at present", chanID)
}
if inboundSet || outboundSet {
return fmt.Errorf("do not set other flags with clear " +
"flag")
}
_, err = client.SetLiquidityParams(
context.Background(),
&looprpc.SetLiquidityParamsRequest{
Parameters: &looprpc.LiquidityParameters{
Rules: otherRules,
},
},
)
return err
}
// If we are setting a rule for this channel (not clearing it), check
// that at least one value is set.
if !inboundSet && !outboundSet {
return fmt.Errorf("provide at least one flag to set rules or " +
"use the --clear flag to remove rules")
}
// Create a new rule which will be used to overwrite our current rule.
newRule := &looprpc.LiquidityRule{
ChannelId: chanID,
Type: looprpc.LiquidityRuleType_THRESHOLD,
}
if inboundSet {
newRule.IncomingThreshold = uint32(
ctx.Int("incoming_threshold"),
)
}
if outboundSet {
newRule.OutgoingThreshold = uint32(
ctx.Int("outgoing_threshold"),
)
}
// Update our parameters to the existing set, plus our new rule.
_, err = client.SetLiquidityParams(
context.Background(),
&looprpc.SetLiquidityParamsRequest{
Parameters: &looprpc.LiquidityParameters{
Rules: append(otherRules, newRule),
},
},
)
return err
}

@ -109,7 +109,8 @@ func main() {
app.Commands = []cli.Command{
loopOutCommand, loopInCommand, termsCommand,
monitorCommand, quoteCommand, listAuthCommand,
listSwapsCommand, swapInfoCommand,
listSwapsCommand, swapInfoCommand, getLiquidityParamsCommand,
setLiquidityParamCommand,
}
err := app.Run(os.Args)

@ -0,0 +1,133 @@
// Package liquidity is responsible for monitoring our node's liquidity. It
// allows setting of a liquidity rule which describes the desired liquidity
// balance on a per-channel basis.
package liquidity
import (
"context"
"fmt"
"strings"
"sync"
"github.com/lightningnetwork/lnd/lnwire"
)
var (
// ErrZeroChannelID is returned if we get a rule for a 0 channel ID.
ErrZeroChannelID = fmt.Errorf("zero channel ID not allowed")
)
// Config contains the external functionality required to run the
// liquidity manager.
type Config struct {
// LoopOutRestrictions returns the restrictions that the server applies
// to loop out swaps.
LoopOutRestrictions func(ctx context.Context) (*Restrictions, error)
}
// Parameters is a set of parameters provided by the user which guide
// how we assess liquidity.
type Parameters struct {
// ChannelRules maps a short channel ID to a rule that describes how we
// would like liquidity to be managed.
ChannelRules map[lnwire.ShortChannelID]*ThresholdRule
}
// newParameters creates an empty set of parameters.
func newParameters() Parameters {
return Parameters{
ChannelRules: make(map[lnwire.ShortChannelID]*ThresholdRule),
}
}
// String returns the string representation of our parameters.
func (p Parameters) String() string {
channelRules := make([]string, 0, len(p.ChannelRules))
for channel, rule := range p.ChannelRules {
channelRules = append(
channelRules, fmt.Sprintf("%v: %v", channel, rule),
)
}
return fmt.Sprintf("channel rules: %v",
strings.Join(channelRules, ","))
}
// validate checks whether a set of parameters is valid.
func (p Parameters) validate() error {
for channel, rule := range p.ChannelRules {
if channel.ToUint64() == 0 {
return ErrZeroChannelID
}
if err := rule.validate(); err != nil {
return fmt.Errorf("channel: %v has invalid rule: %v",
channel.ToUint64(), err)
}
}
return nil
}
// Manager contains a set of desired liquidity rules for our channel
// balances.
type Manager struct {
// cfg contains the external functionality we require to determine our
// current liquidity balance.
cfg *Config
// params is the set of parameters we are currently using. These may be
// updated at runtime.
params Parameters
// paramsLock is a lock for our current set of parameters.
paramsLock sync.Mutex
}
// NewManager creates a liquidity manager which has no rules set.
func NewManager(cfg *Config) *Manager {
return &Manager{
cfg: cfg,
params: newParameters(),
}
}
// GetParameters returns a copy of our current parameters.
func (m *Manager) GetParameters() Parameters {
m.paramsLock.Lock()
defer m.paramsLock.Unlock()
return cloneParameters(m.params)
}
// SetParameters updates our current set of parameters if the new parameters
// provided are valid.
func (m *Manager) SetParameters(params Parameters) error {
if err := params.validate(); err != nil {
return err
}
m.paramsLock.Lock()
defer m.paramsLock.Unlock()
m.params = cloneParameters(params)
return nil
}
// cloneParameters creates a deep clone of a parameters struct so that callers
// cannot mutate our parameters. Although our parameters struct itself is not
// a reference, we still need to clone the contents of maps.
func cloneParameters(params Parameters) Parameters {
paramCopy := Parameters{
ChannelRules: make(map[lnwire.ShortChannelID]*ThresholdRule,
len(params.ChannelRules)),
}
for channel, rule := range params.ChannelRules {
ruleCopy := *rule
paramCopy.ChannelRules[channel] = &ruleCopy
}
return paramCopy
}

@ -0,0 +1,66 @@
package liquidity
import (
"context"
"testing"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/stretchr/testify/require"
)
// newTestConfig creates a default test config.
func newTestConfig() *Config {
return &Config{
LoopOutRestrictions: func(_ context.Context) (*Restrictions,
error) {
return NewRestrictions(1, 10000), nil
},
}
}
// TestParameters tests getting and setting of parameters for our manager.
func TestParameters(t *testing.T) {
manager := NewManager(newTestConfig())
chanID := lnwire.NewShortChanIDFromInt(1)
// Start with the case where we have no rules set.
startParams := manager.GetParameters()
require.Equal(t, newParameters(), startParams)
// Mutate the parameters returned by our get function.
startParams.ChannelRules[chanID] = NewThresholdRule(1, 1)
// Make sure that we have not mutated the liquidity manager's params
// by making this change.
params := manager.GetParameters()
require.Equal(t, newParameters(), params)
// Provide a valid set of parameters and validate assert that they are
// set.
originalRule := NewThresholdRule(10, 10)
expected := Parameters{
ChannelRules: map[lnwire.ShortChannelID]*ThresholdRule{
chanID: originalRule,
},
}
err := manager.SetParameters(expected)
require.NoError(t, err)
// Check that changing the parameters we just set does not mutate
// our liquidity manager's parameters.
expected.ChannelRules[chanID] = NewThresholdRule(11, 11)
params = manager.GetParameters()
require.NoError(t, err)
require.Equal(t, originalRule, params.ChannelRules[chanID])
// Set invalid parameters and assert that we fail.
expected.ChannelRules = map[lnwire.ShortChannelID]*ThresholdRule{
lnwire.NewShortChanIDFromInt(0): NewThresholdRule(1, 2),
}
err = manager.SetParameters(expected)
require.Equal(t, ErrZeroChannelID, err)
}

@ -0,0 +1,29 @@
package liquidity
import (
"fmt"
"github.com/btcsuite/btcutil"
)
// Restrictions indicates the restrictions placed on a swap.
type Restrictions struct {
// Minimum is the minimum amount we can swap, inclusive.
Minimum btcutil.Amount
// Maximum is the maximum amount we can swap, inclusive.
Maximum btcutil.Amount
}
// String returns a string representation of a set of restrictions.
func (r *Restrictions) String() string {
return fmt.Sprintf("%v-%v", r.Minimum, r.Maximum)
}
// NewRestrictions creates a set of restrictions.
func NewRestrictions(minimum, maximum btcutil.Amount) *Restrictions {
return &Restrictions{
Minimum: minimum,
Maximum: maximum,
}
}

@ -0,0 +1,61 @@
package liquidity
import (
"errors"
"fmt"
)
var (
// errInvalidLiquidityThreshold is returned when a liquidity threshold
// has an invalid value.
errInvalidLiquidityThreshold = errors.New("liquidity threshold must " +
"be in [0:100)")
// errInvalidThresholdSum is returned when the sum of the percentages
// provided for a threshold rule is >= 100.
errInvalidThresholdSum = errors.New("sum of incoming and outgoing " +
"percentages must be < 100")
)
// ThresholdRule is a liquidity rule that implements minimum incoming and
// outgoing liquidity threshold.
type ThresholdRule struct {
// MinimumIncoming is the percentage of incoming liquidity that we do
// not want to drop below.
MinimumIncoming int
// MinimumOutgoing is the percentage of outgoing liquidity that we do
// not want to drop below.
MinimumOutgoing int
}
// NewThresholdRule returns a new threshold rule.
func NewThresholdRule(minIncoming, minOutgoing int) *ThresholdRule {
return &ThresholdRule{
MinimumIncoming: minIncoming,
MinimumOutgoing: minOutgoing,
}
}
// String returns a string representation of a rule.
func (r *ThresholdRule) String() string {
return fmt.Sprintf("threshold rule: minimum incoming: %v%%, minimum "+
"outgoing: %v%%", r.MinimumIncoming, r.MinimumOutgoing)
}
// validate validates the parameters that a rule was created with.
func (r *ThresholdRule) validate() error {
if r.MinimumIncoming < 0 || r.MinimumIncoming > 100 {
return errInvalidLiquidityThreshold
}
if r.MinimumOutgoing < 0 || r.MinimumOutgoing > 100 {
return errInvalidLiquidityThreshold
}
if r.MinimumIncoming+r.MinimumOutgoing >= 100 {
return errInvalidThresholdSum
}
return nil
}

@ -0,0 +1,93 @@
package liquidity
import (
"testing"
"github.com/stretchr/testify/require"
)
// TestValidateThreshold tests validation of the values set for a threshold
// rule.
func TestValidateThreshold(t *testing.T) {
tests := []struct {
name string
threshold ThresholdRule
err error
}{
{
name: "values ok",
threshold: ThresholdRule{
MinimumIncoming: 20,
MinimumOutgoing: 20,
},
err: nil,
},
{
name: "negative incoming",
threshold: ThresholdRule{
MinimumIncoming: -1,
MinimumOutgoing: 20,
},
err: errInvalidLiquidityThreshold,
},
{
name: "negative outgoing",
threshold: ThresholdRule{
MinimumIncoming: 20,
MinimumOutgoing: -1,
},
err: errInvalidLiquidityThreshold,
},
{
name: "incoming > 1",
threshold: ThresholdRule{
MinimumIncoming: 120,
MinimumOutgoing: 20,
},
err: errInvalidLiquidityThreshold,
},
{
name: "outgoing >1",
threshold: ThresholdRule{
MinimumIncoming: 20,
MinimumOutgoing: 120,
},
err: errInvalidLiquidityThreshold,
},
{
name: "sum < 100",
threshold: ThresholdRule{
MinimumIncoming: 60,
MinimumOutgoing: 39,
},
err: nil,
},
{
name: "sum = 100",
threshold: ThresholdRule{
MinimumIncoming: 60,
MinimumOutgoing: 40,
},
err: errInvalidThresholdSum,
},
{
name: "sum > 100",
threshold: ThresholdRule{
MinimumIncoming: 60,
MinimumOutgoing: 60,
},
err: errInvalidThresholdSum,
},
}
for _, testCase := range tests {
testCase := testCase
t.Run(testCase.name, func(t *testing.T) {
t.Parallel()
err := testCase.threshold.validate()
require.Equal(t, testCase.err, err)
})
}
}

@ -300,12 +300,13 @@ func (d *Daemon) initialize() error {
// Now finally fully initialize the swap client RPC server instance.
d.swapClientServer = swapClientServer{
impl: swapclient,
lnd: &d.lnd.LndServices,
swaps: make(map[lntypes.Hash]loop.SwapInfo),
subscribers: make(map[int]chan<- interface{}),
statusChan: make(chan loop.SwapInfo),
mainCtx: d.mainCtx,
impl: swapclient,
liquidityMgr: getLiquidityManager(swapclient),
lnd: &d.lnd.LndServices,
swaps: make(map[lntypes.Hash]loop.SwapInfo),
subscribers: make(map[int]chan<- interface{}),
statusChan: make(chan loop.SwapInfo),
mainCtx: d.mainCtx,
}
// Retrieve all currently existing swaps from the database.

@ -8,17 +8,17 @@ import (
"sync"
"time"
"github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/queue"
"github.com/lightningnetwork/lnd/routing/route"
"github.com/btcsuite/btcutil"
"github.com/lightninglabs/lndclient"
"github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/liquidity"
"github.com/lightninglabs/loop/loopdb"
"github.com/lightninglabs/loop/swap"
"github.com/btcsuite/btcutil"
"github.com/lightninglabs/loop/looprpc"
"github.com/lightninglabs/loop/swap"
"github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/queue"
"github.com/lightningnetwork/lnd/routing/route"
)
const (
@ -33,6 +33,7 @@ const (
// swapClientServer implements the grpc service exposed by loopd.
type swapClientServer struct {
impl *loop.Client
liquidityMgr *liquidity.Manager
lnd *lndclient.LndServices
swaps map[lntypes.Hash]loop.SwapInfo
subscribers map[int]chan<- interface{}
@ -547,6 +548,90 @@ func (s *swapClientServer) GetLsatTokens(ctx context.Context,
return &looprpc.TokensResponse{Tokens: rpcTokens}, nil
}
// GetLiquidityParams gets our current liquidity manager's parameters.
func (s *swapClientServer) GetLiquidityParams(_ context.Context,
_ *looprpc.GetLiquidityParamsRequest) (*looprpc.LiquidityParameters,
error) {
cfg := s.liquidityMgr.GetParameters()
rpcCfg := &looprpc.LiquidityParameters{
Rules: make(
[]*looprpc.LiquidityRule, 0, len(cfg.ChannelRules),
),
}
for channel, rule := range cfg.ChannelRules {
rpcRule := &looprpc.LiquidityRule{
ChannelId: channel.ToUint64(),
Type: looprpc.LiquidityRuleType_THRESHOLD,
IncomingThreshold: uint32(rule.MinimumIncoming),
OutgoingThreshold: uint32(rule.MinimumOutgoing),
}
rpcCfg.Rules = append(rpcCfg.Rules, rpcRule)
}
return rpcCfg, nil
}
// SetLiquidityParams attempts to set our current liquidity manager's
// parameters.
func (s *swapClientServer) SetLiquidityParams(_ context.Context,
in *looprpc.SetLiquidityParamsRequest) (*looprpc.SetLiquidityParamsResponse,
error) {
params := liquidity.Parameters{
ChannelRules: make(
map[lnwire.ShortChannelID]*liquidity.ThresholdRule,
len(in.Parameters.Rules),
),
}
for _, rule := range in.Parameters.Rules {
var (
shortID = lnwire.NewShortChanIDFromInt(rule.ChannelId)
err error
)
// Make sure that there are not multiple rules set for a single
// channel.
if _, ok := params.ChannelRules[shortID]; ok {
return nil, fmt.Errorf("multiple rules set for "+
"channel: %v", shortID)
}
params.ChannelRules[shortID], err = rpcToRule(rule)
if err != nil {
return nil, err
}
}
if err := s.liquidityMgr.SetParameters(params); err != nil {
return nil, err
}
return &looprpc.SetLiquidityParamsResponse{}, nil
}
// rpcToRule switches on rpc rule type to convert to our rule interface.
func rpcToRule(rule *looprpc.LiquidityRule) (*liquidity.ThresholdRule, error) {
switch rule.Type {
case looprpc.LiquidityRuleType_UNKNOWN:
return nil, fmt.Errorf("rule type field must be set")
case looprpc.LiquidityRuleType_THRESHOLD:
return liquidity.NewThresholdRule(
int(rule.IncomingThreshold),
int(rule.OutgoingThreshold),
), nil
default:
return nil, fmt.Errorf("unknown rule: %T", rule)
}
}
// processStatusUpdates reads updates on the status channel and processes them.
//
// NOTE: This must run inside a goroutine as it blocks until the main context

@ -1,9 +1,12 @@
package loopd
import (
"context"
"github.com/btcsuite/btcutil"
"github.com/lightninglabs/lndclient"
"github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/liquidity"
)
// getClient returns an instance of the swap client.
@ -28,3 +31,22 @@ func getClient(config *Config, lnd *lndclient.LndServices) (*loop.Client,
return swapClient, cleanUp, nil
}
func getLiquidityManager(client *loop.Client) *liquidity.Manager {
mngrCfg := &liquidity.Config{
LoopOutRestrictions: func(ctx context.Context) (
*liquidity.Restrictions, error) {
outTerms, err := client.Server.GetLoopOutTerms(ctx)
if err != nil {
return nil, err
}
return liquidity.NewRestrictions(
outTerms.MinSwapAmount, outTerms.MaxSwapAmount,
), nil
},
}
return liquidity.NewManager(mngrCfg)
}

@ -175,6 +175,31 @@ func (FailureReason) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{2}
}
type LiquidityRuleType int32
const (
LiquidityRuleType_UNKNOWN LiquidityRuleType = 0
LiquidityRuleType_THRESHOLD LiquidityRuleType = 1
)
var LiquidityRuleType_name = map[int32]string{
0: "UNKNOWN",
1: "THRESHOLD",
}
var LiquidityRuleType_value = map[string]int32{
"UNKNOWN": 0,
"THRESHOLD": 1,
}
func (x LiquidityRuleType) String() string {
return proto.EnumName(LiquidityRuleType_name, int32(x))
}
func (LiquidityRuleType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{3}
}
type LoopOutRequest struct {
//*
//Requested swap amount in sat. This does not include the swap and miner fee.
@ -1484,10 +1509,234 @@ func (m *LsatToken) GetStorageName() string {
return ""
}
type GetLiquidityParamsRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetLiquidityParamsRequest) Reset() { *m = GetLiquidityParamsRequest{} }
func (m *GetLiquidityParamsRequest) String() string { return proto.CompactTextString(m) }
func (*GetLiquidityParamsRequest) ProtoMessage() {}
func (*GetLiquidityParamsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{17}
}
func (m *GetLiquidityParamsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetLiquidityParamsRequest.Unmarshal(m, b)
}
func (m *GetLiquidityParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetLiquidityParamsRequest.Marshal(b, m, deterministic)
}
func (m *GetLiquidityParamsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetLiquidityParamsRequest.Merge(m, src)
}
func (m *GetLiquidityParamsRequest) XXX_Size() int {
return xxx_messageInfo_GetLiquidityParamsRequest.Size(m)
}
func (m *GetLiquidityParamsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_GetLiquidityParamsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_GetLiquidityParamsRequest proto.InternalMessageInfo
type LiquidityParameters struct {
//
//A set of liquidity rules that describe the desired liquidity balance.
Rules []*LiquidityRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *LiquidityParameters) Reset() { *m = LiquidityParameters{} }
func (m *LiquidityParameters) String() string { return proto.CompactTextString(m) }
func (*LiquidityParameters) ProtoMessage() {}
func (*LiquidityParameters) Descriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{18}
}
func (m *LiquidityParameters) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LiquidityParameters.Unmarshal(m, b)
}
func (m *LiquidityParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_LiquidityParameters.Marshal(b, m, deterministic)
}
func (m *LiquidityParameters) XXX_Merge(src proto.Message) {
xxx_messageInfo_LiquidityParameters.Merge(m, src)
}
func (m *LiquidityParameters) XXX_Size() int {
return xxx_messageInfo_LiquidityParameters.Size(m)
}
func (m *LiquidityParameters) XXX_DiscardUnknown() {
xxx_messageInfo_LiquidityParameters.DiscardUnknown(m)
}
var xxx_messageInfo_LiquidityParameters proto.InternalMessageInfo
func (m *LiquidityParameters) GetRules() []*LiquidityRule {
if m != nil {
return m.Rules
}
return nil
}
type LiquidityRule struct {
//
//The short channel ID of the channel that this rule should be applied to.
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
//
//Type indicates the type of rule that this message rule represents. Setting
//this value will determine which fields are used in the message. The comments
//on each field in this message will be prefixed with the LiquidityRuleType
//they belong to.
Type LiquidityRuleType `protobuf:"varint,2,opt,name=type,proto3,enum=looprpc.LiquidityRuleType" json:"type,omitempty"`
//
//THRESHOLD: The percentage of total capacity that incoming capacity should
//not drop beneath.
IncomingThreshold uint32 `protobuf:"varint,3,opt,name=incoming_threshold,json=incomingThreshold,proto3" json:"incoming_threshold,omitempty"`
//
//THRESHOLD: The percentage of total capacity that outgoing capacity should
//not drop beneath.
OutgoingThreshold uint32 `protobuf:"varint,4,opt,name=outgoing_threshold,json=outgoingThreshold,proto3" json:"outgoing_threshold,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *LiquidityRule) Reset() { *m = LiquidityRule{} }
func (m *LiquidityRule) String() string { return proto.CompactTextString(m) }
func (*LiquidityRule) ProtoMessage() {}
func (*LiquidityRule) Descriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{19}
}
func (m *LiquidityRule) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LiquidityRule.Unmarshal(m, b)
}
func (m *LiquidityRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_LiquidityRule.Marshal(b, m, deterministic)
}
func (m *LiquidityRule) XXX_Merge(src proto.Message) {
xxx_messageInfo_LiquidityRule.Merge(m, src)
}
func (m *LiquidityRule) XXX_Size() int {
return xxx_messageInfo_LiquidityRule.Size(m)
}
func (m *LiquidityRule) XXX_DiscardUnknown() {
xxx_messageInfo_LiquidityRule.DiscardUnknown(m)
}
var xxx_messageInfo_LiquidityRule proto.InternalMessageInfo
func (m *LiquidityRule) GetChannelId() uint64 {
if m != nil {
return m.ChannelId
}
return 0
}
func (m *LiquidityRule) GetType() LiquidityRuleType {
if m != nil {
return m.Type
}
return LiquidityRuleType_UNKNOWN
}
func (m *LiquidityRule) GetIncomingThreshold() uint32 {
if m != nil {
return m.IncomingThreshold
}
return 0
}
func (m *LiquidityRule) GetOutgoingThreshold() uint32 {
if m != nil {
return m.OutgoingThreshold
}
return 0
}
type SetLiquidityParamsRequest struct {
//
//Parameters is the desired new set of parameters for the liquidity management
//subsystem. Note that the current set of parameters will be completely
//overwritten by the parameters provided (if they are valid), so the full set
//of parameters should be provided for each call.
Parameters *LiquidityParameters `protobuf:"bytes,1,opt,name=parameters,proto3" json:"parameters,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SetLiquidityParamsRequest) Reset() { *m = SetLiquidityParamsRequest{} }
func (m *SetLiquidityParamsRequest) String() string { return proto.CompactTextString(m) }
func (*SetLiquidityParamsRequest) ProtoMessage() {}
func (*SetLiquidityParamsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{20}
}
func (m *SetLiquidityParamsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetLiquidityParamsRequest.Unmarshal(m, b)
}
func (m *SetLiquidityParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SetLiquidityParamsRequest.Marshal(b, m, deterministic)
}
func (m *SetLiquidityParamsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_SetLiquidityParamsRequest.Merge(m, src)
}
func (m *SetLiquidityParamsRequest) XXX_Size() int {
return xxx_messageInfo_SetLiquidityParamsRequest.Size(m)
}
func (m *SetLiquidityParamsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_SetLiquidityParamsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_SetLiquidityParamsRequest proto.InternalMessageInfo
func (m *SetLiquidityParamsRequest) GetParameters() *LiquidityParameters {
if m != nil {
return m.Parameters
}
return nil
}
type SetLiquidityParamsResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SetLiquidityParamsResponse) Reset() { *m = SetLiquidityParamsResponse{} }
func (m *SetLiquidityParamsResponse) String() string { return proto.CompactTextString(m) }
func (*SetLiquidityParamsResponse) ProtoMessage() {}
func (*SetLiquidityParamsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_014de31d7ac8c57c, []int{21}
}
func (m *SetLiquidityParamsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetLiquidityParamsResponse.Unmarshal(m, b)
}
func (m *SetLiquidityParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SetLiquidityParamsResponse.Marshal(b, m, deterministic)
}
func (m *SetLiquidityParamsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_SetLiquidityParamsResponse.Merge(m, src)
}
func (m *SetLiquidityParamsResponse) XXX_Size() int {
return xxx_messageInfo_SetLiquidityParamsResponse.Size(m)
}
func (m *SetLiquidityParamsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_SetLiquidityParamsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_SetLiquidityParamsResponse proto.InternalMessageInfo
func init() {
proto.RegisterEnum("looprpc.SwapType", SwapType_name, SwapType_value)
proto.RegisterEnum("looprpc.SwapState", SwapState_name, SwapState_value)
proto.RegisterEnum("looprpc.FailureReason", FailureReason_name, FailureReason_value)
proto.RegisterEnum("looprpc.LiquidityRuleType", LiquidityRuleType_name, LiquidityRuleType_value)
proto.RegisterType((*LoopOutRequest)(nil), "looprpc.LoopOutRequest")
proto.RegisterType((*LoopInRequest)(nil), "looprpc.LoopInRequest")
proto.RegisterType((*SwapResponse)(nil), "looprpc.SwapResponse")
@ -1505,128 +1754,147 @@ func init() {
proto.RegisterType((*TokensRequest)(nil), "looprpc.TokensRequest")
proto.RegisterType((*TokensResponse)(nil), "looprpc.TokensResponse")
proto.RegisterType((*LsatToken)(nil), "looprpc.LsatToken")
proto.RegisterType((*GetLiquidityParamsRequest)(nil), "looprpc.GetLiquidityParamsRequest")
proto.RegisterType((*LiquidityParameters)(nil), "looprpc.LiquidityParameters")
proto.RegisterType((*LiquidityRule)(nil), "looprpc.LiquidityRule")
proto.RegisterType((*SetLiquidityParamsRequest)(nil), "looprpc.SetLiquidityParamsRequest")
proto.RegisterType((*SetLiquidityParamsResponse)(nil), "looprpc.SetLiquidityParamsResponse")
}
func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) }
var fileDescriptor_014de31d7ac8c57c = []byte{
// 1846 bytes of a gzipped FileDescriptorProto
// 2073 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xdd, 0x6e, 0x23, 0x49,
0x15, 0x1e, 0xff, 0xc5, 0xf6, 0x71, 0xbb, 0xdd, 0xa9, 0xcc, 0x4c, 0x1c, 0x33, 0x68, 0x3c, 0xbd,
0x3b, 0x90, 0x0d, 0xcb, 0x98, 0xcd, 0x5e, 0xb1, 0x02, 0x24, 0x8f, 0xd3, 0xd9, 0x38, 0x4a, 0x6c,
0xd3, 0x76, 0x06, 0x2d, 0x42, 0x6a, 0x55, 0xec, 0x4a, 0xdc, 0xc2, 0xfd, 0xb3, 0x5d, 0xe5, 0x99,
0x44, 0x2b, 0x84, 0xc4, 0x0b, 0xec, 0x05, 0x6f, 0xc0, 0x33, 0x70, 0xc7, 0x2b, 0x70, 0x05, 0xaf,
0x80, 0x84, 0xb8, 0xe0, 0x15, 0x10, 0xaa, 0x53, 0xdd, 0xed, 0xb6, 0xf3, 0x83, 0xb8, 0xd8, 0xbb,
0xf4, 0x77, 0xbe, 0x3a, 0x55, 0xe7, 0xff, 0x38, 0xa0, 0x4d, 0x17, 0x2e, 0xf3, 0xc5, 0x9b, 0x30,
0x0a, 0x44, 0x40, 0xca, 0x8b, 0x20, 0x08, 0xa3, 0x70, 0xda, 0x7a, 0x71, 0x1d, 0x04, 0xd7, 0x0b,
0xd6, 0xa1, 0xa1, 0xdb, 0xa1, 0xbe, 0x1f, 0x08, 0x2a, 0xdc, 0xc0, 0xe7, 0x8a, 0x66, 0x7e, 0x5b,
0x04, 0xfd, 0x2c, 0x08, 0xc2, 0xe1, 0x52, 0xd8, 0xec, 0xeb, 0x25, 0xe3, 0x82, 0x18, 0x50, 0xa0,
0x9e, 0x68, 0xe6, 0xda, 0xb9, 0xfd, 0x82, 0x2d, 0xff, 0x24, 0x04, 0x8a, 0x33, 0xc6, 0x45, 0x33,
0xdf, 0xce, 0xed, 0x57, 0x6d, 0xfc, 0x9b, 0x74, 0xe0, 0xa9, 0x47, 0x6f, 0x1c, 0xfe, 0x81, 0x86,
0x4e, 0x14, 0x2c, 0x85, 0xeb, 0x5f, 0x3b, 0x57, 0x8c, 0x35, 0x0b, 0x78, 0x6c, 0xdb, 0xa3, 0x37,
0xe3, 0x0f, 0x34, 0xb4, 0x95, 0xe4, 0x98, 0x31, 0xf2, 0x39, 0x3c, 0x97, 0x07, 0xc2, 0x88, 0x85,
0xf4, 0x76, 0xed, 0x48, 0x11, 0x8f, 0xec, 0x78, 0xf4, 0x66, 0x84, 0xc2, 0xcc, 0xa1, 0x36, 0x68,
0xe9, 0x2d, 0x92, 0x5a, 0x42, 0x2a, 0xc4, 0xda, 0x25, 0xe3, 0x63, 0xd0, 0x33, 0x6a, 0xe5, 0xc3,
0xb7, 0x90, 0xa3, 0xa5, 0xea, 0xba, 0x9e, 0x20, 0x26, 0xd4, 0x25, 0xcb, 0x73, 0x7d, 0x16, 0xa1,
0xa2, 0x32, 0x92, 0x6a, 0x1e, 0xbd, 0x39, 0x97, 0x98, 0xd4, 0xf4, 0x29, 0x18, 0xd2, 0x67, 0x4e,
0xb0, 0x14, 0xce, 0x74, 0x4e, 0x7d, 0x9f, 0x2d, 0x9a, 0x95, 0x76, 0x6e, 0xbf, 0xf8, 0x36, 0xdf,
0xcc, 0xd9, 0xfa, 0x42, 0x79, 0xa9, 0xa7, 0x24, 0xe4, 0x00, 0xb6, 0x83, 0xa5, 0xb8, 0x0e, 0xa4,
0x11, 0x92, 0xed, 0x70, 0x26, 0x9a, 0xb5, 0x76, 0x61, 0xbf, 0x68, 0x37, 0x12, 0x81, 0xe4, 0x8e,
0x99, 0x90, 0x5c, 0xfe, 0x81, 0xb1, 0xd0, 0x99, 0x06, 0xfe, 0x95, 0x23, 0x68, 0x74, 0xcd, 0x44,
0xb3, 0xda, 0xce, 0xed, 0x97, 0xec, 0x06, 0x0a, 0x7a, 0x81, 0x7f, 0x35, 0x41, 0x98, 0xfc, 0x18,
0xc8, 0x5c, 0x2c, 0xa6, 0x48, 0x75, 0x23, 0x4f, 0x05, 0xab, 0x59, 0x47, 0xf2, 0xb6, 0x94, 0xf4,
0xb2, 0x02, 0xf2, 0x05, 0xec, 0xa1, 0x73, 0xc2, 0xe5, 0xe5, 0xc2, 0x9d, 0x22, 0xe8, 0xcc, 0x18,
0x9d, 0x2d, 0x5c, 0x9f, 0x35, 0x41, 0xbe, 0xde, 0xde, 0x95, 0x84, 0xd1, 0x4a, 0x7e, 0x14, 0x8b,
0xc9, 0x53, 0x28, 0x2d, 0xe8, 0x25, 0x5b, 0x34, 0x35, 0x8c, 0xab, 0xfa, 0x30, 0xff, 0x99, 0x83,
0xba, 0xcc, 0x88, 0xbe, 0xff, 0x70, 0x42, 0x6c, 0x86, 0x25, 0x7f, 0x27, 0x2c, 0x77, 0x1c, 0x5e,
0xb8, 0xeb, 0xf0, 0x3d, 0xa8, 0x2c, 0x28, 0x17, 0xce, 0x3c, 0x08, 0x31, 0x07, 0x34, 0xbb, 0x2c,
0xbf, 0x4f, 0x82, 0x90, 0x7c, 0x04, 0x75, 0x76, 0x23, 0x58, 0xe4, 0xd3, 0x85, 0x23, 0x8d, 0xc6,
0xc0, 0x57, 0x6c, 0x2d, 0x01, 0x4f, 0xc4, 0x62, 0x4a, 0xf6, 0xc1, 0x48, 0x5d, 0x95, 0x78, 0x75,
0x0b, 0x1d, 0xa5, 0x27, 0x8e, 0x8a, 0x9d, 0x9a, 0x5a, 0x5a, 0xce, 0x5a, 0xfa, 0xaf, 0x1c, 0x68,
0x98, 0xa4, 0x8c, 0x87, 0x81, 0xcf, 0x19, 0x21, 0x90, 0x77, 0x67, 0x68, 0x67, 0x15, 0x63, 0x9e,
0x77, 0x67, 0xf2, 0x91, 0xee, 0xcc, 0xb9, 0xbc, 0x15, 0x8c, 0xa3, 0x0d, 0x9a, 0x5d, 0x76, 0x67,
0x6f, 0xe5, 0x27, 0x79, 0x0d, 0x1a, 0xde, 0x4f, 0x67, 0xb3, 0x88, 0x71, 0xae, 0xca, 0x03, 0x0f,
0xd6, 0x24, 0xde, 0x55, 0x30, 0x79, 0x03, 0x3b, 0x59, 0x9a, 0xe3, 0x87, 0x87, 0x1f, 0xf8, 0x1c,
0x2d, 0xae, 0xaa, 0x90, 0xc6, 0xcc, 0x01, 0x0a, 0xc8, 0xa7, 0x71, 0x06, 0x24, 0x7c, 0x45, 0x2f,
0x21, 0xdd, 0xc8, 0xd0, 0x47, 0xc8, 0x7e, 0x0d, 0x3a, 0x67, 0xd1, 0x7b, 0x16, 0x39, 0x1e, 0xe3,
0x9c, 0x5e, 0x33, 0x74, 0x41, 0xd5, 0xae, 0x2b, 0xf4, 0x5c, 0x81, 0xa6, 0x01, 0xfa, 0x79, 0xe0,
0xbb, 0x22, 0x88, 0xe2, 0xa8, 0x9a, 0x7f, 0x2e, 0x02, 0x48, 0xeb, 0xc7, 0x82, 0x8a, 0x25, 0xbf,
0xb7, 0xea, 0xa5, 0x37, 0xf2, 0x0f, 0x7a, 0xa3, 0xb6, 0xe9, 0x8d, 0xa2, 0xb8, 0x0d, 0x55, 0xa0,
0xf5, 0xc3, 0xed, 0x37, 0x71, 0xff, 0x79, 0x23, 0xef, 0x98, 0xdc, 0x86, 0xcc, 0x46, 0x31, 0xd9,
0x87, 0x12, 0x17, 0x54, 0xa8, 0xaa, 0xd7, 0x0f, 0xc9, 0x1a, 0x4f, 0xbe, 0x85, 0xd9, 0x8a, 0x40,
0x7e, 0x0e, 0xfa, 0x15, 0x75, 0x17, 0xcb, 0x88, 0x39, 0x11, 0xa3, 0x3c, 0xf0, 0x9b, 0x3a, 0x1e,
0x79, 0x9e, 0x1e, 0x39, 0x56, 0x62, 0x1b, 0xa5, 0x76, 0xfd, 0x2a, 0xfb, 0x49, 0x7e, 0x08, 0x0d,
0xd7, 0x77, 0x85, 0xab, 0x6a, 0x42, 0xb8, 0x5e, 0xd2, 0x3d, 0xf4, 0x15, 0x3c, 0x71, 0x3d, 0xf9,
0x22, 0x03, 0xd3, 0x70, 0x19, 0xce, 0xa8, 0x60, 0x8a, 0xa9, 0x7a, 0x88, 0x2e, 0xf1, 0x0b, 0x84,
0x91, 0xb9, 0x19, 0xf0, 0xf2, 0xfd, 0x01, 0xbf, 0x3f, 0x80, 0xda, 0x03, 0x01, 0x7c, 0x20, 0x3d,
0xea, 0x0f, 0xa5, 0xc7, 0x4b, 0xa8, 0x4d, 0x03, 0x2e, 0x1c, 0x15, 0x5f, 0xec, 0x50, 0x05, 0x1b,
0x24, 0x34, 0x46, 0x84, 0xbc, 0x02, 0x0d, 0x09, 0x81, 0x3f, 0x9d, 0x53, 0xd7, 0xc7, 0x46, 0x53,
0xb0, 0xf1, 0xd0, 0x50, 0x41, 0xb2, 0xbc, 0x14, 0xe5, 0xea, 0x4a, 0x71, 0x40, 0xf5, 0x4c, 0xe4,
0xc4, 0xd8, 0xaa, 0x68, 0x1a, 0xd9, 0xa2, 0x21, 0x60, 0x9c, 0xb9, 0x5c, 0xc8, 0x68, 0xf1, 0x24,
0x95, 0x7e, 0x01, 0xdb, 0x19, 0x2c, 0x2e, 0xa6, 0x4f, 0xa0, 0x24, 0xfb, 0x03, 0x6f, 0xe6, 0xda,
0x85, 0xfd, 0xda, 0xe1, 0xce, 0x9d, 0x40, 0x2f, 0xb9, 0xad, 0x18, 0xe6, 0x2b, 0x68, 0x48, 0xb0,
0xef, 0x5f, 0x05, 0x49, 0xcf, 0xd1, 0xd3, 0x52, 0xd4, 0x64, 0xe2, 0x99, 0x3a, 0x68, 0x13, 0x16,
0x79, 0xe9, 0x95, 0xbf, 0x87, 0x46, 0xdf, 0x8f, 0x91, 0xf8, 0xc2, 0x1f, 0x40, 0xc3, 0x73, 0x7d,
0xd5, 0x94, 0xa8, 0x17, 0x2c, 0x7d, 0x11, 0x07, 0xbc, 0xee, 0xb9, 0xbe, 0xd4, 0xdf, 0x45, 0x10,
0x79, 0x49, 0xf3, 0x8a, 0x79, 0x5b, 0x31, 0x4f, 0xf5, 0x2f, 0xc5, 0x3b, 0x2d, 0x56, 0x72, 0x46,
0xfe, 0xb4, 0x58, 0xc9, 0x1b, 0x85, 0xd3, 0x62, 0xa5, 0x60, 0x14, 0x4f, 0x8b, 0x95, 0xa2, 0x51,
0x3a, 0x2d, 0x56, 0xca, 0x46, 0xc5, 0xfc, 0x6b, 0x0e, 0x8c, 0xe1, 0x52, 0x7c, 0xa7, 0x4f, 0xc0,
0xe1, 0xe6, 0xfa, 0xce, 0x74, 0x21, 0xde, 0x3b, 0x33, 0xb6, 0x10, 0x14, 0xc3, 0x5d, 0xb2, 0x35,
0xcf, 0xf5, 0x7b, 0x0b, 0xf1, 0xfe, 0x48, 0x62, 0xc9, 0x08, 0xcc, 0xb0, 0xaa, 0x31, 0x8b, 0xde,
0xa4, 0xac, 0xff, 0x61, 0xce, 0x9f, 0x72, 0xa0, 0xfd, 0x72, 0x19, 0x08, 0xf6, 0x70, 0xd3, 0xc7,
0xc4, 0x5b, 0x75, 0xda, 0x3c, 0xde, 0x01, 0xd3, 0x55, 0x97, 0xbd, 0xd3, 0xb4, 0x0b, 0xf7, 0x34,
0xed, 0x47, 0x07, 0x56, 0xf1, 0xd1, 0x81, 0x65, 0x7e, 0x9b, 0x93, 0x51, 0x8f, 0x9f, 0x19, 0xbb,
0xbc, 0x0d, 0x5a, 0x32, 0x86, 0x1c, 0x4e, 0x93, 0x07, 0x03, 0x57, 0x73, 0x68, 0x4c, 0x71, 0x53,
0xc1, 0x02, 0xc3, 0x1b, 0xf9, 0x3c, 0x65, 0xc6, 0x9b, 0x8a, 0x94, 0x8d, 0x94, 0x28, 0x3e, 0xf0,
0x7d, 0x80, 0x8c, 0x2f, 0x4b, 0x68, 0x67, 0x75, 0x9a, 0x71, 0xa4, 0x72, 0x61, 0xd1, 0x28, 0x99,
0x7f, 0x53, 0x59, 0xf0, 0xff, 0x3e, 0xe9, 0x63, 0xd0, 0x57, 0x0b, 0x0b, 0x72, 0xd4, 0x04, 0xd5,
0xc2, 0x64, 0x63, 0x91, 0xac, 0x1f, 0xc5, 0x7d, 0x44, 0xed, 0x0e, 0xeb, 0xcf, 0x6e, 0x48, 0xc9,
0x58, 0x0a, 0x62, 0x95, 0xb8, 0x63, 0x48, 0xbf, 0xd2, 0x5b, 0x8f, 0xf9, 0xc2, 0xc1, 0x85, 0x4d,
0x4d, 0xd5, 0x06, 0xfa, 0x53, 0xe1, 0x47, 0x32, 0xb6, 0x8f, 0x1b, 0x68, 0x36, 0xa0, 0x3e, 0x09,
0x7e, 0xcb, 0xfc, 0xb4, 0xd8, 0x7e, 0x06, 0x7a, 0x02, 0xc4, 0x26, 0x1e, 0xc0, 0x96, 0x40, 0x24,
0xae, 0xee, 0x55, 0x1b, 0x3f, 0xe3, 0x54, 0x20, 0xd9, 0x8e, 0x19, 0xe6, 0x5f, 0xf2, 0x50, 0x4d,
0x51, 0x99, 0x24, 0x97, 0x94, 0x33, 0xc7, 0xa3, 0x53, 0x1a, 0x05, 0x81, 0x1f, 0xd7, 0xb8, 0x26,
0xc1, 0xf3, 0x18, 0x93, 0x2d, 0x2c, 0xb1, 0x63, 0x4e, 0xf9, 0x1c, 0xbd, 0xa3, 0xd9, 0xb5, 0x18,
0x3b, 0xa1, 0x7c, 0x4e, 0x3e, 0x01, 0x23, 0xa1, 0x84, 0x11, 0x73, 0x3d, 0x39, 0xf9, 0xd4, 0x7c,
0x6e, 0xc4, 0xf8, 0x28, 0x86, 0x65, 0x83, 0x57, 0x45, 0xe6, 0x84, 0xd4, 0x9d, 0x39, 0x9e, 0xf4,
0xa2, 0xda, 0x39, 0x75, 0x85, 0x8f, 0xa8, 0x3b, 0x3b, 0xe7, 0x54, 0x90, 0xcf, 0xe0, 0x59, 0x66,
0x31, 0xcd, 0xd0, 0x55, 0x15, 0x93, 0x28, 0xdd, 0x4c, 0xd3, 0x23, 0xaf, 0x40, 0x93, 0x13, 0xc3,
0x99, 0x46, 0x8c, 0x0a, 0x36, 0x8b, 0xeb, 0xb8, 0x26, 0xb1, 0x9e, 0x82, 0x48, 0x13, 0xca, 0xec,
0x26, 0x74, 0x23, 0x36, 0xc3, 0x89, 0x51, 0xb1, 0x93, 0x4f, 0x79, 0x98, 0x8b, 0x20, 0xa2, 0xd7,
0xcc, 0xf1, 0xa9, 0xc7, 0xb0, 0xba, 0xab, 0x76, 0x2d, 0xc6, 0x06, 0xd4, 0x63, 0x07, 0xaf, 0xa1,
0x92, 0x4c, 0x50, 0xa2, 0x41, 0xe5, 0x6c, 0x38, 0x1c, 0x39, 0xc3, 0x8b, 0x89, 0xf1, 0x84, 0xd4,
0xa0, 0x8c, 0x5f, 0xfd, 0x81, 0x91, 0x3b, 0xe0, 0x50, 0x4d, 0x07, 0x28, 0xa9, 0x43, 0xb5, 0x3f,
0xe8, 0x4f, 0xfa, 0xdd, 0x89, 0x75, 0x64, 0x3c, 0x21, 0xcf, 0x60, 0x7b, 0x64, 0x5b, 0xfd, 0xf3,
0xee, 0x97, 0x96, 0x63, 0x5b, 0xef, 0xac, 0xee, 0x99, 0x75, 0x64, 0xe4, 0x08, 0x01, 0xfd, 0x64,
0x72, 0xd6, 0x73, 0x46, 0x17, 0x6f, 0xcf, 0xfa, 0xe3, 0x13, 0xeb, 0xc8, 0xc8, 0x4b, 0x9d, 0xe3,
0x8b, 0x5e, 0xcf, 0x1a, 0x8f, 0x8d, 0x02, 0x01, 0xd8, 0x3a, 0xee, 0xf6, 0x25, 0xb9, 0x48, 0x76,
0xa0, 0xd1, 0x1f, 0xbc, 0x1b, 0xf6, 0x7b, 0x96, 0x33, 0xb6, 0x26, 0x13, 0x09, 0x96, 0x0e, 0xfe,
0x9d, 0x83, 0xfa, 0xda, 0x0c, 0x26, 0xbb, 0xb0, 0x23, 0x8f, 0x5c, 0xd8, 0xf2, 0xa6, 0xee, 0x78,
0x38, 0x70, 0x06, 0xc3, 0x81, 0x65, 0x3c, 0x21, 0xdf, 0x83, 0xdd, 0x0d, 0xc1, 0xf0, 0xf8, 0xb8,
0x77, 0xd2, 0x95, 0x8f, 0x27, 0x2d, 0x78, 0xbe, 0x21, 0x9c, 0xf4, 0xcf, 0x2d, 0x69, 0x65, 0x9e,
0xb4, 0xe1, 0xc5, 0x86, 0x6c, 0xfc, 0x2b, 0xcb, 0x1a, 0xa5, 0x8c, 0x02, 0x79, 0x0d, 0xaf, 0x36,
0x18, 0xfd, 0xc1, 0xf8, 0xe2, 0xf8, 0xb8, 0xdf, 0xeb, 0x5b, 0x83, 0x89, 0xf3, 0xae, 0x7b, 0x76,
0x61, 0x19, 0x45, 0xf2, 0x02, 0x9a, 0x9b, 0x97, 0x58, 0xe7, 0xa3, 0xa1, 0xdd, 0xb5, 0xbf, 0x32,
0x4a, 0xe4, 0x23, 0x78, 0x79, 0x47, 0x49, 0x6f, 0x68, 0xdb, 0x56, 0x6f, 0xe2, 0x74, 0xcf, 0x87,
0x17, 0x83, 0x89, 0xb1, 0x75, 0xf8, 0x9f, 0x2d, 0xb5, 0x32, 0xf5, 0xf0, 0x87, 0x16, 0xb1, 0xa1,
0x1c, 0xff, 0x74, 0x22, 0xbb, 0xab, 0xfc, 0x5f, 0xfb, 0x31, 0xd5, 0x7a, 0xb6, 0x36, 0xf6, 0x92,
0xfa, 0x31, 0x77, 0xff, 0xf0, 0xf7, 0x7f, 0xfc, 0x31, 0xbf, 0x6d, 0x6a, 0x9d, 0xf7, 0x9f, 0x75,
0x24, 0xa3, 0x13, 0x2c, 0xc5, 0x17, 0xb9, 0x03, 0x32, 0x84, 0x2d, 0xb5, 0x7c, 0x93, 0xe7, 0x6b,
0x2a, 0xd3, 0x6d, 0xfc, 0x21, 0x8d, 0xcf, 0x51, 0xa3, 0x61, 0xd6, 0x52, 0x8d, 0xae, 0x2f, 0x15,
0xfe, 0x14, 0xca, 0xf1, 0xe2, 0x97, 0x79, 0xe4, 0xfa, 0x2a, 0xd8, 0xba, 0x6f, 0x36, 0xff, 0x24,
0x47, 0x7e, 0x0d, 0xd5, 0x74, 0xac, 0x93, 0xbd, 0xd5, 0x73, 0x36, 0xc6, 0x7f, 0xab, 0x75, 0x9f,
0x68, 0xfd, 0x59, 0x44, 0x4f, 0x9f, 0x85, 0x23, 0x9f, 0x5c, 0xa8, 0xb4, 0x96, 0x23, 0x9f, 0x34,
0xd7, 0xae, 0xcf, 0x6c, 0x01, 0xf7, 0x3e, 0xcc, 0x6c, 0xa1, 0xca, 0xa7, 0x84, 0xac, 0xa9, 0xec,
0x7c, 0xe3, 0xce, 0x7e, 0x47, 0x7e, 0x03, 0x5a, 0x1c, 0x00, 0x1c, 0xcc, 0x64, 0xe5, 0xac, 0xec,
0xf6, 0xd0, 0x5a, 0x19, 0xb3, 0x39, 0xc2, 0xef, 0xd1, 0x1e, 0x2c, 0x45, 0x47, 0xa0, 0xb6, 0xcb,
0x54, 0x3b, 0x36, 0xfc, 0x8c, 0xf6, 0xec, 0xe8, 0x5c, 0xd7, 0xbe, 0x36, 0x1a, 0xcc, 0x36, 0x6a,
0x6f, 0x91, 0xe6, 0x9a, 0xf6, 0xaf, 0x25, 0xa7, 0xf3, 0x0d, 0xf5, 0x84, 0xb4, 0x40, 0xff, 0x92,
0x09, 0x15, 0xf2, 0x47, 0x6d, 0x58, 0x79, 0x6d, 0x63, 0x11, 0x32, 0xf7, 0xf0, 0x92, 0x1d, 0xb2,
0x9d, 0x49, 0x85, 0xd4, 0x82, 0x95, 0xf6, 0x47, 0x6d, 0xc8, 0x6a, 0x5f, 0x37, 0xe1, 0x25, 0x6a,
0xdf, 0x23, 0xbb, 0x59, 0xed, 0x59, 0x0b, 0xbe, 0x82, 0xba, 0xbc, 0x23, 0xe9, 0xf8, 0x3c, 0x93,
0xc9, 0x6b, 0x63, 0xa5, 0xb5, 0x7b, 0x07, 0x5f, 0xaf, 0x0e, 0xd2, 0xc0, 0x2b, 0x38, 0x15, 0x1d,
0x35, 0x4a, 0x2e, 0xb7, 0xf0, 0x9f, 0x16, 0x9f, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x20,
0x13, 0x25, 0xeb, 0x10, 0x00, 0x00,
0x15, 0x1e, 0xff, 0xc5, 0xf6, 0x71, 0xbb, 0xdd, 0xa9, 0xcc, 0x26, 0x8e, 0x37, 0x68, 0x32, 0x3d,
0x3b, 0x90, 0x0d, 0xbb, 0x63, 0x36, 0x7b, 0xc5, 0x68, 0x41, 0xf2, 0x38, 0xce, 0xc6, 0x43, 0x62,
0x9b, 0xb6, 0x33, 0xab, 0x41, 0x48, 0xad, 0x8a, 0x5d, 0x89, 0x5b, 0xf4, 0xdf, 0x74, 0x97, 0x67,
0x12, 0xad, 0x00, 0x89, 0x17, 0xd8, 0x0b, 0xde, 0x80, 0x67, 0xe0, 0x0e, 0x1e, 0x81, 0x2b, 0x78,
0x05, 0x24, 0xc4, 0x05, 0x77, 0x3c, 0x00, 0xaa, 0x53, 0xdd, 0xed, 0x6e, 0xc7, 0x09, 0xe2, 0x82,
0xbb, 0xf4, 0x77, 0xbe, 0x3a, 0x55, 0xe7, 0xff, 0x38, 0xa0, 0x4c, 0x6d, 0x8b, 0xb9, 0xfc, 0x85,
0x1f, 0x78, 0xdc, 0x23, 0x65, 0xdb, 0xf3, 0xfc, 0xc0, 0x9f, 0xb6, 0xf6, 0xae, 0x3d, 0xef, 0xda,
0x66, 0x6d, 0xea, 0x5b, 0x6d, 0xea, 0xba, 0x1e, 0xa7, 0xdc, 0xf2, 0xdc, 0x50, 0xd2, 0xf4, 0xef,
0x8a, 0xa0, 0x9e, 0x79, 0x9e, 0x3f, 0x5c, 0x70, 0x83, 0xbd, 0x5b, 0xb0, 0x90, 0x13, 0x0d, 0x0a,
0xd4, 0xe1, 0xcd, 0xdc, 0x7e, 0xee, 0xa0, 0x60, 0x88, 0x3f, 0x09, 0x81, 0xe2, 0x8c, 0x85, 0xbc,
0x99, 0xdf, 0xcf, 0x1d, 0x54, 0x0d, 0xfc, 0x9b, 0xb4, 0xe1, 0xb1, 0x43, 0x6f, 0xcc, 0xf0, 0x03,
0xf5, 0xcd, 0xc0, 0x5b, 0x70, 0xcb, 0xbd, 0x36, 0xaf, 0x18, 0x6b, 0x16, 0xf0, 0xd8, 0xa6, 0x43,
0x6f, 0xc6, 0x1f, 0xa8, 0x6f, 0x48, 0xc9, 0x09, 0x63, 0xe4, 0x4b, 0xd8, 0x16, 0x07, 0xfc, 0x80,
0xf9, 0xf4, 0x36, 0x73, 0xa4, 0x88, 0x47, 0xb6, 0x1c, 0x7a, 0x33, 0x42, 0x61, 0xea, 0xd0, 0x3e,
0x28, 0xc9, 0x2d, 0x82, 0x5a, 0x42, 0x2a, 0x44, 0xda, 0x05, 0xe3, 0x13, 0x50, 0x53, 0x6a, 0xc5,
0xc3, 0x37, 0x90, 0xa3, 0x24, 0xea, 0x3a, 0x0e, 0x27, 0x3a, 0xd4, 0x05, 0xcb, 0xb1, 0x5c, 0x16,
0xa0, 0xa2, 0x32, 0x92, 0x6a, 0x0e, 0xbd, 0x39, 0x17, 0x98, 0xd0, 0xf4, 0x19, 0x68, 0xc2, 0x67,
0xa6, 0xb7, 0xe0, 0xe6, 0x74, 0x4e, 0x5d, 0x97, 0xd9, 0xcd, 0xca, 0x7e, 0xee, 0xa0, 0xf8, 0x2a,
0xdf, 0xcc, 0x19, 0xaa, 0x2d, 0xbd, 0xd4, 0x95, 0x12, 0x72, 0x08, 0x9b, 0xde, 0x82, 0x5f, 0x7b,
0xc2, 0x08, 0xc1, 0x36, 0x43, 0xc6, 0x9b, 0xb5, 0xfd, 0xc2, 0x41, 0xd1, 0x68, 0xc4, 0x02, 0xc1,
0x1d, 0x33, 0x2e, 0xb8, 0xe1, 0x07, 0xc6, 0x7c, 0x73, 0xea, 0xb9, 0x57, 0x26, 0xa7, 0xc1, 0x35,
0xe3, 0xcd, 0xea, 0x7e, 0xee, 0xa0, 0x64, 0x34, 0x50, 0xd0, 0xf5, 0xdc, 0xab, 0x09, 0xc2, 0xe4,
0x73, 0x20, 0x73, 0x6e, 0x4f, 0x91, 0x6a, 0x05, 0x8e, 0x0c, 0x56, 0xb3, 0x8e, 0xe4, 0x4d, 0x21,
0xe9, 0xa6, 0x05, 0xe4, 0x25, 0xec, 0xa2, 0x73, 0xfc, 0xc5, 0xa5, 0x6d, 0x4d, 0x11, 0x34, 0x67,
0x8c, 0xce, 0x6c, 0xcb, 0x65, 0x4d, 0x10, 0xaf, 0x37, 0x76, 0x04, 0x61, 0xb4, 0x94, 0x1f, 0x47,
0x62, 0xf2, 0x18, 0x4a, 0x36, 0xbd, 0x64, 0x76, 0x53, 0xc1, 0xb8, 0xca, 0x0f, 0xfd, 0x1f, 0x39,
0xa8, 0x8b, 0x8c, 0xe8, 0xbb, 0xf7, 0x27, 0xc4, 0x6a, 0x58, 0xf2, 0x77, 0xc2, 0x72, 0xc7, 0xe1,
0x85, 0xbb, 0x0e, 0xdf, 0x85, 0x8a, 0x4d, 0x43, 0x6e, 0xce, 0x3d, 0x1f, 0x73, 0x40, 0x31, 0xca,
0xe2, 0xfb, 0xd4, 0xf3, 0xc9, 0x33, 0xa8, 0xb3, 0x1b, 0xce, 0x02, 0x97, 0xda, 0xa6, 0x30, 0x1a,
0x03, 0x5f, 0x31, 0x94, 0x18, 0x3c, 0xe5, 0xf6, 0x94, 0x1c, 0x80, 0x96, 0xb8, 0x2a, 0xf6, 0xea,
0x06, 0x3a, 0x4a, 0x8d, 0x1d, 0x15, 0x39, 0x35, 0xb1, 0xb4, 0x9c, 0xb6, 0xf4, 0x9f, 0x39, 0x50,
0x30, 0x49, 0x59, 0xe8, 0x7b, 0x6e, 0xc8, 0x08, 0x81, 0xbc, 0x35, 0x43, 0x3b, 0xab, 0x18, 0xf3,
0xbc, 0x35, 0x13, 0x8f, 0xb4, 0x66, 0xe6, 0xe5, 0x2d, 0x67, 0x21, 0xda, 0xa0, 0x18, 0x65, 0x6b,
0xf6, 0x4a, 0x7c, 0x92, 0xe7, 0xa0, 0xe0, 0xfd, 0x74, 0x36, 0x0b, 0x58, 0x18, 0xca, 0xf2, 0xc0,
0x83, 0x35, 0x81, 0x77, 0x24, 0x4c, 0x5e, 0xc0, 0x56, 0x9a, 0x66, 0xba, 0xfe, 0xd1, 0x87, 0x70,
0x8e, 0x16, 0x57, 0x65, 0x48, 0x23, 0xe6, 0x00, 0x05, 0xe4, 0xb3, 0x28, 0x03, 0x62, 0xbe, 0xa4,
0x97, 0x90, 0xae, 0xa5, 0xe8, 0x23, 0x64, 0x3f, 0x07, 0x35, 0x64, 0xc1, 0x7b, 0x16, 0x98, 0x0e,
0x0b, 0x43, 0x7a, 0xcd, 0xd0, 0x05, 0x55, 0xa3, 0x2e, 0xd1, 0x73, 0x09, 0xea, 0x1a, 0xa8, 0xe7,
0x9e, 0x6b, 0x71, 0x2f, 0x88, 0xa2, 0xaa, 0xff, 0xb1, 0x08, 0x20, 0xac, 0x1f, 0x73, 0xca, 0x17,
0xe1, 0xda, 0xaa, 0x17, 0xde, 0xc8, 0xdf, 0xeb, 0x8d, 0xda, 0xaa, 0x37, 0x8a, 0xfc, 0xd6, 0x97,
0x81, 0x56, 0x8f, 0x36, 0x5f, 0x44, 0xfd, 0xe7, 0x85, 0xb8, 0x63, 0x72, 0xeb, 0x33, 0x03, 0xc5,
0xe4, 0x00, 0x4a, 0x21, 0xa7, 0x5c, 0x56, 0xbd, 0x7a, 0x44, 0x32, 0x3c, 0xf1, 0x16, 0x66, 0x48,
0x02, 0xf9, 0x09, 0xa8, 0x57, 0xd4, 0xb2, 0x17, 0x01, 0x33, 0x03, 0x46, 0x43, 0xcf, 0x6d, 0xaa,
0x78, 0x64, 0x3b, 0x39, 0x72, 0x22, 0xc5, 0x06, 0x4a, 0x8d, 0xfa, 0x55, 0xfa, 0x93, 0xfc, 0x00,
0x1a, 0x96, 0x6b, 0x71, 0x4b, 0xd6, 0x04, 0xb7, 0x9c, 0xb8, 0x7b, 0xa8, 0x4b, 0x78, 0x62, 0x39,
0xe2, 0x45, 0x1a, 0xa6, 0xe1, 0xc2, 0x9f, 0x51, 0xce, 0x24, 0x53, 0xf6, 0x10, 0x55, 0xe0, 0x17,
0x08, 0x23, 0x73, 0x35, 0xe0, 0xe5, 0xf5, 0x01, 0x5f, 0x1f, 0x40, 0xe5, 0x9e, 0x00, 0xde, 0x93,
0x1e, 0xf5, 0xfb, 0xd2, 0xe3, 0x09, 0xd4, 0xa6, 0x5e, 0xc8, 0x4d, 0x19, 0x5f, 0xec, 0x50, 0x05,
0x03, 0x04, 0x34, 0x46, 0x84, 0x3c, 0x05, 0x05, 0x09, 0x9e, 0x3b, 0x9d, 0x53, 0xcb, 0xc5, 0x46,
0x53, 0x30, 0xf0, 0xd0, 0x50, 0x42, 0xa2, 0xbc, 0x24, 0xe5, 0xea, 0x4a, 0x72, 0x40, 0xf6, 0x4c,
0xe4, 0x44, 0xd8, 0xb2, 0x68, 0x1a, 0xe9, 0xa2, 0x21, 0xa0, 0x9d, 0x59, 0x21, 0x17, 0xd1, 0x0a,
0xe3, 0x54, 0xfa, 0x29, 0x6c, 0xa6, 0xb0, 0xa8, 0x98, 0x3e, 0x85, 0x92, 0xe8, 0x0f, 0x61, 0x33,
0xb7, 0x5f, 0x38, 0xa8, 0x1d, 0x6d, 0xdd, 0x09, 0xf4, 0x22, 0x34, 0x24, 0x43, 0x7f, 0x0a, 0x0d,
0x01, 0xf6, 0xdd, 0x2b, 0x2f, 0xee, 0x39, 0x6a, 0x52, 0x8a, 0x8a, 0x48, 0x3c, 0x5d, 0x05, 0x65,
0xc2, 0x02, 0x27, 0xb9, 0xf2, 0xb7, 0xd0, 0xe8, 0xbb, 0x11, 0x12, 0x5d, 0xf8, 0x7d, 0x68, 0x38,
0x96, 0x2b, 0x9b, 0x12, 0x75, 0xbc, 0x85, 0xcb, 0xa3, 0x80, 0xd7, 0x1d, 0xcb, 0x15, 0xfa, 0x3b,
0x08, 0x22, 0x2f, 0x6e, 0x5e, 0x11, 0x6f, 0x23, 0xe2, 0xc9, 0xfe, 0x25, 0x79, 0xaf, 0x8b, 0x95,
0x9c, 0x96, 0x7f, 0x5d, 0xac, 0xe4, 0xb5, 0xc2, 0xeb, 0x62, 0xa5, 0xa0, 0x15, 0x5f, 0x17, 0x2b,
0x45, 0xad, 0xf4, 0xba, 0x58, 0x29, 0x6b, 0x15, 0xfd, 0x2f, 0x39, 0xd0, 0x86, 0x0b, 0xfe, 0x7f,
0x7d, 0x02, 0x0e, 0x37, 0xcb, 0x35, 0xa7, 0x36, 0x7f, 0x6f, 0xce, 0x98, 0xcd, 0x29, 0x86, 0xbb,
0x64, 0x28, 0x8e, 0xe5, 0x76, 0x6d, 0xfe, 0xfe, 0x58, 0x60, 0xf1, 0x08, 0x4c, 0xb1, 0xaa, 0x11,
0x8b, 0xde, 0x24, 0xac, 0xff, 0x62, 0xce, 0x1f, 0x72, 0xa0, 0xfc, 0x7c, 0xe1, 0x71, 0x76, 0x7f,
0xd3, 0xc7, 0xc4, 0x5b, 0x76, 0xda, 0x3c, 0xde, 0x01, 0xd3, 0x65, 0x97, 0xbd, 0xd3, 0xb4, 0x0b,
0x6b, 0x9a, 0xf6, 0x83, 0x03, 0xab, 0xf8, 0xe0, 0xc0, 0xd2, 0xbf, 0xcb, 0x89, 0xa8, 0x47, 0xcf,
0x8c, 0x5c, 0xbe, 0x0f, 0x4a, 0x3c, 0x86, 0xcc, 0x90, 0xc6, 0x0f, 0x86, 0x50, 0xce, 0xa1, 0x31,
0xc5, 0x4d, 0x05, 0x0b, 0x0c, 0x6f, 0x0c, 0xe7, 0x09, 0x33, 0xda, 0x54, 0x84, 0x6c, 0x24, 0x45,
0xd1, 0x81, 0xef, 0x01, 0xa4, 0x7c, 0x59, 0x42, 0x3b, 0xab, 0xd3, 0x94, 0x23, 0xa5, 0x0b, 0x8b,
0x5a, 0x49, 0xff, 0xab, 0xcc, 0x82, 0xff, 0xf5, 0x49, 0x9f, 0x80, 0xba, 0x5c, 0x58, 0x90, 0x23,
0x27, 0xa8, 0xe2, 0xc7, 0x1b, 0x8b, 0x60, 0xfd, 0x30, 0xea, 0x23, 0x72, 0x77, 0xc8, 0x3e, 0xbb,
0x21, 0x24, 0x63, 0x21, 0x88, 0x54, 0xe2, 0x8e, 0x21, 0xfc, 0x4a, 0x6f, 0x1d, 0xe6, 0x72, 0x13,
0x17, 0x36, 0x39, 0x55, 0x1b, 0xe8, 0x4f, 0x89, 0x1f, 0x8b, 0xd8, 0x3e, 0x6c, 0xa0, 0xde, 0x80,
0xfa, 0xc4, 0xfb, 0x15, 0x73, 0x93, 0x62, 0xfb, 0x0a, 0xd4, 0x18, 0x88, 0x4c, 0x3c, 0x84, 0x0d,
0x8e, 0x48, 0x54, 0xdd, 0xcb, 0x36, 0x7e, 0x16, 0x52, 0x8e, 0x64, 0x23, 0x62, 0xe8, 0x7f, 0xca,
0x43, 0x35, 0x41, 0x45, 0x92, 0x5c, 0xd2, 0x90, 0x99, 0x0e, 0x9d, 0xd2, 0xc0, 0xf3, 0xdc, 0xa8,
0xc6, 0x15, 0x01, 0x9e, 0x47, 0x98, 0x68, 0x61, 0xb1, 0x1d, 0x73, 0x1a, 0xce, 0xd1, 0x3b, 0x8a,
0x51, 0x8b, 0xb0, 0x53, 0x1a, 0xce, 0xc9, 0xa7, 0xa0, 0xc5, 0x14, 0x3f, 0x60, 0x96, 0x23, 0x26,
0x9f, 0x9c, 0xcf, 0x8d, 0x08, 0x1f, 0x45, 0xb0, 0x68, 0xf0, 0xb2, 0xc8, 0x4c, 0x9f, 0x5a, 0x33,
0xd3, 0x11, 0x5e, 0x94, 0x3b, 0xa7, 0x2a, 0xf1, 0x11, 0xb5, 0x66, 0xe7, 0x21, 0xe5, 0xe4, 0x0b,
0xf8, 0x28, 0xb5, 0x98, 0xa6, 0xe8, 0xb2, 0x8a, 0x49, 0x90, 0x6c, 0xa6, 0xc9, 0x91, 0xa7, 0xa0,
0x88, 0x89, 0x61, 0x4e, 0x03, 0x46, 0x39, 0x9b, 0x45, 0x75, 0x5c, 0x13, 0x58, 0x57, 0x42, 0xa4,
0x09, 0x65, 0x76, 0xe3, 0x5b, 0x01, 0x9b, 0xe1, 0xc4, 0xa8, 0x18, 0xf1, 0xa7, 0x38, 0x1c, 0x72,
0x2f, 0xa0, 0xd7, 0xcc, 0x74, 0xa9, 0xc3, 0xb0, 0xba, 0xab, 0x46, 0x2d, 0xc2, 0x06, 0xd4, 0x61,
0xfa, 0xc7, 0xb0, 0xfb, 0x35, 0xe3, 0x67, 0xd6, 0xbb, 0x85, 0x35, 0xb3, 0xf8, 0xed, 0x88, 0x06,
0x74, 0xd9, 0x05, 0xbb, 0xb0, 0x95, 0x95, 0x30, 0xce, 0x02, 0x31, 0x80, 0x4a, 0xc1, 0xc2, 0x66,
0x71, 0x70, 0x96, 0x03, 0x33, 0x21, 0x1b, 0x0b, 0x9b, 0x19, 0x92, 0xa4, 0xff, 0x59, 0x2c, 0x7c,
0x69, 0x01, 0xe6, 0x87, 0x5c, 0x73, 0xcd, 0xa8, 0x09, 0x17, 0x8d, 0x6a, 0x84, 0xf4, 0x67, 0xe4,
0x45, 0x34, 0xe9, 0xf3, 0x38, 0x8e, 0x5b, 0xeb, 0xb5, 0xa7, 0x46, 0xfe, 0xe7, 0x40, 0x2c, 0x77,
0xea, 0x39, 0xc2, 0xad, 0x7c, 0x1e, 0xb0, 0x70, 0xee, 0xd9, 0x33, 0x0c, 0x56, 0xdd, 0xd8, 0x8c,
0x25, 0x93, 0x58, 0x20, 0xe8, 0xc9, 0x66, 0xbd, 0xa4, 0x17, 0x25, 0x3d, 0x96, 0x24, 0x74, 0xfd,
0x2d, 0xec, 0x8e, 0xef, 0x73, 0x10, 0xf9, 0x0a, 0xc0, 0x4f, 0xfc, 0x82, 0x96, 0xd4, 0x8e, 0xf6,
0xee, 0x3e, 0x78, 0xe9, 0x3b, 0x23, 0xc5, 0xd7, 0xf7, 0xa0, 0xb5, 0x4e, 0xb5, 0xac, 0x81, 0xc3,
0xe7, 0x50, 0x89, 0x77, 0x1b, 0xa2, 0x40, 0xe5, 0x6c, 0x38, 0x1c, 0x99, 0xc3, 0x8b, 0x89, 0xf6,
0x88, 0xd4, 0xa0, 0x8c, 0x5f, 0xfd, 0x81, 0x96, 0x3b, 0x0c, 0xa1, 0x9a, 0xac, 0x36, 0xa4, 0x0e,
0xd5, 0xfe, 0xa0, 0x3f, 0xe9, 0x77, 0x26, 0xbd, 0x63, 0xed, 0x11, 0xf9, 0x08, 0x36, 0x47, 0x46,
0xaf, 0x7f, 0xde, 0xf9, 0xba, 0x67, 0x1a, 0xbd, 0x37, 0xbd, 0xce, 0x59, 0xef, 0x58, 0xcb, 0x11,
0x02, 0xea, 0xe9, 0xe4, 0xac, 0x6b, 0x8e, 0x2e, 0x5e, 0x9d, 0xf5, 0xc7, 0xa7, 0xbd, 0x63, 0x2d,
0x2f, 0x74, 0x8e, 0x2f, 0xba, 0xdd, 0xde, 0x78, 0xac, 0x15, 0x08, 0xc0, 0xc6, 0x49, 0xa7, 0x2f,
0xc8, 0x45, 0xb2, 0x05, 0x8d, 0xfe, 0xe0, 0xcd, 0xb0, 0xdf, 0xed, 0x99, 0xe3, 0xde, 0x64, 0x22,
0xc0, 0xd2, 0xe1, 0xbf, 0x72, 0x50, 0xcf, 0x6c, 0x47, 0x64, 0x07, 0xb6, 0xc4, 0x91, 0x0b, 0x43,
0xdc, 0xd4, 0x19, 0x0f, 0x07, 0xe6, 0x60, 0x38, 0xe8, 0x69, 0x8f, 0xc8, 0xc7, 0xb0, 0xb3, 0x22,
0x18, 0x9e, 0x9c, 0x74, 0x4f, 0x3b, 0xe2, 0xf1, 0xa4, 0x05, 0xdb, 0x2b, 0xc2, 0x49, 0xff, 0xbc,
0x27, 0xac, 0xcc, 0x93, 0x7d, 0xd8, 0x5b, 0x91, 0x8d, 0xbf, 0xe9, 0xf5, 0x46, 0x09, 0xa3, 0x40,
0x9e, 0xc3, 0xd3, 0x15, 0x46, 0x7f, 0x30, 0xbe, 0x38, 0x39, 0xe9, 0x77, 0xfb, 0xbd, 0xc1, 0xc4,
0x7c, 0xd3, 0x39, 0xbb, 0xe8, 0x69, 0x45, 0xb2, 0x07, 0xcd, 0xd5, 0x4b, 0x7a, 0xe7, 0xa3, 0xa1,
0xd1, 0x31, 0xde, 0x6a, 0x25, 0xf2, 0x0c, 0x9e, 0xdc, 0x51, 0xd2, 0x1d, 0x1a, 0x46, 0xaf, 0x3b,
0x31, 0x3b, 0xe7, 0xc3, 0x8b, 0xc1, 0x44, 0xdb, 0x38, 0x6c, 0x8b, 0x0d, 0x64, 0x25, 0xfb, 0x84,
0xcb, 0x2e, 0x06, 0x3f, 0x1b, 0x0c, 0xbf, 0x19, 0x68, 0x8f, 0x84, 0xe7, 0x27, 0xa7, 0x46, 0x6f,
0x7c, 0x3a, 0x3c, 0x3b, 0xd6, 0x72, 0x47, 0xff, 0xae, 0xc8, 0xed, 0xb7, 0x8b, 0xbf, 0x99, 0x89,
0x01, 0xe5, 0xe8, 0x57, 0x30, 0xd9, 0x59, 0xa6, 0x47, 0xe6, 0x77, 0x71, 0xeb, 0xa3, 0xcc, 0x06,
0x13, 0xa7, 0x81, 0xbe, 0xf3, 0xbb, 0xbf, 0xfd, 0xfd, 0xf7, 0xf9, 0x4d, 0x5d, 0x69, 0xbf, 0xff,
0xa2, 0x2d, 0x18, 0x6d, 0x6f, 0xc1, 0x5f, 0xe6, 0x0e, 0xc9, 0x10, 0x36, 0xe4, 0xef, 0x28, 0xb2,
0x9d, 0x51, 0x99, 0xfc, 0xb0, 0xba, 0x4f, 0xe3, 0x36, 0x6a, 0xd4, 0xf4, 0x5a, 0xa2, 0xd1, 0x72,
0x85, 0xc2, 0x1f, 0x43, 0x39, 0xda, 0xe1, 0x53, 0x8f, 0xcc, 0x6e, 0xf5, 0xad, 0x75, 0x6b, 0xd6,
0x8f, 0x72, 0xe4, 0x17, 0x50, 0x4d, 0x36, 0x34, 0xb2, 0x9b, 0x2a, 0x80, 0xec, 0x26, 0xd7, 0x6a,
0xad, 0x13, 0x65, 0x9f, 0x45, 0xd4, 0xe4, 0x59, 0xb8, 0xbd, 0x91, 0x0b, 0x59, 0x07, 0x62, 0x7b,
0x23, 0xcd, 0xcc, 0xf5, 0xa9, 0x85, 0x6e, 0xed, 0xc3, 0xf4, 0x16, 0xaa, 0x7c, 0x4c, 0x48, 0x46,
0x65, 0xfb, 0x5b, 0x6b, 0xf6, 0x6b, 0xf2, 0x4b, 0x50, 0xa2, 0x00, 0xe0, 0x8e, 0x45, 0x96, 0xce,
0x4a, 0x2f, 0x82, 0xad, 0xa5, 0x31, 0xab, 0xdb, 0xd8, 0x1a, 0xed, 0xde, 0x82, 0xb7, 0x39, 0x6a,
0xbb, 0x4c, 0xb4, 0xe3, 0xec, 0x4e, 0x69, 0x4f, 0x6f, 0x41, 0x59, 0xed, 0x99, 0x29, 0xaf, 0xef,
0xa3, 0xf6, 0x16, 0x69, 0x66, 0xb4, 0xbf, 0x13, 0x9c, 0xf6, 0xb7, 0xd4, 0xe1, 0xc2, 0x02, 0x55,
0xb4, 0x6e, 0x0c, 0xf9, 0x83, 0x36, 0x2c, 0xbd, 0xb6, 0xb2, 0xd3, 0xea, 0xbb, 0x78, 0xc9, 0x16,
0xd9, 0x4c, 0xa5, 0x42, 0x62, 0xc1, 0x52, 0xfb, 0x83, 0x36, 0xa4, 0xb5, 0x67, 0x4d, 0x78, 0x82,
0xda, 0x77, 0xc9, 0x4e, 0x5a, 0x7b, 0xda, 0x82, 0xb7, 0x50, 0x17, 0x77, 0xc4, 0xc3, 0x3b, 0x4c,
0x65, 0x72, 0x66, 0x43, 0x68, 0xed, 0xdc, 0xc1, 0xb3, 0xd5, 0x41, 0x1a, 0x78, 0x45, 0x48, 0x79,
0x5b, 0x6e, 0x05, 0x84, 0x03, 0xb9, 0x3b, 0xd7, 0x88, 0x9e, 0xe8, 0xb9, 0x77, 0xe8, 0xb5, 0x1e,
0xec, 0xdf, 0xfa, 0x1e, 0x5e, 0xb8, 0x4d, 0x1e, 0xe3, 0x85, 0x31, 0xa1, 0xed, 0x4b, 0xfd, 0xbf,
0x01, 0x32, 0x7e, 0xe8, 0xd6, 0x7b, 0x27, 0x49, 0xeb, 0xd9, 0x83, 0x9c, 0xac, 0x43, 0xf5, 0xb5,
0x97, 0xbf, 0xcc, 0x1d, 0x5e, 0x6e, 0xe0, 0x7f, 0xdd, 0xbe, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff,
0xff, 0x46, 0x7a, 0xcd, 0x4b, 0xac, 0x13, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1679,6 +1947,17 @@ type SwapClientClient interface {
//* loop: `listauth`
//GetLsatTokens returns all LSAT tokens the daemon ever paid for.
GetLsatTokens(ctx context.Context, in *TokensRequest, opts ...grpc.CallOption) (*TokensResponse, error)
//
//GetLiquidityParams gets the parameters that the daemon's liquidity manager
//is currently configured with. This may be nil if nothing is configured.
//[EXPERIMENTAL]: endpoint is subject to change.
GetLiquidityParams(ctx context.Context, in *GetLiquidityParamsRequest, opts ...grpc.CallOption) (*LiquidityParameters, error)
//
//SetLiquidityParams sets a new set of parameters for the daemon's liquidity
//manager. Note that the full set of parameters must be provided, because
//this call fully overwrites our existing parameters.
//[EXPERIMENTAL]: endpoint is subject to change.
SetLiquidityParams(ctx context.Context, in *SetLiquidityParamsRequest, opts ...grpc.CallOption) (*SetLiquidityParamsResponse, error)
}
type swapClientClient struct {
@ -1802,6 +2081,24 @@ func (c *swapClientClient) GetLsatTokens(ctx context.Context, in *TokensRequest,
return out, nil
}
func (c *swapClientClient) GetLiquidityParams(ctx context.Context, in *GetLiquidityParamsRequest, opts ...grpc.CallOption) (*LiquidityParameters, error) {
out := new(LiquidityParameters)
err := c.cc.Invoke(ctx, "/looprpc.SwapClient/GetLiquidityParams", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *swapClientClient) SetLiquidityParams(ctx context.Context, in *SetLiquidityParamsRequest, opts ...grpc.CallOption) (*SetLiquidityParamsResponse, error) {
out := new(SetLiquidityParamsResponse)
err := c.cc.Invoke(ctx, "/looprpc.SwapClient/SetLiquidityParams", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// SwapClientServer is the server API for SwapClient service.
type SwapClientServer interface {
//* loop: `out`
@ -1842,6 +2139,17 @@ type SwapClientServer interface {
//* loop: `listauth`
//GetLsatTokens returns all LSAT tokens the daemon ever paid for.
GetLsatTokens(context.Context, *TokensRequest) (*TokensResponse, error)
//
//GetLiquidityParams gets the parameters that the daemon's liquidity manager
//is currently configured with. This may be nil if nothing is configured.
//[EXPERIMENTAL]: endpoint is subject to change.
GetLiquidityParams(context.Context, *GetLiquidityParamsRequest) (*LiquidityParameters, error)
//
//SetLiquidityParams sets a new set of parameters for the daemon's liquidity
//manager. Note that the full set of parameters must be provided, because
//this call fully overwrites our existing parameters.
//[EXPERIMENTAL]: endpoint is subject to change.
SetLiquidityParams(context.Context, *SetLiquidityParamsRequest) (*SetLiquidityParamsResponse, error)
}
// UnimplementedSwapClientServer can be embedded to have forward compatible implementations.
@ -1878,6 +2186,12 @@ func (*UnimplementedSwapClientServer) GetLoopInQuote(ctx context.Context, req *Q
func (*UnimplementedSwapClientServer) GetLsatTokens(ctx context.Context, req *TokensRequest) (*TokensResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetLsatTokens not implemented")
}
func (*UnimplementedSwapClientServer) GetLiquidityParams(ctx context.Context, req *GetLiquidityParamsRequest) (*LiquidityParameters, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetLiquidityParams not implemented")
}
func (*UnimplementedSwapClientServer) SetLiquidityParams(ctx context.Context, req *SetLiquidityParamsRequest) (*SetLiquidityParamsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method SetLiquidityParams not implemented")
}
func RegisterSwapClientServer(s *grpc.Server, srv SwapClientServer) {
s.RegisterService(&_SwapClient_serviceDesc, srv)
@ -2066,6 +2380,42 @@ func _SwapClient_GetLsatTokens_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _SwapClient_GetLiquidityParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetLiquidityParamsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SwapClientServer).GetLiquidityParams(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/looprpc.SwapClient/GetLiquidityParams",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SwapClientServer).GetLiquidityParams(ctx, req.(*GetLiquidityParamsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _SwapClient_SetLiquidityParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SetLiquidityParamsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SwapClientServer).SetLiquidityParams(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/looprpc.SwapClient/SetLiquidityParams",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SwapClientServer).SetLiquidityParams(ctx, req.(*SetLiquidityParamsRequest))
}
return interceptor(ctx, in, info, handler)
}
var _SwapClient_serviceDesc = grpc.ServiceDesc{
ServiceName: "looprpc.SwapClient",
HandlerType: (*SwapClientServer)(nil),
@ -2106,6 +2456,14 @@ var _SwapClient_serviceDesc = grpc.ServiceDesc{
MethodName: "GetLsatTokens",
Handler: _SwapClient_GetLsatTokens_Handler,
},
{
MethodName: "GetLiquidityParams",
Handler: _SwapClient_GetLiquidityParams_Handler,
},
{
MethodName: "SetLiquidityParams",
Handler: _SwapClient_SetLiquidityParams_Handler,
},
},
Streams: []grpc.StreamDesc{
{

@ -363,6 +363,58 @@ func local_request_SwapClient_GetLsatTokens_0(ctx context.Context, marshaler run
}
func request_SwapClient_GetLiquidityParams_0(ctx context.Context, marshaler runtime.Marshaler, client SwapClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq GetLiquidityParamsRequest
var metadata runtime.ServerMetadata
msg, err := client.GetLiquidityParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_SwapClient_GetLiquidityParams_0(ctx context.Context, marshaler runtime.Marshaler, server SwapClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq GetLiquidityParamsRequest
var metadata runtime.ServerMetadata
msg, err := server.GetLiquidityParams(ctx, &protoReq)
return msg, metadata, err
}
func request_SwapClient_SetLiquidityParams_0(ctx context.Context, marshaler runtime.Marshaler, client SwapClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq SetLiquidityParamsRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.SetLiquidityParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_SwapClient_SetLiquidityParams_0(ctx context.Context, marshaler runtime.Marshaler, server SwapClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq SetLiquidityParamsRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.SetLiquidityParams(ctx, &protoReq)
return msg, metadata, err
}
// RegisterSwapClientHandlerServer registers the http handlers for service SwapClient to "mux".
// UnaryRPC :call SwapClientServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@ -548,6 +600,46 @@ func RegisterSwapClientHandlerServer(ctx context.Context, mux *runtime.ServeMux,
})
mux.Handle("GET", pattern_SwapClient_GetLiquidityParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_SwapClient_GetLiquidityParams_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_SwapClient_GetLiquidityParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("POST", pattern_SwapClient_SetLiquidityParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_SwapClient_SetLiquidityParams_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_SwapClient_SetLiquidityParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -769,6 +861,46 @@ func RegisterSwapClientHandlerClient(ctx context.Context, mux *runtime.ServeMux,
})
mux.Handle("GET", pattern_SwapClient_GetLiquidityParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_SwapClient_GetLiquidityParams_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_SwapClient_GetLiquidityParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("POST", pattern_SwapClient_SetLiquidityParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_SwapClient_SetLiquidityParams_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_SwapClient_SetLiquidityParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -790,6 +922,10 @@ var (
pattern_SwapClient_GetLoopInQuote_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "loop", "in", "quote", "amt"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_SwapClient_GetLsatTokens_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "lsat", "tokens"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_SwapClient_GetLiquidityParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "liquidity", "params"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_SwapClient_SetLiquidityParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "liquidity", "params"}, "", runtime.AssumeColonVerbOpt(true)))
)
var (
@ -810,4 +946,8 @@ var (
forward_SwapClient_GetLoopInQuote_0 = runtime.ForwardResponseMessage
forward_SwapClient_GetLsatTokens_0 = runtime.ForwardResponseMessage
forward_SwapClient_GetLiquidityParams_0 = runtime.ForwardResponseMessage
forward_SwapClient_SetLiquidityParams_0 = runtime.ForwardResponseMessage
)

@ -104,6 +104,30 @@ service SwapClient {
get: "/v1/lsat/tokens"
};
}
/*
GetLiquidityParams gets the parameters that the daemon's liquidity manager
is currently configured with. This may be nil if nothing is configured.
[EXPERIMENTAL]: endpoint is subject to change.
*/
rpc GetLiquidityParams(GetLiquidityParamsRequest) returns (LiquidityParameters){
option (google.api.http) = {
get: "/v1/liquidity/params"
};
}
/*
SetLiquidityParams sets a new set of parameters for the daemon's liquidity
manager. Note that the full set of parameters must be provided, because
this call fully overwrites our existing parameters.
[EXPERIMENTAL]: endpoint is subject to change.
*/
rpc SetLiquidityParams(SetLiquidityParamsRequest) returns (SetLiquidityParamsResponse){
option (google.api.http) = {
post: "/v1/liquidity/params"
body: "*"
};
}
}
message LoopOutRequest {
@ -666,3 +690,56 @@ message LsatToken {
*/
string storage_name = 8;
}
message GetLiquidityParamsRequest{}
message LiquidityParameters{
/*
A set of liquidity rules that describe the desired liquidity balance.
*/
repeated LiquidityRule rules = 1;
}
enum LiquidityRuleType{
UNKNOWN = 0;
THRESHOLD = 1;
}
message LiquidityRule{
/*
The short channel ID of the channel that this rule should be applied to.
*/
uint64 channel_id = 1;
/*
Type indicates the type of rule that this message rule represents. Setting
this value will determine which fields are used in the message. The comments
on each field in this message will be prefixed with the LiquidityRuleType
they belong to.
*/
LiquidityRuleType type = 2;
/*
THRESHOLD: The percentage of total capacity that incoming capacity should
not drop beneath.
*/
uint32 incoming_threshold = 3;
/*
THRESHOLD: The percentage of total capacity that outgoing capacity should
not drop beneath.
*/
uint32 outgoing_threshold = 4;
}
message SetLiquidityParamsRequest{
/*
Parameters is the desired new set of parameters for the liquidity management
subsystem. Note that the current set of parameters will be completely
overwritten by the parameters provided (if they are valid), so the full set
of parameters should be provided for each call.
*/
LiquidityParameters parameters = 1;
}
message SetLiquidityParamsResponse{}

@ -11,6 +11,60 @@
"application/json"
],
"paths": {
"/v1/liquidity/params": {
"get": {
"summary": "GetLiquidityParams gets the parameters that the daemon's liquidity manager\nis currently configured with. This may be nil if nothing is configured.\n[EXPERIMENTAL]: endpoint is subject to change.",
"operationId": "GetLiquidityParams",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/looprpcLiquidityParameters"
}
},
"default": {
"description": "An unexpected error response",
"schema": {
"$ref": "#/definitions/runtimeError"
}
}
},
"tags": [
"SwapClient"
]
},
"post": {
"summary": "SetLiquidityParams sets a new set of parameters for the daemon's liquidity\nmanager. Note that the full set of parameters must be provided, because\nthis call fully overwrites our existing parameters.\n[EXPERIMENTAL]: endpoint is subject to change.",
"operationId": "SetLiquidityParams",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/looprpcSetLiquidityParamsResponse"
}
},
"default": {
"description": "An unexpected error response",
"schema": {
"$ref": "#/definitions/runtimeError"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/looprpcSetLiquidityParamsRequest"
}
}
],
"tags": [
"SwapClient"
]
}
},
"/v1/loop/in": {
"post": {
"summary": "* loop: `in`\nLoopIn initiates a loop in swap with the given parameters. The call\nreturns after the swap has been set up with the swap server. From that\npoint onwards, progress can be tracked via the SwapStatus stream\nthat is returned from Monitor().",
@ -367,6 +421,50 @@
}
}
},
"looprpcLiquidityParameters": {
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"$ref": "#/definitions/looprpcLiquidityRule"
},
"description": "A set of liquidity rules that describe the desired liquidity balance."
}
}
},
"looprpcLiquidityRule": {
"type": "object",
"properties": {
"channel_id": {
"type": "string",
"format": "uint64",
"description": "The short channel ID of the channel that this rule should be applied to."
},
"type": {
"$ref": "#/definitions/looprpcLiquidityRuleType",
"description": "Type indicates the type of rule that this message rule represents. Setting\nthis value will determine which fields are used in the message. The comments\non each field in this message will be prefixed with the LiquidityRuleType\nthey belong to."
},
"incoming_threshold": {
"type": "integer",
"format": "int64",
"description": "THRESHOLD: The percentage of total capacity that incoming capacity should\nnot drop beneath."
},
"outgoing_threshold": {
"type": "integer",
"format": "int64",
"description": "THRESHOLD: The percentage of total capacity that outgoing capacity should\nnot drop beneath."
}
}
},
"looprpcLiquidityRuleType": {
"type": "string",
"enum": [
"UNKNOWN",
"THRESHOLD"
],
"default": "UNKNOWN"
},
"looprpcListSwapsResponse": {
"type": "object",
"properties": {
@ -588,6 +686,18 @@
}
}
},
"looprpcSetLiquidityParamsRequest": {
"type": "object",
"properties": {
"parameters": {
"$ref": "#/definitions/looprpcLiquidityParameters",
"description": "Parameters is the desired new set of parameters for the liquidity management\nsubsystem. Note that the current set of parameters will be completely\noverwritten by the parameters provided (if they are valid), so the full set\nof parameters should be provided for each call."
}
}
},
"looprpcSetLiquidityParamsResponse": {
"type": "object"
},
"looprpcSwapResponse": {
"type": "object",
"properties": {

Loading…
Cancel
Save