From f3212057dd0e141dc706393cae1c4299a97f8126 Mon Sep 17 00:00:00 2001 From: carla Date: Tue, 5 May 2020 21:34:38 +0200 Subject: [PATCH] walletrpc: add list sweeps to rpc and cli --- cmd/lncli/walletrpc_active.go | 40 ++++ lnrpc/rpc_utils.go | 53 +++++ lnrpc/walletrpc/walletkit.pb.go | 351 ++++++++++++++++++++++------ lnrpc/walletrpc/walletkit.proto | 34 +++ lnrpc/walletrpc/walletkit_server.go | 69 ++++++ rpcserver.go | 31 +-- 6 files changed, 481 insertions(+), 97 deletions(-) create mode 100644 lnrpc/rpc_utils.go diff --git a/cmd/lncli/walletrpc_active.go b/cmd/lncli/walletrpc_active.go index c1849e1b..b50a76a0 100644 --- a/cmd/lncli/walletrpc_active.go +++ b/cmd/lncli/walletrpc_active.go @@ -27,6 +27,7 @@ func walletCommands() []cli.Command { pendingSweepsCommand, bumpFeeCommand, bumpCloseFeeCommand, + listSweepsCommand, }, }, } @@ -300,3 +301,42 @@ func getWaitingCloseCommitments(client lnrpc.LightningClient, return nil, errors.New("channel not found") } + +var listSweepsCommand = cli.Command{ + Name: "listsweeps", + Category: "On-chain", + Usage: "Lists all sweeps that have been published by our node.", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "verbose", + Usage: "lookup full transaction", + }, + }, + Description: ` + Get a list of the hex-encoded transaction ids of every sweep that our + node has published. Note that these sweeps may not be confirmed on chain + yet, as we store them on transaction broadcast, not confirmation. + + If the verbose flag is set, the full set of transactions will be + returned, otherwise only the sweep transaction ids will be returned. + `, + Action: actionDecorator(listSweeps), +} + +func listSweeps(ctx *cli.Context) error { + client, cleanUp := getWalletClient(ctx) + defer cleanUp() + + resp, err := client.ListSweeps( + context.Background(), &walletrpc.ListSweepsRequest{ + Verbose: ctx.IsSet("verbose"), + }, + ) + if err != nil { + return err + } + + printJSON(resp) + + return nil +} diff --git a/lnrpc/rpc_utils.go b/lnrpc/rpc_utils.go new file mode 100644 index 00000000..764c888b --- /dev/null +++ b/lnrpc/rpc_utils.go @@ -0,0 +1,53 @@ +package lnrpc + +import ( + "encoding/hex" + "sort" + + "github.com/lightningnetwork/lnd/lnwallet" +) + +// RPCTransactionDetails returns a set of rpc transaction details. +func RPCTransactionDetails(txns []*lnwallet.TransactionDetail) *TransactionDetails { + txDetails := &TransactionDetails{ + Transactions: make([]*Transaction, len(txns)), + } + + for i, tx := range txns { + var destAddresses []string + for _, destAddress := range tx.DestAddresses { + destAddresses = append(destAddresses, destAddress.EncodeAddress()) + } + + // We also get unconfirmed transactions, so BlockHash can be + // nil. + blockHash := "" + if tx.BlockHash != nil { + blockHash = tx.BlockHash.String() + } + + txDetails.Transactions[i] = &Transaction{ + TxHash: tx.Hash.String(), + Amount: int64(tx.Value), + NumConfirmations: tx.NumConfirmations, + BlockHash: blockHash, + BlockHeight: tx.BlockHeight, + TimeStamp: tx.Timestamp, + TotalFees: tx.TotalFees, + DestAddresses: destAddresses, + RawTxHex: hex.EncodeToString(tx.RawTx), + } + } + + // Sort transactions by number of confirmations rather than height so + // that unconfirmed transactions (height =0; confirmations =-1) will + // follow the most recently set of confirmed transactions. If we sort + // by height, unconfirmed transactions will follow our oldest + // transactions, because they have lower block heights. + sort.Slice(txDetails.Transactions, func(i, j int) bool { + return txDetails.Transactions[i].NumConfirmations < + txDetails.Transactions[j].NumConfirmations + }) + + return txDetails +} diff --git a/lnrpc/walletrpc/walletkit.pb.go b/lnrpc/walletrpc/walletkit.pb.go index ce1e0813..865f5e08 100644 --- a/lnrpc/walletrpc/walletkit.pb.go +++ b/lnrpc/walletrpc/walletkit.pb.go @@ -813,6 +813,171 @@ func (m *BumpFeeResponse) XXX_DiscardUnknown() { var xxx_messageInfo_BumpFeeResponse proto.InternalMessageInfo +type ListSweepsRequest struct { + // + //Retrieve the full sweep transaction details. If false, only the sweep txids + //will be returned. + Verbose bool `protobuf:"varint,1,opt,name=verbose,proto3" json:"verbose,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListSweepsRequest) Reset() { *m = ListSweepsRequest{} } +func (m *ListSweepsRequest) String() string { return proto.CompactTextString(m) } +func (*ListSweepsRequest) ProtoMessage() {} +func (*ListSweepsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_6cc6942ac78249e5, []int{14} +} + +func (m *ListSweepsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListSweepsRequest.Unmarshal(m, b) +} +func (m *ListSweepsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListSweepsRequest.Marshal(b, m, deterministic) +} +func (m *ListSweepsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListSweepsRequest.Merge(m, src) +} +func (m *ListSweepsRequest) XXX_Size() int { + return xxx_messageInfo_ListSweepsRequest.Size(m) +} +func (m *ListSweepsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListSweepsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ListSweepsRequest proto.InternalMessageInfo + +func (m *ListSweepsRequest) GetVerbose() bool { + if m != nil { + return m.Verbose + } + return false +} + +type ListSweepsResponse struct { + // Types that are valid to be assigned to Sweeps: + // *ListSweepsResponse_TransactionDetails + // *ListSweepsResponse_TransactionIds + Sweeps isListSweepsResponse_Sweeps `protobuf_oneof:"sweeps"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListSweepsResponse) Reset() { *m = ListSweepsResponse{} } +func (m *ListSweepsResponse) String() string { return proto.CompactTextString(m) } +func (*ListSweepsResponse) ProtoMessage() {} +func (*ListSweepsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_6cc6942ac78249e5, []int{15} +} + +func (m *ListSweepsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListSweepsResponse.Unmarshal(m, b) +} +func (m *ListSweepsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListSweepsResponse.Marshal(b, m, deterministic) +} +func (m *ListSweepsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListSweepsResponse.Merge(m, src) +} +func (m *ListSweepsResponse) XXX_Size() int { + return xxx_messageInfo_ListSweepsResponse.Size(m) +} +func (m *ListSweepsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ListSweepsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ListSweepsResponse proto.InternalMessageInfo + +type isListSweepsResponse_Sweeps interface { + isListSweepsResponse_Sweeps() +} + +type ListSweepsResponse_TransactionDetails struct { + TransactionDetails *lnrpc.TransactionDetails `protobuf:"bytes,1,opt,name=transaction_details,json=transactionDetails,proto3,oneof"` +} + +type ListSweepsResponse_TransactionIds struct { + TransactionIds *ListSweepsResponse_TransactionIDs `protobuf:"bytes,2,opt,name=transaction_ids,json=transactionIds,proto3,oneof"` +} + +func (*ListSweepsResponse_TransactionDetails) isListSweepsResponse_Sweeps() {} + +func (*ListSweepsResponse_TransactionIds) isListSweepsResponse_Sweeps() {} + +func (m *ListSweepsResponse) GetSweeps() isListSweepsResponse_Sweeps { + if m != nil { + return m.Sweeps + } + return nil +} + +func (m *ListSweepsResponse) GetTransactionDetails() *lnrpc.TransactionDetails { + if x, ok := m.GetSweeps().(*ListSweepsResponse_TransactionDetails); ok { + return x.TransactionDetails + } + return nil +} + +func (m *ListSweepsResponse) GetTransactionIds() *ListSweepsResponse_TransactionIDs { + if x, ok := m.GetSweeps().(*ListSweepsResponse_TransactionIds); ok { + return x.TransactionIds + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ListSweepsResponse) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ListSweepsResponse_TransactionDetails)(nil), + (*ListSweepsResponse_TransactionIds)(nil), + } +} + +type ListSweepsResponse_TransactionIDs struct { + // + //Reversed, hex-encoded string representing the transaction ids of the + //sweeps that our node has broadcast. Note that these transactions may + //not have confirmed yet, we record sweeps on broadcast, not confirmation. + TransactionIds []string `protobuf:"bytes,1,rep,name=transaction_ids,json=transactionIds,proto3" json:"transaction_ids,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListSweepsResponse_TransactionIDs) Reset() { *m = ListSweepsResponse_TransactionIDs{} } +func (m *ListSweepsResponse_TransactionIDs) String() string { return proto.CompactTextString(m) } +func (*ListSweepsResponse_TransactionIDs) ProtoMessage() {} +func (*ListSweepsResponse_TransactionIDs) Descriptor() ([]byte, []int) { + return fileDescriptor_6cc6942ac78249e5, []int{15, 0} +} + +func (m *ListSweepsResponse_TransactionIDs) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListSweepsResponse_TransactionIDs.Unmarshal(m, b) +} +func (m *ListSweepsResponse_TransactionIDs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListSweepsResponse_TransactionIDs.Marshal(b, m, deterministic) +} +func (m *ListSweepsResponse_TransactionIDs) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListSweepsResponse_TransactionIDs.Merge(m, src) +} +func (m *ListSweepsResponse_TransactionIDs) XXX_Size() int { + return xxx_messageInfo_ListSweepsResponse_TransactionIDs.Size(m) +} +func (m *ListSweepsResponse_TransactionIDs) XXX_DiscardUnknown() { + xxx_messageInfo_ListSweepsResponse_TransactionIDs.DiscardUnknown(m) +} + +var xxx_messageInfo_ListSweepsResponse_TransactionIDs proto.InternalMessageInfo + +func (m *ListSweepsResponse_TransactionIDs) GetTransactionIds() []string { + if m != nil { + return m.TransactionIds + } + return nil +} + func init() { proto.RegisterEnum("walletrpc.WitnessType", WitnessType_name, WitnessType_value) proto.RegisterType((*KeyReq)(nil), "walletrpc.KeyReq") @@ -829,78 +994,89 @@ func init() { proto.RegisterType((*PendingSweepsResponse)(nil), "walletrpc.PendingSweepsResponse") proto.RegisterType((*BumpFeeRequest)(nil), "walletrpc.BumpFeeRequest") proto.RegisterType((*BumpFeeResponse)(nil), "walletrpc.BumpFeeResponse") + proto.RegisterType((*ListSweepsRequest)(nil), "walletrpc.ListSweepsRequest") + proto.RegisterType((*ListSweepsResponse)(nil), "walletrpc.ListSweepsResponse") + proto.RegisterType((*ListSweepsResponse_TransactionIDs)(nil), "walletrpc.ListSweepsResponse.TransactionIDs") } func init() { proto.RegisterFile("walletrpc/walletkit.proto", fileDescriptor_6cc6942ac78249e5) } var fileDescriptor_6cc6942ac78249e5 = []byte{ - // 1055 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x6b, 0x6f, 0xe2, 0x46, - 0x14, 0x2d, 0x21, 0x21, 0x70, 0x81, 0xc4, 0x19, 0xf2, 0xf0, 0xb2, 0xd9, 0x86, 0xba, 0x0f, 0xa1, - 0x3e, 0x40, 0x4d, 0xd4, 0xaa, 0x0f, 0xa9, 0x2a, 0x21, 0x8e, 0x88, 0x20, 0x98, 0xda, 0xce, 0x46, - 0x5b, 0x55, 0x1a, 0x39, 0x30, 0x21, 0x56, 0xc0, 0xf6, 0x8e, 0x87, 0x02, 0x7f, 0xa4, 0xd2, 0xfe, - 0x95, 0xfe, 0xba, 0xca, 0xe3, 0x07, 0x63, 0x68, 0x2a, 0xf5, 0x53, 0xf0, 0x39, 0xe7, 0x1e, 0xdf, - 0xb9, 0x73, 0x7d, 0x6f, 0xe0, 0xd5, 0xdc, 0x9a, 0x4c, 0x08, 0xa3, 0xde, 0xb0, 0x19, 0xfe, 0x7a, - 0xb6, 0x59, 0xc3, 0xa3, 0x2e, 0x73, 0x51, 0x21, 0xa1, 0xaa, 0x05, 0xea, 0x0d, 0x43, 0xb4, 0x7a, - 0xe8, 0xdb, 0x63, 0x27, 0x90, 0x07, 0x7f, 0x09, 0x0d, 0x51, 0xe5, 0x37, 0xc8, 0x75, 0xc9, 0x52, - 0x27, 0xef, 0x51, 0x1d, 0xa4, 0x67, 0xb2, 0xc4, 0x8f, 0xb6, 0x33, 0x26, 0x14, 0x7b, 0xd4, 0x76, - 0x98, 0x9c, 0xa9, 0x65, 0xea, 0x3b, 0xfa, 0xde, 0x33, 0x59, 0x5e, 0x73, 0x78, 0x10, 0xa0, 0xe8, - 0x0d, 0x00, 0x57, 0x5a, 0x53, 0x7b, 0xb2, 0x94, 0xb7, 0xb8, 0xa6, 0x10, 0x68, 0x38, 0xa0, 0x94, - 0xa1, 0xd8, 0x1a, 0x8d, 0xa8, 0x4e, 0xde, 0xcf, 0x88, 0xcf, 0x14, 0x05, 0x4a, 0xe1, 0xa3, 0xef, - 0xb9, 0x8e, 0x4f, 0x10, 0x82, 0x6d, 0x6b, 0x34, 0xa2, 0xdc, 0xbb, 0xa0, 0xf3, 0xdf, 0xca, 0x67, - 0x50, 0x34, 0xa9, 0xe5, 0xf8, 0xd6, 0x90, 0xd9, 0xae, 0x83, 0x8e, 0x20, 0xc7, 0x16, 0xf8, 0x89, - 0x2c, 0xb8, 0xa8, 0xa4, 0xef, 0xb0, 0x45, 0x87, 0x2c, 0x94, 0xef, 0x61, 0x7f, 0x30, 0x7b, 0x98, - 0xd8, 0xfe, 0x53, 0x62, 0xf6, 0x29, 0x94, 0xbd, 0x10, 0xc2, 0x84, 0x52, 0x37, 0x76, 0x2d, 0x45, - 0xa0, 0x1a, 0x60, 0xca, 0x1f, 0x80, 0x0c, 0xe2, 0x8c, 0xb4, 0x19, 0xf3, 0x66, 0xcc, 0x8f, 0xf2, - 0x42, 0xa7, 0x00, 0xbe, 0xc5, 0xb0, 0x47, 0x28, 0x7e, 0x9e, 0xf3, 0xb8, 0xac, 0x9e, 0xf7, 0x2d, - 0x36, 0x20, 0xb4, 0x3b, 0x47, 0x75, 0xd8, 0x75, 0x43, 0xbd, 0xbc, 0x55, 0xcb, 0xd6, 0x8b, 0xe7, - 0x7b, 0x8d, 0xa8, 0x7e, 0x0d, 0x73, 0xa1, 0xcd, 0x98, 0x1e, 0xd3, 0xca, 0xd7, 0x50, 0x49, 0xb9, - 0x47, 0x99, 0x1d, 0x41, 0x8e, 0x5a, 0x73, 0xcc, 0x92, 0x33, 0x50, 0x6b, 0x6e, 0x2e, 0x94, 0xef, - 0x00, 0xa9, 0x3e, 0xb3, 0xa7, 0x16, 0x23, 0xd7, 0x84, 0xc4, 0xb9, 0x9c, 0x41, 0x71, 0xe8, 0x3a, - 0x8f, 0x98, 0x59, 0x74, 0x4c, 0xe2, 0xb2, 0x43, 0x00, 0x99, 0x1c, 0x51, 0x2e, 0xa0, 0x92, 0x0a, - 0x8b, 0x5e, 0xf2, 0x9f, 0x67, 0x50, 0x3e, 0x64, 0xa1, 0x34, 0x20, 0xce, 0xc8, 0x76, 0xc6, 0xc6, - 0x9c, 0x10, 0x0f, 0x7d, 0x05, 0xf9, 0x20, 0x6b, 0x37, 0xbe, 0xda, 0xe2, 0xf9, 0x7e, 0x63, 0xc2, - 0xcf, 0xa4, 0xcd, 0xd8, 0x20, 0x80, 0xf5, 0x44, 0x80, 0x7e, 0x84, 0xd2, 0xdc, 0x66, 0x0e, 0xf1, - 0x7d, 0xcc, 0x96, 0x1e, 0xe1, 0xf7, 0xbc, 0x77, 0x7e, 0xdc, 0x48, 0x9a, 0xab, 0x71, 0x1f, 0xd2, - 0xe6, 0xd2, 0x23, 0x7a, 0x71, 0xbe, 0x7a, 0x08, 0x1a, 0xc4, 0x9a, 0xba, 0x33, 0x87, 0x61, 0xdf, - 0x62, 0x72, 0xb6, 0x96, 0xa9, 0x97, 0xf5, 0x42, 0x88, 0x18, 0x16, 0x43, 0x35, 0x28, 0xc5, 0x59, - 0x3f, 0x2c, 0x19, 0x91, 0xb7, 0xb9, 0x00, 0xc2, 0xbc, 0x2f, 0x97, 0x8c, 0xa0, 0x6f, 0x00, 0x3d, - 0x50, 0xd7, 0x1a, 0x0d, 0x2d, 0x9f, 0x61, 0x8b, 0x31, 0x32, 0xf5, 0x98, 0x2f, 0xef, 0x70, 0xdd, - 0x41, 0xc2, 0xb4, 0x22, 0x02, 0x9d, 0xc3, 0x91, 0x43, 0x16, 0x0c, 0xaf, 0x62, 0x9e, 0x88, 0x3d, - 0x7e, 0x62, 0x72, 0x8e, 0x47, 0x54, 0x02, 0xf2, 0x32, 0xe6, 0x3a, 0x9c, 0x0a, 0x62, 0x68, 0x58, - 0x7d, 0x32, 0xc2, 0x62, 0xf1, 0xf3, 0x61, 0x4c, 0x42, 0xb6, 0x93, 0x5b, 0x40, 0x17, 0x70, 0xbc, - 0x8a, 0x49, 0x1d, 0xa1, 0xb0, 0x16, 0x64, 0xac, 0xce, 0x72, 0x08, 0x3b, 0x8f, 0x2e, 0x1d, 0x12, - 0x79, 0xb7, 0x96, 0xa9, 0xe7, 0xf5, 0xf0, 0x41, 0x39, 0x86, 0x43, 0xf1, 0x6a, 0xe2, 0xae, 0x54, - 0xee, 0xe1, 0x68, 0x0d, 0x8f, 0xae, 0xfa, 0x17, 0xd8, 0xf3, 0x42, 0x02, 0xfb, 0x9c, 0x91, 0x33, - 0xbc, 0x2f, 0x4f, 0x84, 0x0b, 0x11, 0x23, 0xf5, 0xb2, 0x27, 0xfa, 0x28, 0x7f, 0x65, 0x60, 0xef, - 0x72, 0x36, 0xf5, 0x84, 0xae, 0xfb, 0x5f, 0xed, 0x70, 0x06, 0xc5, 0xb0, 0x40, 0xbc, 0x58, 0xbc, - 0x1b, 0xca, 0x3a, 0x84, 0x50, 0x50, 0xa2, 0x8d, 0x5b, 0xcd, 0x6e, 0xdc, 0x6a, 0x52, 0x89, 0x6d, - 0xb1, 0x12, 0x07, 0xb0, 0x9f, 0xe4, 0x15, 0x9e, 0xf5, 0xcb, 0x0f, 0x59, 0x28, 0x0a, 0xcd, 0x85, - 0x2a, 0xb0, 0x7f, 0xd7, 0xef, 0xf6, 0xb5, 0xfb, 0x3e, 0xbe, 0xbf, 0x31, 0xfb, 0xaa, 0x61, 0x48, - 0x1f, 0x21, 0x19, 0x0e, 0xdb, 0xda, 0xed, 0xed, 0x8d, 0x79, 0xab, 0xf6, 0x4d, 0x6c, 0xde, 0xdc, - 0xaa, 0xb8, 0xa7, 0xb5, 0xbb, 0x52, 0x06, 0x9d, 0x40, 0x45, 0x60, 0xfa, 0x1a, 0xbe, 0x52, 0x7b, - 0xad, 0x77, 0xd2, 0x16, 0x3a, 0x82, 0x03, 0x81, 0xd0, 0xd5, 0xb7, 0x5a, 0x57, 0x95, 0xb2, 0x81, - 0xbe, 0x63, 0xf6, 0xda, 0x58, 0xbb, 0xbe, 0x56, 0x75, 0xf5, 0x2a, 0x26, 0xb6, 0x83, 0x57, 0x70, - 0xa2, 0xd5, 0x6e, 0xab, 0x03, 0x73, 0xc5, 0xec, 0xa0, 0xcf, 0xe1, 0x93, 0x54, 0x48, 0xf0, 0x7a, - 0xed, 0xce, 0xc4, 0x86, 0xda, 0xd6, 0xfa, 0x57, 0xb8, 0xa7, 0xbe, 0x55, 0x7b, 0x52, 0x0e, 0x7d, - 0x01, 0x4a, 0xda, 0xc0, 0xb8, 0x6b, 0xb7, 0x55, 0xc3, 0x48, 0xeb, 0x76, 0xd1, 0x19, 0xbc, 0x5e, - 0xcb, 0xe0, 0x56, 0x33, 0xd5, 0xd8, 0x55, 0xca, 0xa3, 0x1a, 0x9c, 0xae, 0x67, 0xc2, 0x15, 0x91, - 0x9f, 0x54, 0x40, 0xa7, 0x20, 0x73, 0x85, 0xe8, 0x1c, 0xe7, 0x0b, 0xe8, 0x10, 0xa4, 0xa8, 0x72, - 0xb8, 0xab, 0xbe, 0xc3, 0x9d, 0x96, 0xd1, 0x91, 0x8a, 0xe8, 0x35, 0x9c, 0xf4, 0x55, 0x23, 0xb0, - 0xdb, 0x20, 0x4b, 0x6b, 0xc5, 0x6a, 0xf5, 0xdb, 0x1d, 0x4d, 0x97, 0xca, 0xe7, 0x7f, 0x6f, 0x43, - 0xe1, 0x9e, 0x77, 0x5c, 0xd7, 0x66, 0xe8, 0x27, 0x28, 0x5f, 0x11, 0x6a, 0xff, 0x49, 0xfa, 0x64, - 0xc1, 0xba, 0x64, 0x89, 0x0e, 0x84, 0x76, 0x0c, 0x17, 0x4b, 0xf5, 0x38, 0x99, 0x9c, 0x5d, 0xb2, - 0xbc, 0x22, 0xfe, 0x90, 0xda, 0x1e, 0x73, 0x29, 0xfa, 0x01, 0x0a, 0x61, 0x6c, 0x10, 0x57, 0x11, - 0x45, 0x3d, 0x77, 0x68, 0x31, 0x97, 0xbe, 0x18, 0xf9, 0x33, 0xe4, 0x83, 0xf7, 0x05, 0x6b, 0x05, - 0x89, 0x03, 0x49, 0x58, 0x3b, 0xd5, 0x93, 0x0d, 0x3c, 0xfa, 0x90, 0x3a, 0x80, 0xa2, 0x2d, 0x22, - 0xae, 0x1c, 0xd1, 0x46, 0xc0, 0xab, 0x55, 0xf1, 0xf3, 0x5a, 0x5b, 0x3e, 0x3d, 0x28, 0x0a, 0x93, - 0x1f, 0xbd, 0x11, 0xa4, 0x9b, 0xfb, 0xa6, 0xfa, 0xf1, 0x4b, 0xf4, 0xca, 0x4d, 0x18, 0xf1, 0x29, - 0xb7, 0xcd, 0x8d, 0x91, 0x72, 0xfb, 0xb7, 0xcd, 0xa0, 0x43, 0x39, 0x35, 0x47, 0xd0, 0xd9, 0x0b, - 0x73, 0x22, 0xc9, 0xaf, 0xf6, 0xb2, 0x20, 0xf2, 0xfc, 0x15, 0x76, 0xa3, 0x2f, 0x15, 0xbd, 0x12, - 0xc4, 0xe9, 0xa9, 0x92, 0xaa, 0xd8, 0xda, 0x87, 0x7d, 0xf9, 0xed, 0xef, 0xcd, 0xb1, 0xcd, 0x9e, - 0x66, 0x0f, 0x8d, 0xa1, 0x3b, 0x6d, 0x4e, 0x82, 0x41, 0xec, 0xd8, 0xce, 0xd8, 0x21, 0x6c, 0xee, - 0xd2, 0xe7, 0xe6, 0xc4, 0x19, 0x35, 0xf9, 0x00, 0x6a, 0x26, 0x16, 0x0f, 0x39, 0xfe, 0x7f, 0xca, - 0xc5, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x3f, 0xcd, 0xa5, 0xf0, 0x08, 0x00, 0x00, + // 1180 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x6d, 0x6f, 0xe2, 0x46, + 0x10, 0x3e, 0x42, 0x42, 0x60, 0x78, 0x09, 0x59, 0xf2, 0xe2, 0xe3, 0x72, 0x0d, 0x75, 0xdf, 0xa2, + 0xf6, 0x8e, 0xa8, 0x39, 0xb5, 0xea, 0xb5, 0x52, 0xd5, 0x04, 0x1c, 0x11, 0x41, 0x70, 0x6a, 0xfb, + 0x2e, 0xba, 0xaa, 0xd2, 0xca, 0xe0, 0x0d, 0xb1, 0x02, 0xb6, 0x6f, 0xbd, 0x1c, 0xf0, 0xad, 0xdf, + 0xfa, 0x0f, 0x2a, 0xdd, 0xbf, 0xad, 0xbc, 0x7e, 0x61, 0x0d, 0xcd, 0x49, 0xfd, 0x14, 0x76, 0x9e, + 0x67, 0x9e, 0x9d, 0x9d, 0x19, 0xcf, 0x04, 0x9e, 0xce, 0xcc, 0xf1, 0x98, 0x30, 0xea, 0x0d, 0x4f, + 0xc3, 0x5f, 0x0f, 0x36, 0x6b, 0x7a, 0xd4, 0x65, 0x2e, 0x2a, 0x24, 0x50, 0xbd, 0x40, 0xbd, 0x61, + 0x68, 0xad, 0xef, 0xf9, 0xf6, 0xc8, 0x09, 0xe8, 0xc1, 0x5f, 0x42, 0x43, 0xab, 0xfc, 0x3b, 0xe4, + 0xba, 0x64, 0xa1, 0x91, 0xf7, 0xe8, 0x04, 0xaa, 0x0f, 0x64, 0x81, 0xef, 0x6c, 0x67, 0x44, 0x28, + 0xf6, 0xa8, 0xed, 0x30, 0x29, 0xd3, 0xc8, 0x9c, 0x6c, 0x69, 0x95, 0x07, 0xb2, 0xb8, 0xe4, 0xe6, + 0x9b, 0xc0, 0x8a, 0x9e, 0x03, 0x70, 0xa6, 0x39, 0xb1, 0xc7, 0x0b, 0x69, 0x83, 0x73, 0x0a, 0x01, + 0x87, 0x1b, 0xe4, 0x32, 0x14, 0xcf, 0x2d, 0x8b, 0x6a, 0xe4, 0xfd, 0x94, 0xf8, 0x4c, 0x96, 0xa1, + 0x14, 0x1e, 0x7d, 0xcf, 0x75, 0x7c, 0x82, 0x10, 0x6c, 0x9a, 0x96, 0x45, 0xb9, 0x76, 0x41, 0xe3, + 0xbf, 0xe5, 0x2f, 0xa1, 0x68, 0x50, 0xd3, 0xf1, 0xcd, 0x21, 0xb3, 0x5d, 0x07, 0xed, 0x43, 0x8e, + 0xcd, 0xf1, 0x3d, 0x99, 0x73, 0x52, 0x49, 0xdb, 0x62, 0xf3, 0x0e, 0x99, 0xcb, 0x3f, 0xc2, 0xce, + 0xcd, 0x74, 0x30, 0xb6, 0xfd, 0xfb, 0x44, 0xec, 0x0b, 0x28, 0x7b, 0xa1, 0x09, 0x13, 0x4a, 0xdd, + 0x58, 0xb5, 0x14, 0x19, 0x95, 0xc0, 0x26, 0xff, 0x09, 0x48, 0x27, 0x8e, 0xa5, 0x4e, 0x99, 0x37, + 0x65, 0x7e, 0x14, 0x17, 0x3a, 0x02, 0xf0, 0x4d, 0x86, 0x3d, 0x42, 0xf1, 0xc3, 0x8c, 0xfb, 0x65, + 0xb5, 0xbc, 0x6f, 0xb2, 0x1b, 0x42, 0xbb, 0x33, 0x74, 0x02, 0xdb, 0x6e, 0xc8, 0x97, 0x36, 0x1a, + 0xd9, 0x93, 0xe2, 0x59, 0xa5, 0x19, 0xe5, 0xaf, 0x69, 0xcc, 0xd5, 0x29, 0xd3, 0x62, 0x58, 0x7e, + 0x01, 0xb5, 0x94, 0x7a, 0x14, 0xd9, 0x3e, 0xe4, 0xa8, 0x39, 0xc3, 0x2c, 0x79, 0x03, 0x35, 0x67, + 0xc6, 0x5c, 0xfe, 0x01, 0x90, 0xe2, 0x33, 0x7b, 0x62, 0x32, 0x72, 0x49, 0x48, 0x1c, 0xcb, 0x31, + 0x14, 0x87, 0xae, 0x73, 0x87, 0x99, 0x49, 0x47, 0x24, 0x4e, 0x3b, 0x04, 0x26, 0x83, 0x5b, 0xe4, + 0x57, 0x50, 0x4b, 0xb9, 0x45, 0x97, 0x7c, 0xf2, 0x0d, 0xf2, 0xc7, 0x2c, 0x94, 0x6e, 0x88, 0x63, + 0xd9, 0xce, 0x48, 0x9f, 0x11, 0xe2, 0xa1, 0xef, 0x20, 0x1f, 0x44, 0xed, 0xc6, 0xa5, 0x2d, 0x9e, + 0xed, 0x34, 0xc7, 0xfc, 0x4d, 0xea, 0x94, 0xdd, 0x04, 0x66, 0x2d, 0x21, 0xa0, 0xd7, 0x50, 0x9a, + 0xd9, 0xcc, 0x21, 0xbe, 0x8f, 0xd9, 0xc2, 0x23, 0xbc, 0xce, 0x95, 0xb3, 0x83, 0x66, 0xd2, 0x5c, + 0xcd, 0xdb, 0x10, 0x36, 0x16, 0x1e, 0xd1, 0x8a, 0xb3, 0xe5, 0x21, 0x68, 0x10, 0x73, 0xe2, 0x4e, + 0x1d, 0x86, 0x7d, 0x93, 0x49, 0xd9, 0x46, 0xe6, 0xa4, 0xac, 0x15, 0x42, 0x8b, 0x6e, 0x32, 0xd4, + 0x80, 0x52, 0x1c, 0xf5, 0x60, 0xc1, 0x88, 0xb4, 0xc9, 0x09, 0x10, 0xc6, 0x7d, 0xb1, 0x60, 0x04, + 0xbd, 0x04, 0x34, 0xa0, 0xae, 0x69, 0x0d, 0x4d, 0x9f, 0x61, 0x93, 0x31, 0x32, 0xf1, 0x98, 0x2f, + 0x6d, 0x71, 0xde, 0x6e, 0x82, 0x9c, 0x47, 0x00, 0x3a, 0x83, 0x7d, 0x87, 0xcc, 0x19, 0x5e, 0xfa, + 0xdc, 0x13, 0x7b, 0x74, 0xcf, 0xa4, 0x1c, 0xf7, 0xa8, 0x05, 0xe0, 0x45, 0x8c, 0x75, 0x38, 0x14, + 0xf8, 0xd0, 0x30, 0xfb, 0xc4, 0xc2, 0x62, 0xf2, 0xf3, 0xa1, 0x4f, 0x02, 0xb6, 0x92, 0x2a, 0xa0, + 0x57, 0x70, 0xb0, 0xf4, 0x49, 0x3d, 0xa1, 0xb0, 0xe2, 0xa4, 0x2f, 0xdf, 0xb2, 0x07, 0x5b, 0x77, + 0x2e, 0x1d, 0x12, 0x69, 0xbb, 0x91, 0x39, 0xc9, 0x6b, 0xe1, 0x41, 0x3e, 0x80, 0x3d, 0xb1, 0x34, + 0x71, 0x57, 0xca, 0xb7, 0xb0, 0xbf, 0x62, 0x8f, 0x4a, 0xfd, 0x2b, 0x54, 0xbc, 0x10, 0xc0, 0x3e, + 0x47, 0xa4, 0x0c, 0xef, 0xcb, 0x43, 0xa1, 0x20, 0xa2, 0xa7, 0x56, 0xf6, 0x44, 0x1d, 0xf9, 0x9f, + 0x0c, 0x54, 0x2e, 0xa6, 0x13, 0x4f, 0xe8, 0xba, 0xff, 0xd5, 0x0e, 0xc7, 0x50, 0x0c, 0x13, 0xc4, + 0x93, 0xc5, 0xbb, 0xa1, 0xac, 0x41, 0x68, 0x0a, 0x52, 0xb4, 0x56, 0xd5, 0xec, 0x5a, 0x55, 0x93, + 0x4c, 0x6c, 0x8a, 0x99, 0xd8, 0x85, 0x9d, 0x24, 0xae, 0xf0, 0xad, 0xf2, 0x4b, 0xd8, 0xed, 0xd9, + 0x3e, 0x4b, 0x65, 0x06, 0x49, 0xb0, 0xfd, 0x81, 0xd0, 0x81, 0xeb, 0x13, 0x1e, 0x6c, 0x5e, 0x8b, + 0x8f, 0xf2, 0x5f, 0x1b, 0x80, 0x44, 0x7e, 0x94, 0xb1, 0x1e, 0xd4, 0xd8, 0x72, 0xa8, 0x60, 0x8b, + 0x30, 0xd3, 0x1e, 0xfb, 0xd1, 0x4b, 0x9f, 0x46, 0x2f, 0x15, 0xc6, 0x4e, 0x3b, 0x24, 0x74, 0x9e, + 0x68, 0x88, 0xad, 0x59, 0xd1, 0x2d, 0xec, 0x88, 0x6a, 0xb6, 0xe5, 0xf3, 0x1c, 0x14, 0xcf, 0x5e, + 0x08, 0x05, 0x58, 0x8f, 0x42, 0xbc, 0xe0, 0xaa, 0x1d, 0x88, 0x57, 0x04, 0x99, 0x2b, 0xcb, 0xaf, + 0xbf, 0x86, 0x4a, 0x9a, 0x83, 0xbe, 0x59, 0xbf, 0x2a, 0xa8, 0x75, 0x61, 0xd5, 0xf5, 0x22, 0x0f, + 0xb9, 0xb0, 0x17, 0xbe, 0xfd, 0x98, 0x85, 0xa2, 0xf0, 0x39, 0xa2, 0x1a, 0xec, 0xbc, 0xe9, 0x77, + 0xfb, 0xea, 0x6d, 0x1f, 0xdf, 0x5e, 0x19, 0x7d, 0x45, 0xd7, 0xab, 0x4f, 0x90, 0x04, 0x7b, 0x2d, + 0xf5, 0xfa, 0xfa, 0xca, 0xb8, 0x56, 0xfa, 0x06, 0x36, 0xae, 0xae, 0x15, 0xdc, 0x53, 0x5b, 0xdd, + 0x6a, 0x06, 0x1d, 0x42, 0x4d, 0x40, 0xfa, 0x2a, 0x6e, 0x2b, 0xbd, 0xf3, 0x77, 0xd5, 0x0d, 0xb4, + 0x0f, 0xbb, 0x02, 0xa0, 0x29, 0x6f, 0xd5, 0xae, 0x52, 0xcd, 0x06, 0xfc, 0x8e, 0xd1, 0x6b, 0x61, + 0xf5, 0xf2, 0x52, 0xd1, 0x94, 0x76, 0x0c, 0x6c, 0x06, 0x57, 0x70, 0xe0, 0xbc, 0xd5, 0x52, 0x6e, + 0x8c, 0x25, 0xb2, 0x85, 0xbe, 0x82, 0xcf, 0x53, 0x2e, 0xc1, 0xf5, 0xea, 0x1b, 0x03, 0xeb, 0x4a, + 0x4b, 0xed, 0xb7, 0x71, 0x4f, 0x79, 0xab, 0xf4, 0xaa, 0x39, 0xf4, 0x35, 0xc8, 0x69, 0x01, 0xfd, + 0x4d, 0xab, 0xa5, 0xe8, 0x7a, 0x9a, 0xb7, 0x8d, 0x8e, 0xe1, 0xd9, 0x4a, 0x04, 0xd7, 0xaa, 0xa1, + 0xc4, 0xaa, 0xd5, 0x3c, 0x6a, 0xc0, 0xd1, 0x6a, 0x24, 0x9c, 0x11, 0xe9, 0x55, 0x0b, 0xe8, 0x08, + 0x24, 0xce, 0x10, 0x95, 0xe3, 0x78, 0x01, 0xed, 0x41, 0x35, 0xca, 0x1c, 0xee, 0x2a, 0xef, 0x70, + 0xe7, 0x5c, 0xef, 0x54, 0x8b, 0xe8, 0x19, 0x1c, 0xf6, 0x15, 0x3d, 0x90, 0x5b, 0x03, 0x4b, 0x2b, + 0xc9, 0x3a, 0xef, 0xb7, 0x3a, 0xaa, 0x56, 0x2d, 0x9f, 0xfd, 0xbd, 0x05, 0x85, 0x5b, 0xde, 0x22, + 0x5d, 0x9b, 0xa1, 0x9f, 0xa1, 0xdc, 0x26, 0xd4, 0xfe, 0x40, 0xfa, 0x64, 0xce, 0xba, 0x64, 0x81, + 0x76, 0x85, 0xfe, 0x09, 0x57, 0x71, 0xfd, 0x20, 0xd9, 0x35, 0x5d, 0xb2, 0x68, 0x13, 0x7f, 0x48, + 0x6d, 0x8f, 0xb9, 0x14, 0xfd, 0x04, 0x85, 0xd0, 0x37, 0xf0, 0xab, 0x89, 0xa4, 0x9e, 0x3b, 0x34, + 0x99, 0x4b, 0x1f, 0xf5, 0xfc, 0x05, 0xf2, 0xc1, 0x7d, 0xc1, 0x22, 0x46, 0xe2, 0x08, 0x17, 0x16, + 0x75, 0xfd, 0x70, 0xcd, 0x1e, 0x7d, 0x48, 0x1d, 0x40, 0xd1, 0xde, 0x15, 0x97, 0xb4, 0x28, 0x23, + 0xd8, 0xeb, 0x75, 0x71, 0x20, 0xad, 0xac, 0xeb, 0x1e, 0x14, 0x85, 0x5d, 0x89, 0x9e, 0x0b, 0xd4, + 0xf5, 0x0d, 0x5d, 0xff, 0xec, 0x31, 0x78, 0xa9, 0x26, 0x2c, 0xc5, 0x94, 0xda, 0xfa, 0x8e, 0x4d, + 0xa9, 0xfd, 0xd7, 0x2e, 0xd5, 0xa0, 0x9c, 0x9a, 0xbc, 0xe8, 0xf8, 0x91, 0xc9, 0x9a, 0xc4, 0xd7, + 0x78, 0x9c, 0x10, 0x69, 0xfe, 0x06, 0xdb, 0xd1, 0x6c, 0x43, 0x4f, 0x05, 0x72, 0x7a, 0x0e, 0xa7, + 0x32, 0xb6, 0x32, 0x0a, 0x51, 0x17, 0x60, 0x39, 0x54, 0xd0, 0xd1, 0x23, 0xb3, 0x26, 0xd4, 0x79, + 0xfe, 0xc9, 0x49, 0x24, 0x3f, 0xb9, 0xf8, 0xfe, 0x8f, 0xd3, 0x91, 0xcd, 0xee, 0xa7, 0x83, 0xe6, + 0xd0, 0x9d, 0x9c, 0x8e, 0x83, 0x3d, 0xe8, 0xd8, 0xce, 0xc8, 0x21, 0x6c, 0xe6, 0xd2, 0x87, 0xd3, + 0xb1, 0x63, 0x9d, 0xf2, 0xa9, 0x78, 0x9a, 0xe8, 0x0c, 0x72, 0xfc, 0xdf, 0xc4, 0x57, 0xff, 0x06, + 0x00, 0x00, 0xff, 0xff, 0xe6, 0xc9, 0x1c, 0x56, 0x6f, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -980,6 +1156,11 @@ type WalletKitClient interface { //fee preference being provided. For now, the responsibility of ensuring that //the new fee preference is sufficient is delegated to the user. BumpFee(ctx context.Context, in *BumpFeeRequest, opts ...grpc.CallOption) (*BumpFeeResponse, error) + //* + //ListSweeps returns a list of the sweep transactions our node has produced. + //Note that these sweeps may not be confirmed yet, as we record sweeps on + //broadcast, not confirmation. + ListSweeps(ctx context.Context, in *ListSweepsRequest, opts ...grpc.CallOption) (*ListSweepsResponse, error) } type walletKitClient struct { @@ -1062,6 +1243,15 @@ func (c *walletKitClient) BumpFee(ctx context.Context, in *BumpFeeRequest, opts return out, nil } +func (c *walletKitClient) ListSweeps(ctx context.Context, in *ListSweepsRequest, opts ...grpc.CallOption) (*ListSweepsResponse, error) { + out := new(ListSweepsResponse) + err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/ListSweeps", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // WalletKitServer is the server API for WalletKit service. type WalletKitServer interface { //* @@ -1129,6 +1319,11 @@ type WalletKitServer interface { //fee preference being provided. For now, the responsibility of ensuring that //the new fee preference is sufficient is delegated to the user. BumpFee(context.Context, *BumpFeeRequest) (*BumpFeeResponse, error) + //* + //ListSweeps returns a list of the sweep transactions our node has produced. + //Note that these sweeps may not be confirmed yet, as we record sweeps on + //broadcast, not confirmation. + ListSweeps(context.Context, *ListSweepsRequest) (*ListSweepsResponse, error) } func RegisterWalletKitServer(s *grpc.Server, srv WalletKitServer) { @@ -1279,6 +1474,24 @@ func _WalletKit_BumpFee_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _WalletKit_ListSweeps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListSweepsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WalletKitServer).ListSweeps(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/walletrpc.WalletKit/ListSweeps", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WalletKitServer).ListSweeps(ctx, req.(*ListSweepsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _WalletKit_serviceDesc = grpc.ServiceDesc{ ServiceName: "walletrpc.WalletKit", HandlerType: (*WalletKitServer)(nil), @@ -1315,6 +1528,10 @@ var _WalletKit_serviceDesc = grpc.ServiceDesc{ MethodName: "BumpFee", Handler: _WalletKit_BumpFee_Handler, }, + { + MethodName: "ListSweeps", + Handler: _WalletKit_ListSweeps_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "walletrpc/walletkit.proto", diff --git a/lnrpc/walletrpc/walletkit.proto b/lnrpc/walletrpc/walletkit.proto index 96f2ce06..3911f064 100644 --- a/lnrpc/walletrpc/walletkit.proto +++ b/lnrpc/walletrpc/walletkit.proto @@ -244,6 +244,31 @@ message BumpFeeRequest { message BumpFeeResponse { } + +message ListSweepsRequest { + /* + Retrieve the full sweep transaction details. If false, only the sweep txids + will be returned. + */ + bool verbose = 1; +} + +message ListSweepsResponse { + message TransactionIDs { + /* + Reversed, hex-encoded string representing the transaction ids of the + sweeps that our node has broadcast. Note that these transactions may + not have confirmed yet, we record sweeps on broadcast, not confirmation. + */ + repeated string transaction_ids = 1; + } + + oneof sweeps { + lnrpc.TransactionDetails transaction_details = 1; + TransactionIDs transaction_ids = 2; + } +} + service WalletKit { /** DeriveNextKey attempts to derive the *next* key within the key family @@ -325,4 +350,13 @@ service WalletKit { the new fee preference is sufficient is delegated to the user. */ rpc BumpFee (BumpFeeRequest) returns (BumpFeeResponse); + + + /** + ListSweeps returns a list of the sweep transactions our node has produced. + Note that these sweeps may not be confirmed yet, as we record sweeps on + broadcast, not confirmation. + */ + rpc ListSweeps (ListSweepsRequest) returns (ListSweepsResponse) {} } + diff --git a/lnrpc/walletrpc/walletkit_server.go b/lnrpc/walletrpc/walletkit_server.go index edfeb35c..12634f03 100644 --- a/lnrpc/walletrpc/walletkit_server.go +++ b/lnrpc/walletrpc/walletkit_server.go @@ -19,6 +19,7 @@ import ( "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc/signrpc" "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/lnwallet/btcwallet" "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/sweep" "google.golang.org/grpc" @@ -88,6 +89,10 @@ var ( Entity: "onchain", Action: "write", }}, + "/walletrpc.WalletKit/ListSweeps": {{ + Entity: "onchain", + Action: "read", + }}, } // DefaultWalletKitMacFilename is the default name of the wallet kit @@ -555,3 +560,67 @@ func (w *WalletKit) BumpFee(ctx context.Context, return &BumpFeeResponse{}, nil } + +// ListSweeps returns a list of the sweeps that our node has published. +func (w *WalletKit) ListSweeps(ctx context.Context, + in *ListSweepsRequest) (*ListSweepsResponse, error) { + + sweeps, err := w.cfg.Sweeper.ListSweeps() + if err != nil { + return nil, err + } + + sweepTxns := make(map[string]bool) + + txids := make([]string, len(sweeps)) + for i, sweep := range sweeps { + sweepTxns[sweep.String()] = true + txids[i] = sweep.String() + } + + // If the caller does not want verbose output, just return the set of + // sweep txids. + if !in.Verbose { + txidResp := &ListSweepsResponse_TransactionIDs{ + TransactionIds: txids, + } + + return &ListSweepsResponse{ + Sweeps: &ListSweepsResponse_TransactionIds{ + TransactionIds: txidResp, + }, + }, nil + } + + // If the caller does want full transaction lookups, query our wallet + // for all transactions, including unconfirmed transactions. + transactions, err := w.cfg.Wallet.ListTransactionDetails( + 0, btcwallet.UnconfirmedHeight, + ) + if err != nil { + return nil, err + } + + var sweepTxDetails []*lnwallet.TransactionDetail + for _, tx := range transactions { + _, ok := sweepTxns[tx.Hash.String()] + if !ok { + continue + } + + sweepTxDetails = append(sweepTxDetails, tx) + } + + // Fail if we have not retrieved all of our sweep transactions from the + // wallet. + if len(sweepTxDetails) != len(txids) { + return nil, fmt.Errorf("not all sweeps found by list "+ + "transactions: %v, %v", len(sweepTxDetails), len(txids)) + } + + return &ListSweepsResponse{ + Sweeps: &ListSweepsResponse_TransactionDetails{ + TransactionDetails: lnrpc.RPCTransactionDetails(transactions), + }, + }, nil +} diff --git a/rpcserver.go b/rpcserver.go index bb287321..a2cf6133 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4568,36 +4568,7 @@ func (r *rpcServer) GetTransactions(ctx context.Context, return nil, err } - txDetails := &lnrpc.TransactionDetails{ - Transactions: make([]*lnrpc.Transaction, len(transactions)), - } - for i, tx := range transactions { - var destAddresses []string - for _, destAddress := range tx.DestAddresses { - destAddresses = append(destAddresses, destAddress.EncodeAddress()) - } - - // We also get unconfirmed transactions, so BlockHash can be - // nil. - blockHash := "" - if tx.BlockHash != nil { - blockHash = tx.BlockHash.String() - } - - txDetails.Transactions[i] = &lnrpc.Transaction{ - TxHash: tx.Hash.String(), - Amount: int64(tx.Value), - NumConfirmations: tx.NumConfirmations, - BlockHash: blockHash, - BlockHeight: tx.BlockHeight, - TimeStamp: tx.Timestamp, - TotalFees: tx.TotalFees, - DestAddresses: destAddresses, - RawTxHex: hex.EncodeToString(tx.RawTx), - } - } - - return txDetails, nil + return lnrpc.RPCTransactionDetails(transactions), nil } // DescribeGraph returns a description of the latest graph state from the PoV