lnrpc 0.5.2 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/README.md +40 -17
- data/examples.rb +4 -0
- data/lib/lnrpc/client.rb +16 -9
- data/lib/lnrpc/rpc.proto +423 -31
- data/lib/lnrpc/rpc_pb.rb +145 -9
- data/lib/lnrpc/rpc_services_pb.rb +73 -5
- data/lib/lnrpc/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bfe878e75df63ffd268631872089510d05b50af1a8979c1ccfa2fd54f9dbb78
|
4
|
+
data.tar.gz: e391ec669a7bf1a4c8cba736b82c3bed14857e1c625693ed030cf122e2ba991d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86cc73ea507f2a0bddd3c07568e8ff8cc73241b65e6398194973562e1536fa2425b3a1ccd5cd4d557c88af1d35129e288c231800f2dbbf9ed9a1dacf42b0bfe7
|
7
|
+
data.tar.gz: e382d37d143abbaac9e9b7d1d67634c224ce867c70949b76f408a53682521663d264c231fa06a0747727ebced9f381f4a716b5a51e132b431cd679b1437afdc3
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
lnrpc (0.5.2
|
4
|
+
lnrpc (0.5.2)
|
5
5
|
google-protobuf (>= 3.7)
|
6
6
|
grpc (>= 1.19.0)
|
7
7
|
|
@@ -9,10 +9,10 @@ GEM
|
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
11
|
diff-lcs (1.3)
|
12
|
-
google-protobuf (3.7.0)
|
12
|
+
google-protobuf (3.7.0-x86_64-linux)
|
13
13
|
googleapis-common-protos-types (1.0.3)
|
14
14
|
google-protobuf (~> 3.0)
|
15
|
-
grpc (1.19.0)
|
15
|
+
grpc (1.19.0-x86_64-linux)
|
16
16
|
google-protobuf (~> 3.1)
|
17
17
|
googleapis-common-protos-types (~> 1.0.0)
|
18
18
|
rake (10.5.0)
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ This gem makes the gRPC client classes created from the [LND service defintions]
|
|
30
30
|
```ruby
|
31
31
|
require "lnrpc"
|
32
32
|
|
33
|
-
# the gRPC client is available under the Lnrpc namespace, e.g.
|
33
|
+
# the gRPC client is available under the Lnrpc namespace, e.g.
|
34
34
|
|
35
35
|
Lnrpc::Lightning::Stub
|
36
36
|
Lnrpc::GetInfoRequest
|
@@ -45,7 +45,7 @@ The LND API reference can be found here: [https://api.lightning.community/](http
|
|
45
45
|
```ruby
|
46
46
|
require "lnrpc"
|
47
47
|
|
48
|
-
credentials = File.read("/path/to/tls.cert")
|
48
|
+
credentials = File.read("/path/to/tls.cert")
|
49
49
|
macaroon = File.read("/path/to/readonly.macaroon").unpack("H*")
|
50
50
|
|
51
51
|
# initialize a new client
|
@@ -54,12 +54,12 @@ client = Lnrpc::Lightning::Stub.new("localhost:10009", GRPC::Core::ChannelCreden
|
|
54
54
|
# perform a request
|
55
55
|
request = Lnrpc::GetInfoRequest.new
|
56
56
|
response = client.get_info(request, { metadata: { macaroon: macaroon } }) #=> Lnrpc::GetInfoResponse
|
57
|
-
puts response.alias
|
57
|
+
puts response.alias
|
58
58
|
```
|
59
59
|
|
60
60
|
### Client wrapper
|
61
61
|
|
62
|
-
An optional client wrapper ([Lnrpc::Client](https://github.com/bumi/lnrpc/blob/master/lib/lnrpc/client.rb
|
62
|
+
An optional client wrapper ([Lnrpc::Client](https://github.com/bumi/lnrpc/blob/master/lib/lnrpc/client.rb)) makes
|
63
63
|
initializing the gRPC client easier and removes the need for some boilerplate code for calling RPC methods.
|
64
64
|
|
65
65
|
#### Example
|
@@ -72,23 +72,25 @@ Also have a look at [examples.rb](https://github.com/bumi/lnrpc/blob/master/exam
|
|
72
72
|
|
73
73
|
#### Initializing a new client
|
74
74
|
|
75
|
-
The Lnrpc::Client constructor allows the following options:
|
75
|
+
The Lnrpc::Client constructor allows the following options:
|
76
76
|
|
77
|
-
* credentials:
|
78
|
-
- `credentials` : the credentials data as string
|
79
|
-
- `credentials_path` : the path to a credentials file (tls.cert) as string
|
80
|
-
* macaroon:
|
77
|
+
* credentials:
|
78
|
+
- `credentials` : the credentials data as string (pass nil if a "trusted" cert (e.g. from letsencrypt is used)
|
79
|
+
- `credentials_path` : the path to a credentials file (tls.cert) as string (default: `"#{LND_HOME_DIR}/tls.cert"` )
|
80
|
+
* macaroon:
|
81
81
|
- `macaroon` : the macaroon as hex string
|
82
|
-
- `macaroon_path` : the path to the macaroon file created by lnd as string
|
82
|
+
- `macaroon_path` : the path to the macaroon file created by lnd as string (default: `"#{LND_HOME_DIR}/data/chain/bitcoin/mainnet/admin.macaroon"`)
|
83
83
|
* address:
|
84
|
-
- `address` : lnd address as string. format: address:port, e.g.
|
84
|
+
- `address` : lnd address as string. format: address:port, e.g. localhost:10009 (default)
|
85
85
|
|
86
|
+
If no credentials or no macaroon is provided default files are assumed in `ENV['LND_HOME'] || "~/.lnd"`.
|
87
|
+
A macaroon is required.
|
86
88
|
|
87
89
|
```ruby
|
88
90
|
require 'lnrpc'
|
89
91
|
|
90
92
|
lnd = Lnrpc::Client.new({
|
91
|
-
credentials_path: '/path/to.cert.cls',
|
93
|
+
credentials_path: '/path/to.cert.cls',
|
92
94
|
macaroon_path: '/path/to/admin.macaroon',
|
93
95
|
address: 'host:port'
|
94
96
|
})
|
@@ -101,33 +103,54 @@ lnd.grpc_client
|
|
101
103
|
|
102
104
|
The client wrapper passes any supported RPC method call to the gRPC client applying the following conventions:
|
103
105
|
|
104
|
-
If the first parameter is a hash or blank the corresponding gRPC request object will be instantiated.
|
106
|
+
If the first parameter is a hash or blank the corresponding gRPC request object will be instantiated.
|
105
107
|
|
106
108
|
Example:
|
107
109
|
|
108
110
|
```ruby
|
109
111
|
client.get_info
|
110
|
-
# is the same as:
|
112
|
+
# is the same as:
|
111
113
|
client.grpc_client.get_info(Lnrpc::GetInfoRequest.new)
|
112
114
|
|
113
115
|
client.list_channels(inactive_only: true)
|
114
|
-
# is the same as:
|
116
|
+
# is the same as:
|
115
117
|
request = Lnrpc::ListChannelsRequest.new(inactive_only: true)
|
116
118
|
client.grpc_client.list_channels(request)
|
117
119
|
|
118
120
|
client.wallet_balance.total_balance
|
119
|
-
# is the same as:
|
121
|
+
# is the same as:
|
120
122
|
request = Lnrpc::WalletBalanceRequest.new()
|
121
123
|
client.grpc_client.wallet_balance(request).total_balance
|
122
124
|
```
|
123
125
|
|
126
|
+
## Using with BTC Pay Server
|
127
|
+
If you have a running BTC Pay Server with LND support, integrating with lnrpc is easy.
|
128
|
+
|
129
|
+
- Navigate to the domain associated with your BTC Pay Server
|
130
|
+
- Navigate to Services on the Server Settings page
|
131
|
+
- Click "see information" for your gRPC Server
|
132
|
+
- The link by "More details..." will expose the address and various macaroon hex strings
|
133
|
+
- Initialize your client with the options detailed above. BTC Pay Server utilizes LetsEncrypt for trusted TLC Certificates so set that option to nil.
|
134
|
+
|
135
|
+
Don't have a BTC Pay Server? [Setting one up is easy.](https://medium.com/@BtcpayServer/launch-btcpay-server-via-web-interface-and-deploy-full-bitcoin-node-lnd-in-less-than-a-minute-dc8bc6f06a3)
|
136
|
+
|
124
137
|
|
125
138
|
## Versioning
|
126
139
|
|
127
|
-
This gem follows the LND versions and will update the gRPC service definitions accordingly.
|
140
|
+
This gem follows the LND versions and will update the gRPC service definitions accordingly.
|
128
141
|
e.g. gem version 0.5.2 includes the gRPC service definitions from LND v0.5.2
|
129
142
|
|
130
143
|
|
144
|
+
### Update service definitions
|
145
|
+
|
146
|
+
1. Generate `prc_pb.rb` and `rpc_services_pb.rb`
|
147
|
+
|
148
|
+
$ grpc_tools_ruby_protoc -I/usr/local/include -I. -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --ruby_out=plugins=grpc,paths=source_relative:. --grpc_out=. rpc.proto
|
149
|
+
|
150
|
+
2. Copy `rpc.proto`, `rpc_pb.rb` and `rpc_services_pb.rb` to `lib`
|
151
|
+
|
152
|
+
3. Update `rpc_services_pb.rb` to use `require_relative` to load `rpc_pb`
|
153
|
+
|
131
154
|
## Other resources
|
132
155
|
|
133
156
|
* [LND gRPC API Reference](https://api.lightning.community)
|
data/examples.rb
CHANGED
data/lib/lnrpc/client.rb
CHANGED
@@ -2,7 +2,8 @@ require "grpc"
|
|
2
2
|
require "lnrpc/macaroon_interceptor"
|
3
3
|
module Lnrpc
|
4
4
|
class Client
|
5
|
-
attr_accessor :address, :credentials, :macaroon
|
5
|
+
attr_accessor :address, :credentials, :macaroon
|
6
|
+
attr_writer :grpc_client
|
6
7
|
|
7
8
|
LND_HOME_DIR = ENV['LND_HOME'] || "~/.lnd"
|
8
9
|
DEFAULT_ADDRESS = 'localhost:10009'
|
@@ -31,19 +32,25 @@ module Lnrpc
|
|
31
32
|
def initialize(options={})
|
32
33
|
self.address = options[:address] || DEFAULT_ADDRESS
|
33
34
|
|
34
|
-
options
|
35
|
-
|
35
|
+
if options.has_key?(:credentials)
|
36
|
+
self.credentials = options[:credentials]
|
37
|
+
elsif File.exists?(::File.expand_path(options[:credentials_path] || DEFAULT_CREDENTIALS_PATH))
|
38
|
+
self.credentials = ::File.read(::File.expand_path(options[:credentials_path] || DEFAULT_CREDENTIALS_PATH))
|
39
|
+
else
|
40
|
+
self.credentials = nil
|
41
|
+
end
|
36
42
|
|
37
|
-
options[:
|
38
|
-
|
39
|
-
macaroon_binary.unpack("H*")
|
43
|
+
if !options.has_key?(:macaroon) && File.exists?(::File.expand_path(options[:macaroon_path] || DEFAULT_MACAROON_PATH))
|
44
|
+
options[:macaroon] = ::File.read(::File.expand_path(options[:macaroon_path] || DEFAULT_MACAROON_PATH)).unpack("H*")
|
40
45
|
end
|
41
46
|
self.macaroon = options[:macaroon]
|
47
|
+
end
|
42
48
|
|
43
|
-
|
49
|
+
def grpc_client
|
50
|
+
@grpc_client ||= Lnrpc::Lightning::Stub.new(self.address,
|
44
51
|
GRPC::Core::ChannelCredentials.new(self.credentials),
|
45
52
|
interceptors: [Lnrpc::MacaroonInterceptor.new(self.macaroon)]
|
46
|
-
|
53
|
+
)
|
47
54
|
end
|
48
55
|
|
49
56
|
def pay(payreq)
|
@@ -55,7 +62,7 @@ module Lnrpc
|
|
55
62
|
params = args[0]
|
56
63
|
|
57
64
|
args[0] = params.nil? ? request_class_for(m).new : request_class_for(m).new(params)
|
58
|
-
self.grpc_client.send(m, *args)
|
65
|
+
self.grpc_client.send(m, *args, &block)
|
59
66
|
else
|
60
67
|
super
|
61
68
|
end
|
data/lib/lnrpc/rpc.proto
CHANGED
@@ -3,6 +3,9 @@ syntax = "proto3";
|
|
3
3
|
import "google/api/annotations.proto";
|
4
4
|
|
5
5
|
package lnrpc;
|
6
|
+
|
7
|
+
option go_package = "github.com/lightningnetwork/lnd/lnrpc";
|
8
|
+
|
6
9
|
/**
|
7
10
|
* Comments in this file will be directly parsed into the API
|
8
11
|
* Documentation as descriptions of the associated method, message, or field.
|
@@ -142,11 +145,21 @@ message InitWalletRequest {
|
|
142
145
|
/**
|
143
146
|
recovery_window is an optional argument specifying the address lookahead
|
144
147
|
when restoring a wallet seed. The recovery window applies to each
|
145
|
-
|
148
|
+
individual branch of the BIP44 derivation paths. Supplying a recovery
|
146
149
|
window of zero indicates that no addresses should be recovered, such after
|
147
150
|
the first initialization of the wallet.
|
148
151
|
*/
|
149
152
|
int32 recovery_window = 4;
|
153
|
+
|
154
|
+
/**
|
155
|
+
channel_backups is an optional argument that allows clients to recover the
|
156
|
+
settled funds within a set of channels. This should be populated if the
|
157
|
+
user was unable to close out all channels and sweep funds before partial or
|
158
|
+
total data loss occurred. If specified, then after on-chain recovery of
|
159
|
+
funds, lnd begin to carry out the data loss recovery protocol in order to
|
160
|
+
recover the funds in each channel from a remote force closed transaction.
|
161
|
+
*/
|
162
|
+
ChanBackupSnapshot channel_backups = 5;
|
150
163
|
}
|
151
164
|
message InitWalletResponse {
|
152
165
|
}
|
@@ -167,6 +180,16 @@ message UnlockWalletRequest {
|
|
167
180
|
the first initialization of the wallet.
|
168
181
|
*/
|
169
182
|
int32 recovery_window = 2;
|
183
|
+
|
184
|
+
/**
|
185
|
+
channel_backups is an optional argument that allows clients to recover the
|
186
|
+
settled funds within a set of channels. This should be populated if the
|
187
|
+
user was unable to close out all channels and sweep funds before partial or
|
188
|
+
total data loss occurred. If specified, then after on-chain recovery of
|
189
|
+
funds, lnd begin to carry out the data loss recovery protocol in order to
|
190
|
+
recover the funds in each channel from a remote force closed transaction.
|
191
|
+
*/
|
192
|
+
ChanBackupSnapshot channel_backups = 3;
|
170
193
|
}
|
171
194
|
message UnlockWalletResponse {}
|
172
195
|
|
@@ -217,6 +240,16 @@ service Lightning {
|
|
217
240
|
};
|
218
241
|
}
|
219
242
|
|
243
|
+
/** lncli: `estimatefee`
|
244
|
+
EstimateFee asks the chain backend to estimate the fee rate and total fees
|
245
|
+
for a transaction that pays to multiple specified outputs.
|
246
|
+
*/
|
247
|
+
rpc EstimateFee (EstimateFeeRequest) returns (EstimateFeeResponse) {
|
248
|
+
option (google.api.http) = {
|
249
|
+
get: "/v1/transactions/fee"
|
250
|
+
};
|
251
|
+
}
|
252
|
+
|
220
253
|
/** lncli: `sendcoins`
|
221
254
|
SendCoins executes a request to send coins to a particular address. Unlike
|
222
255
|
SendMany, this RPC call only allows creating a single output at a time. If
|
@@ -231,6 +264,16 @@ service Lightning {
|
|
231
264
|
};
|
232
265
|
}
|
233
266
|
|
267
|
+
/** lncli: `listunspent`
|
268
|
+
ListUnspent returns a list of all utxos spendable by the wallet with a
|
269
|
+
number of confirmations between the specified minimum and maximum.
|
270
|
+
*/
|
271
|
+
rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse) {
|
272
|
+
option (google.api.http) = {
|
273
|
+
get: "/v1/utxos"
|
274
|
+
};
|
275
|
+
}
|
276
|
+
|
234
277
|
/**
|
235
278
|
SubscribeTransactions creates a uni-directional stream from the server to
|
236
279
|
the client in which any newly discovered transactions relevant to the
|
@@ -260,7 +303,12 @@ service Lightning {
|
|
260
303
|
signature string is `zbase32` encoded and pubkey recoverable, meaning that
|
261
304
|
only the message digest and signature are needed for verification.
|
262
305
|
*/
|
263
|
-
rpc SignMessage (SignMessageRequest) returns (SignMessageResponse)
|
306
|
+
rpc SignMessage (SignMessageRequest) returns (SignMessageResponse) {
|
307
|
+
option (google.api.http) = {
|
308
|
+
post: "/v1/signmessage"
|
309
|
+
body: "*"
|
310
|
+
};
|
311
|
+
}
|
264
312
|
|
265
313
|
/** lncli: `verifymessage`
|
266
314
|
VerifyMessage verifies a signature over a msg. The signature must be
|
@@ -268,7 +316,12 @@ service Lightning {
|
|
268
316
|
channel database. In addition to returning the validity of the signature,
|
269
317
|
VerifyMessage also returns the recovered pubkey from the signature.
|
270
318
|
*/
|
271
|
-
rpc VerifyMessage (VerifyMessageRequest) returns (VerifyMessageResponse)
|
319
|
+
rpc VerifyMessage (VerifyMessageRequest) returns (VerifyMessageResponse) {
|
320
|
+
option (google.api.http) = {
|
321
|
+
post: "/v1/verifymessage"
|
322
|
+
body: "*"
|
323
|
+
};
|
324
|
+
}
|
272
325
|
|
273
326
|
/** lncli: `connect`
|
274
327
|
ConnectPeer attempts to establish a connection to a remote peer. This is at
|
@@ -336,6 +389,14 @@ service Lightning {
|
|
336
389
|
};
|
337
390
|
}
|
338
391
|
|
392
|
+
/** lncli: `subscribechannelevents`
|
393
|
+
SubscribeChannelEvents creates a uni-directional stream from the server to
|
394
|
+
the client in which any updates relevant to the state of the channels are
|
395
|
+
sent over. Events include new active channels, inactive channels, and closed
|
396
|
+
channels.
|
397
|
+
*/
|
398
|
+
rpc SubscribeChannelEvents (ChannelEventSubscription) returns (stream ChannelEventUpdate);
|
399
|
+
|
339
400
|
/** lncli: `closedchannels`
|
340
401
|
ClosedChannels returns a description of all the closed channels that
|
341
402
|
this node was a participant in.
|
@@ -455,10 +516,8 @@ service Lightning {
|
|
455
516
|
paginated responses, allowing users to query for specific invoices through
|
456
517
|
their add_index. This can be done by using either the first_index_offset or
|
457
518
|
last_index_offset fields included in the response as the index_offset of the
|
458
|
-
next request.
|
459
|
-
|
460
|
-
flag to false. If none of the parameters are specified, then the last 100
|
461
|
-
invoices will be returned.
|
519
|
+
next request. By default, the first 100 invoices created will be returned.
|
520
|
+
Backwards pagination is also supported through the Reversed flag.
|
462
521
|
*/
|
463
522
|
rpc ListInvoices (ListInvoiceRequest) returns (ListInvoiceResponse) {
|
464
523
|
option (google.api.http) = {
|
@@ -629,7 +688,7 @@ service Lightning {
|
|
629
688
|
|
630
689
|
/** lncli: `fwdinghistory`
|
631
690
|
ForwardingHistory allows the caller to query the htlcswitch for a record of
|
632
|
-
all
|
691
|
+
all HTLCs forwarded within the target time range, and integer offset
|
633
692
|
within that time range. If no time-range is specified, then the first chunk
|
634
693
|
of the past 24 hrs of forwarding history are returned.
|
635
694
|
|
@@ -645,6 +704,90 @@ service Lightning {
|
|
645
704
|
body: "*"
|
646
705
|
};
|
647
706
|
};
|
707
|
+
|
708
|
+
/** lncli: `exportchanbackup`
|
709
|
+
ExportChannelBackup attempts to return an encrypted static channel backup
|
710
|
+
for the target channel identified by it channel point. The backup is
|
711
|
+
encrypted with a key generated from the aezeed seed of the user. The
|
712
|
+
returned backup can either be restored using the RestoreChannelBackup
|
713
|
+
method once lnd is running, or via the InitWallet and UnlockWallet methods
|
714
|
+
from the WalletUnlocker service.
|
715
|
+
*/
|
716
|
+
rpc ExportChannelBackup(ExportChannelBackupRequest) returns (ChannelBackup) {
|
717
|
+
option (google.api.http) = {
|
718
|
+
get: "/v1/channels/backup/{chan_point.funding_txid_str}/{chan_point.output_index}"
|
719
|
+
};
|
720
|
+
};
|
721
|
+
|
722
|
+
/**
|
723
|
+
ExportAllChannelBackups returns static channel backups for all existing
|
724
|
+
channels known to lnd. A set of regular singular static channel backups for
|
725
|
+
each channel are returned. Additionally, a multi-channel backup is returned
|
726
|
+
as well, which contains a single encrypted blob containing the backups of
|
727
|
+
each channel.
|
728
|
+
*/
|
729
|
+
rpc ExportAllChannelBackups(ChanBackupExportRequest) returns (ChanBackupSnapshot) {
|
730
|
+
option (google.api.http) = {
|
731
|
+
get: "/v1/channels/backup"
|
732
|
+
};
|
733
|
+
};
|
734
|
+
|
735
|
+
/**
|
736
|
+
VerifyChanBackup allows a caller to verify the integrity of a channel backup
|
737
|
+
snapshot. This method will accept either a packed Single or a packed Multi.
|
738
|
+
Specifying both will result in an error.
|
739
|
+
*/
|
740
|
+
rpc VerifyChanBackup(ChanBackupSnapshot) returns (VerifyChanBackupResponse) {
|
741
|
+
option (google.api.http) = {
|
742
|
+
post: "/v1/channels/backup/verify"
|
743
|
+
body: "*"
|
744
|
+
};
|
745
|
+
};
|
746
|
+
|
747
|
+
/** lncli: `restorechanbackup`
|
748
|
+
RestoreChannelBackups accepts a set of singular channel backups, or a
|
749
|
+
single encrypted multi-chan backup and attempts to recover any funds
|
750
|
+
remaining within the channel. If we are able to unpack the backup, then the
|
751
|
+
new channel will be shown under listchannels, as well as pending channels.
|
752
|
+
*/
|
753
|
+
rpc RestoreChannelBackups(RestoreChanBackupRequest) returns (RestoreBackupResponse) {
|
754
|
+
option (google.api.http) = {
|
755
|
+
post: "/v1/channels/backup/restore"
|
756
|
+
body: "*"
|
757
|
+
};
|
758
|
+
};
|
759
|
+
|
760
|
+
/**
|
761
|
+
SubscribeChannelBackups allows a client to sub-subscribe to the most up to
|
762
|
+
date information concerning the state of all channel backups. Each time a
|
763
|
+
new channel is added, we return the new set of channels, along with a
|
764
|
+
multi-chan backup containing the backup info for all channels. Each time a
|
765
|
+
channel is closed, we send a new update, which contains new new chan back
|
766
|
+
ups, but the updated set of encrypted multi-chan backups with the closed
|
767
|
+
channel(s) removed.
|
768
|
+
*/
|
769
|
+
rpc SubscribeChannelBackups(ChannelBackupSubscription) returns (stream ChanBackupSnapshot) {
|
770
|
+
};
|
771
|
+
}
|
772
|
+
|
773
|
+
message Utxo {
|
774
|
+
/// The type of address
|
775
|
+
AddressType type = 1 [json_name = "address_type"];
|
776
|
+
|
777
|
+
/// The address
|
778
|
+
string address = 2 [json_name = "address"];
|
779
|
+
|
780
|
+
/// The value of the unspent coin in satoshis
|
781
|
+
int64 amount_sat = 3 [json_name = "amount_sat"];
|
782
|
+
|
783
|
+
/// The pkscript in hex
|
784
|
+
string pk_script = 4 [json_name = "pk_script"];
|
785
|
+
|
786
|
+
/// The outpoint in format txid:n
|
787
|
+
OutPoint outpoint = 5 [json_name = "outpoint"];
|
788
|
+
|
789
|
+
/// The number of confirmations for the Utxo
|
790
|
+
int64 confirmations = 6 [json_name = "confirmations"];
|
648
791
|
}
|
649
792
|
|
650
793
|
message Transaction {
|
@@ -725,11 +868,25 @@ message SendRequest {
|
|
725
868
|
send the payment.
|
726
869
|
*/
|
727
870
|
FeeLimit fee_limit = 8;
|
871
|
+
|
872
|
+
/**
|
873
|
+
The channel id of the channel that must be taken to the first hop. If zero,
|
874
|
+
any channel may be used.
|
875
|
+
*/
|
876
|
+
uint64 outgoing_chan_id = 9;
|
877
|
+
|
878
|
+
/**
|
879
|
+
An optional maximum total time lock for the route. If zero, there is no
|
880
|
+
maximum enforced.
|
881
|
+
*/
|
882
|
+
uint32 cltv_limit = 10;
|
728
883
|
}
|
884
|
+
|
729
885
|
message SendResponse {
|
730
886
|
string payment_error = 1 [json_name = "payment_error"];
|
731
887
|
bytes payment_preimage = 2 [json_name = "payment_preimage"];
|
732
888
|
Route payment_route = 3 [json_name = "payment_route"];
|
889
|
+
bytes payment_hash = 4 [json_name = "payment_hash"];
|
733
890
|
}
|
734
891
|
|
735
892
|
message SendToRouteRequest {
|
@@ -739,8 +896,16 @@ message SendToRouteRequest {
|
|
739
896
|
/// An optional hex-encoded payment hash to be used for the HTLC.
|
740
897
|
string payment_hash_string = 2;
|
741
898
|
|
742
|
-
|
743
|
-
|
899
|
+
/**
|
900
|
+
Deprecated. The set of routes that should be used to attempt to complete the
|
901
|
+
payment. The possibility to pass in multiple routes is deprecated and
|
902
|
+
instead the single route field below should be used in combination with the
|
903
|
+
streaming variant of SendToRoute.
|
904
|
+
*/
|
905
|
+
repeated Route routes = 3 [deprecated = true];
|
906
|
+
|
907
|
+
/// Route that should be used to attempt to complete the payment.
|
908
|
+
Route route = 4;
|
744
909
|
}
|
745
910
|
|
746
911
|
message ChannelPoint {
|
@@ -756,6 +921,17 @@ message ChannelPoint {
|
|
756
921
|
uint32 output_index = 3 [json_name = "output_index"];
|
757
922
|
}
|
758
923
|
|
924
|
+
message OutPoint {
|
925
|
+
/// Raw bytes representing the transaction id.
|
926
|
+
bytes txid_bytes = 1 [json_name = "txid_bytes"];
|
927
|
+
|
928
|
+
/// Reversed, hex-encoded string representing the transaction id.
|
929
|
+
string txid_str = 2 [json_name = "txid_str"];
|
930
|
+
|
931
|
+
/// The index of the output on the transaction.
|
932
|
+
uint32 output_index = 3 [json_name = "output_index"];
|
933
|
+
}
|
934
|
+
|
759
935
|
message LightningAddress {
|
760
936
|
/// The identity pubkey of the Lightning node
|
761
937
|
string pubkey = 1 [json_name = "pubkey"];
|
@@ -764,6 +940,22 @@ message LightningAddress {
|
|
764
940
|
string host = 2 [json_name = "host"];
|
765
941
|
}
|
766
942
|
|
943
|
+
message EstimateFeeRequest {
|
944
|
+
/// The map from addresses to amounts for the transaction.
|
945
|
+
map<string, int64> AddrToAmount = 1;
|
946
|
+
|
947
|
+
/// The target number of blocks that this transaction should be confirmed by.
|
948
|
+
int32 target_conf = 2;
|
949
|
+
}
|
950
|
+
|
951
|
+
message EstimateFeeResponse {
|
952
|
+
/// The total fee in satoshis.
|
953
|
+
int64 fee_sat = 1 [json_name = "fee_sat"];
|
954
|
+
|
955
|
+
/// The fee rate in satoshi/byte.
|
956
|
+
int64 feerate_sat_per_byte = 2 [json_name = "feerate_sat_per_byte"];
|
957
|
+
}
|
958
|
+
|
767
959
|
message SendManyRequest {
|
768
960
|
/// The map from addresses to amounts
|
769
961
|
map<string, int64> AddrToAmount = 1;
|
@@ -791,24 +983,45 @@ message SendCoinsRequest {
|
|
791
983
|
|
792
984
|
/// A manual fee rate set in sat/byte that should be used when crafting the transaction.
|
793
985
|
int64 sat_per_byte = 5;
|
986
|
+
|
987
|
+
/**
|
988
|
+
If set, then the amount field will be ignored, and lnd will attempt to
|
989
|
+
send all the coins under control of the internal wallet to the specified
|
990
|
+
address.
|
991
|
+
*/
|
992
|
+
bool send_all = 6;
|
794
993
|
}
|
795
994
|
message SendCoinsResponse {
|
796
995
|
/// The transaction ID of the transaction
|
797
996
|
string txid = 1 [json_name = "txid"];
|
798
997
|
}
|
799
998
|
|
999
|
+
message ListUnspentRequest {
|
1000
|
+
/// The minimum number of confirmations to be included.
|
1001
|
+
int32 min_confs = 1;
|
1002
|
+
|
1003
|
+
/// The maximum number of confirmations to be included.
|
1004
|
+
int32 max_confs = 2;
|
1005
|
+
}
|
1006
|
+
message ListUnspentResponse {
|
1007
|
+
/// A list of utxos
|
1008
|
+
repeated Utxo utxos = 1 [json_name = "utxos"];
|
1009
|
+
}
|
1010
|
+
|
800
1011
|
/**
|
801
1012
|
`AddressType` has to be one of:
|
802
1013
|
|
803
1014
|
- `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0)
|
804
1015
|
- `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1)
|
805
1016
|
*/
|
806
|
-
|
807
|
-
enum AddressType {
|
1017
|
+
enum AddressType {
|
808
1018
|
WITNESS_PUBKEY_HASH = 0;
|
809
1019
|
NESTED_PUBKEY_HASH = 1;
|
810
|
-
|
1020
|
+
UNUSED_WITNESS_PUBKEY_HASH = 2;
|
1021
|
+
UNUSED_NESTED_PUBKEY_HASH = 3;
|
1022
|
+
}
|
811
1023
|
|
1024
|
+
message NewAddressRequest {
|
812
1025
|
/// The address type
|
813
1026
|
AddressType type = 1;
|
814
1027
|
}
|
@@ -938,14 +1151,19 @@ message Channel {
|
|
938
1151
|
repeated HTLC pending_htlcs = 15 [json_name = "pending_htlcs"];
|
939
1152
|
|
940
1153
|
/**
|
941
|
-
The CSV delay expressed in relative blocks. If the channel is force
|
942
|
-
|
943
|
-
funds.
|
1154
|
+
The CSV delay expressed in relative blocks. If the channel is force closed,
|
1155
|
+
we will need to wait for this many blocks before we can regain our funds.
|
944
1156
|
*/
|
945
1157
|
uint32 csv_delay = 16 [json_name = "csv_delay"];
|
946
1158
|
|
947
|
-
/// Whether this channel is advertised to the network or not
|
1159
|
+
/// Whether this channel is advertised to the network or not.
|
948
1160
|
bool private = 17 [json_name = "private"];
|
1161
|
+
|
1162
|
+
/// True if we were the ones that created the channel.
|
1163
|
+
bool initiator = 18 [json_name = "initiator"];
|
1164
|
+
|
1165
|
+
/// A set of flags showing the current state of the cahnnel.
|
1166
|
+
string chan_status_flags = 19 [json_name = "chan_status_flags"];
|
949
1167
|
}
|
950
1168
|
|
951
1169
|
|
@@ -1038,6 +1256,26 @@ message Peer {
|
|
1038
1256
|
|
1039
1257
|
/// Ping time to this peer
|
1040
1258
|
int64 ping_time = 9 [json_name = "ping_time"];
|
1259
|
+
|
1260
|
+
enum SyncType {
|
1261
|
+
/**
|
1262
|
+
Denotes that we cannot determine the peer's current sync type.
|
1263
|
+
*/
|
1264
|
+
UNKNOWN_SYNC = 0;
|
1265
|
+
|
1266
|
+
/**
|
1267
|
+
Denotes that we are actively receiving new graph updates from the peer.
|
1268
|
+
*/
|
1269
|
+
ACTIVE_SYNC = 1;
|
1270
|
+
|
1271
|
+
/**
|
1272
|
+
Denotes that we are not receiving new graph updates from the peer.
|
1273
|
+
*/
|
1274
|
+
PASSIVE_SYNC = 2;
|
1275
|
+
}
|
1276
|
+
|
1277
|
+
// The type of sync we are currently performing with this peer.
|
1278
|
+
SyncType sync_type = 10 [json_name = "sync_type"];
|
1041
1279
|
}
|
1042
1280
|
|
1043
1281
|
message ListPeersRequest {
|
@@ -1075,11 +1313,13 @@ message GetInfoResponse {
|
|
1075
1313
|
/// Whether the wallet's view is synced to the main chain
|
1076
1314
|
bool synced_to_chain = 9 [json_name = "synced_to_chain"];
|
1077
1315
|
|
1078
|
-
|
1079
|
-
|
1316
|
+
/**
|
1317
|
+
Whether the current node is connected to testnet. This field is
|
1318
|
+
deprecated and the network field should be used instead
|
1319
|
+
**/
|
1320
|
+
bool testnet = 10 [json_name = "testnet", deprecated = true];
|
1080
1321
|
|
1081
|
-
|
1082
|
-
repeated string chains = 11 [json_name = "chains"];
|
1322
|
+
reserved 11;
|
1083
1323
|
|
1084
1324
|
/// The URIs of the current node.
|
1085
1325
|
repeated string uris = 12 [json_name = "uris"];
|
@@ -1092,6 +1332,17 @@ message GetInfoResponse {
|
|
1092
1332
|
|
1093
1333
|
/// Number of inactive channels
|
1094
1334
|
uint32 num_inactive_channels = 15 [json_name = "num_inactive_channels"];
|
1335
|
+
|
1336
|
+
/// A list of active chains the node is connected to
|
1337
|
+
repeated Chain chains = 16 [json_name = "chains"];
|
1338
|
+
}
|
1339
|
+
|
1340
|
+
message Chain {
|
1341
|
+
/// The blockchain the node is on (eg bitcoin, litecoin)
|
1342
|
+
string chain = 1 [json_name = "chain"];
|
1343
|
+
|
1344
|
+
/// The network the node is on (eg regtest, testnet, mainnet)
|
1345
|
+
string network = 2 [json_name = "network"];
|
1095
1346
|
}
|
1096
1347
|
|
1097
1348
|
message ConfirmationUpdate {
|
@@ -1132,7 +1383,6 @@ message CloseChannelRequest {
|
|
1132
1383
|
message CloseStatusUpdate {
|
1133
1384
|
oneof update {
|
1134
1385
|
PendingUpdate close_pending = 1 [json_name = "close_pending"];
|
1135
|
-
ConfirmationUpdate confirmation = 2 [json_name = "confirmation"];
|
1136
1386
|
ChannelCloseUpdate chan_close = 3 [json_name = "chan_close"];
|
1137
1387
|
}
|
1138
1388
|
}
|
@@ -1179,7 +1429,6 @@ message OpenChannelRequest {
|
|
1179
1429
|
message OpenStatusUpdate {
|
1180
1430
|
oneof update {
|
1181
1431
|
PendingUpdate chan_pending = 1 [json_name = "chan_pending"];
|
1182
|
-
ConfirmationUpdate confirmation = 2 [json_name = "confirmation"];
|
1183
1432
|
ChannelOpenUpdate chan_open = 3 [json_name = "chan_open"];
|
1184
1433
|
}
|
1185
1434
|
}
|
@@ -1306,6 +1555,27 @@ message PendingChannelsResponse {
|
|
1306
1555
|
repeated WaitingCloseChannel waiting_close_channels = 5 [ json_name = "waiting_close_channels" ];
|
1307
1556
|
}
|
1308
1557
|
|
1558
|
+
message ChannelEventSubscription {
|
1559
|
+
}
|
1560
|
+
|
1561
|
+
message ChannelEventUpdate {
|
1562
|
+
oneof channel {
|
1563
|
+
Channel open_channel = 1 [ json_name = "open_channel" ];
|
1564
|
+
ChannelCloseSummary closed_channel = 2 [ json_name = "closed_channel" ];
|
1565
|
+
ChannelPoint active_channel = 3 [ json_name = "active_channel" ];
|
1566
|
+
ChannelPoint inactive_channel = 4 [ json_name = "inactive_channel" ];
|
1567
|
+
}
|
1568
|
+
|
1569
|
+
enum UpdateType {
|
1570
|
+
OPEN_CHANNEL = 0;
|
1571
|
+
CLOSED_CHANNEL = 1;
|
1572
|
+
ACTIVE_CHANNEL = 2;
|
1573
|
+
INACTIVE_CHANNEL = 3;
|
1574
|
+
}
|
1575
|
+
|
1576
|
+
UpdateType type = 5 [ json_name = "type" ];
|
1577
|
+
}
|
1578
|
+
|
1309
1579
|
message WalletBalanceRequest {
|
1310
1580
|
}
|
1311
1581
|
message WalletBalanceResponse {
|
@@ -1336,8 +1606,11 @@ message QueryRoutesRequest {
|
|
1336
1606
|
/// The amount to send expressed in satoshis
|
1337
1607
|
int64 amt = 2;
|
1338
1608
|
|
1339
|
-
|
1340
|
-
|
1609
|
+
/**
|
1610
|
+
Deprecated. The max number of routes to return. In the future, QueryRoutes
|
1611
|
+
will only return a single route.
|
1612
|
+
*/
|
1613
|
+
int32 num_routes = 3 [deprecated = true];
|
1341
1614
|
|
1342
1615
|
/// An optional CLTV delta from the current height that should be used for the timelock of the final hop
|
1343
1616
|
int32 final_cltv_delta = 4;
|
@@ -1349,7 +1622,37 @@ message QueryRoutesRequest {
|
|
1349
1622
|
send the payment.
|
1350
1623
|
*/
|
1351
1624
|
FeeLimit fee_limit = 5;
|
1625
|
+
|
1626
|
+
/**
|
1627
|
+
A list of nodes to ignore during path finding.
|
1628
|
+
*/
|
1629
|
+
repeated bytes ignored_nodes = 6;
|
1630
|
+
|
1631
|
+
/**
|
1632
|
+
A list of edges to ignore during path finding.
|
1633
|
+
*/
|
1634
|
+
repeated EdgeLocator ignored_edges = 7;
|
1635
|
+
|
1636
|
+
/**
|
1637
|
+
The source node where the request route should originated from. If empty,
|
1638
|
+
self is assumed.
|
1639
|
+
*/
|
1640
|
+
string source_pub_key = 8;
|
1641
|
+
}
|
1642
|
+
|
1643
|
+
message EdgeLocator {
|
1644
|
+
/// The short channel id of this edge.
|
1645
|
+
uint64 channel_id = 1;
|
1646
|
+
|
1647
|
+
/**
|
1648
|
+
The direction of this edge. If direction_reverse is false, the direction
|
1649
|
+
of this edge is from the channel endpoint with the lexicographically smaller
|
1650
|
+
pub key to the endpoint with the larger pub key. If direction_reverse is
|
1651
|
+
is true, the edge goes the other way.
|
1652
|
+
*/
|
1653
|
+
bool direction_reverse = 2;
|
1352
1654
|
}
|
1655
|
+
|
1353
1656
|
message QueryRoutesResponse {
|
1354
1657
|
repeated Route routes = 1 [json_name = "routes"];
|
1355
1658
|
}
|
@@ -1468,6 +1771,7 @@ message RoutingPolicy {
|
|
1468
1771
|
int64 fee_base_msat = 3 [json_name = "fee_base_msat"];
|
1469
1772
|
int64 fee_rate_milli_msat = 4 [json_name = "fee_rate_milli_msat"];
|
1470
1773
|
bool disabled = 5 [json_name = "disabled"];
|
1774
|
+
uint64 max_htlc_msat = 6 [json_name = "max_htlc_msat"];
|
1471
1775
|
}
|
1472
1776
|
|
1473
1777
|
/**
|
@@ -1540,6 +1844,7 @@ message NetworkInfo {
|
|
1540
1844
|
double avg_channel_size = 7 [json_name = "avg_channel_size"];
|
1541
1845
|
int64 min_channel_size = 8 [json_name = "min_channel_size"];
|
1542
1846
|
int64 max_channel_size = 9 [json_name = "max_channel_size"];
|
1847
|
+
int64 median_channel_size_sat = 10 [json_name = "median_channel_size_sat"];
|
1543
1848
|
|
1544
1849
|
// TODO(roasbeef): fee rate info, expiry
|
1545
1850
|
// * also additional RPC for tracking fee info once in
|
@@ -1626,8 +1931,10 @@ message Invoice {
|
|
1626
1931
|
*/
|
1627
1932
|
string memo = 1 [json_name = "memo"];
|
1628
1933
|
|
1629
|
-
|
1630
|
-
|
1934
|
+
/** Deprecated. An optional cryptographic receipt of payment which is not
|
1935
|
+
implemented.
|
1936
|
+
*/
|
1937
|
+
bytes receipt = 2 [json_name = "receipt", deprecated = true];
|
1631
1938
|
|
1632
1939
|
/**
|
1633
1940
|
The hex-encoded preimage (32 byte) which will allow settling an incoming
|
@@ -1642,7 +1949,7 @@ message Invoice {
|
|
1642
1949
|
int64 value = 5 [json_name = "value"];
|
1643
1950
|
|
1644
1951
|
/// Whether this invoice has been fulfilled
|
1645
|
-
bool settled = 6 [json_name = "settled"];
|
1952
|
+
bool settled = 6 [json_name = "settled", deprecated = true];
|
1646
1953
|
|
1647
1954
|
/// When this invoice was created
|
1648
1955
|
int64 creation_date = 7 [json_name = "creation_date"];
|
@@ -1720,7 +2027,20 @@ message Invoice {
|
|
1720
2027
|
here as well.
|
1721
2028
|
*/
|
1722
2029
|
int64 amt_paid_msat = 20 [json_name = "amt_paid_msat"];
|
2030
|
+
|
2031
|
+
enum InvoiceState {
|
2032
|
+
OPEN = 0;
|
2033
|
+
SETTLED = 1;
|
2034
|
+
CANCELED = 2;
|
2035
|
+
ACCEPTED = 3;
|
2036
|
+
}
|
2037
|
+
|
2038
|
+
/**
|
2039
|
+
The state the invoice is in.
|
2040
|
+
*/
|
2041
|
+
InvoiceState state = 21 [json_name = "state"];
|
1723
2042
|
}
|
2043
|
+
|
1724
2044
|
message AddInvoiceResponse {
|
1725
2045
|
bytes r_hash = 1 [json_name = "r_hash"];
|
1726
2046
|
|
@@ -1953,15 +2273,18 @@ message ForwardingEvent {
|
|
1953
2273
|
/// The outgoing channel ID that carried the preimage that completed the circuit.
|
1954
2274
|
uint64 chan_id_out = 4 [json_name = "chan_id_out"];
|
1955
2275
|
|
1956
|
-
/// The total amount of the incoming HTLC that created half the circuit.
|
2276
|
+
/// The total amount (in satoshis) of the incoming HTLC that created half the circuit.
|
1957
2277
|
uint64 amt_in = 5 [json_name = "amt_in"];
|
1958
2278
|
|
1959
|
-
/// The total amount of the
|
2279
|
+
/// The total amount (in satoshis) of the outgoing HTLC that created the second half of the circuit.
|
1960
2280
|
uint64 amt_out = 6 [json_name = "amt_out"];
|
1961
2281
|
|
1962
|
-
/// The total fee that this payment circuit carried.
|
2282
|
+
/// The total fee (in satoshis) that this payment circuit carried.
|
1963
2283
|
uint64 fee = 7 [json_name = "fee"];
|
1964
2284
|
|
2285
|
+
/// The total fee (in milli-satoshis) that this payment circuit carried.
|
2286
|
+
uint64 fee_msat = 8 [json_name = "fee_msat"];
|
2287
|
+
|
1965
2288
|
// TODO(roasbeef): add settlement latency?
|
1966
2289
|
// * use FPE on the chan id?
|
1967
2290
|
// * also list failures?
|
@@ -1973,3 +2296,72 @@ message ForwardingHistoryResponse {
|
|
1973
2296
|
/// The index of the last time in the set of returned forwarding events. Can be used to seek further, pagination style.
|
1974
2297
|
uint32 last_offset_index = 2 [json_name = "last_offset_index"];
|
1975
2298
|
}
|
2299
|
+
|
2300
|
+
message ExportChannelBackupRequest {
|
2301
|
+
/// The target chanenl point to obtain a back up for.
|
2302
|
+
ChannelPoint chan_point = 1;
|
2303
|
+
}
|
2304
|
+
|
2305
|
+
message ChannelBackup {
|
2306
|
+
/**
|
2307
|
+
Identifies the channel that this backup belongs to.
|
2308
|
+
*/
|
2309
|
+
ChannelPoint chan_point = 1 [ json_name = "chan_point" ];
|
2310
|
+
|
2311
|
+
/**
|
2312
|
+
Is an encrypted single-chan backup. this can be passed to
|
2313
|
+
RestoreChannelBackups, or the WalletUnlocker Innit and Unlock methods in
|
2314
|
+
order to trigger the recovery protocol.
|
2315
|
+
*/
|
2316
|
+
bytes chan_backup = 2 [ json_name = "chan_backup" ];
|
2317
|
+
}
|
2318
|
+
|
2319
|
+
message MultiChanBackup {
|
2320
|
+
/**
|
2321
|
+
Is the set of all channels that are included in this multi-channel backup.
|
2322
|
+
*/
|
2323
|
+
repeated ChannelPoint chan_points = 1 [ json_name = "chan_points" ];
|
2324
|
+
|
2325
|
+
/**
|
2326
|
+
A single encrypted blob containing all the static channel backups of the
|
2327
|
+
channel listed above. This can be stored as a single file or blob, and
|
2328
|
+
safely be replaced with any prior/future versions.
|
2329
|
+
*/
|
2330
|
+
bytes multi_chan_backup = 2 [ json_name = "multi_chan_backup" ];
|
2331
|
+
}
|
2332
|
+
|
2333
|
+
message ChanBackupExportRequest {}
|
2334
|
+
message ChanBackupSnapshot {
|
2335
|
+
/**
|
2336
|
+
The set of new channels that have been added since the last channel backup
|
2337
|
+
snapshot was requested.
|
2338
|
+
*/
|
2339
|
+
ChannelBackups single_chan_backups = 1 [ json_name = "single_chan_backups" ];
|
2340
|
+
|
2341
|
+
/**
|
2342
|
+
A multi-channel backup that covers all open channels currently known to
|
2343
|
+
lnd.
|
2344
|
+
*/
|
2345
|
+
MultiChanBackup multi_chan_backup = 2 [ json_name = "multi_chan_backup" ];
|
2346
|
+
}
|
2347
|
+
|
2348
|
+
message ChannelBackups {
|
2349
|
+
/**
|
2350
|
+
A set of single-chan static channel backups.
|
2351
|
+
*/
|
2352
|
+
repeated ChannelBackup chan_backups = 1 [ json_name = "chan_backups" ];
|
2353
|
+
}
|
2354
|
+
|
2355
|
+
message RestoreChanBackupRequest {
|
2356
|
+
oneof backup {
|
2357
|
+
ChannelBackups chan_backups = 1 [ json_name = "chan_backups" ];
|
2358
|
+
|
2359
|
+
bytes multi_chan_backup = 2 [ json_name = "multi_chan_backup" ];
|
2360
|
+
}
|
2361
|
+
}
|
2362
|
+
message RestoreBackupResponse {}
|
2363
|
+
|
2364
|
+
message ChannelBackupSubscription {}
|
2365
|
+
|
2366
|
+
message VerifyChanBackupResponse {
|
2367
|
+
}
|