channeldb: save outgoing payments

Add structure for outgoing payments. Saving payment in DB
after successful payment send. Add RPC call for listing
all payments.
This commit is contained in:
BitfuryLightning 2016-12-05 06:59:36 -05:00 committed by Olaoluwa Osuntokun
parent 343cd7779f
commit eb4d0e035e
12 changed files with 1117 additions and 168 deletions

@ -14,6 +14,8 @@ var (
ErrNoInvoicesCreated = fmt.Errorf("there are no existing invoices")
ErrDuplicateInvoice = fmt.Errorf("invoice with payment hash already exists")
ErrNoPaymentsCreated = fmt.Errorf("there are no existing payments")
ErrNodeNotFound = fmt.Errorf("link node with target identity not found")
ErrMetaNotFound = fmt.Errorf("unable to locate meta information")

@ -98,11 +98,7 @@ type Invoice struct {
Terms ContractTerm
}
// AddInvoice inserts the targeted invoice into the database. If the invoice
// has *any* payment hashes which already exists within the database, then the
// insertion will be aborted and rejected due to the strict policy banning any
// duplicate payment hashes.
func (d *DB) AddInvoice(i *Invoice) error {
func validateInvoice(i *Invoice) error {
if len(i.Memo) > MaxMemoSize {
return fmt.Errorf("max length a memo is %v, and invoice "+
"of length %v was provided", MaxMemoSize, len(i.Memo))
@ -112,7 +108,18 @@ func (d *DB) AddInvoice(i *Invoice) error {
"of length %v was provided", MaxReceiptSize,
len(i.Receipt))
}
return nil
}
// AddInvoice inserts the targeted invoice into the database. If the invoice
// has *any* payment hashes which already exists within the database, then the
// insertion will be aborted and rejected due to the strict policy banning any
// duplicate payment hashes.
func (d *DB) AddInvoice(i *Invoice) error {
err := validateInvoice(i)
if err != nil {
return err
}
return d.Update(func(tx *bolt.Tx) error {
invoices, err := tx.CreateBucketIfNotExists(invoiceBucket)
if err != nil {

211
channeldb/payments.go Normal file

@ -0,0 +1,211 @@
package channeldb
import (
"github.com/roasbeef/btcutil"
"io"
"github.com/roasbeef/btcd/wire"
"github.com/boltdb/bolt"
"encoding/binary"
"bytes"
)
var (
// invoiceBucket is the name of the bucket within the database that
// stores all data related to payments.
// Within the payments bucket, each invoice is keyed by its invoice ID
// which is a monotonically increasing uint64.
// BoltDB sequence feature is used for generating monotonically increasing
// id.
paymentBucket = []byte("payments")
)
type OutgoingPayment struct {
Invoice
// Total fee paid
Fee btcutil.Amount
// Path including starting and ending nodes
Path [][]byte
TimeLockLength uint64
// We probably need both RHash and Preimage
// because we start knowing only RHash
RHash [32]byte
}
func validatePayment(p *OutgoingPayment) error {
err := validateInvoice(&p.Invoice)
if err != nil {
return err
}
return nil
}
// AddPayment adds payment to DB.
// There is no checking that payment with the same hash already exist.
func (db *DB) AddPayment(p *OutgoingPayment) error {
err := validatePayment(p)
if err != nil {
return err
}
// We serialize before writing to database
// so no db access in the case of serialization errors
b := new(bytes.Buffer)
err = serializeOutgoingPayment(b, p)
if err != nil {
return err
}
paymentBytes := b.Bytes()
return db.Update(func (tx *bolt.Tx) error {
payments, err := tx.CreateBucketIfNotExists(paymentBucket)
if err != nil {
return err
}
paymentId, err := payments.NextSequence()
if err != nil {
return err
}
// We use BigEndian for keys because
// it orders keys in ascending order
paymentIdBytes := make([]byte, 8)
binary.BigEndian.PutUint64(paymentIdBytes, paymentId)
err = payments.Put(paymentIdBytes, paymentBytes)
if err != nil {
return err
}
return nil
})
}
// FetchAllPayments returns all outgoing payments in DB.
func (db *DB) FetchAllPayments() ([]*OutgoingPayment, error) {
var payments []*OutgoingPayment
err := db.View(func (tx *bolt.Tx) error {
bucket := tx.Bucket(paymentBucket)
if bucket == nil {
return nil
}
err := bucket.ForEach(func (k, v []byte) error {
// Value can be nil if it is a sub-backet
// so simply ignore it.
if v == nil {
return nil
}
r := bytes.NewReader(v)
payment, err := deserializeOutgoingPayment(r)
if err != nil {
return err
}
payments = append(payments, payment)
return nil
})
return err
})
if err != nil {
return nil, err
}
return payments, nil
}
// DeleteAllPayments deletes all payments from DB.
// If payments bucket does not exist it will create
// new bucket without error.
func (db *DB) DeleteAllPayments() error {
return db.Update(func (tx *bolt.Tx) error {
err := tx.DeleteBucket(paymentBucket)
if err != nil && err != bolt.ErrBucketNotFound {
return err
}
_, err = tx.CreateBucket(paymentBucket)
if err != nil {
return err
}
return err
})
}
func serializeOutgoingPayment(w io.Writer, p *OutgoingPayment) error {
err := serializeInvoice(w, &p.Invoice)
if err != nil {
return err
}
// Serialize fee.
feeBytes := make([]byte, 8)
byteOrder.PutUint64(feeBytes, uint64(p.Fee))
_, err = w.Write(feeBytes)
if err != nil {
return err
}
// Serialize path.
pathLen := uint32(len(p.Path))
pathLenBytes := make([]byte, 4)
byteOrder.PutUint32(pathLenBytes, pathLen)
_, err = w.Write(pathLenBytes)
if err != nil {
return err
}
for i := uint32(0); i < pathLen; i++ {
err := wire.WriteVarBytes(w, 0, p.Path[i])
if err != nil {
return err
}
}
// Serialize TimeLockLength
timeLockLengthBytes := make([]byte, 8)
byteOrder.PutUint64(timeLockLengthBytes, p.TimeLockLength)
_, err = w.Write(timeLockLengthBytes)
if err != nil {
return err
}
// Serialize RHash
_, err = w.Write(p.RHash[:])
if err != nil {
return err
}
return nil
}
func deserializeOutgoingPayment(r io.Reader) (*OutgoingPayment, error) {
p := &OutgoingPayment{}
// Deserialize invoice
inv, err := deserializeInvoice(r)
if err != nil {
return nil, err
}
p.Invoice = *inv
// Deserialize fee
feeBytes := make([]byte, 8)
_, err = r.Read(feeBytes)
if err != nil {
return nil, err
}
p.Fee = btcutil.Amount(byteOrder.Uint64(feeBytes))
// Deserialize path
pathLenBytes := make([]byte, 4)
_, err = r.Read(pathLenBytes)
if err != nil {
return nil, err
}
pathLen := byteOrder.Uint32(pathLenBytes)
path := make([][]byte, pathLen)
for i := uint32(0); i<pathLen; i++ {
// Each node in path have 33 bytes. It may be changed in future.
// So put 100 here.
path[i], err = wire.ReadVarBytes(r, 0, 100, "Node id")
if err != nil {
return nil, err
}
}
p.Path = path
// Deserialize TimeLockLength
timeLockLengthBytes := make([]byte, 8)
_, err = r.Read(timeLockLengthBytes)
if err != nil {
return nil, err
}
p.TimeLockLength = byteOrder.Uint64(timeLockLengthBytes)
// Deserialize RHash
_, err = r.Read(p.RHash[:])
if err != nil {
return nil, err
}
return p, nil
}

163
channeldb/payments_test.go Normal file

@ -0,0 +1,163 @@
package channeldb
import (
"testing"
"time"
"github.com/roasbeef/btcutil"
"bytes"
"reflect"
"github.com/davecgh/go-spew/spew"
"math/rand"
"fmt"
"github.com/btcsuite/fastsha256"
)
func makeFakePayment() *OutgoingPayment {
// Create a fake invoice which we'll use several times in the tests
// below.
fakeInvoice := &Invoice{
CreationDate: time.Now(),
}
fakeInvoice.Memo = []byte("memo")
fakeInvoice.Receipt = []byte("recipt")
copy(fakeInvoice.Terms.PaymentPreimage[:], rev[:])
fakeInvoice.Terms.Value = btcutil.Amount(10000)
// Make fake path
fakePath := make([][]byte, 3)
for i:=0; i<3; i++ {
fakePath[i] = make([]byte, 33)
for j:=0; j<33; j++ {
fakePath[i][j] = byte(i)
}
}
var rHash [32]byte = fastsha256.Sum256(rev[:])
fakePayment := & OutgoingPayment{
Invoice: *fakeInvoice,
Fee: 101,
Path: fakePath,
TimeLockLength: 1000,
RHash: rHash,
}
return fakePayment
}
// randomBytes creates random []byte with length
// in range [minLen, maxLen)
func randomBytes(minLen, maxLen int) []byte {
l := minLen + rand.Intn(maxLen-minLen)
b := make([]byte, l)
_, err := rand.Read(b)
if err != nil {
panic(fmt.Sprintf("Internal error. Cannot generate random string: %v", err))
}
return b
}
func makeRandomFakePayment() *OutgoingPayment {
// Create a fake invoice which we'll use several times in the tests
// below.
fakeInvoice := &Invoice{
CreationDate: time.Now(),
}
fakeInvoice.Memo = randomBytes(1, 50)
fakeInvoice.Receipt = randomBytes(1, 50)
copy(fakeInvoice.Terms.PaymentPreimage[:], randomBytes(32, 33))
fakeInvoice.Terms.Value = btcutil.Amount(rand.Intn(10000))
// Make fake path
fakePathLen := 1 + rand.Intn(5)
fakePath := make([][]byte, fakePathLen)
for i:=0; i<fakePathLen; i++ {
fakePath[i] = randomBytes(33, 34)
}
var rHash [32]byte = fastsha256.Sum256(
fakeInvoice.Terms.PaymentPreimage[:],
)
fakePayment := & OutgoingPayment{
Invoice: *fakeInvoice,
Fee: btcutil.Amount(rand.Intn(1001)),
Path: fakePath,
TimeLockLength: uint64(rand.Intn(10000)),
RHash: rHash,
}
return fakePayment
}
func TestOutgoingPaymentSerialization(t *testing.T) {
fakePayment := makeFakePayment()
b := new(bytes.Buffer)
err := serializeOutgoingPayment(b, fakePayment)
if err != nil {
t.Fatalf("Can't serialize outgoing payment: %v", err)
}
newPayment, err := deserializeOutgoingPayment(b)
if err != nil {
t.Fatalf("Can't deserialize outgoing payment: %v", err)
}
if !reflect.DeepEqual(fakePayment, newPayment) {
t.Fatalf("Payments do not match after serialization/deserialization %v vs %v",
spew.Sdump(fakePayment),
spew.Sdump(newPayment),
)
}
}
func TestOutgoingPaymentWorkflow(t *testing.T) {
db, cleanUp, err := makeTestDB()
if err != nil {
t.Fatalf("unable to make test db: %v", err)
}
defer cleanUp()
fakePayment := makeFakePayment()
err = db.AddPayment(fakePayment)
if err != nil {
t.Fatalf("Can't put payment in DB: %v", err)
}
payments, err := db.FetchAllPayments()
if err != nil {
t.Fatalf("Can't get payments from DB: %v", err)
}
correctPayments := []*OutgoingPayment{fakePayment}
if !reflect.DeepEqual(payments, correctPayments) {
t.Fatalf("Wrong payments after reading from DB."+
"Got %v, want %v",
spew.Sdump(payments),
spew.Sdump(correctPayments),
)
}
// Make some random payments
for i:=0; i<5; i++ {
randomPayment := makeRandomFakePayment()
err := db.AddPayment(randomPayment)
if err != nil {
t.Fatalf("Can't put payment in DB: %v", err)
}
correctPayments = append(correctPayments, randomPayment)
}
payments, err = db.FetchAllPayments()
if err != nil {
t.Fatalf("Can't get payments from DB: %v", err)
}
if !reflect.DeepEqual(payments, correctPayments) {
t.Fatalf("Wrong payments after reading from DB."+
"Got %v, want %v",
spew.Sdump(payments),
spew.Sdump(correctPayments),
)
}
// Delete all payments.
err = db.DeleteAllPayments()
if err != nil {
t.Fatalf("Can't delete payments from DB: %v", err)
}
paymentsAfterDeletion, err := db.FetchAllPayments()
if err != nil {
t.Fatalf("Can't get payments after deletion: %v", err)
}
if len(paymentsAfterDeletion) != 0 {
t.Fatalf("After deletion DB has %v payments, want %v", len(paymentsAfterDeletion), 0)
}
}

@ -1076,3 +1076,27 @@ func printRTAsJSON(r *rt.RoutingTable) {
}
printRespJson(channels)
}
var ListPaymentsCommand = cli.Command{
Name: "listpayments",
Usage: "listpayments",
Description: "list all outgoing payments",
Action: listPayments,
}
func listPayments(ctx *cli.Context) error {
client := getClient(ctx)
req := &lnrpc.ListPaymentsRequest{}
payments, err := client.ListPayments(context.Background(), req)
if err != nil {
return err
}
printRespJson(payments)
return nil
}

@ -66,6 +66,7 @@ func main() {
ListInvoicesCommand,
ShowRoutingTableCommand,
ListChannelsCommand,
ListPaymentsCommand,
}
if err := app.Run(os.Args); err != nil {

@ -24,6 +24,8 @@ import (
"github.com/roasbeef/btcutil"
"golang.org/x/net/context"
"google.golang.org/grpc"
"reflect"
"encoding/hex"
)
// harnessTest wraps a regular testing.T providing enhanced error detection
@ -491,6 +493,128 @@ func testSingleHopInvoice(net *networkHarness, t *harnessTest) {
closeChannelAndAssert(t, net, ctxt, net.Alice, chanPoint, false)
}
func testListPayments(net *networkHarness, t *harnessTest) {
ctxb := context.Background()
timeout := time.Duration(time.Second * 5)
ctxt, _ := context.WithTimeout(ctxb, timeout)
// Delete all payments from Alice. DB should have no payments
deleteAllPaymentsInitialReq := &lnrpc.DeleteAllPaymentsRequest{}
_, err := net.Alice.DeleteAllPayments(ctxt, deleteAllPaymentsInitialReq)
if err != nil {
t.Fatalf("Can't delete payments at the begining: %v", err)
}
// Check that there are no payments before test.
reqInit := &lnrpc.ListPaymentsRequest{}
paymentsRespInit, err := net.Alice.ListPayments(ctxt, reqInit)
if err != nil {
t.Fatalf("error when obtaining Alice payments: %v", err)
}
if len(paymentsRespInit.Payments) != 0 {
t.Fatalf("incorrect number of payments, got %v, want %v", len(paymentsRespInit.Payments), 0)
}
// Open a channel with 100k satoshis between Alice and Bob with Alice being
// the sole funder of the channel.
chanAmt := btcutil.Amount(100000)
chanPoint := openChannelAndAssert(t, net, ctxt, net.Alice, net.Bob, chanAmt)
// Now that the channel is open, create an invoice for Bob which
// expects a payment of 1000 satoshis from Alice paid via a particular
// pre-image.
const paymentAmt = 1000
preimage := bytes.Repeat([]byte("B"), 32)
invoice := &lnrpc.Invoice{
Memo: "testing",
RPreimage: preimage,
Value: paymentAmt,
}
invoiceResp, err := net.Bob.AddInvoice(ctxt, invoice)
if err != nil {
t.Fatalf("unable to add invoice: %v", err)
}
// With the invoice for Bob added, send a payment towards Alice paying
// to the above generated invoice.
sendStream, err := net.Alice.SendPayment(ctxt)
if err != nil {
t.Fatalf("unable to create alice payment stream: %v", err)
}
sendReq := &lnrpc.SendRequest{
PaymentHash: invoiceResp.RHash,
Dest: net.Bob.PubKey[:],
Amt: paymentAmt,
}
if err := sendStream.Send(sendReq); err != nil {
t.Fatalf("unable to send payment: %v", err)
}
if _, err := sendStream.Recv(); err != nil {
t.Fatalf("error when attempting recv: %v", err)
}
// We doesn't check different states of parties
// like balance here because it is already checked in
// testSingleHopInvoice
req := &lnrpc.ListPaymentsRequest{}
paymentsResp, err := net.Alice.ListPayments(ctxt, req)
if err != nil {
t.Fatalf("error when obtaining Alice payments: %v", err)
}
if len(paymentsResp.Payments) != 1 {
t.Fatalf("incorrect number of payments, got %v, want %v", len(paymentsResp.Payments), 1)
}
p := paymentsResp.Payments[0]
// Check path.
expectedPath := []string {
net.Alice.PubKeyStr,
net.Bob.PubKeyStr,
}
if !reflect.DeepEqual(p.Path, expectedPath) {
t.Fatalf("incorrect path, got %v, want %v", p.Path, expectedPath)
}
// Check amount.
if p.Value != paymentAmt {
t.Fatalf("incorrect amount, got %v, want %v", p.Value, paymentAmt)
}
// Check RHash.
correctRHash := hex.EncodeToString(invoiceResp.RHash)
if !reflect.DeepEqual(p.RHash, correctRHash){
t.Fatalf("incorrect RHash, got %v, want %v", p.RHash, correctRHash)
}
// Check Fee.
// Currently there is no fees so assume value 0 for fees.
if p.Fee != 0 {
t.Fatalf("incorrect Fee, got %v, want %v", p.Fee, 0)
}
// Delete all payments from Alice. DB should have no payments.
deleteAllPaymentsEndReq := &lnrpc.DeleteAllPaymentsRequest{}
_, err = net.Alice.DeleteAllPayments(ctxt, deleteAllPaymentsEndReq)
if err != nil {
t.Fatalf("Can't delete payments at the end: %v", err)
}
// Check that there are no payments before test.
reqEnd := &lnrpc.ListPaymentsRequest{}
_, err = net.Alice.ListPayments(ctxt, reqEnd)
if err != nil {
t.Fatalf("error when obtaining Alice payments: %v", err)
}
if len(paymentsRespInit.Payments) != 0 {
t.Fatalf("incorrect number of payments, got %v, want %v", len(paymentsRespInit.Payments), 0)
}
ctxt, _ = context.WithTimeout(ctxb, timeout)
closeChannelAndAssert(t, net, ctxt, net.Alice, chanPoint, false)
}
func testMultiHopPayments(net *networkHarness, t *harnessTest) {
const chanAmt = btcutil.Amount(100000)
ctxb := context.Background()
@ -1205,6 +1329,10 @@ var testsCases = []*testCase{
name: "single hop invoice",
test: testSingleHopInvoice,
},
{
name: "list of outgoing payments",
test: testListPayments,
},
{
name: "max pending channel",
test: testMaxPendingChannels,

@ -57,6 +57,11 @@ It has these top-level messages:
ListInvoiceRequest
ListInvoiceResponse
InvoiceSubscription
Payment
ListPaymentsRequest
ListPaymentsResponse
DeleteAllPaymentsRequest
DeleteAllPaymentsResponse
*/
package lnrpc
@ -1685,6 +1690,94 @@ func (m *InvoiceSubscription) String() string { return proto.CompactT
func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
type Payment struct {
RHash string `protobuf:"bytes,1,opt,name=r_hash" json:"r_hash,omitempty"`
Value int64 `protobuf:"varint,2,opt,name=value" json:"value,omitempty"`
CreationDate int64 `protobuf:"varint,3,opt,name=creation_date" json:"creation_date,omitempty"`
Path []string `protobuf:"bytes,4,rep,name=path" json:"path,omitempty"`
Fee int64 `protobuf:"varint,5,opt,name=fee" json:"fee,omitempty"`
}
func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (m *Payment) GetRHash() string {
if m != nil {
return m.RHash
}
return ""
}
func (m *Payment) GetValue() int64 {
if m != nil {
return m.Value
}
return 0
}
func (m *Payment) GetCreationDate() int64 {
if m != nil {
return m.CreationDate
}
return 0
}
func (m *Payment) GetPath() []string {
if m != nil {
return m.Path
}
return nil
}
func (m *Payment) GetFee() int64 {
if m != nil {
return m.Fee
}
return 0
}
type ListPaymentsRequest struct {
}
func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
type ListPaymentsResponse struct {
Payments []*Payment `protobuf:"bytes,1,rep,name=payments" json:"payments,omitempty"`
}
func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
func (m *ListPaymentsResponse) GetPayments() []*Payment {
if m != nil {
return m.Payments
}
return nil
}
type DeleteAllPaymentsRequest struct {
}
func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} }
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
type DeleteAllPaymentsResponse struct {
}
func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} }
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func init() {
proto.RegisterType((*Transaction)(nil), "lnrpc.Transaction")
proto.RegisterType((*GetTransactionsRequest)(nil), "lnrpc.GetTransactionsRequest")
@ -1735,6 +1828,11 @@ func init() {
proto.RegisterType((*ListInvoiceRequest)(nil), "lnrpc.ListInvoiceRequest")
proto.RegisterType((*ListInvoiceResponse)(nil), "lnrpc.ListInvoiceResponse")
proto.RegisterType((*InvoiceSubscription)(nil), "lnrpc.InvoiceSubscription")
proto.RegisterType((*Payment)(nil), "lnrpc.Payment")
proto.RegisterType((*ListPaymentsRequest)(nil), "lnrpc.ListPaymentsRequest")
proto.RegisterType((*ListPaymentsResponse)(nil), "lnrpc.ListPaymentsResponse")
proto.RegisterType((*DeleteAllPaymentsRequest)(nil), "lnrpc.DeleteAllPaymentsRequest")
proto.RegisterType((*DeleteAllPaymentsResponse)(nil), "lnrpc.DeleteAllPaymentsResponse")
proto.RegisterEnum("lnrpc.ChannelStatus", ChannelStatus_name, ChannelStatus_value)
proto.RegisterEnum("lnrpc.NewAddressRequest_AddressType", NewAddressRequest_AddressType_name, NewAddressRequest_AddressType_value)
}
@ -1774,6 +1872,8 @@ type LightningClient interface {
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)
ListPayments(ctx context.Context, in *ListPaymentsRequest, opts ...grpc.CallOption) (*ListPaymentsResponse, error)
DeleteAllPayments(ctx context.Context, in *DeleteAllPaymentsRequest, opts ...grpc.CallOption) (*DeleteAllPaymentsResponse, error)
}
type lightningClient struct {
@ -2105,6 +2205,24 @@ func (c *lightningClient) ShowRoutingTable(ctx context.Context, in *ShowRoutingT
return out, nil
}
func (c *lightningClient) ListPayments(ctx context.Context, in *ListPaymentsRequest, opts ...grpc.CallOption) (*ListPaymentsResponse, error) {
out := new(ListPaymentsResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListPayments", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lightningClient) DeleteAllPayments(ctx context.Context, in *DeleteAllPaymentsRequest, opts ...grpc.CallOption) (*DeleteAllPaymentsResponse, error) {
out := new(DeleteAllPaymentsResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/DeleteAllPayments", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Lightning service
type LightningServer interface {
@ -2132,6 +2250,8 @@ type LightningServer interface {
LookupInvoice(context.Context, *PaymentHash) (*Invoice, error)
SubscribeInvoices(*InvoiceSubscription, Lightning_SubscribeInvoicesServer) error
ShowRoutingTable(context.Context, *ShowRoutingTableRequest) (*ShowRoutingTableResponse, error)
ListPayments(context.Context, *ListPaymentsRequest) (*ListPaymentsResponse, error)
DeleteAllPayments(context.Context, *DeleteAllPaymentsRequest) (*DeleteAllPaymentsResponse, error)
}
func RegisterLightningServer(s *grpc.Server, srv LightningServer) {
@ -2572,6 +2692,42 @@ func _Lightning_ShowRoutingTable_Handler(srv interface{}, ctx context.Context, d
return interceptor(ctx, in, info, handler)
}
func _Lightning_ListPayments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListPaymentsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).ListPayments(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/ListPayments",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).ListPayments(ctx, req.(*ListPaymentsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Lightning_DeleteAllPayments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteAllPaymentsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).DeleteAllPayments(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/DeleteAllPayments",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).DeleteAllPayments(ctx, req.(*DeleteAllPaymentsRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Lightning_serviceDesc = grpc.ServiceDesc{
ServiceName: "lnrpc.Lightning",
HandlerType: (*LightningServer)(nil),
@ -2648,6 +2804,14 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
MethodName: "ShowRoutingTable",
Handler: _Lightning_ShowRoutingTable_Handler,
},
{
MethodName: "ListPayments",
Handler: _Lightning_ListPayments_Handler,
},
{
MethodName: "DeleteAllPayments",
Handler: _Lightning_DeleteAllPayments_Handler,
},
},
Streams: []grpc.StreamDesc{
{
@ -2683,152 +2847,158 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 2338 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x59, 0x4b, 0x6f, 0x1c, 0x49,
0x1d, 0x4f, 0x7b, 0x3c, 0xf6, 0xcc, 0x7f, 0xde, 0x35, 0x4f, 0x8f, 0x93, 0x8d, 0xb7, 0xc8, 0xae,
0xbc, 0x51, 0xd6, 0x76, 0xbc, 0x07, 0x50, 0x56, 0x2c, 0x72, 0xbc, 0x26, 0x8e, 0xf0, 0x3a, 0x66,
0xc7, 0xd9, 0x88, 0x45, 0x68, 0xb6, 0xdd, 0x53, 0x1e, 0xf7, 0xa6, 0xa7, 0xba, 0xe9, 0xaa, 0xb1,
0x33, 0x44, 0xb9, 0x80, 0xc4, 0x19, 0x09, 0x09, 0x21, 0x21, 0xf1, 0x09, 0x10, 0xe2, 0xc8, 0x27,
0xe0, 0xc2, 0x91, 0x0b, 0x1f, 0x80, 0x0f, 0x82, 0xea, 0xd1, 0xdd, 0xd5, 0x3d, 0x9d, 0x88, 0x3d,
0x70, 0xf3, 0xfc, 0xab, 0xea, 0xf7, 0x7f, 0xbf, 0xda, 0x50, 0x0e, 0x03, 0x67, 0x27, 0x08, 0x7d,
0xee, 0xa3, 0xa2, 0x47, 0xc3, 0xc0, 0x19, 0xde, 0x9e, 0xfa, 0xfe, 0xd4, 0x23, 0xbb, 0x76, 0xe0,
0xee, 0xda, 0x94, 0xfa, 0xdc, 0xe6, 0xae, 0x4f, 0x99, 0xba, 0x84, 0xff, 0x64, 0x41, 0xe5, 0x3c,
0xb4, 0x29, 0xb3, 0x1d, 0x41, 0x46, 0x0d, 0x58, 0xe7, 0xaf, 0xc6, 0x57, 0x36, 0xbb, 0x1a, 0x58,
0x5b, 0xd6, 0x76, 0x19, 0xd5, 0x61, 0xcd, 0x9e, 0xf9, 0x73, 0xca, 0x07, 0x2b, 0x5b, 0xd6, 0xb6,
0x85, 0x36, 0xa0, 0x45, 0xe7, 0xb3, 0xb1, 0xe3, 0xd3, 0x4b, 0x37, 0x9c, 0x29, 0xac, 0x41, 0x61,
0xcb, 0xda, 0x2e, 0x22, 0x04, 0x70, 0xe1, 0xf9, 0xce, 0x4b, 0xf5, 0x7c, 0x55, 0x3e, 0xef, 0x40,
0x55, 0xd3, 0x88, 0x3b, 0xbd, 0xe2, 0x83, 0x62, 0x74, 0x93, 0xbb, 0x33, 0x32, 0x66, 0xdc, 0x9e,
0x05, 0x83, 0xb5, 0x2d, 0x6b, 0xbb, 0x20, 0x69, 0x3e, 0xb7, 0xbd, 0xf1, 0x25, 0x21, 0x6c, 0xb0,
0x2e, 0x68, 0x78, 0x00, 0xbd, 0x27, 0x84, 0x1b, 0xf2, 0xb1, 0x2f, 0xc9, 0x2f, 0xe7, 0x84, 0x71,
0xfc, 0x19, 0x20, 0x83, 0xfc, 0x39, 0xe1, 0xb6, 0xeb, 0x31, 0xb4, 0x0d, 0x55, 0x6e, 0x5c, 0x1e,
0x58, 0x5b, 0x85, 0xed, 0xca, 0x3e, 0xda, 0x91, 0x96, 0xd8, 0x31, 0x1e, 0xe0, 0xdf, 0x58, 0x50,
0x19, 0x11, 0x3a, 0xd1, 0x78, 0xa8, 0x0a, 0xab, 0x13, 0xc2, 0xb8, 0x54, 0xba, 0x8a, 0xda, 0x50,
0x11, 0xbf, 0xc6, 0x8c, 0x87, 0x2e, 0x9d, 0x4a, 0xcd, 0xcb, 0xa8, 0x02, 0x05, 0x7b, 0xc6, 0xa5,
0xae, 0x05, 0xa1, 0x57, 0x60, 0x2f, 0x66, 0x84, 0xf2, 0x44, 0xdb, 0x2a, 0xda, 0x84, 0xb6, 0x49,
0x8d, 0xde, 0x17, 0xe5, 0xfb, 0x16, 0x94, 0x2f, 0x6d, 0x01, 0x4a, 0xe8, 0x44, 0xea, 0x5c, 0xc2,
0x75, 0xa8, 0x2a, 0x21, 0x58, 0xe0, 0x53, 0x46, 0xf0, 0x39, 0x54, 0x0f, 0xaf, 0x6c, 0x4a, 0x89,
0x77, 0xe6, 0xbb, 0x94, 0x0b, 0x2e, 0x97, 0x73, 0x3a, 0x71, 0xe9, 0x74, 0xcc, 0x5f, 0xb9, 0x13,
0x2d, 0xdd, 0x00, 0x9a, 0x26, 0x55, 0x70, 0xd1, 0x22, 0x76, 0xa0, 0xea, 0xcf, 0x79, 0x30, 0xe7,
0x63, 0x97, 0x4e, 0xc8, 0x2b, 0x29, 0x6b, 0x0d, 0xef, 0x41, 0xf3, 0x44, 0x18, 0x9f, 0xba, 0x74,
0x7a, 0x30, 0x99, 0x84, 0x84, 0x31, 0xe1, 0xd6, 0x60, 0x7e, 0xf1, 0x92, 0x2c, 0xb4, 0x9b, 0xab,
0xb0, 0x7a, 0xe5, 0x33, 0xe5, 0xe4, 0x32, 0xfe, 0xad, 0x05, 0x0d, 0x21, 0xd8, 0x17, 0x36, 0x5d,
0x44, 0x16, 0xfa, 0x0c, 0xaa, 0xe2, 0xf1, 0xb9, 0x7f, 0xa0, 0xc2, 0x41, 0xd9, 0x76, 0x5b, 0xdb,
0x36, 0x73, 0x7b, 0xc7, 0xbc, 0x7a, 0x44, 0x79, 0xb8, 0x18, 0x7e, 0x02, 0xad, 0x25, 0xa2, 0xb0,
0x69, 0x22, 0x43, 0x0d, 0x8a, 0xd7, 0xb6, 0x37, 0x27, 0x52, 0x88, 0xc2, 0xa3, 0x95, 0x1f, 0x58,
0x78, 0x0b, 0x9a, 0x09, 0xb2, 0x32, 0x92, 0x10, 0x35, 0x36, 0x46, 0x59, 0x28, 0x27, 0x6e, 0x1c,
0xfa, 0x6e, 0x1c, 0x1c, 0xe2, 0x86, 0x3d, 0x99, 0x84, 0xb9, 0x11, 0x5c, 0xc0, 0xef, 0x43, 0xcb,
0x78, 0x91, 0x0b, 0xfa, 0x47, 0x0b, 0x5a, 0xa7, 0xe4, 0x46, 0x1b, 0x2b, 0x82, 0xdd, 0x87, 0x55,
0xbe, 0x08, 0x88, 0xbc, 0x53, 0xdf, 0xbf, 0xa7, 0x35, 0x5f, 0xba, 0xb7, 0xa3, 0x7f, 0x9e, 0x2f,
0x02, 0x82, 0x9f, 0x41, 0xc5, 0xf8, 0x89, 0xfa, 0xd0, 0x7e, 0xf1, 0xf4, 0xfc, 0xf4, 0x68, 0x34,
0x1a, 0x9f, 0x3d, 0x7f, 0xfc, 0x93, 0xa3, 0x9f, 0x8d, 0x8f, 0x0f, 0x46, 0xc7, 0xcd, 0x5b, 0xa8,
0x07, 0xe8, 0xf4, 0x68, 0x74, 0x7e, 0xf4, 0x79, 0x8a, 0x6e, 0xa1, 0x06, 0x54, 0x4c, 0xc2, 0x0a,
0x1e, 0xc2, 0xe0, 0x94, 0xdc, 0xbc, 0x70, 0x39, 0x25, 0x8c, 0xa5, 0x19, 0xe3, 0x0f, 0x00, 0x99,
0xd2, 0x68, 0xd5, 0x1a, 0xb0, 0x6e, 0x2b, 0x92, 0xd6, 0xee, 0x53, 0x40, 0x87, 0x3e, 0xa5, 0xc4,
0xe1, 0x67, 0x84, 0x84, 0x91, 0x76, 0x1f, 0x18, 0x46, 0xab, 0xec, 0xf7, 0xb5, 0x76, 0xd9, 0xc0,
0xc1, 0x1f, 0x42, 0x3b, 0xf5, 0x38, 0x61, 0x12, 0x10, 0x12, 0x8e, 0xb5, 0x09, 0x8b, 0x38, 0x80,
0xd5, 0xe3, 0xf3, 0x93, 0x43, 0xd4, 0x84, 0x92, 0x4b, 0x1d, 0x7f, 0x26, 0xf2, 0x40, 0x9c, 0x94,
0xb2, 0xfe, 0x10, 0x79, 0x21, 0x93, 0x45, 0x94, 0x09, 0x19, 0xb1, 0x55, 0x51, 0x64, 0xc8, 0xab,
0xc0, 0x0d, 0x65, 0x79, 0x89, 0x4a, 0x87, 0x48, 0xb1, 0x9a, 0x08, 0xfe, 0x90, 0x5c, 0xfb, 0x8e,
0x3a, 0x9a, 0x10, 0xcf, 0x5e, 0xc8, 0xfc, 0xaa, 0xe1, 0xdf, 0xad, 0x40, 0xed, 0xc0, 0xe1, 0xee,
0x35, 0xd1, 0x39, 0x84, 0xba, 0x50, 0x0b, 0xc9, 0xcc, 0xe7, 0x64, 0x9c, 0x8a, 0xf5, 0x2e, 0xd4,
0x1c, 0x75, 0x63, 0x1c, 0x88, 0x34, 0xd3, 0xc9, 0xd3, 0x84, 0x92, 0x63, 0x07, 0xb6, 0xe3, 0xf2,
0x85, 0x4e, 0xf2, 0x2e, 0xd4, 0x3c, 0xdf, 0xb1, 0xbd, 0xf1, 0x85, 0xed, 0xd9, 0xd4, 0x21, 0x52,
0x84, 0x02, 0xea, 0x41, 0x5d, 0xc3, 0x46, 0xf4, 0xa2, 0xa4, 0x6f, 0x40, 0x6b, 0x4e, 0x19, 0xe1,
0xdc, 0x23, 0x93, 0xf8, 0x48, 0x15, 0xb7, 0x4d, 0x68, 0xab, 0xe2, 0xc6, 0x6c, 0xee, 0xb3, 0x2b,
0x97, 0x89, 0x2a, 0xc0, 0x55, 0x95, 0x43, 0x77, 0xa1, 0x9f, 0x39, 0x0c, 0x89, 0x43, 0xdc, 0x6b,
0x32, 0x19, 0x94, 0xe4, 0x85, 0x36, 0x54, 0x44, 0xcd, 0x9d, 0x07, 0x13, 0x9b, 0x13, 0x36, 0x28,
0x6f, 0x59, 0xdb, 0xab, 0x08, 0x43, 0x2d, 0x20, 0xaa, 0x0a, 0x5c, 0x71, 0xcf, 0x61, 0x03, 0x90,
0x09, 0x59, 0xd1, 0x8e, 0x13, 0xc6, 0xc7, 0x5d, 0x68, 0x9f, 0xb8, 0x8c, 0x6b, 0x7b, 0x18, 0xc5,
0xb3, 0x93, 0x26, 0x6b, 0x27, 0x7e, 0x08, 0x25, 0x6d, 0x18, 0x36, 0xa8, 0x48, 0xb4, 0x8e, 0x46,
0x4b, 0xd9, 0x15, 0xff, 0xc1, 0x82, 0x55, 0xe1, 0x7d, 0xe9, 0xf5, 0xf9, 0xc5, 0x38, 0x31, 0xad,
0x11, 0x06, 0x2b, 0xb2, 0xd2, 0x1b, 0xc1, 0x57, 0x90, 0x37, 0x44, 0x93, 0x58, 0x70, 0xa2, 0x0d,
0xb0, 0x2a, 0x55, 0x89, 0x69, 0x21, 0x71, 0xae, 0xa5, 0x31, 0x57, 0x85, 0x37, 0x98, 0xcd, 0xd5,
0x2d, 0x65, 0x43, 0x4d, 0x91, 0x77, 0x94, 0xe1, 0x1a, 0xb0, 0xee, 0xd2, 0x0b, 0x7f, 0x4e, 0x95,
0xa1, 0x4a, 0x18, 0x89, 0x4a, 0xc7, 0x64, 0x64, 0xc6, 0xca, 0xee, 0x42, 0xcb, 0xa0, 0x69, 0x4d,
0x87, 0x50, 0x14, 0x72, 0x46, 0x1d, 0x22, 0x32, 0x9a, 0xb8, 0x84, 0x9b, 0x50, 0x7f, 0x42, 0xf8,
0x53, 0x7a, 0xe9, 0x47, 0x10, 0x7f, 0xb7, 0xa0, 0x11, 0x93, 0x34, 0x42, 0x1f, 0x1a, 0xee, 0x84,
0x50, 0xee, 0xf2, 0x45, 0x3a, 0xba, 0x6e, 0x43, 0x47, 0x38, 0x2b, 0xf2, 0x4d, 0x6c, 0xd0, 0x15,
0x19, 0xbe, 0x9b, 0xd0, 0x16, 0xa7, 0xb6, 0xb4, 0x67, 0x72, 0x28, 0x0b, 0xb5, 0xc8, 0x04, 0xf5,
0x54, 0x48, 0xa6, 0xc2, 0x3d, 0xaf, 0x7f, 0xd6, 0x04, 0x73, 0xb6, 0xa0, 0x0e, 0x99, 0x8c, 0xb9,
0x2f, 0x40, 0x5c, 0xaa, 0x1a, 0x8a, 0x6c, 0xdf, 0x84, 0x71, 0x4a, 0x54, 0x6c, 0x95, 0xf0, 0x73,
0x99, 0xeb, 0x71, 0xab, 0x7e, 0x2e, 0x43, 0x48, 0x30, 0x52, 0xa8, 0xec, 0xca, 0xd6, 0x4d, 0x25,
0xcb, 0x48, 0xb9, 0xaf, 0x07, 0xf5, 0xa8, 0xdb, 0xb3, 0xb1, 0x47, 0x2e, 0xb9, 0x6e, 0x29, 0x3f,
0x82, 0x96, 0x0e, 0x86, 0x67, 0x01, 0x89, 0x50, 0xef, 0x67, 0xf3, 0x4a, 0x95, 0x92, 0xb6, 0x36,
0xae, 0xd9, 0xd9, 0x64, 0x0d, 0x52, 0xbf, 0x0f, 0x3d, 0x9f, 0x11, 0x8d, 0xd0, 0x81, 0xaa, 0xe3,
0xf9, 0x2c, 0xd3, 0xef, 0x1a, 0xb0, 0xce, 0xe6, 0x8e, 0x23, 0x62, 0x68, 0x45, 0x2a, 0x35, 0x81,
0xb6, 0x7c, 0xa5, 0x11, 0xa2, 0x0a, 0xf6, 0x1d, 0xf8, 0xc7, 0x13, 0x88, 0xe7, 0xce, 0xdc, 0xa8,
0x10, 0xd5, 0xa0, 0x78, 0xe9, 0x87, 0x0e, 0x91, 0x3a, 0x96, 0xf0, 0xdf, 0x2c, 0x68, 0x49, 0x36,
0x23, 0x6e, 0xf3, 0x39, 0xd3, 0x22, 0x7e, 0x0c, 0x35, 0x21, 0x22, 0x89, 0x1c, 0xac, 0x99, 0x74,
0xe2, 0x08, 0x92, 0x54, 0x75, 0xf9, 0xf8, 0x16, 0x7a, 0x08, 0x55, 0x73, 0x54, 0x92, 0x9c, 0x2a,
0xfb, 0x1b, 0x91, 0x48, 0x4b, 0xae, 0x39, 0xbe, 0x85, 0x76, 0x01, 0x84, 0x1a, 0x63, 0xc9, 0x46,
0xca, 0x62, 0x3c, 0x58, 0xb2, 0xd9, 0xf1, 0xad, 0xc7, 0x25, 0x58, 0x53, 0xa5, 0x01, 0xdf, 0x81,
0x5a, 0x4a, 0x80, 0x54, 0x5b, 0xab, 0xe2, 0x7f, 0x58, 0x80, 0x84, 0xbf, 0x32, 0x76, 0xeb, 0x41,
0x9d, 0xdb, 0xe1, 0x94, 0xf0, 0x71, 0xaa, 0x84, 0xcb, 0xb2, 0xe3, 0x4f, 0xe2, 0xe2, 0xb9, 0x22,
0x9d, 0x31, 0x04, 0x64, 0x10, 0xa3, 0x09, 0xa7, 0x10, 0x85, 0xbe, 0xaa, 0x97, 0xd1, 0x78, 0xa2,
0xeb, 0xbc, 0x2a, 0x9b, 0x77, 0xa0, 0xab, 0xcb, 0x66, 0xe6, 0x58, 0x55, 0xcf, 0x3e, 0x34, 0x1c,
0x7f, 0x36, 0x73, 0x19, 0x13, 0x85, 0x9d, 0xb9, 0xbf, 0x8a, 0x6a, 0xa7, 0xce, 0x0a, 0x19, 0x83,
0x32, 0xaa, 0x6b, 0xf8, 0x2f, 0x16, 0x34, 0x85, 0x22, 0x29, 0xcf, 0x3c, 0x80, 0xaa, 0xb4, 0xdb,
0xff, 0xcd, 0x31, 0x1f, 0x43, 0x59, 0x32, 0xf0, 0x03, 0x42, 0xb5, 0x5f, 0x06, 0x69, 0xbf, 0x24,
0xc9, 0x90, 0x72, 0xcb, 0x0f, 0xa1, 0xab, 0xd9, 0x67, 0x2c, 0x7f, 0x0f, 0xd6, 0x98, 0x54, 0x41,
0xcf, 0x14, 0x9d, 0x34, 0x9c, 0x52, 0x0f, 0xff, 0x75, 0x05, 0x7a, 0xd9, 0xf7, 0xba, 0x0a, 0xfd,
0x18, 0x9a, 0x4b, 0x85, 0x46, 0x95, 0xb4, 0x07, 0x69, 0xbd, 0x33, 0x0f, 0x33, 0xe4, 0xe1, 0x3f,
0x2d, 0xa8, 0xa7, 0x49, 0x4b, 0x1d, 0x5d, 0x24, 0x67, 0x5c, 0xf1, 0xa2, 0x78, 0xc8, 0x69, 0xa6,
0x85, 0xa5, 0x66, 0xba, 0x9a, 0xdf, 0x4c, 0x8b, 0x6f, 0x69, 0xa6, 0x6b, 0xd1, 0x80, 0x9d, 0x2a,
0x05, 0xeb, 0x12, 0x36, 0x31, 0x58, 0xe9, 0x1d, 0x06, 0x7b, 0x00, 0x9d, 0x17, 0xb6, 0xe7, 0x11,
0xfe, 0x58, 0x41, 0x46, 0xe6, 0xee, 0x40, 0xf5, 0x46, 0x0d, 0x4e, 0x63, 0x9f, 0x7a, 0xaa, 0x60,
0x97, 0xf0, 0x36, 0x74, 0x33, 0xb7, 0x93, 0x99, 0x26, 0x92, 0x49, 0xdc, 0xb4, 0x70, 0x1f, 0xba,
0x9a, 0x51, 0x1a, 0x18, 0x7f, 0x04, 0xbd, 0xec, 0x41, 0x3e, 0x46, 0x01, 0x7f, 0x03, 0xcd, 0x2f,
0xfd, 0x39, 0x77, 0xe9, 0xf4, 0xdc, 0xbe, 0xf0, 0xc8, 0x89, 0x4b, 0x5f, 0x8a, 0x29, 0xd8, 0x9d,
0x3c, 0xd4, 0xfd, 0x43, 0xfe, 0xd8, 0x4f, 0x66, 0x12, 0x31, 0xd0, 0xbf, 0xd3, 0xb0, 0x75, 0x58,
0xbb, 0x49, 0x9a, 0x83, 0x85, 0x37, 0xa0, 0x3f, 0xba, 0xf2, 0x6f, 0x4c, 0x2e, 0x91, 0x9c, 0x47,
0x30, 0x58, 0x3e, 0xd2, 0x92, 0x7e, 0x64, 0x34, 0x7f, 0x15, 0x42, 0xd1, 0x0c, 0x98, 0x95, 0x57,
0x8c, 0xc7, 0xeb, 0x4f, 0xe9, 0xb5, 0xef, 0x3a, 0xb2, 0xc2, 0xcc, 0xc8, 0xcc, 0x4f, 0xfa, 0xbf,
0x9c, 0x5d, 0x02, 0xae, 0xcb, 0x05, 0x02, 0x08, 0xc7, 0x41, 0x48, 0xdc, 0x99, 0x3d, 0x25, 0x7a,
0xba, 0xab, 0xc3, 0x5a, 0x68, 0x6e, 0x4d, 0xf1, 0xdc, 0x5f, 0x8c, 0xba, 0xba, 0x1e, 0xa2, 0x74,
0x53, 0x13, 0x21, 0x16, 0x12, 0x3d, 0xf0, 0xd9, 0x9c, 0xe8, 0xee, 0xdf, 0x86, 0x8a, 0xba, 0xa7,
0x88, 0x72, 0x54, 0xc2, 0xf7, 0x00, 0x1d, 0x4c, 0x26, 0x5a, 0xb8, 0x58, 0xb7, 0x84, 0xa3, 0x2a,
0x84, 0x0f, 0xa1, 0x72, 0xa6, 0xf6, 0xb4, 0x63, 0x9b, 0x5d, 0x29, 0x21, 0xa3, 0x85, 0x2d, 0xd9,
0x1a, 0xf4, 0x13, 0xa9, 0x08, 0xbe, 0x0f, 0x48, 0x8c, 0x11, 0x31, 0x72, 0x1c, 0x51, 0x51, 0xfe,
0x19, 0x11, 0xf5, 0x7d, 0x35, 0x76, 0x65, 0xa5, 0xd8, 0x12, 0xa3, 0xb0, 0x24, 0x45, 0x16, 0xae,
0x6b, 0x0b, 0xeb, 0x9b, 0x62, 0x5e, 0xd3, 0x7f, 0x8e, 0xe6, 0x17, 0xcc, 0x09, 0xdd, 0x40, 0x28,
0x7d, 0x7f, 0x1f, 0x6a, 0xa9, 0x00, 0x47, 0xeb, 0x50, 0x38, 0x38, 0x39, 0x69, 0xde, 0x42, 0x15,
0x58, 0x7f, 0x76, 0x76, 0x74, 0xfa, 0xf4, 0xf4, 0x49, 0xd3, 0x12, 0x3f, 0x0e, 0x4f, 0x9e, 0x8d,
0xc4, 0x8f, 0x95, 0xfd, 0x7f, 0x37, 0xa1, 0x1c, 0x0f, 0xef, 0xe8, 0x5b, 0xa8, 0xa5, 0x62, 0x1c,
0x6d, 0x6a, 0xce, 0x79, 0x79, 0x32, 0xbc, 0x9d, 0x7f, 0xa8, 0x97, 0xd4, 0xf7, 0x7e, 0xfd, 0xaf,
0xff, 0xfc, 0x7e, 0x65, 0x80, 0x7a, 0xbb, 0xd7, 0x0f, 0x77, 0x75, 0x70, 0xef, 0xca, 0xd9, 0x41,
0x4e, 0x22, 0xe8, 0x25, 0xd4, 0xd3, 0xc9, 0x80, 0x6e, 0xa7, 0xb3, 0x34, 0xc3, 0xed, 0xce, 0x5b,
0x4e, 0x35, 0xbb, 0xdb, 0x92, 0x5d, 0x0f, 0x75, 0x4c, 0x76, 0x51, 0xa4, 0x22, 0x22, 0x27, 0x33,
0xf3, 0x0b, 0x01, 0x8a, 0xf0, 0xf2, 0xbf, 0x1c, 0x0c, 0x37, 0x96, 0xbf, 0x06, 0xe8, 0xcf, 0x07,
0x78, 0x20, 0x59, 0x21, 0xd4, 0x14, 0xac, 0xcc, 0x0f, 0x09, 0xe8, 0xe7, 0x50, 0x8e, 0x77, 0x46,
0xd4, 0x37, 0x76, 0x5e, 0x73, 0xef, 0x1c, 0x0e, 0x96, 0x0f, 0xb4, 0x12, 0x9b, 0x12, 0xb9, 0x8b,
0x97, 0x90, 0x1f, 0x59, 0xf7, 0xd1, 0x09, 0x74, 0xb5, 0xbb, 0x2f, 0xc8, 0x77, 0xd1, 0x24, 0xe7,
0xbb, 0xc6, 0x9e, 0x85, 0x3e, 0x85, 0x52, 0xb4, 0x32, 0xa3, 0x5e, 0xfe, 0x76, 0x3e, 0xec, 0x2f,
0xd1, 0x75, 0x88, 0x1e, 0x00, 0x24, 0x1b, 0x24, 0x1a, 0xbc, 0x6d, 0xc5, 0x8d, 0x8d, 0x98, 0xb3,
0x6e, 0x4e, 0xe5, 0xea, 0x9c, 0x5e, 0x50, 0xd1, 0xdd, 0xe4, 0x7e, 0xee, 0xea, 0xfa, 0x0e, 0x40,
0xdc, 0x93, 0xb6, 0x6b, 0xa2, 0xba, 0xb0, 0x1d, 0x25, 0x37, 0x7a, 0x9f, 0x40, 0x5f, 0x43, 0xc5,
0xd8, 0x44, 0x91, 0xd1, 0xba, 0x33, 0xab, 0xed, 0x70, 0x98, 0x77, 0xa4, 0xd1, 0x3b, 0x12, 0xbd,
0x8e, 0xcb, 0x02, 0x5d, 0x4e, 0xde, 0xc2, 0x25, 0x3f, 0x15, 0xc9, 0xa3, 0x97, 0x06, 0x94, 0xec,
0xc2, 0xe9, 0xd5, 0x22, 0xf6, 0xf7, 0xd2, 0x7e, 0x81, 0x5b, 0x12, 0xb5, 0x82, 0x12, 0x54, 0xf4,
0x05, 0xac, 0xeb, 0x1d, 0x02, 0x75, 0x13, 0xbf, 0x1a, 0x6b, 0xc6, 0xb0, 0x97, 0x25, 0x6b, 0xb0,
0xb6, 0x04, 0xab, 0xa1, 0x8a, 0x00, 0x9b, 0x12, 0xee, 0x0a, 0x0c, 0x0f, 0x1a, 0xe9, 0x86, 0xcd,
0xe2, 0x34, 0xcb, 0x9d, 0x35, 0xe2, 0x34, 0xcb, 0x1f, 0x08, 0xd2, 0x69, 0x16, 0xa5, 0xd7, 0xae,
0x2e, 0x6e, 0xe8, 0x17, 0x50, 0x35, 0x37, 0x46, 0x34, 0x34, 0x34, 0xcf, 0x6c, 0x97, 0xc3, 0xcd,
0xdc, 0xb3, 0xb4, 0xb9, 0x51, 0xd5, 0x64, 0x83, 0xbe, 0x86, 0x86, 0x31, 0x97, 0x8e, 0x16, 0xd4,
0x89, 0xdd, 0xb9, 0x3c, 0xaf, 0x0e, 0x73, 0x17, 0x8a, 0xbe, 0x04, 0x6e, 0xe1, 0x14, 0xb0, 0x70,
0xe5, 0x21, 0x54, 0x0c, 0x8c, 0x77, 0xe1, 0xf6, 0x8d, 0x23, 0x73, 0xb2, 0xdc, 0xb3, 0xd0, 0x9f,
0x2d, 0xa8, 0x9a, 0x2b, 0x47, 0x6c, 0x80, 0x9c, 0x3d, 0x24, 0x0e, 0x8b, 0xa5, 0xe5, 0x01, 0x7f,
0x25, 0x85, 0x3c, 0xbb, 0x7f, 0x9a, 0x32, 0xf2, 0xeb, 0xd4, 0x00, 0xb5, 0x63, 0x7e, 0xdb, 0x7b,
0x93, 0x3d, 0x34, 0x3f, 0xef, 0xbd, 0xd9, 0x7d, 0x2d, 0xf7, 0x95, 0x37, 0x7b, 0x16, 0x7a, 0xa4,
0x3e, 0x67, 0xea, 0xae, 0x86, 0x90, 0x91, 0xe0, 0x59, 0xb3, 0x99, 0x5f, 0x1c, 0xb7, 0xad, 0x3d,
0x0b, 0x7d, 0xa3, 0x3e, 0xf6, 0xe9, 0xb7, 0xd2, 0xfa, 0xff, 0xeb, 0x7b, 0x7c, 0x4f, 0x6a, 0xf4,
0x1e, 0xde, 0x48, 0x69, 0x94, 0xad, 0x70, 0x67, 0x00, 0x49, 0x57, 0x46, 0x99, 0xae, 0x17, 0xe7,
0xfe, 0x72, 0xe3, 0x4e, 0x7b, 0x35, 0x6a, 0x9e, 0x02, 0xf1, 0x5b, 0x15, 0x90, 0xfa, 0x3e, 0x8b,
0xdd, 0xba, 0xdc, 0xa3, 0x87, 0xc3, 0xbc, 0x23, 0x8d, 0xff, 0x3d, 0x89, 0x7f, 0x07, 0x6d, 0x9a,
0xf8, 0xbb, 0xaf, 0xcd, 0x9e, 0xfe, 0x06, 0x7d, 0x05, 0xb5, 0x13, 0xdf, 0x7f, 0x39, 0x0f, 0x22,
0x05, 0x22, 0xeb, 0x18, 0x33, 0xc4, 0x30, 0xdb, 0xca, 0xdf, 0x97, 0xc8, 0x9b, 0x68, 0x23, 0x8d,
0x9c, 0xcc, 0x19, 0x6f, 0x90, 0x0d, 0xad, 0xb8, 0xee, 0xc7, 0x8a, 0x0c, 0xd3, 0x38, 0xe6, 0x1c,
0xb0, 0xc4, 0x23, 0xd5, 0x89, 0x63, 0x1e, 0x2c, 0xc2, 0xdc, 0xb3, 0xd0, 0x08, 0x9a, 0xd9, 0x81,
0x0f, 0xbd, 0x17, 0xf9, 0x31, 0x7f, 0x48, 0x1c, 0xde, 0x7d, 0xeb, 0xb9, 0x32, 0xda, 0xc5, 0x9a,
0xfc, 0xd7, 0xc1, 0x27, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xae, 0xb8, 0x57, 0x72, 0x6c, 0x18,
0x00, 0x00,
// 2445 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x59, 0xcb, 0x6f, 0xdc, 0xc6,
0x19, 0x37, 0xb5, 0x92, 0x76, 0xf7, 0xdb, 0xf7, 0xec, 0x53, 0x94, 0x1f, 0x0a, 0xeb, 0x04, 0x8a,
0xe0, 0x48, 0xb2, 0x72, 0x68, 0xe0, 0xa0, 0x29, 0x64, 0x59, 0xb5, 0x8c, 0x2a, 0xb2, 0x9a, 0x95,
0x63, 0xd4, 0x45, 0xb1, 0xa1, 0xb8, 0xa3, 0x15, 0x63, 0x2e, 0xc9, 0x72, 0x66, 0x25, 0x6f, 0x0d,
0x5f, 0x5a, 0xa0, 0xe7, 0x02, 0x05, 0x8a, 0x02, 0x05, 0x7a, 0xeb, 0xad, 0x28, 0x7a, 0xec, 0x5f,
0xd0, 0x4b, 0x8f, 0xfd, 0x17, 0xfa, 0x87, 0x14, 0xf3, 0x22, 0x87, 0x5c, 0xca, 0x68, 0x0e, 0xb9,
0x69, 0xbf, 0x99, 0xf9, 0xde, 0x8f, 0xdf, 0x47, 0x41, 0x39, 0x0a, 0x9d, 0xed, 0x30, 0x0a, 0x68,
0x80, 0x56, 0x3c, 0x3f, 0x0a, 0x1d, 0xf3, 0xf6, 0x24, 0x08, 0x26, 0x1e, 0xde, 0xb1, 0x43, 0x77,
0xc7, 0xf6, 0xfd, 0x80, 0xda, 0xd4, 0x0d, 0x7c, 0x22, 0x2e, 0x59, 0x7f, 0x36, 0xa0, 0x72, 0x16,
0xd9, 0x3e, 0xb1, 0x1d, 0x46, 0x46, 0x0d, 0x28, 0xd2, 0x37, 0xa3, 0x4b, 0x9b, 0x5c, 0x0e, 0x8c,
0x0d, 0x63, 0xb3, 0x8c, 0xea, 0xb0, 0x6a, 0x4f, 0x83, 0x99, 0x4f, 0x07, 0x4b, 0x1b, 0xc6, 0xa6,
0x81, 0xd6, 0xa0, 0xe5, 0xcf, 0xa6, 0x23, 0x27, 0xf0, 0x2f, 0xdc, 0x68, 0x2a, 0x78, 0x0d, 0x0a,
0x1b, 0xc6, 0xe6, 0x0a, 0x42, 0x00, 0xe7, 0x5e, 0xe0, 0xbc, 0x16, 0xcf, 0x97, 0xf9, 0xf3, 0x0e,
0x54, 0x25, 0x0d, 0xbb, 0x93, 0x4b, 0x3a, 0x58, 0x51, 0x37, 0xa9, 0x3b, 0xc5, 0x23, 0x42, 0xed,
0x69, 0x38, 0x58, 0xdd, 0x30, 0x36, 0x0b, 0x9c, 0x16, 0x50, 0xdb, 0x1b, 0x5d, 0x60, 0x4c, 0x06,
0x45, 0x46, 0xb3, 0x06, 0xd0, 0x7b, 0x8a, 0xa9, 0xa6, 0x1f, 0xf9, 0x0a, 0xff, 0x6a, 0x86, 0x09,
0xb5, 0xbe, 0x00, 0xa4, 0x91, 0x9f, 0x60, 0x6a, 0xbb, 0x1e, 0x41, 0x9b, 0x50, 0xa5, 0xda, 0xe5,
0x81, 0xb1, 0x51, 0xd8, 0xac, 0xec, 0xa1, 0x6d, 0xee, 0x89, 0x6d, 0xed, 0x81, 0xf5, 0x5b, 0x03,
0x2a, 0x43, 0xec, 0x8f, 0x25, 0x3f, 0x54, 0x85, 0xe5, 0x31, 0x26, 0x94, 0x1b, 0x5d, 0x45, 0x6d,
0xa8, 0xb0, 0x5f, 0x23, 0x42, 0x23, 0xd7, 0x9f, 0x70, 0xcb, 0xcb, 0xa8, 0x02, 0x05, 0x7b, 0x4a,
0xb9, 0xad, 0x05, 0x66, 0x57, 0x68, 0xcf, 0xa7, 0xd8, 0xa7, 0x89, 0xb5, 0x55, 0xb4, 0x0e, 0x6d,
0x9d, 0xaa, 0xde, 0xaf, 0xf0, 0xf7, 0x2d, 0x28, 0x5f, 0xd8, 0x8c, 0x29, 0xf6, 0xc7, 0xdc, 0xe6,
0x92, 0x55, 0x87, 0xaa, 0x50, 0x82, 0x84, 0x81, 0x4f, 0xb0, 0x75, 0x06, 0xd5, 0x83, 0x4b, 0xdb,
0xf7, 0xb1, 0x77, 0x1a, 0xb8, 0x3e, 0x65, 0x52, 0x2e, 0x66, 0xfe, 0xd8, 0xf5, 0x27, 0x23, 0xfa,
0xc6, 0x1d, 0x4b, 0xed, 0x06, 0xd0, 0xd4, 0xa9, 0x4c, 0x8a, 0x54, 0xb1, 0x03, 0xd5, 0x60, 0x46,
0xc3, 0x19, 0x1d, 0xb9, 0xfe, 0x18, 0xbf, 0xe1, 0xba, 0xd6, 0xac, 0x5d, 0x68, 0x1e, 0x33, 0xe7,
0xfb, 0xae, 0x3f, 0xd9, 0x1f, 0x8f, 0x23, 0x4c, 0x08, 0x0b, 0x6b, 0x38, 0x3b, 0x7f, 0x8d, 0xe7,
0x32, 0xcc, 0x55, 0x58, 0xbe, 0x0c, 0x88, 0x08, 0x72, 0xd9, 0xfa, 0x9d, 0x01, 0x0d, 0xa6, 0xd8,
0x97, 0xb6, 0x3f, 0x57, 0x1e, 0xfa, 0x02, 0xaa, 0xec, 0xf1, 0x59, 0xb0, 0x2f, 0xd2, 0x41, 0xf8,
0x76, 0x53, 0xfa, 0x36, 0x73, 0x7b, 0x5b, 0xbf, 0x7a, 0xe8, 0xd3, 0x68, 0x6e, 0x7e, 0x0a, 0xad,
0x05, 0x22, 0xf3, 0x69, 0xa2, 0x43, 0x0d, 0x56, 0xae, 0x6c, 0x6f, 0x86, 0xb9, 0x12, 0x85, 0x47,
0x4b, 0x9f, 0x19, 0xd6, 0x06, 0x34, 0x13, 0xce, 0xc2, 0x49, 0x4c, 0xd5, 0xd8, 0x19, 0x65, 0x66,
0x1c, 0xbb, 0x71, 0x10, 0xb8, 0x71, 0x72, 0xb0, 0x1b, 0xf6, 0x78, 0x1c, 0xe5, 0x66, 0x70, 0xc1,
0xfa, 0x00, 0x5a, 0xda, 0x8b, 0x5c, 0xa6, 0x7f, 0x32, 0xa0, 0x75, 0x82, 0xaf, 0xa5, 0xb3, 0x14,
0xdb, 0x3d, 0x58, 0xa6, 0xf3, 0x10, 0xf3, 0x3b, 0xf5, 0xbd, 0xfb, 0xd2, 0xf2, 0x85, 0x7b, 0xdb,
0xf2, 0xe7, 0xd9, 0x3c, 0xc4, 0xd6, 0x73, 0xa8, 0x68, 0x3f, 0x51, 0x1f, 0xda, 0x2f, 0x9f, 0x9d,
0x9d, 0x1c, 0x0e, 0x87, 0xa3, 0xd3, 0x17, 0x8f, 0x7f, 0x7a, 0xf8, 0xf3, 0xd1, 0xd1, 0xfe, 0xf0,
0xa8, 0x79, 0x0b, 0xf5, 0x00, 0x9d, 0x1c, 0x0e, 0xcf, 0x0e, 0x9f, 0xa4, 0xe8, 0x06, 0x6a, 0x40,
0x45, 0x27, 0x2c, 0x59, 0x26, 0x0c, 0x4e, 0xf0, 0xf5, 0x4b, 0x97, 0xfa, 0x98, 0x90, 0xb4, 0x60,
0xeb, 0x43, 0x40, 0xba, 0x36, 0xd2, 0xb4, 0x06, 0x14, 0x6d, 0x41, 0x92, 0xd6, 0x7d, 0x0e, 0xe8,
0x20, 0xf0, 0x7d, 0xec, 0xd0, 0x53, 0x8c, 0x23, 0x65, 0xdd, 0x87, 0x9a, 0xd3, 0x2a, 0x7b, 0x7d,
0x69, 0x5d, 0x36, 0x71, 0xac, 0x8f, 0xa0, 0x9d, 0x7a, 0x9c, 0x08, 0x09, 0x31, 0x8e, 0x46, 0xd2,
0x85, 0x2b, 0x56, 0x08, 0xcb, 0x47, 0x67, 0xc7, 0x07, 0xa8, 0x09, 0x25, 0xd7, 0x77, 0x82, 0x29,
0xab, 0x03, 0x76, 0x52, 0xca, 0xc6, 0x83, 0xd5, 0x05, 0x2f, 0x16, 0xd6, 0x26, 0x78, 0xc6, 0x56,
0x59, 0x93, 0xc1, 0x6f, 0x42, 0x37, 0xe2, 0xed, 0x45, 0xb5, 0x0e, 0x56, 0x62, 0x35, 0x96, 0xfc,
0x11, 0xbe, 0x0a, 0x1c, 0x71, 0x34, 0xc6, 0x9e, 0x3d, 0xe7, 0xf5, 0x55, 0xb3, 0x7e, 0xbf, 0x04,
0xb5, 0x7d, 0x87, 0xba, 0x57, 0x58, 0xd6, 0x10, 0xea, 0x42, 0x2d, 0xc2, 0xd3, 0x80, 0xe2, 0x51,
0x2a, 0xd7, 0xbb, 0x50, 0x73, 0xc4, 0x8d, 0x51, 0xc8, 0xca, 0x4c, 0x16, 0x4f, 0x13, 0x4a, 0x8e,
0x1d, 0xda, 0x8e, 0x4b, 0xe7, 0xb2, 0xc8, 0xbb, 0x50, 0xf3, 0x02, 0xc7, 0xf6, 0x46, 0xe7, 0xb6,
0x67, 0xfb, 0x0e, 0xe6, 0x2a, 0x14, 0x50, 0x0f, 0xea, 0x92, 0xad, 0xa2, 0xaf, 0x70, 0xfa, 0x1a,
0xb4, 0x66, 0x3e, 0xc1, 0x94, 0x7a, 0x78, 0x1c, 0x1f, 0x89, 0xe6, 0xb6, 0x0e, 0x6d, 0xd1, 0xdc,
0x88, 0x4d, 0x03, 0x72, 0xe9, 0x12, 0xd6, 0x05, 0xa8, 0xe8, 0x72, 0xe8, 0x1e, 0xf4, 0x33, 0x87,
0x11, 0x76, 0xb0, 0x7b, 0x85, 0xc7, 0x83, 0x12, 0xbf, 0xd0, 0x86, 0x0a, 0xeb, 0xb9, 0xb3, 0x70,
0x6c, 0x53, 0x4c, 0x06, 0xe5, 0x0d, 0x63, 0x73, 0x19, 0x59, 0x50, 0x0b, 0xb1, 0xe8, 0x02, 0x97,
0xd4, 0x73, 0xc8, 0x00, 0x78, 0x41, 0x56, 0x64, 0xe0, 0x98, 0xf3, 0xad, 0x2e, 0xb4, 0x8f, 0x5d,
0x42, 0xa5, 0x3f, 0xb4, 0xe6, 0xd9, 0x49, 0x93, 0x65, 0x10, 0x3f, 0x82, 0x92, 0x74, 0x0c, 0x19,
0x54, 0x38, 0xb7, 0x8e, 0xe4, 0x96, 0xf2, 0xab, 0xf5, 0x47, 0x03, 0x96, 0x59, 0xf4, 0x79, 0xd4,
0x67, 0xe7, 0xa3, 0xc4, 0xb5, 0x5a, 0x1a, 0x2c, 0xf1, 0x4e, 0xaf, 0x25, 0x5f, 0x81, 0xdf, 0x60,
0x43, 0x62, 0x4e, 0xb1, 0x74, 0xc0, 0x32, 0x37, 0x25, 0xa6, 0x45, 0xd8, 0xb9, 0xe2, 0xce, 0x5c,
0x66, 0xd1, 0x20, 0x36, 0x15, 0xb7, 0x84, 0x0f, 0x25, 0x85, 0xdf, 0x11, 0x8e, 0x6b, 0x40, 0xd1,
0xf5, 0xcf, 0x83, 0x99, 0x2f, 0x1c, 0x55, 0xb2, 0x10, 0xeb, 0x74, 0x84, 0x67, 0x66, 0x6c, 0xec,
0x0e, 0xb4, 0x34, 0x9a, 0xb4, 0xd4, 0x84, 0x15, 0xa6, 0xa7, 0x9a, 0x10, 0xca, 0x69, 0xec, 0x92,
0xd5, 0x84, 0xfa, 0x53, 0x4c, 0x9f, 0xf9, 0x17, 0x81, 0x62, 0xf1, 0x4f, 0x03, 0x1a, 0x31, 0x49,
0x72, 0xe8, 0x43, 0xc3, 0x1d, 0x63, 0x9f, 0xba, 0x74, 0x9e, 0xce, 0xae, 0xdb, 0xd0, 0x61, 0xc1,
0x52, 0xb1, 0x89, 0x1d, 0xba, 0xc4, 0xd3, 0x77, 0x1d, 0xda, 0xec, 0xd4, 0xe6, 0xfe, 0x4c, 0x0e,
0x79, 0xa3, 0x66, 0x95, 0x20, 0x9e, 0x32, 0xcd, 0x44, 0xba, 0xe7, 0xcd, 0xcf, 0x1a, 0x13, 0x4e,
0xe6, 0xbe, 0x83, 0xc7, 0x23, 0x1a, 0x30, 0x26, 0xae, 0x2f, 0x06, 0x0a, 0x1f, 0xdf, 0x98, 0x50,
0x1f, 0x8b, 0xdc, 0x2a, 0x59, 0x2f, 0x78, 0xad, 0xc7, 0xa3, 0xfa, 0x05, 0x4f, 0x21, 0x26, 0x48,
0x70, 0x25, 0x97, 0xb6, 0x1c, 0x2a, 0x59, 0x41, 0x22, 0x7c, 0x3d, 0xa8, 0xab, 0x69, 0x4f, 0x46,
0x1e, 0xbe, 0xa0, 0x72, 0xa4, 0xfc, 0x18, 0x5a, 0x32, 0x19, 0x9e, 0x87, 0x58, 0x71, 0xdd, 0xca,
0xd6, 0x95, 0x68, 0x25, 0x6d, 0xe9, 0x5c, 0x7d, 0xb2, 0xf1, 0x1e, 0x24, 0x7e, 0x1f, 0x78, 0x01,
0xc1, 0x92, 0x43, 0x07, 0xaa, 0x8e, 0x17, 0x90, 0xcc, 0xbc, 0x6b, 0x40, 0x91, 0xcc, 0x1c, 0x87,
0xe5, 0xd0, 0x12, 0x37, 0x6a, 0x0c, 0x6d, 0xfe, 0x4a, 0x72, 0x50, 0x1d, 0xec, 0x3b, 0xc8, 0x8f,
0x11, 0x88, 0xe7, 0x4e, 0x5d, 0xd5, 0x88, 0x6a, 0xb0, 0x72, 0x11, 0x44, 0x0e, 0xe6, 0x36, 0x96,
0xac, 0x7f, 0x18, 0xd0, 0xe2, 0x62, 0x86, 0xd4, 0xa6, 0x33, 0x22, 0x55, 0xfc, 0x04, 0x6a, 0x4c,
0x45, 0xac, 0x02, 0x2c, 0x85, 0x74, 0xe2, 0x0c, 0xe2, 0x54, 0x71, 0xf9, 0xe8, 0x16, 0x7a, 0x08,
0x55, 0x1d, 0x2a, 0x71, 0x49, 0x95, 0xbd, 0x35, 0xa5, 0xd2, 0x42, 0x68, 0x8e, 0x6e, 0xa1, 0x1d,
0x00, 0x66, 0xc6, 0x88, 0x8b, 0xe1, 0xba, 0x68, 0x0f, 0x16, 0x7c, 0x76, 0x74, 0xeb, 0x71, 0x09,
0x56, 0x45, 0x6b, 0xb0, 0xee, 0x40, 0x2d, 0xa5, 0x40, 0x6a, 0xac, 0x55, 0xad, 0x7f, 0x19, 0x80,
0x58, 0xbc, 0x32, 0x7e, 0xeb, 0x41, 0x9d, 0xda, 0xd1, 0x04, 0xd3, 0x51, 0xaa, 0x85, 0xf3, 0xb6,
0x13, 0x8c, 0xe3, 0xe6, 0xb9, 0xc4, 0x83, 0x61, 0x02, 0xd2, 0x88, 0x0a, 0xe1, 0x14, 0x54, 0xea,
0x8b, 0x7e, 0xa9, 0xe0, 0x89, 0xec, 0xf3, 0xa2, 0x6d, 0xde, 0x81, 0xae, 0x6c, 0x9b, 0x99, 0x63,
0xd1, 0x3d, 0xfb, 0xd0, 0x70, 0x82, 0xe9, 0xd4, 0x25, 0x84, 0x35, 0x76, 0xe2, 0xfe, 0x5a, 0xf5,
0x4e, 0x59, 0x15, 0x3c, 0x07, 0x79, 0x56, 0xd7, 0xac, 0xbf, 0x19, 0xd0, 0x64, 0x86, 0xa4, 0x22,
0xf3, 0x00, 0xaa, 0xdc, 0x6f, 0xdf, 0x5b, 0x60, 0x3e, 0x81, 0x32, 0x17, 0x10, 0x84, 0xd8, 0x97,
0x71, 0x19, 0xa4, 0xe3, 0x92, 0x14, 0x43, 0x2a, 0x2c, 0x3f, 0x82, 0xae, 0x14, 0x9f, 0xf1, 0xfc,
0x7d, 0x58, 0x25, 0xdc, 0x04, 0x89, 0x29, 0x3a, 0x69, 0x76, 0xc2, 0x3c, 0xeb, 0xef, 0x4b, 0xd0,
0xcb, 0xbe, 0x97, 0x5d, 0xe8, 0x27, 0xd0, 0x5c, 0x68, 0x34, 0xa2, 0xa5, 0x3d, 0x48, 0xdb, 0x9d,
0x79, 0x98, 0x21, 0x9b, 0xff, 0x36, 0xa0, 0x9e, 0x26, 0x2d, 0x4c, 0x74, 0x56, 0x9c, 0x71, 0xc7,
0x53, 0xf9, 0x90, 0x33, 0x4c, 0x0b, 0x0b, 0xc3, 0x74, 0x39, 0x7f, 0x98, 0xae, 0xdc, 0x30, 0x4c,
0x57, 0x15, 0xc0, 0x4e, 0xb5, 0x82, 0x22, 0x67, 0x9b, 0x38, 0xac, 0xf4, 0x1e, 0x87, 0x3d, 0x80,
0xce, 0x4b, 0xdb, 0xf3, 0x30, 0x7d, 0x2c, 0x58, 0x2a, 0x77, 0x77, 0xa0, 0x7a, 0x2d, 0x80, 0xd3,
0x28, 0xf0, 0x3d, 0xd1, 0xb0, 0x4b, 0xd6, 0x26, 0x74, 0x33, 0xb7, 0x13, 0x4c, 0xa3, 0x74, 0x62,
0x37, 0x0d, 0xab, 0x0f, 0x5d, 0x29, 0x28, 0xcd, 0xd8, 0xfa, 0x18, 0x7a, 0xd9, 0x83, 0x7c, 0x1e,
0x05, 0xeb, 0x1b, 0x68, 0x7e, 0x15, 0xcc, 0xa8, 0xeb, 0x4f, 0xce, 0xec, 0x73, 0x0f, 0x1f, 0xbb,
0xfe, 0x6b, 0x86, 0x82, 0xdd, 0xf1, 0x43, 0x39, 0x3f, 0xf8, 0x8f, 0xbd, 0x04, 0x93, 0x30, 0x40,
0xff, 0x5e, 0xc7, 0xd6, 0x61, 0xf5, 0x3a, 0x19, 0x0e, 0x86, 0xb5, 0x06, 0xfd, 0xe1, 0x65, 0x70,
0xad, 0x4b, 0x51, 0x7a, 0x1e, 0xc2, 0x60, 0xf1, 0x48, 0x6a, 0xfa, 0xb1, 0x36, 0xfc, 0x45, 0x0a,
0x29, 0x0c, 0x98, 0xd5, 0x97, 0xc1, 0xe3, 0xe2, 0x33, 0xff, 0x2a, 0x70, 0x1d, 0xde, 0x61, 0xa6,
0x78, 0x1a, 0x24, 0xf3, 0x9f, 0x63, 0x97, 0x90, 0xca, 0x76, 0x81, 0x00, 0xa2, 0x51, 0x18, 0x61,
0x77, 0x6a, 0x4f, 0xb0, 0x44, 0x77, 0x75, 0x58, 0x8d, 0xf4, 0xad, 0x29, 0xc6, 0xfd, 0x2b, 0x6a,
0xaa, 0x4b, 0x10, 0x25, 0x87, 0x1a, 0x4b, 0xb1, 0x08, 0x4b, 0xc0, 0x67, 0x53, 0x2c, 0xa7, 0x7f,
0x1b, 0x2a, 0xe2, 0x9e, 0x20, 0x72, 0xa8, 0x64, 0xdd, 0x07, 0xb4, 0x3f, 0x1e, 0x4b, 0xe5, 0x62,
0xdb, 0x12, 0x89, 0xa2, 0x11, 0x3e, 0x84, 0xca, 0xa9, 0xd8, 0xd3, 0x8e, 0x6c, 0x72, 0x29, 0x94,
0x54, 0x0b, 0x5b, 0xb2, 0x35, 0xc8, 0x27, 0xdc, 0x10, 0x6b, 0x0b, 0x10, 0x83, 0x11, 0x31, 0xe7,
0x38, 0xa3, 0x54, 0xfd, 0x69, 0x19, 0xf5, 0x43, 0x01, 0xbb, 0xb2, 0x5a, 0x6c, 0x30, 0x28, 0xcc,
0x49, 0xca, 0xc3, 0x75, 0xe9, 0x61, 0x79, 0x93, 0xe1, 0x35, 0xf9, 0xe7, 0x70, 0x76, 0x4e, 0x9c,
0xc8, 0x0d, 0xf9, 0xb2, 0xfa, 0x0a, 0x8a, 0x52, 0xdd, 0x8c, 0x25, 0xd9, 0x9d, 0x69, 0xd1, 0x55,
0x02, 0xc8, 0x56, 0x61, 0x39, 0xb4, 0x29, 0xf3, 0x77, 0x41, 0x64, 0xd8, 0x05, 0x96, 0xde, 0x56,
0x10, 0x51, 0xf2, 0x8f, 0x51, 0xd3, 0x67, 0x02, 0x22, 0x26, 0xe4, 0xc4, 0x06, 0xb9, 0xe1, 0x66,
0x6d, 0x90, 0x57, 0xd9, 0x82, 0xf2, 0x04, 0x7b, 0x98, 0xe2, 0x7d, 0xcf, 0xcb, 0x72, 0x5d, 0x87,
0xb5, 0x9c, 0x33, 0xc1, 0x7a, 0x6b, 0x0f, 0x6a, 0xa9, 0x32, 0x46, 0x45, 0x28, 0xec, 0x1f, 0x1f,
0x37, 0x6f, 0xa1, 0x0a, 0x14, 0x9f, 0x9f, 0x1e, 0x9e, 0x3c, 0x3b, 0x79, 0xda, 0x34, 0xd8, 0x8f,
0x83, 0xe3, 0xe7, 0x43, 0xf6, 0x63, 0x69, 0xef, 0xaf, 0x08, 0xca, 0xf1, 0x8a, 0x82, 0xbe, 0x85,
0x5a, 0xaa, 0x92, 0xd1, 0xba, 0xd4, 0x2d, 0xaf, 0x1b, 0x98, 0xb7, 0xf3, 0x0f, 0xe5, 0x2a, 0x7e,
0xf7, 0x37, 0xff, 0xf9, 0xef, 0x1f, 0x96, 0x06, 0xa8, 0xb7, 0x73, 0xf5, 0x70, 0x47, 0x96, 0xf0,
0x0e, 0x47, 0x48, 0x1c, 0x6f, 0xa1, 0xd7, 0x50, 0x4f, 0x97, 0x3c, 0xba, 0x9d, 0xee, 0x45, 0x19,
0x69, 0x77, 0x6e, 0x38, 0x95, 0xe2, 0x6e, 0x73, 0x71, 0x3d, 0xd4, 0xd1, 0xc5, 0xa9, 0x7a, 0x44,
0x98, 0xe3, 0x4f, 0xfd, 0x3b, 0x08, 0x52, 0xfc, 0xf2, 0xbf, 0x8f, 0x98, 0x6b, 0x8b, 0xdf, 0x3c,
0xe4, 0x47, 0x12, 0x6b, 0xc0, 0x45, 0x21, 0xd4, 0x64, 0xa2, 0xf4, 0xcf, 0x25, 0xe8, 0x17, 0x50,
0x8e, 0x37, 0x63, 0xd4, 0xd7, 0x36, 0x7b, 0x7d, 0xbb, 0x36, 0x07, 0x8b, 0x07, 0xd2, 0x88, 0x75,
0xce, 0xb9, 0x6b, 0x2d, 0x70, 0x7e, 0x64, 0x6c, 0xa1, 0x63, 0xe8, 0xca, 0xa4, 0x3e, 0xc7, 0xdf,
0xc5, 0x92, 0x9c, 0xaf, 0x37, 0xbb, 0x06, 0xfa, 0x1c, 0x4a, 0xea, 0xc3, 0x00, 0xea, 0xe5, 0x7f,
0x83, 0x30, 0xfb, 0x0b, 0x74, 0x99, 0xc4, 0xfb, 0x00, 0xc9, 0x9e, 0x8c, 0x06, 0x37, 0x2d, 0xf2,
0xb1, 0x13, 0x73, 0x96, 0xea, 0x09, 0xff, 0x40, 0x90, 0x5e, 0xc3, 0xd1, 0xbd, 0xe4, 0x7e, 0xee,
0x82, 0xfe, 0x1e, 0x86, 0x56, 0x8f, 0xfb, 0xae, 0x89, 0xea, 0xcc, 0x77, 0x3e, 0xbe, 0x96, 0x5b,
0x13, 0x7a, 0x05, 0x15, 0x6d, 0xdf, 0x46, 0x1a, 0x40, 0xc9, 0x2c, 0xf0, 0xa6, 0x99, 0x77, 0x24,
0xb9, 0x77, 0x38, 0xf7, 0xba, 0x55, 0x66, 0xdc, 0xf9, 0x7e, 0xc1, 0x42, 0xf2, 0x33, 0x56, 0x3c,
0x72, 0x35, 0x42, 0xc9, 0xc6, 0x9f, 0x5e, 0xa0, 0xe2, 0x78, 0x2f, 0x6c, 0x51, 0x56, 0x8b, 0x73,
0xad, 0xa0, 0x84, 0x2b, 0xfa, 0x12, 0x8a, 0x72, 0x53, 0x42, 0xdd, 0x24, 0xae, 0xda, 0x32, 0x65,
0xf6, 0xb2, 0x64, 0xc9, 0xac, 0xcd, 0x99, 0xd5, 0x50, 0x85, 0x31, 0x9b, 0x60, 0xea, 0x32, 0x1e,
0x1e, 0x34, 0xd2, 0xb0, 0x84, 0xc4, 0x65, 0x96, 0x8b, 0xa8, 0xe2, 0x32, 0xcb, 0x87, 0x3d, 0xe9,
0x32, 0x53, 0xe5, 0xb5, 0x23, 0x5b, 0x38, 0xfa, 0x25, 0x54, 0xf5, 0xbd, 0x18, 0x99, 0x9a, 0xe5,
0x99, 0x1d, 0xda, 0x5c, 0xcf, 0x3d, 0x4b, 0xbb, 0x1b, 0x55, 0x75, 0x31, 0xe8, 0x15, 0x34, 0x34,
0xf4, 0x3d, 0x9c, 0xfb, 0x4e, 0x1c, 0xce, 0x45, 0x54, 0x6e, 0xe6, 0xae, 0x4d, 0x7d, 0xce, 0xb8,
0x65, 0xa5, 0x18, 0xb3, 0x50, 0x1e, 0x40, 0x45, 0xe3, 0xf1, 0x3e, 0xbe, 0x7d, 0xed, 0x48, 0xc7,
0xcf, 0xbb, 0x06, 0xfa, 0x8b, 0x01, 0x55, 0x7d, 0xb1, 0x8a, 0x1d, 0x90, 0xb3, 0x6d, 0xc5, 0x69,
0xb1, 0xb0, 0x22, 0x59, 0x5f, 0x73, 0x25, 0x4f, 0xb7, 0x4e, 0x52, 0x4e, 0x7e, 0x9b, 0x82, 0x89,
0xdb, 0xfa, 0x17, 0xcc, 0x77, 0xd9, 0x43, 0xfd, 0x23, 0xe6, 0xbb, 0x9d, 0xb7, 0x7c, 0x2b, 0x7b,
0xb7, 0x6b, 0xa0, 0x47, 0xe2, 0xa3, 0xad, 0x1a, 0x86, 0x48, 0x2b, 0xf0, 0xac, 0xdb, 0xf4, 0xef,
0xaa, 0x9b, 0xc6, 0xae, 0x81, 0xbe, 0x11, 0x9f, 0x34, 0xe5, 0x5b, 0xee, 0xfd, 0xff, 0xf7, 0xbd,
0x75, 0x9f, 0x5b, 0x74, 0xd7, 0x5a, 0x4b, 0x59, 0x94, 0xed, 0x70, 0xa7, 0x00, 0x09, 0xf6, 0x40,
0x99, 0xd9, 0x1e, 0xd7, 0xfe, 0x22, 0x3c, 0x49, 0x47, 0x55, 0x41, 0x04, 0xc6, 0xf1, 0x5b, 0x91,
0x90, 0xf2, 0x3e, 0x89, 0xc3, 0xba, 0x88, 0x44, 0x4c, 0x33, 0xef, 0x48, 0xf2, 0xff, 0x01, 0xe7,
0x7f, 0x07, 0xad, 0xeb, 0xfc, 0x77, 0xde, 0xea, 0xc8, 0xe5, 0x1d, 0xfa, 0x1a, 0x6a, 0xc7, 0x41,
0xf0, 0x7a, 0x16, 0x2a, 0x03, 0x50, 0x7a, 0xb0, 0x33, 0xa4, 0x64, 0x66, 0x01, 0xcb, 0x07, 0x9c,
0xf3, 0x3a, 0x5a, 0x4b, 0x73, 0x4e, 0xd0, 0xd4, 0x3b, 0x64, 0x43, 0x2b, 0xee, 0xfb, 0xb1, 0x21,
0x66, 0x9a, 0x8f, 0x8e, 0x76, 0x16, 0x64, 0xa4, 0x26, 0x71, 0x2c, 0x83, 0x28, 0x9e, 0xbb, 0x06,
0x1a, 0x42, 0x33, 0x0b, 0x6b, 0xd1, 0x5d, 0x15, 0xc7, 0x7c, 0x28, 0x6c, 0xde, 0xbb, 0xf1, 0x5c,
0x76, 0x78, 0xd9, 0x0c, 0x14, 0x4c, 0x49, 0x35, 0x83, 0x0c, 0xae, 0x49, 0x35, 0x83, 0x2c, 0xae,
0x49, 0x37, 0x03, 0x05, 0x9e, 0x90, 0x07, 0xad, 0x05, 0x28, 0x14, 0x0f, 0x90, 0x9b, 0x00, 0x94,
0xb9, 0x71, 0xf3, 0x85, 0xb4, 0xb4, 0xad, 0x94, 0xb4, 0xf3, 0x55, 0xfe, 0xdf, 0x9e, 0x4f, 0xff,
0x17, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x2f, 0x7f, 0x12, 0x1f, 0x1a, 0x00, 0x00,
}

@ -324,6 +324,24 @@ func request_Lightning_SubscribeInvoices_0(ctx context.Context, marshaler runtim
}
func request_Lightning_ListPayments_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListPaymentsRequest
var metadata runtime.ServerMetadata
msg, err := client.ListPayments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func request_Lightning_DeleteAllPayments_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq DeleteAllPaymentsRequest
var metadata runtime.ServerMetadata
msg, err := client.DeleteAllPayments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
// 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) {
@ -830,6 +848,62 @@ func RegisterLightningHandler(ctx context.Context, mux *runtime.ServeMux, conn *
})
mux.Handle("GET", pattern_Lightning_ListPayments_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_ListPayments_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, outboundMarshaler, w, req, err)
return
}
forward_Lightning_ListPayments_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("DELETE", pattern_Lightning_DeleteAllPayments_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_DeleteAllPayments_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, outboundMarshaler, w, req, err)
return
}
forward_Lightning_DeleteAllPayments_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -867,6 +941,10 @@ var (
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"}, ""))
pattern_Lightning_ListPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "payments"}, ""))
pattern_Lightning_DeleteAllPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "payments"}, ""))
)
var (
@ -903,4 +981,8 @@ var (
forward_Lightning_LookupInvoice_0 = runtime.ForwardResponseMessage
forward_Lightning_SubscribeInvoices_0 = runtime.ForwardResponseStream
forward_Lightning_ListPayments_0 = runtime.ForwardResponseMessage
forward_Lightning_DeleteAllPayments_0 = runtime.ForwardResponseMessage
)

@ -113,6 +113,18 @@ service Lightning {
}
rpc ShowRoutingTable(ShowRoutingTableRequest) returns (ShowRoutingTableResponse);
rpc ListPayments(ListPaymentsRequest) returns (ListPaymentsResponse){
option (google.api.http) = {
get: "/v1/payments"
};
};
rpc DeleteAllPayments(DeleteAllPaymentsRequest) returns (DeleteAllPaymentsResponse) {
option (google.api.http) = {
delete: "/v1/payments"
};
};
}
@ -396,3 +408,27 @@ message ListInvoiceResponse {
}
message InvoiceSubscription {}
message Payment {
string r_hash = 1;
int64 value = 2;
int64 creation_date = 3;
repeated string path = 4;
int64 fee = 5;
}
message ListPaymentsRequest {
}
message ListPaymentsResponse {
repeated Payment payments = 1;
}
message DeleteAllPaymentsRequest {
}
message DeleteAllPaymentsResponse {
}

@ -293,6 +293,36 @@
]
}
},
"/v1/payments": {
"get": {
"operationId": "ListPayments",
"responses": {
"200": {
"description": "",
"schema": {
"$ref": "#/definitions/lnrpcListPaymentsResponse"
}
}
},
"tags": [
"Lightning"
]
},
"delete": {
"operationId": "DeleteAllPayments",
"responses": {
"200": {
"description": "",
"schema": {
"$ref": "#/definitions/lnrpcDeleteAllPaymentsResponse"
}
}
},
"tags": [
"Lightning"
]
}
},
"/v1/peers": {
"get": {
"operationId": "ListPeers",
@ -582,6 +612,12 @@
}
}
},
"lnrpcDeleteAllPaymentsRequest": {
"type": "object"
},
"lnrpcDeleteAllPaymentsResponse": {
"type": "object"
},
"lnrpcGetInfoRequest": {
"type": "object"
},
@ -733,6 +769,20 @@
}
}
},
"lnrpcListPaymentsRequest": {
"type": "object"
},
"lnrpcListPaymentsResponse": {
"type": "object",
"properties": {
"payments": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcPayment"
}
}
}
},
"lnrpcListPeersRequest": {
"type": "object"
},
@ -792,6 +842,34 @@
}
}
},
"lnrpcPayment": {
"type": "object",
"properties": {
"creation_date": {
"type": "string",
"format": "int64"
},
"fee": {
"type": "string",
"format": "int64"
},
"path": {
"type": "array",
"items": {
"type": "string",
"format": "string"
}
},
"r_hash": {
"type": "string",
"format": "string"
},
"value": {
"type": "string",
"format": "int64"
}
}
},
"lnrpcPaymentHash": {
"type": "object",
"properties": {

@ -597,6 +597,19 @@ func (r *rpcServer) ListChannels(ctx context.Context,
return resp, nil
}
func constructPayment(path []graph.Vertex, amount btcutil.Amount, rHash []byte) *channeldb.OutgoingPayment {
payment := &channeldb.OutgoingPayment{}
copy(payment.RHash[:], rHash)
payment.Invoice.Terms.Value = btcutil.Amount(amount)
payment.Invoice.CreationDate = time.Now()
pathBytes := make([][]byte, len(path))
for i:=0; i<len(path); i++ {
pathBytes[i] = path[i].ToByte()
}
payment.Path = pathBytes
return payment
}
// SendPayment dispatches a bi-directional streaming RPC for sending payments
// through the Lightning Network. A single RPC invocation creates a persistent
// bi-directional stream allowing clients to rapidly send payments through the
@ -641,13 +654,6 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer)
// Query the routing table for a potential path to the
// destination node. If a path is ultimately
// unavailable, then an error will be returned.
destNode := nextPayment.Dest
targetVertex := graph.NewVertex(destNode)
path, err := r.server.routingMgr.FindPath(targetVertex)
if err != nil {
return err
}
rpcsLog.Tracef("[sendpayment] selected route: %v", path)
// If we're in debug HTLC mode, then all outgoing
// HTLC's will pay to the same debug rHash. Otherwise,
// we pay to the rHash specified within the RPC
@ -661,11 +667,12 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer)
// Construct and HTLC packet which a payment route (if
// one is found) to the destination using a Sphinx
// onoin packet to encode the route.
htlcPkt, err := r.constructPaymentRoute([]byte(nextPayment.Dest),
htlcPkt, path, err := r.constructPaymentRoute([]byte(nextPayment.Dest),
nextPayment.Amt, rHash)
if err != nil {
return err
}
rpcsLog.Tracef("[sendpayment] selected route: %v", path)
// We launch a new goroutine to execute the current
// payment so we can continue to serve requests while
// this payment is being dispatiched.
@ -680,7 +687,9 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer)
errChan <- err
return
}
// Save payment to DB.
payment := constructPayment(path, btcutil.Amount(nextPayment.Amt), rHash[:])
r.server.chanDB.AddPayment(payment)
// TODO(roasbeef): proper responses
resp := &lnrpc.SendResponse{}
if err := paymentStream.Send(resp); err != nil {
@ -719,7 +728,7 @@ func (r *rpcServer) SendPaymentSync(ctx context.Context,
// Construct and HTLC packet which a payment route (if
// one is found) to the destination using a Sphinx
// onoin packet to encode the route.
htlcPkt, err := r.constructPaymentRoute([]byte(nextPayment.DestString),
htlcPkt, path, err := r.constructPaymentRoute([]byte(nextPayment.DestString),
nextPayment.Amt, rHash)
if err != nil {
return nil, err
@ -730,7 +739,8 @@ func (r *rpcServer) SendPaymentSync(ctx context.Context,
if err := r.server.htlcSwitch.SendHTLC(htlcPkt); err != nil {
return nil, err
}
payment := constructPayment(path, btcutil.Amount(nextPayment.Amt), rHash[:])
r.server.chanDB.AddPayment(payment)
return &lnrpc.SendResponse{}, nil
}
@ -739,7 +749,7 @@ func (r *rpcServer) SendPaymentSync(ctx context.Context,
// payment instructions necessary to complete an HTLC. If a route is unable to
// be located, then an error is returned indicating as much.
func (r *rpcServer) constructPaymentRoute(destPubkey []byte, amt int64,
rHash [32]byte) (*htlcPacket, error) {
rHash [32]byte) (*htlcPacket, []graph.Vertex, error) {
const queryTimeout = time.Duration(time.Second * 10)
@ -749,7 +759,7 @@ func (r *rpcServer) constructPaymentRoute(destPubkey []byte, amt int64,
targetVertex := graph.NewVertex(destPubkey)
path, err := r.server.routingMgr.FindPath(targetVertex)
if err != nil {
return nil, err
return nil, nil, err
}
rpcsLog.Tracef("[sendpayment] selected route: %v", path)
@ -758,7 +768,7 @@ func (r *rpcServer) constructPaymentRoute(destPubkey []byte, amt int64,
// the routing table's star graph, we're always the first hop.
sphinxPacket, err := generateSphinxPacket(path[1:], rHash[:])
if err != nil {
return nil, err
return nil, nil, err
}
// Craft an HTLC packet to send to the routing sub-system. The
@ -776,7 +786,7 @@ func (r *rpcServer) constructPaymentRoute(destPubkey []byte, amt int64,
return &htlcPacket{
dest: destInterface,
msg: htlcAdd,
}, nil
}, path, nil
}
// generateSphinxPacket generates then encodes a sphinx packet which encodes
@ -1121,3 +1131,40 @@ func (r *rpcServer) ShowRoutingTable(ctx context.Context,
Channels: channels,
}, nil
}
// ListPayments returns a list of all outgoing payments.
func (r *rpcServer) ListPayments(context.Context,
*lnrpc.ListPaymentsRequest) (*lnrpc.ListPaymentsResponse, error) {
rpcsLog.Debugf("[ListPayments]")
payments, err := r.server.chanDB.FetchAllPayments()
if err != nil {
return nil, err
}
paymentsResp := &lnrpc.ListPaymentsResponse{
Payments: make([]*lnrpc.Payment, len(payments)),
}
for i:=0; i<len(payments); i++{
p := &lnrpc.Payment{}
p.CreationDate = payments[i].CreationDate.Unix()
p.Value = int64(payments[i].Terms.Value)
p.RHash = hex.EncodeToString(payments[i].RHash[:])
path := make([]string, len(payments[i].Path))
for j:=0; j<len(path); j++ {
path[j] = hex.EncodeToString(payments[i].Path[j])
}
p.Path = path
paymentsResp.Payments[i] = p
}
return paymentsResp, nil
}
// DeleteAllPayments deletes all outgoing payments from DB.
func (r *rpcServer) DeleteAllPayments(context.Context,
*lnrpc.DeleteAllPaymentsRequest) (*lnrpc.DeleteAllPaymentsResponse, error) {
rpcsLog.Debugf("[DeleteAllPayments]")
err := r.server.chanDB.DeleteAllPayments()
resp := &lnrpc.DeleteAllPaymentsResponse{}
return resp, err
}