looprpc: expose static loop-in monitor state

This commit is contained in:
Gustavo Stingelin 2026-07-08 23:35:19 -03:00
parent 4bb7d5ee29
commit 4c03e46928
No known key found for this signature in database
GPG key ID: 15CBADFE29F2017B
5 changed files with 246 additions and 129 deletions

View file

@ -400,9 +400,16 @@ func rpcToFee(req *clientrpc.LiquidityParameters) (FeeLimit, error) {
// rpcToRule switches on rpc rule type to convert to our rule interface. // rpcToRule switches on rpc rule type to convert to our rule interface.
func rpcToRule(rule *clientrpc.LiquidityRule) (*SwapRule, error) { func rpcToRule(rule *clientrpc.LiquidityRule) (*SwapRule, error) {
swapType := swap.TypeOut var swapType swap.Type
if rule.SwapType == clientrpc.SwapType_LOOP_IN { switch rule.SwapType {
case clientrpc.SwapType_LOOP_OUT:
swapType = swap.TypeOut
case clientrpc.SwapType_LOOP_IN:
swapType = swap.TypeIn swapType = swap.TypeIn
default:
return nil, fmt.Errorf("unknown swap type: %v", rule.SwapType)
} }
switch rule.Type { switch rule.Type {

View file

@ -3,9 +3,62 @@ package liquidity
import ( import (
"testing" "testing"
clientrpc "github.com/lightninglabs/loop/looprpc"
"github.com/lightninglabs/loop/swap"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
// TestRPCToRuleSwapType verifies RPC swap type conversion.
func TestRPCToRuleSwapType(t *testing.T) {
tests := []struct {
name string
swapType clientrpc.SwapType
wantType swap.Type
wantErr bool
}{
{
name: "loop out",
swapType: clientrpc.SwapType_LOOP_OUT,
wantType: swap.TypeOut,
},
{
name: "loop in",
swapType: clientrpc.SwapType_LOOP_IN,
wantType: swap.TypeIn,
},
{
name: "static loop in rejected",
swapType: clientrpc.SwapType_STATIC_LOOP_IN,
wantErr: true,
},
{
name: "unknown swap type rejected",
swapType: clientrpc.SwapType(99),
wantErr: true,
},
}
for _, testCase := range tests {
t.Run(testCase.name, func(t *testing.T) {
rpcRule := &clientrpc.LiquidityRule{
Type: clientrpc.LiquidityRuleType_THRESHOLD,
IncomingThreshold: 10,
OutgoingThreshold: 20,
SwapType: testCase.swapType,
}
got, err := rpcToRule(rpcRule)
if testCase.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, testCase.wantType, got.Type)
})
}
}
// TestValidateRestrictions tests validating client restrictions against a set // TestValidateRestrictions tests validating client restrictions against a set
// of server restrictions. // of server restrictions.
func TestValidateRestrictions(t *testing.T) { func TestValidateRestrictions(t *testing.T) {

View file

@ -80,6 +80,8 @@ const (
SwapType_LOOP_OUT SwapType = 0 SwapType_LOOP_OUT SwapType = 0
// LOOP_IN indicates a loop in swap (on-chain to off-chain) // LOOP_IN indicates a loop in swap (on-chain to off-chain)
SwapType_LOOP_IN SwapType = 1 SwapType_LOOP_IN SwapType = 1
// STATIC_LOOP_IN indicates a static address loop in swap.
SwapType_STATIC_LOOP_IN SwapType = 2
) )
// Enum value maps for SwapType. // Enum value maps for SwapType.
@ -87,10 +89,12 @@ var (
SwapType_name = map[int32]string{ SwapType_name = map[int32]string{
0: "LOOP_OUT", 0: "LOOP_OUT",
1: "LOOP_IN", 1: "LOOP_IN",
2: "STATIC_LOOP_IN",
} }
SwapType_value = map[string]int32{ SwapType_value = map[string]int32{
"LOOP_OUT": 0, "LOOP_OUT": 0,
"LOOP_IN": 1, "LOOP_IN": 1,
"STATIC_LOOP_IN": 2,
} }
) )
@ -1474,8 +1478,12 @@ type SwapStatus struct {
IdBytes []byte `protobuf:"bytes,11,opt,name=id_bytes,json=idBytes,proto3" json:"id_bytes,omitempty"` IdBytes []byte `protobuf:"bytes,11,opt,name=id_bytes,json=idBytes,proto3" json:"id_bytes,omitempty"`
// The type of the swap. // The type of the swap.
Type SwapType `protobuf:"varint,3,opt,name=type,proto3,enum=looprpc.SwapType" json:"type,omitempty"` Type SwapType `protobuf:"varint,3,opt,name=type,proto3,enum=looprpc.SwapType" json:"type,omitempty"`
// State the swap is currently in, see State enum. // Generic loop-in/loop-out state for swaps.
State SwapState `protobuf:"varint,4,opt,name=state,proto3,enum=looprpc.SwapState" json:"state,omitempty"` State SwapState `protobuf:"varint,4,opt,name=state,proto3,enum=looprpc.SwapState" json:"state,omitempty"`
// Types that are valid to be assigned to StaticLoopInStateOptional:
//
// *SwapStatus_StaticLoopInState
StaticLoopInStateOptional isSwapStatus_StaticLoopInStateOptional `protobuf_oneof:"static_loop_in_state_optional"`
// A failure reason for the swap, only set if the swap has failed. // A failure reason for the swap, only set if the swap has failed.
FailureReason FailureReason `protobuf:"varint,14,opt,name=failure_reason,json=failureReason,proto3,enum=looprpc.FailureReason" json:"failure_reason,omitempty"` FailureReason FailureReason `protobuf:"varint,14,opt,name=failure_reason,json=failureReason,proto3,enum=looprpc.FailureReason" json:"failure_reason,omitempty"`
// Initiation time of the swap. // Initiation time of the swap.
@ -1578,6 +1586,22 @@ func (x *SwapStatus) GetState() SwapState {
return SwapState_INITIATED return SwapState_INITIATED
} }
func (x *SwapStatus) GetStaticLoopInStateOptional() isSwapStatus_StaticLoopInStateOptional {
if x != nil {
return x.StaticLoopInStateOptional
}
return nil
}
func (x *SwapStatus) GetStaticLoopInState() StaticAddressLoopInSwapState {
if x != nil {
if x, ok := x.StaticLoopInStateOptional.(*SwapStatus_StaticLoopInState); ok {
return x.StaticLoopInState
}
}
return StaticAddressLoopInSwapState_UNKNOWN_STATIC_ADDRESS_SWAP_STATE
}
func (x *SwapStatus) GetFailureReason() FailureReason { func (x *SwapStatus) GetFailureReason() FailureReason {
if x != nil { if x != nil {
return x.FailureReason return x.FailureReason
@ -1670,6 +1694,17 @@ func (x *SwapStatus) GetAssetInfo() *AssetLoopOutInfo {
return nil return nil
} }
type isSwapStatus_StaticLoopInStateOptional interface {
isSwapStatus_StaticLoopInStateOptional()
}
type SwapStatus_StaticLoopInState struct {
// Static address loop-in FSM state when type is STATIC_LOOP_IN.
StaticLoopInState StaticAddressLoopInSwapState `protobuf:"varint,20,opt,name=static_loop_in_state,json=staticLoopInState,proto3,enum=looprpc.StaticAddressLoopInSwapState,oneof"`
}
func (*SwapStatus_StaticLoopInState) isSwapStatus_StaticLoopInStateOptional() {}
type ListSwapsRequest struct { type ListSwapsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
// Optional filter to only return swaps that match the filter. // Optional filter to only return swaps that match the filter.
@ -6704,14 +6739,15 @@ const file_client_proto_rawDesc = "" +
"\x12htlc_address_p2wsh\x18\x05 \x01(\tR\x10htlcAddressP2wsh\x12*\n" + "\x12htlc_address_p2wsh\x18\x05 \x01(\tR\x10htlcAddressP2wsh\x12*\n" +
"\x11htlc_address_p2tr\x18\a \x01(\tR\x0fhtlcAddressP2tr\x12%\n" + "\x11htlc_address_p2tr\x18\a \x01(\tR\x0fhtlcAddressP2tr\x12%\n" +
"\x0eserver_message\x18\x06 \x01(\tR\rserverMessageJ\x04\b\x04\x10\x05\"\x10\n" + "\x0eserver_message\x18\x06 \x01(\tR\rserverMessageJ\x04\b\x04\x10\x05\"\x10\n" +
"\x0eMonitorRequest\"\xb1\x05\n" + "\x0eMonitorRequest\"\xac\x06\n" +
"\n" + "\n" +
"SwapStatus\x12\x10\n" + "SwapStatus\x12\x10\n" +
"\x03amt\x18\x01 \x01(\x03R\x03amt\x12\x12\n" + "\x03amt\x18\x01 \x01(\x03R\x03amt\x12\x12\n" +
"\x02id\x18\x02 \x01(\tB\x02\x18\x01R\x02id\x12\x19\n" + "\x02id\x18\x02 \x01(\tB\x02\x18\x01R\x02id\x12\x19\n" +
"\bid_bytes\x18\v \x01(\fR\aidBytes\x12%\n" + "\bid_bytes\x18\v \x01(\fR\aidBytes\x12%\n" +
"\x04type\x18\x03 \x01(\x0e2\x11.looprpc.SwapTypeR\x04type\x12(\n" + "\x04type\x18\x03 \x01(\x0e2\x11.looprpc.SwapTypeR\x04type\x12(\n" +
"\x05state\x18\x04 \x01(\x0e2\x12.looprpc.SwapStateR\x05state\x12=\n" + "\x05state\x18\x04 \x01(\x0e2\x12.looprpc.SwapStateR\x05state\x12X\n" +
"\x14static_loop_in_state\x18\x14 \x01(\x0e2%.looprpc.StaticAddressLoopInSwapStateH\x00R\x11staticLoopInState\x12=\n" +
"\x0efailure_reason\x18\x0e \x01(\x0e2\x16.looprpc.FailureReasonR\rfailureReason\x12'\n" + "\x0efailure_reason\x18\x0e \x01(\x0e2\x16.looprpc.FailureReasonR\rfailureReason\x12'\n" +
"\x0finitiation_time\x18\x05 \x01(\x03R\x0einitiationTime\x12(\n" + "\x0finitiation_time\x18\x05 \x01(\x03R\x0einitiationTime\x12(\n" +
"\x10last_update_time\x18\x06 \x01(\x03R\x0elastUpdateTime\x12%\n" + "\x10last_update_time\x18\x06 \x01(\x03R\x0elastUpdateTime\x12%\n" +
@ -6727,7 +6763,8 @@ const file_client_proto_rawDesc = "" +
"\x11outgoing_chan_set\x18\x11 \x03(\x04R\x0foutgoingChanSet\x12\x14\n" + "\x11outgoing_chan_set\x18\x11 \x03(\x04R\x0foutgoingChanSet\x12\x14\n" +
"\x05label\x18\x0f \x01(\tR\x05label\x128\n" + "\x05label\x18\x0f \x01(\tR\x05label\x128\n" +
"\n" + "\n" +
"asset_info\x18\x13 \x01(\v2\x19.looprpc.AssetLoopOutInfoR\tassetInfo\"s\n" + "asset_info\x18\x13 \x01(\v2\x19.looprpc.AssetLoopOutInfoR\tassetInfoB\x1f\n" +
"\x1dstatic_loop_in_state_optional\"s\n" +
"\x10ListSwapsRequest\x12B\n" + "\x10ListSwapsRequest\x12B\n" +
"\x10list_swap_filter\x18\x01 \x01(\v2\x18.looprpc.ListSwapsFilterR\x0elistSwapFilter\x12\x1b\n" + "\x10list_swap_filter\x18\x01 \x01(\v2\x18.looprpc.ListSwapsFilterR\x0elistSwapFilter\x12\x1b\n" +
"\tmax_swaps\x18\x02 \x01(\x04R\bmaxSwaps\"\xf1\x02\n" + "\tmax_swaps\x18\x02 \x01(\x04R\bmaxSwaps\"\xf1\x02\n" +
@ -7088,10 +7125,11 @@ const file_client_proto_rawDesc = "" +
"\x13asset_cost_offchain\x18\x03 \x01(\x04R\x11assetCostOffchain*;\n" + "\x13asset_cost_offchain\x18\x03 \x01(\x04R\x11assetCostOffchain*;\n" +
"\vAddressType\x12\x18\n" + "\vAddressType\x12\x18\n" +
"\x14ADDRESS_TYPE_UNKNOWN\x10\x00\x12\x12\n" + "\x14ADDRESS_TYPE_UNKNOWN\x10\x00\x12\x12\n" +
"\x0eTAPROOT_PUBKEY\x10\x01*%\n" + "\x0eTAPROOT_PUBKEY\x10\x01*9\n" +
"\bSwapType\x12\f\n" + "\bSwapType\x12\f\n" +
"\bLOOP_OUT\x10\x00\x12\v\n" + "\bLOOP_OUT\x10\x00\x12\v\n" +
"\aLOOP_IN\x10\x01*s\n" + "\aLOOP_IN\x10\x01\x12\x12\n" +
"\x0eSTATIC_LOOP_IN\x10\x02*s\n" +
"\tSwapState\x12\r\n" + "\tSwapState\x12\r\n" +
"\tINITIATED\x10\x00\x12\x15\n" + "\tINITIATED\x10\x00\x12\x15\n" +
"\x11PREIMAGE_REVEALED\x10\x01\x12\x12\n" + "\x11PREIMAGE_REVEALED\x10\x01\x12\x12\n" +
@ -7321,121 +7359,122 @@ var file_client_proto_depIdxs = []int32{
91, // 4: looprpc.LoopInRequest.route_hints:type_name -> looprpc.RouteHint 91, // 4: looprpc.LoopInRequest.route_hints:type_name -> looprpc.RouteHint
1, // 5: looprpc.SwapStatus.type:type_name -> looprpc.SwapType 1, // 5: looprpc.SwapStatus.type:type_name -> looprpc.SwapType
2, // 6: looprpc.SwapStatus.state:type_name -> looprpc.SwapState 2, // 6: looprpc.SwapStatus.state:type_name -> looprpc.SwapState
3, // 7: looprpc.SwapStatus.failure_reason:type_name -> looprpc.FailureReason 8, // 7: looprpc.SwapStatus.static_loop_in_state:type_name -> looprpc.StaticAddressLoopInSwapState
88, // 8: looprpc.SwapStatus.asset_info:type_name -> looprpc.AssetLoopOutInfo 3, // 8: looprpc.SwapStatus.failure_reason:type_name -> looprpc.FailureReason
20, // 9: looprpc.ListSwapsRequest.list_swap_filter:type_name -> looprpc.ListSwapsFilter 88, // 9: looprpc.SwapStatus.asset_info:type_name -> looprpc.AssetLoopOutInfo
9, // 10: looprpc.ListSwapsFilter.swap_type:type_name -> looprpc.ListSwapsFilter.SwapTypeFilter 20, // 10: looprpc.ListSwapsRequest.list_swap_filter:type_name -> looprpc.ListSwapsFilter
18, // 11: looprpc.ListSwapsResponse.swaps:type_name -> looprpc.SwapStatus 9, // 11: looprpc.ListSwapsFilter.swap_type:type_name -> looprpc.ListSwapsFilter.SwapTypeFilter
24, // 12: looprpc.SweepHtlcResponse.not_requested:type_name -> looprpc.PublishNotRequested 18, // 12: looprpc.ListSwapsResponse.swaps:type_name -> looprpc.SwapStatus
25, // 13: looprpc.SweepHtlcResponse.published:type_name -> looprpc.PublishSucceeded 24, // 13: looprpc.SweepHtlcResponse.not_requested:type_name -> looprpc.PublishNotRequested
26, // 14: looprpc.SweepHtlcResponse.failed:type_name -> looprpc.PublishFailed 25, // 14: looprpc.SweepHtlcResponse.published:type_name -> looprpc.PublishSucceeded
91, // 15: looprpc.QuoteRequest.loop_in_route_hints:type_name -> looprpc.RouteHint 26, // 15: looprpc.SweepHtlcResponse.failed:type_name -> looprpc.PublishFailed
85, // 16: looprpc.QuoteRequest.asset_info:type_name -> looprpc.AssetLoopOutRequest 91, // 16: looprpc.QuoteRequest.loop_in_route_hints:type_name -> looprpc.RouteHint
86, // 17: looprpc.OutQuoteResponse.asset_rfq_info:type_name -> looprpc.AssetRfqInfo 85, // 17: looprpc.QuoteRequest.asset_info:type_name -> looprpc.AssetLoopOutRequest
91, // 18: looprpc.ProbeRequest.route_hints:type_name -> looprpc.RouteHint 86, // 18: looprpc.OutQuoteResponse.asset_rfq_info:type_name -> looprpc.AssetRfqInfo
40, // 19: looprpc.TokensResponse.tokens:type_name -> looprpc.L402Token 91, // 19: looprpc.ProbeRequest.route_hints:type_name -> looprpc.RouteHint
41, // 20: looprpc.GetInfoResponse.loop_out_stats:type_name -> looprpc.LoopStats 40, // 20: looprpc.TokensResponse.tokens:type_name -> looprpc.L402Token
41, // 21: looprpc.GetInfoResponse.loop_in_stats:type_name -> looprpc.LoopStats 41, // 21: looprpc.GetInfoResponse.loop_out_stats:type_name -> looprpc.LoopStats
47, // 22: looprpc.LiquidityParameters.rules:type_name -> looprpc.LiquidityRule 41, // 22: looprpc.GetInfoResponse.loop_in_stats:type_name -> looprpc.LoopStats
0, // 23: looprpc.LiquidityParameters.account_addr_type:type_name -> looprpc.AddressType 47, // 23: looprpc.LiquidityParameters.rules:type_name -> looprpc.LiquidityRule
89, // 24: looprpc.LiquidityParameters.easy_asset_params:type_name -> looprpc.LiquidityParameters.EasyAssetParamsEntry 0, // 24: looprpc.LiquidityParameters.account_addr_type:type_name -> looprpc.AddressType
4, // 25: looprpc.LiquidityParameters.loop_in_source:type_name -> looprpc.LoopInSource 89, // 25: looprpc.LiquidityParameters.easy_asset_params:type_name -> looprpc.LiquidityParameters.EasyAssetParamsEntry
1, // 26: looprpc.LiquidityRule.swap_type:type_name -> looprpc.SwapType 4, // 26: looprpc.LiquidityParameters.loop_in_source:type_name -> looprpc.LoopInSource
5, // 27: looprpc.LiquidityRule.type:type_name -> looprpc.LiquidityRuleType 1, // 27: looprpc.LiquidityRule.swap_type:type_name -> looprpc.SwapType
45, // 28: looprpc.SetLiquidityParamsRequest.parameters:type_name -> looprpc.LiquidityParameters 5, // 28: looprpc.LiquidityRule.type:type_name -> looprpc.LiquidityRuleType
6, // 29: looprpc.Disqualified.reason:type_name -> looprpc.AutoReason 45, // 29: looprpc.SetLiquidityParamsRequest.parameters:type_name -> looprpc.LiquidityParameters
14, // 30: looprpc.SuggestSwapsResponse.loop_out:type_name -> looprpc.LoopOutRequest 6, // 30: looprpc.Disqualified.reason:type_name -> looprpc.AutoReason
15, // 31: looprpc.SuggestSwapsResponse.loop_in:type_name -> looprpc.LoopInRequest 14, // 31: looprpc.SuggestSwapsResponse.loop_out:type_name -> looprpc.LoopOutRequest
83, // 32: looprpc.SuggestSwapsResponse.static_loop_in:type_name -> looprpc.StaticAddressLoopInRequest 15, // 32: looprpc.SuggestSwapsResponse.loop_in:type_name -> looprpc.LoopInRequest
51, // 33: looprpc.SuggestSwapsResponse.disqualified:type_name -> looprpc.Disqualified 83, // 33: looprpc.SuggestSwapsResponse.static_loop_in:type_name -> looprpc.StaticAddressLoopInRequest
57, // 34: looprpc.ListReservationsResponse.reservations:type_name -> looprpc.ClientReservation 51, // 34: looprpc.SuggestSwapsResponse.disqualified:type_name -> looprpc.Disqualified
64, // 35: looprpc.ListInstantOutsResponse.swaps:type_name -> looprpc.InstantOut 57, // 35: looprpc.ListReservationsResponse.reservations:type_name -> looprpc.ClientReservation
69, // 36: looprpc.ListUnspentDepositsResponse.utxos:type_name -> looprpc.Utxo 64, // 36: looprpc.ListInstantOutsResponse.swaps:type_name -> looprpc.InstantOut
92, // 37: looprpc.WithdrawDepositsRequest.outpoints:type_name -> lnrpc.OutPoint 69, // 37: looprpc.ListUnspentDepositsResponse.utxos:type_name -> looprpc.Utxo
7, // 38: looprpc.ListStaticAddressDepositsRequest.state_filter:type_name -> looprpc.DepositState 92, // 38: looprpc.WithdrawDepositsRequest.outpoints:type_name -> lnrpc.OutPoint
80, // 39: looprpc.ListStaticAddressDepositsResponse.filtered_deposits:type_name -> looprpc.Deposit 7, // 39: looprpc.ListStaticAddressDepositsRequest.state_filter:type_name -> looprpc.DepositState
81, // 40: looprpc.ListStaticAddressWithdrawalResponse.withdrawals:type_name -> looprpc.StaticAddressWithdrawal 80, // 40: looprpc.ListStaticAddressDepositsResponse.filtered_deposits:type_name -> looprpc.Deposit
82, // 41: looprpc.ListStaticAddressSwapsResponse.swaps:type_name -> looprpc.StaticAddressLoopInSwap 81, // 41: looprpc.ListStaticAddressWithdrawalResponse.withdrawals:type_name -> looprpc.StaticAddressWithdrawal
7, // 42: looprpc.Deposit.state:type_name -> looprpc.DepositState 82, // 42: looprpc.ListStaticAddressSwapsResponse.swaps:type_name -> looprpc.StaticAddressLoopInSwap
80, // 43: looprpc.StaticAddressWithdrawal.deposits:type_name -> looprpc.Deposit 7, // 43: looprpc.Deposit.state:type_name -> looprpc.DepositState
8, // 44: looprpc.StaticAddressLoopInSwap.state:type_name -> looprpc.StaticAddressLoopInSwapState 80, // 44: looprpc.StaticAddressWithdrawal.deposits:type_name -> looprpc.Deposit
80, // 45: looprpc.StaticAddressLoopInSwap.deposits:type_name -> looprpc.Deposit 8, // 45: looprpc.StaticAddressLoopInSwap.state:type_name -> looprpc.StaticAddressLoopInSwapState
91, // 46: looprpc.StaticAddressLoopInRequest.route_hints:type_name -> looprpc.RouteHint 80, // 46: looprpc.StaticAddressLoopInSwap.deposits:type_name -> looprpc.Deposit
80, // 47: looprpc.StaticAddressLoopInResponse.used_deposits:type_name -> looprpc.Deposit 91, // 47: looprpc.StaticAddressLoopInRequest.route_hints:type_name -> looprpc.RouteHint
87, // 48: looprpc.AssetRfqInfo.prepay_asset_rate:type_name -> looprpc.FixedPoint 80, // 48: looprpc.StaticAddressLoopInResponse.used_deposits:type_name -> looprpc.Deposit
87, // 49: looprpc.AssetRfqInfo.swap_asset_rate:type_name -> looprpc.FixedPoint 87, // 49: looprpc.AssetRfqInfo.prepay_asset_rate:type_name -> looprpc.FixedPoint
46, // 50: looprpc.LiquidityParameters.EasyAssetParamsEntry.value:type_name -> looprpc.EasyAssetAutoloopParams 87, // 50: looprpc.AssetRfqInfo.swap_asset_rate:type_name -> looprpc.FixedPoint
14, // 51: looprpc.SwapClient.LoopOut:input_type -> looprpc.LoopOutRequest 46, // 51: looprpc.LiquidityParameters.EasyAssetParamsEntry.value:type_name -> looprpc.EasyAssetAutoloopParams
15, // 52: looprpc.SwapClient.LoopIn:input_type -> looprpc.LoopInRequest 14, // 52: looprpc.SwapClient.LoopOut:input_type -> looprpc.LoopOutRequest
17, // 53: looprpc.SwapClient.Monitor:input_type -> looprpc.MonitorRequest 15, // 53: looprpc.SwapClient.LoopIn:input_type -> looprpc.LoopInRequest
19, // 54: looprpc.SwapClient.ListSwaps:input_type -> looprpc.ListSwapsRequest 17, // 54: looprpc.SwapClient.Monitor:input_type -> looprpc.MonitorRequest
22, // 55: looprpc.SwapClient.SweepHtlc:input_type -> looprpc.SweepHtlcRequest 19, // 55: looprpc.SwapClient.ListSwaps:input_type -> looprpc.ListSwapsRequest
27, // 56: looprpc.SwapClient.SwapInfo:input_type -> looprpc.SwapInfoRequest 22, // 56: looprpc.SwapClient.SweepHtlc:input_type -> looprpc.SweepHtlcRequest
53, // 57: looprpc.SwapClient.AbandonSwap:input_type -> looprpc.AbandonSwapRequest 27, // 57: looprpc.SwapClient.SwapInfo:input_type -> looprpc.SwapInfoRequest
28, // 58: looprpc.SwapClient.LoopOutTerms:input_type -> looprpc.TermsRequest 53, // 58: looprpc.SwapClient.AbandonSwap:input_type -> looprpc.AbandonSwapRequest
31, // 59: looprpc.SwapClient.LoopOutQuote:input_type -> looprpc.QuoteRequest 28, // 59: looprpc.SwapClient.LoopOutTerms:input_type -> looprpc.TermsRequest
28, // 60: looprpc.SwapClient.GetLoopInTerms:input_type -> looprpc.TermsRequest 31, // 60: looprpc.SwapClient.LoopOutQuote:input_type -> looprpc.QuoteRequest
31, // 61: looprpc.SwapClient.GetLoopInQuote:input_type -> looprpc.QuoteRequest 28, // 61: looprpc.SwapClient.GetLoopInTerms:input_type -> looprpc.TermsRequest
34, // 62: looprpc.SwapClient.Probe:input_type -> looprpc.ProbeRequest 31, // 62: looprpc.SwapClient.GetLoopInQuote:input_type -> looprpc.QuoteRequest
36, // 63: looprpc.SwapClient.GetL402Tokens:input_type -> looprpc.TokensRequest 34, // 63: looprpc.SwapClient.Probe:input_type -> looprpc.ProbeRequest
36, // 64: looprpc.SwapClient.GetLsatTokens:input_type -> looprpc.TokensRequest 36, // 64: looprpc.SwapClient.GetL402Tokens:input_type -> looprpc.TokensRequest
38, // 65: looprpc.SwapClient.FetchL402Token:input_type -> looprpc.FetchL402TokenRequest 36, // 65: looprpc.SwapClient.GetLsatTokens:input_type -> looprpc.TokensRequest
42, // 66: looprpc.SwapClient.GetInfo:input_type -> looprpc.GetInfoRequest 38, // 66: looprpc.SwapClient.FetchL402Token:input_type -> looprpc.FetchL402TokenRequest
12, // 67: looprpc.SwapClient.StopDaemon:input_type -> looprpc.StopDaemonRequest 42, // 67: looprpc.SwapClient.GetInfo:input_type -> looprpc.GetInfoRequest
44, // 68: looprpc.SwapClient.GetLiquidityParams:input_type -> looprpc.GetLiquidityParamsRequest 12, // 68: looprpc.SwapClient.StopDaemon:input_type -> looprpc.StopDaemonRequest
48, // 69: looprpc.SwapClient.SetLiquidityParams:input_type -> looprpc.SetLiquidityParamsRequest 44, // 69: looprpc.SwapClient.GetLiquidityParams:input_type -> looprpc.GetLiquidityParamsRequest
50, // 70: looprpc.SwapClient.SuggestSwaps:input_type -> looprpc.SuggestSwapsRequest 48, // 70: looprpc.SwapClient.SetLiquidityParams:input_type -> looprpc.SetLiquidityParamsRequest
55, // 71: looprpc.SwapClient.ListReservations:input_type -> looprpc.ListReservationsRequest 50, // 71: looprpc.SwapClient.SuggestSwaps:input_type -> looprpc.SuggestSwapsRequest
58, // 72: looprpc.SwapClient.InstantOut:input_type -> looprpc.InstantOutRequest 55, // 72: looprpc.SwapClient.ListReservations:input_type -> looprpc.ListReservationsRequest
60, // 73: looprpc.SwapClient.InstantOutQuote:input_type -> looprpc.InstantOutQuoteRequest 58, // 73: looprpc.SwapClient.InstantOut:input_type -> looprpc.InstantOutRequest
62, // 74: looprpc.SwapClient.ListInstantOuts:input_type -> looprpc.ListInstantOutsRequest 60, // 74: looprpc.SwapClient.InstantOutQuote:input_type -> looprpc.InstantOutQuoteRequest
65, // 75: looprpc.SwapClient.NewStaticAddress:input_type -> looprpc.NewStaticAddressRequest 62, // 75: looprpc.SwapClient.ListInstantOuts:input_type -> looprpc.ListInstantOutsRequest
67, // 76: looprpc.SwapClient.ListUnspentDeposits:input_type -> looprpc.ListUnspentDepositsRequest 65, // 76: looprpc.SwapClient.NewStaticAddress:input_type -> looprpc.NewStaticAddressRequest
70, // 77: looprpc.SwapClient.WithdrawDeposits:input_type -> looprpc.WithdrawDepositsRequest 67, // 77: looprpc.SwapClient.ListUnspentDeposits:input_type -> looprpc.ListUnspentDepositsRequest
72, // 78: looprpc.SwapClient.ListStaticAddressDeposits:input_type -> looprpc.ListStaticAddressDepositsRequest 70, // 78: looprpc.SwapClient.WithdrawDeposits:input_type -> looprpc.WithdrawDepositsRequest
74, // 79: looprpc.SwapClient.ListStaticAddressWithdrawals:input_type -> looprpc.ListStaticAddressWithdrawalRequest 72, // 79: looprpc.SwapClient.ListStaticAddressDeposits:input_type -> looprpc.ListStaticAddressDepositsRequest
76, // 80: looprpc.SwapClient.ListStaticAddressSwaps:input_type -> looprpc.ListStaticAddressSwapsRequest 74, // 80: looprpc.SwapClient.ListStaticAddressWithdrawals:input_type -> looprpc.ListStaticAddressWithdrawalRequest
78, // 81: looprpc.SwapClient.GetStaticAddressSummary:input_type -> looprpc.StaticAddressSummaryRequest 76, // 81: looprpc.SwapClient.ListStaticAddressSwaps:input_type -> looprpc.ListStaticAddressSwapsRequest
83, // 82: looprpc.SwapClient.StaticAddressLoopIn:input_type -> looprpc.StaticAddressLoopInRequest 78, // 82: looprpc.SwapClient.GetStaticAddressSummary:input_type -> looprpc.StaticAddressSummaryRequest
10, // 83: looprpc.SwapClient.StaticOpenChannel:input_type -> looprpc.StaticOpenChannelRequest 83, // 83: looprpc.SwapClient.StaticAddressLoopIn:input_type -> looprpc.StaticAddressLoopInRequest
16, // 84: looprpc.SwapClient.LoopOut:output_type -> looprpc.SwapResponse 10, // 84: looprpc.SwapClient.StaticOpenChannel:input_type -> looprpc.StaticOpenChannelRequest
16, // 85: looprpc.SwapClient.LoopIn:output_type -> looprpc.SwapResponse 16, // 85: looprpc.SwapClient.LoopOut:output_type -> looprpc.SwapResponse
18, // 86: looprpc.SwapClient.Monitor:output_type -> looprpc.SwapStatus 16, // 86: looprpc.SwapClient.LoopIn:output_type -> looprpc.SwapResponse
21, // 87: looprpc.SwapClient.ListSwaps:output_type -> looprpc.ListSwapsResponse 18, // 87: looprpc.SwapClient.Monitor:output_type -> looprpc.SwapStatus
23, // 88: looprpc.SwapClient.SweepHtlc:output_type -> looprpc.SweepHtlcResponse 21, // 88: looprpc.SwapClient.ListSwaps:output_type -> looprpc.ListSwapsResponse
18, // 89: looprpc.SwapClient.SwapInfo:output_type -> looprpc.SwapStatus 23, // 89: looprpc.SwapClient.SweepHtlc:output_type -> looprpc.SweepHtlcResponse
54, // 90: looprpc.SwapClient.AbandonSwap:output_type -> looprpc.AbandonSwapResponse 18, // 90: looprpc.SwapClient.SwapInfo:output_type -> looprpc.SwapStatus
30, // 91: looprpc.SwapClient.LoopOutTerms:output_type -> looprpc.OutTermsResponse 54, // 91: looprpc.SwapClient.AbandonSwap:output_type -> looprpc.AbandonSwapResponse
33, // 92: looprpc.SwapClient.LoopOutQuote:output_type -> looprpc.OutQuoteResponse 30, // 92: looprpc.SwapClient.LoopOutTerms:output_type -> looprpc.OutTermsResponse
29, // 93: looprpc.SwapClient.GetLoopInTerms:output_type -> looprpc.InTermsResponse 33, // 93: looprpc.SwapClient.LoopOutQuote:output_type -> looprpc.OutQuoteResponse
32, // 94: looprpc.SwapClient.GetLoopInQuote:output_type -> looprpc.InQuoteResponse 29, // 94: looprpc.SwapClient.GetLoopInTerms:output_type -> looprpc.InTermsResponse
35, // 95: looprpc.SwapClient.Probe:output_type -> looprpc.ProbeResponse 32, // 95: looprpc.SwapClient.GetLoopInQuote:output_type -> looprpc.InQuoteResponse
37, // 96: looprpc.SwapClient.GetL402Tokens:output_type -> looprpc.TokensResponse 35, // 96: looprpc.SwapClient.Probe:output_type -> looprpc.ProbeResponse
37, // 97: looprpc.SwapClient.GetLsatTokens:output_type -> looprpc.TokensResponse 37, // 97: looprpc.SwapClient.GetL402Tokens:output_type -> looprpc.TokensResponse
39, // 98: looprpc.SwapClient.FetchL402Token:output_type -> looprpc.FetchL402TokenResponse 37, // 98: looprpc.SwapClient.GetLsatTokens:output_type -> looprpc.TokensResponse
43, // 99: looprpc.SwapClient.GetInfo:output_type -> looprpc.GetInfoResponse 39, // 99: looprpc.SwapClient.FetchL402Token:output_type -> looprpc.FetchL402TokenResponse
13, // 100: looprpc.SwapClient.StopDaemon:output_type -> looprpc.StopDaemonResponse 43, // 100: looprpc.SwapClient.GetInfo:output_type -> looprpc.GetInfoResponse
45, // 101: looprpc.SwapClient.GetLiquidityParams:output_type -> looprpc.LiquidityParameters 13, // 101: looprpc.SwapClient.StopDaemon:output_type -> looprpc.StopDaemonResponse
49, // 102: looprpc.SwapClient.SetLiquidityParams:output_type -> looprpc.SetLiquidityParamsResponse 45, // 102: looprpc.SwapClient.GetLiquidityParams:output_type -> looprpc.LiquidityParameters
52, // 103: looprpc.SwapClient.SuggestSwaps:output_type -> looprpc.SuggestSwapsResponse 49, // 103: looprpc.SwapClient.SetLiquidityParams:output_type -> looprpc.SetLiquidityParamsResponse
56, // 104: looprpc.SwapClient.ListReservations:output_type -> looprpc.ListReservationsResponse 52, // 104: looprpc.SwapClient.SuggestSwaps:output_type -> looprpc.SuggestSwapsResponse
59, // 105: looprpc.SwapClient.InstantOut:output_type -> looprpc.InstantOutResponse 56, // 105: looprpc.SwapClient.ListReservations:output_type -> looprpc.ListReservationsResponse
61, // 106: looprpc.SwapClient.InstantOutQuote:output_type -> looprpc.InstantOutQuoteResponse 59, // 106: looprpc.SwapClient.InstantOut:output_type -> looprpc.InstantOutResponse
63, // 107: looprpc.SwapClient.ListInstantOuts:output_type -> looprpc.ListInstantOutsResponse 61, // 107: looprpc.SwapClient.InstantOutQuote:output_type -> looprpc.InstantOutQuoteResponse
66, // 108: looprpc.SwapClient.NewStaticAddress:output_type -> looprpc.NewStaticAddressResponse 63, // 108: looprpc.SwapClient.ListInstantOuts:output_type -> looprpc.ListInstantOutsResponse
68, // 109: looprpc.SwapClient.ListUnspentDeposits:output_type -> looprpc.ListUnspentDepositsResponse 66, // 109: looprpc.SwapClient.NewStaticAddress:output_type -> looprpc.NewStaticAddressResponse
71, // 110: looprpc.SwapClient.WithdrawDeposits:output_type -> looprpc.WithdrawDepositsResponse 68, // 110: looprpc.SwapClient.ListUnspentDeposits:output_type -> looprpc.ListUnspentDepositsResponse
73, // 111: looprpc.SwapClient.ListStaticAddressDeposits:output_type -> looprpc.ListStaticAddressDepositsResponse 71, // 111: looprpc.SwapClient.WithdrawDeposits:output_type -> looprpc.WithdrawDepositsResponse
75, // 112: looprpc.SwapClient.ListStaticAddressWithdrawals:output_type -> looprpc.ListStaticAddressWithdrawalResponse 73, // 112: looprpc.SwapClient.ListStaticAddressDeposits:output_type -> looprpc.ListStaticAddressDepositsResponse
77, // 113: looprpc.SwapClient.ListStaticAddressSwaps:output_type -> looprpc.ListStaticAddressSwapsResponse 75, // 113: looprpc.SwapClient.ListStaticAddressWithdrawals:output_type -> looprpc.ListStaticAddressWithdrawalResponse
79, // 114: looprpc.SwapClient.GetStaticAddressSummary:output_type -> looprpc.StaticAddressSummaryResponse 77, // 114: looprpc.SwapClient.ListStaticAddressSwaps:output_type -> looprpc.ListStaticAddressSwapsResponse
84, // 115: looprpc.SwapClient.StaticAddressLoopIn:output_type -> looprpc.StaticAddressLoopInResponse 79, // 115: looprpc.SwapClient.GetStaticAddressSummary:output_type -> looprpc.StaticAddressSummaryResponse
11, // 116: looprpc.SwapClient.StaticOpenChannel:output_type -> looprpc.StaticOpenChannelResponse 84, // 116: looprpc.SwapClient.StaticAddressLoopIn:output_type -> looprpc.StaticAddressLoopInResponse
84, // [84:117] is the sub-list for method output_type 11, // 117: looprpc.SwapClient.StaticOpenChannel:output_type -> looprpc.StaticOpenChannelResponse
51, // [51:84] is the sub-list for method input_type 85, // [85:118] is the sub-list for method output_type
51, // [51:51] is the sub-list for extension type_name 52, // [52:85] is the sub-list for method input_type
51, // [51:51] is the sub-list for extension extendee 52, // [52:52] is the sub-list for extension type_name
0, // [0:51] is the sub-list for field type_name 52, // [52:52] is the sub-list for extension extendee
0, // [0:52] is the sub-list for field type_name
} }
func init() { file_client_proto_init() } func init() { file_client_proto_init() }
@ -7443,6 +7482,9 @@ func file_client_proto_init() {
if File_client_proto != nil { if File_client_proto != nil {
return return
} }
file_client_proto_msgTypes[8].OneofWrappers = []any{
(*SwapStatus_StaticLoopInState)(nil),
}
file_client_proto_msgTypes[13].OneofWrappers = []any{ file_client_proto_msgTypes[13].OneofWrappers = []any{
(*SweepHtlcResponse_NotRequested)(nil), (*SweepHtlcResponse_NotRequested)(nil),
(*SweepHtlcResponse_Published)(nil), (*SweepHtlcResponse_Published)(nil),

View file

@ -546,10 +546,17 @@ message SwapStatus {
SwapType type = 3; SwapType type = 3;
/* /*
State the swap is currently in, see State enum. Generic loop-in/loop-out state for swaps.
*/ */
SwapState state = 4; SwapState state = 4;
oneof static_loop_in_state_optional {
/*
Static address loop-in FSM state when type is STATIC_LOOP_IN.
*/
StaticAddressLoopInSwapState static_loop_in_state = 20;
}
/* /*
A failure reason for the swap, only set if the swap has failed. A failure reason for the swap, only set if the swap has failed.
*/ */
@ -608,6 +615,9 @@ enum SwapType {
// LOOP_IN indicates a loop in swap (on-chain to off-chain) // LOOP_IN indicates a loop in swap (on-chain to off-chain)
LOOP_IN = 1; LOOP_IN = 1;
// STATIC_LOOP_IN indicates a static address loop in swap.
STATIC_LOOP_IN = 2;
} }
enum SwapState { enum SwapState {

View file

@ -3061,7 +3061,11 @@
}, },
"state": { "state": {
"$ref": "#/definitions/looprpcSwapState", "$ref": "#/definitions/looprpcSwapState",
"description": "State the swap is currently in, see State enum." "description": "Generic loop-in/loop-out state for swaps."
},
"static_loop_in_state": {
"$ref": "#/definitions/looprpcStaticAddressLoopInSwapState",
"description": "Static address loop-in FSM state when type is STATIC_LOOP_IN."
}, },
"failure_reason": { "failure_reason": {
"$ref": "#/definitions/looprpcFailureReason", "$ref": "#/definitions/looprpcFailureReason",
@ -3131,10 +3135,11 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"LOOP_OUT", "LOOP_OUT",
"LOOP_IN" "LOOP_IN",
"STATIC_LOOP_IN"
], ],
"default": "LOOP_OUT", "default": "LOOP_OUT",
"title": "- LOOP_OUT: LOOP_OUT indicates an loop out swap (off-chain to on-chain)\n - LOOP_IN: LOOP_IN indicates a loop in swap (on-chain to off-chain)" "description": " - LOOP_OUT: LOOP_OUT indicates an loop out swap (off-chain to on-chain)\n - LOOP_IN: LOOP_IN indicates a loop in swap (on-chain to off-chain)\n - STATIC_LOOP_IN: STATIC_LOOP_IN indicates a static address loop in swap."
}, },
"looprpcSweepHtlcRequest": { "looprpcSweepHtlcRequest": {
"type": "object", "type": "object",