diff --git a/.justfile b/.justfile index efb7605..08500fd 100644 --- a/.justfile +++ b/.justfile @@ -17,10 +17,6 @@ install-loopd-loop: compile-nodeguard-proto: rm -rf nodeguard && protoc -I rpc --go_out=. --go-grpc_out=. rpc/*.proto && mockgen -destination ./nodeguard/nodeguard_mock.go -source nodeguard/nodeguard_grpc.pb.go -package nodeguard && mockgen -destination ./nodeguard/nodeguard_mock.go -source nodeguard/nodeguard_grpc.pb.go -package nodeguard -compile-lnd-client-mock: - mockgen -destination lightning_rpc_mock.go -source lnd/lnrpc/lightning_grpc.pb.go -package main -compile-provider-mock: - mockgen -destination ./provider/provider_mock.go -source provider/provider.go -package provider && mockgen -destination ./provider/loopd_mock.go -source loop/looprpc/client_grpc.pb.go -package provider cover-test: go test ./... -coverprofile=coverage.out; go tool cover -html=coverage.out start-loopserver: build-loopserver diff --git a/Dockerfile b/Dockerfile index 70fce72..871e4e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21.4-alpine AS builder +FROM golang:1.25-alpine AS builder WORKDIR /src/ COPY . . RUN go get -d -v ./... diff --git a/README.md b/README.md index d990f69..a91d0b0 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Flags: --nodeguardHost string Hostname:port to connect to nodeguard --pollingInterval string Interval to poll data (default "15s") --retriesBeforeBackoff int Number of retries before applying backoff to the swap (default 3) + --swapLockTimeout string Timeout for swap locks to automatically expire (default "30m") --swapPublicationOffset string Swap publication deadline offset (Maximum time for the swap provider to publish the swap) (default "60m") --sweepConfTarget string Target number of confirmations for swaps, this uses bitcoin core broken estimator, procced with caution (default "400") ``` @@ -63,6 +64,7 @@ All the flags can be set as environment variables, with the following format, ex - LOGLEVEL (optional) : Log level (default info) from: {trace, debug, info, warn, error, fatal, panic} - LOGFORMAT (optional) : Log format (default json) from: {json, text} - SWAPPUBLICATIONOFFSET (optional) : Swap publication deadline offset (Maximum time for the swap provider to publish the swap) (default 30m) +- SWAPLOCKTIMEOUT (optional) : Timeout for swap locks to automatically expire (default 30m) - RETRIESBEFOREBACKOFF (optional) : Number of retries before applying backoff to the swap (default: 3) - BACKOFFCOEFFICIENT (optional) : Coefficient to apply to the backoff (default: 0.95) - BACKOFFLIMIT (optional) : Limit coefficient of the backoff (default: 0.1) diff --git a/flags.go b/flags.go index 980d1af..ad9c23c 100644 --- a/flags.go +++ b/flags.go @@ -125,6 +125,10 @@ func init() { rootCmd.Flags().String("sweepConfTarget", "400", "Target number of confirmations for swaps, this uses bitcoin core broken estimator, procced with caution") viper.BindPFlag("sweepConfTarget", rootCmd.Flags().Lookup("sweepConfTarget")) + // Swap lock timeout + rootCmd.Flags().String("swapLockTimeout", "30m", "Timeout for swap locks to automatically expire (e.g. 30m, 1h, 45m)") + viper.BindPFlag("swapLockTimeout", rootCmd.Flags().Lookup("swapLockTimeout")) + //Now we set the global vars pollingInterval = viper.GetDuration("pollingInterval") diff --git a/liquidator.go b/liquidator.go index cb6e2c3..9667d15 100644 --- a/liquidator.go +++ b/liquidator.go @@ -639,8 +639,9 @@ func performSwap(info ManageChannelLiquidityInfo, channel *lnrpc.Channel, swapAm WalletId: rule.SwapWalletId, Address: resp.InvoiceBTCAddress, Amount: swapAmount, + Destinations: []*nodeguard.Destination{{Address: resp.InvoiceBTCAddress, AmountSats: swapAmount}}, Description: fmt.Sprintf("Swap %v", resp.SwapId), - MempoolFeeRate: nodeguard.FEES_TYPE_ECONOMY_FEE, + MempoolFeeRate: nodeguard.FEES_TYPE_FASTEST_FEE, } withdrawalResponse, err := info.nodeguardClient.RequestWithdrawal(info.ctx, &withdrawalRequest) diff --git a/nodeguard/nodeguard.pb.go b/nodeguard/nodeguard.pb.go index 341f310..229c133 100644 --- a/nodeguard/nodeguard.pb.go +++ b/nodeguard/nodeguard.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v4.25.3 +// protoc-gen-go v1.34.2 +// protoc v5.29.3 // source: nodeguard.proto package nodeguard @@ -298,6 +298,7 @@ const ( WITHDRAWAL_REQUEST_STATUS_WITHDRAWAL_REJECTED WITHDRAWAL_REQUEST_STATUS = 3 WITHDRAWAL_REQUEST_STATUS_WITHDRAWAL_PENDING_CONFIRMATION WITHDRAWAL_REQUEST_STATUS = 4 WITHDRAWAL_REQUEST_STATUS_WITHDRAWAL_FAILED WITHDRAWAL_REQUEST_STATUS = 5 + WITHDRAWAL_REQUEST_STATUS_WITHDRAWAL_BUMPED WITHDRAWAL_REQUEST_STATUS = 6 ) // Enum value maps for WITHDRAWAL_REQUEST_STATUS. @@ -309,6 +310,7 @@ var ( 3: "WITHDRAWAL_REJECTED", 4: "WITHDRAWAL_PENDING_CONFIRMATION", 5: "WITHDRAWAL_FAILED", + 6: "WITHDRAWAL_BUMPED", } WITHDRAWAL_REQUEST_STATUS_value = map[string]int32{ "WITHDRAWAL_SETTLED": 0, @@ -317,6 +319,7 @@ var ( "WITHDRAWAL_REJECTED": 3, "WITHDRAWAL_PENDING_CONFIRMATION": 4, "WITHDRAWAL_FAILED": 5, + "WITHDRAWAL_BUMPED": 6, } ) @@ -614,6 +617,7 @@ type GetNewWalletAddressRequest struct { unknownFields protoimpl.UnknownFields WalletId int32 `protobuf:"varint,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + Reserve bool `protobuf:"varint,2,opt,name=reserve,proto3" json:"reserve,omitempty"` // If set to true, the returned address will be marked as used } func (x *GetNewWalletAddressRequest) Reset() { @@ -655,6 +659,13 @@ func (x *GetNewWalletAddressRequest) GetWalletId() int32 { return 0 } +func (x *GetNewWalletAddressRequest) GetReserve() bool { + if x != nil { + return x.Reserve + } + return false +} + type GetNewWalletAddressResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -702,14 +713,74 @@ func (x *GetNewWalletAddressResponse) GetAddress() string { return "" } +type Destination struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // BTC address to send the funds to + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + // Amount in satoshis + AmountSats int64 `protobuf:"varint,2,opt,name=amount_sats,json=amountSats,proto3" json:"amount_sats,omitempty"` +} + +func (x *Destination) Reset() { + *x = Destination{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Destination) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Destination) ProtoMessage() {} + +func (x *Destination) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Destination.ProtoReflect.Descriptor instead. +func (*Destination) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{5} +} + +func (x *Destination) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *Destination) GetAmountSats() int64 { + if x != nil { + return x.AmountSats + } + return 0 +} + type RequestWithdrawalRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WalletId int32 `protobuf:"varint,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + WalletId int32 `protobuf:"varint,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + // Deprecated: Marked as deprecated in nodeguard.proto. + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // Amount in satoshis + // + // Deprecated: Marked as deprecated in nodeguard.proto. Amount int64 `protobuf:"varint,3,opt,name=amount,proto3" json:"amount,omitempty"` Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` // in JSON format @@ -722,12 +793,16 @@ type RequestWithdrawalRequest struct { MempoolFeeRate FEES_TYPE `protobuf:"varint,8,opt,name=mempool_fee_rate,json=mempoolFeeRate,proto3,enum=nodeguard.FEES_TYPE" json:"mempool_fee_rate,omitempty"` // Fee rate in sat/vbyte CustomFeeRate *int32 `protobuf:"varint,9,opt,name=custom_fee_rate,json=customFeeRate,proto3,oneof" json:"custom_fee_rate,omitempty"` + // External reference id for the withdrawal request + ReferenceId *string `protobuf:"bytes,10,opt,name=reference_id,json=referenceId,proto3,oneof" json:"reference_id,omitempty"` + // Destinations for the withdrawal + Destinations []*Destination `protobuf:"bytes,11,rep,name=destinations,proto3" json:"destinations,omitempty"` } func (x *RequestWithdrawalRequest) Reset() { *x = RequestWithdrawalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[5] + mi := &file_nodeguard_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -740,7 +815,7 @@ func (x *RequestWithdrawalRequest) String() string { func (*RequestWithdrawalRequest) ProtoMessage() {} func (x *RequestWithdrawalRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[5] + mi := &file_nodeguard_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -753,7 +828,7 @@ func (x *RequestWithdrawalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalRequest.ProtoReflect.Descriptor instead. func (*RequestWithdrawalRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{5} + return file_nodeguard_proto_rawDescGZIP(), []int{6} } func (x *RequestWithdrawalRequest) GetWalletId() int32 { @@ -763,6 +838,7 @@ func (x *RequestWithdrawalRequest) GetWalletId() int32 { return 0 } +// Deprecated: Marked as deprecated in nodeguard.proto. func (x *RequestWithdrawalRequest) GetAddress() string { if x != nil { return x.Address @@ -770,6 +846,7 @@ func (x *RequestWithdrawalRequest) GetAddress() string { return "" } +// Deprecated: Marked as deprecated in nodeguard.proto. func (x *RequestWithdrawalRequest) GetAmount() int64 { if x != nil { return x.Amount @@ -819,6 +896,20 @@ func (x *RequestWithdrawalRequest) GetCustomFeeRate() int32 { return 0 } +func (x *RequestWithdrawalRequest) GetReferenceId() string { + if x != nil && x.ReferenceId != nil { + return *x.ReferenceId + } + return "" +} + +func (x *RequestWithdrawalRequest) GetDestinations() []*Destination { + if x != nil { + return x.Destinations + } + return nil +} + type RequestWithdrawalResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -833,7 +924,7 @@ type RequestWithdrawalResponse struct { func (x *RequestWithdrawalResponse) Reset() { *x = RequestWithdrawalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[6] + mi := &file_nodeguard_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -846,7 +937,7 @@ func (x *RequestWithdrawalResponse) String() string { func (*RequestWithdrawalResponse) ProtoMessage() {} func (x *RequestWithdrawalResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[6] + mi := &file_nodeguard_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -859,7 +950,7 @@ func (x *RequestWithdrawalResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalResponse.ProtoReflect.Descriptor instead. func (*RequestWithdrawalResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{6} + return file_nodeguard_proto_rawDescGZIP(), []int{7} } func (x *RequestWithdrawalResponse) GetTxid() string { @@ -895,7 +986,7 @@ type GetAvailableWalletsRequest struct { func (x *GetAvailableWalletsRequest) Reset() { *x = GetAvailableWalletsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[7] + mi := &file_nodeguard_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -908,7 +999,7 @@ func (x *GetAvailableWalletsRequest) String() string { func (*GetAvailableWalletsRequest) ProtoMessage() {} func (x *GetAvailableWalletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[7] + mi := &file_nodeguard_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -921,7 +1012,7 @@ func (x *GetAvailableWalletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAvailableWalletsRequest.ProtoReflect.Descriptor instead. func (*GetAvailableWalletsRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{7} + return file_nodeguard_proto_rawDescGZIP(), []int{8} } func (x *GetAvailableWalletsRequest) GetId() []int32 { @@ -949,7 +1040,7 @@ type AccountKeySettings struct { func (x *AccountKeySettings) Reset() { *x = AccountKeySettings{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[8] + mi := &file_nodeguard_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -962,7 +1053,7 @@ func (x *AccountKeySettings) String() string { func (*AccountKeySettings) ProtoMessage() {} func (x *AccountKeySettings) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[8] + mi := &file_nodeguard_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -975,7 +1066,7 @@ func (x *AccountKeySettings) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountKeySettings.ProtoReflect.Descriptor instead. func (*AccountKeySettings) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{8} + return file_nodeguard_proto_rawDescGZIP(), []int{9} } func (x *AccountKeySettings) GetXpub() string { @@ -1000,7 +1091,7 @@ type Wallet struct { func (x *Wallet) Reset() { *x = Wallet{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[9] + mi := &file_nodeguard_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1013,7 +1104,7 @@ func (x *Wallet) String() string { func (*Wallet) ProtoMessage() {} func (x *Wallet) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[9] + mi := &file_nodeguard_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1026,7 +1117,7 @@ func (x *Wallet) ProtoReflect() protoreflect.Message { // Deprecated: Use Wallet.ProtoReflect.Descriptor instead. func (*Wallet) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{9} + return file_nodeguard_proto_rawDescGZIP(), []int{10} } func (x *Wallet) GetId() int32 { @@ -1075,7 +1166,7 @@ type GetAvailableWalletsResponse struct { func (x *GetAvailableWalletsResponse) Reset() { *x = GetAvailableWalletsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[10] + mi := &file_nodeguard_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1088,7 +1179,7 @@ func (x *GetAvailableWalletsResponse) String() string { func (*GetAvailableWalletsResponse) ProtoMessage() {} func (x *GetAvailableWalletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[10] + mi := &file_nodeguard_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1101,7 +1192,7 @@ func (x *GetAvailableWalletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAvailableWalletsResponse.ProtoReflect.Descriptor instead. func (*GetAvailableWalletsResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{10} + return file_nodeguard_proto_rawDescGZIP(), []int{11} } func (x *GetAvailableWalletsResponse) GetWallets() []*Wallet { @@ -1111,6 +1202,110 @@ func (x *GetAvailableWalletsResponse) GetWallets() []*Wallet { return nil } +type GetWalletBalanceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WalletId int32 `protobuf:"varint,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` +} + +func (x *GetWalletBalanceRequest) Reset() { + *x = GetWalletBalanceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWalletBalanceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWalletBalanceRequest) ProtoMessage() {} + +func (x *GetWalletBalanceRequest) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWalletBalanceRequest.ProtoReflect.Descriptor instead. +func (*GetWalletBalanceRequest) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{12} +} + +func (x *GetWalletBalanceRequest) GetWalletId() int32 { + if x != nil { + return x.WalletId + } + return 0 +} + +type GetWalletBalanceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Confirmed balance in satoshis + ConfirmedBalance int64 `protobuf:"varint,1,opt,name=confirmed_balance,json=confirmedBalance,proto3" json:"confirmed_balance,omitempty"` + // Unconfirmed balance in satoshis + UnconfirmedBalance int64 `protobuf:"varint,2,opt,name=unconfirmed_balance,json=unconfirmedBalance,proto3" json:"unconfirmed_balance,omitempty"` +} + +func (x *GetWalletBalanceResponse) Reset() { + *x = GetWalletBalanceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWalletBalanceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWalletBalanceResponse) ProtoMessage() {} + +func (x *GetWalletBalanceResponse) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWalletBalanceResponse.ProtoReflect.Descriptor instead. +func (*GetWalletBalanceResponse) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{13} +} + +func (x *GetWalletBalanceResponse) GetConfirmedBalance() int64 { + if x != nil { + return x.ConfirmedBalance + } + return 0 +} + +func (x *GetWalletBalanceResponse) GetUnconfirmedBalance() int64 { + if x != nil { + return x.UnconfirmedBalance + } + return 0 +} + type AddNodeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1123,8 +1318,7 @@ type AddNodeRequest struct { ChannelAdminMacaroon string `protobuf:"bytes,4,opt,name=channel_admin_macaroon,json=channelAdminMacaroon,proto3" json:"channel_admin_macaroon,omitempty"` // Endpoint of the node in the form of host:port (gRPC) Endpoint string `protobuf:"bytes,5,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - // Whether this node's hot wallet should be autoswept to the returning funds - // wallet + // Whether this node's hot wallet should be autoswept to the returning funds wallet AutosweepEnabled bool `protobuf:"varint,6,opt,name=autosweep_enabled,json=autosweepEnabled,proto3" json:"autosweep_enabled,omitempty"` // Wallet ID as stored in the NG's database for use in autosweep ops ReturningFundsWalletId int32 `protobuf:"varint,7,opt,name=returning_funds_wallet_id,json=returningFundsWalletId,proto3" json:"returning_funds_wallet_id,omitempty"` @@ -1133,7 +1327,7 @@ type AddNodeRequest struct { func (x *AddNodeRequest) Reset() { *x = AddNodeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[11] + mi := &file_nodeguard_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1146,7 +1340,7 @@ func (x *AddNodeRequest) String() string { func (*AddNodeRequest) ProtoMessage() {} func (x *AddNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[11] + mi := &file_nodeguard_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1159,7 +1353,7 @@ func (x *AddNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddNodeRequest.ProtoReflect.Descriptor instead. func (*AddNodeRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{11} + return file_nodeguard_proto_rawDescGZIP(), []int{14} } func (x *AddNodeRequest) GetPubKey() string { @@ -1220,7 +1414,7 @@ type AddNodeResponse struct { func (x *AddNodeResponse) Reset() { *x = AddNodeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[12] + mi := &file_nodeguard_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1427,7 @@ func (x *AddNodeResponse) String() string { func (*AddNodeResponse) ProtoMessage() {} func (x *AddNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[12] + mi := &file_nodeguard_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1440,7 @@ func (x *AddNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddNodeResponse.ProtoReflect.Descriptor instead. func (*AddNodeResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{12} + return file_nodeguard_proto_rawDescGZIP(), []int{15} } type Node struct { @@ -1261,8 +1455,7 @@ type Node struct { Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` // Endpoint of the node in the form of host:port (gRPC) Endpoint string `protobuf:"bytes,5,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - // Whether this node's hot wallet should be autoswept to the returning funds - // wallet + // Whether this node's hot wallet should be autoswept to the returning funds wallet AutosweepEnabled bool `protobuf:"varint,6,opt,name=autosweep_enabled,json=autosweepEnabled,proto3" json:"autosweep_enabled,omitempty"` // Wallet ID as stored in the NG's database for use in autosweep ops ReturningFundsWalletId int32 `protobuf:"varint,7,opt,name=returning_funds_wallet_id,json=returningFundsWalletId,proto3" json:"returning_funds_wallet_id,omitempty"` @@ -1271,7 +1464,7 @@ type Node struct { func (x *Node) Reset() { *x = Node{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[13] + mi := &file_nodeguard_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1284,7 +1477,7 @@ func (x *Node) String() string { func (*Node) ProtoMessage() {} func (x *Node) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[13] + mi := &file_nodeguard_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1297,7 +1490,7 @@ func (x *Node) ProtoReflect() protoreflect.Message { // Deprecated: Use Node.ProtoReflect.Descriptor instead. func (*Node) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{13} + return file_nodeguard_proto_rawDescGZIP(), []int{16} } func (x *Node) GetId() int32 { @@ -1361,7 +1554,7 @@ type GetNodesRequest struct { func (x *GetNodesRequest) Reset() { *x = GetNodesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[14] + mi := &file_nodeguard_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1374,7 +1567,7 @@ func (x *GetNodesRequest) String() string { func (*GetNodesRequest) ProtoMessage() {} func (x *GetNodesRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[14] + mi := &file_nodeguard_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1387,7 +1580,7 @@ func (x *GetNodesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodesRequest.ProtoReflect.Descriptor instead. func (*GetNodesRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{14} + return file_nodeguard_proto_rawDescGZIP(), []int{17} } func (x *GetNodesRequest) GetIncludeUnmanaged() bool { @@ -1408,7 +1601,7 @@ type GetNodesResponse struct { func (x *GetNodesResponse) Reset() { *x = GetNodesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[15] + mi := &file_nodeguard_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1421,7 +1614,7 @@ func (x *GetNodesResponse) String() string { func (*GetNodesResponse) ProtoMessage() {} func (x *GetNodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[15] + mi := &file_nodeguard_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1434,7 +1627,7 @@ func (x *GetNodesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodesResponse.ProtoReflect.Descriptor instead. func (*GetNodesResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{15} + return file_nodeguard_proto_rawDescGZIP(), []int{18} } func (x *GetNodesResponse) GetNodes() []*Node { @@ -1472,7 +1665,7 @@ type OpenChannelRequest struct { func (x *OpenChannelRequest) Reset() { *x = OpenChannelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[16] + mi := &file_nodeguard_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1485,7 +1678,7 @@ func (x *OpenChannelRequest) String() string { func (*OpenChannelRequest) ProtoMessage() {} func (x *OpenChannelRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[16] + mi := &file_nodeguard_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1498,7 +1691,7 @@ func (x *OpenChannelRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenChannelRequest.ProtoReflect.Descriptor instead. func (*OpenChannelRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{16} + return file_nodeguard_proto_rawDescGZIP(), []int{19} } func (x *OpenChannelRequest) GetSourcePubKey() string { @@ -1564,8 +1757,7 @@ func (x *OpenChannelRequest) GetCustomFeeRate() int32 { return 0 } -// A successful response returns the channel_operation_request_id but it does -// NOT indicate that the channel has been open, external monitoring is required +// A successful response returns the channel_operation_request_id but it does NOT indicate that the channel has been open, external monitoring is required type OpenChannelResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1577,7 +1769,7 @@ type OpenChannelResponse struct { func (x *OpenChannelResponse) Reset() { *x = OpenChannelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[17] + mi := &file_nodeguard_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1590,7 +1782,7 @@ func (x *OpenChannelResponse) String() string { func (*OpenChannelResponse) ProtoMessage() {} func (x *OpenChannelResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[17] + mi := &file_nodeguard_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1603,7 +1795,7 @@ func (x *OpenChannelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenChannelResponse.ProtoReflect.Descriptor instead. func (*OpenChannelResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{17} + return file_nodeguard_proto_rawDescGZIP(), []int{20} } func (x *OpenChannelResponse) GetChannelOperationRequestId() int32 { @@ -1627,7 +1819,7 @@ type CloseChannelRequest struct { func (x *CloseChannelRequest) Reset() { *x = CloseChannelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[18] + mi := &file_nodeguard_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1640,7 +1832,7 @@ func (x *CloseChannelRequest) String() string { func (*CloseChannelRequest) ProtoMessage() {} func (x *CloseChannelRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[18] + mi := &file_nodeguard_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1653,7 +1845,7 @@ func (x *CloseChannelRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseChannelRequest.ProtoReflect.Descriptor instead. func (*CloseChannelRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{18} + return file_nodeguard_proto_rawDescGZIP(), []int{21} } func (x *CloseChannelRequest) GetChannelId() uint64 { @@ -1670,8 +1862,7 @@ func (x *CloseChannelRequest) GetForce() bool { return false } -// A successful response is an empty message and does NOT indicate that the -// channel has been closed, external monitoring is required +// A successful response is an empty message and does NOT indicate that the channel has been closed, external monitoring is required type CloseChannelResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1681,7 +1872,7 @@ type CloseChannelResponse struct { func (x *CloseChannelResponse) Reset() { *x = CloseChannelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[19] + mi := &file_nodeguard_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1694,7 +1885,7 @@ func (x *CloseChannelResponse) String() string { func (*CloseChannelResponse) ProtoMessage() {} func (x *CloseChannelResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[19] + mi := &file_nodeguard_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1707,7 +1898,7 @@ func (x *CloseChannelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseChannelResponse.ProtoReflect.Descriptor instead. func (*CloseChannelResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{19} + return file_nodeguard_proto_rawDescGZIP(), []int{22} } type GetChannelOperationRequestRequest struct { @@ -1722,7 +1913,7 @@ type GetChannelOperationRequestRequest struct { func (x *GetChannelOperationRequestRequest) Reset() { *x = GetChannelOperationRequestRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[20] + mi := &file_nodeguard_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1735,7 +1926,7 @@ func (x *GetChannelOperationRequestRequest) String() string { func (*GetChannelOperationRequestRequest) ProtoMessage() {} func (x *GetChannelOperationRequestRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[20] + mi := &file_nodeguard_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1748,7 +1939,7 @@ func (x *GetChannelOperationRequestRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetChannelOperationRequestRequest.ProtoReflect.Descriptor instead. func (*GetChannelOperationRequestRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{20} + return file_nodeguard_proto_rawDescGZIP(), []int{23} } func (x *GetChannelOperationRequestRequest) GetChannelOperationRequestId() int32 { @@ -1781,7 +1972,7 @@ type GetChannelOperationRequestResponse struct { func (x *GetChannelOperationRequestResponse) Reset() { *x = GetChannelOperationRequestResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[21] + mi := &file_nodeguard_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1794,7 +1985,7 @@ func (x *GetChannelOperationRequestResponse) String() string { func (*GetChannelOperationRequestResponse) ProtoMessage() {} func (x *GetChannelOperationRequestResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[21] + mi := &file_nodeguard_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1807,7 +1998,7 @@ func (x *GetChannelOperationRequestResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetChannelOperationRequestResponse.ProtoReflect.Descriptor instead. func (*GetChannelOperationRequestResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{21} + return file_nodeguard_proto_rawDescGZIP(), []int{24} } func (x *GetChannelOperationRequestResponse) GetSatsAmount() int64 { @@ -1927,7 +2118,7 @@ type AddLiquidityRuleRequest struct { func (x *AddLiquidityRuleRequest) Reset() { *x = AddLiquidityRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[22] + mi := &file_nodeguard_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1940,7 +2131,7 @@ func (x *AddLiquidityRuleRequest) String() string { func (*AddLiquidityRuleRequest) ProtoMessage() {} func (x *AddLiquidityRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[22] + mi := &file_nodeguard_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1953,7 +2144,7 @@ func (x *AddLiquidityRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddLiquidityRuleRequest.ProtoReflect.Descriptor instead. func (*AddLiquidityRuleRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{22} + return file_nodeguard_proto_rawDescGZIP(), []int{25} } func (x *AddLiquidityRuleRequest) GetChannelId() int32 { @@ -2024,7 +2215,7 @@ type AddLiquidityRuleResponse struct { func (x *AddLiquidityRuleResponse) Reset() { *x = AddLiquidityRuleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[23] + mi := &file_nodeguard_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2037,7 +2228,7 @@ func (x *AddLiquidityRuleResponse) String() string { func (*AddLiquidityRuleResponse) ProtoMessage() {} func (x *AddLiquidityRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[23] + mi := &file_nodeguard_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2050,7 +2241,7 @@ func (x *AddLiquidityRuleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddLiquidityRuleResponse.ProtoReflect.Descriptor instead. func (*AddLiquidityRuleResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{23} + return file_nodeguard_proto_rawDescGZIP(), []int{26} } func (x *AddLiquidityRuleResponse) GetRuleId() int32 { @@ -2060,28 +2251,65 @@ func (x *AddLiquidityRuleResponse) GetRuleId() int32 { return 0 } -type GetAvailableUtxosRequest struct { +type GetUtxosRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields +} - // Wallet ID as stored in the NG's database - WalletId int32 `protobuf:"varint,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` +func (x *GetUtxosRequest) Reset() { + *x = GetUtxosRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUtxosRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUtxosRequest) ProtoMessage() {} + +func (x *GetUtxosRequest) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUtxosRequest.ProtoReflect.Descriptor instead. +func (*GetUtxosRequest) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{27} +} + +type GetAvailableUtxosRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Wallet ID as stored in the NG's database + WalletId int32 `protobuf:"varint,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` // How to order the UTXOs for automatic selection Strategy *COIN_SELECTION_STRATEGY `protobuf:"varint,2,opt,name=strategy,proto3,enum=nodeguard.COIN_SELECTION_STRATEGY,oneof" json:"strategy,omitempty"` // How many UTXOs are allowed to be used for the withdrawal Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` // Amount in satoshis Amount *int64 `protobuf:"varint,4,opt,name=amount,proto3,oneof" json:"amount,omitempty"` - // Order the UTXOs by closest to the amount specified if the strategy selected - // is CLOSEST_TO_TARGET_FIRST + // Order the UTXOs by closest to the amount specified if the strategy selected is CLOSEST_TO_TARGET_FIRST ClosestTo *int64 `protobuf:"varint,5,opt,name=closestTo,proto3,oneof" json:"closestTo,omitempty"` } func (x *GetAvailableUtxosRequest) Reset() { *x = GetAvailableUtxosRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[24] + mi := &file_nodeguard_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2094,7 +2322,7 @@ func (x *GetAvailableUtxosRequest) String() string { func (*GetAvailableUtxosRequest) ProtoMessage() {} func (x *GetAvailableUtxosRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[24] + mi := &file_nodeguard_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2107,7 +2335,7 @@ func (x *GetAvailableUtxosRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAvailableUtxosRequest.ProtoReflect.Descriptor instead. func (*GetAvailableUtxosRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{24} + return file_nodeguard_proto_rawDescGZIP(), []int{28} } func (x *GetAvailableUtxosRequest) GetWalletId() int32 { @@ -2152,12 +2380,13 @@ type Utxo struct { Amount int64 `protobuf:"varint,1,opt,name=amount,proto3" json:"amount,omitempty"` Outpoint string `protobuf:"bytes,2,opt,name=outpoint,proto3" json:"outpoint,omitempty"` + Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` } func (x *Utxo) Reset() { *x = Utxo{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[25] + mi := &file_nodeguard_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2170,7 +2399,7 @@ func (x *Utxo) String() string { func (*Utxo) ProtoMessage() {} func (x *Utxo) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[25] + mi := &file_nodeguard_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2183,7 +2412,7 @@ func (x *Utxo) ProtoReflect() protoreflect.Message { // Deprecated: Use Utxo.ProtoReflect.Descriptor instead. func (*Utxo) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{25} + return file_nodeguard_proto_rawDescGZIP(), []int{29} } func (x *Utxo) GetAmount() int64 { @@ -2200,7 +2429,14 @@ func (x *Utxo) GetOutpoint() string { return "" } -type GetAvailableUtxosResponse struct { +func (x *Utxo) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +type GetUtxosResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2209,23 +2445,23 @@ type GetAvailableUtxosResponse struct { Unconfirmed []*Utxo `protobuf:"bytes,2,rep,name=unconfirmed,proto3" json:"unconfirmed,omitempty"` } -func (x *GetAvailableUtxosResponse) Reset() { - *x = GetAvailableUtxosResponse{} +func (x *GetUtxosResponse) Reset() { + *x = GetUtxosResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[26] + mi := &file_nodeguard_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableUtxosResponse) String() string { +func (x *GetUtxosResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableUtxosResponse) ProtoMessage() {} +func (*GetUtxosResponse) ProtoMessage() {} -func (x *GetAvailableUtxosResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[26] +func (x *GetUtxosResponse) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2236,19 +2472,19 @@ func (x *GetAvailableUtxosResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAvailableUtxosResponse.ProtoReflect.Descriptor instead. -func (*GetAvailableUtxosResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{26} +// Deprecated: Use GetUtxosResponse.ProtoReflect.Descriptor instead. +func (*GetUtxosResponse) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{30} } -func (x *GetAvailableUtxosResponse) GetConfirmed() []*Utxo { +func (x *GetUtxosResponse) GetConfirmed() []*Utxo { if x != nil { return x.Confirmed } return nil } -func (x *GetAvailableUtxosResponse) GetUnconfirmed() []*Utxo { +func (x *GetUtxosResponse) GetUnconfirmed() []*Utxo { if x != nil { return x.Unconfirmed } @@ -2266,7 +2502,7 @@ type GetWithdrawalsRequestStatusRequest struct { func (x *GetWithdrawalsRequestStatusRequest) Reset() { *x = GetWithdrawalsRequestStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[27] + mi := &file_nodeguard_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2279,7 +2515,7 @@ func (x *GetWithdrawalsRequestStatusRequest) String() string { func (*GetWithdrawalsRequestStatusRequest) ProtoMessage() {} func (x *GetWithdrawalsRequestStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[27] + mi := &file_nodeguard_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2292,7 +2528,7 @@ func (x *GetWithdrawalsRequestStatusRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetWithdrawalsRequestStatusRequest.ProtoReflect.Descriptor instead. func (*GetWithdrawalsRequestStatusRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{27} + return file_nodeguard_proto_rawDescGZIP(), []int{31} } func (x *GetWithdrawalsRequestStatusRequest) GetRequestIds() []int32 { @@ -2310,12 +2546,15 @@ type WithdrawalRequest struct { RequestId int32 `protobuf:"varint,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` Status WITHDRAWAL_REQUEST_STATUS `protobuf:"varint,2,opt,name=status,proto3,enum=nodeguard.WITHDRAWAL_REQUEST_STATUS" json:"status,omitempty"` RejectOrCancelReason *string `protobuf:"bytes,3,opt,name=reject_or_cancel_reason,json=rejectOrCancelReason,proto3,oneof" json:"reject_or_cancel_reason,omitempty"` + ReferenceId *string `protobuf:"bytes,4,opt,name=reference_id,json=referenceId,proto3,oneof" json:"reference_id,omitempty"` + Confirmations uint64 `protobuf:"varint,5,opt,name=confirmations,proto3" json:"confirmations,omitempty"` + TxId *string `protobuf:"bytes,6,opt,name=tx_id,json=txId,proto3,oneof" json:"tx_id,omitempty"` } func (x *WithdrawalRequest) Reset() { *x = WithdrawalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[28] + mi := &file_nodeguard_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2328,7 +2567,7 @@ func (x *WithdrawalRequest) String() string { func (*WithdrawalRequest) ProtoMessage() {} func (x *WithdrawalRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[28] + mi := &file_nodeguard_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2341,7 +2580,7 @@ func (x *WithdrawalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawalRequest.ProtoReflect.Descriptor instead. func (*WithdrawalRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{28} + return file_nodeguard_proto_rawDescGZIP(), []int{32} } func (x *WithdrawalRequest) GetRequestId() int32 { @@ -2365,6 +2604,27 @@ func (x *WithdrawalRequest) GetRejectOrCancelReason() string { return "" } +func (x *WithdrawalRequest) GetReferenceId() string { + if x != nil && x.ReferenceId != nil { + return *x.ReferenceId + } + return "" +} + +func (x *WithdrawalRequest) GetConfirmations() uint64 { + if x != nil { + return x.Confirmations + } + return 0 +} + +func (x *WithdrawalRequest) GetTxId() string { + if x != nil && x.TxId != nil { + return *x.TxId + } + return "" +} + type GetWithdrawalsRequestStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2376,7 +2636,7 @@ type GetWithdrawalsRequestStatusResponse struct { func (x *GetWithdrawalsRequestStatusResponse) Reset() { *x = GetWithdrawalsRequestStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[29] + mi := &file_nodeguard_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2389,7 +2649,7 @@ func (x *GetWithdrawalsRequestStatusResponse) String() string { func (*GetWithdrawalsRequestStatusResponse) ProtoMessage() {} func (x *GetWithdrawalsRequestStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[29] + mi := &file_nodeguard_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2402,7 +2662,7 @@ func (x *GetWithdrawalsRequestStatusResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use GetWithdrawalsRequestStatusResponse.ProtoReflect.Descriptor instead. func (*GetWithdrawalsRequestStatusResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{29} + return file_nodeguard_proto_rawDescGZIP(), []int{33} } func (x *GetWithdrawalsRequestStatusResponse) GetWithdrawalRequests() []*WithdrawalRequest { @@ -2412,6 +2672,53 @@ func (x *GetWithdrawalsRequestStatusResponse) GetWithdrawalRequests() []*Withdra return nil } +type GetWithdrawalsRequestStatusByReferenceIdsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ReferenceIds []string `protobuf:"bytes,1,rep,name=reference_ids,json=referenceIds,proto3" json:"reference_ids,omitempty"` +} + +func (x *GetWithdrawalsRequestStatusByReferenceIdsRequest) Reset() { + *x = GetWithdrawalsRequestStatusByReferenceIdsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWithdrawalsRequestStatusByReferenceIdsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWithdrawalsRequestStatusByReferenceIdsRequest) ProtoMessage() {} + +func (x *GetWithdrawalsRequestStatusByReferenceIdsRequest) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWithdrawalsRequestStatusByReferenceIdsRequest.ProtoReflect.Descriptor instead. +func (*GetWithdrawalsRequestStatusByReferenceIdsRequest) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{34} +} + +func (x *GetWithdrawalsRequestStatusByReferenceIdsRequest) GetReferenceIds() []string { + if x != nil { + return x.ReferenceIds + } + return nil +} + type GetChannelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2424,7 +2731,7 @@ type GetChannelRequest struct { func (x *GetChannelRequest) Reset() { *x = GetChannelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[30] + mi := &file_nodeguard_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2437,7 +2744,7 @@ func (x *GetChannelRequest) String() string { func (*GetChannelRequest) ProtoMessage() {} func (x *GetChannelRequest) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[30] + mi := &file_nodeguard_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2450,7 +2757,7 @@ func (x *GetChannelRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChannelRequest.ProtoReflect.Descriptor instead. func (*GetChannelRequest) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{30} + return file_nodeguard_proto_rawDescGZIP(), []int{35} } func (x *GetChannelRequest) GetChannelId() int32 { @@ -2479,7 +2786,7 @@ type GetChannelResponse struct { func (x *GetChannelResponse) Reset() { *x = GetChannelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_nodeguard_proto_msgTypes[31] + mi := &file_nodeguard_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2492,7 +2799,7 @@ func (x *GetChannelResponse) String() string { func (*GetChannelResponse) ProtoMessage() {} func (x *GetChannelResponse) ProtoReflect() protoreflect.Message { - mi := &file_nodeguard_proto_msgTypes[31] + mi := &file_nodeguard_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2505,7 +2812,7 @@ func (x *GetChannelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChannelResponse.ProtoReflect.Descriptor instead. func (*GetChannelResponse) Descriptor() ([]byte, []int) { - return file_nodeguard_proto_rawDescGZIP(), []int{31} + return file_nodeguard_proto_rawDescGZIP(), []int{36} } func (x *GetChannelResponse) GetFundingTx() string { @@ -2571,6 +2878,154 @@ func (x *GetChannelResponse) GetIsPrivate() bool { return false } +type Tag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + UtxoOutpoint string `protobuf:"bytes,3,opt,name=utxo_outpoint,json=utxoOutpoint,proto3" json:"utxo_outpoint,omitempty"` // Format txid-outputIndex +} + +func (x *Tag) Reset() { + *x = Tag{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Tag.ProtoReflect.Descriptor instead. +func (*Tag) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{37} +} + +func (x *Tag) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *Tag) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *Tag) GetUtxoOutpoint() string { + if x != nil { + return x.UtxoOutpoint + } + return "" +} + +type AddTagsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tags []*Tag `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` +} + +func (x *AddTagsRequest) Reset() { + *x = AddTagsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddTagsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddTagsRequest) ProtoMessage() {} + +func (x *AddTagsRequest) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddTagsRequest.ProtoReflect.Descriptor instead. +func (*AddTagsRequest) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{38} +} + +func (x *AddTagsRequest) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +type AddTagsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AddTagsResponse) Reset() { + *x = AddTagsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_nodeguard_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddTagsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddTagsResponse) ProtoMessage() {} + +func (x *AddTagsResponse) ProtoReflect() protoreflect.Message { + mi := &file_nodeguard_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddTagsResponse.ProtoReflect.Descriptor instead. +func (*AddTagsResponse) Descriptor() ([]byte, []int) { + return file_nodeguard_proto_rawDescGZIP(), []int{39} +} + var File_nodeguard_proto protoreflect.FileDescriptor var file_nodeguard_proto_rawDesc = []byte{ @@ -2619,26 +3074,152 @@ var file_nodeguard_proto_rawDesc = []byte{ 0x6b, 0x65, 0x79, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x39, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x53, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x49, 0x64, 0x22, 0x37, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x80, 0x03, 0x0a, 0x18, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, 0x37, 0x0a, 0x1b, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x48, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x61, 0x74, 0x73, 0x22, + 0xfd, 0x03, 0x0a, 0x18, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x73, + 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x3e, 0x0a, 0x10, 0x6d, 0x65, 0x6d, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, + 0x46, 0x45, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x70, 0x6f, + 0x6f, 0x6c, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x65, 0x65, 0x52, + 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3a, + 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x72, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, + 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x68, 0x6f, 0x74, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x49, 0x64, 0x22, 0x7a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x2e, 0x57, 0x41, 0x4c, 0x4c, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x48, 0x00, + 0x52, 0x0a, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x28, 0x0a, 0x12, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x70, 0x75, 0x62, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x78, 0x70, 0x75, 0x62, 0x22, 0xbf, 0x01, 0x0a, 0x06, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x68, + 0x6f, 0x74, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x14, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4b, 0x65, + 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x4a, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x07, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x36, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, + 0x78, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x75, 0x6e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x99, 0x02, 0x0a, 0x0e, 0x41, 0x64, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x63, + 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x77, + 0x65, 0x65, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x5f, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, + 0x61, 0x75, 0x74, 0x6f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x77, 0x65, + 0x65, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x5f, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x22, 0x39, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, + 0x8c, 0x03, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x13, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x75, 0x62, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x74, + 0x73, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x73, 0x61, 0x74, 0x73, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, @@ -2650,287 +3231,212 @@ var file_nodeguard_proto_rawDesc = []byte{ 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x72, - 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, - 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x68, 0x6f, 0x74, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x48, 0x6f, 0x74, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x49, 0x64, 0x22, 0x7a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3c, 0x0a, 0x0b, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x2e, 0x57, 0x41, 0x4c, 0x4c, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x48, 0x00, 0x52, - 0x0a, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x28, - 0x0a, 0x12, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x70, 0x75, 0x62, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x78, 0x70, 0x75, 0x62, 0x22, 0xbf, 0x01, 0x0a, 0x06, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x68, 0x6f, - 0x74, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x69, 0x73, 0x48, 0x6f, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x14, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, - 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4b, 0x65, 0x79, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x4a, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x63, 0x61, 0x72, 0x6f, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, - 0x74, 0x6f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x77, 0x65, 0x65, 0x70, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, - 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, - 0x6f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, - 0x64, 0x22, 0x3e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x64, 0x22, 0x39, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x8c, 0x03, 0x0a, - 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x75, - 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x74, 0x73, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x61, 0x74, - 0x73, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, - 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x74, 0x78, 0x6f, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x3e, 0x0a, 0x10, 0x6d, 0x65, - 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, - 0x2e, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x70, - 0x6f, 0x6f, 0x6c, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0f, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x65, 0x65, - 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x56, 0x0a, 0x13, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x13, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x16, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x1c, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x19, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xfb, 0x04, - 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x74, 0x73, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x61, 0x74, 0x73, 0x41, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, - 0x61, 0x72, 0x64, 0x2e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x45, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x48, 0x00, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, - 0x61, 0x72, 0x64, 0x2e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x45, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x48, 0x01, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x2a, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x73, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x66, - 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x04, 0x52, - 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, - 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, - 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x0a, 0x64, 0x65, 0x73, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x07, - 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, - 0x0f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x0c, 0x0a, - 0x0a, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0xaf, 0x04, 0x0a, 0x17, - 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x56, + 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x13, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x21, 0x47, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3f, 0x0a, 0x1c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, + 0x22, 0xfb, 0x04, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x74, 0x73, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x61, + 0x74, 0x73, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x48, + 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x48, 0x01, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x63, 0x6c, + 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1e, + 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, + 0x48, 0x04, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, + 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x05, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x0a, + 0x64, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x07, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6a, + 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, + 0x49, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x07, 0x0a, + 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x78, 0x5f, 0x69, 0x64, + 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0xaf, + 0x04, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x77, 0x61, + 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x37, 0x0a, 0x15, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x13, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, + 0x0f, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x1b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x75, 0x6c, + 0x65, 0x12, 0x35, 0x0a, 0x14, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, + 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x03, 0x52, 0x12, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, 0x70, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x19, 0x0a, 0x17, + 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x17, 0x0a, 0x15, + 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x22, 0x33, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, + 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x87, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x2e, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x02, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x21, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x03, 0x52, 0x09, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x88, + 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, + 0x54, 0x6f, 0x22, 0x54, 0x0a, 0x04, 0x55, 0x74, 0x78, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x74, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x55, 0x74, 0x78, 0x6f, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x0b, 0x75, + 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x55, 0x74, 0x78, + 0x6f, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x45, + 0x0a, 0x22, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x49, 0x64, 0x73, 0x22, 0xcb, 0x02, 0x0a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, + 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x6f, 0x72, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, + 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x72, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x78, + 0x5f, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x13, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x57, 0x0a, 0x30, 0x47, 0x65, 0x74, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x73, 0x22, 0x32, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x73, 0x77, 0x61, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x15, - 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x13, 0x6d, - 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, - 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x0f, 0x72, 0x65, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, - 0x12, 0x3c, 0x0a, 0x1b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, - 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x53, 0x77, 0x61, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, - 0x0a, 0x14, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x12, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x53, 0x77, 0x61, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x18, 0x0a, 0x16, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x69, - 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x73, - 0x77, 0x61, 0x70, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x33, 0x0a, - 0x18, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, - 0x49, 0x64, 0x22, 0x87, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x08, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x43, 0x4f, 0x49, 0x4e, 0x5f, - 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, - 0x47, 0x59, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, - 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x09, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x22, 0x3a, 0x0a, 0x04, - 0x55, 0x74, 0x78, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, - 0x75, 0x61, 0x72, 0x64, 0x2e, 0x55, 0x74, 0x78, 0x6f, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, - 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x55, 0x74, 0x78, 0x6f, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x45, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x73, 0x22, 0xc8, - 0x01, 0x0a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, - 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, - 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x72, 0x5f, 0x63, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x72, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, - 0x18, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x72, 0x5f, 0x63, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x74, 0x0a, 0x23, 0x47, 0x65, 0x74, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4d, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, - 0x32, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x64, 0x22, 0xa0, 0x03, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x75, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x17, 0x0a, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, - 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x74, 0x73, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x61, 0x74, 0x73, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x11, 0x62, 0x74, 0x63, 0x5f, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x74, 0x63, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, - 0x61, 0x72, 0x64, 0x2e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, - 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x12, 0x43, 0x0a, 0x1e, - 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x65, - 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x62, 0x74, 0x63, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2a, 0x2a, 0x0a, 0x0b, 0x57, 0x41, 0x4c, 0x4c, 0x45, 0x54, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x22, 0xa0, 0x03, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x0c, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x17, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x74, 0x73, + 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, + 0x61, 0x74, 0x73, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x11, 0x62, 0x74, 0x63, + 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x74, 0x63, 0x43, 0x6c, 0x6f, 0x73, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, + 0x14, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x12, + 0x43, 0x0a, 0x1e, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x6d, + 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x62, 0x74, 0x63, 0x5f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x52, 0x0a, 0x03, 0x54, 0x61, 0x67, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x74, 0x78, 0x6f, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x34, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2a, 0x0a, 0x0b, 0x57, 0x41, 0x4c, 0x4c, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4f, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x4c, 0x44, 0x10, 0x02, 0x2a, 0x5e, 0x0a, 0x09, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x12, @@ -2962,7 +3468,7 @@ var file_nodeguard_proto_rawDesc = []byte{ 0x42, 0x49, 0x47, 0x47, 0x45, 0x53, 0x54, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x53, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, - 0x55, 0x50, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x03, 0x2a, 0xc3, + 0x55, 0x50, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x03, 0x2a, 0xda, 0x01, 0x0a, 0x19, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x16, 0x0a, 0x12, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, @@ -2975,72 +3481,83 @@ var file_nodeguard_proto_rawDesc = []byte{ 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x45, 0x44, 0x10, 0x05, 0x2a, 0x26, 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x32, 0xc5, 0x09, 0x0a, - 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x5e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, - 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x64, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, - 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x45, 0x44, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, + 0x41, 0x4c, 0x5f, 0x42, 0x55, 0x4d, 0x50, 0x45, 0x44, 0x10, 0x06, 0x2a, 0x26, 0x0a, 0x0e, 0x43, + 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x08, 0x0a, + 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x44, 0x10, 0x01, 0x32, 0xbb, 0x0c, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x75, 0x61, 0x72, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, + 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, + 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x25, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x11, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x23, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, - 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6e, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, + 0x0a, 0x11, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x1d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, - 0x0a, 0x10, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, - 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, - 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x22, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x74, 0x78, 0x6f, 0x73, - 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x74, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x55, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x12, 0x23, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x74, 0x78, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, + 0x6f, 0x73, 0x12, 0x1a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, + 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x6e, 0x6f, 0x64, @@ -3049,13 +3566,27 @@ var file_nodeguard_proto_rawDesc = []byte{ 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, - 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0d, 0x5a, 0x0b, 0x2e, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, - 0x61, 0x72, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x29, 0x47, 0x65, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x3b, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x12, 0x1c, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x40, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x19, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x42, 0x0d, 0x5a, 0x0b, 0x2e, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3071,95 +3602,113 @@ func file_nodeguard_proto_rawDescGZIP() []byte { } var file_nodeguard_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_nodeguard_proto_msgTypes = make([]protoimpl.MessageInfo, 32) -var file_nodeguard_proto_goTypes = []interface{}{ - (WALLET_TYPE)(0), // 0: nodeguard.WALLET_TYPE - (FEES_TYPE)(0), // 1: nodeguard.FEES_TYPE - (CHANNEL_OPERATION_STATUS)(0), // 2: nodeguard.CHANNEL_OPERATION_STATUS - (CHANNEL_OPERATION_TYPE)(0), // 3: nodeguard.CHANNEL_OPERATION_TYPE - (COIN_SELECTION_STRATEGY)(0), // 4: nodeguard.COIN_SELECTION_STRATEGY - (WITHDRAWAL_REQUEST_STATUS)(0), // 5: nodeguard.WITHDRAWAL_REQUEST_STATUS - (CHANNEL_STATUS)(0), // 6: nodeguard.CHANNEL_STATUS - (*GetLiquidityRulesRequest)(nil), // 7: nodeguard.GetLiquidityRulesRequest - (*GetLiquidityRulesResponse)(nil), // 8: nodeguard.GetLiquidityRulesResponse - (*LiquidityRule)(nil), // 9: nodeguard.LiquidityRule - (*GetNewWalletAddressRequest)(nil), // 10: nodeguard.GetNewWalletAddressRequest - (*GetNewWalletAddressResponse)(nil), // 11: nodeguard.GetNewWalletAddressResponse - (*RequestWithdrawalRequest)(nil), // 12: nodeguard.RequestWithdrawalRequest - (*RequestWithdrawalResponse)(nil), // 13: nodeguard.RequestWithdrawalResponse - (*GetAvailableWalletsRequest)(nil), // 14: nodeguard.GetAvailableWalletsRequest - (*AccountKeySettings)(nil), // 15: nodeguard.AccountKeySettings - (*Wallet)(nil), // 16: nodeguard.Wallet - (*GetAvailableWalletsResponse)(nil), // 17: nodeguard.GetAvailableWalletsResponse - (*AddNodeRequest)(nil), // 18: nodeguard.AddNodeRequest - (*AddNodeResponse)(nil), // 19: nodeguard.AddNodeResponse - (*Node)(nil), // 20: nodeguard.Node - (*GetNodesRequest)(nil), // 21: nodeguard.GetNodesRequest - (*GetNodesResponse)(nil), // 22: nodeguard.GetNodesResponse - (*OpenChannelRequest)(nil), // 23: nodeguard.OpenChannelRequest - (*OpenChannelResponse)(nil), // 24: nodeguard.OpenChannelResponse - (*CloseChannelRequest)(nil), // 25: nodeguard.CloseChannelRequest - (*CloseChannelResponse)(nil), // 26: nodeguard.CloseChannelResponse - (*GetChannelOperationRequestRequest)(nil), // 27: nodeguard.GetChannelOperationRequestRequest - (*GetChannelOperationRequestResponse)(nil), // 28: nodeguard.GetChannelOperationRequestResponse - (*AddLiquidityRuleRequest)(nil), // 29: nodeguard.AddLiquidityRuleRequest - (*AddLiquidityRuleResponse)(nil), // 30: nodeguard.AddLiquidityRuleResponse - (*GetAvailableUtxosRequest)(nil), // 31: nodeguard.GetAvailableUtxosRequest - (*Utxo)(nil), // 32: nodeguard.Utxo - (*GetAvailableUtxosResponse)(nil), // 33: nodeguard.GetAvailableUtxosResponse - (*GetWithdrawalsRequestStatusRequest)(nil), // 34: nodeguard.GetWithdrawalsRequestStatusRequest - (*WithdrawalRequest)(nil), // 35: nodeguard.WithdrawalRequest - (*GetWithdrawalsRequestStatusResponse)(nil), // 36: nodeguard.GetWithdrawalsRequestStatusResponse - (*GetChannelRequest)(nil), // 37: nodeguard.GetChannelRequest - (*GetChannelResponse)(nil), // 38: nodeguard.GetChannelResponse +var file_nodeguard_proto_msgTypes = make([]protoimpl.MessageInfo, 40) +var file_nodeguard_proto_goTypes = []any{ + (WALLET_TYPE)(0), // 0: nodeguard.WALLET_TYPE + (FEES_TYPE)(0), // 1: nodeguard.FEES_TYPE + (CHANNEL_OPERATION_STATUS)(0), // 2: nodeguard.CHANNEL_OPERATION_STATUS + (CHANNEL_OPERATION_TYPE)(0), // 3: nodeguard.CHANNEL_OPERATION_TYPE + (COIN_SELECTION_STRATEGY)(0), // 4: nodeguard.COIN_SELECTION_STRATEGY + (WITHDRAWAL_REQUEST_STATUS)(0), // 5: nodeguard.WITHDRAWAL_REQUEST_STATUS + (CHANNEL_STATUS)(0), // 6: nodeguard.CHANNEL_STATUS + (*GetLiquidityRulesRequest)(nil), // 7: nodeguard.GetLiquidityRulesRequest + (*GetLiquidityRulesResponse)(nil), // 8: nodeguard.GetLiquidityRulesResponse + (*LiquidityRule)(nil), // 9: nodeguard.LiquidityRule + (*GetNewWalletAddressRequest)(nil), // 10: nodeguard.GetNewWalletAddressRequest + (*GetNewWalletAddressResponse)(nil), // 11: nodeguard.GetNewWalletAddressResponse + (*Destination)(nil), // 12: nodeguard.Destination + (*RequestWithdrawalRequest)(nil), // 13: nodeguard.RequestWithdrawalRequest + (*RequestWithdrawalResponse)(nil), // 14: nodeguard.RequestWithdrawalResponse + (*GetAvailableWalletsRequest)(nil), // 15: nodeguard.GetAvailableWalletsRequest + (*AccountKeySettings)(nil), // 16: nodeguard.AccountKeySettings + (*Wallet)(nil), // 17: nodeguard.Wallet + (*GetAvailableWalletsResponse)(nil), // 18: nodeguard.GetAvailableWalletsResponse + (*GetWalletBalanceRequest)(nil), // 19: nodeguard.GetWalletBalanceRequest + (*GetWalletBalanceResponse)(nil), // 20: nodeguard.GetWalletBalanceResponse + (*AddNodeRequest)(nil), // 21: nodeguard.AddNodeRequest + (*AddNodeResponse)(nil), // 22: nodeguard.AddNodeResponse + (*Node)(nil), // 23: nodeguard.Node + (*GetNodesRequest)(nil), // 24: nodeguard.GetNodesRequest + (*GetNodesResponse)(nil), // 25: nodeguard.GetNodesResponse + (*OpenChannelRequest)(nil), // 26: nodeguard.OpenChannelRequest + (*OpenChannelResponse)(nil), // 27: nodeguard.OpenChannelResponse + (*CloseChannelRequest)(nil), // 28: nodeguard.CloseChannelRequest + (*CloseChannelResponse)(nil), // 29: nodeguard.CloseChannelResponse + (*GetChannelOperationRequestRequest)(nil), // 30: nodeguard.GetChannelOperationRequestRequest + (*GetChannelOperationRequestResponse)(nil), // 31: nodeguard.GetChannelOperationRequestResponse + (*AddLiquidityRuleRequest)(nil), // 32: nodeguard.AddLiquidityRuleRequest + (*AddLiquidityRuleResponse)(nil), // 33: nodeguard.AddLiquidityRuleResponse + (*GetUtxosRequest)(nil), // 34: nodeguard.GetUtxosRequest + (*GetAvailableUtxosRequest)(nil), // 35: nodeguard.GetAvailableUtxosRequest + (*Utxo)(nil), // 36: nodeguard.Utxo + (*GetUtxosResponse)(nil), // 37: nodeguard.GetUtxosResponse + (*GetWithdrawalsRequestStatusRequest)(nil), // 38: nodeguard.GetWithdrawalsRequestStatusRequest + (*WithdrawalRequest)(nil), // 39: nodeguard.WithdrawalRequest + (*GetWithdrawalsRequestStatusResponse)(nil), // 40: nodeguard.GetWithdrawalsRequestStatusResponse + (*GetWithdrawalsRequestStatusByReferenceIdsRequest)(nil), // 41: nodeguard.GetWithdrawalsRequestStatusByReferenceIdsRequest + (*GetChannelRequest)(nil), // 42: nodeguard.GetChannelRequest + (*GetChannelResponse)(nil), // 43: nodeguard.GetChannelResponse + (*Tag)(nil), // 44: nodeguard.Tag + (*AddTagsRequest)(nil), // 45: nodeguard.AddTagsRequest + (*AddTagsResponse)(nil), // 46: nodeguard.AddTagsResponse } var file_nodeguard_proto_depIdxs = []int32{ 9, // 0: nodeguard.GetLiquidityRulesResponse.liquidity_rules:type_name -> nodeguard.LiquidityRule 1, // 1: nodeguard.RequestWithdrawalRequest.mempool_fee_rate:type_name -> nodeguard.FEES_TYPE - 0, // 2: nodeguard.GetAvailableWalletsRequest.wallet_type:type_name -> nodeguard.WALLET_TYPE - 15, // 3: nodeguard.Wallet.account_key_settings:type_name -> nodeguard.AccountKeySettings - 16, // 4: nodeguard.GetAvailableWalletsResponse.wallets:type_name -> nodeguard.Wallet - 20, // 5: nodeguard.GetNodesResponse.nodes:type_name -> nodeguard.Node - 1, // 6: nodeguard.OpenChannelRequest.mempool_fee_rate:type_name -> nodeguard.FEES_TYPE - 2, // 7: nodeguard.GetChannelOperationRequestResponse.status:type_name -> nodeguard.CHANNEL_OPERATION_STATUS - 3, // 8: nodeguard.GetChannelOperationRequestResponse.type:type_name -> nodeguard.CHANNEL_OPERATION_TYPE - 4, // 9: nodeguard.GetAvailableUtxosRequest.strategy:type_name -> nodeguard.COIN_SELECTION_STRATEGY - 32, // 10: nodeguard.GetAvailableUtxosResponse.confirmed:type_name -> nodeguard.Utxo - 32, // 11: nodeguard.GetAvailableUtxosResponse.unconfirmed:type_name -> nodeguard.Utxo - 5, // 12: nodeguard.WithdrawalRequest.status:type_name -> nodeguard.WITHDRAWAL_REQUEST_STATUS - 35, // 13: nodeguard.GetWithdrawalsRequestStatusResponse.withdrawal_requests:type_name -> nodeguard.WithdrawalRequest - 6, // 14: nodeguard.GetChannelResponse.status:type_name -> nodeguard.CHANNEL_STATUS - 7, // 15: nodeguard.NodeGuardService.GetLiquidityRules:input_type -> nodeguard.GetLiquidityRulesRequest - 10, // 16: nodeguard.NodeGuardService.GetNewWalletAddress:input_type -> nodeguard.GetNewWalletAddressRequest - 12, // 17: nodeguard.NodeGuardService.RequestWithdrawal:input_type -> nodeguard.RequestWithdrawalRequest - 18, // 18: nodeguard.NodeGuardService.AddNode:input_type -> nodeguard.AddNodeRequest - 21, // 19: nodeguard.NodeGuardService.GetNodes:input_type -> nodeguard.GetNodesRequest - 14, // 20: nodeguard.NodeGuardService.GetAvailableWallets:input_type -> nodeguard.GetAvailableWalletsRequest - 23, // 21: nodeguard.NodeGuardService.OpenChannel:input_type -> nodeguard.OpenChannelRequest - 25, // 22: nodeguard.NodeGuardService.CloseChannel:input_type -> nodeguard.CloseChannelRequest - 27, // 23: nodeguard.NodeGuardService.GetChannelOperationRequest:input_type -> nodeguard.GetChannelOperationRequestRequest - 29, // 24: nodeguard.NodeGuardService.AddLiquidityRule:input_type -> nodeguard.AddLiquidityRuleRequest - 31, // 25: nodeguard.NodeGuardService.GetAvailableUtxos:input_type -> nodeguard.GetAvailableUtxosRequest - 34, // 26: nodeguard.NodeGuardService.GetWithdrawalsRequestStatus:input_type -> nodeguard.GetWithdrawalsRequestStatusRequest - 37, // 27: nodeguard.NodeGuardService.GetChannel:input_type -> nodeguard.GetChannelRequest - 8, // 28: nodeguard.NodeGuardService.GetLiquidityRules:output_type -> nodeguard.GetLiquidityRulesResponse - 11, // 29: nodeguard.NodeGuardService.GetNewWalletAddress:output_type -> nodeguard.GetNewWalletAddressResponse - 13, // 30: nodeguard.NodeGuardService.RequestWithdrawal:output_type -> nodeguard.RequestWithdrawalResponse - 19, // 31: nodeguard.NodeGuardService.AddNode:output_type -> nodeguard.AddNodeResponse - 22, // 32: nodeguard.NodeGuardService.GetNodes:output_type -> nodeguard.GetNodesResponse - 17, // 33: nodeguard.NodeGuardService.GetAvailableWallets:output_type -> nodeguard.GetAvailableWalletsResponse - 24, // 34: nodeguard.NodeGuardService.OpenChannel:output_type -> nodeguard.OpenChannelResponse - 26, // 35: nodeguard.NodeGuardService.CloseChannel:output_type -> nodeguard.CloseChannelResponse - 28, // 36: nodeguard.NodeGuardService.GetChannelOperationRequest:output_type -> nodeguard.GetChannelOperationRequestResponse - 30, // 37: nodeguard.NodeGuardService.AddLiquidityRule:output_type -> nodeguard.AddLiquidityRuleResponse - 33, // 38: nodeguard.NodeGuardService.GetAvailableUtxos:output_type -> nodeguard.GetAvailableUtxosResponse - 36, // 39: nodeguard.NodeGuardService.GetWithdrawalsRequestStatus:output_type -> nodeguard.GetWithdrawalsRequestStatusResponse - 38, // 40: nodeguard.NodeGuardService.GetChannel:output_type -> nodeguard.GetChannelResponse - 28, // [28:41] is the sub-list for method output_type - 15, // [15:28] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 12, // 2: nodeguard.RequestWithdrawalRequest.destinations:type_name -> nodeguard.Destination + 0, // 3: nodeguard.GetAvailableWalletsRequest.wallet_type:type_name -> nodeguard.WALLET_TYPE + 16, // 4: nodeguard.Wallet.account_key_settings:type_name -> nodeguard.AccountKeySettings + 17, // 5: nodeguard.GetAvailableWalletsResponse.wallets:type_name -> nodeguard.Wallet + 23, // 6: nodeguard.GetNodesResponse.nodes:type_name -> nodeguard.Node + 1, // 7: nodeguard.OpenChannelRequest.mempool_fee_rate:type_name -> nodeguard.FEES_TYPE + 2, // 8: nodeguard.GetChannelOperationRequestResponse.status:type_name -> nodeguard.CHANNEL_OPERATION_STATUS + 3, // 9: nodeguard.GetChannelOperationRequestResponse.type:type_name -> nodeguard.CHANNEL_OPERATION_TYPE + 4, // 10: nodeguard.GetAvailableUtxosRequest.strategy:type_name -> nodeguard.COIN_SELECTION_STRATEGY + 36, // 11: nodeguard.GetUtxosResponse.confirmed:type_name -> nodeguard.Utxo + 36, // 12: nodeguard.GetUtxosResponse.unconfirmed:type_name -> nodeguard.Utxo + 5, // 13: nodeguard.WithdrawalRequest.status:type_name -> nodeguard.WITHDRAWAL_REQUEST_STATUS + 39, // 14: nodeguard.GetWithdrawalsRequestStatusResponse.withdrawal_requests:type_name -> nodeguard.WithdrawalRequest + 6, // 15: nodeguard.GetChannelResponse.status:type_name -> nodeguard.CHANNEL_STATUS + 44, // 16: nodeguard.AddTagsRequest.tags:type_name -> nodeguard.Tag + 7, // 17: nodeguard.NodeGuardService.GetLiquidityRules:input_type -> nodeguard.GetLiquidityRulesRequest + 10, // 18: nodeguard.NodeGuardService.GetNewWalletAddress:input_type -> nodeguard.GetNewWalletAddressRequest + 13, // 19: nodeguard.NodeGuardService.RequestWithdrawal:input_type -> nodeguard.RequestWithdrawalRequest + 21, // 20: nodeguard.NodeGuardService.AddNode:input_type -> nodeguard.AddNodeRequest + 24, // 21: nodeguard.NodeGuardService.GetNodes:input_type -> nodeguard.GetNodesRequest + 15, // 22: nodeguard.NodeGuardService.GetAvailableWallets:input_type -> nodeguard.GetAvailableWalletsRequest + 19, // 23: nodeguard.NodeGuardService.GetWalletBalance:input_type -> nodeguard.GetWalletBalanceRequest + 26, // 24: nodeguard.NodeGuardService.OpenChannel:input_type -> nodeguard.OpenChannelRequest + 28, // 25: nodeguard.NodeGuardService.CloseChannel:input_type -> nodeguard.CloseChannelRequest + 30, // 26: nodeguard.NodeGuardService.GetChannelOperationRequest:input_type -> nodeguard.GetChannelOperationRequestRequest + 32, // 27: nodeguard.NodeGuardService.AddLiquidityRule:input_type -> nodeguard.AddLiquidityRuleRequest + 35, // 28: nodeguard.NodeGuardService.GetAvailableUtxos:input_type -> nodeguard.GetAvailableUtxosRequest + 34, // 29: nodeguard.NodeGuardService.GetUtxos:input_type -> nodeguard.GetUtxosRequest + 38, // 30: nodeguard.NodeGuardService.GetWithdrawalsRequestStatus:input_type -> nodeguard.GetWithdrawalsRequestStatusRequest + 41, // 31: nodeguard.NodeGuardService.GetWithdrawalsRequestStatusByReferenceIds:input_type -> nodeguard.GetWithdrawalsRequestStatusByReferenceIdsRequest + 42, // 32: nodeguard.NodeGuardService.GetChannel:input_type -> nodeguard.GetChannelRequest + 45, // 33: nodeguard.NodeGuardService.AddTags:input_type -> nodeguard.AddTagsRequest + 8, // 34: nodeguard.NodeGuardService.GetLiquidityRules:output_type -> nodeguard.GetLiquidityRulesResponse + 11, // 35: nodeguard.NodeGuardService.GetNewWalletAddress:output_type -> nodeguard.GetNewWalletAddressResponse + 14, // 36: nodeguard.NodeGuardService.RequestWithdrawal:output_type -> nodeguard.RequestWithdrawalResponse + 22, // 37: nodeguard.NodeGuardService.AddNode:output_type -> nodeguard.AddNodeResponse + 25, // 38: nodeguard.NodeGuardService.GetNodes:output_type -> nodeguard.GetNodesResponse + 18, // 39: nodeguard.NodeGuardService.GetAvailableWallets:output_type -> nodeguard.GetAvailableWalletsResponse + 20, // 40: nodeguard.NodeGuardService.GetWalletBalance:output_type -> nodeguard.GetWalletBalanceResponse + 27, // 41: nodeguard.NodeGuardService.OpenChannel:output_type -> nodeguard.OpenChannelResponse + 29, // 42: nodeguard.NodeGuardService.CloseChannel:output_type -> nodeguard.CloseChannelResponse + 31, // 43: nodeguard.NodeGuardService.GetChannelOperationRequest:output_type -> nodeguard.GetChannelOperationRequestResponse + 33, // 44: nodeguard.NodeGuardService.AddLiquidityRule:output_type -> nodeguard.AddLiquidityRuleResponse + 37, // 45: nodeguard.NodeGuardService.GetAvailableUtxos:output_type -> nodeguard.GetUtxosResponse + 37, // 46: nodeguard.NodeGuardService.GetUtxos:output_type -> nodeguard.GetUtxosResponse + 40, // 47: nodeguard.NodeGuardService.GetWithdrawalsRequestStatus:output_type -> nodeguard.GetWithdrawalsRequestStatusResponse + 40, // 48: nodeguard.NodeGuardService.GetWithdrawalsRequestStatusByReferenceIds:output_type -> nodeguard.GetWithdrawalsRequestStatusResponse + 43, // 49: nodeguard.NodeGuardService.GetChannel:output_type -> nodeguard.GetChannelResponse + 46, // 50: nodeguard.NodeGuardService.AddTags:output_type -> nodeguard.AddTagsResponse + 34, // [34:51] is the sub-list for method output_type + 17, // [17:34] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_nodeguard_proto_init() } @@ -3168,7 +3717,7 @@ func file_nodeguard_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_nodeguard_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*GetLiquidityRulesRequest); i { case 0: return &v.state @@ -3180,7 +3729,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*GetLiquidityRulesResponse); i { case 0: return &v.state @@ -3192,7 +3741,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*LiquidityRule); i { case 0: return &v.state @@ -3204,7 +3753,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*GetNewWalletAddressRequest); i { case 0: return &v.state @@ -3216,7 +3765,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*GetNewWalletAddressResponse); i { case 0: return &v.state @@ -3228,7 +3777,19 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*Destination); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*RequestWithdrawalRequest); i { case 0: return &v.state @@ -3240,7 +3801,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*RequestWithdrawalResponse); i { case 0: return &v.state @@ -3252,7 +3813,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*GetAvailableWalletsRequest); i { case 0: return &v.state @@ -3264,7 +3825,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AccountKeySettings); i { case 0: return &v.state @@ -3276,7 +3837,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*Wallet); i { case 0: return &v.state @@ -3288,7 +3849,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*GetAvailableWalletsResponse); i { case 0: return &v.state @@ -3300,7 +3861,31 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[12].Exporter = func(v any, i int) any { + switch v := v.(*GetWalletBalanceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[13].Exporter = func(v any, i int) any { + switch v := v.(*GetWalletBalanceResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*AddNodeRequest); i { case 0: return &v.state @@ -3312,7 +3897,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*AddNodeResponse); i { case 0: return &v.state @@ -3324,7 +3909,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*Node); i { case 0: return &v.state @@ -3336,7 +3921,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*GetNodesRequest); i { case 0: return &v.state @@ -3348,7 +3933,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*GetNodesResponse); i { case 0: return &v.state @@ -3360,7 +3945,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*OpenChannelRequest); i { case 0: return &v.state @@ -3372,7 +3957,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*OpenChannelResponse); i { case 0: return &v.state @@ -3384,7 +3969,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*CloseChannelRequest); i { case 0: return &v.state @@ -3396,7 +3981,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*CloseChannelResponse); i { case 0: return &v.state @@ -3408,7 +3993,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*GetChannelOperationRequestRequest); i { case 0: return &v.state @@ -3420,7 +4005,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*GetChannelOperationRequestResponse); i { case 0: return &v.state @@ -3432,7 +4017,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*AddLiquidityRuleRequest); i { case 0: return &v.state @@ -3444,7 +4029,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*AddLiquidityRuleResponse); i { case 0: return &v.state @@ -3456,7 +4041,19 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[27].Exporter = func(v any, i int) any { + switch v := v.(*GetUtxosRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*GetAvailableUtxosRequest); i { case 0: return &v.state @@ -3468,7 +4065,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*Utxo); i { case 0: return &v.state @@ -3480,8 +4077,8 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAvailableUtxosResponse); i { + file_nodeguard_proto_msgTypes[30].Exporter = func(v any, i int) any { + switch v := v.(*GetUtxosResponse); i { case 0: return &v.state case 1: @@ -3492,7 +4089,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*GetWithdrawalsRequestStatusRequest); i { case 0: return &v.state @@ -3504,7 +4101,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*WithdrawalRequest); i { case 0: return &v.state @@ -3516,7 +4113,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*GetWithdrawalsRequestStatusResponse); i { case 0: return &v.state @@ -3528,7 +4125,19 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[34].Exporter = func(v any, i int) any { + switch v := v.(*GetWithdrawalsRequestStatusByReferenceIdsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*GetChannelRequest); i { case 0: return &v.state @@ -3540,7 +4149,7 @@ func file_nodeguard_proto_init() { return nil } } - file_nodeguard_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_nodeguard_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*GetChannelResponse); i { case 0: return &v.state @@ -3552,23 +4161,59 @@ func file_nodeguard_proto_init() { return nil } } + file_nodeguard_proto_msgTypes[37].Exporter = func(v any, i int) any { + switch v := v.(*Tag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[38].Exporter = func(v any, i int) any { + switch v := v.(*AddTagsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_nodeguard_proto_msgTypes[39].Exporter = func(v any, i int) any { + switch v := v.(*AddTagsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } - file_nodeguard_proto_msgTypes[2].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[5].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[7].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[16].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[21].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[22].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[24].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[28].OneofWrappers = []interface{}{} - file_nodeguard_proto_msgTypes[31].OneofWrappers = []interface{}{} + file_nodeguard_proto_msgTypes[2].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[6].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[8].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[19].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[24].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[25].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[28].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[32].OneofWrappers = []any{} + file_nodeguard_proto_msgTypes[36].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_nodeguard_proto_rawDesc, NumEnums: 7, - NumMessages: 32, + NumMessages: 40, NumExtensions: 0, NumServices: 1, }, diff --git a/nodeguard/nodeguard_grpc.pb.go b/nodeguard/nodeguard_grpc.pb.go index 5fbe922..c437ddf 100644 --- a/nodeguard/nodeguard_grpc.pb.go +++ b/nodeguard/nodeguard_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc-gen-go-grpc v1.4.0 +// - protoc v5.29.3 // source: nodeguard.proto package nodeguard @@ -15,23 +15,27 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( - NodeGuardService_GetLiquidityRules_FullMethodName = "/nodeguard.NodeGuardService/GetLiquidityRules" - NodeGuardService_GetNewWalletAddress_FullMethodName = "/nodeguard.NodeGuardService/GetNewWalletAddress" - NodeGuardService_RequestWithdrawal_FullMethodName = "/nodeguard.NodeGuardService/RequestWithdrawal" - NodeGuardService_AddNode_FullMethodName = "/nodeguard.NodeGuardService/AddNode" - NodeGuardService_GetNodes_FullMethodName = "/nodeguard.NodeGuardService/GetNodes" - NodeGuardService_GetAvailableWallets_FullMethodName = "/nodeguard.NodeGuardService/GetAvailableWallets" - NodeGuardService_OpenChannel_FullMethodName = "/nodeguard.NodeGuardService/OpenChannel" - NodeGuardService_CloseChannel_FullMethodName = "/nodeguard.NodeGuardService/CloseChannel" - NodeGuardService_GetChannelOperationRequest_FullMethodName = "/nodeguard.NodeGuardService/GetChannelOperationRequest" - NodeGuardService_AddLiquidityRule_FullMethodName = "/nodeguard.NodeGuardService/AddLiquidityRule" - NodeGuardService_GetAvailableUtxos_FullMethodName = "/nodeguard.NodeGuardService/GetAvailableUtxos" - NodeGuardService_GetWithdrawalsRequestStatus_FullMethodName = "/nodeguard.NodeGuardService/GetWithdrawalsRequestStatus" - NodeGuardService_GetChannel_FullMethodName = "/nodeguard.NodeGuardService/GetChannel" + NodeGuardService_GetLiquidityRules_FullMethodName = "/nodeguard.NodeGuardService/GetLiquidityRules" + NodeGuardService_GetNewWalletAddress_FullMethodName = "/nodeguard.NodeGuardService/GetNewWalletAddress" + NodeGuardService_RequestWithdrawal_FullMethodName = "/nodeguard.NodeGuardService/RequestWithdrawal" + NodeGuardService_AddNode_FullMethodName = "/nodeguard.NodeGuardService/AddNode" + NodeGuardService_GetNodes_FullMethodName = "/nodeguard.NodeGuardService/GetNodes" + NodeGuardService_GetAvailableWallets_FullMethodName = "/nodeguard.NodeGuardService/GetAvailableWallets" + NodeGuardService_GetWalletBalance_FullMethodName = "/nodeguard.NodeGuardService/GetWalletBalance" + NodeGuardService_OpenChannel_FullMethodName = "/nodeguard.NodeGuardService/OpenChannel" + NodeGuardService_CloseChannel_FullMethodName = "/nodeguard.NodeGuardService/CloseChannel" + NodeGuardService_GetChannelOperationRequest_FullMethodName = "/nodeguard.NodeGuardService/GetChannelOperationRequest" + NodeGuardService_AddLiquidityRule_FullMethodName = "/nodeguard.NodeGuardService/AddLiquidityRule" + NodeGuardService_GetAvailableUtxos_FullMethodName = "/nodeguard.NodeGuardService/GetAvailableUtxos" + NodeGuardService_GetUtxos_FullMethodName = "/nodeguard.NodeGuardService/GetUtxos" + NodeGuardService_GetWithdrawalsRequestStatus_FullMethodName = "/nodeguard.NodeGuardService/GetWithdrawalsRequestStatus" + NodeGuardService_GetWithdrawalsRequestStatusByReferenceIds_FullMethodName = "/nodeguard.NodeGuardService/GetWithdrawalsRequestStatusByReferenceIds" + NodeGuardService_GetChannel_FullMethodName = "/nodeguard.NodeGuardService/GetChannel" + NodeGuardService_AddTags_FullMethodName = "/nodeguard.NodeGuardService/AddTags" ) // NodeGuardServiceClient is the client API for NodeGuardService service. @@ -50,6 +54,8 @@ type NodeGuardServiceClient interface { GetNodes(ctx context.Context, in *GetNodesRequest, opts ...grpc.CallOption) (*GetNodesResponse, error) // Gets a list of available wallets GetAvailableWallets(ctx context.Context, in *GetAvailableWalletsRequest, opts ...grpc.CallOption) (*GetAvailableWalletsResponse, error) + // Get balance from a specific wallet + GetWalletBalance(ctx context.Context, in *GetWalletBalanceRequest, opts ...grpc.CallOption) (*GetWalletBalanceResponse, error) // Opens a channel to a given node OpenChannel(ctx context.Context, in *OpenChannelRequest, opts ...grpc.CallOption) (*OpenChannelResponse, error) // Closes a channel to a given node @@ -58,12 +64,18 @@ type NodeGuardServiceClient interface { GetChannelOperationRequest(ctx context.Context, in *GetChannelOperationRequestRequest, opts ...grpc.CallOption) (*GetChannelOperationRequestResponse, error) // Adds a liquidity rule to a channel AddLiquidityRule(ctx context.Context, in *AddLiquidityRuleRequest, opts ...grpc.CallOption) (*AddLiquidityRuleResponse, error) - // Gets a list of available UTXOs for a wallet - GetAvailableUtxos(ctx context.Context, in *GetAvailableUtxosRequest, opts ...grpc.CallOption) (*GetAvailableUtxosResponse, error) + // Gets a list of available UTXOs for a single wallet + GetAvailableUtxos(ctx context.Context, in *GetAvailableUtxosRequest, opts ...grpc.CallOption) (*GetUtxosResponse, error) + // Gets a list of all UTXOs from all available wallets + GetUtxos(ctx context.Context, in *GetUtxosRequest, opts ...grpc.CallOption) (*GetUtxosResponse, error) // Gets the status for the provided withdrawals request ids GetWithdrawalsRequestStatus(ctx context.Context, in *GetWithdrawalsRequestStatusRequest, opts ...grpc.CallOption) (*GetWithdrawalsRequestStatusResponse, error) + // Gets the status for the provided withdrawals request reference ids + GetWithdrawalsRequestStatusByReferenceIds(ctx context.Context, in *GetWithdrawalsRequestStatusByReferenceIdsRequest, opts ...grpc.CallOption) (*GetWithdrawalsRequestStatusResponse, error) // Gets a channel by id GetChannel(ctx context.Context, in *GetChannelRequest, opts ...grpc.CallOption) (*GetChannelResponse, error) + // Adds tags to UTXOs under the treasury + AddTags(ctx context.Context, in *AddTagsRequest, opts ...grpc.CallOption) (*AddTagsResponse, error) } type nodeGuardServiceClient struct { @@ -75,8 +87,9 @@ func NewNodeGuardServiceClient(cc grpc.ClientConnInterface) NodeGuardServiceClie } func (c *nodeGuardServiceClient) GetLiquidityRules(ctx context.Context, in *GetLiquidityRulesRequest, opts ...grpc.CallOption) (*GetLiquidityRulesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetLiquidityRulesResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetLiquidityRules_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetLiquidityRules_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -84,8 +97,9 @@ func (c *nodeGuardServiceClient) GetLiquidityRules(ctx context.Context, in *GetL } func (c *nodeGuardServiceClient) GetNewWalletAddress(ctx context.Context, in *GetNewWalletAddressRequest, opts ...grpc.CallOption) (*GetNewWalletAddressResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetNewWalletAddressResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetNewWalletAddress_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetNewWalletAddress_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -93,8 +107,9 @@ func (c *nodeGuardServiceClient) GetNewWalletAddress(ctx context.Context, in *Ge } func (c *nodeGuardServiceClient) RequestWithdrawal(ctx context.Context, in *RequestWithdrawalRequest, opts ...grpc.CallOption) (*RequestWithdrawalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RequestWithdrawalResponse) - err := c.cc.Invoke(ctx, NodeGuardService_RequestWithdrawal_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_RequestWithdrawal_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -102,8 +117,9 @@ func (c *nodeGuardServiceClient) RequestWithdrawal(ctx context.Context, in *Requ } func (c *nodeGuardServiceClient) AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddNodeResponse) - err := c.cc.Invoke(ctx, NodeGuardService_AddNode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_AddNode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -111,8 +127,9 @@ func (c *nodeGuardServiceClient) AddNode(ctx context.Context, in *AddNodeRequest } func (c *nodeGuardServiceClient) GetNodes(ctx context.Context, in *GetNodesRequest, opts ...grpc.CallOption) (*GetNodesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetNodesResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetNodes_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetNodes_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -120,8 +137,19 @@ func (c *nodeGuardServiceClient) GetNodes(ctx context.Context, in *GetNodesReque } func (c *nodeGuardServiceClient) GetAvailableWallets(ctx context.Context, in *GetAvailableWalletsRequest, opts ...grpc.CallOption) (*GetAvailableWalletsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetAvailableWalletsResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetAvailableWallets_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetAvailableWallets_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeGuardServiceClient) GetWalletBalance(ctx context.Context, in *GetWalletBalanceRequest, opts ...grpc.CallOption) (*GetWalletBalanceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetWalletBalanceResponse) + err := c.cc.Invoke(ctx, NodeGuardService_GetWalletBalance_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -129,8 +157,9 @@ func (c *nodeGuardServiceClient) GetAvailableWallets(ctx context.Context, in *Ge } func (c *nodeGuardServiceClient) OpenChannel(ctx context.Context, in *OpenChannelRequest, opts ...grpc.CallOption) (*OpenChannelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(OpenChannelResponse) - err := c.cc.Invoke(ctx, NodeGuardService_OpenChannel_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_OpenChannel_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -138,8 +167,9 @@ func (c *nodeGuardServiceClient) OpenChannel(ctx context.Context, in *OpenChanne } func (c *nodeGuardServiceClient) CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (*CloseChannelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CloseChannelResponse) - err := c.cc.Invoke(ctx, NodeGuardService_CloseChannel_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_CloseChannel_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -147,8 +177,9 @@ func (c *nodeGuardServiceClient) CloseChannel(ctx context.Context, in *CloseChan } func (c *nodeGuardServiceClient) GetChannelOperationRequest(ctx context.Context, in *GetChannelOperationRequestRequest, opts ...grpc.CallOption) (*GetChannelOperationRequestResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetChannelOperationRequestResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetChannelOperationRequest_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetChannelOperationRequest_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -156,17 +187,29 @@ func (c *nodeGuardServiceClient) GetChannelOperationRequest(ctx context.Context, } func (c *nodeGuardServiceClient) AddLiquidityRule(ctx context.Context, in *AddLiquidityRuleRequest, opts ...grpc.CallOption) (*AddLiquidityRuleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddLiquidityRuleResponse) - err := c.cc.Invoke(ctx, NodeGuardService_AddLiquidityRule_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_AddLiquidityRule_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeGuardServiceClient) GetAvailableUtxos(ctx context.Context, in *GetAvailableUtxosRequest, opts ...grpc.CallOption) (*GetUtxosResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetUtxosResponse) + err := c.cc.Invoke(ctx, NodeGuardService_GetAvailableUtxos_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *nodeGuardServiceClient) GetAvailableUtxos(ctx context.Context, in *GetAvailableUtxosRequest, opts ...grpc.CallOption) (*GetAvailableUtxosResponse, error) { - out := new(GetAvailableUtxosResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetAvailableUtxos_FullMethodName, in, out, opts...) +func (c *nodeGuardServiceClient) GetUtxos(ctx context.Context, in *GetUtxosRequest, opts ...grpc.CallOption) (*GetUtxosResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetUtxosResponse) + err := c.cc.Invoke(ctx, NodeGuardService_GetUtxos_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -174,8 +217,19 @@ func (c *nodeGuardServiceClient) GetAvailableUtxos(ctx context.Context, in *GetA } func (c *nodeGuardServiceClient) GetWithdrawalsRequestStatus(ctx context.Context, in *GetWithdrawalsRequestStatusRequest, opts ...grpc.CallOption) (*GetWithdrawalsRequestStatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetWithdrawalsRequestStatusResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetWithdrawalsRequestStatus_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetWithdrawalsRequestStatus_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeGuardServiceClient) GetWithdrawalsRequestStatusByReferenceIds(ctx context.Context, in *GetWithdrawalsRequestStatusByReferenceIdsRequest, opts ...grpc.CallOption) (*GetWithdrawalsRequestStatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetWithdrawalsRequestStatusResponse) + err := c.cc.Invoke(ctx, NodeGuardService_GetWithdrawalsRequestStatusByReferenceIds_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -183,8 +237,19 @@ func (c *nodeGuardServiceClient) GetWithdrawalsRequestStatus(ctx context.Context } func (c *nodeGuardServiceClient) GetChannel(ctx context.Context, in *GetChannelRequest, opts ...grpc.CallOption) (*GetChannelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetChannelResponse) - err := c.cc.Invoke(ctx, NodeGuardService_GetChannel_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, NodeGuardService_GetChannel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeGuardServiceClient) AddTags(ctx context.Context, in *AddTagsRequest, opts ...grpc.CallOption) (*AddTagsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AddTagsResponse) + err := c.cc.Invoke(ctx, NodeGuardService_AddTags_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -207,6 +272,8 @@ type NodeGuardServiceServer interface { GetNodes(context.Context, *GetNodesRequest) (*GetNodesResponse, error) // Gets a list of available wallets GetAvailableWallets(context.Context, *GetAvailableWalletsRequest) (*GetAvailableWalletsResponse, error) + // Get balance from a specific wallet + GetWalletBalance(context.Context, *GetWalletBalanceRequest) (*GetWalletBalanceResponse, error) // Opens a channel to a given node OpenChannel(context.Context, *OpenChannelRequest) (*OpenChannelResponse, error) // Closes a channel to a given node @@ -215,12 +282,18 @@ type NodeGuardServiceServer interface { GetChannelOperationRequest(context.Context, *GetChannelOperationRequestRequest) (*GetChannelOperationRequestResponse, error) // Adds a liquidity rule to a channel AddLiquidityRule(context.Context, *AddLiquidityRuleRequest) (*AddLiquidityRuleResponse, error) - // Gets a list of available UTXOs for a wallet - GetAvailableUtxos(context.Context, *GetAvailableUtxosRequest) (*GetAvailableUtxosResponse, error) + // Gets a list of available UTXOs for a single wallet + GetAvailableUtxos(context.Context, *GetAvailableUtxosRequest) (*GetUtxosResponse, error) + // Gets a list of all UTXOs from all available wallets + GetUtxos(context.Context, *GetUtxosRequest) (*GetUtxosResponse, error) // Gets the status for the provided withdrawals request ids GetWithdrawalsRequestStatus(context.Context, *GetWithdrawalsRequestStatusRequest) (*GetWithdrawalsRequestStatusResponse, error) + // Gets the status for the provided withdrawals request reference ids + GetWithdrawalsRequestStatusByReferenceIds(context.Context, *GetWithdrawalsRequestStatusByReferenceIdsRequest) (*GetWithdrawalsRequestStatusResponse, error) // Gets a channel by id GetChannel(context.Context, *GetChannelRequest) (*GetChannelResponse, error) + // Adds tags to UTXOs under the treasury + AddTags(context.Context, *AddTagsRequest) (*AddTagsResponse, error) mustEmbedUnimplementedNodeGuardServiceServer() } @@ -246,6 +319,9 @@ func (UnimplementedNodeGuardServiceServer) GetNodes(context.Context, *GetNodesRe func (UnimplementedNodeGuardServiceServer) GetAvailableWallets(context.Context, *GetAvailableWalletsRequest) (*GetAvailableWalletsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAvailableWallets not implemented") } +func (UnimplementedNodeGuardServiceServer) GetWalletBalance(context.Context, *GetWalletBalanceRequest) (*GetWalletBalanceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWalletBalance not implemented") +} func (UnimplementedNodeGuardServiceServer) OpenChannel(context.Context, *OpenChannelRequest) (*OpenChannelResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method OpenChannel not implemented") } @@ -258,15 +334,24 @@ func (UnimplementedNodeGuardServiceServer) GetChannelOperationRequest(context.Co func (UnimplementedNodeGuardServiceServer) AddLiquidityRule(context.Context, *AddLiquidityRuleRequest) (*AddLiquidityRuleResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AddLiquidityRule not implemented") } -func (UnimplementedNodeGuardServiceServer) GetAvailableUtxos(context.Context, *GetAvailableUtxosRequest) (*GetAvailableUtxosResponse, error) { +func (UnimplementedNodeGuardServiceServer) GetAvailableUtxos(context.Context, *GetAvailableUtxosRequest) (*GetUtxosResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAvailableUtxos not implemented") } +func (UnimplementedNodeGuardServiceServer) GetUtxos(context.Context, *GetUtxosRequest) (*GetUtxosResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUtxos not implemented") +} func (UnimplementedNodeGuardServiceServer) GetWithdrawalsRequestStatus(context.Context, *GetWithdrawalsRequestStatusRequest) (*GetWithdrawalsRequestStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWithdrawalsRequestStatus not implemented") } +func (UnimplementedNodeGuardServiceServer) GetWithdrawalsRequestStatusByReferenceIds(context.Context, *GetWithdrawalsRequestStatusByReferenceIdsRequest) (*GetWithdrawalsRequestStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWithdrawalsRequestStatusByReferenceIds not implemented") +} func (UnimplementedNodeGuardServiceServer) GetChannel(context.Context, *GetChannelRequest) (*GetChannelResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetChannel not implemented") } +func (UnimplementedNodeGuardServiceServer) AddTags(context.Context, *AddTagsRequest) (*AddTagsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTags not implemented") +} func (UnimplementedNodeGuardServiceServer) mustEmbedUnimplementedNodeGuardServiceServer() {} // UnsafeNodeGuardServiceServer may be embedded to opt out of forward compatibility for this service. @@ -388,6 +473,24 @@ func _NodeGuardService_GetAvailableWallets_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _NodeGuardService_GetWalletBalance_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWalletBalanceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeGuardServiceServer).GetWalletBalance(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NodeGuardService_GetWalletBalance_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeGuardServiceServer).GetWalletBalance(ctx, req.(*GetWalletBalanceRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _NodeGuardService_OpenChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(OpenChannelRequest) if err := dec(in); err != nil { @@ -478,6 +581,24 @@ func _NodeGuardService_GetAvailableUtxos_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } +func _NodeGuardService_GetUtxos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUtxosRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeGuardServiceServer).GetUtxos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NodeGuardService_GetUtxos_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeGuardServiceServer).GetUtxos(ctx, req.(*GetUtxosRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _NodeGuardService_GetWithdrawalsRequestStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetWithdrawalsRequestStatusRequest) if err := dec(in); err != nil { @@ -496,6 +617,24 @@ func _NodeGuardService_GetWithdrawalsRequestStatus_Handler(srv interface{}, ctx return interceptor(ctx, in, info, handler) } +func _NodeGuardService_GetWithdrawalsRequestStatusByReferenceIds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWithdrawalsRequestStatusByReferenceIdsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeGuardServiceServer).GetWithdrawalsRequestStatusByReferenceIds(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NodeGuardService_GetWithdrawalsRequestStatusByReferenceIds_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeGuardServiceServer).GetWithdrawalsRequestStatusByReferenceIds(ctx, req.(*GetWithdrawalsRequestStatusByReferenceIdsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _NodeGuardService_GetChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetChannelRequest) if err := dec(in); err != nil { @@ -514,6 +653,24 @@ func _NodeGuardService_GetChannel_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _NodeGuardService_AddTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddTagsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeGuardServiceServer).AddTags(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NodeGuardService_AddTags_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeGuardServiceServer).AddTags(ctx, req.(*AddTagsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // NodeGuardService_ServiceDesc is the grpc.ServiceDesc for NodeGuardService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -545,6 +702,10 @@ var NodeGuardService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetAvailableWallets", Handler: _NodeGuardService_GetAvailableWallets_Handler, }, + { + MethodName: "GetWalletBalance", + Handler: _NodeGuardService_GetWalletBalance_Handler, + }, { MethodName: "OpenChannel", Handler: _NodeGuardService_OpenChannel_Handler, @@ -565,14 +726,26 @@ var NodeGuardService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetAvailableUtxos", Handler: _NodeGuardService_GetAvailableUtxos_Handler, }, + { + MethodName: "GetUtxos", + Handler: _NodeGuardService_GetUtxos_Handler, + }, { MethodName: "GetWithdrawalsRequestStatus", Handler: _NodeGuardService_GetWithdrawalsRequestStatus_Handler, }, + { + MethodName: "GetWithdrawalsRequestStatusByReferenceIds", + Handler: _NodeGuardService_GetWithdrawalsRequestStatusByReferenceIds_Handler, + }, { MethodName: "GetChannel", Handler: _NodeGuardService_GetChannel_Handler, }, + { + MethodName: "AddTags", + Handler: _NodeGuardService_AddTags_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "nodeguard.proto", diff --git a/nodeguard/nodeguard_mock.go b/nodeguard/nodeguard_mock.go index d7b25b1..7fb5604 100644 --- a/nodeguard/nodeguard_mock.go +++ b/nodeguard/nodeguard_mock.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/Elenpay/liquidator/nodeguard (interfaces: NodeGuardServiceClient) +// Source: nodeguard/nodeguard_grpc.pb.go // // Generated by this command: // -// mockgen -destination ./nodeguard/nodeguard_mock.go -package nodeguard github.com/Elenpay/liquidator/nodeguard NodeGuardServiceClient +// mockgen -destination ./nodeguard/nodeguard_mock.go -source nodeguard/nodeguard_grpc.pb.go -package nodeguard // // Package nodeguard is a generated GoMock package. @@ -81,6 +81,26 @@ func (mr *MockNodeGuardServiceClientMockRecorder) AddNode(ctx, in any, opts ...a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddNode", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).AddNode), varargs...) } +// AddTags mocks base method. +func (m *MockNodeGuardServiceClient) AddTags(ctx context.Context, in *AddTagsRequest, opts ...grpc.CallOption) (*AddTagsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AddTags", varargs...) + ret0, _ := ret[0].(*AddTagsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddTags indicates an expected call of AddTags. +func (mr *MockNodeGuardServiceClientMockRecorder) AddTags(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddTags", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).AddTags), varargs...) +} + // CloseChannel mocks base method. func (m *MockNodeGuardServiceClient) CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (*CloseChannelResponse, error) { m.ctrl.T.Helper() @@ -102,14 +122,14 @@ func (mr *MockNodeGuardServiceClientMockRecorder) CloseChannel(ctx, in any, opts } // GetAvailableUtxos mocks base method. -func (m *MockNodeGuardServiceClient) GetAvailableUtxos(ctx context.Context, in *GetAvailableUtxosRequest, opts ...grpc.CallOption) (*GetAvailableUtxosResponse, error) { +func (m *MockNodeGuardServiceClient) GetAvailableUtxos(ctx context.Context, in *GetAvailableUtxosRequest, opts ...grpc.CallOption) (*GetUtxosResponse, error) { m.ctrl.T.Helper() varargs := []any{ctx, in} for _, a := range opts { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetAvailableUtxos", varargs...) - ret0, _ := ret[0].(*GetAvailableUtxosResponse) + ret0, _ := ret[0].(*GetUtxosResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -241,6 +261,46 @@ func (mr *MockNodeGuardServiceClientMockRecorder) GetNodes(ctx, in any, opts ... return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNodes", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).GetNodes), varargs...) } +// GetUtxos mocks base method. +func (m *MockNodeGuardServiceClient) GetUtxos(ctx context.Context, in *GetUtxosRequest, opts ...grpc.CallOption) (*GetUtxosResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetUtxos", varargs...) + ret0, _ := ret[0].(*GetUtxosResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUtxos indicates an expected call of GetUtxos. +func (mr *MockNodeGuardServiceClientMockRecorder) GetUtxos(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUtxos", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).GetUtxos), varargs...) +} + +// GetWalletBalance mocks base method. +func (m *MockNodeGuardServiceClient) GetWalletBalance(ctx context.Context, in *GetWalletBalanceRequest, opts ...grpc.CallOption) (*GetWalletBalanceResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetWalletBalance", varargs...) + ret0, _ := ret[0].(*GetWalletBalanceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWalletBalance indicates an expected call of GetWalletBalance. +func (mr *MockNodeGuardServiceClientMockRecorder) GetWalletBalance(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWalletBalance", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).GetWalletBalance), varargs...) +} + // GetWithdrawalsRequestStatus mocks base method. func (m *MockNodeGuardServiceClient) GetWithdrawalsRequestStatus(ctx context.Context, in *GetWithdrawalsRequestStatusRequest, opts ...grpc.CallOption) (*GetWithdrawalsRequestStatusResponse, error) { m.ctrl.T.Helper() @@ -261,6 +321,26 @@ func (mr *MockNodeGuardServiceClientMockRecorder) GetWithdrawalsRequestStatus(ct return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithdrawalsRequestStatus", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).GetWithdrawalsRequestStatus), varargs...) } +// GetWithdrawalsRequestStatusByReferenceIds mocks base method. +func (m *MockNodeGuardServiceClient) GetWithdrawalsRequestStatusByReferenceIds(ctx context.Context, in *GetWithdrawalsRequestStatusByReferenceIdsRequest, opts ...grpc.CallOption) (*GetWithdrawalsRequestStatusResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetWithdrawalsRequestStatusByReferenceIds", varargs...) + ret0, _ := ret[0].(*GetWithdrawalsRequestStatusResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWithdrawalsRequestStatusByReferenceIds indicates an expected call of GetWithdrawalsRequestStatusByReferenceIds. +func (mr *MockNodeGuardServiceClientMockRecorder) GetWithdrawalsRequestStatusByReferenceIds(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithdrawalsRequestStatusByReferenceIds", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).GetWithdrawalsRequestStatusByReferenceIds), varargs...) +} + // OpenChannel mocks base method. func (m *MockNodeGuardServiceClient) OpenChannel(ctx context.Context, in *OpenChannelRequest, opts ...grpc.CallOption) (*OpenChannelResponse, error) { m.ctrl.T.Helper() @@ -300,3 +380,330 @@ func (mr *MockNodeGuardServiceClientMockRecorder) RequestWithdrawal(ctx, in any, varargs := append([]any{ctx, in}, opts...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestWithdrawal", reflect.TypeOf((*MockNodeGuardServiceClient)(nil).RequestWithdrawal), varargs...) } + +// MockNodeGuardServiceServer is a mock of NodeGuardServiceServer interface. +type MockNodeGuardServiceServer struct { + ctrl *gomock.Controller + recorder *MockNodeGuardServiceServerMockRecorder + isgomock struct{} +} + +// MockNodeGuardServiceServerMockRecorder is the mock recorder for MockNodeGuardServiceServer. +type MockNodeGuardServiceServerMockRecorder struct { + mock *MockNodeGuardServiceServer +} + +// NewMockNodeGuardServiceServer creates a new mock instance. +func NewMockNodeGuardServiceServer(ctrl *gomock.Controller) *MockNodeGuardServiceServer { + mock := &MockNodeGuardServiceServer{ctrl: ctrl} + mock.recorder = &MockNodeGuardServiceServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockNodeGuardServiceServer) EXPECT() *MockNodeGuardServiceServerMockRecorder { + return m.recorder +} + +// AddLiquidityRule mocks base method. +func (m *MockNodeGuardServiceServer) AddLiquidityRule(arg0 context.Context, arg1 *AddLiquidityRuleRequest) (*AddLiquidityRuleResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddLiquidityRule", arg0, arg1) + ret0, _ := ret[0].(*AddLiquidityRuleResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddLiquidityRule indicates an expected call of AddLiquidityRule. +func (mr *MockNodeGuardServiceServerMockRecorder) AddLiquidityRule(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddLiquidityRule", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).AddLiquidityRule), arg0, arg1) +} + +// AddNode mocks base method. +func (m *MockNodeGuardServiceServer) AddNode(arg0 context.Context, arg1 *AddNodeRequest) (*AddNodeResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddNode", arg0, arg1) + ret0, _ := ret[0].(*AddNodeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddNode indicates an expected call of AddNode. +func (mr *MockNodeGuardServiceServerMockRecorder) AddNode(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddNode", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).AddNode), arg0, arg1) +} + +// AddTags mocks base method. +func (m *MockNodeGuardServiceServer) AddTags(arg0 context.Context, arg1 *AddTagsRequest) (*AddTagsResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddTags", arg0, arg1) + ret0, _ := ret[0].(*AddTagsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddTags indicates an expected call of AddTags. +func (mr *MockNodeGuardServiceServerMockRecorder) AddTags(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddTags", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).AddTags), arg0, arg1) +} + +// CloseChannel mocks base method. +func (m *MockNodeGuardServiceServer) CloseChannel(arg0 context.Context, arg1 *CloseChannelRequest) (*CloseChannelResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseChannel", arg0, arg1) + ret0, _ := ret[0].(*CloseChannelResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CloseChannel indicates an expected call of CloseChannel. +func (mr *MockNodeGuardServiceServerMockRecorder) CloseChannel(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseChannel", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).CloseChannel), arg0, arg1) +} + +// GetAvailableUtxos mocks base method. +func (m *MockNodeGuardServiceServer) GetAvailableUtxos(arg0 context.Context, arg1 *GetAvailableUtxosRequest) (*GetUtxosResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAvailableUtxos", arg0, arg1) + ret0, _ := ret[0].(*GetUtxosResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAvailableUtxos indicates an expected call of GetAvailableUtxos. +func (mr *MockNodeGuardServiceServerMockRecorder) GetAvailableUtxos(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAvailableUtxos", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetAvailableUtxos), arg0, arg1) +} + +// GetAvailableWallets mocks base method. +func (m *MockNodeGuardServiceServer) GetAvailableWallets(arg0 context.Context, arg1 *GetAvailableWalletsRequest) (*GetAvailableWalletsResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAvailableWallets", arg0, arg1) + ret0, _ := ret[0].(*GetAvailableWalletsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAvailableWallets indicates an expected call of GetAvailableWallets. +func (mr *MockNodeGuardServiceServerMockRecorder) GetAvailableWallets(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAvailableWallets", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetAvailableWallets), arg0, arg1) +} + +// GetChannel mocks base method. +func (m *MockNodeGuardServiceServer) GetChannel(arg0 context.Context, arg1 *GetChannelRequest) (*GetChannelResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetChannel", arg0, arg1) + ret0, _ := ret[0].(*GetChannelResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetChannel indicates an expected call of GetChannel. +func (mr *MockNodeGuardServiceServerMockRecorder) GetChannel(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetChannel", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetChannel), arg0, arg1) +} + +// GetChannelOperationRequest mocks base method. +func (m *MockNodeGuardServiceServer) GetChannelOperationRequest(arg0 context.Context, arg1 *GetChannelOperationRequestRequest) (*GetChannelOperationRequestResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetChannelOperationRequest", arg0, arg1) + ret0, _ := ret[0].(*GetChannelOperationRequestResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetChannelOperationRequest indicates an expected call of GetChannelOperationRequest. +func (mr *MockNodeGuardServiceServerMockRecorder) GetChannelOperationRequest(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetChannelOperationRequest", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetChannelOperationRequest), arg0, arg1) +} + +// GetLiquidityRules mocks base method. +func (m *MockNodeGuardServiceServer) GetLiquidityRules(arg0 context.Context, arg1 *GetLiquidityRulesRequest) (*GetLiquidityRulesResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLiquidityRules", arg0, arg1) + ret0, _ := ret[0].(*GetLiquidityRulesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetLiquidityRules indicates an expected call of GetLiquidityRules. +func (mr *MockNodeGuardServiceServerMockRecorder) GetLiquidityRules(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLiquidityRules", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetLiquidityRules), arg0, arg1) +} + +// GetNewWalletAddress mocks base method. +func (m *MockNodeGuardServiceServer) GetNewWalletAddress(arg0 context.Context, arg1 *GetNewWalletAddressRequest) (*GetNewWalletAddressResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNewWalletAddress", arg0, arg1) + ret0, _ := ret[0].(*GetNewWalletAddressResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNewWalletAddress indicates an expected call of GetNewWalletAddress. +func (mr *MockNodeGuardServiceServerMockRecorder) GetNewWalletAddress(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNewWalletAddress", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetNewWalletAddress), arg0, arg1) +} + +// GetNodes mocks base method. +func (m *MockNodeGuardServiceServer) GetNodes(arg0 context.Context, arg1 *GetNodesRequest) (*GetNodesResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNodes", arg0, arg1) + ret0, _ := ret[0].(*GetNodesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNodes indicates an expected call of GetNodes. +func (mr *MockNodeGuardServiceServerMockRecorder) GetNodes(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNodes", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetNodes), arg0, arg1) +} + +// GetUtxos mocks base method. +func (m *MockNodeGuardServiceServer) GetUtxos(arg0 context.Context, arg1 *GetUtxosRequest) (*GetUtxosResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUtxos", arg0, arg1) + ret0, _ := ret[0].(*GetUtxosResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUtxos indicates an expected call of GetUtxos. +func (mr *MockNodeGuardServiceServerMockRecorder) GetUtxos(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUtxos", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetUtxos), arg0, arg1) +} + +// GetWalletBalance mocks base method. +func (m *MockNodeGuardServiceServer) GetWalletBalance(arg0 context.Context, arg1 *GetWalletBalanceRequest) (*GetWalletBalanceResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWalletBalance", arg0, arg1) + ret0, _ := ret[0].(*GetWalletBalanceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWalletBalance indicates an expected call of GetWalletBalance. +func (mr *MockNodeGuardServiceServerMockRecorder) GetWalletBalance(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWalletBalance", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetWalletBalance), arg0, arg1) +} + +// GetWithdrawalsRequestStatus mocks base method. +func (m *MockNodeGuardServiceServer) GetWithdrawalsRequestStatus(arg0 context.Context, arg1 *GetWithdrawalsRequestStatusRequest) (*GetWithdrawalsRequestStatusResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWithdrawalsRequestStatus", arg0, arg1) + ret0, _ := ret[0].(*GetWithdrawalsRequestStatusResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWithdrawalsRequestStatus indicates an expected call of GetWithdrawalsRequestStatus. +func (mr *MockNodeGuardServiceServerMockRecorder) GetWithdrawalsRequestStatus(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithdrawalsRequestStatus", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetWithdrawalsRequestStatus), arg0, arg1) +} + +// GetWithdrawalsRequestStatusByReferenceIds mocks base method. +func (m *MockNodeGuardServiceServer) GetWithdrawalsRequestStatusByReferenceIds(arg0 context.Context, arg1 *GetWithdrawalsRequestStatusByReferenceIdsRequest) (*GetWithdrawalsRequestStatusResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWithdrawalsRequestStatusByReferenceIds", arg0, arg1) + ret0, _ := ret[0].(*GetWithdrawalsRequestStatusResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWithdrawalsRequestStatusByReferenceIds indicates an expected call of GetWithdrawalsRequestStatusByReferenceIds. +func (mr *MockNodeGuardServiceServerMockRecorder) GetWithdrawalsRequestStatusByReferenceIds(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithdrawalsRequestStatusByReferenceIds", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).GetWithdrawalsRequestStatusByReferenceIds), arg0, arg1) +} + +// OpenChannel mocks base method. +func (m *MockNodeGuardServiceServer) OpenChannel(arg0 context.Context, arg1 *OpenChannelRequest) (*OpenChannelResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OpenChannel", arg0, arg1) + ret0, _ := ret[0].(*OpenChannelResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OpenChannel indicates an expected call of OpenChannel. +func (mr *MockNodeGuardServiceServerMockRecorder) OpenChannel(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenChannel", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).OpenChannel), arg0, arg1) +} + +// RequestWithdrawal mocks base method. +func (m *MockNodeGuardServiceServer) RequestWithdrawal(arg0 context.Context, arg1 *RequestWithdrawalRequest) (*RequestWithdrawalResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RequestWithdrawal", arg0, arg1) + ret0, _ := ret[0].(*RequestWithdrawalResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RequestWithdrawal indicates an expected call of RequestWithdrawal. +func (mr *MockNodeGuardServiceServerMockRecorder) RequestWithdrawal(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestWithdrawal", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).RequestWithdrawal), arg0, arg1) +} + +// mustEmbedUnimplementedNodeGuardServiceServer mocks base method. +func (m *MockNodeGuardServiceServer) mustEmbedUnimplementedNodeGuardServiceServer() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "mustEmbedUnimplementedNodeGuardServiceServer") +} + +// mustEmbedUnimplementedNodeGuardServiceServer indicates an expected call of mustEmbedUnimplementedNodeGuardServiceServer. +func (mr *MockNodeGuardServiceServerMockRecorder) mustEmbedUnimplementedNodeGuardServiceServer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "mustEmbedUnimplementedNodeGuardServiceServer", reflect.TypeOf((*MockNodeGuardServiceServer)(nil).mustEmbedUnimplementedNodeGuardServiceServer)) +} + +// MockUnsafeNodeGuardServiceServer is a mock of UnsafeNodeGuardServiceServer interface. +type MockUnsafeNodeGuardServiceServer struct { + ctrl *gomock.Controller + recorder *MockUnsafeNodeGuardServiceServerMockRecorder + isgomock struct{} +} + +// MockUnsafeNodeGuardServiceServerMockRecorder is the mock recorder for MockUnsafeNodeGuardServiceServer. +type MockUnsafeNodeGuardServiceServerMockRecorder struct { + mock *MockUnsafeNodeGuardServiceServer +} + +// NewMockUnsafeNodeGuardServiceServer creates a new mock instance. +func NewMockUnsafeNodeGuardServiceServer(ctrl *gomock.Controller) *MockUnsafeNodeGuardServiceServer { + mock := &MockUnsafeNodeGuardServiceServer{ctrl: ctrl} + mock.recorder = &MockUnsafeNodeGuardServiceServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUnsafeNodeGuardServiceServer) EXPECT() *MockUnsafeNodeGuardServiceServerMockRecorder { + return m.recorder +} + +// mustEmbedUnimplementedNodeGuardServiceServer mocks base method. +func (m *MockUnsafeNodeGuardServiceServer) mustEmbedUnimplementedNodeGuardServiceServer() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "mustEmbedUnimplementedNodeGuardServiceServer") +} + +// mustEmbedUnimplementedNodeGuardServiceServer indicates an expected call of mustEmbedUnimplementedNodeGuardServiceServer. +func (mr *MockUnsafeNodeGuardServiceServerMockRecorder) mustEmbedUnimplementedNodeGuardServiceServer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "mustEmbedUnimplementedNodeGuardServiceServer", reflect.TypeOf((*MockUnsafeNodeGuardServiceServer)(nil).mustEmbedUnimplementedNodeGuardServiceServer)) +} diff --git a/provider/loop_provider.go b/provider/loop_provider.go index 9c53d90..344b3af 100644 --- a/provider/loop_provider.go +++ b/provider/loop_provider.go @@ -4,8 +4,8 @@ import ( "context" "encoding/hex" "fmt" - "reflect" "strconv" + "sync" "time" "github.com/Elenpay/liquidator/customerrors" @@ -17,18 +17,87 @@ import ( ) type LoopProvider struct { + // Timestamp of when submarine swap lock was acquired + submarineSwapLockTime *time.Time + + // Timestamp of when reverse submarine swap lock was acquired + reverseSwapLockTime *time.Time + + // General mutex for managing lock state + stateMutex sync.RWMutex +} + +// acquireSubmarineSwapLock tries to acquire the submarine swap lock +func (l *LoopProvider) acquireSubmarineSwapLock() error { + l.stateMutex.Lock() + defer l.stateMutex.Unlock() + + // Check if there's an active lock and if it has expired + if l.submarineSwapLockTime != nil { + swapLockTimeout := viper.GetDuration("swapLockTimeout") + if time.Since(*l.submarineSwapLockTime) < swapLockTimeout { + return &customerrors.SwapInProgressError{ + Message: fmt.Sprintf("submarine swap is locked, started at %s, will expire at %s", + l.submarineSwapLockTime.Format(time.RFC3339), + l.submarineSwapLockTime.Add(swapLockTimeout).Format(time.RFC3339)), + } + } + } + + // Acquire the lock + now := time.Now() + l.submarineSwapLockTime = &now + log.Infof("Acquired submarine swap lock at %s", now.Format(time.RFC3339)) + return nil +} + +// acquireReverseSwapLock tries to acquire the reverse swap lock +func (l *LoopProvider) acquireReverseSwapLock() error { + l.stateMutex.Lock() + defer l.stateMutex.Unlock() + + // Check if there's an active lock and if it has expired + if l.reverseSwapLockTime != nil { + swapLockTimeout := viper.GetDuration("swapLockTimeout") + if time.Since(*l.reverseSwapLockTime) < swapLockTimeout { + return &customerrors.SwapInProgressError{ + Message: fmt.Sprintf("reverse submarine swap is locked, started at %s, will expire at %s", + l.reverseSwapLockTime.Format(time.RFC3339), + l.reverseSwapLockTime.Add(swapLockTimeout).Format(time.RFC3339)), + } + } + } + + // Acquire the lock + now := time.Now() + l.reverseSwapLockTime = &now + log.Infof("Acquired reverse swap lock at %s", now.Format(time.RFC3339)) + return nil +} + +// releaseReverseSwapLock releases the reverse swap lock +func (l *LoopProvider) releaseReverseSwapLock() { + l.stateMutex.Lock() + defer l.stateMutex.Unlock() + + if l.reverseSwapLockTime != nil { + log.Infof("Released reverse swap lock that was acquired at %s", l.reverseSwapLockTime.Format(time.RFC3339)) + l.reverseSwapLockTime = nil + } } // Submarine Swap L1->L2 based on loop (Loop In) func (l *LoopProvider) RequestSubmarineSwap(ctx context.Context, request SubmarineSwapRequest, client looprpc.SwapClientClient) (SubmarineSwapResponse, error) { - //Check that no sub swap is already in progress - err := checkSubmarineSwapNotInProgress(ctx, client) + //Check that no sub swap is already in progress and acquire lock (rate limiting) + err := l.acquireSubmarineSwapLock() if err != nil { log.Error(err) return SubmarineSwapResponse{}, err } + // Note: Lock will expire automatically via timeout - no manual release for anti-spam purposes + if request.SatsAmount <= 0 { //Create error err := fmt.Errorf("swap amount is <= 0") @@ -89,9 +158,10 @@ func (l *LoopProvider) RequestSubmarineSwap(ctx context.Context, request Submari LastHop: lastHopBytes, ExternalHtlc: true, HtlcConfTarget: 0, - Label: fmt.Sprintf("Submarine swap %d sats on date %s", request.SatsAmount, time.Now().Format(time.RFC3339)), + Label: fmt.Sprintf("Swap in %d sats on date %s", request.SatsAmount, time.Now().Format(time.RFC3339)), Initiator: "Liquidator", - Private: false, + Private: true, + //TODO Review if hop hints are needed }) @@ -123,99 +193,19 @@ func (l *LoopProvider) RequestSubmarineSwap(ctx context.Context, request Submari } -// Check that a Submarine Swap is not already in progress, by now the limit is one swap at a time for Swaps L1->L2 -func checkSubmarineSwapNotInProgress(ctx context.Context, client looprpc.SwapClientClient) error { - - //Invoking ListSwaps check that a swap is not already in progress based on channelId of the request - swaps, err := client.ListSwaps(ctx, &looprpc.ListSwapsRequest{}) - if err != nil { - log.Error(err) - return err - } - - //Filter swaps of Loop In type and which are not older than 24 hours (to avoid old swaps stuck in INITIATED or HTLC_PUBLISHED state to prevent new swaps) - var loopInSwaps []*looprpc.SwapStatus - for _, swap := range swaps.Swaps { - if swap.Type == looprpc.SwapType_LOOP_IN && time.Since(time.Unix(0, swap.InitiationTime)) < 24*time.Hour { - loopInSwaps = append(loopInSwaps, swap) - } - } - - //CHeck that all the swaps status are either SUCCESS or FAILED, meaning that they are not in progress - for _, swap := range loopInSwaps { - if swap.State != looprpc.SwapState_SUCCESS && swap.State != looprpc.SwapState_FAILED { - //Create error of Swap already in progress - - id := hex.EncodeToString(swap.GetIdBytes()) - errMessage := fmt.Sprintf("another submarine swap is already in progress, swap id: %s", id) - - swapInProgressErr := customerrors.SwapInProgressError{ - Message: errMessage, - } - - return &swapInProgressErr - } - } - - return nil -} - -// Function that checks that a reverse submarine swap is only one per this channelid -func checkReverseSubmarineSwapNotInProgress(ctx context.Context, client looprpc.SwapClientClient, request ReverseSubmarineSwapRequest) error { - - //Invoking ListSwaps check that a swap is not already in progress based on channelId of the request - swapRequest := &looprpc.ListSwapsRequest{} - - log.Debugf("swapRequest: %+v", swapRequest) - log.Debugf("context: %+v", ctx) - - swaps, err := client.ListSwaps(ctx, swapRequest) - if err != nil { - log.Error(err) - return err - } - - //If there are no swaps, return nil - if len(swaps.Swaps) == 0 { - return nil - } - - //Filter swaps of Loop Out type - var loopOutSwaps []*looprpc.SwapStatus - for _, swap := range swaps.Swaps { - if swap.Type == looprpc.SwapType_LOOP_OUT && reflect.DeepEqual(swap.OutgoingChanSet, request.ChannelSet) { - loopOutSwaps = append(loopOutSwaps, swap) - } - } - - //CHeck that all the swaps status are either SUCCESS or FAILED, meaning that they are not in progress - for _, swap := range loopOutSwaps { - if swap.State != looprpc.SwapState_SUCCESS && swap.State != looprpc.SwapState_FAILED { - //Create error - id := hex.EncodeToString(swap.GetIdBytes()) - errMessage := fmt.Sprintf("another submarine swap is already in progress, swap id: %s", id) - - swapInProgressErr := customerrors.SwapInProgressError{ - Message: errMessage, - } - - return &swapInProgressErr - } - - } - return nil -} - +// Reverse Submarine Swap L2->L1 based on loop (Loop Out) // Reverse Submarine Swap L2->L1 based on loop (Loop Out) func (l *LoopProvider) RequestReverseSubmarineSwap(ctx context.Context, request ReverseSubmarineSwapRequest, client looprpc.SwapClientClient) (ReverseSubmarineSwapResponse, error) { - //Check that no other swap is in progress - err := checkReverseSubmarineSwapNotInProgress(ctx, client, request) + //Check that no other swap is in progress and acquire lock (rate limiting) + err := l.acquireReverseSwapLock() if err != nil { log.Error(err) return ReverseSubmarineSwapResponse{}, err } + // Note: Lock will expire automatically via timeout - no manual release for anti-spam purposes + if request.SatsAmount <= 0 { //Create error err := fmt.Errorf("swap amount is <= 0") @@ -272,9 +262,9 @@ func (l *LoopProvider) RequestReverseSubmarineSwap(ctx context.Context, request MaxSwapFee: int64(limits.maxSwapFee), MaxPrepayRoutingFee: int64(limits.maxPrepayRoutingFee), MaxSwapRoutingFee: maxSwapRoutingFee, - OutgoingChanSet: request.ChannelSet, - SweepConfTarget: viper.GetInt32("sweepConfTarget"), - HtlcConfirmations: 3, + // OutgoingChanSet: request.ChannelSet, Disabled, evidence indicates this is not needed + SweepConfTarget: viper.GetInt32("sweepConfTarget"), + HtlcConfirmations: 3, //The publication deadline is maximum the offset of the swap deadline conf plus the current time SwapPublicationDeadline: uint64(time.Now().Add(viper.GetDuration("swapPublicationOffset") * time.Minute).Unix()), Label: fmt.Sprintf("Reverse submarine swap %d sats on date %s for channels: %v", request.SatsAmount, time.Now().Format(time.RFC3339), request.ChannelSet), @@ -363,8 +353,6 @@ func (l *LoopProvider) MonitorSwap(ctx context.Context, swapId string, swapClien return looprpc.SwapStatus{}, err } - var response looprpc.SwapStatus - for { //Get swap status @@ -383,14 +371,11 @@ func (l *LoopProvider) MonitorSwap(ctx context.Context, swapId string, swapClien //If the swap is completed or failed, return the response if swapInfo.State == looprpc.SwapState_SUCCESS || swapInfo.State == looprpc.SwapState_FAILED { - response = *swapInfo - break + return *swapInfo, nil } time.Sleep(1 * time.Second) } - return response, nil - } diff --git a/provider/loop_provider_test.go b/provider/loop_provider_test.go index 4937e28..f6265db 100644 --- a/provider/loop_provider_test.go +++ b/provider/loop_provider_test.go @@ -4,6 +4,8 @@ import ( "context" "encoding/hex" "reflect" + "strings" + "sync" "testing" "time" @@ -22,6 +24,7 @@ func TestMain(m *testing.M) { func setLimitFees() { viper.Set("limitQuoteFees", "0.005") viper.Set("limitFeesL2", "0.002") + viper.Set("swapLockTimeout", "30s") // Set a short timeout for testing } func TestLoopProvider_RequestSubmarineSwap(t *testing.T) { @@ -363,199 +366,6 @@ func TestLoopProvider_GetSwapStatus(t *testing.T) { } } -func Test_checkSubmarineSwapNotInProgress(t *testing.T) { - - //Swap client with ListSwaps returning a swap in progress - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - //Mock SwapInfo - swapClientWithOngoingSwaps := NewMockSwapClientClient(ctrl) - idBytes, err := hex.DecodeString("1234") - if err != nil { - t.Errorf("Error decoding hex string: %v", err) - } - - swapClientWithOngoingSwaps.EXPECT().ListSwaps(gomock.Any(), gomock.Any()).Return(&looprpc.ListSwapsResponse{ - Swaps: []*looprpc.SwapStatus{ - { - Amt: 0, - Id: "", - IdBytes: idBytes, - Type: looprpc.SwapType_LOOP_IN, - State: looprpc.SwapState_INITIATED, - FailureReason: 0, - //InitiationTime 4 hours ago - InitiationTime: time.Now().Add(-4 * time.Hour).UnixNano(), - LastUpdateTime: time.Now().Add(-4 * time.Hour).UnixNano(), - HtlcAddress: "", - HtlcAddressP2Wsh: "", - HtlcAddressP2Tr: "", - CostServer: 0, - CostOnchain: 0, - CostOffchain: 0, - LastHop: []byte{}, - OutgoingChanSet: []uint64{}, - Label: "", - }, - }, - }, nil).AnyTimes() - - //Swap client with ListSwaps returning no swaps - swapClientWithNoOngoingSwaps := NewMockSwapClientClient(ctrl) - swapClientWithNoOngoingSwaps.EXPECT().ListSwaps(gomock.Any(), gomock.Any()).Return(&looprpc.ListSwapsResponse{ - Swaps: []*looprpc.SwapStatus{ - { - Amt: 0, - Id: "", - IdBytes: idBytes, - Type: looprpc.SwapType_LOOP_IN, - State: looprpc.SwapState_INITIATED, - FailureReason: 0, - //InitiationTime is more than 24 hours ago, stuck but ignored - InitiationTime: time.Now().Add(-25 * time.Hour).UnixNano(), - LastUpdateTime: time.Now().Add(-25 * time.Hour).UnixNano(), - HtlcAddress: "", - HtlcAddressP2Wsh: "", - HtlcAddressP2Tr: "", - CostServer: 0, - CostOnchain: 0, - CostOffchain: 0, - LastHop: []byte{}, - OutgoingChanSet: []uint64{}, - Label: "", - }, - }, - }, nil).AnyTimes() - - type args struct { - ctx context.Context - client looprpc.SwapClientClient - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "checkSubmarineSwapNotInProgress_valid", - args: args{ - ctx: context.Background(), - client: swapClientWithNoOngoingSwaps, - }, - wantErr: false, - }, - { - name: "checkSubmarineSwapNotInProgress_ErrorOngoingSwap", - args: args{ - ctx: context.Background(), - client: swapClientWithOngoingSwaps, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := checkSubmarineSwapNotInProgress(tt.args.ctx, tt.args.client); (err != nil) != tt.wantErr { - t.Errorf("checkSubmarineSwapNotInProgress() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -// checkReverseSubmarineSwapNotInProgress -func Test_checkReverseSubmarineSwapNotInProgress(t *testing.T) { - - //Swap client with ListSwaps returning a swap in progress - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - channelSet := []uint64{1, 2, 3} - - //Mock SwapInfo - swapClientWithOngoingSwaps := NewMockSwapClientClient(ctrl) - idBytes, err := hex.DecodeString("1234") - if err != nil { - t.Errorf("Error decoding hex string: %v", err) - } - - swapClientWithOngoingSwaps.EXPECT().ListSwaps(gomock.Any(), gomock.Any()).Return(&looprpc.ListSwapsResponse{ - Swaps: []*looprpc.SwapStatus{ - { - Amt: 0, - Id: "", - IdBytes: idBytes, - Type: looprpc.SwapType_LOOP_OUT, - State: looprpc.SwapState_INITIATED, - FailureReason: 0, - InitiationTime: 0, - LastUpdateTime: 0, - HtlcAddress: "", - HtlcAddressP2Wsh: "", - HtlcAddressP2Tr: "", - CostServer: 0, - CostOnchain: 0, - CostOffchain: 0, - LastHop: []byte{}, - OutgoingChanSet: channelSet, - Label: "", - }, - }, - }, nil).AnyTimes() - - //Swap client with ListSwaps returning no swaps - swapClientWithNoOngoingSwaps := NewMockSwapClientClient(ctrl) - swapClientWithNoOngoingSwaps.EXPECT().ListSwaps(gomock.Any(), gomock.Any()).Return(&looprpc.ListSwapsResponse{ - Swaps: []*looprpc.SwapStatus{}, - }, nil).AnyTimes() - - type args struct { - ctx context.Context - client looprpc.SwapClientClient - request ReverseSubmarineSwapRequest - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "checkReverseSubmarineSwapNotInProgress_valid", - args: args{ - ctx: context.Background(), - client: swapClientWithNoOngoingSwaps, - request: ReverseSubmarineSwapRequest{ - ReceiverBTCAddress: "", - SatsAmount: 0, - ChannelSet: channelSet, - }, - }, - wantErr: false, - }, - { - name: "checkReverseSubmarineSwapNotInProgress_ErrorOngoingSwap", - args: args{ - ctx: context.Background(), - client: swapClientWithOngoingSwaps, - request: ReverseSubmarineSwapRequest{ - ReceiverBTCAddress: "", - SatsAmount: 0, - ChannelSet: channelSet, - }, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := checkReverseSubmarineSwapNotInProgress(tt.args.ctx, tt.args.client, tt.args.request); (err != nil) != tt.wantErr { - t.Errorf("checkReverseSubmarineSwapNotInProgress() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } - -} - func TestLoopProvider_MonitorSwap(t *testing.T) { ctrl := gomock.NewController(t) @@ -662,3 +472,181 @@ func TestLoopProvider_MonitorSwap(t *testing.T) { }) } } + +// TestLoopProvider_LockFunctionality tests the submarine swap and reverse swap locking mechanisms +func TestLoopProvider_LockFunctionality(t *testing.T) { + + // Test submarine swap lock functionality + t.Run("SubmarineSwapLock", func(t *testing.T) { + l := &LoopProvider{} + + // Test acquiring lock for the first time + err := l.acquireSubmarineSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring submarine swap lock for the first time, got: %v", err) + } + + // Test that lock is active - should fail to acquire again + err = l.acquireSubmarineSwapLock() + if err == nil { + t.Error("Expected error when trying to acquire submarine swap lock while already locked") + } + + // Verify the error message contains rate limit info + if err != nil && !contains(err.Error(), "submarine swap is locked") { + t.Errorf("Expected rate limit error message, got: %v", err) + } + + // Note: In production, lock only expires via timeout, no manual release for anti-spam + }) + + // Test reverse swap lock functionality + t.Run("ReverseSwapLock", func(t *testing.T) { + l := &LoopProvider{} + + // Test acquiring lock for the first time + err := l.acquireReverseSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring reverse swap lock for the first time, got: %v", err) + } + + // Test that lock is active - should fail to acquire again + err = l.acquireReverseSwapLock() + if err == nil { + t.Error("Expected error when trying to acquire reverse swap lock while already locked") + } + + // Verify the error message contains rate limit info + if err != nil && !contains(err.Error(), "reverse submarine swap is locked") { + t.Errorf("Expected rate limit error message, got: %v", err) + } + + // Note: In production, lock only expires via timeout, no manual release for anti-spam + }) + + // Test that submarine and reverse swap locks are independent + t.Run("IndependentLocks", func(t *testing.T) { + l := &LoopProvider{} + + // Acquire submarine swap lock + err := l.acquireSubmarineSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring submarine swap lock, got: %v", err) + } + + // Should still be able to acquire reverse swap lock + err = l.acquireReverseSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring reverse swap lock while submarine swap is locked, got: %v", err) + } + + // Note: In production, locks only expire via timeout, no manual release for anti-spam + }) +} + +// TestLoopProvider_LockTimeout tests the automatic timeout functionality +func TestLoopProvider_LockTimeout(t *testing.T) { + // Set a very short timeout for this test + originalTimeout := viper.GetDuration("swapLockTimeout") + viper.Set("swapLockTimeout", "100ms") + defer viper.Set("swapLockTimeout", originalTimeout) + + t.Run("SubmarineSwapLockTimeout", func(t *testing.T) { + l := &LoopProvider{} + + // Acquire lock + err := l.acquireSubmarineSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring submarine swap lock, got: %v", err) + } + + // Immediately try to acquire again - should fail + err = l.acquireSubmarineSwapLock() + if err == nil { + t.Error("Expected error when trying to acquire submarine swap lock while already locked") + } + + // Wait for timeout + time.Sleep(150 * time.Millisecond) + + // Should be able to acquire again after timeout + err = l.acquireSubmarineSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring submarine swap lock after timeout, got: %v", err) + } + + // Note: In production, locks only expire via timeout, no manual cleanup needed + }) + + t.Run("ReverseSwapLockTimeout", func(t *testing.T) { + l := &LoopProvider{} + + // Acquire lock + err := l.acquireReverseSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring reverse swap lock, got: %v", err) + } + + // Immediately try to acquire again - should fail + err = l.acquireReverseSwapLock() + if err == nil { + t.Error("Expected error when trying to acquire reverse swap lock while already locked") + } + + // Wait for timeout + time.Sleep(150 * time.Millisecond) + + // Should be able to acquire again after timeout + err = l.acquireReverseSwapLock() + if err != nil { + t.Errorf("Expected no error when acquiring reverse swap lock after timeout, got: %v", err) + } + + // Note: In production, locks only expire via timeout, no manual cleanup needed + }) +} + +// TestLoopProvider_ConcurrentLockAccess tests thread safety of the lock mechanism +func TestLoopProvider_ConcurrentLockAccess(t *testing.T) { + l := &LoopProvider{} + + t.Run("ConcurrentSubmarineSwapLock", func(t *testing.T) { + successCount := 0 + errorCount := 0 + var mu sync.Mutex + var wg sync.WaitGroup + + // Try to acquire the lock from multiple goroutines + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + err := l.acquireSubmarineSwapLock() + mu.Lock() + if err == nil { + successCount++ + } else { + errorCount++ + } + mu.Unlock() + }() + } + + wg.Wait() + + // Only one should succeed, the rest should fail + if successCount != 1 { + t.Errorf("Expected exactly 1 successful lock acquisition, got: %d", successCount) + } + if errorCount != 9 { + t.Errorf("Expected exactly 9 failed lock acquisitions, got: %d", errorCount) + } + + // Note: In production, locks only expire via timeout, no manual cleanup needed + }) +} + +// Helper function to check if a string contains a substring +func contains(s, substr string) bool { + return strings.Contains(s, substr) +} diff --git a/rpc/nodeguard.proto b/rpc/nodeguard.proto index e3b6de4..43b6954 100644 --- a/rpc/nodeguard.proto +++ b/rpc/nodeguard.proto @@ -9,20 +9,17 @@ service NodeGuardService { Returns the liquidity rules associated to a node and its channels */ - rpc GetLiquidityRules(GetLiquidityRulesRequest) - returns (GetLiquidityRulesResponse); + rpc GetLiquidityRules(GetLiquidityRulesRequest) returns (GetLiquidityRulesResponse); /* Returns a new unused BTC Address of a given wallet */ - rpc GetNewWalletAddress(GetNewWalletAddressRequest) - returns (GetNewWalletAddressResponse); + rpc GetNewWalletAddress(GetNewWalletAddressRequest) returns (GetNewWalletAddressResponse); /* Withdraws funds from a given wallet to a given address */ - rpc RequestWithdrawal(RequestWithdrawalRequest) - returns (RequestWithdrawalResponse); + rpc RequestWithdrawal(RequestWithdrawalRequest) returns (RequestWithdrawalResponse); /* Adds a new node to the nodeguard */ @@ -36,8 +33,13 @@ service NodeGuardService { /* Gets a list of available wallets */ - rpc GetAvailableWallets(GetAvailableWalletsRequest) - returns (GetAvailableWalletsResponse); + rpc GetAvailableWallets(GetAvailableWalletsRequest) returns (GetAvailableWalletsResponse); + + /* + Get balance from a specific wallet + */ + rpc GetWalletBalance(GetWalletBalanceRequest) returns (GetWalletBalanceResponse); + /* Opens a channel to a given node */ @@ -51,34 +53,47 @@ service NodeGuardService { /* Gets a list of channel operations requests by id */ - rpc GetChannelOperationRequest(GetChannelOperationRequestRequest) - returns (GetChannelOperationRequestResponse); + rpc GetChannelOperationRequest(GetChannelOperationRequestRequest) returns (GetChannelOperationRequestResponse); /* Adds a liquidity rule to a channel */ - rpc AddLiquidityRule(AddLiquidityRuleRequest) - returns (AddLiquidityRuleResponse); + rpc AddLiquidityRule(AddLiquidityRuleRequest) returns (AddLiquidityRuleResponse); /* - Gets a list of available UTXOs for a wallet + Gets a list of available UTXOs for a single wallet */ - rpc GetAvailableUtxos(GetAvailableUtxosRequest) - returns (GetAvailableUtxosResponse); + rpc GetAvailableUtxos(GetAvailableUtxosRequest) returns (GetUtxosResponse); + + /* + Gets a list of all UTXOs from all available wallets + */ + rpc GetUtxos(GetUtxosRequest) returns (GetUtxosResponse); /* Gets the status for the provided withdrawals request ids */ - rpc GetWithdrawalsRequestStatus(GetWithdrawalsRequestStatusRequest) - returns (GetWithdrawalsRequestStatusResponse); + rpc GetWithdrawalsRequestStatus(GetWithdrawalsRequestStatusRequest) returns (GetWithdrawalsRequestStatusResponse); + + /* + Gets the status for the provided withdrawals request reference ids + */ + rpc GetWithdrawalsRequestStatusByReferenceIds(GetWithdrawalsRequestStatusByReferenceIdsRequest) returns (GetWithdrawalsRequestStatusResponse); /* Gets a channel by id */ rpc GetChannel(GetChannelRequest) returns (GetChannelResponse); + + /* + Adds tags to UTXOs under the treasury + */ + rpc AddTags(AddTagsRequest) returns (AddTagsResponse); } -message GetLiquidityRulesRequest { string node_pubkey = 1; } +message GetLiquidityRulesRequest { + string node_pubkey = 1; +} message GetLiquidityRulesResponse { repeated LiquidityRule liquidity_rules = 1; @@ -99,15 +114,27 @@ message LiquidityRule { string remote_node_pubkey = 10; } -message GetNewWalletAddressRequest { int32 wallet_id = 1; } +message GetNewWalletAddressRequest { + int32 wallet_id = 1; + bool reserve = 2; // If set to true, the returned address will be marked as used +} -message GetNewWalletAddressResponse { string address = 1; } +message GetNewWalletAddressResponse { + string address = 1; +} + +message Destination { + // BTC address to send the funds to + string address = 1; + // Amount in satoshis + int64 amount_sats = 2; +} message RequestWithdrawalRequest { int32 wallet_id = 1; - string address = 2; + string address = 2 [deprecated = true]; // Amount in satoshis - int64 amount = 3; + int64 amount = 3 [deprecated = true]; string description = 4; // in JSON format string request_metadata = 5; @@ -119,6 +146,10 @@ message RequestWithdrawalRequest { FEES_TYPE mempool_fee_rate = 8; // Fee rate in sat/vbyte optional int32 custom_fee_rate = 9; + // External reference id for the withdrawal request + optional string reference_id = 10; + // Destinations for the withdrawal + repeated Destination destinations = 11; } message RequestWithdrawalResponse { @@ -139,17 +170,32 @@ message GetAvailableWalletsRequest { optional WALLET_TYPE wallet_type = 2; } -message AccountKeySettings { string xpub = 1; } -message Wallet { +message AccountKeySettings { + string xpub = 1; +} +message Wallet { int32 id = 1; string name = 2; bool is_hot_wallet = 3; repeated AccountKeySettings account_key_settings = 4; int32 threshold = 5; } -message GetAvailableWalletsResponse { repeated Wallet wallets = 1; } +message GetAvailableWalletsResponse { + repeated Wallet wallets = 1; +} -message AddNodeRequest { +message GetWalletBalanceRequest { + int32 wallet_id = 1; +} + +message GetWalletBalanceResponse { + // Confirmed balance in satoshis + int64 confirmed_balance = 1; + // Unconfirmed balance in satoshis + int64 unconfirmed_balance = 2; +} + +message AddNodeRequest{ string pub_key = 1; string name = 2; string description = 3; @@ -157,14 +203,14 @@ message AddNodeRequest { string channel_admin_macaroon = 4; // Endpoint of the node in the form of host:port (gRPC) string endpoint = 5; - // Whether this node's hot wallet should be autoswept to the returning funds - // wallet - bool autosweep_enabled = 6; + // Whether this node's hot wallet should be autoswept to the returning funds wallet + bool autosweep_enabled = 6; // Wallet ID as stored in the NG's database for use in autosweep ops int32 returning_funds_wallet_id = 7; } -message AddNodeResponse {} +message AddNodeResponse{ +} message Node { // Node Id as in NodeGuard's database @@ -174,19 +220,21 @@ message Node { string description = 4; // Endpoint of the node in the form of host:port (gRPC) string endpoint = 5; - // Whether this node's hot wallet should be autoswept to the returning funds - // wallet + // Whether this node's hot wallet should be autoswept to the returning funds wallet bool autosweep_enabled = 6; // Wallet ID as stored in the NG's database for use in autosweep ops int32 returning_funds_wallet_id = 7; + } -message GetNodesRequest { +message GetNodesRequest{ // Whether to include nodes that are not managed by the NG bool include_unmanaged = 1; } -message GetNodesResponse { repeated Node nodes = 1; } +message GetNodesResponse{ + repeated Node nodes = 1; +} enum FEES_TYPE { ECONOMY_FEE = 0; @@ -217,9 +265,10 @@ message OpenChannelRequest { optional int32 custom_fee_rate = 9; } -// A successful response returns the channel_operation_request_id but it does -// NOT indicate that the channel has been open, external monitoring is required -message OpenChannelResponse { int32 channel_operation_request_id = 1; } +// A successful response returns the channel_operation_request_id but it does NOT indicate that the channel has been open, external monitoring is required +message OpenChannelResponse { + int32 channel_operation_request_id = 1; +} message CloseChannelRequest { // Channel ID as returned by the Lightning implementation @@ -228,9 +277,9 @@ message CloseChannelRequest { bool force = 2; } -// A successful response is an empty message and does NOT indicate that the -// channel has been closed, external monitoring is required -message CloseChannelResponse {} +// A successful response is an empty message and does NOT indicate that the channel has been closed, external monitoring is required +message CloseChannelResponse { +} message GetChannelOperationRequestRequest { // Whether to include requests that are not managed by the NG @@ -294,11 +343,15 @@ message AddLiquidityRuleResponse { int32 rule_id = 1; } -enum COIN_SELECTION_STRATEGY { - SMALLEST_FIRST = 0; - BIGGEST_FIRST = 1; - CLOSEST_TO_TARGET_FIRST = 2; - UP_TO_AMOUNT = 3; +enum COIN_SELECTION_STRATEGY +{ + SMALLEST_FIRST = 0; + BIGGEST_FIRST = 1; + CLOSEST_TO_TARGET_FIRST = 2; + UP_TO_AMOUNT = 3; +} + +message GetUtxosRequest { } message GetAvailableUtxosRequest { @@ -310,42 +363,52 @@ message GetAvailableUtxosRequest { optional int32 limit = 3; // Amount in satoshis optional int64 amount = 4; - // Order the UTXOs by closest to the amount specified if the strategy selected - // is CLOSEST_TO_TARGET_FIRST + // Order the UTXOs by closest to the amount specified if the strategy selected is CLOSEST_TO_TARGET_FIRST optional int64 closestTo = 5; } message Utxo { int64 amount = 1; string outpoint = 2; + string address = 3; } -message GetAvailableUtxosResponse { +message GetUtxosResponse { repeated Utxo confirmed = 1; repeated Utxo unconfirmed = 2; } enum WITHDRAWAL_REQUEST_STATUS { - WITHDRAWAL_SETTLED = 0; - WITHDRAWAL_PENDING_APPROVAL = 1; - WITHDRAWAL_CANCELLED = 2; - WITHDRAWAL_REJECTED = 3; - WITHDRAWAL_PENDING_CONFIRMATION = 4; - WITHDRAWAL_FAILED = 5; + WITHDRAWAL_SETTLED = 0; + WITHDRAWAL_PENDING_APPROVAL = 1; + WITHDRAWAL_CANCELLED = 2; + WITHDRAWAL_REJECTED = 3; + WITHDRAWAL_PENDING_CONFIRMATION = 4; + WITHDRAWAL_FAILED = 5; + WITHDRAWAL_BUMPED = 6; } -message GetWithdrawalsRequestStatusRequest { repeated int32 request_ids = 1; } +message GetWithdrawalsRequestStatusRequest { + repeated int32 request_ids = 1; +} message WithdrawalRequest { int32 request_id = 1; WITHDRAWAL_REQUEST_STATUS status = 2; optional string reject_or_cancel_reason = 3; + optional string reference_id = 4; + uint64 confirmations = 5; + optional string tx_id = 6; } message GetWithdrawalsRequestStatusResponse { repeated WithdrawalRequest withdrawal_requests = 1; } +message GetWithdrawalsRequestStatusByReferenceIdsRequest { + repeated string reference_ids = 1; +} + message GetChannelRequest { // Channel ID from NGs database int32 channel_id = 1; @@ -367,3 +430,16 @@ message GetChannelResponse { bool is_automated_liquidity_enabled = 8; bool is_private = 9; } + +message Tag { + string key = 1; + string value = 2; + string utxo_outpoint = 3; // Format txid-outputIndex +} + +message AddTagsRequest { + repeated Tag tags = 1; +} + +message AddTagsResponse { +} \ No newline at end of file