From 566cd86a1d07f46a35911a792a68f2d26458d31c Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Sat, 15 Oct 2016 14:38:47 -0700 Subject: [PATCH] lnrpc: add cursory REST support to the RPC server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds a REST interface to the existing gRPC server by employing a simple http proxy auto-generated from the existing protobuf files. Currently full-support for any streaming RPC’s are currently untested. In addition to auto-generating a REST proxy server, a swagger.json is also generated which allows for gRPC-like native objects with higher-level clients, and also for auto-generated documentation. Due to limitations with accepting raw byte strings as parameters, some RPC’s have been modified to take both raw-bytes and string arguments. Additionally a new RPC has been added ‘NewWitnessAddress’ since the proxy doesn’t currently support enum-based arguments. Currently the proxy server is embedded within the daemon as an active HTTP server, however we may want to package the proxy server as a separate binary in the future. Similarly, we may want to add additional configuration information which controls the optional inclusion of the REST proxy. Atm, just like the current gRPC interface, the REST API is fully unauthenticated. Before moving to an initial alpha release after making the necessary changes to meet the spec drafted in Milan, authentication of the RPC interfaces will be addressed. --- glide.lock | 34 +- glide.yaml | 2 + lnd.go | 28 +- lnrpc/gen_protos.sh | 23 +- lnrpc/rpc.pb.go | 800 ++++++++++++++++++++++----------- lnrpc/rpc.pb.gw.go | 953 +++++++++++++++++++++++++++++++++++++++ lnrpc/rpc.proto | 139 +++++- lnrpc/rpc.swagger.json | 981 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 2667 insertions(+), 293 deletions(-) create mode 100644 lnrpc/rpc.pb.gw.go create mode 100644 lnrpc/rpc.swagger.json diff --git a/glide.lock b/glide.lock index b044c7d9..bae17ce2 100644 --- a/glide.lock +++ b/glide.lock @@ -1,13 +1,14 @@ -hash: 3047655dd4d303e49360573568bb046155e047519243c0ed8b1f8be2fcaf02de -updated: 2016-09-20T16:28:15.627923101-07:00 +hash: db69bdd1de1bff79275a16649b87f5c5769a7ce6e889a9babf96dea470d931bf +updated: 2016-10-15T14:19:38.70874686-07:00 imports: - name: github.com/awalterschulze/gographviz - version: 761fd5fbb34e4c2c138c280395b65b48e4ff5a53 + version: d4d8514752339899250316f88a7907468e8eca7e subpackages: - ast - parser - - scanner - token + - errors + - lexer - name: github.com/BitfuryLightning/tools version: b36ae00916b800503504455f7afeb3159bd5ee35 subpackages: @@ -55,11 +56,20 @@ imports: subpackages: - spew - name: github.com/golang/protobuf - version: 1f49d83d9aa00e6ce4fc8258c71cc7786aec968a + version: 98fa357170587e470c5f27d3c3ea0947b71eb455 subpackages: - proto + - jsonpb + - protoc-gen-go/descriptor +- name: github.com/grpc-ecosystem/grpc-gateway + version: a8f25bd1ab549f8b87afd48aa9181221e9d439bb + subpackages: + - runtime + - third_party/googleapis/google/api + - utilities + - runtime/internal - name: github.com/howeyc/gopass - version: 26c6e1184fd5255fa5f5289d0b789a4819c203a4 + version: f5387c492211eb133053880d23dfae62aa14123d - name: github.com/lightningnetwork/lightning-onion version: 81647ffa2c5e17c0447d359e1963a54e18be85c4 - name: github.com/roasbeef/btcd @@ -84,7 +94,7 @@ imports: - txsort - base58 - name: github.com/roasbeef/btcwallet - version: 1fd2d6224698e14591d06f2a10b24e86494cc19f + version: 7acd18a96697b180b631631108f1a15448de369f subpackages: - chain - waddrmgr @@ -104,7 +114,7 @@ imports: - name: github.com/urfave/cli version: a14d7d367bc02b1f57d88de97926727f2d936387 - name: golang.org/x/crypto - version: 6ab629be5e31660579425a738ba8870beb5b7404 + version: 5f31782cfb2b6373211f8f9fbf31283fa234b570 subpackages: - hkdf - nacl/secretbox @@ -115,7 +125,7 @@ imports: - pbkdf2 - ssh/terminal - name: golang.org/x/net - version: f4fe4abe3c785295ddf81c7f1823bcd3bad391b6 + version: 8b4af36cd21a1f85a7484b49feb7c79363106d8e subpackages: - context - http2 @@ -125,17 +135,17 @@ imports: - lex/httplex - internal/timeseries - name: golang.org/x/sys - version: 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9 + version: 9bb9f0998d48b31547d975974935ae9b48c7a03c subpackages: - unix - name: google.golang.org/grpc - version: 0032a855ba5c8a3c8e0d71c2deef354b70af1584 + version: b1a2821ca5a4fd6b6e48ddfbb7d6d7584d839d21 subpackages: - grpclog - codes + - metadata - credentials - internal - - metadata - naming - transport - peer diff --git a/glide.yaml b/glide.yaml index 4ea4d06e..4887c1df 100644 --- a/glide.yaml +++ b/glide.yaml @@ -57,3 +57,5 @@ import: - package: google.golang.org/grpc version: ^1.0.0 - package: github.com/lightningnetwork/lightning-onion +- package: github.com/grpc-ecosystem/grpc-gateway + version: ^1.1.0 diff --git a/lnd.go b/lnd.go index 9ea8f0c7..5f79dac7 100644 --- a/lnd.go +++ b/lnd.go @@ -1,6 +1,7 @@ package main import ( + "context" "encoding/hex" "fmt" "io/ioutil" @@ -14,11 +15,13 @@ import ( "google.golang.org/grpc" + proxy "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/chainntnfs/btcdnotify" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwallet/btcwallet" + "github.com/roasbeef/btcrpcclient" ) @@ -175,8 +178,9 @@ func lndMain() error { grpcServer := grpc.NewServer(opts...) lnrpc.RegisterLightningServer(grpcServer, server.rpcServer) - // Finally, start the grpc server listening for HTTP/2 connections. - lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", loadedConfig.RPCPort)) + // Next, Start the grpc server listening for HTTP/2 connections. + grpcEndpoint := fmt.Sprintf("localhost:%d", loadedConfig.RPCPort) + lis, err := net.Listen("tcp", grpcEndpoint) if err != nil { fmt.Printf("failed to listen: %v", err) return err @@ -186,6 +190,26 @@ func lndMain() error { grpcServer.Serve(lis) }() + // Finally, start the REST proxy for our gRPC server above. + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) + defer cancel() + mux := proxy.NewServeMux() + swaggerPattern := proxy.MustPattern(proxy.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "swagger"}, "")) + // TODO(roasbeef): accept path to swagger file as command-line option + mux.Handle("GET", swaggerPattern, func(w http.ResponseWriter, r *http.Request, p map[string]string) { + http.ServeFile(w, r, "lnrpc/rpc.swagger.json") + }) + proxyOpts := []grpc.DialOption{grpc.WithInsecure()} + err = lnrpc.RegisterLightningHandlerFromEndpoint(ctx, mux, grpcEndpoint, proxyOpts) + if err != nil { + return err + } + go func() { + rpcsLog.Infof("gRPC proxy started") + http.ListenAndServe(":8080", mux) + }() + // Wait for shutdown signal from either a graceful server stop or from // the interrupt handler. <-shutdownChannel diff --git a/lnrpc/gen_protos.sh b/lnrpc/gen_protos.sh index b04f9191..fe75eeb1 100755 --- a/lnrpc/gen_protos.sh +++ b/lnrpc/gen_protos.sh @@ -1,3 +1,24 @@ #!/bin/sh -protoc -I . rpc.proto --go_out=plugins=grpc:. +# Generate the protos. +protoc -I/usr/local/include -I. \ + -I$GOPATH/src \ + -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ + --go_out=Mgoogle/api/annotations.proto=github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/google/api,plugins=grpc:. \ + rpc.proto + + + +# Generate the REST reverse prozxy. +protoc -I/usr/local/include -I. \ + -I$GOPATH/src \ + -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ + --grpc-gateway_out=logtostderr=true:. \ + rpc.proto + +# Finally, generate the swagger file which describes the REST API in detail. +protoc -I/usr/local/include -I. \ + -I$GOPATH/src \ + -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ + --swagger_out=logtostderr=true:. \ + rpc.proto diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index b07b6ffa..6bfd7f91 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -9,6 +9,9 @@ It is generated from these files: rpc.proto It has these top-level messages: + Transaction + GetTransactionsRequest + TransactionDetails SendRequest SendResponse ChannelPoint @@ -18,6 +21,7 @@ It has these top-level messages: SendCoinsRequest SendCoinsResponse NewAddressRequest + NewWitnessAddressRequest NewAddressResponse ConnectPeerRequest ConnectPeerResponse @@ -52,12 +56,14 @@ It has these top-level messages: PaymentHash ListInvoiceRequest ListInvoiceResponse + InvoiceSubscription */ package lnrpc import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" +import _ "github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/google/api" import ( context "golang.org/x/net/context" @@ -122,7 +128,46 @@ func (x NewAddressRequest_AddressType) String() string { return proto.EnumName(NewAddressRequest_AddressType_name, int32(x)) } func (NewAddressRequest_AddressType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{8, 0} + return fileDescriptor0, []int{11, 0} +} + +type Transaction struct { + TxHash string `protobuf:"bytes,1,opt,name=tx_hash" json:"tx_hash,omitempty"` + Amount float64 `protobuf:"fixed64,2,opt,name=amount" json:"amount,omitempty"` + NumConfirmations int32 `protobuf:"varint,3,opt,name=num_confirmations" json:"num_confirmations,omitempty"` + BlockHash string `protobuf:"bytes,4,opt,name=block_hash" json:"block_hash,omitempty"` + BlockHeight int32 `protobuf:"varint,5,opt,name=block_height" json:"block_height,omitempty"` + TimeStamp int64 `protobuf:"varint,6,opt,name=time_stamp" json:"time_stamp,omitempty"` + TotalFees int64 `protobuf:"varint,7,opt,name=total_fees" json:"total_fees,omitempty"` +} + +func (m *Transaction) Reset() { *m = Transaction{} } +func (m *Transaction) String() string { return proto.CompactTextString(m) } +func (*Transaction) ProtoMessage() {} +func (*Transaction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type GetTransactionsRequest struct { +} + +func (m *GetTransactionsRequest) Reset() { *m = GetTransactionsRequest{} } +func (m *GetTransactionsRequest) String() string { return proto.CompactTextString(m) } +func (*GetTransactionsRequest) ProtoMessage() {} +func (*GetTransactionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +type TransactionDetails struct { + Transactions []*Transaction `protobuf:"bytes,1,rep,name=transactions" json:"transactions,omitempty"` +} + +func (m *TransactionDetails) Reset() { *m = TransactionDetails{} } +func (m *TransactionDetails) String() string { return proto.CompactTextString(m) } +func (*TransactionDetails) ProtoMessage() {} +func (*TransactionDetails) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *TransactionDetails) GetTransactions() []*Transaction { + if m != nil { + return m.Transactions + } + return nil } type SendRequest struct { @@ -135,7 +180,7 @@ type SendRequest struct { func (m *SendRequest) Reset() { *m = SendRequest{} } func (m *SendRequest) String() string { return proto.CompactTextString(m) } func (*SendRequest) ProtoMessage() {} -func (*SendRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*SendRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } type SendResponse struct { } @@ -143,17 +188,18 @@ type SendResponse struct { func (m *SendResponse) Reset() { *m = SendResponse{} } func (m *SendResponse) String() string { return proto.CompactTextString(m) } func (*SendResponse) ProtoMessage() {} -func (*SendResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (*SendResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } type ChannelPoint struct { - FundingTxid []byte `protobuf:"bytes,1,opt,name=funding_txid,proto3" json:"funding_txid,omitempty"` - OutputIndex uint32 `protobuf:"varint,2,opt,name=output_index" json:"output_index,omitempty"` + FundingTxid []byte `protobuf:"bytes,1,opt,name=funding_txid,proto3" json:"funding_txid,omitempty"` + FundingTxidStr string `protobuf:"bytes,2,opt,name=funding_txid_str" json:"funding_txid_str,omitempty"` + OutputIndex uint32 `protobuf:"varint,3,opt,name=output_index" json:"output_index,omitempty"` } func (m *ChannelPoint) Reset() { *m = ChannelPoint{} } func (m *ChannelPoint) String() string { return proto.CompactTextString(m) } func (*ChannelPoint) ProtoMessage() {} -func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } type LightningAddress struct { PubKeyHash string `protobuf:"bytes,1,opt,name=pubKeyHash" json:"pubKeyHash,omitempty"` @@ -163,7 +209,7 @@ type LightningAddress struct { func (m *LightningAddress) Reset() { *m = LightningAddress{} } func (m *LightningAddress) String() string { return proto.CompactTextString(m) } func (*LightningAddress) ProtoMessage() {} -func (*LightningAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (*LightningAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } type SendManyRequest struct { AddrToAmount map[string]int64 `protobuf:"bytes,1,rep,name=AddrToAmount" json:"AddrToAmount,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` @@ -172,7 +218,7 @@ type SendManyRequest struct { func (m *SendManyRequest) Reset() { *m = SendManyRequest{} } func (m *SendManyRequest) String() string { return proto.CompactTextString(m) } func (*SendManyRequest) ProtoMessage() {} -func (*SendManyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +func (*SendManyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } func (m *SendManyRequest) GetAddrToAmount() map[string]int64 { if m != nil { @@ -188,7 +234,7 @@ type SendManyResponse struct { func (m *SendManyResponse) Reset() { *m = SendManyResponse{} } func (m *SendManyResponse) String() string { return proto.CompactTextString(m) } func (*SendManyResponse) ProtoMessage() {} -func (*SendManyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (*SendManyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } type SendCoinsRequest struct { Addr string `protobuf:"bytes,1,opt,name=addr" json:"addr,omitempty"` @@ -198,7 +244,7 @@ type SendCoinsRequest struct { func (m *SendCoinsRequest) Reset() { *m = SendCoinsRequest{} } func (m *SendCoinsRequest) String() string { return proto.CompactTextString(m) } func (*SendCoinsRequest) ProtoMessage() {} -func (*SendCoinsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (*SendCoinsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } type SendCoinsResponse struct { Txid string `protobuf:"bytes,1,opt,name=txid" json:"txid,omitempty"` @@ -207,7 +253,7 @@ type SendCoinsResponse struct { func (m *SendCoinsResponse) Reset() { *m = SendCoinsResponse{} } func (m *SendCoinsResponse) String() string { return proto.CompactTextString(m) } func (*SendCoinsResponse) ProtoMessage() {} -func (*SendCoinsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (*SendCoinsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } type NewAddressRequest struct { Type NewAddressRequest_AddressType `protobuf:"varint,1,opt,name=type,enum=lnrpc.NewAddressRequest_AddressType" json:"type,omitempty"` @@ -216,7 +262,15 @@ type NewAddressRequest struct { func (m *NewAddressRequest) Reset() { *m = NewAddressRequest{} } func (m *NewAddressRequest) String() string { return proto.CompactTextString(m) } func (*NewAddressRequest) ProtoMessage() {} -func (*NewAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (*NewAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +type NewWitnessAddressRequest struct { +} + +func (m *NewWitnessAddressRequest) Reset() { *m = NewWitnessAddressRequest{} } +func (m *NewWitnessAddressRequest) String() string { return proto.CompactTextString(m) } +func (*NewWitnessAddressRequest) ProtoMessage() {} +func (*NewWitnessAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } type NewAddressResponse struct { Address string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` @@ -225,7 +279,7 @@ type NewAddressResponse struct { func (m *NewAddressResponse) Reset() { *m = NewAddressResponse{} } func (m *NewAddressResponse) String() string { return proto.CompactTextString(m) } func (*NewAddressResponse) ProtoMessage() {} -func (*NewAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (*NewAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } type ConnectPeerRequest struct { Addr *LightningAddress `protobuf:"bytes,1,opt,name=addr" json:"addr,omitempty"` @@ -234,7 +288,7 @@ type ConnectPeerRequest struct { func (m *ConnectPeerRequest) Reset() { *m = ConnectPeerRequest{} } func (m *ConnectPeerRequest) String() string { return proto.CompactTextString(m) } func (*ConnectPeerRequest) ProtoMessage() {} -func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } func (m *ConnectPeerRequest) GetAddr() *LightningAddress { if m != nil { @@ -250,7 +304,7 @@ type ConnectPeerResponse struct { func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} } func (m *ConnectPeerResponse) String() string { return proto.CompactTextString(m) } func (*ConnectPeerResponse) ProtoMessage() {} -func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } type HTLC struct { Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"` @@ -263,7 +317,7 @@ type HTLC struct { func (m *HTLC) Reset() { *m = HTLC{} } func (m *HTLC) String() string { return proto.CompactTextString(m) } func (*HTLC) ProtoMessage() {} -func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } type ActiveChannel struct { RemotePubkey string `protobuf:"bytes,1,opt,name=remote_pubkey" json:"remote_pubkey,omitempty"` @@ -279,7 +333,7 @@ type ActiveChannel struct { func (m *ActiveChannel) Reset() { *m = ActiveChannel{} } func (m *ActiveChannel) String() string { return proto.CompactTextString(m) } func (*ActiveChannel) ProtoMessage() {} -func (*ActiveChannel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } +func (*ActiveChannel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } func (m *ActiveChannel) GetPendingHtlcs() []*HTLC { if m != nil { @@ -294,7 +348,7 @@ type ListChannelsRequest struct { func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} } func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) } func (*ListChannelsRequest) ProtoMessage() {} -func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } +func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } type ListChannelsResponse struct { Channels []*ActiveChannel `protobuf:"bytes,9,rep,name=channels" json:"channels,omitempty"` @@ -303,7 +357,7 @@ type ListChannelsResponse struct { func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} } func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) } func (*ListChannelsResponse) ProtoMessage() {} -func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } +func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } func (m *ListChannelsResponse) GetChannels() []*ActiveChannel { if m != nil { @@ -326,7 +380,7 @@ type Peer struct { func (m *Peer) Reset() { *m = Peer{} } func (m *Peer) String() string { return proto.CompactTextString(m) } func (*Peer) ProtoMessage() {} -func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } +func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } type ListPeersRequest struct { } @@ -334,7 +388,7 @@ type ListPeersRequest struct { func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} } func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) } func (*ListPeersRequest) ProtoMessage() {} -func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } +func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } type ListPeersResponse struct { Peers []*Peer `protobuf:"bytes,1,rep,name=peers" json:"peers,omitempty"` @@ -343,7 +397,7 @@ type ListPeersResponse struct { func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} } func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) } func (*ListPeersResponse) ProtoMessage() {} -func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } +func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } func (m *ListPeersResponse) GetPeers() []*Peer { if m != nil { @@ -358,7 +412,7 @@ type GetInfoRequest struct { func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} } func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetInfoRequest) ProtoMessage() {} -func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } +func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } type GetInfoResponse struct { LightningId string `protobuf:"bytes,1,opt,name=lightning_id" json:"lightning_id,omitempty"` @@ -372,7 +426,7 @@ type GetInfoResponse struct { func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} } func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetInfoResponse) ProtoMessage() {} -func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } +func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } type ConfirmationUpdate struct { BlockSha []byte `protobuf:"bytes,1,opt,name=block_sha,proto3" json:"block_sha,omitempty"` @@ -383,7 +437,7 @@ type ConfirmationUpdate struct { func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} } func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) } func (*ConfirmationUpdate) ProtoMessage() {} -func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } +func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } type ChannelOpenUpdate struct { ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point" json:"channel_point,omitempty"` @@ -392,7 +446,7 @@ type ChannelOpenUpdate struct { func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} } func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelOpenUpdate) ProtoMessage() {} -func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } +func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint { if m != nil { @@ -409,7 +463,7 @@ type ChannelCloseUpdate struct { func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} } func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelCloseUpdate) ProtoMessage() {} -func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } +func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } type CloseChannelRequest struct { ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point" json:"channel_point,omitempty"` @@ -420,7 +474,7 @@ type CloseChannelRequest struct { func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} } func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) } func (*CloseChannelRequest) ProtoMessage() {} -func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } +func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } func (m *CloseChannelRequest) GetChannelPoint() *ChannelPoint { if m != nil { @@ -440,7 +494,7 @@ type CloseStatusUpdate struct { func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} } func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) } func (*CloseStatusUpdate) ProtoMessage() {} -func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } +func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } type isCloseStatusUpdate_Update interface { isCloseStatusUpdate_Update() @@ -588,7 +642,7 @@ type PendingUpdate struct { func (m *PendingUpdate) Reset() { *m = PendingUpdate{} } func (m *PendingUpdate) String() string { return proto.CompactTextString(m) } func (*PendingUpdate) ProtoMessage() {} -func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } +func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } type OpenChannelRequest struct { TargetPeerId int32 `protobuf:"varint,1,opt,name=target_peer_id" json:"target_peer_id,omitempty"` @@ -602,7 +656,7 @@ type OpenChannelRequest struct { func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} } func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) } func (*OpenChannelRequest) ProtoMessage() {} -func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } +func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } type OpenStatusUpdate struct { // Types that are valid to be assigned to Update: @@ -615,7 +669,7 @@ type OpenStatusUpdate struct { func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} } func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) } func (*OpenStatusUpdate) ProtoMessage() {} -func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } +func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } type isOpenStatusUpdate_Update interface { isOpenStatusUpdate_Update() @@ -763,7 +817,7 @@ type PendingChannelRequest struct { func (m *PendingChannelRequest) Reset() { *m = PendingChannelRequest{} } func (m *PendingChannelRequest) String() string { return proto.CompactTextString(m) } func (*PendingChannelRequest) ProtoMessage() {} -func (*PendingChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } +func (*PendingChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } type PendingChannelResponse struct { PendingChannels []*PendingChannelResponse_PendingChannel `protobuf:"bytes,1,rep,name=pending_channels" json:"pending_channels,omitempty"` @@ -772,7 +826,7 @@ type PendingChannelResponse struct { func (m *PendingChannelResponse) Reset() { *m = PendingChannelResponse{} } func (m *PendingChannelResponse) String() string { return proto.CompactTextString(m) } func (*PendingChannelResponse) ProtoMessage() {} -func (*PendingChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } +func (*PendingChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } func (m *PendingChannelResponse) GetPendingChannels() []*PendingChannelResponse_PendingChannel { if m != nil { @@ -796,7 +850,7 @@ func (m *PendingChannelResponse_PendingChannel) Reset() { *m = PendingCh func (m *PendingChannelResponse_PendingChannel) String() string { return proto.CompactTextString(m) } func (*PendingChannelResponse_PendingChannel) ProtoMessage() {} func (*PendingChannelResponse_PendingChannel) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{30, 0} + return fileDescriptor0, []int{34, 0} } type WalletBalanceRequest struct { @@ -806,7 +860,7 @@ type WalletBalanceRequest struct { func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} } func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) } func (*WalletBalanceRequest) ProtoMessage() {} -func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } +func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } type WalletBalanceResponse struct { Balance float64 `protobuf:"fixed64,1,opt,name=balance" json:"balance,omitempty"` @@ -815,7 +869,7 @@ type WalletBalanceResponse struct { func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} } func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) } func (*WalletBalanceResponse) ProtoMessage() {} -func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } +func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } type ChannelBalanceRequest struct { } @@ -823,7 +877,7 @@ type ChannelBalanceRequest struct { func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} } func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) } func (*ChannelBalanceRequest) ProtoMessage() {} -func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } +func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } type ChannelBalanceResponse struct { Balance int64 `protobuf:"varint,1,opt,name=balance" json:"balance,omitempty"` @@ -832,7 +886,7 @@ type ChannelBalanceResponse struct { func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{} } func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) } func (*ChannelBalanceResponse) ProtoMessage() {} -func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } +func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } type RoutingTableLink struct { Id1 string `protobuf:"bytes,1,opt,name=id1" json:"id1,omitempty"` @@ -845,7 +899,7 @@ type RoutingTableLink struct { func (m *RoutingTableLink) Reset() { *m = RoutingTableLink{} } func (m *RoutingTableLink) String() string { return proto.CompactTextString(m) } func (*RoutingTableLink) ProtoMessage() {} -func (*RoutingTableLink) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } +func (*RoutingTableLink) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } type ShowRoutingTableRequest struct { } @@ -853,7 +907,7 @@ type ShowRoutingTableRequest struct { func (m *ShowRoutingTableRequest) Reset() { *m = ShowRoutingTableRequest{} } func (m *ShowRoutingTableRequest) String() string { return proto.CompactTextString(m) } func (*ShowRoutingTableRequest) ProtoMessage() {} -func (*ShowRoutingTableRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } +func (*ShowRoutingTableRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } type ShowRoutingTableResponse struct { Channels []*RoutingTableLink `protobuf:"bytes,1,rep,name=channels" json:"channels,omitempty"` @@ -862,7 +916,7 @@ type ShowRoutingTableResponse struct { func (m *ShowRoutingTableResponse) Reset() { *m = ShowRoutingTableResponse{} } func (m *ShowRoutingTableResponse) String() string { return proto.CompactTextString(m) } func (*ShowRoutingTableResponse) ProtoMessage() {} -func (*ShowRoutingTableResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } +func (*ShowRoutingTableResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } func (m *ShowRoutingTableResponse) GetChannels() []*RoutingTableLink { if m != nil { @@ -883,7 +937,7 @@ type Invoice struct { func (m *Invoice) Reset() { *m = Invoice{} } func (m *Invoice) String() string { return proto.CompactTextString(m) } func (*Invoice) ProtoMessage() {} -func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } +func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } type AddInvoiceResponse struct { RHash []byte `protobuf:"bytes,1,opt,name=r_hash,proto3" json:"r_hash,omitempty"` @@ -892,16 +946,17 @@ type AddInvoiceResponse struct { func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} } func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) } func (*AddInvoiceResponse) ProtoMessage() {} -func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } +func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } type PaymentHash struct { - RHash []byte `protobuf:"bytes,1,opt,name=r_hash,proto3" json:"r_hash,omitempty"` + RHashStr string `protobuf:"bytes,1,opt,name=r_hash_str" json:"r_hash_str,omitempty"` + RHash []byte `protobuf:"bytes,2,opt,name=r_hash,proto3" json:"r_hash,omitempty"` } func (m *PaymentHash) Reset() { *m = PaymentHash{} } func (m *PaymentHash) String() string { return proto.CompactTextString(m) } func (*PaymentHash) ProtoMessage() {} -func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } +func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } type ListInvoiceRequest struct { PendingOnly bool `protobuf:"varint,1,opt,name=pending_only" json:"pending_only,omitempty"` @@ -910,7 +965,7 @@ type ListInvoiceRequest struct { func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} } func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) } func (*ListInvoiceRequest) ProtoMessage() {} -func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } +func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} } type ListInvoiceResponse struct { Invoices []*Invoice `protobuf:"bytes,1,rep,name=invoices" json:"invoices,omitempty"` @@ -919,7 +974,7 @@ type ListInvoiceResponse struct { func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} } func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) } func (*ListInvoiceResponse) ProtoMessage() {} -func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } +func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} } func (m *ListInvoiceResponse) GetInvoices() []*Invoice { if m != nil { @@ -928,7 +983,18 @@ func (m *ListInvoiceResponse) GetInvoices() []*Invoice { return nil } +type InvoiceSubscription struct { +} + +func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} } +func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) } +func (*InvoiceSubscription) ProtoMessage() {} +func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } + func init() { + proto.RegisterType((*Transaction)(nil), "lnrpc.Transaction") + proto.RegisterType((*GetTransactionsRequest)(nil), "lnrpc.GetTransactionsRequest") + proto.RegisterType((*TransactionDetails)(nil), "lnrpc.TransactionDetails") proto.RegisterType((*SendRequest)(nil), "lnrpc.SendRequest") proto.RegisterType((*SendResponse)(nil), "lnrpc.SendResponse") proto.RegisterType((*ChannelPoint)(nil), "lnrpc.ChannelPoint") @@ -938,6 +1004,7 @@ func init() { proto.RegisterType((*SendCoinsRequest)(nil), "lnrpc.SendCoinsRequest") proto.RegisterType((*SendCoinsResponse)(nil), "lnrpc.SendCoinsResponse") proto.RegisterType((*NewAddressRequest)(nil), "lnrpc.NewAddressRequest") + proto.RegisterType((*NewWitnessAddressRequest)(nil), "lnrpc.NewWitnessAddressRequest") proto.RegisterType((*NewAddressResponse)(nil), "lnrpc.NewAddressResponse") proto.RegisterType((*ConnectPeerRequest)(nil), "lnrpc.ConnectPeerRequest") proto.RegisterType((*ConnectPeerResponse)(nil), "lnrpc.ConnectPeerResponse") @@ -973,6 +1040,7 @@ func init() { proto.RegisterType((*PaymentHash)(nil), "lnrpc.PaymentHash") proto.RegisterType((*ListInvoiceRequest)(nil), "lnrpc.ListInvoiceRequest") proto.RegisterType((*ListInvoiceResponse)(nil), "lnrpc.ListInvoiceResponse") + proto.RegisterType((*InvoiceSubscription)(nil), "lnrpc.InvoiceSubscription") proto.RegisterEnum("lnrpc.ChannelStatus", ChannelStatus_name, ChannelStatus_value) proto.RegisterEnum("lnrpc.NewAddressRequest_AddressType", NewAddressRequest_AddressType_name, NewAddressRequest_AddressType_value) } @@ -990,20 +1058,25 @@ const _ = grpc.SupportPackageIsVersion3 type LightningClient interface { WalletBalance(ctx context.Context, in *WalletBalanceRequest, opts ...grpc.CallOption) (*WalletBalanceResponse, error) ChannelBalance(ctx context.Context, in *ChannelBalanceRequest, opts ...grpc.CallOption) (*ChannelBalanceResponse, error) - SendMany(ctx context.Context, in *SendManyRequest, opts ...grpc.CallOption) (*SendManyResponse, error) + GetTransactions(ctx context.Context, in *GetTransactionsRequest, opts ...grpc.CallOption) (*TransactionDetails, error) SendCoins(ctx context.Context, in *SendCoinsRequest, opts ...grpc.CallOption) (*SendCoinsResponse, error) + SubscribeTransactions(ctx context.Context, in *GetTransactionsRequest, opts ...grpc.CallOption) (Lightning_SubscribeTransactionsClient, error) + SendMany(ctx context.Context, in *SendManyRequest, opts ...grpc.CallOption) (*SendManyResponse, error) NewAddress(ctx context.Context, in *NewAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error) + NewWitnessAddress(ctx context.Context, in *NewWitnessAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error) ConnectPeer(ctx context.Context, in *ConnectPeerRequest, opts ...grpc.CallOption) (*ConnectPeerResponse, error) ListPeers(ctx context.Context, in *ListPeersRequest, opts ...grpc.CallOption) (*ListPeersResponse, error) GetInfo(ctx context.Context, in *GetInfoRequest, opts ...grpc.CallOption) (*GetInfoResponse, error) - OpenChannel(ctx context.Context, in *OpenChannelRequest, opts ...grpc.CallOption) (Lightning_OpenChannelClient, error) - CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (Lightning_CloseChannelClient, error) + // TODO(roasbeef): merge with below with bool? PendingChannels(ctx context.Context, in *PendingChannelRequest, opts ...grpc.CallOption) (*PendingChannelResponse, error) ListChannels(ctx context.Context, in *ListChannelsRequest, opts ...grpc.CallOption) (*ListChannelsResponse, error) + OpenChannel(ctx context.Context, in *OpenChannelRequest, opts ...grpc.CallOption) (Lightning_OpenChannelClient, error) + CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (Lightning_CloseChannelClient, error) SendPayment(ctx context.Context, opts ...grpc.CallOption) (Lightning_SendPaymentClient, error) AddInvoice(ctx context.Context, in *Invoice, opts ...grpc.CallOption) (*AddInvoiceResponse, error) - LookupInvoice(ctx context.Context, in *PaymentHash, opts ...grpc.CallOption) (*Invoice, error) ListInvoices(ctx context.Context, in *ListInvoiceRequest, opts ...grpc.CallOption) (*ListInvoiceResponse, error) + LookupInvoice(ctx context.Context, in *PaymentHash, opts ...grpc.CallOption) (*Invoice, error) + SubscribeInvoices(ctx context.Context, in *InvoiceSubscription, opts ...grpc.CallOption) (Lightning_SubscribeInvoicesClient, error) ShowRoutingTable(ctx context.Context, in *ShowRoutingTableRequest, opts ...grpc.CallOption) (*ShowRoutingTableResponse, error) } @@ -1033,9 +1106,9 @@ func (c *lightningClient) ChannelBalance(ctx context.Context, in *ChannelBalance return out, nil } -func (c *lightningClient) SendMany(ctx context.Context, in *SendManyRequest, opts ...grpc.CallOption) (*SendManyResponse, error) { - out := new(SendManyResponse) - err := grpc.Invoke(ctx, "/lnrpc.Lightning/SendMany", in, out, c.cc, opts...) +func (c *lightningClient) GetTransactions(ctx context.Context, in *GetTransactionsRequest, opts ...grpc.CallOption) (*TransactionDetails, error) { + out := new(TransactionDetails) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/GetTransactions", in, out, c.cc, opts...) if err != nil { return nil, err } @@ -1051,6 +1124,47 @@ func (c *lightningClient) SendCoins(ctx context.Context, in *SendCoinsRequest, o return out, nil } +func (c *lightningClient) SubscribeTransactions(ctx context.Context, in *GetTransactionsRequest, opts ...grpc.CallOption) (Lightning_SubscribeTransactionsClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[0], c.cc, "/lnrpc.Lightning/SubscribeTransactions", opts...) + if err != nil { + return nil, err + } + x := &lightningSubscribeTransactionsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Lightning_SubscribeTransactionsClient interface { + Recv() (*Transaction, error) + grpc.ClientStream +} + +type lightningSubscribeTransactionsClient struct { + grpc.ClientStream +} + +func (x *lightningSubscribeTransactionsClient) Recv() (*Transaction, error) { + m := new(Transaction) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *lightningClient) SendMany(ctx context.Context, in *SendManyRequest, opts ...grpc.CallOption) (*SendManyResponse, error) { + out := new(SendManyResponse) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/SendMany", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *lightningClient) NewAddress(ctx context.Context, in *NewAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error) { out := new(NewAddressResponse) err := grpc.Invoke(ctx, "/lnrpc.Lightning/NewAddress", in, out, c.cc, opts...) @@ -1060,6 +1174,15 @@ func (c *lightningClient) NewAddress(ctx context.Context, in *NewAddressRequest, return out, nil } +func (c *lightningClient) NewWitnessAddress(ctx context.Context, in *NewWitnessAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error) { + out := new(NewAddressResponse) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/NewWitnessAddress", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *lightningClient) ConnectPeer(ctx context.Context, in *ConnectPeerRequest, opts ...grpc.CallOption) (*ConnectPeerResponse, error) { out := new(ConnectPeerResponse) err := grpc.Invoke(ctx, "/lnrpc.Lightning/ConnectPeer", in, out, c.cc, opts...) @@ -1087,8 +1210,26 @@ func (c *lightningClient) GetInfo(ctx context.Context, in *GetInfoRequest, opts return out, nil } +func (c *lightningClient) PendingChannels(ctx context.Context, in *PendingChannelRequest, opts ...grpc.CallOption) (*PendingChannelResponse, error) { + out := new(PendingChannelResponse) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/PendingChannels", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *lightningClient) ListChannels(ctx context.Context, in *ListChannelsRequest, opts ...grpc.CallOption) (*ListChannelsResponse, error) { + out := new(ListChannelsResponse) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListChannels", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *lightningClient) OpenChannel(ctx context.Context, in *OpenChannelRequest, opts ...grpc.CallOption) (Lightning_OpenChannelClient, error) { - stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[0], c.cc, "/lnrpc.Lightning/OpenChannel", opts...) + stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[1], c.cc, "/lnrpc.Lightning/OpenChannel", opts...) if err != nil { return nil, err } @@ -1120,7 +1261,7 @@ func (x *lightningOpenChannelClient) Recv() (*OpenStatusUpdate, error) { } func (c *lightningClient) CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (Lightning_CloseChannelClient, error) { - stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[1], c.cc, "/lnrpc.Lightning/CloseChannel", opts...) + stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[2], c.cc, "/lnrpc.Lightning/CloseChannel", opts...) if err != nil { return nil, err } @@ -1151,26 +1292,8 @@ func (x *lightningCloseChannelClient) Recv() (*CloseStatusUpdate, error) { return m, nil } -func (c *lightningClient) PendingChannels(ctx context.Context, in *PendingChannelRequest, opts ...grpc.CallOption) (*PendingChannelResponse, error) { - out := new(PendingChannelResponse) - err := grpc.Invoke(ctx, "/lnrpc.Lightning/PendingChannels", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *lightningClient) ListChannels(ctx context.Context, in *ListChannelsRequest, opts ...grpc.CallOption) (*ListChannelsResponse, error) { - out := new(ListChannelsResponse) - err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListChannels", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *lightningClient) SendPayment(ctx context.Context, opts ...grpc.CallOption) (Lightning_SendPaymentClient, error) { - stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[2], c.cc, "/lnrpc.Lightning/SendPayment", opts...) + stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[3], c.cc, "/lnrpc.Lightning/SendPayment", opts...) if err != nil { return nil, err } @@ -1209,6 +1332,15 @@ func (c *lightningClient) AddInvoice(ctx context.Context, in *Invoice, opts ...g return out, nil } +func (c *lightningClient) ListInvoices(ctx context.Context, in *ListInvoiceRequest, opts ...grpc.CallOption) (*ListInvoiceResponse, error) { + out := new(ListInvoiceResponse) + err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListInvoices", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *lightningClient) LookupInvoice(ctx context.Context, in *PaymentHash, opts ...grpc.CallOption) (*Invoice, error) { out := new(Invoice) err := grpc.Invoke(ctx, "/lnrpc.Lightning/LookupInvoice", in, out, c.cc, opts...) @@ -1218,13 +1350,36 @@ func (c *lightningClient) LookupInvoice(ctx context.Context, in *PaymentHash, op return out, nil } -func (c *lightningClient) ListInvoices(ctx context.Context, in *ListInvoiceRequest, opts ...grpc.CallOption) (*ListInvoiceResponse, error) { - out := new(ListInvoiceResponse) - err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListInvoices", in, out, c.cc, opts...) +func (c *lightningClient) SubscribeInvoices(ctx context.Context, in *InvoiceSubscription, opts ...grpc.CallOption) (Lightning_SubscribeInvoicesClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[4], c.cc, "/lnrpc.Lightning/SubscribeInvoices", opts...) if err != nil { return nil, err } - return out, nil + x := &lightningSubscribeInvoicesClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Lightning_SubscribeInvoicesClient interface { + Recv() (*Invoice, error) + grpc.ClientStream +} + +type lightningSubscribeInvoicesClient struct { + grpc.ClientStream +} + +func (x *lightningSubscribeInvoicesClient) Recv() (*Invoice, error) { + m := new(Invoice) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } func (c *lightningClient) ShowRoutingTable(ctx context.Context, in *ShowRoutingTableRequest, opts ...grpc.CallOption) (*ShowRoutingTableResponse, error) { @@ -1241,20 +1396,25 @@ func (c *lightningClient) ShowRoutingTable(ctx context.Context, in *ShowRoutingT type LightningServer interface { WalletBalance(context.Context, *WalletBalanceRequest) (*WalletBalanceResponse, error) ChannelBalance(context.Context, *ChannelBalanceRequest) (*ChannelBalanceResponse, error) - SendMany(context.Context, *SendManyRequest) (*SendManyResponse, error) + GetTransactions(context.Context, *GetTransactionsRequest) (*TransactionDetails, error) SendCoins(context.Context, *SendCoinsRequest) (*SendCoinsResponse, error) + SubscribeTransactions(*GetTransactionsRequest, Lightning_SubscribeTransactionsServer) error + SendMany(context.Context, *SendManyRequest) (*SendManyResponse, error) NewAddress(context.Context, *NewAddressRequest) (*NewAddressResponse, error) + NewWitnessAddress(context.Context, *NewWitnessAddressRequest) (*NewAddressResponse, error) ConnectPeer(context.Context, *ConnectPeerRequest) (*ConnectPeerResponse, error) ListPeers(context.Context, *ListPeersRequest) (*ListPeersResponse, error) GetInfo(context.Context, *GetInfoRequest) (*GetInfoResponse, error) - OpenChannel(*OpenChannelRequest, Lightning_OpenChannelServer) error - CloseChannel(*CloseChannelRequest, Lightning_CloseChannelServer) error + // TODO(roasbeef): merge with below with bool? PendingChannels(context.Context, *PendingChannelRequest) (*PendingChannelResponse, error) ListChannels(context.Context, *ListChannelsRequest) (*ListChannelsResponse, error) + OpenChannel(*OpenChannelRequest, Lightning_OpenChannelServer) error + CloseChannel(*CloseChannelRequest, Lightning_CloseChannelServer) error SendPayment(Lightning_SendPaymentServer) error AddInvoice(context.Context, *Invoice) (*AddInvoiceResponse, error) - LookupInvoice(context.Context, *PaymentHash) (*Invoice, error) ListInvoices(context.Context, *ListInvoiceRequest) (*ListInvoiceResponse, error) + LookupInvoice(context.Context, *PaymentHash) (*Invoice, error) + SubscribeInvoices(*InvoiceSubscription, Lightning_SubscribeInvoicesServer) error ShowRoutingTable(context.Context, *ShowRoutingTableRequest) (*ShowRoutingTableResponse, error) } @@ -1298,20 +1458,20 @@ func _Lightning_ChannelBalance_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Lightning_SendMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SendManyRequest) +func _Lightning_GetTransactions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTransactionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(LightningServer).SendMany(ctx, in) + return srv.(LightningServer).GetTransactions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/lnrpc.Lightning/SendMany", + FullMethod: "/lnrpc.Lightning/GetTransactions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LightningServer).SendMany(ctx, req.(*SendManyRequest)) + return srv.(LightningServer).GetTransactions(ctx, req.(*GetTransactionsRequest)) } return interceptor(ctx, in, info, handler) } @@ -1334,6 +1494,45 @@ func _Lightning_SendCoins_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Lightning_SubscribeTransactions_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GetTransactionsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(LightningServer).SubscribeTransactions(m, &lightningSubscribeTransactionsServer{stream}) +} + +type Lightning_SubscribeTransactionsServer interface { + Send(*Transaction) error + grpc.ServerStream +} + +type lightningSubscribeTransactionsServer struct { + grpc.ServerStream +} + +func (x *lightningSubscribeTransactionsServer) Send(m *Transaction) error { + return x.ServerStream.SendMsg(m) +} + +func _Lightning_SendMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SendManyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).SendMany(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/SendMany", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).SendMany(ctx, req.(*SendManyRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Lightning_NewAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewAddressRequest) if err := dec(in); err != nil { @@ -1352,6 +1551,24 @@ func _Lightning_NewAddress_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Lightning_NewWitnessAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewWitnessAddressRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).NewWitnessAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/NewWitnessAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).NewWitnessAddress(ctx, req.(*NewWitnessAddressRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Lightning_ConnectPeer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ConnectPeerRequest) if err := dec(in); err != nil { @@ -1406,6 +1623,42 @@ func _Lightning_GetInfo_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Lightning_PendingChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PendingChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).PendingChannels(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/PendingChannels", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).PendingChannels(ctx, req.(*PendingChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Lightning_ListChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListChannelsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).ListChannels(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/ListChannels", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).ListChannels(ctx, req.(*ListChannelsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Lightning_OpenChannel_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(OpenChannelRequest) if err := stream.RecvMsg(m); err != nil { @@ -1448,42 +1701,6 @@ func (x *lightningCloseChannelServer) Send(m *CloseStatusUpdate) error { return x.ServerStream.SendMsg(m) } -func _Lightning_PendingChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PendingChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(LightningServer).PendingChannels(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/lnrpc.Lightning/PendingChannels", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LightningServer).PendingChannels(ctx, req.(*PendingChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Lightning_ListChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListChannelsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(LightningServer).ListChannels(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/lnrpc.Lightning/ListChannels", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LightningServer).ListChannels(ctx, req.(*ListChannelsRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Lightning_SendPayment_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(LightningServer).SendPayment(&lightningSendPaymentServer{stream}) } @@ -1528,6 +1745,24 @@ func _Lightning_AddInvoice_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Lightning_ListInvoices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListInvoiceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).ListInvoices(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/ListInvoices", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).ListInvoices(ctx, req.(*ListInvoiceRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Lightning_LookupInvoice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PaymentHash) if err := dec(in); err != nil { @@ -1546,22 +1781,25 @@ func _Lightning_LookupInvoice_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Lightning_ListInvoices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListInvoiceRequest) - if err := dec(in); err != nil { - return nil, err +func _Lightning_SubscribeInvoices_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(InvoiceSubscription) + if err := stream.RecvMsg(m); err != nil { + return err } - if interceptor == nil { - return srv.(LightningServer).ListInvoices(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/lnrpc.Lightning/ListInvoices", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LightningServer).ListInvoices(ctx, req.(*ListInvoiceRequest)) - } - return interceptor(ctx, in, info, handler) + return srv.(LightningServer).SubscribeInvoices(m, &lightningSubscribeInvoicesServer{stream}) +} + +type Lightning_SubscribeInvoicesServer interface { + Send(*Invoice) error + grpc.ServerStream +} + +type lightningSubscribeInvoicesServer struct { + grpc.ServerStream +} + +func (x *lightningSubscribeInvoicesServer) Send(m *Invoice) error { + return x.ServerStream.SendMsg(m) } func _Lightning_ShowRoutingTable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -1595,17 +1833,25 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ Handler: _Lightning_ChannelBalance_Handler, }, { - MethodName: "SendMany", - Handler: _Lightning_SendMany_Handler, + MethodName: "GetTransactions", + Handler: _Lightning_GetTransactions_Handler, }, { MethodName: "SendCoins", Handler: _Lightning_SendCoins_Handler, }, + { + MethodName: "SendMany", + Handler: _Lightning_SendMany_Handler, + }, { MethodName: "NewAddress", Handler: _Lightning_NewAddress_Handler, }, + { + MethodName: "NewWitnessAddress", + Handler: _Lightning_NewWitnessAddress_Handler, + }, { MethodName: "ConnectPeer", Handler: _Lightning_ConnectPeer_Handler, @@ -1630,20 +1876,25 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ MethodName: "AddInvoice", Handler: _Lightning_AddInvoice_Handler, }, - { - MethodName: "LookupInvoice", - Handler: _Lightning_LookupInvoice_Handler, - }, { MethodName: "ListInvoices", Handler: _Lightning_ListInvoices_Handler, }, + { + MethodName: "LookupInvoice", + Handler: _Lightning_LookupInvoice_Handler, + }, { MethodName: "ShowRoutingTable", Handler: _Lightning_ShowRoutingTable_Handler, }, }, Streams: []grpc.StreamDesc{ + { + StreamName: "SubscribeTransactions", + Handler: _Lightning_SubscribeTransactions_Handler, + ServerStreams: true, + }, { StreamName: "OpenChannel", Handler: _Lightning_OpenChannel_Handler, @@ -1660,6 +1911,11 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ ServerStreams: true, ClientStreams: true, }, + { + StreamName: "SubscribeInvoices", + Handler: _Lightning_SubscribeInvoices_Handler, + ServerStreams: true, + }, }, Metadata: fileDescriptor0, } @@ -1667,117 +1923,143 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1781 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x58, 0xdd, 0x6e, 0x13, 0xd7, - 0x16, 0xc6, 0xb1, 0x1d, 0xdb, 0xcb, 0x3f, 0x71, 0x76, 0xfe, 0x1c, 0x43, 0xce, 0xe1, 0x8c, 0x00, - 0x05, 0x04, 0x01, 0xcc, 0x91, 0x40, 0xa0, 0xc3, 0x51, 0x08, 0x29, 0x49, 0x31, 0x49, 0x8a, 0x83, - 0x50, 0xaf, 0xa6, 0x93, 0xf1, 0x4e, 0x3c, 0xca, 0x78, 0x66, 0xea, 0xd9, 0x4e, 0x70, 0x1f, 0xa0, - 0x0f, 0xd0, 0xab, 0x4a, 0x7d, 0x81, 0xaa, 0xaa, 0xaa, 0xbe, 0x47, 0xef, 0xfa, 0x44, 0x5d, 0xfb, - 0x67, 0xfe, 0x27, 0x48, 0xbd, 0xe8, 0x95, 0x35, 0x6b, 0xaf, 0xbd, 0xfe, 0xf6, 0xb7, 0xbf, 0xb5, - 0xb6, 0xa1, 0x36, 0xf1, 0xcc, 0x2d, 0x6f, 0xe2, 0x32, 0x97, 0x94, 0x6d, 0x07, 0x3f, 0xb4, 0xaf, - 0xa0, 0x3e, 0xa0, 0xce, 0xf0, 0x3d, 0xfd, 0x76, 0x4a, 0x7d, 0x46, 0x1a, 0x50, 0x1a, 0xe2, 0x6f, - 0xa7, 0x70, 0xb3, 0xb0, 0xd9, 0x20, 0x75, 0x28, 0x1a, 0x63, 0xd6, 0x99, 0xc3, 0x8f, 0x22, 0x59, - 0x86, 0x86, 0x67, 0xcc, 0xc6, 0xd4, 0x61, 0xfa, 0xc8, 0xf0, 0x47, 0x9d, 0xa2, 0x50, 0x59, 0x84, - 0xda, 0xa9, 0xe1, 0x33, 0xdd, 0x47, 0x23, 0x9d, 0x12, 0x8a, 0xaa, 0x5a, 0x0b, 0x1a, 0xd2, 0xa4, - 0xef, 0xb9, 0x8e, 0x4f, 0xb5, 0xe7, 0xd0, 0xd8, 0x19, 0x19, 0x8e, 0x43, 0xed, 0x23, 0xd7, 0x72, - 0x18, 0x37, 0x74, 0x3a, 0x75, 0x86, 0x96, 0x73, 0xa6, 0xb3, 0x4f, 0xd6, 0x50, 0xf9, 0x42, 0xa9, - 0x3b, 0x65, 0xde, 0x94, 0xe9, 0x96, 0x33, 0xa4, 0x9f, 0x84, 0xd3, 0xa6, 0xf6, 0x5f, 0x68, 0xf7, - 0xad, 0xb3, 0x11, 0x73, 0x50, 0x7b, 0x7b, 0x38, 0x9c, 0x50, 0xdf, 0x27, 0x04, 0xc0, 0x9b, 0x9e, - 0xbc, 0xa5, 0xb3, 0x3d, 0x1e, 0x06, 0xdf, 0x5d, 0xe3, 0x71, 0x8f, 0x5c, 0x5f, 0x86, 0x5a, 0xd3, - 0xbe, 0x2f, 0xc0, 0x02, 0x0f, 0xe1, 0x9d, 0xe1, 0xcc, 0x82, 0xcc, 0x5e, 0x42, 0x83, 0x1b, 0x38, - 0x76, 0xb7, 0xc7, 0xee, 0xd4, 0xe1, 0x19, 0x16, 0x37, 0xeb, 0xbd, 0xcd, 0x2d, 0x51, 0x86, 0xad, - 0x94, 0xf6, 0x56, 0x5c, 0x75, 0xd7, 0x61, 0x93, 0x59, 0xf7, 0x09, 0x2c, 0x66, 0x84, 0xbc, 0x40, - 0xe7, 0x74, 0xa6, 0x62, 0x68, 0x42, 0xf9, 0xc2, 0xb0, 0xa7, 0x54, 0xd6, 0xeb, 0xf9, 0xdc, 0xb3, - 0x82, 0x76, 0x13, 0xda, 0x91, 0x65, 0x59, 0x0e, 0x1e, 0x6a, 0x98, 0x76, 0x4d, 0x7b, 0x24, 0x35, - 0x76, 0xb0, 0x32, 0x7e, 0xec, 0x10, 0x0c, 0x74, 0xa5, 0xcc, 0xb6, 0x60, 0xde, 0x90, 0x21, 0x0b, - 0xbb, 0xda, 0x7f, 0x60, 0x31, 0xb6, 0x23, 0xd7, 0xe8, 0x8f, 0x05, 0x58, 0x3c, 0xa0, 0x97, 0xaa, - 0x60, 0x81, 0xd9, 0x1e, 0xea, 0xcc, 0x3c, 0x2a, 0x74, 0x5a, 0xbd, 0x5b, 0x2a, 0xf3, 0x8c, 0xde, - 0x96, 0xfa, 0x3c, 0x46, 0x5d, 0xed, 0x10, 0xea, 0xb1, 0x4f, 0xb2, 0x06, 0x4b, 0x1f, 0xf7, 0x8f, - 0x0f, 0x76, 0x07, 0x03, 0xfd, 0xe8, 0xc3, 0xab, 0xb7, 0xbb, 0x5f, 0xeb, 0x7b, 0xdb, 0x83, 0xbd, - 0xf6, 0x35, 0xb2, 0x0a, 0x04, 0xa5, 0xc7, 0xbb, 0xaf, 0x13, 0xf2, 0x02, 0x59, 0x80, 0x7a, 0x5c, - 0x30, 0xa7, 0xdd, 0x46, 0xc5, 0x98, 0x47, 0x15, 0xfe, 0x02, 0x54, 0x0c, 0x29, 0x52, 0x19, 0xbc, - 0x00, 0xb2, 0xe3, 0x22, 0x64, 0x4c, 0x76, 0x44, 0xe9, 0x24, 0xc8, 0xe0, 0x76, 0xac, 0x30, 0xf5, - 0xde, 0x9a, 0xca, 0x20, 0x0d, 0x10, 0xed, 0x0e, 0x2c, 0x25, 0x36, 0x47, 0x4e, 0x3c, 0xfc, 0xd6, - 0x55, 0x99, 0xca, 0x9a, 0x07, 0xa5, 0xbd, 0xe3, 0xfe, 0x0e, 0x69, 0x43, 0xd5, 0x72, 0x4c, 0x77, - 0x8c, 0x26, 0xc4, 0x4a, 0x35, 0x5d, 0x73, 0x8e, 0x72, 0x8e, 0x79, 0xdd, 0x76, 0xcd, 0x73, 0x05, - 0xfc, 0x75, 0x58, 0xa4, 0x9f, 0x3c, 0x6b, 0x62, 0x30, 0xcb, 0x75, 0xf4, 0x11, 0xe5, 0x41, 0x88, - 0x0b, 0xd0, 0x24, 0x1d, 0x68, 0x4f, 0xe8, 0x85, 0x6b, 0xca, 0xa5, 0x21, 0xb5, 0x8d, 0x59, 0xa7, - 0x2c, 0xe0, 0xfc, 0x67, 0x01, 0x9a, 0xdb, 0x26, 0xb3, 0x2e, 0xa8, 0xba, 0x11, 0x64, 0x05, 0x9a, - 0x13, 0x3a, 0x76, 0x19, 0xd5, 0x11, 0xd3, 0x11, 0x96, 0x50, 0x6c, 0x4a, 0x0d, 0xdd, 0xe3, 0x97, - 0x46, 0x02, 0x9b, 0x47, 0x6a, 0x1a, 0x9e, 0x61, 0x5a, 0x6c, 0x26, 0xc2, 0x28, 0x72, 0x45, 0x0c, - 0xca, 0xb0, 0xf5, 0x13, 0xc3, 0x36, 0x1c, 0x93, 0x8a, 0x10, 0x8a, 0x78, 0x1e, 0x2d, 0x65, 0x36, - 0x90, 0x97, 0x85, 0x1c, 0xa3, 0x9e, 0x62, 0x2d, 0x18, 0xb3, 0xe9, 0x30, 0x5c, 0x9a, 0x17, 0x4b, - 0x1a, 0x34, 0x3d, 0x2a, 0xaf, 0xe5, 0x88, 0xd9, 0xa6, 0xdf, 0xa9, 0x88, 0x1b, 0x52, 0x57, 0x55, - 0x16, 0x95, 0x5a, 0x82, 0xba, 0x33, 0x1d, 0xeb, 0x53, 0x6f, 0x68, 0x30, 0xea, 0x77, 0xaa, 0xb8, - 0xb1, 0xa4, 0xad, 0xc0, 0x52, 0xdf, 0xf2, 0x99, 0xca, 0x28, 0x80, 0x91, 0xf6, 0x12, 0x96, 0x93, - 0x62, 0x75, 0x0c, 0x77, 0x30, 0x07, 0x25, 0xeb, 0xd4, 0x84, 0x8b, 0x65, 0xe5, 0x22, 0x51, 0x19, - 0xed, 0xa7, 0x02, 0x94, 0xf8, 0xf9, 0x71, 0x66, 0xb0, 0x83, 0x23, 0x0e, 0x0e, 0xaf, 0x16, 0x3f, - 0x4d, 0x5e, 0x9b, 0x72, 0x1c, 0x43, 0x45, 0xa1, 0x81, 0x3c, 0x71, 0x32, 0xc3, 0x30, 0x39, 0x37, - 0xc9, 0xa3, 0x29, 0x45, 0xb2, 0x09, 0x35, 0x2f, 0x44, 0x4d, 0x4a, 0xbc, 0xa8, 0xbe, 0xc1, 0xa4, - 0x96, 0x2c, 0x85, 0x92, 0x08, 0x9d, 0x8a, 0x90, 0xa0, 0x71, 0xcb, 0x39, 0x41, 0x44, 0x0c, 0x45, - 0xd2, 0x55, 0x8d, 0x70, 0x62, 0xf2, 0x05, 0xc0, 0xc2, 0x8c, 0x1f, 0xc2, 0x62, 0x4c, 0xa6, 0xd2, - 0xed, 0x42, 0x99, 0xc7, 0xe9, 0x2b, 0xc2, 0x09, 0xca, 0xc9, 0x95, 0xb4, 0x36, 0xb4, 0xde, 0x50, - 0xb6, 0xef, 0x9c, 0xba, 0x81, 0x89, 0x9f, 0x91, 0xb9, 0x42, 0x91, 0xb2, 0x90, 0x9f, 0x3f, 0x82, - 0xcc, 0x1a, 0x62, 0xc8, 0x08, 0x05, 0x3d, 0xc8, 0x5b, 0x82, 0x64, 0x0d, 0x16, 0xc2, 0x15, 0x05, - 0x2a, 0x59, 0x90, 0x1b, 0xb0, 0xcc, 0x4f, 0x2f, 0x38, 0xe5, 0xf0, 0x14, 0x24, 0x6a, 0xaf, 0xc3, - 0x12, 0x5f, 0x35, 0xc4, 0x21, 0x44, 0x8b, 0x02, 0xb8, 0xfc, 0x02, 0xc8, 0xad, 0x3c, 0x93, 0x79, - 0x81, 0xe5, 0x0f, 0xe2, 0x8a, 0x9e, 0x5a, 0x93, 0xb1, 0xc0, 0xf9, 0x07, 0x81, 0x09, 0xae, 0x78, - 0xc2, 0x6f, 0x89, 0xee, 0x8f, 0x8c, 0x88, 0xd9, 0xa5, 0x48, 0x5d, 0x12, 0x79, 0x5c, 0x88, 0x50, - 0x6e, 0xd1, 0x44, 0x13, 0xbe, 0x6e, 0xd3, 0x53, 0x26, 0x82, 0x6c, 0x6a, 0xff, 0x87, 0x45, 0x85, - 0x80, 0x43, 0x0c, 0x54, 0x59, 0xbd, 0x97, 0xbe, 0x0e, 0x92, 0x01, 0x96, 0x54, 0x31, 0xe3, 0xed, - 0x45, 0x50, 0x87, 0xfc, 0xde, 0xb1, 0x5d, 0x9f, 0x2a, 0x0b, 0x18, 0x84, 0x89, 0x9f, 0xa9, 0xa6, - 0x83, 0xc7, 0xea, 0x4f, 0x4d, 0x33, 0xa8, 0x5d, 0x55, 0x1b, 0x22, 0x75, 0xf0, 0x5d, 0xca, 0x42, - 0x40, 0x3c, 0x7f, 0xc3, 0x3f, 0x87, 0x18, 0xb3, 0xc6, 0x54, 0xb7, 0xad, 0xb1, 0x15, 0xf0, 0x07, - 0xb6, 0x86, 0x53, 0x77, 0x82, 0x57, 0xad, 0x28, 0xbc, 0xfc, 0x8e, 0xfc, 0x2c, 0xdc, 0x0c, 0x98, - 0xc1, 0xa6, 0xbe, 0x0a, 0xf1, 0x01, 0x3a, 0xe1, 0xc2, 0xe0, 0x80, 0x94, 0x93, 0xe5, 0x10, 0x31, - 0x42, 0x2a, 0x95, 0xf7, 0xae, 0x91, 0xc7, 0x98, 0x51, 0xac, 0xfe, 0xc2, 0x53, 0xbd, 0xb7, 0x1e, - 0x84, 0x94, 0x39, 0x1a, 0xdc, 0xf2, 0x10, 0x80, 0xa7, 0xa1, 0x0b, 0x37, 0x22, 0x96, 0xd8, 0x86, - 0x4c, 0xcd, 0xf6, 0xae, 0xbd, 0xaa, 0xc2, 0xbc, 0xbc, 0xeb, 0xda, 0x06, 0x34, 0x13, 0x01, 0x24, - 0x3a, 0x4e, 0x43, 0xfb, 0xa5, 0x00, 0x84, 0x9f, 0x57, 0xaa, 0x6e, 0x78, 0xc8, 0xcc, 0x98, 0x9c, - 0x51, 0xa6, 0x27, 0x98, 0x97, 0xf3, 0x88, 0x92, 0x3b, 0xee, 0x50, 0x36, 0xcc, 0x06, 0x87, 0xa7, - 0xa4, 0xb2, 0x60, 0x3a, 0x50, 0x14, 0x2c, 0x89, 0x6e, 0x03, 0x56, 0x14, 0xa3, 0xa5, 0x96, 0x25, - 0xe1, 0x21, 0xe8, 0x91, 0xc1, 0xc7, 0x96, 0xef, 0x73, 0xce, 0xf5, 0xad, 0xef, 0x02, 0xc6, 0x53, - 0xc8, 0x15, 0x38, 0x53, 0xc8, 0xfd, 0xb5, 0x00, 0x6d, 0x1e, 0x6c, 0xa2, 0xfa, 0xf7, 0xb1, 0x9c, - 0xbc, 0x36, 0xff, 0x58, 0xf1, 0x1f, 0x40, 0x4d, 0x38, 0x70, 0xd1, 0x83, 0xaa, 0x7d, 0x27, 0x59, - 0xfb, 0x08, 0xf0, 0x89, 0xd2, 0xff, 0x0f, 0x56, 0x94, 0xfb, 0x54, 0x75, 0x6f, 0xc1, 0xbc, 0x2f, - 0x52, 0x50, 0x2d, 0x7d, 0x39, 0x69, 0x4e, 0xa6, 0xa7, 0xfd, 0x36, 0x07, 0xab, 0xe9, 0xfd, 0x8a, - 0x59, 0xbe, 0x80, 0x76, 0x86, 0x0c, 0x24, 0x4d, 0xdd, 0x4f, 0xe6, 0x9d, 0xda, 0x98, 0x12, 0x77, - 0xff, 0x28, 0x40, 0x2b, 0x29, 0xca, 0x34, 0xdb, 0x0c, 0x8b, 0xcd, 0xe5, 0xf7, 0xb9, 0x62, 0xa6, - 0xcf, 0x95, 0xf2, 0xfb, 0x5c, 0xf9, 0x8a, 0x3e, 0x37, 0x1f, 0x0c, 0xab, 0x89, 0xeb, 0x5e, 0x11, - 0x66, 0xa3, 0x82, 0x55, 0x3f, 0x53, 0xb0, 0xfb, 0xb0, 0xfc, 0xd1, 0xb0, 0x6d, 0xca, 0x5e, 0x49, - 0x93, 0x41, 0xb9, 0xd1, 0xe6, 0xa5, 0xc5, 0x1c, 0x24, 0x0b, 0xdd, 0x75, 0x6c, 0xd9, 0xa9, 0xab, - 0xda, 0x26, 0xac, 0xa4, 0xb4, 0xa3, 0x71, 0x23, 0x88, 0x89, 0x6b, 0x16, 0xb4, 0x35, 0x58, 0x51, - 0x8e, 0x92, 0x86, 0xb5, 0xbb, 0xb0, 0x9a, 0x5e, 0xc8, 0xb7, 0x51, 0xd4, 0xbe, 0x81, 0xf6, 0x7b, - 0x1c, 0x93, 0x31, 0xaf, 0x63, 0xe3, 0xc4, 0xa6, 0x7d, 0xcb, 0x39, 0xe7, 0x43, 0xa8, 0x35, 0x7c, - 0xac, 0xda, 0x82, 0xf8, 0xe8, 0x45, 0xe3, 0x02, 0x9f, 0xa9, 0x3f, 0x5b, 0x58, 0x1c, 0x75, 0x2e, - 0x25, 0x2f, 0x97, 0x45, 0x94, 0xeb, 0xb0, 0x36, 0x18, 0xb9, 0x97, 0x71, 0x2f, 0x41, 0x9c, 0xbb, - 0xd0, 0xc9, 0x2e, 0xa9, 0x48, 0xef, 0xc6, 0xba, 0xba, 0x84, 0x50, 0x30, 0x9e, 0xa5, 0xe3, 0xd5, - 0x6c, 0xa8, 0xec, 0x3b, 0x17, 0xae, 0x65, 0x0a, 0x12, 0x19, 0xe3, 0xf1, 0x45, 0x2d, 0x1d, 0x5b, - 0x2e, 0xb5, 0x3c, 0xa6, 0x18, 0x01, 0xa9, 0x74, 0xa2, 0x7b, 0x13, 0x6a, 0x8d, 0x8d, 0x33, 0xaa, - 0xe6, 0x2e, 0x8c, 0x77, 0x22, 0x1f, 0x20, 0x25, 0xf1, 0x1d, 0x4e, 0xdd, 0xe5, 0xa0, 0x51, 0xab, - 0xf1, 0x46, 0x20, 0xa1, 0xaa, 0xdd, 0x02, 0x82, 0x73, 0xa1, 0x72, 0x18, 0x86, 0x1b, 0x59, 0x91, - 0xfc, 0xb5, 0x81, 0x73, 0xaa, 0x7c, 0xdc, 0xf0, 0x47, 0x45, 0x66, 0xf9, 0x1e, 0x10, 0xde, 0xd9, - 0x43, 0x2b, 0x21, 0x20, 0x82, 0xeb, 0x13, 0x03, 0xc4, 0x53, 0x39, 0x0e, 0xa5, 0x3d, 0xde, 0xe4, - 0x43, 0xa6, 0x10, 0x05, 0x05, 0x6a, 0xa9, 0x02, 0x29, 0xcd, 0x7b, 0x3d, 0x68, 0x26, 0x80, 0x48, - 0x2a, 0x50, 0xdc, 0xee, 0xf7, 0x71, 0xba, 0xae, 0x43, 0xe5, 0xf0, 0x68, 0xf7, 0x60, 0xff, 0xe0, - 0x0d, 0x8e, 0xd4, 0xf8, 0xb1, 0xd3, 0x3f, 0x1c, 0xf0, 0x8f, 0xb9, 0xde, 0x0f, 0x35, 0xa8, 0x85, - 0xf3, 0x2f, 0xf9, 0x12, 0x9a, 0x09, 0x2c, 0x92, 0xeb, 0xca, 0x45, 0x1e, 0x9e, 0xbb, 0x37, 0xf2, - 0x17, 0x55, 0xbc, 0xef, 0xa0, 0x95, 0x04, 0x25, 0xb9, 0x91, 0xbc, 0x2d, 0x29, 0x6b, 0x1b, 0x57, - 0xac, 0x2a, 0x73, 0x2f, 0xa0, 0x1a, 0xbc, 0x84, 0xc8, 0x6a, 0xfe, 0xa3, 0xab, 0xbb, 0x96, 0x91, - 0xab, 0xcd, 0x2f, 0xa1, 0x16, 0x3e, 0x79, 0x48, 0x5c, 0x2b, 0xfe, 0x6c, 0xea, 0x76, 0xb2, 0x0b, - 0x6a, 0xff, 0x36, 0x40, 0xf4, 0xe8, 0x20, 0x9d, 0xab, 0x5e, 0x3e, 0xdd, 0xf5, 0x9c, 0x15, 0x65, - 0xe2, 0x35, 0xd4, 0x63, 0x6f, 0x0a, 0x12, 0x63, 0xfa, 0xd4, 0x23, 0xa5, 0xdb, 0xcd, 0x5b, 0x8a, - 0x12, 0x09, 0x27, 0x44, 0x12, 0xbd, 0x5f, 0x92, 0x73, 0x64, 0x98, 0x48, 0x76, 0x98, 0x7c, 0x06, - 0x15, 0x35, 0x1d, 0x92, 0x15, 0xa5, 0x94, 0x1c, 0x20, 0xbb, 0xab, 0x69, 0xb1, 0xda, 0xb9, 0x03, - 0xf5, 0x58, 0x7f, 0x0e, 0xe3, 0xcf, 0xf6, 0xec, 0xf0, 0x14, 0xd2, 0x1d, 0xf2, 0x51, 0x01, 0xfb, - 0x45, 0x23, 0x3e, 0x1d, 0x91, 0x30, 0xd5, 0xec, 0xc8, 0x14, 0x26, 0x91, 0x99, 0x73, 0xd0, 0xce, - 0x01, 0x2c, 0x24, 0xdb, 0x85, 0x1f, 0x82, 0x2b, 0xb7, 0xd3, 0x85, 0xe0, 0xba, 0xa2, 0x8f, 0xbd, - 0x81, 0x46, 0xfc, 0xa9, 0x11, 0xc6, 0x95, 0xf3, 0x2c, 0xe9, 0x5e, 0xcf, 0x5d, 0x53, 0x86, 0x9e, - 0xcb, 0x7f, 0x43, 0x14, 0x15, 0x10, 0x12, 0x43, 0x54, 0xb0, 0x7f, 0x29, 0x21, 0x93, 0xfb, 0x36, - 0x0b, 0x98, 0xd4, 0x53, 0x80, 0x88, 0x68, 0x48, 0xea, 0x72, 0x87, 0xd0, 0xca, 0xe1, 0xa2, 0x27, - 0xd0, 0xec, 0xbb, 0xee, 0xf9, 0xd4, 0x0b, 0xf6, 0x06, 0x6e, 0x63, 0x8c, 0xd4, 0x4d, 0xd9, 0x23, - 0xbb, 0x32, 0x65, 0xf5, 0xe9, 0x87, 0x07, 0x9a, 0xa5, 0xa9, 0x6e, 0x37, 0x6f, 0x49, 0xf9, 0x1e, - 0x40, 0x3b, 0x4d, 0xe9, 0xe4, 0x5f, 0x41, 0x86, 0xf9, 0x6d, 0xa0, 0xfb, 0xef, 0x2b, 0xd7, 0xa5, - 0xd1, 0x93, 0x79, 0xf1, 0x0f, 0xd3, 0x93, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x24, 0x8f, 0x46, - 0x46, 0x6e, 0x12, 0x00, 0x00, + // 2208 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x58, 0x49, 0x6f, 0x1c, 0xc7, + 0x15, 0xd6, 0x70, 0xb8, 0xcc, 0xbc, 0x59, 0x34, 0x53, 0xdc, 0x86, 0x4d, 0x4a, 0x96, 0x2b, 0xb2, + 0x41, 0x13, 0x32, 0x69, 0xd1, 0x01, 0x12, 0xd8, 0x88, 0x03, 0x8a, 0x66, 0x4c, 0xc1, 0x34, 0x45, + 0x9b, 0x94, 0x85, 0x6c, 0x68, 0x37, 0x67, 0x8a, 0x64, 0x9b, 0x3d, 0xdd, 0x9d, 0xee, 0x1e, 0x52, + 0x13, 0x43, 0x97, 0x1c, 0xf2, 0x07, 0x72, 0x09, 0x10, 0x20, 0xe7, 0x20, 0x08, 0x82, 0xfc, 0x8f, + 0xdc, 0x92, 0x53, 0xee, 0xf9, 0x21, 0x79, 0xb5, 0x75, 0x57, 0x2f, 0x12, 0xe0, 0x43, 0x4e, 0x64, + 0xbf, 0xaa, 0x7a, 0xcb, 0xf7, 0xf6, 0x81, 0x66, 0x14, 0x0e, 0xb7, 0xc3, 0x28, 0x48, 0x02, 0x32, + 0xe7, 0xf9, 0xf8, 0x61, 0x6d, 0x5c, 0x06, 0xc1, 0xa5, 0xc7, 0x76, 0x9c, 0xd0, 0xdd, 0x71, 0x7c, + 0x3f, 0x48, 0x9c, 0xc4, 0x0d, 0xfc, 0x58, 0x5e, 0xa2, 0x7f, 0xaa, 0x41, 0xeb, 0x2c, 0x72, 0xfc, + 0xd8, 0x19, 0x72, 0x32, 0xb9, 0x0b, 0x0b, 0xc9, 0x4b, 0xfb, 0xca, 0x89, 0xaf, 0x06, 0xb5, 0x07, + 0xb5, 0xcd, 0x26, 0xe9, 0xc2, 0xbc, 0x33, 0x0e, 0x26, 0x7e, 0x32, 0x98, 0xc1, 0xef, 0x1a, 0x59, + 0x83, 0xbe, 0x3f, 0x19, 0xdb, 0xc3, 0xc0, 0xbf, 0x70, 0xa3, 0xb1, 0xe4, 0x35, 0xa8, 0xe3, 0xd1, + 0x1c, 0x21, 0x00, 0xe7, 0x5e, 0x30, 0xbc, 0x96, 0xcf, 0x67, 0xc5, 0xf3, 0x25, 0x68, 0x2b, 0x1a, + 0x73, 0x2f, 0xaf, 0x92, 0xc1, 0x9c, 0xbe, 0x99, 0xb8, 0x63, 0x66, 0xc7, 0x89, 0x33, 0x0e, 0x07, + 0xf3, 0x48, 0xab, 0x0b, 0x1a, 0x2a, 0xe7, 0xd9, 0x17, 0x8c, 0xc5, 0x83, 0x05, 0x4e, 0xa3, 0x03, + 0x58, 0xf9, 0x8c, 0x25, 0x86, 0x7e, 0xf1, 0x57, 0xec, 0x37, 0x13, 0x16, 0x27, 0xf4, 0x13, 0x20, + 0x06, 0xf9, 0x53, 0x96, 0x38, 0xae, 0x17, 0x93, 0x4d, 0x68, 0x27, 0xc6, 0x65, 0x34, 0xa1, 0xbe, + 0xd9, 0xda, 0x25, 0xdb, 0x02, 0x89, 0x6d, 0xe3, 0x01, 0xfd, 0x12, 0x5a, 0xa7, 0xcc, 0x1f, 0x29, + 0x76, 0xa4, 0x0d, 0xb3, 0x23, 0xfc, 0x2b, 0x6c, 0x6e, 0x93, 0x16, 0xd4, 0x9d, 0xb1, 0x34, 0xb8, + 0xce, 0x2d, 0x08, 0x9d, 0xe9, 0x98, 0xf9, 0x89, 0xb4, 0xab, 0x2e, 0xae, 0xf4, 0xa1, 0x79, 0xe1, + 0xc4, 0x89, 0x1d, 0x23, 0x13, 0x61, 0x6a, 0x83, 0x76, 0xa1, 0x2d, 0x59, 0xc6, 0x21, 0xca, 0x66, + 0xf4, 0x0c, 0xda, 0xfb, 0x57, 0x88, 0x38, 0xf3, 0x4e, 0x02, 0xd7, 0x4f, 0x38, 0xa3, 0x8b, 0x89, + 0x3f, 0x72, 0xfd, 0x4b, 0x3b, 0x79, 0xe9, 0x8e, 0x94, 0xac, 0x01, 0xf4, 0x4c, 0x2a, 0x42, 0x12, + 0x09, 0xc1, 0x02, 0xba, 0x60, 0x92, 0x84, 0x93, 0xc4, 0x76, 0xfd, 0x11, 0x7b, 0x29, 0x04, 0x77, + 0xe8, 0x0f, 0xa1, 0x77, 0xc4, 0x91, 0xf4, 0xf1, 0xc5, 0xde, 0x68, 0x14, 0xb1, 0x38, 0xe6, 0xd0, + 0x85, 0x93, 0xf3, 0xcf, 0xd9, 0xf4, 0x30, 0xf3, 0x1b, 0x5a, 0x74, 0x15, 0xc4, 0xd2, 0x88, 0x26, + 0xfd, 0x7d, 0x0d, 0xee, 0x72, 0xe5, 0xbe, 0x70, 0xfc, 0xa9, 0xb6, 0xf9, 0x13, 0x68, 0x73, 0x06, + 0x67, 0xc1, 0x9e, 0xf4, 0xaf, 0x04, 0x6b, 0x53, 0x81, 0x55, 0xb8, 0xbd, 0x6d, 0x5e, 0x3d, 0xf0, + 0x93, 0x68, 0x6a, 0x7d, 0x08, 0xfd, 0x12, 0x91, 0x43, 0x77, 0xcd, 0xa6, 0x4a, 0x87, 0x0e, 0xcc, + 0xdd, 0x38, 0xde, 0x84, 0x49, 0x24, 0x3f, 0x9a, 0xf9, 0x71, 0x8d, 0x3e, 0x80, 0x5e, 0xc6, 0x59, + 0x02, 0xc5, 0x55, 0x4d, 0x01, 0x69, 0xd2, 0x0f, 0xe4, 0x8d, 0x7d, 0xc4, 0x2c, 0x36, 0xdc, 0xe3, + 0xa0, 0xa8, 0xca, 0x90, 0xac, 0xd3, 0xb7, 0xa1, 0x6f, 0xbc, 0xa8, 0x64, 0xfa, 0xc7, 0x1a, 0xf4, + 0x8f, 0xd9, 0xad, 0x02, 0x4c, 0xb3, 0xdd, 0xc5, 0x3b, 0xd3, 0x90, 0x89, 0x3b, 0xdd, 0xdd, 0x87, + 0xca, 0xf2, 0xd2, 0xbd, 0x6d, 0xf5, 0x79, 0x86, 0x77, 0xe9, 0x33, 0x68, 0x19, 0x9f, 0x64, 0x15, + 0x16, 0x5f, 0x3c, 0x3d, 0x3b, 0x3e, 0x38, 0x3d, 0xb5, 0x4f, 0x9e, 0x3f, 0xf9, 0xfc, 0xe0, 0xe7, + 0xf6, 0xe1, 0xde, 0xe9, 0x61, 0xef, 0x0e, 0x59, 0x01, 0x82, 0xd4, 0xb3, 0x83, 0x4f, 0x73, 0xf4, + 0x1a, 0x26, 0x58, 0xcb, 0x24, 0xcc, 0x50, 0x0b, 0x06, 0x28, 0xf1, 0x85, 0x9b, 0xf8, 0xc8, 0x33, + 0x2f, 0x98, 0xbe, 0x83, 0x4c, 0x0c, 0x6d, 0x94, 0x69, 0x98, 0xa3, 0x8e, 0x24, 0x29, 0xeb, 0x3e, + 0x06, 0xb2, 0x1f, 0x60, 0xa0, 0x0d, 0x93, 0x13, 0xc6, 0x22, 0x6d, 0xdd, 0x3b, 0x06, 0x68, 0xad, + 0xdd, 0x55, 0x65, 0x5d, 0x31, 0x78, 0xe8, 0xbb, 0xb0, 0x98, 0x7b, 0x9c, 0x09, 0x09, 0xf1, 0xdb, + 0x56, 0x10, 0xce, 0xd1, 0x10, 0x66, 0x0f, 0xcf, 0x8e, 0xf6, 0x49, 0x0f, 0x1a, 0xae, 0x3f, 0x0c, + 0xc6, 0xc8, 0x42, 0x9c, 0x34, 0x8a, 0xfe, 0xe0, 0xb9, 0xc1, 0x33, 0xc5, 0xe6, 0x79, 0xaf, 0xd2, + 0x05, 0xab, 0x06, 0x7b, 0x19, 0xba, 0x91, 0xa8, 0x17, 0xba, 0x16, 0xf0, 0xb4, 0xe9, 0xf0, 0x04, + 0x88, 0xd8, 0x4d, 0x30, 0x94, 0x47, 0x23, 0xe6, 0x39, 0x53, 0x51, 0x25, 0x3a, 0xf4, 0x5f, 0x35, + 0xe8, 0xec, 0x61, 0xba, 0xde, 0x30, 0x95, 0x47, 0x64, 0x19, 0x3a, 0x11, 0x1b, 0x07, 0x09, 0xb3, + 0x31, 0xde, 0xb3, 0x38, 0x43, 0xf2, 0x50, 0xde, 0xb0, 0x43, 0x9e, 0x6a, 0x2a, 0x81, 0x50, 0xd3, + 0xa1, 0x13, 0x3a, 0x43, 0x37, 0x99, 0x0a, 0x35, 0xea, 0xfc, 0x22, 0x2a, 0x85, 0x35, 0xe6, 0xdc, + 0xf1, 0x1c, 0x7f, 0xc8, 0x84, 0x0a, 0x75, 0xf4, 0x55, 0x57, 0xb1, 0xd5, 0xf4, 0x39, 0x41, 0x47, + 0xad, 0x27, 0x88, 0x45, 0x92, 0x78, 0x6c, 0x94, 0x1e, 0xc9, 0x6a, 0x45, 0xa1, 0x13, 0x32, 0x99, + 0xb6, 0x57, 0x89, 0x37, 0xe4, 0x05, 0x8b, 0x67, 0x4f, 0x4b, 0xa1, 0x2c, 0x90, 0x5a, 0x84, 0x16, + 0x2f, 0x95, 0x93, 0x70, 0xe4, 0x24, 0x58, 0xd2, 0x1a, 0xf8, 0x70, 0x96, 0x2e, 0xc3, 0xe2, 0x91, + 0x1b, 0x27, 0xca, 0x22, 0xa3, 0x9e, 0x2d, 0xe5, 0xc9, 0xca, 0x0d, 0xef, 0xa2, 0x0d, 0x8a, 0x36, + 0x68, 0x0a, 0x11, 0x4b, 0x4a, 0x44, 0x0e, 0x19, 0x5e, 0xc7, 0x67, 0xb9, 0xff, 0x78, 0xd5, 0xf0, + 0xb4, 0x8b, 0xb5, 0xf3, 0x9a, 0xa6, 0x37, 0x67, 0x44, 0x05, 0x36, 0x62, 0xa8, 0x2e, 0x6e, 0xf0, + 0xe2, 0x3d, 0x45, 0x35, 0x79, 0x45, 0x93, 0xae, 0x99, 0xcd, 0x68, 0x11, 0x1b, 0xde, 0x08, 0x4c, + 0x66, 0x39, 0xa8, 0xb1, 0x93, 0xc8, 0x5b, 0x12, 0x0a, 0x45, 0x11, 0x77, 0x44, 0xd9, 0xe6, 0xcc, + 0x5d, 0xff, 0x1c, 0x23, 0x62, 0x24, 0x8c, 0x6e, 0x50, 0xc2, 0x8b, 0x56, 0x2c, 0x02, 0x2c, 0xb5, + 0x78, 0x07, 0xfa, 0x06, 0x4d, 0x99, 0x6b, 0xc1, 0x1c, 0xd7, 0x53, 0x57, 0x6e, 0x0d, 0x27, 0xbf, + 0x44, 0x7b, 0xd0, 0xc5, 0x66, 0xf0, 0xd4, 0xbf, 0x08, 0x34, 0x8b, 0xbf, 0x60, 0x55, 0x4b, 0x49, + 0x8a, 0x43, 0xb5, 0xfd, 0x18, 0x64, 0xee, 0x08, 0x55, 0xc6, 0x50, 0xb0, 0xb5, 0xdd, 0x32, 0x48, + 0x56, 0xe1, 0x6e, 0x7a, 0xa2, 0x82, 0x4a, 0x02, 0xb2, 0x01, 0x4b, 0xdc, 0x7b, 0xda, 0xcb, 0xa9, + 0x17, 0x64, 0xd4, 0xae, 0xc3, 0x22, 0x3f, 0x75, 0x84, 0x13, 0xb2, 0x43, 0x11, 0xb8, 0x3c, 0x01, + 0xe4, 0x53, 0x6e, 0xc9, 0xbc, 0x88, 0xe5, 0xe7, 0x22, 0x45, 0xd3, 0x96, 0xf9, 0x5c, 0xc4, 0x04, + 0xbf, 0x28, 0xbb, 0x63, 0x7c, 0xe5, 0xa8, 0x7e, 0x50, 0x6c, 0x98, 0xd2, 0x5d, 0x18, 0xa1, 0xba, + 0xeb, 0xc6, 0xb6, 0xc7, 0x2e, 0x12, 0xd5, 0x0d, 0x7e, 0x0a, 0x7d, 0x15, 0x01, 0xcf, 0x50, 0x51, + 0xc5, 0x75, 0xab, 0x98, 0x0e, 0xb2, 0x02, 0x2c, 0x2a, 0x30, 0xcd, 0xa6, 0x24, 0x4a, 0x87, 0xfc, + 0xde, 0xf7, 0x82, 0x98, 0x29, 0x0e, 0xa8, 0xc4, 0x10, 0x3f, 0x0b, 0xad, 0x0a, 0xdd, 0x1a, 0x4f, + 0x86, 0x43, 0x8d, 0x5d, 0x83, 0x8e, 0xb0, 0x74, 0xf0, 0x57, 0x8a, 0x83, 0x2e, 0x3c, 0xdf, 0x43, + 0x7e, 0x3a, 0x09, 0x78, 0xee, 0xd8, 0xd5, 0xf5, 0x03, 0xdb, 0xc6, 0x45, 0x10, 0x61, 0xaa, 0xd5, + 0x85, 0x94, 0x7f, 0x60, 0xed, 0x16, 0x62, 0x4e, 0x71, 0x74, 0x99, 0xc4, 0x4a, 0xc5, 0xf7, 0x51, + 0x08, 0x27, 0x6a, 0x07, 0x29, 0x21, 0x4b, 0x69, 0xc4, 0x08, 0xaa, 0xbc, 0x7c, 0x78, 0x87, 0x3c, + 0x46, 0x8b, 0x0c, 0xfc, 0x85, 0xa4, 0xd6, 0xee, 0x9a, 0x56, 0xa9, 0xe4, 0x1a, 0x7c, 0xb2, 0x03, + 0xc0, 0xcd, 0xb0, 0x85, 0x18, 0xa1, 0x8b, 0xf1, 0xa0, 0x84, 0xd9, 0xe1, 0x9d, 0x27, 0x0d, 0x98, + 0x97, 0xb9, 0x4e, 0xef, 0x41, 0x27, 0xa7, 0x40, 0xae, 0x1b, 0xb5, 0xe9, 0x5f, 0x6b, 0x40, 0xb8, + 0xbf, 0x0a, 0xb8, 0xa1, 0x93, 0x13, 0x27, 0xba, 0x64, 0x89, 0x9d, 0xab, 0xbc, 0xbc, 0x8e, 0x28, + 0xba, 0x1f, 0x8c, 0x64, 0x33, 0x6d, 0xf3, 0xf0, 0x94, 0xa5, 0x4c, 0x4f, 0x0f, 0xaa, 0x04, 0xcb, + 0x42, 0x77, 0x0f, 0x96, 0x55, 0x45, 0x2b, 0x1c, 0xcb, 0x82, 0x87, 0x41, 0x8f, 0x15, 0x7c, 0xec, + 0xc6, 0x31, 0xaf, 0xb9, 0xb1, 0xfb, 0x5b, 0x5d, 0xf1, 0x54, 0xe4, 0x8a, 0x38, 0x53, 0x91, 0xfb, + 0xb7, 0x1a, 0xf4, 0xb8, 0xb2, 0x39, 0xf4, 0x1f, 0x21, 0x9c, 0x1c, 0x9b, 0xff, 0x1b, 0xf8, 0xef, + 0x43, 0x53, 0x08, 0x08, 0x50, 0x82, 0xc2, 0x7e, 0x90, 0xc7, 0x3e, 0x0b, 0xf8, 0x1c, 0xf4, 0x3f, + 0x81, 0x65, 0x25, 0xbe, 0x80, 0xee, 0x43, 0x98, 0x8f, 0x85, 0x09, 0xaa, 0xdd, 0x2f, 0xe5, 0xd9, + 0x49, 0xf3, 0xe8, 0xdf, 0x67, 0x60, 0xa5, 0xf8, 0x5e, 0x55, 0x96, 0x9f, 0x41, 0xaf, 0x54, 0x0c, + 0x64, 0x99, 0x7a, 0x94, 0xb7, 0xbb, 0xf0, 0xb0, 0x40, 0xb6, 0xfe, 0x59, 0x83, 0x6e, 0x9e, 0x54, + 0x6a, 0xb6, 0xa5, 0x2a, 0x36, 0x53, 0xdd, 0xe7, 0xea, 0xa5, 0x3e, 0x37, 0x5b, 0xdd, 0xe7, 0xe6, + 0x5e, 0xd3, 0xe7, 0xe6, 0xf5, 0x88, 0x9b, 0x4b, 0xf7, 0x05, 0xc1, 0x36, 0x03, 0xac, 0xf1, 0x06, + 0xc0, 0x1e, 0xc1, 0xd2, 0x0b, 0xc7, 0xf3, 0x58, 0xf2, 0x44, 0xb2, 0xd4, 0x70, 0x23, 0xcf, 0x5b, + 0x39, 0xd3, 0xd8, 0x81, 0xef, 0xc9, 0x4e, 0xdd, 0xa0, 0x9b, 0xb0, 0x5c, 0xb8, 0x9d, 0x8d, 0x1b, + 0x5a, 0x27, 0x7e, 0xb3, 0x46, 0x57, 0x61, 0x59, 0x09, 0xca, 0x33, 0xa6, 0xef, 0xc1, 0x4a, 0xf1, + 0xa0, 0x9a, 0x47, 0x9d, 0x7e, 0x03, 0xbd, 0xaf, 0x70, 0x84, 0x46, 0xbb, 0xce, 0x9c, 0x73, 0x8f, + 0x1d, 0xb9, 0xfe, 0x35, 0x1f, 0x50, 0xdd, 0xd1, 0x63, 0xd5, 0x16, 0xc4, 0xc7, 0x6e, 0x36, 0x2e, + 0xf0, 0x79, 0xfb, 0x8d, 0xc0, 0xe2, 0xa8, 0x73, 0x9b, 0x2d, 0x32, 0x35, 0xba, 0x06, 0xab, 0xa7, + 0x57, 0xc1, 0xad, 0x29, 0x45, 0xeb, 0x79, 0x00, 0x83, 0xf2, 0x91, 0xd2, 0xf4, 0x3d, 0xa3, 0xab, + 0xcb, 0x10, 0xd2, 0xe3, 0x59, 0x51, 0x5f, 0xea, 0xc1, 0xc2, 0x53, 0xff, 0x26, 0x70, 0x87, 0xa2, + 0x88, 0x8c, 0xd1, 0x7d, 0x59, 0x4b, 0xc7, 0x96, 0xcb, 0xdc, 0x30, 0x51, 0x15, 0x01, 0x4b, 0x69, + 0x64, 0x87, 0x11, 0x73, 0xc7, 0xce, 0x25, 0x53, 0x73, 0x17, 0xea, 0x1b, 0x65, 0xeb, 0x58, 0x3b, + 0x9b, 0xc8, 0xe7, 0x74, 0xa3, 0x56, 0xe3, 0x8d, 0x88, 0x84, 0x06, 0x7d, 0x08, 0x04, 0xe7, 0x42, + 0x25, 0x30, 0x55, 0x37, 0xe3, 0x22, 0xeb, 0xd7, 0x63, 0x9c, 0x61, 0xe5, 0x4a, 0xc4, 0x17, 0x0e, + 0x29, 0x58, 0x4c, 0x7c, 0x7c, 0x79, 0x49, 0x67, 0x74, 0xf5, 0x44, 0x28, 0x47, 0xb7, 0x80, 0xf0, + 0x6e, 0x9f, 0x72, 0x4e, 0x83, 0x44, 0xa7, 0x94, 0x11, 0x24, 0x3f, 0x92, 0x23, 0x52, 0x51, 0x8b, + 0x07, 0x7c, 0xf0, 0x14, 0x24, 0x0d, 0x5a, 0x57, 0x81, 0xa6, 0x6e, 0xf2, 0xd9, 0x4a, 0xfd, 0x7b, + 0x3a, 0x39, 0x8f, 0x87, 0x11, 0x62, 0x83, 0x35, 0x65, 0x6b, 0x17, 0x3a, 0xb9, 0x98, 0x25, 0x0b, + 0x50, 0xdf, 0x3b, 0x3a, 0xc2, 0x21, 0xbd, 0x05, 0x0b, 0xcf, 0x4e, 0x0e, 0x8e, 0x9f, 0x1e, 0x7f, + 0x86, 0x93, 0x39, 0x7e, 0xec, 0x1f, 0x3d, 0x3b, 0xe5, 0x1f, 0x33, 0xbb, 0xff, 0xb9, 0x0b, 0xcd, + 0x74, 0x54, 0x26, 0xdf, 0x42, 0x27, 0x17, 0xb6, 0x64, 0x5d, 0x49, 0xae, 0x0a, 0x7d, 0x6b, 0xa3, + 0xfa, 0x50, 0xad, 0x85, 0xf7, 0x7f, 0xf7, 0xef, 0xff, 0xfe, 0x61, 0x66, 0x40, 0x56, 0x76, 0x6e, + 0x1e, 0xef, 0xa8, 0x78, 0xdd, 0x11, 0x2d, 0x1f, 0x43, 0xc2, 0xf5, 0xc9, 0x35, 0x74, 0xf3, 0xf1, + 0x4d, 0x36, 0xf2, 0x89, 0x57, 0x90, 0x76, 0xef, 0x35, 0xa7, 0x4a, 0xdc, 0x86, 0x10, 0xb7, 0x42, + 0x96, 0x4c, 0x71, 0x3a, 0xf8, 0x08, 0x13, 0x03, 0x94, 0xb9, 0x60, 0x13, 0xcd, 0xaf, 0x7a, 0xf1, + 0xb6, 0xd6, 0xca, 0xcb, 0xb4, 0xda, 0xbe, 0xe9, 0x40, 0x88, 0x22, 0xa4, 0xc7, 0x45, 0x99, 0x7b, + 0x38, 0xf9, 0x25, 0x34, 0xd3, 0x0d, 0x8d, 0xac, 0x1a, 0x1b, 0xa6, 0xb9, 0xe5, 0x59, 0x83, 0xf2, + 0x81, 0x32, 0x62, 0x5d, 0x70, 0x5e, 0xa6, 0x25, 0xce, 0x1f, 0xd5, 0xb6, 0xc8, 0x11, 0x2c, 0x2b, + 0x77, 0x9f, 0xb3, 0xef, 0x63, 0x49, 0xc5, 0xcf, 0x02, 0x1f, 0xd4, 0xc8, 0xc7, 0xd0, 0xd0, 0x0b, + 0x2a, 0x59, 0xa9, 0xde, 0x85, 0xad, 0xd5, 0x12, 0x5d, 0x85, 0xe8, 0x1e, 0x40, 0xb6, 0xaf, 0x91, + 0xc1, 0xeb, 0x16, 0xca, 0x14, 0xc4, 0x8a, 0xe5, 0xee, 0x52, 0x2c, 0xaa, 0xf9, 0x75, 0x90, 0xbc, + 0x95, 0xdd, 0xaf, 0x5c, 0x14, 0xdf, 0xc0, 0x90, 0xae, 0x08, 0xec, 0x7a, 0xa4, 0xcb, 0xb1, 0xf3, + 0xd9, 0xad, 0x1a, 0x7f, 0xc9, 0x2f, 0xa0, 0x65, 0xec, 0x7d, 0xc4, 0xe8, 0xc6, 0x85, 0x45, 0xd2, + 0xb2, 0xaa, 0x8e, 0x14, 0xf7, 0x25, 0xc1, 0xbd, 0x4b, 0x9b, 0x9c, 0xbb, 0x18, 0x78, 0xb9, 0x4b, + 0xbe, 0xe4, 0xc9, 0xa3, 0x66, 0x7b, 0x92, 0x6d, 0x9e, 0xf9, 0x0d, 0x20, 0xf5, 0x77, 0x69, 0x0d, + 0xa0, 0x7d, 0xc1, 0xb5, 0x45, 0x32, 0xae, 0xe4, 0x0b, 0x58, 0x50, 0xa3, 0x3e, 0x59, 0xce, 0xfc, + 0x6a, 0x6c, 0x03, 0xd6, 0x4a, 0x91, 0xac, 0x98, 0x2d, 0x0a, 0x66, 0x1d, 0xd2, 0xe2, 0xcc, 0x70, + 0x8a, 0x72, 0x39, 0x0f, 0x0f, 0xee, 0xe6, 0x7b, 0x70, 0x9c, 0xa6, 0x59, 0xe5, 0xf8, 0x90, 0xa6, + 0x59, 0x75, 0x8f, 0xcf, 0xa7, 0x99, 0x4e, 0xaf, 0x1d, 0x55, 0xdc, 0xc8, 0xaf, 0xa1, 0x6d, 0x6e, + 0x77, 0xc4, 0x32, 0x2c, 0x2f, 0x6c, 0x82, 0xd6, 0x7a, 0xe5, 0x59, 0x1e, 0x6e, 0xd2, 0x36, 0xc5, + 0x90, 0x5f, 0x41, 0xcb, 0x18, 0x27, 0x53, 0x57, 0x96, 0x47, 0xcc, 0x34, 0x72, 0x8b, 0x03, 0x1d, + 0x5d, 0x15, 0x8c, 0xfb, 0x34, 0xc7, 0x18, 0x5d, 0x89, 0x19, 0xf1, 0xe7, 0x1a, 0xb4, 0xcd, 0x31, + 0x3f, 0xd5, 0xbe, 0x62, 0xf6, 0x4f, 0x7d, 0x5a, 0x1a, 0xd8, 0xe9, 0xd7, 0x42, 0xc2, 0xc9, 0xd6, + 0x71, 0x0e, 0xa1, 0xef, 0x72, 0x03, 0xcd, 0xb6, 0xf9, 0x53, 0xd8, 0xab, 0xe2, 0xa1, 0xf9, 0x6b, + 0x18, 0x1e, 0x8a, 0x1d, 0xe1, 0x15, 0x2a, 0xf8, 0x8d, 0xfc, 0x2d, 0x4f, 0xb5, 0x24, 0x42, 0x8c, + 0xec, 0xd4, 0x6a, 0x2d, 0xe6, 0x68, 0x0a, 0xcc, 0x87, 0x42, 0xa3, 0xfb, 0x74, 0x2d, 0xa7, 0x51, + 0xa1, 0xbc, 0x6c, 0xd6, 0x50, 0xc2, 0x09, 0x40, 0xd6, 0x16, 0x49, 0xa1, 0xed, 0xa4, 0xc9, 0x57, + 0xee, 0x9c, 0x79, 0x58, 0x75, 0xf7, 0xe2, 0x19, 0xf2, 0xad, 0x8c, 0x08, 0x75, 0x3f, 0x4e, 0x7d, + 0x56, 0x6e, 0x92, 0x96, 0x55, 0x75, 0xa4, 0xf8, 0xff, 0x40, 0xf0, 0xbf, 0x47, 0xd6, 0x4d, 0xfe, + 0x3b, 0xdf, 0x99, 0x4d, 0xf5, 0x15, 0xf9, 0x1a, 0x3a, 0x47, 0x41, 0x70, 0x3d, 0x09, 0xb5, 0x01, + 0x1a, 0x21, 0xa3, 0x89, 0x5b, 0xc5, 0x5e, 0xfa, 0xb6, 0xe0, 0xbc, 0x4e, 0xd6, 0xf2, 0x9c, 0xb3, + 0x46, 0xff, 0x8a, 0x38, 0xd0, 0x4f, 0x0b, 0x6f, 0x6a, 0x88, 0x95, 0xe7, 0x63, 0x36, 0xe2, 0x92, + 0x8c, 0x5c, 0x2b, 0x4c, 0x65, 0xc4, 0x9a, 0x27, 0x02, 0x7f, 0x0a, 0xbd, 0xe2, 0x10, 0x45, 0xee, + 0x6b, 0x5f, 0x56, 0x0f, 0x5e, 0xd6, 0x5b, 0xaf, 0x3d, 0x97, 0xa0, 0x9d, 0xcf, 0x8b, 0x9f, 0xbe, + 0x3f, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x79, 0x99, 0xf1, 0x9f, 0x2c, 0x17, 0x00, 0x00, } diff --git a/lnrpc/rpc.pb.gw.go b/lnrpc/rpc.pb.gw.go new file mode 100644 index 00000000..fdd8b15e --- /dev/null +++ b/lnrpc/rpc.pb.gw.go @@ -0,0 +1,953 @@ +// Code generated by protoc-gen-grpc-gateway +// source: rpc.proto +// DO NOT EDIT! + +/* +Package lnrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package lnrpc + +import ( + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "golang.org/x/net/context" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" +) + +var _ codes.Code +var _ io.Reader +var _ = runtime.String +var _ = utilities.NewDoubleArray + +var ( + filter_Lightning_WalletBalance_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Lightning_WalletBalance_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq WalletBalanceRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_WalletBalance_0); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.WalletBalance(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_ChannelBalance_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChannelBalanceRequest + var metadata runtime.ServerMetadata + + msg, err := client.ChannelBalance(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_GetTransactions_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetTransactionsRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetTransactions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_SendCoins_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendCoinsRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SendCoins(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_NewWitnessAddress_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NewWitnessAddressRequest + var metadata runtime.ServerMetadata + + msg, err := client.NewWitnessAddress(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_ConnectPeer_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ConnectPeerRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ConnectPeer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_ListPeers_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListPeersRequest + var metadata runtime.ServerMetadata + + msg, err := client.ListPeers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_GetInfo_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetInfoRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +var ( + filter_Lightning_PendingChannels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Lightning_PendingChannels_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PendingChannelRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_PendingChannels_0); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.PendingChannels(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_ListChannels_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListChannelsRequest + var metadata runtime.ServerMetadata + + msg, err := client.ListChannels(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_OpenChannel_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_OpenChannelClient, runtime.ServerMetadata, error) { + var protoReq OpenChannelRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.OpenChannel(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +var ( + filter_Lightning_CloseChannel_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_point": 0, "funding_txid": 1, "output_index": 2, "force": 3}, Base: []int{1, 1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 2, 2, 1, 3, 4, 5}} +) + +func request_Lightning_CloseChannel_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_CloseChannelClient, runtime.ServerMetadata, error) { + var protoReq CloseChannelRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_point.funding_txid"] + if !ok { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_point.funding_txid") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "channel_point.funding_txid", val) + + if err != nil { + return nil, metadata, err + } + + val, ok = pathParams["channel_point.output_index"] + if !ok { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_point.output_index") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "channel_point.output_index", val) + + if err != nil { + return nil, metadata, err + } + + val, ok = pathParams["force"] + if !ok { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "missing parameter %s", "force") + } + + protoReq.Force, err = runtime.Bool(val) + + if err != nil { + return nil, metadata, err + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_CloseChannel_0); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.CloseChannel(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_Lightning_SendPayment_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SendPaymentClient, runtime.ServerMetadata, error) { + var metadata runtime.ServerMetadata + stream, err := client.SendPayment(ctx) + if err != nil { + grpclog.Printf("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + handleSend := func() error { + var protoReq SendRequest + err = dec.Decode(&protoReq) + if err == io.EOF { + return err + } + if err != nil { + grpclog.Printf("Failed to decode request: %v", err) + return err + } + if err = stream.Send(&protoReq); err != nil { + grpclog.Printf("Failed to send request: %v", err) + return err + } + return nil + } + if err := handleSend(); err != nil { + if cerr := stream.CloseSend(); cerr != nil { + grpclog.Printf("Failed to terminate client stream: %v", cerr) + } + if err == io.EOF { + return stream, metadata, nil + } + return nil, metadata, err + } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } + }() + header, err := stream.Header() + if err != nil { + grpclog.Printf("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil +} + +func request_Lightning_AddInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq Invoice + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.AddInvoice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_ListInvoices_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListInvoiceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pending_only"] + if !ok { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "missing parameter %s", "pending_only") + } + + protoReq.PendingOnly, err = runtime.Bool(val) + + if err != nil { + return nil, metadata, err + } + + msg, err := client.ListInvoices(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +var ( + filter_Lightning_LookupInvoice_0 = &utilities.DoubleArray{Encoding: map[string]int{"r_hash_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Lightning_LookupInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PaymentHash + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["r_hash_str"] + if !ok { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "missing parameter %s", "r_hash_str") + } + + protoReq.RHashStr, err = runtime.String(val) + + if err != nil { + return nil, metadata, err + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_LookupInvoice_0); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.LookupInvoice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Lightning_SubscribeInvoices_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SubscribeInvoicesClient, runtime.ServerMetadata, error) { + var protoReq InvoiceSubscription + var metadata runtime.ServerMetadata + + stream, err := client.SubscribeInvoices(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +// RegisterLightningHandlerFromEndpoint is same as RegisterLightningHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterLightningHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterLightningHandler(ctx, mux, conn) +} + +// RegisterLightningHandler registers the http handlers for service Lightning to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterLightningHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + client := NewLightningClient(conn) + + mux.Handle("GET", pattern_Lightning_WalletBalance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_WalletBalance_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_WalletBalance_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ChannelBalance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_ChannelBalance_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ChannelBalance_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetTransactions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_GetTransactions_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetTransactions_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SendCoins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_SendCoins_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendCoins_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_NewWitnessAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_NewWitnessAddress_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_NewWitnessAddress_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_ConnectPeer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_ConnectPeer_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ConnectPeer_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListPeers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_ListPeers_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListPeers_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_GetInfo_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetInfo_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_PendingChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_PendingChannels_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_PendingChannels_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_ListChannels_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListChannels_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_OpenChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_OpenChannel_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_OpenChannel_0(ctx, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Lightning_CloseChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_CloseChannel_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_CloseChannel_0(ctx, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SendPayment_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_SendPayment_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendPayment_0(ctx, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_AddInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_AddInvoice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_AddInvoice_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListInvoices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_ListInvoices_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListInvoices_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_LookupInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_LookupInvoice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_LookupInvoice_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribeInvoices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lightning_SubscribeInvoices_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SubscribeInvoices_0(ctx, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Lightning_WalletBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "balance", "blockchain"}, "")) + + pattern_Lightning_ChannelBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "balance", "channels"}, "")) + + pattern_Lightning_GetTransactions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "")) + + pattern_Lightning_SendCoins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "")) + + pattern_Lightning_NewWitnessAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "newaddress"}, "")) + + pattern_Lightning_ConnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, "")) + + pattern_Lightning_ListPeers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, "")) + + pattern_Lightning_GetInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getinfo"}, "")) + + pattern_Lightning_PendingChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "pending"}, "")) + + pattern_Lightning_ListChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "")) + + pattern_Lightning_OpenChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "")) + + pattern_Lightning_CloseChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "channels", "channel_point.funding_txid", "channel_point.output_index", "force"}, "")) + + pattern_Lightning_SendPayment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "transactions"}, "")) + + pattern_Lightning_AddInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "invoices"}, "")) + + pattern_Lightning_ListInvoices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "invoices", "pending_only"}, "")) + + pattern_Lightning_LookupInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "invoices", "r_hash_str"}, "")) + + pattern_Lightning_SubscribeInvoices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "invoices", "subscribe"}, "")) +) + +var ( + forward_Lightning_WalletBalance_0 = runtime.ForwardResponseMessage + + forward_Lightning_ChannelBalance_0 = runtime.ForwardResponseMessage + + forward_Lightning_GetTransactions_0 = runtime.ForwardResponseMessage + + forward_Lightning_SendCoins_0 = runtime.ForwardResponseMessage + + forward_Lightning_NewWitnessAddress_0 = runtime.ForwardResponseMessage + + forward_Lightning_ConnectPeer_0 = runtime.ForwardResponseMessage + + forward_Lightning_ListPeers_0 = runtime.ForwardResponseMessage + + forward_Lightning_GetInfo_0 = runtime.ForwardResponseMessage + + forward_Lightning_PendingChannels_0 = runtime.ForwardResponseMessage + + forward_Lightning_ListChannels_0 = runtime.ForwardResponseMessage + + forward_Lightning_OpenChannel_0 = runtime.ForwardResponseStream + + forward_Lightning_CloseChannel_0 = runtime.ForwardResponseStream + + forward_Lightning_SendPayment_0 = runtime.ForwardResponseStream + + forward_Lightning_AddInvoice_0 = runtime.ForwardResponseMessage + + forward_Lightning_ListInvoices_0 = runtime.ForwardResponseMessage + + forward_Lightning_LookupInvoice_0 = runtime.ForwardResponseMessage + + forward_Lightning_SubscribeInvoices_0 = runtime.ForwardResponseStream +) diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 42e61f71..ae2d17a0 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -1,34 +1,131 @@ syntax = "proto3"; +import "google/api/annotations.proto"; + package lnrpc; service Lightning { - rpc WalletBalance(WalletBalanceRequest) returns (WalletBalanceResponse); - rpc ChannelBalance(ChannelBalanceRequest) returns (ChannelBalanceResponse); + rpc WalletBalance(WalletBalanceRequest) returns (WalletBalanceResponse) { + option (google.api.http) = { + get: "/v1/balance/blockchain" + }; + } + rpc ChannelBalance(ChannelBalanceRequest) returns (ChannelBalanceResponse) { + option (google.api.http) = { + get: "/v1/balance/channels" + }; + } + + rpc GetTransactions(GetTransactionsRequest) returns (TransactionDetails) { + option (google.api.http) = { + get: "/v1/transactions" + }; + } + rpc SendCoins(SendCoinsRequest) returns (SendCoinsResponse) { + option (google.api.http) = { + post: "/v1/transactions" + body: "*" + }; + } + rpc SubscribeTransactions(GetTransactionsRequest) returns (stream Transaction); rpc SendMany(SendManyRequest) returns (SendManyResponse); - rpc SendCoins(SendCoinsRequest) returns (SendCoinsResponse); + rpc NewAddress(NewAddressRequest) returns (NewAddressResponse); + rpc NewWitnessAddress(NewWitnessAddressRequest) returns (NewAddressResponse) { + option (google.api.http) = { + get: "/v1/newaddress" + }; + } - rpc ConnectPeer(ConnectPeerRequest) returns (ConnectPeerResponse); - rpc ListPeers(ListPeersRequest) returns (ListPeersResponse); - rpc GetInfo(GetInfoRequest) returns (GetInfoResponse); + rpc ConnectPeer(ConnectPeerRequest) returns (ConnectPeerResponse) { + option (google.api.http) = { + post: "/v1/peers" + body: "*" + }; + } + rpc ListPeers(ListPeersRequest) returns (ListPeersResponse) { + option (google.api.http) = { + get: "/v1/peers" + }; + } + rpc GetInfo(GetInfoRequest) returns (GetInfoResponse) { + option (google.api.http) = { + get: "/v1/getinfo" + }; + } - rpc OpenChannel(OpenChannelRequest) returns (stream OpenStatusUpdate); - rpc CloseChannel(CloseChannelRequest) returns (stream CloseStatusUpdate); + // TODO(roasbeef): merge with below with bool? + rpc PendingChannels(PendingChannelRequest) returns (PendingChannelResponse) { + option (google.api.http) = { + get: "/v1/channels/pending" + }; + } + rpc ListChannels(ListChannelsRequest) returns (ListChannelsResponse) { + option (google.api.http) = { + get: "/v1/channels" + }; + } + rpc OpenChannel(OpenChannelRequest) returns (stream OpenStatusUpdate) { + option (google.api.http) = { + post: "/v1/channels" + body: "*" + }; + } + rpc CloseChannel(CloseChannelRequest) returns (stream CloseStatusUpdate) { + option (google.api.http) = { + delete: "/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}/{force}" + }; + } - rpc PendingChannels(PendingChannelRequest) returns (PendingChannelResponse); - rpc ListChannels(ListChannelsRequest) returns (ListChannelsResponse); + rpc SendPayment(stream SendRequest) returns (stream SendResponse) { + option (google.api.http) = { + post: "/v1/channels/transactions" + body: "*" + }; + } - rpc SendPayment(stream SendRequest) returns (stream SendResponse); - - rpc AddInvoice(Invoice) returns (AddInvoiceResponse); - rpc LookupInvoice(PaymentHash) returns (Invoice); - rpc ListInvoices(ListInvoiceRequest) returns (ListInvoiceResponse); + rpc AddInvoice(Invoice) returns (AddInvoiceResponse) { + option (google.api.http) = { + post: "/v1/invoices" + body: "*" + }; + } + rpc ListInvoices(ListInvoiceRequest) returns (ListInvoiceResponse) { + option (google.api.http) = { + get: "/v1/invoices/{pending_only}" + }; + } + rpc LookupInvoice(PaymentHash) returns (Invoice) { + option (google.api.http) = { + get: "/v1/invoices/{r_hash_str}" + }; + } + rpc SubscribeInvoices(InvoiceSubscription) returns (stream Invoice) { + option (google.api.http) = { + get: "/v1/invoices/subscribe" + }; + } rpc ShowRoutingTable(ShowRoutingTableRequest) returns (ShowRoutingTableResponse); } + +message Transaction { + string tx_hash = 1; + double amount = 2; + int32 num_confirmations = 3; + string block_hash = 4; + int32 block_height = 5; + int64 time_stamp = 6; + int64 total_fees = 7; +} +message GetTransactionsRequest { +} +message TransactionDetails { + repeated Transaction transactions = 1; +} + message SendRequest { bytes dest = 1; int64 amt = 2; @@ -36,13 +133,14 @@ message SendRequest { bool fast_send = 4; } -message SendResponse{ +message SendResponse { // TODO(roasbeef): info about route? stats? } message ChannelPoint { bytes funding_txid = 1; - uint32 output_index = 2; + string funding_txid_str = 2; + uint32 output_index = 3; } message LightningAddress { @@ -71,9 +169,9 @@ message NewAddressRequest { NESTED_PUBKEY_HASH = 1; PUBKEY_HASH = 2; } - AddressType type = 1; } +message NewWitnessAddressRequest {} message NewAddressResponse { string address = 1; } @@ -267,7 +365,8 @@ message AddInvoiceResponse { bytes r_hash = 1; } message PaymentHash { - bytes r_hash = 1; + string r_hash_str = 1; + bytes r_hash = 2; } message ListInvoiceRequest { bool pending_only = 1; @@ -275,3 +374,5 @@ message ListInvoiceRequest { message ListInvoiceResponse { repeated Invoice invoices = 1; } + +message InvoiceSubscription {} diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json new file mode 100644 index 00000000..9f4bacc8 --- /dev/null +++ b/lnrpc/rpc.swagger.json @@ -0,0 +1,981 @@ +{ + "swagger": "2.0", + "info": { + "title": "rpc.proto", + "version": "version not set" + }, + "schemes": [ + "http", + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/v1/balance/blockchain": { + "get": { + "operationId": "WalletBalance", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcWalletBalanceResponse" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/balance/channels": { + "get": { + "operationId": "ChannelBalance", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcChannelBalanceResponse" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/channels": { + "get": { + "operationId": "ListChannels", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcListChannelsResponse" + } + } + }, + "tags": [ + "Lightning" + ] + }, + "post": { + "operationId": "OpenChannel", + "responses": { + "200": { + "description": "(streaming responses)", + "schema": { + "$ref": "#/definitions/lnrpcOpenStatusUpdate" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcOpenChannelRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/channels/pending": { + "get": { + "operationId": "PendingChannels", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcPendingChannelResponse" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/channels/transactions": { + "post": { + "operationId": "SendPayment", + "responses": { + "200": { + "description": "(streaming responses)", + "schema": { + "$ref": "#/definitions/lnrpcSendResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "description": "(streaming inputs)", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcSendRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}/{force}": { + "delete": { + "summary": "TODO(roasbeef): merge with below with bool?", + "operationId": "CloseChannel", + "responses": { + "200": { + "description": "(streaming responses)", + "schema": { + "$ref": "#/definitions/lnrpcCloseStatusUpdate" + } + } + }, + "parameters": [ + { + "name": "channel_point.funding_txid", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "channel_point.output_index", + "in": "path", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "force", + "in": "path", + "required": true, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/getinfo": { + "get": { + "operationId": "GetInfo", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcGetInfoResponse" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/invoices": { + "post": { + "operationId": "AddInvoice", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcAddInvoiceResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcInvoice" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/invoices/subscribe": { + "get": { + "operationId": "SubscribeInvoices", + "responses": { + "200": { + "description": "(streaming responses)", + "schema": { + "$ref": "#/definitions/lnrpcInvoice" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/invoices/{pending_only}": { + "get": { + "operationId": "ListInvoices", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcListInvoiceResponse" + } + } + }, + "parameters": [ + { + "name": "pending_only", + "in": "path", + "required": true, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/invoices/{r_hash_str}": { + "get": { + "operationId": "LookupInvoice", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcInvoice" + } + } + }, + "parameters": [ + { + "name": "r_hash_str", + "in": "path", + "required": true, + "type": "string", + "format": "string" + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/newaddress": { + "get": { + "operationId": "NewWitnessAddress", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcNewAddressResponse" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/peers": { + "get": { + "operationId": "ListPeers", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcListPeersResponse" + } + } + }, + "tags": [ + "Lightning" + ] + }, + "post": { + "operationId": "ConnectPeer", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcConnectPeerResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcConnectPeerRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/transactions": { + "get": { + "operationId": "GetTransactions", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcTransactionDetails" + } + } + }, + "tags": [ + "Lightning" + ] + }, + "post": { + "operationId": "SendCoins", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/lnrpcSendCoinsResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcSendCoinsRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + } + }, + "definitions": { + "PendingChannelResponsePendingChannel": { + "type": "object", + "properties": { + "capacity": { + "type": "string", + "format": "int64" + }, + "channel_point": { + "type": "string", + "format": "string" + }, + "closing_txid": { + "type": "string", + "format": "string" + }, + "lightning_id": { + "type": "string", + "format": "string" + }, + "local_balance": { + "type": "string", + "format": "int64" + }, + "peer_id": { + "type": "integer", + "format": "int32" + }, + "remote_balance": { + "type": "string", + "format": "int64" + }, + "status": { + "$ref": "#/definitions/lnrpcChannelStatus" + } + } + }, + "lnrpcActiveChannel": { + "type": "object", + "properties": { + "capacity": { + "type": "string", + "format": "int64" + }, + "channel_point": { + "type": "string", + "format": "string" + }, + "local_balance": { + "type": "string", + "format": "int64" + }, + "num_updates": { + "type": "string", + "format": "uint64" + }, + "pending_htlcs": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcHTLC" + } + }, + "remote_balance": { + "type": "string", + "format": "int64" + }, + "remote_pubkey": { + "type": "string", + "format": "string" + }, + "unsettled_balance": { + "type": "string", + "format": "int64" + } + } + }, + "lnrpcAddInvoiceResponse": { + "type": "object", + "properties": { + "r_hash": { + "type": "string", + "format": "byte" + } + } + }, + "lnrpcChannelBalanceRequest": { + "type": "object" + }, + "lnrpcChannelBalanceResponse": { + "type": "object", + "properties": { + "balance": { + "type": "string", + "format": "int64" + } + } + }, + "lnrpcChannelCloseUpdate": { + "type": "object", + "properties": { + "closing_txid": { + "type": "string", + "format": "byte" + }, + "success": { + "type": "boolean", + "format": "boolean" + } + } + }, + "lnrpcChannelOpenUpdate": { + "type": "object", + "properties": { + "channel_point": { + "$ref": "#/definitions/lnrpcChannelPoint" + } + } + }, + "lnrpcChannelPoint": { + "type": "object", + "properties": { + "funding_txid": { + "type": "string", + "format": "byte" + }, + "funding_txid_str": { + "type": "string", + "format": "string" + }, + "output_index": { + "type": "integer", + "format": "int64" + } + } + }, + "lnrpcChannelStatus": { + "type": "string", + "enum": [ + "ALL", + "OPENING", + "CLOSING" + ], + "default": "ALL" + }, + "lnrpcCloseChannelRequest": { + "type": "object", + "properties": { + "channel_point": { + "$ref": "#/definitions/lnrpcChannelPoint" + }, + "force": { + "type": "boolean", + "format": "boolean" + }, + "time_limit": { + "type": "string", + "format": "int64" + } + } + }, + "lnrpcCloseStatusUpdate": { + "type": "object", + "properties": { + "chan_close": { + "$ref": "#/definitions/lnrpcChannelCloseUpdate" + }, + "close_pending": { + "$ref": "#/definitions/lnrpcPendingUpdate" + }, + "confirmation": { + "$ref": "#/definitions/lnrpcConfirmationUpdate" + } + } + }, + "lnrpcConfirmationUpdate": { + "type": "object", + "properties": { + "block_height": { + "type": "integer", + "format": "int32" + }, + "block_sha": { + "type": "string", + "format": "byte" + }, + "num_confs_left": { + "type": "integer", + "format": "int64" + } + } + }, + "lnrpcConnectPeerRequest": { + "type": "object", + "properties": { + "addr": { + "$ref": "#/definitions/lnrpcLightningAddress" + } + } + }, + "lnrpcConnectPeerResponse": { + "type": "object", + "properties": { + "peer_id": { + "type": "integer", + "format": "int32" + } + } + }, + "lnrpcGetInfoRequest": { + "type": "object" + }, + "lnrpcGetInfoResponse": { + "type": "object", + "properties": { + "identity_address": { + "type": "string", + "format": "string" + }, + "identity_pubkey": { + "type": "string", + "format": "string" + }, + "lightning_id": { + "type": "string", + "format": "string" + }, + "num_active_channels": { + "type": "integer", + "format": "int64" + }, + "num_peers": { + "type": "integer", + "format": "int64" + }, + "num_pending_channels": { + "type": "integer", + "format": "int64" + } + } + }, + "lnrpcGetTransactionsRequest": { + "type": "object" + }, + "lnrpcHTLC": { + "type": "object", + "properties": { + "amount": { + "type": "string", + "format": "int64" + }, + "expiration_height": { + "type": "integer", + "format": "int64" + }, + "hash_lock": { + "type": "string", + "format": "byte" + }, + "incoming": { + "type": "boolean", + "format": "boolean" + }, + "revocation_delay": { + "type": "integer", + "format": "int64" + } + } + }, + "lnrpcInvoice": { + "type": "object", + "properties": { + "memo": { + "type": "string", + "format": "string" + }, + "r_hash": { + "type": "string", + "format": "byte" + }, + "r_preimage": { + "type": "string", + "format": "byte" + }, + "receipt": { + "type": "string", + "format": "byte" + }, + "settled": { + "type": "boolean", + "format": "boolean" + }, + "value": { + "type": "string", + "format": "int64" + } + } + }, + "lnrpcInvoiceSubscription": { + "type": "object" + }, + "lnrpcLightningAddress": { + "type": "object", + "properties": { + "host": { + "type": "string", + "format": "string" + }, + "pubKeyHash": { + "type": "string", + "format": "string" + } + } + }, + "lnrpcListChannelsRequest": { + "type": "object" + }, + "lnrpcListChannelsResponse": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcActiveChannel" + } + } + } + }, + "lnrpcListInvoiceRequest": { + "type": "object", + "properties": { + "pending_only": { + "type": "boolean", + "format": "boolean" + } + } + }, + "lnrpcListInvoiceResponse": { + "type": "object", + "properties": { + "invoices": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcInvoice" + } + } + } + }, + "lnrpcListPeersRequest": { + "type": "object" + }, + "lnrpcListPeersResponse": { + "type": "object", + "properties": { + "peers": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcPeer" + } + } + } + }, + "lnrpcNewAddressResponse": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "string" + } + } + }, + "lnrpcNewWitnessAddressRequest": { + "type": "object" + }, + "lnrpcOpenChannelRequest": { + "type": "object", + "properties": { + "commission_size": { + "type": "string", + "format": "int64" + }, + "local_funding_amount": { + "type": "string", + "format": "int64" + }, + "num_confs": { + "type": "integer", + "format": "int64" + }, + "remote_funding_amount": { + "type": "string", + "format": "int64" + }, + "target_node": { + "type": "string", + "format": "byte" + }, + "target_peer_id": { + "type": "integer", + "format": "int32" + } + } + }, + "lnrpcOpenStatusUpdate": { + "type": "object", + "properties": { + "chan_open": { + "$ref": "#/definitions/lnrpcChannelOpenUpdate" + }, + "chan_pending": { + "$ref": "#/definitions/lnrpcPendingUpdate" + }, + "confirmation": { + "$ref": "#/definitions/lnrpcConfirmationUpdate" + } + } + }, + "lnrpcPaymentHash": { + "type": "object", + "properties": { + "r_hash": { + "type": "string", + "format": "byte" + }, + "r_hash_str": { + "type": "string", + "format": "string" + } + } + }, + "lnrpcPeer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "string" + }, + "bytes_recv": { + "type": "string", + "format": "uint64" + }, + "bytes_sent": { + "type": "string", + "format": "uint64" + }, + "inbound": { + "type": "boolean", + "format": "boolean" + }, + "lightning_id": { + "type": "string", + "format": "string" + }, + "peer_id": { + "type": "integer", + "format": "int32" + }, + "sat_recv": { + "type": "string", + "format": "int64" + }, + "sat_sent": { + "type": "string", + "format": "int64" + } + } + }, + "lnrpcPendingChannelRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/lnrpcChannelStatus" + } + } + }, + "lnrpcPendingChannelResponse": { + "type": "object", + "properties": { + "pending_channels": { + "type": "array", + "items": { + "$ref": "#/definitions/PendingChannelResponsePendingChannel" + } + } + } + }, + "lnrpcPendingUpdate": { + "type": "object", + "properties": { + "txid": { + "type": "string", + "format": "byte" + } + } + }, + "lnrpcSendCoinsRequest": { + "type": "object", + "properties": { + "addr": { + "type": "string", + "format": "string" + }, + "amount": { + "type": "string", + "format": "int64" + } + } + }, + "lnrpcSendCoinsResponse": { + "type": "object", + "properties": { + "txid": { + "type": "string", + "format": "string" + } + } + }, + "lnrpcSendRequest": { + "type": "object", + "properties": { + "amt": { + "type": "string", + "format": "int64" + }, + "dest": { + "type": "string", + "format": "byte" + }, + "fast_send": { + "type": "boolean", + "format": "boolean" + }, + "payment_hash": { + "type": "string", + "format": "byte" + } + } + }, + "lnrpcSendResponse": { + "type": "object" + }, + "lnrpcTransaction": { + "type": "object", + "properties": { + "amount": { + "type": "number", + "format": "double" + }, + "block_hash": { + "type": "string", + "format": "string" + }, + "block_height": { + "type": "integer", + "format": "int32" + }, + "num_confirmations": { + "type": "integer", + "format": "int32" + }, + "time_stamp": { + "type": "string", + "format": "int64" + }, + "total_fees": { + "type": "string", + "format": "int64" + }, + "tx_hash": { + "type": "string", + "format": "string" + } + } + }, + "lnrpcTransactionDetails": { + "type": "object", + "properties": { + "transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcTransaction" + } + } + } + }, + "lnrpcWalletBalanceRequest": { + "type": "object", + "properties": { + "witness_only": { + "type": "boolean", + "format": "boolean" + } + } + }, + "lnrpcWalletBalanceResponse": { + "type": "object", + "properties": { + "balance": { + "type": "number", + "format": "double" + } + } + } + } +}