walletrpc: add ListLeases

This commit is contained in:
Joost Jager 2021-03-12 09:26:24 +01:00
parent b8e54fffbf
commit 9398220568
10 changed files with 411 additions and 123 deletions

@ -47,6 +47,7 @@ func walletCommands() []cli.Command {
listSweepsCommand, listSweepsCommand,
labelTxCommand, labelTxCommand,
releaseOutputCommand, releaseOutputCommand,
listLeasesCommand,
psbtCommand, psbtCommand,
}, },
}, },
@ -599,14 +600,7 @@ func fundPsbt(ctx *cli.Context) error {
return err return err
} }
jsonLocks := make([]*utxoLease, len(response.LockedUtxos)) jsonLocks := marshallLocks(response.LockedUtxos)
for idx, lock := range response.LockedUtxos {
jsonLocks[idx] = &utxoLease{
ID: hex.EncodeToString(lock.Id),
OutPoint: NewOutPointFromProto(lock.Outpoint),
Expiration: lock.Expiration,
}
}
printJSON(&fundPsbtResponse{ printJSON(&fundPsbtResponse{
Psbt: base64.StdEncoding.EncodeToString( Psbt: base64.StdEncoding.EncodeToString(
@ -619,6 +613,21 @@ func fundPsbt(ctx *cli.Context) error {
return nil return nil
} }
// marshallLocks converts the rpc lease information to a more json-friendly
// format.
func marshallLocks(lockedUtxos []*walletrpc.UtxoLease) []*utxoLease {
jsonLocks := make([]*utxoLease, len(lockedUtxos))
for idx, lock := range lockedUtxos {
jsonLocks[idx] = &utxoLease{
ID: hex.EncodeToString(lock.Id),
OutPoint: NewOutPointFromProto(lock.Outpoint),
Expiration: lock.Expiration,
}
}
return jsonLocks
}
// finalizePsbtResponse is a struct that contains JSON annotations for nice // finalizePsbtResponse is a struct that contains JSON annotations for nice
// result serialization. // result serialization.
type finalizePsbtResponse struct { type finalizePsbtResponse struct {
@ -757,3 +766,25 @@ func releaseOutput(ctx *cli.Context) error {
return nil return nil
} }
var listLeasesCommand = cli.Command{
Name: "listleases",
Usage: "Return a list of currently held leases.",
Action: actionDecorator(listLeases),
}
func listLeases(ctx *cli.Context) error {
req := &walletrpc.ListLeasesRequest{}
walletClient, cleanUp := getWalletClient(ctx)
defer cleanUp()
response, err := walletClient.ListLeases(context.Background(), req)
if err != nil {
return err
}
printJSON(marshallLocks(response.LockedUtxos))
return nil
}

@ -260,6 +260,8 @@ http:
- selector: walletrpc.WalletKit.ReleaseOutput - selector: walletrpc.WalletKit.ReleaseOutput
post: "/v2/wallet/utxos/release" post: "/v2/wallet/utxos/release"
body: "*" body: "*"
- selector: walletrpc.WalletKit.ListLeases
post: "/v2/wallet/utxos/leases"
- selector: walletrpc.WalletKit.DeriveNextKey - selector: walletrpc.WalletKit.DeriveNextKey
post: "/v2/wallet/key/next" post: "/v2/wallet/key/next"
body: "*" body: "*"

@ -1773,6 +1773,77 @@ func (m *FinalizePsbtResponse) GetRawFinalTx() []byte {
return nil return nil
} }
type ListLeasesRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListLeasesRequest) Reset() { *m = ListLeasesRequest{} }
func (m *ListLeasesRequest) String() string { return proto.CompactTextString(m) }
func (*ListLeasesRequest) ProtoMessage() {}
func (*ListLeasesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{30}
}
func (m *ListLeasesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListLeasesRequest.Unmarshal(m, b)
}
func (m *ListLeasesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListLeasesRequest.Marshal(b, m, deterministic)
}
func (m *ListLeasesRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListLeasesRequest.Merge(m, src)
}
func (m *ListLeasesRequest) XXX_Size() int {
return xxx_messageInfo_ListLeasesRequest.Size(m)
}
func (m *ListLeasesRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ListLeasesRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ListLeasesRequest proto.InternalMessageInfo
type ListLeasesResponse struct {
// The list of currently leased utxos.
LockedUtxos []*UtxoLease `protobuf:"bytes,1,rep,name=locked_utxos,json=lockedUtxos,proto3" json:"locked_utxos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListLeasesResponse) Reset() { *m = ListLeasesResponse{} }
func (m *ListLeasesResponse) String() string { return proto.CompactTextString(m) }
func (*ListLeasesResponse) ProtoMessage() {}
func (*ListLeasesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{31}
}
func (m *ListLeasesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListLeasesResponse.Unmarshal(m, b)
}
func (m *ListLeasesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListLeasesResponse.Marshal(b, m, deterministic)
}
func (m *ListLeasesResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListLeasesResponse.Merge(m, src)
}
func (m *ListLeasesResponse) XXX_Size() int {
return xxx_messageInfo_ListLeasesResponse.Size(m)
}
func (m *ListLeasesResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ListLeasesResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ListLeasesResponse proto.InternalMessageInfo
func (m *ListLeasesResponse) GetLockedUtxos() []*UtxoLease {
if m != nil {
return m.LockedUtxos
}
return nil
}
func init() { func init() {
proto.RegisterEnum("walletrpc.WitnessType", WitnessType_name, WitnessType_value) proto.RegisterEnum("walletrpc.WitnessType", WitnessType_name, WitnessType_value)
proto.RegisterType((*ListUnspentRequest)(nil), "walletrpc.ListUnspentRequest") proto.RegisterType((*ListUnspentRequest)(nil), "walletrpc.ListUnspentRequest")
@ -1807,126 +1878,130 @@ func init() {
proto.RegisterType((*UtxoLease)(nil), "walletrpc.UtxoLease") proto.RegisterType((*UtxoLease)(nil), "walletrpc.UtxoLease")
proto.RegisterType((*FinalizePsbtRequest)(nil), "walletrpc.FinalizePsbtRequest") proto.RegisterType((*FinalizePsbtRequest)(nil), "walletrpc.FinalizePsbtRequest")
proto.RegisterType((*FinalizePsbtResponse)(nil), "walletrpc.FinalizePsbtResponse") proto.RegisterType((*FinalizePsbtResponse)(nil), "walletrpc.FinalizePsbtResponse")
proto.RegisterType((*ListLeasesRequest)(nil), "walletrpc.ListLeasesRequest")
proto.RegisterType((*ListLeasesResponse)(nil), "walletrpc.ListLeasesResponse")
} }
func init() { proto.RegisterFile("walletrpc/walletkit.proto", fileDescriptor_6cc6942ac78249e5) } func init() { proto.RegisterFile("walletrpc/walletkit.proto", fileDescriptor_6cc6942ac78249e5) }
var fileDescriptor_6cc6942ac78249e5 = []byte{ var fileDescriptor_6cc6942ac78249e5 = []byte{
// 1817 bytes of a gzipped FileDescriptorProto // 1851 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xef, 0x6e, 0x22, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x5f, 0x73, 0xe2, 0xc8,
0x11, 0x5f, 0x0c, 0xc6, 0x50, 0x80, 0x8d, 0x1b, 0xbc, 0x66, 0x59, 0xef, 0xd9, 0x3b, 0x97, 0xe4, 0x11, 0x5f, 0x0c, 0xc6, 0xd0, 0x80, 0x8d, 0x07, 0xbc, 0x66, 0x59, 0xef, 0xd9, 0xab, 0x4b, 0x72,
0x9c, 0xdc, 0x1d, 0x56, 0xbc, 0xba, 0xcb, 0x9e, 0x13, 0x45, 0xb1, 0xf1, 0x58, 0x58, 0x60, 0x70, 0x4e, 0xee, 0x0e, 0x57, 0xbc, 0x75, 0x97, 0x3d, 0x27, 0x95, 0x8a, 0x8d, 0xe5, 0xc2, 0x05, 0x06,
0x1a, 0xbc, 0xd6, 0x26, 0x1f, 0x46, 0x03, 0xd3, 0xb6, 0x47, 0x86, 0x99, 0xb9, 0x99, 0xc6, 0x40, 0x67, 0xc0, 0xeb, 0xda, 0xe4, 0x41, 0x25, 0xd0, 0xd8, 0x56, 0x19, 0x24, 0x9d, 0x34, 0x18, 0xc8,
0x3e, 0xdd, 0x53, 0x44, 0x3a, 0x29, 0xef, 0x70, 0x2f, 0x90, 0x07, 0xca, 0x63, 0x44, 0xfd, 0x87, 0xd3, 0x7d, 0x8a, 0x54, 0x5d, 0x55, 0xbe, 0xc3, 0x3d, 0xe4, 0x35, 0x1f, 0x2e, 0x35, 0x7f, 0x10,
0x99, 0x1e, 0xc0, 0x7b, 0x8a, 0x72, 0x9f, 0xcc, 0xd4, 0xaf, 0xea, 0xd7, 0xd5, 0x55, 0xd5, 0x5d, 0x23, 0x81, 0x6f, 0x93, 0x4a, 0x9e, 0xd0, 0xf4, 0xaf, 0xbb, 0xa7, 0xa7, 0xbb, 0x67, 0xba, 0x1b,
0xd5, 0x86, 0x57, 0x13, 0x73, 0x38, 0x24, 0xd4, 0xf7, 0x06, 0x47, 0xe2, 0xd7, 0xa3, 0x4d, 0x6b, 0x78, 0x35, 0x31, 0x87, 0x43, 0x42, 0x7d, 0x6f, 0x70, 0x24, 0xbe, 0x1e, 0x6d, 0x5a, 0xf3, 0x7c,
0x9e, 0xef, 0x52, 0x17, 0x65, 0x43, 0xa8, 0x9a, 0xf5, 0xbd, 0x81, 0x90, 0x56, 0xcb, 0x81, 0x7d, 0x97, 0xba, 0x28, 0x1b, 0x42, 0xd5, 0xac, 0xef, 0x0d, 0x04, 0xb5, 0x5a, 0x0e, 0xec, 0x7b, 0x87,
0xef, 0x30, 0x75, 0xf6, 0x97, 0xf8, 0x42, 0xaa, 0xb5, 0x01, 0xb5, 0xec, 0x80, 0xde, 0x38, 0x81, 0xb1, 0xb3, 0x5f, 0xe2, 0x0b, 0xaa, 0xd6, 0x06, 0xd4, 0xb2, 0x03, 0x7a, 0xe3, 0x04, 0x1e, 0x71,
0x47, 0x1c, 0x8a, 0xc9, 0xf7, 0x63, 0x12, 0x50, 0xf4, 0x1a, 0xb2, 0x23, 0xdb, 0x31, 0x06, 0xae, 0x28, 0x26, 0xdf, 0x8f, 0x49, 0x40, 0xd1, 0x6b, 0xc8, 0x8e, 0x6c, 0xc7, 0x18, 0xb8, 0xce, 0x5d,
0x73, 0x17, 0x54, 0x12, 0x07, 0x89, 0xc3, 0x75, 0x9c, 0x19, 0xd9, 0x4e, 0x9d, 0x7d, 0x73, 0xd0, 0x50, 0x49, 0x1c, 0x24, 0x0e, 0xd7, 0x71, 0x66, 0x64, 0x3b, 0x75, 0xb6, 0xe6, 0xa0, 0x39, 0x95,
0x9c, 0x4a, 0x70, 0x4d, 0x82, 0xe6, 0x94, 0x83, 0xda, 0x7b, 0x28, 0xc5, 0xf8, 0x02, 0xcf, 0x75, 0xe0, 0x9a, 0x04, 0xcd, 0x29, 0x07, 0xb5, 0xf7, 0x50, 0x8a, 0xe8, 0x0b, 0x3c, 0xd7, 0x09, 0x08,
0x02, 0x82, 0xde, 0xc2, 0xfa, 0x98, 0x4e, 0x5d, 0x46, 0x96, 0x3c, 0xcc, 0x1d, 0xe7, 0x6a, 0x43, 0x7a, 0x0b, 0xeb, 0x63, 0x3a, 0x75, 0x99, 0xb2, 0xe4, 0x61, 0xee, 0x38, 0x57, 0x1b, 0x32, 0x53,
0xe6, 0x4a, 0xed, 0x86, 0x4e, 0x5d, 0x2c, 0x10, 0xed, 0x87, 0x04, 0xa0, 0x16, 0x31, 0x03, 0xd2, 0x6a, 0x37, 0x74, 0xea, 0x62, 0x81, 0x68, 0x3f, 0x24, 0x00, 0xb5, 0x88, 0x19, 0x90, 0xce, 0x98,
0x19, 0x53, 0x6f, 0x1c, 0xba, 0xb2, 0x09, 0x6b, 0xb6, 0xc5, 0x7d, 0xc8, 0xe3, 0x35, 0xdb, 0x42, 0x7a, 0xe3, 0xd0, 0x94, 0x4d, 0x58, 0xb3, 0x2d, 0x6e, 0x43, 0x1e, 0xaf, 0xd9, 0x16, 0xfa, 0x12,
0x5f, 0x42, 0xc6, 0x1d, 0x53, 0xcf, 0xb5, 0x1d, 0xca, 0x17, 0xcf, 0x1d, 0x6f, 0x49, 0xb2, 0xce, 0x32, 0xee, 0x98, 0x7a, 0xae, 0xed, 0x50, 0xbe, 0x79, 0xee, 0x78, 0x4b, 0x2a, 0xeb, 0x8c, 0xe9,
0x98, 0x5e, 0x33, 0x31, 0x0e, 0x15, 0xd0, 0xd7, 0x80, 0xc8, 0xd4, 0xb3, 0x7d, 0x93, 0xda, 0xae, 0x35, 0x23, 0xe3, 0x90, 0x01, 0x7d, 0x0d, 0x88, 0x4c, 0x3d, 0xdb, 0x37, 0xa9, 0xed, 0x3a, 0x46,
0x63, 0x04, 0x64, 0xe0, 0x3a, 0x56, 0x50, 0x49, 0x1e, 0x24, 0x0e, 0x53, 0x78, 0x3b, 0x42, 0xba, 0x40, 0x06, 0xae, 0x63, 0x05, 0x95, 0xe4, 0x41, 0xe2, 0x30, 0x85, 0xb7, 0x17, 0x48, 0x57, 0x00,
0x02, 0xd0, 0xbe, 0x81, 0x52, 0xcc, 0x03, 0xe9, 0xfc, 0x67, 0x00, 0x91, 0x2e, 0x77, 0x25, 0x85, 0xda, 0x37, 0x50, 0x8a, 0x58, 0x20, 0x8d, 0xff, 0x0c, 0x60, 0xc1, 0xcb, 0x4d, 0x49, 0x61, 0x85,
0x15, 0x89, 0xd6, 0x85, 0x32, 0x26, 0xc3, 0x5f, 0xd6, 0x75, 0x6d, 0x17, 0x76, 0x16, 0x48, 0x85, 0xa2, 0x75, 0xa1, 0x8c, 0xc9, 0xf0, 0xff, 0x6b, 0xba, 0xb6, 0x0b, 0x3b, 0x31, 0xa5, 0xc2, 0x1a,
0x37, 0xda, 0x5f, 0x21, 0xdd, 0x24, 0x33, 0x4c, 0xbe, 0x47, 0x87, 0x50, 0x7c, 0x24, 0x33, 0xe3, 0xed, 0xcf, 0x90, 0x6e, 0x92, 0x19, 0x26, 0xdf, 0xa3, 0x43, 0x28, 0x3e, 0x92, 0x99, 0x71, 0x67,
0xce, 0x76, 0xee, 0x89, 0x6f, 0x78, 0x3e, 0xe3, 0x15, 0xc9, 0xda, 0x7c, 0x24, 0xb3, 0x0b, 0x2e, 0x3b, 0xf7, 0xc4, 0x37, 0x3c, 0x9f, 0xe9, 0x15, 0xc1, 0xda, 0x7c, 0x24, 0xb3, 0x0b, 0x4e, 0xbe,
0xbe, 0x66, 0x52, 0xf4, 0x06, 0x80, 0x6b, 0x9a, 0x23, 0x7b, 0x38, 0x93, 0x39, 0xcb, 0x32, 0x1d, 0x66, 0x54, 0xf4, 0x06, 0x80, 0x73, 0x9a, 0x23, 0x7b, 0x38, 0x93, 0x31, 0xcb, 0x32, 0x1e, 0x4e,
0x2e, 0xd0, 0x0a, 0x90, 0x3b, 0xb5, 0x2c, 0x5f, 0xfa, 0xad, 0x69, 0x90, 0x17, 0x9f, 0x72, 0xff, 0xd0, 0x0a, 0x90, 0x3b, 0xb5, 0x2c, 0x5f, 0xda, 0xad, 0x69, 0x90, 0x17, 0x4b, 0x79, 0x7e, 0x04,
0x08, 0x52, 0xa6, 0x65, 0xf9, 0x9c, 0x3b, 0x8b, 0xf9, 0x6f, 0xed, 0x04, 0x72, 0x3d, 0xdf, 0x74, 0x29, 0xd3, 0xb2, 0x7c, 0xae, 0x3b, 0x8b, 0xf9, 0xb7, 0x76, 0x02, 0xb9, 0x9e, 0x6f, 0x3a, 0x81,
0x02, 0x73, 0xc0, 0x42, 0x80, 0x76, 0x20, 0x4d, 0xa7, 0xc6, 0x03, 0x99, 0xca, 0xed, 0xae, 0xd3, 0x39, 0x60, 0x2e, 0x40, 0x3b, 0x90, 0xa6, 0x53, 0xe3, 0x81, 0x4c, 0xe5, 0x71, 0xd7, 0xe9, 0xb4,
0x69, 0x83, 0x4c, 0x51, 0x19, 0xd6, 0x87, 0x66, 0x9f, 0x0c, 0xf9, 0x92, 0x59, 0x2c, 0x3e, 0xb4, 0x41, 0xa6, 0xa8, 0x0c, 0xeb, 0x43, 0xb3, 0x4f, 0x86, 0x7c, 0xcb, 0x2c, 0x16, 0x0b, 0xed, 0x5b,
0x6f, 0x61, 0xeb, 0x7a, 0xdc, 0x1f, 0xda, 0xc1, 0x43, 0xb8, 0xc4, 0xe7, 0x50, 0xf0, 0x84, 0xc8, 0xd8, 0xba, 0x1e, 0xf7, 0x87, 0x76, 0xf0, 0x10, 0x6e, 0xf1, 0x39, 0x14, 0x3c, 0x41, 0x32, 0x88,
0x20, 0xbe, 0xef, 0xce, 0xd7, 0xca, 0x4b, 0xa1, 0xce, 0x64, 0xda, 0xbf, 0x13, 0x80, 0xba, 0xc4, 0xef, 0xbb, 0xf3, 0xbd, 0xf2, 0x92, 0xa8, 0x33, 0x9a, 0xf6, 0xaf, 0x04, 0xa0, 0x2e, 0x71, 0x2c,
0xb1, 0x44, 0x40, 0x82, 0x79, 0x98, 0xf7, 0x00, 0x02, 0x93, 0x1a, 0x1e, 0xf1, 0x8d, 0xc7, 0x09, 0xe1, 0x90, 0x60, 0xee, 0xe6, 0x3d, 0x80, 0xc0, 0xa4, 0x86, 0x47, 0x7c, 0xe3, 0x71, 0xc2, 0x05,
0x37, 0x4c, 0xe2, 0x4c, 0x60, 0xd2, 0x6b, 0xe2, 0x37, 0x27, 0xe8, 0x10, 0x36, 0x5c, 0xa1, 0x5f, 0x93, 0x38, 0x13, 0x98, 0xf4, 0x9a, 0xf8, 0xcd, 0x09, 0x3a, 0x84, 0x0d, 0x57, 0xf0, 0x57, 0xd6,
0x59, 0xe3, 0xb5, 0xb7, 0x59, 0x93, 0x07, 0xa1, 0xd6, 0x9b, 0x76, 0xc6, 0x14, 0xcf, 0xe1, 0xc8, 0x78, 0xee, 0x6d, 0xd6, 0xe4, 0x45, 0xa8, 0xf5, 0xa6, 0x9d, 0x31, 0xc5, 0x73, 0x78, 0x61, 0x6c,
0xd9, 0xa4, 0xe2, 0x6c, 0xfc, 0x28, 0xa4, 0x16, 0x8e, 0xc2, 0x97, 0xb0, 0xcd, 0xea, 0xdc, 0x32, 0x52, 0x31, 0x36, 0x7a, 0x15, 0x52, 0xb1, 0xab, 0xf0, 0x25, 0x6c, 0xb3, 0x3c, 0xb7, 0x8c, 0xb1,
0xc6, 0x0e, 0x53, 0xb0, 0xfd, 0x11, 0xb1, 0x2a, 0xeb, 0x07, 0x89, 0xc3, 0x0c, 0x2e, 0x72, 0xe0, 0xc3, 0x18, 0x6c, 0x7f, 0x44, 0xac, 0xca, 0xfa, 0x41, 0xe2, 0x30, 0x83, 0x8b, 0x1c, 0xb8, 0x59,
0x26, 0x92, 0x6b, 0x5f, 0x41, 0x29, 0xe6, 0xbd, 0xdc, 0xfa, 0x0e, 0xa4, 0x7d, 0x73, 0x62, 0xd0, 0xd0, 0xb5, 0xaf, 0xa0, 0x14, 0xb1, 0x5e, 0x1e, 0x7d, 0x07, 0xd2, 0xbe, 0x39, 0x31, 0x68, 0xe8,
0x30, 0x74, 0xbe, 0x39, 0xe9, 0x4d, 0xb5, 0x6f, 0x00, 0xe9, 0x01, 0xb5, 0x47, 0x26, 0x25, 0x17, 0x3a, 0xdf, 0x9c, 0xf4, 0xa6, 0xda, 0x37, 0x80, 0xf4, 0x80, 0xda, 0x23, 0x93, 0x92, 0x0b, 0x42,
0x84, 0xcc, 0xf7, 0xba, 0x0f, 0x39, 0x46, 0x68, 0x50, 0xd3, 0xbf, 0x27, 0xf3, 0x6c, 0x03, 0x13, 0xe6, 0x67, 0xdd, 0x87, 0x1c, 0x53, 0x68, 0x50, 0xd3, 0xbf, 0x27, 0xf3, 0x68, 0x03, 0x23, 0xf5,
0xf5, 0xb8, 0x44, 0x7b, 0x07, 0xa5, 0x98, 0x99, 0x5c, 0xe4, 0x93, 0x31, 0xd2, 0x7e, 0x4c, 0x42, 0x38, 0x45, 0x7b, 0x07, 0xa5, 0x88, 0x98, 0xdc, 0xe4, 0x67, 0x7d, 0xa4, 0xfd, 0x98, 0x84, 0xfc,
0xfe, 0x9a, 0x38, 0x96, 0xed, 0xdc, 0x77, 0x27, 0x84, 0x78, 0xb1, 0x4a, 0x4d, 0xfc, 0xdc, 0x21, 0x35, 0x71, 0x2c, 0xdb, 0xb9, 0xef, 0x4e, 0x08, 0xf1, 0x22, 0x99, 0x9a, 0xf8, 0xd4, 0x25, 0xfb,
0xfb, 0x0e, 0xf2, 0x13, 0x9b, 0x3a, 0x24, 0x08, 0x0c, 0x3a, 0xf3, 0x08, 0xcf, 0xf5, 0xe6, 0xf1, 0x0e, 0xf2, 0x13, 0x9b, 0x3a, 0x24, 0x08, 0x0c, 0x3a, 0xf3, 0x08, 0x8f, 0xf5, 0xe6, 0xf1, 0xcb,
0xcb, 0x5a, 0x78, 0x0b, 0xd5, 0x6e, 0x05, 0xdc, 0x9b, 0x79, 0x04, 0xe7, 0x26, 0xd1, 0x07, 0xab, 0x5a, 0xf8, 0x0a, 0xd5, 0x6e, 0x05, 0xdc, 0x9b, 0x79, 0x04, 0xe7, 0x26, 0x8b, 0x05, 0xcb, 0x4b,
0x4b, 0x73, 0xe4, 0x8e, 0x1d, 0x6a, 0x04, 0x26, 0xe5, 0x71, 0x2f, 0xe0, 0xac, 0x90, 0x74, 0x4d, 0x73, 0xe4, 0x8e, 0x1d, 0x6a, 0x04, 0x26, 0xe5, 0x7e, 0x2f, 0xe0, 0xac, 0xa0, 0x74, 0x4d, 0x8a,
0x8a, 0x0e, 0x20, 0x3f, 0xf7, 0xba, 0x3f, 0xa3, 0x84, 0x87, 0xbf, 0x80, 0x41, 0xf8, 0x7d, 0x36, 0x0e, 0x20, 0x3f, 0xb7, 0xba, 0x3f, 0xa3, 0x84, 0xbb, 0xbf, 0x80, 0x41, 0xd8, 0x7d, 0x36, 0xa3,
0xa3, 0x84, 0x1d, 0xf0, 0xbe, 0xef, 0x9a, 0xd6, 0xc0, 0x0c, 0xa8, 0x61, 0x52, 0x4a, 0x46, 0x1e, 0x84, 0x5d, 0xf0, 0xbe, 0xef, 0x9a, 0xd6, 0xc0, 0x0c, 0xa8, 0x61, 0x52, 0x4a, 0x46, 0x1e, 0x0d,
0x0d, 0x78, 0x06, 0x0a, 0x78, 0x3b, 0x44, 0x4e, 0x25, 0x80, 0x8e, 0x61, 0xc7, 0x21, 0x53, 0x6a, 0x78, 0x04, 0x0a, 0x78, 0x3b, 0x44, 0x4e, 0x25, 0x80, 0x8e, 0x61, 0xc7, 0x21, 0x53, 0x6a, 0x2c,
0x44, 0x36, 0x0f, 0xc4, 0xbe, 0x7f, 0xa0, 0x95, 0x34, 0xb7, 0x28, 0x31, 0xf0, 0x6c, 0x8e, 0x35, 0x64, 0x1e, 0x88, 0x7d, 0xff, 0x40, 0x2b, 0x69, 0x2e, 0x51, 0x62, 0xe0, 0xd9, 0x1c, 0x6b, 0x70,
0x38, 0xc4, 0x6c, 0x7c, 0x11, 0x7d, 0x62, 0x19, 0x6a, 0xf0, 0x33, 0xc2, 0x26, 0x04, 0xeb, 0x61, 0x88, 0xc9, 0xf8, 0xc2, 0xfb, 0xc4, 0x32, 0x54, 0xe7, 0x67, 0x84, 0x4c, 0x08, 0xd6, 0xc3, 0x28,
0x16, 0xd0, 0x3b, 0x78, 0x19, 0xd9, 0xc4, 0xb6, 0x90, 0x5d, 0x30, 0xea, 0x46, 0x7b, 0x29, 0xc3, 0xa0, 0x77, 0xf0, 0x72, 0x21, 0x13, 0x39, 0x42, 0x36, 0x26, 0xd4, 0x5d, 0x9c, 0xa5, 0x0c, 0xeb,
0xfa, 0x9d, 0xeb, 0x0f, 0x48, 0x65, 0x83, 0x17, 0x90, 0xf8, 0xd0, 0x5e, 0x42, 0x59, 0x4d, 0xcd, 0x77, 0xae, 0x3f, 0x20, 0x95, 0x0d, 0x9e, 0x40, 0x62, 0xa1, 0xbd, 0x84, 0xb2, 0x1a, 0x9a, 0x79,
0xbc, 0xea, 0xb5, 0x5b, 0xd8, 0x59, 0x90, 0xcb, 0x54, 0xff, 0x19, 0x36, 0x3d, 0x01, 0x18, 0x01, 0xd6, 0x6b, 0xb7, 0xb0, 0x13, 0xa3, 0xcb, 0x50, 0xff, 0x11, 0x36, 0x3d, 0x01, 0x18, 0x01, 0x47,
0x47, 0xe4, 0x9d, 0xbb, 0xab, 0x24, 0x44, 0xb5, 0xc4, 0x05, 0x4f, 0xe5, 0xd1, 0xfe, 0x99, 0x80, 0xe4, 0x9b, 0xbb, 0xab, 0x04, 0x44, 0x95, 0xc4, 0x05, 0x4f, 0xd5, 0xa3, 0xfd, 0x3d, 0x01, 0x9b,
0xcd, 0xb3, 0xf1, 0xc8, 0x53, 0xaa, 0xee, 0x7f, 0x2a, 0x87, 0x7d, 0xc8, 0x89, 0x00, 0xf1, 0x60, 0x67, 0xe3, 0x91, 0xa7, 0x64, 0xdd, 0x7f, 0x95, 0x0e, 0xfb, 0x90, 0x13, 0x0e, 0xe2, 0xce, 0xe2,
0xf1, 0x6a, 0x28, 0x60, 0x10, 0x22, 0x16, 0xa2, 0xa5, 0xac, 0x26, 0x97, 0xb2, 0x1a, 0x46, 0x22, 0xd9, 0x50, 0xc0, 0x20, 0x48, 0xcc, 0x45, 0x4b, 0x51, 0x4d, 0x2e, 0x45, 0x35, 0xf4, 0x44, 0x4a,
0xa5, 0x46, 0x62, 0x1b, 0xb6, 0x42, 0xbf, 0xe4, 0x5d, 0xf8, 0x35, 0x6c, 0xb3, 0x6e, 0x13, 0x8b, 0xf5, 0xc4, 0x36, 0x6c, 0x85, 0x76, 0xc9, 0xb7, 0xf0, 0x6b, 0xd8, 0x66, 0xd5, 0x26, 0xe2, 0x19,
0x0c, 0xaa, 0xc0, 0xc6, 0x13, 0xf1, 0xfb, 0x6e, 0x40, 0xb8, 0xb3, 0x19, 0x3c, 0xff, 0xd4, 0x7e, 0x54, 0x81, 0x8d, 0x27, 0xe2, 0xf7, 0xdd, 0x80, 0x70, 0x63, 0x33, 0x78, 0xbe, 0xd4, 0x7e, 0x58,
0x58, 0x13, 0xdd, 0x6e, 0x21, 0x62, 0x2d, 0x28, 0xd1, 0xe8, 0x2e, 0x33, 0x2c, 0x42, 0x4d, 0x7b, 0x13, 0xd5, 0x2e, 0xe6, 0xb1, 0x16, 0x94, 0xe8, 0xe2, 0x2d, 0x33, 0x2c, 0x42, 0x4d, 0x7b, 0x18,
0x18, 0xc8, 0x9d, 0xbe, 0x92, 0x3b, 0x55, 0x6e, 0xbb, 0x73, 0xa1, 0xd0, 0x78, 0x81, 0x11, 0x5d, 0xc8, 0x93, 0xbe, 0x92, 0x27, 0x55, 0x5e, 0xbb, 0x73, 0xc1, 0xd0, 0x78, 0x81, 0x11, 0x5d, 0xa2,
0x92, 0xa2, 0x5b, 0xd8, 0x52, 0xd9, 0x6c, 0x2b, 0x90, 0x97, 0xfd, 0x57, 0x4a, 0x02, 0x96, 0xbd, 0xa2, 0x5b, 0xd8, 0x52, 0xb5, 0xd9, 0x56, 0x20, 0x1f, 0xfb, 0xaf, 0x94, 0x00, 0x2c, 0x5b, 0xa1,
0x50, 0x17, 0xb8, 0x3c, 0x67, 0xe4, 0x9b, 0x0a, 0xcd, 0xa5, 0x15, 0x54, 0xbf, 0x83, 0xcd, 0xb8, 0x6e, 0x70, 0x79, 0xce, 0x94, 0x6f, 0x2a, 0x6a, 0x2e, 0xad, 0xa0, 0xfa, 0x1d, 0x6c, 0x46, 0x79,
0x0e, 0xfa, 0x62, 0x79, 0x29, 0x96, 0xeb, 0xec, 0xa2, 0xe9, 0x59, 0x06, 0xd2, 0xa2, 0x16, 0x34, 0xd0, 0x17, 0xcb, 0x5b, 0xb1, 0x58, 0x67, 0xe3, 0xa2, 0x67, 0x19, 0x48, 0x8b, 0x5c, 0xd0, 0x4c,
0x13, 0x76, 0x5b, 0xec, 0x5e, 0x53, 0x98, 0xe6, 0x71, 0x43, 0x90, 0xa2, 0xd3, 0xb0, 0x61, 0xf1, 0xd8, 0x6d, 0xb1, 0x77, 0x4d, 0xd1, 0x34, 0xf7, 0x1b, 0x82, 0x14, 0x9d, 0x86, 0x05, 0x8b, 0x7f,
0xdf, 0xab, 0x2f, 0x70, 0xb4, 0x07, 0x59, 0xf7, 0x89, 0xf8, 0x13, 0xdf, 0x96, 0xe9, 0xcb, 0xe0, 0xaf, 0x7e, 0xc0, 0xd1, 0x1e, 0x64, 0xdd, 0x27, 0xe2, 0x4f, 0x7c, 0x5b, 0x86, 0x2f, 0x83, 0x17,
0x48, 0xa0, 0x55, 0xa1, 0xb2, 0xbc, 0x84, 0x4c, 0xd8, 0x4f, 0x09, 0xd8, 0xba, 0x18, 0x3b, 0xd6, 0x04, 0xad, 0x0a, 0x95, 0xe5, 0x2d, 0x64, 0xc0, 0x7e, 0x4a, 0xc0, 0xd6, 0xc5, 0xd8, 0xb1, 0xae,
0x75, 0xd0, 0x0f, 0xdb, 0x64, 0x19, 0x52, 0x5e, 0xd0, 0x17, 0x95, 0x95, 0x6f, 0xbc, 0xc0, 0xfc, 0x83, 0x7e, 0x58, 0x26, 0xcb, 0x90, 0xf2, 0x82, 0xbe, 0xc8, 0xac, 0x7c, 0xe3, 0x05, 0xe6, 0x2b,
0x0b, 0xfd, 0x16, 0x92, 0xbe, 0x39, 0x91, 0xa1, 0xdb, 0x51, 0x42, 0xd7, 0x9b, 0xf6, 0xc8, 0xc8, 0xf4, 0x6b, 0x48, 0xfa, 0xe6, 0x44, 0xba, 0x6e, 0x47, 0x71, 0x5d, 0x6f, 0xda, 0x23, 0x23, 0x6f,
0x1b, 0x9a, 0x94, 0x34, 0x5e, 0x60, 0xa6, 0x83, 0xde, 0xc6, 0x2b, 0x8e, 0xd7, 0x53, 0x23, 0x11, 0x68, 0x52, 0xd2, 0x78, 0x81, 0x19, 0x0f, 0x7a, 0x1b, 0xcd, 0x38, 0x9e, 0x4f, 0x8d, 0x44, 0x24,
0xab, 0xb9, 0x5f, 0x41, 0x61, 0x5e, 0x73, 0x4f, 0xd1, 0x55, 0xd2, 0x48, 0xe0, 0x9c, 0x28, 0xbb, 0xe7, 0x7e, 0x01, 0x85, 0x79, 0xce, 0x3d, 0x2d, 0x9e, 0x92, 0x46, 0x02, 0xe7, 0x44, 0xda, 0x7d,
0x0f, 0x4c, 0x78, 0x06, 0x90, 0xa1, 0x92, 0xfb, 0x2c, 0x0d, 0xa9, 0x3b, 0x42, 0x02, 0xed, 0x5f, 0x60, 0xc4, 0x33, 0x80, 0x0c, 0x95, 0xba, 0xcf, 0xd2, 0x90, 0xba, 0x23, 0x24, 0xd0, 0xfe, 0x91,
0x09, 0x28, 0x46, 0x1e, 0xcb, 0x8a, 0xd9, 0x87, 0xdc, 0xdd, 0xd8, 0xb1, 0x88, 0x65, 0x44, 0x9e, 0x80, 0xe2, 0xc2, 0x62, 0x99, 0x31, 0xfb, 0x90, 0xbb, 0x1b, 0x3b, 0x16, 0xb1, 0x8c, 0x85, 0xe5,
0x63, 0x10, 0x22, 0xa6, 0x88, 0x6a, 0x50, 0x1a, 0x3c, 0x98, 0xce, 0x3d, 0x31, 0x44, 0x77, 0x31, 0x18, 0x04, 0x89, 0x31, 0xa2, 0x1a, 0x94, 0x06, 0x0f, 0xa6, 0x73, 0x4f, 0x0c, 0x51, 0x5d, 0x0c,
0x6c, 0xc7, 0x22, 0x53, 0xd9, 0x79, 0xb7, 0x05, 0x24, 0x1a, 0xc1, 0x25, 0x03, 0xd0, 0x1f, 0x20, 0xdb, 0xb1, 0xc8, 0x54, 0x56, 0xde, 0x6d, 0x01, 0x89, 0x42, 0x70, 0xc9, 0x00, 0xf4, 0x3b, 0xc8,
0x3f, 0x74, 0x07, 0x8f, 0xc4, 0x32, 0xc4, 0x98, 0x94, 0xe4, 0x47, 0xb6, 0xac, 0x6c, 0x9b, 0x8d, 0x0f, 0xdd, 0xc1, 0x23, 0xb1, 0x0c, 0xd1, 0x26, 0x25, 0xf9, 0x95, 0x2d, 0x2b, 0xc7, 0x66, 0xad,
0x4a, 0x7c, 0x38, 0xc1, 0x39, 0xa1, 0x79, 0xc3, 0xa7, 0xa6, 0x9f, 0x12, 0x00, 0x51, 0x44, 0xd0, 0x12, 0x6f, 0x4e, 0x70, 0x4e, 0x70, 0xde, 0xf0, 0xae, 0xe9, 0xa7, 0x04, 0xc0, 0xc2, 0x23, 0xe8,
0x17, 0x90, 0xb6, 0x1d, 0xde, 0xec, 0xc4, 0xa1, 0x5f, 0x3a, 0xa7, 0x12, 0x46, 0x7f, 0x5a, 0x6c, 0x0b, 0x48, 0xdb, 0x0e, 0x2f, 0x76, 0xe2, 0xd2, 0x2f, 0xdd, 0x53, 0x09, 0xa3, 0x3f, 0xc4, 0xcb,
0x8b, 0xda, 0xca, 0x10, 0xd7, 0x64, 0xb7, 0xd2, 0x1d, 0xea, 0xcf, 0xc2, 0x56, 0x59, 0x3d, 0x81, 0xa2, 0xb6, 0xd2, 0xc5, 0x35, 0x59, 0xad, 0x74, 0x87, 0xfa, 0xb3, 0xb0, 0x54, 0x56, 0x4f, 0x20,
0xbc, 0x0a, 0xa0, 0x22, 0x24, 0x1f, 0xc9, 0x4c, 0x36, 0x6d, 0xf6, 0x93, 0x15, 0xce, 0x93, 0x39, 0xaf, 0x02, 0xa8, 0x08, 0xc9, 0x47, 0x32, 0x93, 0x45, 0x9b, 0x7d, 0xb2, 0xc4, 0x79, 0x32, 0x87,
0x1c, 0x8b, 0x6e, 0x90, 0xc2, 0xe2, 0xe3, 0x64, 0xed, 0x7d, 0x42, 0x7b, 0x80, 0x6c, 0xb8, 0x97, 0x63, 0x51, 0x0d, 0x52, 0x58, 0x2c, 0x4e, 0xd6, 0xde, 0x27, 0xb4, 0x07, 0xc8, 0x86, 0x67, 0xf9,
0xff, 0x6f, 0xba, 0x8b, 0xcf, 0x65, 0xc9, 0xa5, 0xb9, 0xec, 0x5b, 0x28, 0x5d, 0xd8, 0x8e, 0x39, 0xdf, 0xba, 0xbb, 0x68, 0x5f, 0x96, 0x5c, 0xea, 0xcb, 0xbe, 0x85, 0xd2, 0x85, 0xed, 0x98, 0x43,
0xb4, 0xff, 0x41, 0xd4, 0x7a, 0xfb, 0xb9, 0xe4, 0x69, 0x1f, 0xa1, 0x1c, 0xb7, 0x8b, 0xb2, 0xce, 0xfb, 0x6f, 0x44, 0xcd, 0xb7, 0x4f, 0x05, 0x4f, 0xfb, 0x08, 0xe5, 0xa8, 0xdc, 0x22, 0xea, 0xbc,
0x67, 0xe7, 0xb8, 0xa1, 0x10, 0xf1, 0xac, 0x1f, 0x40, 0x9e, 0xb5, 0xf2, 0x3b, 0x66, 0xcc, 0x1a, 0x77, 0x8e, 0x0a, 0x0a, 0x12, 0x8f, 0xfa, 0x01, 0xe4, 0x59, 0x29, 0xbf, 0x63, 0xc2, 0xac, 0xa0,
0xfa, 0x9a, 0xd0, 0xf0, 0xcd, 0x09, 0xe7, 0xeb, 0x4d, 0x7f, 0xf7, 0x63, 0x12, 0x72, 0x4a, 0x37, 0xaf, 0x09, 0x0e, 0xdf, 0x9c, 0x70, 0x7d, 0xbd, 0xa9, 0x56, 0x12, 0x0f, 0x16, 0x3f, 0x7c, 0xf8,
0x44, 0x25, 0xd8, 0xba, 0x69, 0x37, 0xdb, 0x9d, 0xdb, 0xb6, 0x71, 0x7b, 0xd9, 0x6b, 0xeb, 0xdd, 0x94, 0x5f, 0x89, 0x57, 0x69, 0x4e, 0x94, 0xbb, 0xc5, 0x53, 0x22, 0xf1, 0x1f, 0xa6, 0xc4, 0x6f,
0x6e, 0xf1, 0x05, 0xaa, 0x40, 0xb9, 0xde, 0xb9, 0xba, 0xba, 0xec, 0x5d, 0xe9, 0xed, 0x9e, 0xd1, 0x7e, 0x4c, 0x42, 0x4e, 0xa9, 0xb8, 0xa8, 0x04, 0x5b, 0x37, 0xed, 0x66, 0xbb, 0x73, 0xdb, 0x36,
0xbb, 0xbc, 0xd2, 0x8d, 0x56, 0xa7, 0xde, 0x2c, 0x26, 0xd0, 0x2e, 0x94, 0x14, 0xa4, 0xdd, 0x31, 0x6e, 0x2f, 0x7b, 0x6d, 0xbd, 0xdb, 0x2d, 0xbe, 0x40, 0x15, 0x28, 0xd7, 0x3b, 0x57, 0x57, 0x97,
0xce, 0xf5, 0xd6, 0xe9, 0xc7, 0xe2, 0x1a, 0xda, 0x81, 0x6d, 0x05, 0xc0, 0xfa, 0x87, 0x4e, 0x53, 0xbd, 0x2b, 0xbd, 0xdd, 0x33, 0x7a, 0x97, 0x57, 0xba, 0xd1, 0xea, 0xd4, 0x9b, 0xc5, 0x04, 0xda,
0x2f, 0x26, 0x99, 0x7e, 0xa3, 0xd7, 0xaa, 0x1b, 0x9d, 0x8b, 0x0b, 0x1d, 0xeb, 0xe7, 0x73, 0x20, 0x85, 0x92, 0x82, 0xb4, 0x3b, 0xc6, 0xb9, 0xde, 0x3a, 0xfd, 0x58, 0x5c, 0x43, 0x3b, 0xb0, 0xad,
0xc5, 0x96, 0xe0, 0xc0, 0x69, 0xbd, 0xae, 0x5f, 0xf7, 0x22, 0x64, 0x1d, 0xfd, 0x1a, 0xde, 0xc6, 0x00, 0x58, 0xff, 0xd0, 0x69, 0xea, 0xc5, 0x24, 0xe3, 0x6f, 0xf4, 0x5a, 0x75, 0xa3, 0x73, 0x71,
0x4c, 0xd8, 0xf2, 0x9d, 0x9b, 0x9e, 0xd1, 0xd5, 0xeb, 0x9d, 0xf6, 0xb9, 0xd1, 0xd2, 0x3f, 0xe8, 0xa1, 0x63, 0xfd, 0x7c, 0x0e, 0xa4, 0xd8, 0x16, 0x1c, 0x38, 0xad, 0xd7, 0xf5, 0xeb, 0xde, 0x02,
0xad, 0x62, 0x1a, 0xfd, 0x06, 0xb4, 0x38, 0x41, 0xf7, 0xa6, 0x5e, 0xd7, 0xbb, 0xdd, 0xb8, 0xde, 0x59, 0x47, 0xbf, 0x84, 0xb7, 0x11, 0x11, 0xb6, 0x7d, 0xe7, 0xa6, 0x67, 0x74, 0xf5, 0x7a, 0xa7,
0x06, 0xda, 0x87, 0xd7, 0x0b, 0x1e, 0x5c, 0x75, 0x7a, 0xfa, 0x9c, 0xb5, 0x98, 0x41, 0x07, 0xb0, 0x7d, 0x6e, 0xb4, 0xf4, 0x0f, 0x7a, 0xab, 0x98, 0x46, 0xbf, 0x02, 0x2d, 0xaa, 0xa0, 0x7b, 0x53,
0xb7, 0xe8, 0x09, 0xd7, 0x90, 0x7c, 0xc5, 0x2c, 0xda, 0x83, 0x0a, 0xd7, 0x50, 0x99, 0xe7, 0xfe, 0xaf, 0xeb, 0xdd, 0x6e, 0x94, 0x6f, 0x03, 0xed, 0xc3, 0xeb, 0x98, 0x05, 0x57, 0x9d, 0x9e, 0x3e,
0x02, 0x2a, 0x43, 0x51, 0x46, 0xce, 0x68, 0xea, 0x1f, 0x8d, 0xc6, 0x69, 0xb7, 0x51, 0xcc, 0xa1, 0xd7, 0x5a, 0xcc, 0xa0, 0x03, 0xd8, 0x8b, 0x5b, 0xc2, 0x39, 0xa4, 0xbe, 0x62, 0x16, 0xed, 0x41,
0xd7, 0xb0, 0xdb, 0xd6, 0xbb, 0x8c, 0x6e, 0x09, 0xcc, 0x2f, 0x04, 0xeb, 0xb4, 0x5d, 0x6f, 0x74, 0x85, 0x73, 0xa8, 0x9a, 0xe7, 0xf6, 0x02, 0x2a, 0x43, 0x51, 0x7a, 0xce, 0x68, 0xea, 0x1f, 0x8d,
0x70, 0xb1, 0x70, 0xfc, 0x9f, 0x0c, 0x64, 0x6f, 0xf9, 0x19, 0x68, 0xda, 0x14, 0xb5, 0x20, 0xa7, 0xc6, 0x69, 0xb7, 0x51, 0xcc, 0xa1, 0xd7, 0xb0, 0xdb, 0xd6, 0xbb, 0x4c, 0xdd, 0x12, 0x98, 0x8f,
0x3c, 0x64, 0xd0, 0x9b, 0x85, 0xcb, 0x3b, 0xfe, 0x60, 0xaa, 0x7e, 0xf6, 0x1c, 0x1c, 0xb6, 0x98, 0x39, 0xeb, 0xb4, 0x5d, 0x6f, 0x74, 0x70, 0xb1, 0x70, 0xfc, 0xcf, 0x2c, 0x64, 0x6f, 0x79, 0x00,
0x9c, 0xf2, 0xb2, 0x88, 0xb3, 0x2d, 0x3d, 0x1c, 0xe2, 0x6c, 0x2b, 0x1e, 0x24, 0x18, 0x0a, 0xb1, 0x9b, 0x36, 0x45, 0x2d, 0xc8, 0x29, 0xc3, 0x12, 0x7a, 0x13, 0x2b, 0x10, 0xd1, 0xa1, 0xac, 0xfa,
0xb7, 0x01, 0xda, 0x57, 0x0c, 0x56, 0x3d, 0x45, 0xaa, 0x07, 0xcf, 0x2b, 0x48, 0xce, 0x13, 0x28, 0xd9, 0x73, 0x70, 0x58, 0xc6, 0x72, 0xca, 0xf4, 0x12, 0xd5, 0xb6, 0x34, 0x9c, 0x44, 0xb5, 0xad,
0x9c, 0x13, 0xdf, 0x7e, 0x22, 0x6d, 0x32, 0xa5, 0x4d, 0x32, 0x43, 0xdb, 0x8a, 0x89, 0x78, 0x70, 0x18, 0x7a, 0x30, 0x14, 0x22, 0xf3, 0x07, 0xda, 0x57, 0x04, 0x56, 0x8d, 0x3b, 0xd5, 0x83, 0xe7,
0x54, 0x5f, 0x86, 0xa3, 0x73, 0x93, 0xcc, 0xce, 0x49, 0x30, 0xf0, 0x6d, 0x8f, 0xba, 0x3e, 0x7a, 0x19, 0xa4, 0xce, 0x4b, 0x80, 0x45, 0xa2, 0xa3, 0xbd, 0xd8, 0x79, 0x22, 0x97, 0xa2, 0xfa, 0xe6,
0x0f, 0x59, 0x61, 0xcb, 0xec, 0x4a, 0xaa, 0x52, 0xcb, 0x1d, 0x98, 0xd4, 0xf5, 0x9f, 0xb5, 0xfc, 0x19, 0x54, 0xaa, 0x3a, 0x81, 0xc2, 0x39, 0xf1, 0xed, 0x27, 0xd2, 0x26, 0x53, 0xda, 0x24, 0x33,
0x23, 0x64, 0xd8, 0x7a, 0xec, 0xb9, 0x81, 0xd4, 0x89, 0x51, 0x79, 0x8e, 0x54, 0x77, 0x97, 0xe4, 0xb4, 0xad, 0xf0, 0x8b, 0xf9, 0xa8, 0xfa, 0x32, 0xec, 0xf4, 0x9b, 0x64, 0x76, 0x4e, 0x82, 0x81,
0xd2, 0xe5, 0x06, 0x20, 0xf9, 0x8e, 0x50, 0x9f, 0x22, 0x2a, 0x8d, 0x22, 0xaf, 0x56, 0xd5, 0xf9, 0x6f, 0x7b, 0xd4, 0xf5, 0xd1, 0x7b, 0xc8, 0x0a, 0x59, 0x26, 0x57, 0x52, 0x99, 0x5a, 0xee, 0xc0,
0x67, 0xe1, 0xf9, 0xd1, 0x82, 0x9c, 0x32, 0x9a, 0xc7, 0xd2, 0xb3, 0xfc, 0xe0, 0x88, 0xa5, 0x67, 0xa4, 0xae, 0xff, 0xac, 0xe4, 0xef, 0x21, 0xc3, 0xf6, 0x63, 0xd3, 0x11, 0x52, 0x1b, 0x5c, 0x65,
0xd5, 0x44, 0xdf, 0x82, 0x9c, 0x32, 0x83, 0xc7, 0xd8, 0x96, 0x47, 0xfa, 0x18, 0xdb, 0xaa, 0xd1, 0x7a, 0xaa, 0xee, 0x2e, 0xd1, 0xa5, 0xc9, 0x0d, 0x40, 0x72, 0xec, 0x51, 0x27, 0x27, 0x55, 0x8d,
0x1d, 0x43, 0x21, 0x36, 0xe8, 0xc5, 0x92, 0xbd, 0x6a, 0x34, 0x8c, 0x25, 0x7b, 0xf5, 0x8c, 0xf8, 0x42, 0xaf, 0x56, 0xd5, 0x76, 0x2d, 0x36, 0x2d, 0xb5, 0x20, 0xa7, 0x4c, 0x12, 0x91, 0x48, 0x2f,
0x17, 0xd8, 0x90, 0xa3, 0x14, 0x7a, 0xa5, 0x28, 0xc7, 0xc7, 0xbe, 0x58, 0xc4, 0x16, 0x26, 0x2f, 0xcf, 0x47, 0x91, 0x48, 0xaf, 0x1a, 0x40, 0x5a, 0x90, 0x53, 0x46, 0x86, 0x88, 0xb6, 0xe5, 0x09,
0x74, 0x09, 0x10, 0xcd, 0x30, 0x68, 0xef, 0x99, 0xd1, 0x46, 0xf0, 0xbc, 0xf9, 0xe4, 0xe0, 0x83, 0x24, 0xa2, 0x6d, 0xd5, 0xa4, 0x81, 0xa1, 0x10, 0xe9, 0x4b, 0x23, 0x79, 0xb3, 0xaa, 0x93, 0x8d,
0xfe, 0x0e, 0xc5, 0xc5, 0x79, 0x01, 0xa9, 0xdd, 0xe8, 0x99, 0x79, 0xa5, 0xfa, 0xf9, 0x27, 0x75, 0xe4, 0xcd, 0xea, 0x96, 0xf6, 0x4f, 0xb0, 0x21, 0x3b, 0x3f, 0xf4, 0x4a, 0x61, 0x8e, 0x76, 0xa9,
0x24, 0x79, 0x1d, 0x32, 0xf3, 0xee, 0x8d, 0xd4, 0xfd, 0x2c, 0x0c, 0x21, 0xd5, 0xd7, 0x2b, 0x31, 0x11, 0x8f, 0xc5, 0x1a, 0xc5, 0x79, 0xe6, 0x49, 0x93, 0xf6, 0x9e, 0xe9, 0xc4, 0x56, 0x67, 0x5e,
0x49, 0xd2, 0x81, 0xbc, 0xda, 0x10, 0x90, 0x9a, 0xb2, 0x15, 0x1d, 0xa6, 0xba, 0xff, 0x2c, 0x2e, 0xcc, 0x98, 0xbf, 0x42, 0x31, 0xde, 0xde, 0x20, 0xb5, 0x78, 0x3e, 0xd3, 0x5e, 0x55, 0x3f, 0xff,
0x08, 0xcf, 0x7e, 0xff, 0xb7, 0xa3, 0x7b, 0x9b, 0x3e, 0x8c, 0xfb, 0xb5, 0x81, 0x3b, 0x3a, 0x1a, 0x59, 0x1e, 0xa9, 0xbc, 0x0e, 0x99, 0x79, 0xb3, 0x81, 0xd4, 0xf3, 0xc4, 0x7a, 0xa6, 0xea, 0xeb,
0xb2, 0x77, 0x86, 0x63, 0x3b, 0xf7, 0x0e, 0xa1, 0x13, 0xd7, 0x7f, 0x3c, 0x1a, 0x3a, 0xd6, 0x11, 0x95, 0x98, 0x54, 0xd2, 0x81, 0xbc, 0x5a, 0xbf, 0x90, 0x1a, 0xb2, 0x15, 0x05, 0xb1, 0xba, 0xff,
0xef, 0x7a, 0x47, 0x21, 0x4f, 0x3f, 0xcd, 0xff, 0x5f, 0xf3, 0xee, 0xbf, 0x01, 0x00, 0x00, 0xff, 0x2c, 0x2e, 0x14, 0x9e, 0xfd, 0xf6, 0x2f, 0x47, 0xf7, 0x36, 0x7d, 0x18, 0xf7, 0x6b, 0x03, 0x77,
0xff, 0x32, 0x3b, 0xa2, 0xdf, 0xf8, 0x11, 0x00, 0x00, 0x74, 0x34, 0x64, 0x63, 0x91, 0x63, 0x3b, 0xf7, 0x0e, 0xa1, 0x13, 0xd7, 0x7f, 0x3c, 0x1a, 0x3a,
0xd6, 0x11, 0x2f, 0xd2, 0x47, 0xa1, 0x9e, 0x7e, 0x9a, 0xff, 0xbd, 0xf4, 0xee, 0xdf, 0x01, 0x00,
0x00, 0xff, 0xff, 0xad, 0x1e, 0xe8, 0xf0, 0xa7, 0x12, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -1958,6 +2033,9 @@ type WalletKitClient interface {
//originally lock the output. //originally lock the output.
ReleaseOutput(ctx context.Context, in *ReleaseOutputRequest, opts ...grpc.CallOption) (*ReleaseOutputResponse, error) ReleaseOutput(ctx context.Context, in *ReleaseOutputRequest, opts ...grpc.CallOption) (*ReleaseOutputResponse, error)
// //
//ListLeases lists all currently locked utxos.
ListLeases(ctx context.Context, in *ListLeasesRequest, opts ...grpc.CallOption) (*ListLeasesResponse, error)
//
//DeriveNextKey attempts to derive the *next* key within the key family //DeriveNextKey attempts to derive the *next* key within the key family
//(account in BIP43) specified. This method should return the next external //(account in BIP43) specified. This method should return the next external
//child within this branch. //child within this branch.
@ -2103,6 +2181,15 @@ func (c *walletKitClient) ReleaseOutput(ctx context.Context, in *ReleaseOutputRe
return out, nil return out, nil
} }
func (c *walletKitClient) ListLeases(ctx context.Context, in *ListLeasesRequest, opts ...grpc.CallOption) (*ListLeasesResponse, error) {
out := new(ListLeasesResponse)
err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/ListLeases", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *walletKitClient) DeriveNextKey(ctx context.Context, in *KeyReq, opts ...grpc.CallOption) (*signrpc.KeyDescriptor, error) { func (c *walletKitClient) DeriveNextKey(ctx context.Context, in *KeyReq, opts ...grpc.CallOption) (*signrpc.KeyDescriptor, error) {
out := new(signrpc.KeyDescriptor) out := new(signrpc.KeyDescriptor)
err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/DeriveNextKey", in, out, opts...) err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/DeriveNextKey", in, out, opts...)
@ -2230,6 +2317,9 @@ type WalletKitServer interface {
//originally lock the output. //originally lock the output.
ReleaseOutput(context.Context, *ReleaseOutputRequest) (*ReleaseOutputResponse, error) ReleaseOutput(context.Context, *ReleaseOutputRequest) (*ReleaseOutputResponse, error)
// //
//ListLeases lists all currently locked utxos.
ListLeases(context.Context, *ListLeasesRequest) (*ListLeasesResponse, error)
//
//DeriveNextKey attempts to derive the *next* key within the key family //DeriveNextKey attempts to derive the *next* key within the key family
//(account in BIP43) specified. This method should return the next external //(account in BIP43) specified. This method should return the next external
//child within this branch. //child within this branch.
@ -2353,6 +2443,9 @@ func (*UnimplementedWalletKitServer) LeaseOutput(ctx context.Context, req *Lease
func (*UnimplementedWalletKitServer) ReleaseOutput(ctx context.Context, req *ReleaseOutputRequest) (*ReleaseOutputResponse, error) { func (*UnimplementedWalletKitServer) ReleaseOutput(ctx context.Context, req *ReleaseOutputRequest) (*ReleaseOutputResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ReleaseOutput not implemented") return nil, status.Errorf(codes.Unimplemented, "method ReleaseOutput not implemented")
} }
func (*UnimplementedWalletKitServer) ListLeases(ctx context.Context, req *ListLeasesRequest) (*ListLeasesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListLeases not implemented")
}
func (*UnimplementedWalletKitServer) DeriveNextKey(ctx context.Context, req *KeyReq) (*signrpc.KeyDescriptor, error) { func (*UnimplementedWalletKitServer) DeriveNextKey(ctx context.Context, req *KeyReq) (*signrpc.KeyDescriptor, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeriveNextKey not implemented") return nil, status.Errorf(codes.Unimplemented, "method DeriveNextKey not implemented")
} }
@ -2448,6 +2541,24 @@ func _WalletKit_ReleaseOutput_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _WalletKit_ListLeases_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListLeasesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WalletKitServer).ListLeases(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/walletrpc.WalletKit/ListLeases",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WalletKitServer).ListLeases(ctx, req.(*ListLeasesRequest))
}
return interceptor(ctx, in, info, handler)
}
func _WalletKit_DeriveNextKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _WalletKit_DeriveNextKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(KeyReq) in := new(KeyReq)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -2680,6 +2791,10 @@ var _WalletKit_serviceDesc = grpc.ServiceDesc{
MethodName: "ReleaseOutput", MethodName: "ReleaseOutput",
Handler: _WalletKit_ReleaseOutput_Handler, Handler: _WalletKit_ReleaseOutput_Handler,
}, },
{
MethodName: "ListLeases",
Handler: _WalletKit_ListLeases_Handler,
},
{ {
MethodName: "DeriveNextKey", MethodName: "DeriveNextKey",
Handler: _WalletKit_DeriveNextKey_Handler, Handler: _WalletKit_DeriveNextKey_Handler,

@ -133,6 +133,24 @@ func local_request_WalletKit_ReleaseOutput_0(ctx context.Context, marshaler runt
} }
func request_WalletKit_ListLeases_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListLeasesRequest
var metadata runtime.ServerMetadata
msg, err := client.ListLeases(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_WalletKit_ListLeases_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListLeasesRequest
var metadata runtime.ServerMetadata
msg, err := server.ListLeases(ctx, &protoReq)
return msg, metadata, err
}
func request_WalletKit_DeriveNextKey_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_WalletKit_DeriveNextKey_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq KeyReq var protoReq KeyReq
var metadata runtime.ServerMetadata var metadata runtime.ServerMetadata
@ -609,6 +627,26 @@ func RegisterWalletKitHandlerServer(ctx context.Context, mux *runtime.ServeMux,
}) })
mux.Handle("POST", pattern_WalletKit_ListLeases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_WalletKit_ListLeases_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WalletKit_ListLeases_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("POST", pattern_WalletKit_DeriveNextKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { mux.Handle("POST", pattern_WalletKit_DeriveNextKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context()) ctx, cancel := context.WithCancel(req.Context())
defer cancel() defer cancel()
@ -950,6 +988,26 @@ func RegisterWalletKitHandlerClient(ctx context.Context, mux *runtime.ServeMux,
}) })
mux.Handle("POST", pattern_WalletKit_ListLeases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_WalletKit_ListLeases_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WalletKit_ListLeases_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("POST", pattern_WalletKit_DeriveNextKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { mux.Handle("POST", pattern_WalletKit_DeriveNextKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context()) ctx, cancel := context.WithCancel(req.Context())
defer cancel() defer cancel()
@ -1200,6 +1258,8 @@ var (
pattern_WalletKit_ReleaseOutput_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "utxos", "release"}, "", runtime.AssumeColonVerbOpt(true))) pattern_WalletKit_ReleaseOutput_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "utxos", "release"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_WalletKit_ListLeases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "utxos", "leases"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_WalletKit_DeriveNextKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "key", "next"}, "", runtime.AssumeColonVerbOpt(true))) pattern_WalletKit_DeriveNextKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "key", "next"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_WalletKit_DeriveKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "key"}, "", runtime.AssumeColonVerbOpt(true))) pattern_WalletKit_DeriveKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "key"}, "", runtime.AssumeColonVerbOpt(true)))
@ -1232,6 +1292,8 @@ var (
forward_WalletKit_ReleaseOutput_0 = runtime.ForwardResponseMessage forward_WalletKit_ReleaseOutput_0 = runtime.ForwardResponseMessage
forward_WalletKit_ListLeases_0 = runtime.ForwardResponseMessage
forward_WalletKit_DeriveNextKey_0 = runtime.ForwardResponseMessage forward_WalletKit_DeriveNextKey_0 = runtime.ForwardResponseMessage
forward_WalletKit_DeriveKey_0 = runtime.ForwardResponseMessage forward_WalletKit_DeriveKey_0 = runtime.ForwardResponseMessage

@ -32,6 +32,11 @@ service WalletKit {
*/ */
rpc ReleaseOutput (ReleaseOutputRequest) returns (ReleaseOutputResponse); rpc ReleaseOutput (ReleaseOutputRequest) returns (ReleaseOutputResponse);
/*
ListLeases lists all currently locked utxos.
*/
rpc ListLeases (ListLeasesRequest) returns (ListLeasesResponse);
/* /*
DeriveNextKey attempts to derive the *next* key within the key family DeriveNextKey attempts to derive the *next* key within the key family
(account in BIP43) specified. This method should return the next external (account in BIP43) specified. This method should return the next external
@ -603,3 +608,11 @@ message FinalizePsbtResponse {
// The fully signed and finalized transaction in the raw wire format. // The fully signed and finalized transaction in the raw wire format.
bytes raw_final_tx = 2; bytes raw_final_tx = 2;
} }
message ListLeasesRequest {
}
message ListLeasesResponse {
// The list of currently leased utxos.
repeated UtxoLease locked_utxos = 1;
}

@ -457,6 +457,29 @@
] ]
} }
}, },
"/v2/wallet/utxos/leases": {
"post": {
"summary": "ListLeases lists all currently locked utxos.",
"operationId": "ListLeases",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/walletrpcListLeasesResponse"
}
},
"default": {
"description": "An unexpected error response",
"schema": {
"$ref": "#/definitions/runtimeError"
}
}
},
"tags": [
"WalletKit"
]
}
},
"/v2/wallet/utxos/release": { "/v2/wallet/utxos/release": {
"post": { "post": {
"summary": "ReleaseOutput unlocks an output, allowing it to be available for coin\nselection if it remains unspent. The ID should match the one used to\noriginally lock the output.", "summary": "ReleaseOutput unlocks an output, allowing it to be available for coin\nselection if it remains unspent. The ID should match the one used to\noriginally lock the output.",
@ -894,6 +917,18 @@
} }
} }
}, },
"walletrpcListLeasesResponse": {
"type": "object",
"properties": {
"locked_utxos": {
"type": "array",
"items": {
"$ref": "#/definitions/walletrpcUtxoLease"
},
"description": "The list of currently leased utxos."
}
}
},
"walletrpcListSweepsResponse": { "walletrpcListSweepsResponse": {
"type": "object", "type": "object",
"properties": { "properties": {

@ -112,6 +112,10 @@ var (
Entity: "onchain", Entity: "onchain",
Action: "write", Action: "write",
}}, }},
"/walletrpc.WalletKit/ListLeases": {{
Entity: "onchain",
Action: "read",
}},
"/walletrpc.WalletKit/ListUnspent": {{ "/walletrpc.WalletKit/ListUnspent": {{
Entity: "onchain", Entity: "onchain",
Action: "read", Action: "read",
@ -421,6 +425,20 @@ func (w *WalletKit) ReleaseOutput(ctx context.Context,
return &ReleaseOutputResponse{}, nil return &ReleaseOutputResponse{}, nil
} }
// ListLeases returns a list of all currently locked utxos.
func (w *WalletKit) ListLeases(ctx context.Context,
req *ListLeasesRequest) (*ListLeasesResponse, error) {
leases, err := w.cfg.Wallet.ListLeasedOutputs()
if err != nil {
return nil, err
}
return &ListLeasesResponse{
LockedUtxos: marshallLeases(leases),
}, nil
}
// DeriveNextKey attempts to derive the *next* key within the key family // DeriveNextKey attempts to derive the *next* key within the key family
// (account in BIP43) specified. This method should return the next external // (account in BIP43) specified. This method should return the next external
// child within this branch. // child within this branch.

@ -142,6 +142,10 @@ func (w *WalletController) ReleaseOutput(wtxmgr.LockID, wire.OutPoint) error {
return nil return nil
} }
func (w *WalletController) ListLeasedOutputs() ([]*wtxmgr.LockedOutput, error) {
return nil, nil
}
// FundPsbt currently does nothing. // FundPsbt currently does nothing.
func (w *WalletController) FundPsbt(_ *psbt.Packet, func (w *WalletController) FundPsbt(_ *psbt.Packet,
_ chainfee.SatPerKWeight) (int32, error) { _ chainfee.SatPerKWeight) (int32, error) {

@ -405,6 +405,11 @@ func (b *BtcWallet) LeaseOutput(id wtxmgr.LockID, op wire.OutPoint,
return b.wallet.LeaseOutput(id, op, duration) return b.wallet.LeaseOutput(id, op, duration)
} }
// ListLeasedOutputs returns a list of all currently locked outputs.
func (b *BtcWallet) ListLeasedOutputs() ([]*wtxmgr.LockedOutput, error) {
return b.wallet.ListLeasedOutputs()
}
// ReleaseOutput unlocks an output, allowing it to be available for coin // ReleaseOutput unlocks an output, allowing it to be available for coin
// selection if it remains unspent. The ID should match the one used to // selection if it remains unspent. The ID should match the one used to
// originally lock the output. // originally lock the output.

@ -260,6 +260,9 @@ type WalletController interface {
// NOTE: This method requires the global coin selection lock to be held. // NOTE: This method requires the global coin selection lock to be held.
ReleaseOutput(id wtxmgr.LockID, op wire.OutPoint) error ReleaseOutput(id wtxmgr.LockID, op wire.OutPoint) error
// ListLeasedOutputs returns a list of all currently locked outputs.
ListLeasedOutputs() ([]*wtxmgr.LockedOutput, error)
// PublishTransaction performs cursory validation (dust checks, etc), // PublishTransaction performs cursory validation (dust checks, etc),
// then finally broadcasts the passed transaction to the Bitcoin network. // then finally broadcasts the passed transaction to the Bitcoin network.
// If the transaction is rejected because it is conflicting with an // If the transaction is rejected because it is conflicting with an