Merge pull request #4303 from wpaulino/persistent-output-leases

walletrpc: add basic coin selection RPCs
This commit is contained in:
Conner Fromknecht 2020-06-03 21:39:15 -07:00 committed by GitHub
commit 7f258d0213
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 925 additions and 195 deletions

8
go.mod

@ -9,11 +9,11 @@ require (
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f
github.com/btcsuite/btcutil v1.0.2 github.com/btcsuite/btcutil v1.0.2
github.com/btcsuite/btcutil/psbt v1.0.2 github.com/btcsuite/btcutil/psbt v1.0.2
github.com/btcsuite/btcwallet v0.11.1-0.20200515224913-e0e62245ecbe github.com/btcsuite/btcwallet v0.11.1-0.20200604005347-6390f167e5f8
github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0 github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0
github.com/btcsuite/btcwallet/wallet/txrules v1.0.0 github.com/btcsuite/btcwallet/wallet/txrules v1.0.0
github.com/btcsuite/btcwallet/walletdb v1.3.1 github.com/btcsuite/btcwallet/walletdb v1.3.1
github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200515224913-e0e62245ecbe github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200604005347-6390f167e5f8
github.com/coreos/etcd v3.3.22+incompatible github.com/coreos/etcd v3.3.22+incompatible
github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect
@ -49,7 +49,7 @@ require (
github.com/lightninglabs/protobuf-hex-display v1.3.3-0.20191212020323-b444784ce75d github.com/lightninglabs/protobuf-hex-display v1.3.3-0.20191212020323-b444784ce75d
github.com/lightningnetwork/lightning-onion v1.0.2-0.20200501022730-3c8c8d0b89ea github.com/lightningnetwork/lightning-onion v1.0.2-0.20200501022730-3c8c8d0b89ea
github.com/lightningnetwork/lnd/cert v1.0.2 github.com/lightningnetwork/lnd/cert v1.0.2
github.com/lightningnetwork/lnd/clock v1.0.0 github.com/lightningnetwork/lnd/clock v1.0.1
github.com/lightningnetwork/lnd/queue v1.0.4 github.com/lightningnetwork/lnd/queue v1.0.4
github.com/lightningnetwork/lnd/ticker v1.0.0 github.com/lightningnetwork/lnd/ticker v1.0.0
github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796
@ -59,7 +59,7 @@ require (
github.com/prometheus/client_golang v0.9.3 github.com/prometheus/client_golang v0.9.3
github.com/rogpeppe/fastuuid v1.2.0 // indirect github.com/rogpeppe/fastuuid v1.2.0 // indirect
github.com/soheilhy/cmux v0.1.4 // indirect github.com/soheilhy/cmux v0.1.4 // indirect
github.com/stretchr/testify v1.4.0 github.com/stretchr/testify v1.5.1
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
github.com/tv42/zbase32 v0.0.0-20160707012821-501572607d02 github.com/tv42/zbase32 v0.0.0-20160707012821-501572607d02
github.com/urfave/cli v1.18.0 github.com/urfave/cli v1.18.0

11
go.sum

@ -36,8 +36,8 @@ github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2ut
github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts=
github.com/btcsuite/btcutil/psbt v1.0.2 h1:gCVY3KxdoEVU7Q6TjusPO+GANIwVgr9yTLqM+a6CZr8= github.com/btcsuite/btcutil/psbt v1.0.2 h1:gCVY3KxdoEVU7Q6TjusPO+GANIwVgr9yTLqM+a6CZr8=
github.com/btcsuite/btcutil/psbt v1.0.2/go.mod h1:LVveMu4VaNSkIRTZu2+ut0HDBRuYjqGocxDMNS1KuGQ= github.com/btcsuite/btcutil/psbt v1.0.2/go.mod h1:LVveMu4VaNSkIRTZu2+ut0HDBRuYjqGocxDMNS1KuGQ=
github.com/btcsuite/btcwallet v0.11.1-0.20200515224913-e0e62245ecbe h1:0m9uXDcnUc3Fv72635O/MfLbhbW+0hfSVgRiWezpkHU= github.com/btcsuite/btcwallet v0.11.1-0.20200604005347-6390f167e5f8 h1:wyooGuOeqcpJDK9+KgO5/yfb3nmEhakbdKHERhEylNE=
github.com/btcsuite/btcwallet v0.11.1-0.20200515224913-e0e62245ecbe/go.mod h1:9+AH3V5mcTtNXTKe+fe63fDLKGOwQbZqmvOVUef+JFE= github.com/btcsuite/btcwallet v0.11.1-0.20200604005347-6390f167e5f8/go.mod h1:9+AH3V5mcTtNXTKe+fe63fDLKGOwQbZqmvOVUef+JFE=
github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0 h1:KGHMW5sd7yDdDMkCZ/JpP0KltolFsQcB973brBnfj4c= github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0 h1:KGHMW5sd7yDdDMkCZ/JpP0KltolFsQcB973brBnfj4c=
github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU=
github.com/btcsuite/btcwallet/wallet/txrules v1.0.0 h1:2VsfS0sBedcM5KmDzRMT3+b6xobqWveZGvjb+jFez5w= github.com/btcsuite/btcwallet/wallet/txrules v1.0.0 h1:2VsfS0sBedcM5KmDzRMT3+b6xobqWveZGvjb+jFez5w=
@ -48,10 +48,9 @@ github.com/btcsuite/btcwallet/walletdb v1.0.0/go.mod h1:bZTy9RyYZh9fLnSua+/CD48T
github.com/btcsuite/btcwallet/walletdb v1.2.0/go.mod h1:9cwc1Yyg4uvd4ZdfdoMnALji+V9gfWSMfxEdLdR5Vwc= github.com/btcsuite/btcwallet/walletdb v1.2.0/go.mod h1:9cwc1Yyg4uvd4ZdfdoMnALji+V9gfWSMfxEdLdR5Vwc=
github.com/btcsuite/btcwallet/walletdb v1.3.1 h1:lW1Ac3F1jJY4K11P+YQtRNcP5jFk27ASfrV7C6mvRU0= github.com/btcsuite/btcwallet/walletdb v1.3.1 h1:lW1Ac3F1jJY4K11P+YQtRNcP5jFk27ASfrV7C6mvRU0=
github.com/btcsuite/btcwallet/walletdb v1.3.1/go.mod h1:9cwc1Yyg4uvd4ZdfdoMnALji+V9gfWSMfxEdLdR5Vwc= github.com/btcsuite/btcwallet/walletdb v1.3.1/go.mod h1:9cwc1Yyg4uvd4ZdfdoMnALji+V9gfWSMfxEdLdR5Vwc=
github.com/btcsuite/btcwallet/wtxmgr v1.0.0 h1:aIHgViEmZmZfe0tQQqF1xyd2qBqFWxX5vZXkkbjtbeA=
github.com/btcsuite/btcwallet/wtxmgr v1.0.0/go.mod h1:vc4gBprll6BP0UJ+AIGDaySoc7MdAmZf8kelfNb8CFY= github.com/btcsuite/btcwallet/wtxmgr v1.0.0/go.mod h1:vc4gBprll6BP0UJ+AIGDaySoc7MdAmZf8kelfNb8CFY=
github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200515224913-e0e62245ecbe h1:yQbJVYfsKbdqDQNLxd4hhiLSiMkIygefW5mSHMsdKpc= github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200604005347-6390f167e5f8 h1:tfeGHvGrm5nYE92eaO8PChBvMinpcq566dG1xPO08GI=
github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200515224913-e0e62245ecbe/go.mod h1:OwC0W0HhUszbWdvJvH6xvgabKSJ0lXl11YbmmqF9YXQ= github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200604005347-6390f167e5f8/go.mod h1:cJGqxXtqQbmXuL7RlXjIM18x0bGHy1407/85mQCLca4=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274= github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274=
@ -246,6 +245,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=

@ -1,9 +1,14 @@
package lnrpc package lnrpc
import ( import (
"encoding/hex"
"errors" "errors"
fmt "fmt"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
) )
@ -54,3 +59,88 @@ func UnmarshallAmt(amtSat, amtMsat int64) (lnwire.MilliSatoshi, error) {
return lnwire.MilliSatoshi(amtMsat), nil return lnwire.MilliSatoshi(amtMsat), nil
} }
// ParseConfs validates the minimum and maximum confirmation arguments of a
// ListUnspent request.
func ParseConfs(min, max int32) (int32, int32, error) {
switch {
// Ensure that the user didn't attempt to specify a negative number of
// confirmations, as that isn't possible.
case min < 0:
return 0, 0, fmt.Errorf("min confirmations must be >= 0")
// We'll also ensure that the min number of confs is strictly less than
// or equal to the max number of confs for sanity.
case min > max:
return 0, 0, fmt.Errorf("max confirmations must be >= min " +
"confirmations")
default:
return min, max, nil
}
}
// MarshalUtxos translates a []*lnwallet.Utxo into a []*lnrpc.Utxo.
func MarshalUtxos(utxos []*lnwallet.Utxo, activeNetParams *chaincfg.Params) (
[]*Utxo, error) {
res := make([]*Utxo, 0, len(utxos))
for _, utxo := range utxos {
// Translate lnwallet address type to the proper gRPC proto
// address type.
var addrType AddressType
switch utxo.AddressType {
case lnwallet.WitnessPubKey:
addrType = AddressType_WITNESS_PUBKEY_HASH
case lnwallet.NestedWitnessPubKey:
addrType = AddressType_NESTED_PUBKEY_HASH
case lnwallet.UnknownAddressType:
continue
default:
return nil, fmt.Errorf("invalid utxo address type")
}
// Now that we know we have a proper mapping to an address,
// we'll convert the regular outpoint to an lnrpc variant.
outpoint := &OutPoint{
TxidBytes: utxo.OutPoint.Hash[:],
TxidStr: utxo.OutPoint.Hash.String(),
OutputIndex: utxo.OutPoint.Index,
}
utxoResp := Utxo{
AddressType: addrType,
AmountSat: int64(utxo.Value),
PkScript: hex.EncodeToString(utxo.PkScript),
Outpoint: outpoint,
Confirmations: utxo.Confirmations,
}
// Finally, we'll attempt to extract the raw address from the
// script so we can display a human friendly address to the end
// user.
_, outAddresses, _, err := txscript.ExtractPkScriptAddrs(
utxo.PkScript, activeNetParams,
)
if err != nil {
return nil, err
}
// If we can't properly locate a single address, then this was
// an error in our mapping, and we'll return an error back to
// the user.
if len(outAddresses) != 1 {
return nil, fmt.Errorf("an output was unexpectedly " +
"multisig")
}
utxoResp.Address = outAddresses[0].String()
res = append(res, &utxoResp)
}
return res, nil
}

@ -12407,6 +12407,8 @@ type LightningClient interface {
//target. //target.
SendCoins(ctx context.Context, in *SendCoinsRequest, opts ...grpc.CallOption) (*SendCoinsResponse, error) SendCoins(ctx context.Context, in *SendCoinsRequest, opts ...grpc.CallOption) (*SendCoinsResponse, error)
// lncli: `listunspent` // lncli: `listunspent`
//Deprecated, use walletrpc.ListUnspent instead.
//
//ListUnspent returns a list of all utxos spendable by the wallet with a //ListUnspent returns a list of all utxos spendable by the wallet with a
//number of confirmations between the specified minimum and maximum. //number of confirmations between the specified minimum and maximum.
ListUnspent(ctx context.Context, in *ListUnspentRequest, opts ...grpc.CallOption) (*ListUnspentResponse, error) ListUnspent(ctx context.Context, in *ListUnspentRequest, opts ...grpc.CallOption) (*ListUnspentResponse, error)
@ -13486,6 +13488,8 @@ type LightningServer interface {
//target. //target.
SendCoins(context.Context, *SendCoinsRequest) (*SendCoinsResponse, error) SendCoins(context.Context, *SendCoinsRequest) (*SendCoinsResponse, error)
// lncli: `listunspent` // lncli: `listunspent`
//Deprecated, use walletrpc.ListUnspent instead.
//
//ListUnspent returns a list of all utxos spendable by the wallet with a //ListUnspent returns a list of all utxos spendable by the wallet with a
//number of confirmations between the specified minimum and maximum. //number of confirmations between the specified minimum and maximum.
ListUnspent(context.Context, *ListUnspentRequest) (*ListUnspentResponse, error) ListUnspent(context.Context, *ListUnspentRequest) (*ListUnspentResponse, error)

@ -83,8 +83,10 @@ service Lightning {
} }
/* lncli: `listunspent` /* lncli: `listunspent`
Deprecated, use walletrpc.ListUnspent instead.
ListUnspent returns a list of all utxos spendable by the wallet with a ListUnspent returns a list of all utxos spendable by the wallet with a
number of confirmations between the specified minimum and maximum. number of confirmations between the specified minimum and maximum.
*/ */
rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse) { rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse) {
option (google.api.http) = { option (google.api.http) = {

@ -1363,7 +1363,8 @@
}, },
"/v1/utxos": { "/v1/utxos": {
"get": { "get": {
"summary": "lncli: `listunspent`\nListUnspent returns a list of all utxos spendable by the wallet with a\nnumber of confirmations between the specified minimum and maximum.", "summary": "lncli: `listunspent`\nDeprecated, use walletrpc.ListUnspent instead.",
"description": "ListUnspent returns a list of all utxos spendable by the wallet with a\nnumber of confirmations between the specified minimum and maximum.",
"operationId": "ListUnspent", "operationId": "ListUnspent",
"responses": { "responses": {
"200": { "200": {

@ -3,6 +3,7 @@
package walletrpc package walletrpc
import ( import (
"github.com/btcsuite/btcd/chaincfg"
"github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/keychain"
"github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
@ -48,4 +49,7 @@ type Config struct {
// Chain is an interface that the WalletKit will use to determine state // Chain is an interface that the WalletKit will use to determine state
// about the backing chain of the wallet. // about the backing chain of the wallet.
Chain lnwallet.BlockChainIO Chain lnwallet.BlockChainIO
// ChainParams are the parameters of the wallet's backing chain.
ChainParams *chaincfg.Params
} }

@ -132,6 +132,267 @@ func (WitnessType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{0} return fileDescriptor_6cc6942ac78249e5, []int{0}
} }
type ListUnspentRequest struct {
// The minimum number of confirmations to be included.
MinConfs int32 `protobuf:"varint,1,opt,name=min_confs,json=minConfs,proto3" json:"min_confs,omitempty"`
// The maximum number of confirmations to be included.
MaxConfs int32 `protobuf:"varint,2,opt,name=max_confs,json=maxConfs,proto3" json:"max_confs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListUnspentRequest) Reset() { *m = ListUnspentRequest{} }
func (m *ListUnspentRequest) String() string { return proto.CompactTextString(m) }
func (*ListUnspentRequest) ProtoMessage() {}
func (*ListUnspentRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{0}
}
func (m *ListUnspentRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListUnspentRequest.Unmarshal(m, b)
}
func (m *ListUnspentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListUnspentRequest.Marshal(b, m, deterministic)
}
func (m *ListUnspentRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListUnspentRequest.Merge(m, src)
}
func (m *ListUnspentRequest) XXX_Size() int {
return xxx_messageInfo_ListUnspentRequest.Size(m)
}
func (m *ListUnspentRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ListUnspentRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ListUnspentRequest proto.InternalMessageInfo
func (m *ListUnspentRequest) GetMinConfs() int32 {
if m != nil {
return m.MinConfs
}
return 0
}
func (m *ListUnspentRequest) GetMaxConfs() int32 {
if m != nil {
return m.MaxConfs
}
return 0
}
type ListUnspentResponse struct {
// A list of utxos satisfying the specified number of confirmations.
Utxos []*lnrpc.Utxo `protobuf:"bytes,1,rep,name=utxos,proto3" json:"utxos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListUnspentResponse) Reset() { *m = ListUnspentResponse{} }
func (m *ListUnspentResponse) String() string { return proto.CompactTextString(m) }
func (*ListUnspentResponse) ProtoMessage() {}
func (*ListUnspentResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{1}
}
func (m *ListUnspentResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListUnspentResponse.Unmarshal(m, b)
}
func (m *ListUnspentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListUnspentResponse.Marshal(b, m, deterministic)
}
func (m *ListUnspentResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListUnspentResponse.Merge(m, src)
}
func (m *ListUnspentResponse) XXX_Size() int {
return xxx_messageInfo_ListUnspentResponse.Size(m)
}
func (m *ListUnspentResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ListUnspentResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ListUnspentResponse proto.InternalMessageInfo
func (m *ListUnspentResponse) GetUtxos() []*lnrpc.Utxo {
if m != nil {
return m.Utxos
}
return nil
}
type LeaseOutputRequest struct {
//
//An ID of 32 random bytes that must be unique for each distinct application
//using this RPC which will be used to bound the output lease to.
Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
// The identifying outpoint of the output being leased.
Outpoint *lnrpc.OutPoint `protobuf:"bytes,2,opt,name=outpoint,proto3" json:"outpoint,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *LeaseOutputRequest) Reset() { *m = LeaseOutputRequest{} }
func (m *LeaseOutputRequest) String() string { return proto.CompactTextString(m) }
func (*LeaseOutputRequest) ProtoMessage() {}
func (*LeaseOutputRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{2}
}
func (m *LeaseOutputRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LeaseOutputRequest.Unmarshal(m, b)
}
func (m *LeaseOutputRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_LeaseOutputRequest.Marshal(b, m, deterministic)
}
func (m *LeaseOutputRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_LeaseOutputRequest.Merge(m, src)
}
func (m *LeaseOutputRequest) XXX_Size() int {
return xxx_messageInfo_LeaseOutputRequest.Size(m)
}
func (m *LeaseOutputRequest) XXX_DiscardUnknown() {
xxx_messageInfo_LeaseOutputRequest.DiscardUnknown(m)
}
var xxx_messageInfo_LeaseOutputRequest proto.InternalMessageInfo
func (m *LeaseOutputRequest) GetId() []byte {
if m != nil {
return m.Id
}
return nil
}
func (m *LeaseOutputRequest) GetOutpoint() *lnrpc.OutPoint {
if m != nil {
return m.Outpoint
}
return nil
}
type LeaseOutputResponse struct {
//
//The absolute expiration of the output lease represented as a unix timestamp.
Expiration uint64 `protobuf:"varint,1,opt,name=expiration,proto3" json:"expiration,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *LeaseOutputResponse) Reset() { *m = LeaseOutputResponse{} }
func (m *LeaseOutputResponse) String() string { return proto.CompactTextString(m) }
func (*LeaseOutputResponse) ProtoMessage() {}
func (*LeaseOutputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{3}
}
func (m *LeaseOutputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LeaseOutputResponse.Unmarshal(m, b)
}
func (m *LeaseOutputResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_LeaseOutputResponse.Marshal(b, m, deterministic)
}
func (m *LeaseOutputResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_LeaseOutputResponse.Merge(m, src)
}
func (m *LeaseOutputResponse) XXX_Size() int {
return xxx_messageInfo_LeaseOutputResponse.Size(m)
}
func (m *LeaseOutputResponse) XXX_DiscardUnknown() {
xxx_messageInfo_LeaseOutputResponse.DiscardUnknown(m)
}
var xxx_messageInfo_LeaseOutputResponse proto.InternalMessageInfo
func (m *LeaseOutputResponse) GetExpiration() uint64 {
if m != nil {
return m.Expiration
}
return 0
}
type ReleaseOutputRequest struct {
// The unique ID that was used to lock the output.
Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
// The identifying outpoint of the output being released.
Outpoint *lnrpc.OutPoint `protobuf:"bytes,2,opt,name=outpoint,proto3" json:"outpoint,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReleaseOutputRequest) Reset() { *m = ReleaseOutputRequest{} }
func (m *ReleaseOutputRequest) String() string { return proto.CompactTextString(m) }
func (*ReleaseOutputRequest) ProtoMessage() {}
func (*ReleaseOutputRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{4}
}
func (m *ReleaseOutputRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReleaseOutputRequest.Unmarshal(m, b)
}
func (m *ReleaseOutputRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReleaseOutputRequest.Marshal(b, m, deterministic)
}
func (m *ReleaseOutputRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReleaseOutputRequest.Merge(m, src)
}
func (m *ReleaseOutputRequest) XXX_Size() int {
return xxx_messageInfo_ReleaseOutputRequest.Size(m)
}
func (m *ReleaseOutputRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ReleaseOutputRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ReleaseOutputRequest proto.InternalMessageInfo
func (m *ReleaseOutputRequest) GetId() []byte {
if m != nil {
return m.Id
}
return nil
}
func (m *ReleaseOutputRequest) GetOutpoint() *lnrpc.OutPoint {
if m != nil {
return m.Outpoint
}
return nil
}
type ReleaseOutputResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReleaseOutputResponse) Reset() { *m = ReleaseOutputResponse{} }
func (m *ReleaseOutputResponse) String() string { return proto.CompactTextString(m) }
func (*ReleaseOutputResponse) ProtoMessage() {}
func (*ReleaseOutputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{5}
}
func (m *ReleaseOutputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReleaseOutputResponse.Unmarshal(m, b)
}
func (m *ReleaseOutputResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReleaseOutputResponse.Marshal(b, m, deterministic)
}
func (m *ReleaseOutputResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReleaseOutputResponse.Merge(m, src)
}
func (m *ReleaseOutputResponse) XXX_Size() int {
return xxx_messageInfo_ReleaseOutputResponse.Size(m)
}
func (m *ReleaseOutputResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ReleaseOutputResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ReleaseOutputResponse proto.InternalMessageInfo
type KeyReq struct { type KeyReq struct {
// //
//Is the key finger print of the root pubkey that this request is targeting. //Is the key finger print of the root pubkey that this request is targeting.
@ -151,7 +412,7 @@ func (m *KeyReq) Reset() { *m = KeyReq{} }
func (m *KeyReq) String() string { return proto.CompactTextString(m) } func (m *KeyReq) String() string { return proto.CompactTextString(m) }
func (*KeyReq) ProtoMessage() {} func (*KeyReq) ProtoMessage() {}
func (*KeyReq) Descriptor() ([]byte, []int) { func (*KeyReq) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{0} return fileDescriptor_6cc6942ac78249e5, []int{6}
} }
func (m *KeyReq) XXX_Unmarshal(b []byte) error { func (m *KeyReq) XXX_Unmarshal(b []byte) error {
@ -196,7 +457,7 @@ func (m *AddrRequest) Reset() { *m = AddrRequest{} }
func (m *AddrRequest) String() string { return proto.CompactTextString(m) } func (m *AddrRequest) String() string { return proto.CompactTextString(m) }
func (*AddrRequest) ProtoMessage() {} func (*AddrRequest) ProtoMessage() {}
func (*AddrRequest) Descriptor() ([]byte, []int) { func (*AddrRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{1} return fileDescriptor_6cc6942ac78249e5, []int{7}
} }
func (m *AddrRequest) XXX_Unmarshal(b []byte) error { func (m *AddrRequest) XXX_Unmarshal(b []byte) error {
@ -230,7 +491,7 @@ func (m *AddrResponse) Reset() { *m = AddrResponse{} }
func (m *AddrResponse) String() string { return proto.CompactTextString(m) } func (m *AddrResponse) String() string { return proto.CompactTextString(m) }
func (*AddrResponse) ProtoMessage() {} func (*AddrResponse) ProtoMessage() {}
func (*AddrResponse) Descriptor() ([]byte, []int) { func (*AddrResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{2} return fileDescriptor_6cc6942ac78249e5, []int{8}
} }
func (m *AddrResponse) XXX_Unmarshal(b []byte) error { func (m *AddrResponse) XXX_Unmarshal(b []byte) error {
@ -274,7 +535,7 @@ func (m *Transaction) Reset() { *m = Transaction{} }
func (m *Transaction) String() string { return proto.CompactTextString(m) } func (m *Transaction) String() string { return proto.CompactTextString(m) }
func (*Transaction) ProtoMessage() {} func (*Transaction) ProtoMessage() {}
func (*Transaction) Descriptor() ([]byte, []int) { func (*Transaction) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{3} return fileDescriptor_6cc6942ac78249e5, []int{9}
} }
func (m *Transaction) XXX_Unmarshal(b []byte) error { func (m *Transaction) XXX_Unmarshal(b []byte) error {
@ -326,7 +587,7 @@ func (m *PublishResponse) Reset() { *m = PublishResponse{} }
func (m *PublishResponse) String() string { return proto.CompactTextString(m) } func (m *PublishResponse) String() string { return proto.CompactTextString(m) }
func (*PublishResponse) ProtoMessage() {} func (*PublishResponse) ProtoMessage() {}
func (*PublishResponse) Descriptor() ([]byte, []int) { func (*PublishResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{4} return fileDescriptor_6cc6942ac78249e5, []int{10}
} }
func (m *PublishResponse) XXX_Unmarshal(b []byte) error { func (m *PublishResponse) XXX_Unmarshal(b []byte) error {
@ -373,7 +634,7 @@ func (m *SendOutputsRequest) Reset() { *m = SendOutputsRequest{} }
func (m *SendOutputsRequest) String() string { return proto.CompactTextString(m) } func (m *SendOutputsRequest) String() string { return proto.CompactTextString(m) }
func (*SendOutputsRequest) ProtoMessage() {} func (*SendOutputsRequest) ProtoMessage() {}
func (*SendOutputsRequest) Descriptor() ([]byte, []int) { func (*SendOutputsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{5} return fileDescriptor_6cc6942ac78249e5, []int{11}
} }
func (m *SendOutputsRequest) XXX_Unmarshal(b []byte) error { func (m *SendOutputsRequest) XXX_Unmarshal(b []byte) error {
@ -428,7 +689,7 @@ func (m *SendOutputsResponse) Reset() { *m = SendOutputsResponse{} }
func (m *SendOutputsResponse) String() string { return proto.CompactTextString(m) } func (m *SendOutputsResponse) String() string { return proto.CompactTextString(m) }
func (*SendOutputsResponse) ProtoMessage() {} func (*SendOutputsResponse) ProtoMessage() {}
func (*SendOutputsResponse) Descriptor() ([]byte, []int) { func (*SendOutputsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{6} return fileDescriptor_6cc6942ac78249e5, []int{12}
} }
func (m *SendOutputsResponse) XXX_Unmarshal(b []byte) error { func (m *SendOutputsResponse) XXX_Unmarshal(b []byte) error {
@ -469,7 +730,7 @@ func (m *EstimateFeeRequest) Reset() { *m = EstimateFeeRequest{} }
func (m *EstimateFeeRequest) String() string { return proto.CompactTextString(m) } func (m *EstimateFeeRequest) String() string { return proto.CompactTextString(m) }
func (*EstimateFeeRequest) ProtoMessage() {} func (*EstimateFeeRequest) ProtoMessage() {}
func (*EstimateFeeRequest) Descriptor() ([]byte, []int) { func (*EstimateFeeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{7} return fileDescriptor_6cc6942ac78249e5, []int{13}
} }
func (m *EstimateFeeRequest) XXX_Unmarshal(b []byte) error { func (m *EstimateFeeRequest) XXX_Unmarshal(b []byte) error {
@ -511,7 +772,7 @@ func (m *EstimateFeeResponse) Reset() { *m = EstimateFeeResponse{} }
func (m *EstimateFeeResponse) String() string { return proto.CompactTextString(m) } func (m *EstimateFeeResponse) String() string { return proto.CompactTextString(m) }
func (*EstimateFeeResponse) ProtoMessage() {} func (*EstimateFeeResponse) ProtoMessage() {}
func (*EstimateFeeResponse) Descriptor() ([]byte, []int) { func (*EstimateFeeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{8} return fileDescriptor_6cc6942ac78249e5, []int{14}
} }
func (m *EstimateFeeResponse) XXX_Unmarshal(b []byte) error { func (m *EstimateFeeResponse) XXX_Unmarshal(b []byte) error {
@ -574,7 +835,7 @@ func (m *PendingSweep) Reset() { *m = PendingSweep{} }
func (m *PendingSweep) String() string { return proto.CompactTextString(m) } func (m *PendingSweep) String() string { return proto.CompactTextString(m) }
func (*PendingSweep) ProtoMessage() {} func (*PendingSweep) ProtoMessage() {}
func (*PendingSweep) Descriptor() ([]byte, []int) { func (*PendingSweep) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{9} return fileDescriptor_6cc6942ac78249e5, []int{15}
} }
func (m *PendingSweep) XXX_Unmarshal(b []byte) error { func (m *PendingSweep) XXX_Unmarshal(b []byte) error {
@ -668,7 +929,7 @@ func (m *PendingSweepsRequest) Reset() { *m = PendingSweepsRequest{} }
func (m *PendingSweepsRequest) String() string { return proto.CompactTextString(m) } func (m *PendingSweepsRequest) String() string { return proto.CompactTextString(m) }
func (*PendingSweepsRequest) ProtoMessage() {} func (*PendingSweepsRequest) ProtoMessage() {}
func (*PendingSweepsRequest) Descriptor() ([]byte, []int) { func (*PendingSweepsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{10} return fileDescriptor_6cc6942ac78249e5, []int{16}
} }
func (m *PendingSweepsRequest) XXX_Unmarshal(b []byte) error { func (m *PendingSweepsRequest) XXX_Unmarshal(b []byte) error {
@ -702,7 +963,7 @@ func (m *PendingSweepsResponse) Reset() { *m = PendingSweepsResponse{} }
func (m *PendingSweepsResponse) String() string { return proto.CompactTextString(m) } func (m *PendingSweepsResponse) String() string { return proto.CompactTextString(m) }
func (*PendingSweepsResponse) ProtoMessage() {} func (*PendingSweepsResponse) ProtoMessage() {}
func (*PendingSweepsResponse) Descriptor() ([]byte, []int) { func (*PendingSweepsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{11} return fileDescriptor_6cc6942ac78249e5, []int{17}
} }
func (m *PendingSweepsResponse) XXX_Unmarshal(b []byte) error { func (m *PendingSweepsResponse) XXX_Unmarshal(b []byte) error {
@ -752,7 +1013,7 @@ func (m *BumpFeeRequest) Reset() { *m = BumpFeeRequest{} }
func (m *BumpFeeRequest) String() string { return proto.CompactTextString(m) } func (m *BumpFeeRequest) String() string { return proto.CompactTextString(m) }
func (*BumpFeeRequest) ProtoMessage() {} func (*BumpFeeRequest) ProtoMessage() {}
func (*BumpFeeRequest) Descriptor() ([]byte, []int) { func (*BumpFeeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{12} return fileDescriptor_6cc6942ac78249e5, []int{18}
} }
func (m *BumpFeeRequest) XXX_Unmarshal(b []byte) error { func (m *BumpFeeRequest) XXX_Unmarshal(b []byte) error {
@ -811,7 +1072,7 @@ func (m *BumpFeeResponse) Reset() { *m = BumpFeeResponse{} }
func (m *BumpFeeResponse) String() string { return proto.CompactTextString(m) } func (m *BumpFeeResponse) String() string { return proto.CompactTextString(m) }
func (*BumpFeeResponse) ProtoMessage() {} func (*BumpFeeResponse) ProtoMessage() {}
func (*BumpFeeResponse) Descriptor() ([]byte, []int) { func (*BumpFeeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{13} return fileDescriptor_6cc6942ac78249e5, []int{19}
} }
func (m *BumpFeeResponse) XXX_Unmarshal(b []byte) error { func (m *BumpFeeResponse) XXX_Unmarshal(b []byte) error {
@ -846,7 +1107,7 @@ func (m *ListSweepsRequest) Reset() { *m = ListSweepsRequest{} }
func (m *ListSweepsRequest) String() string { return proto.CompactTextString(m) } func (m *ListSweepsRequest) String() string { return proto.CompactTextString(m) }
func (*ListSweepsRequest) ProtoMessage() {} func (*ListSweepsRequest) ProtoMessage() {}
func (*ListSweepsRequest) Descriptor() ([]byte, []int) { func (*ListSweepsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{14} return fileDescriptor_6cc6942ac78249e5, []int{20}
} }
func (m *ListSweepsRequest) XXX_Unmarshal(b []byte) error { func (m *ListSweepsRequest) XXX_Unmarshal(b []byte) error {
@ -888,7 +1149,7 @@ func (m *ListSweepsResponse) Reset() { *m = ListSweepsResponse{} }
func (m *ListSweepsResponse) String() string { return proto.CompactTextString(m) } func (m *ListSweepsResponse) String() string { return proto.CompactTextString(m) }
func (*ListSweepsResponse) ProtoMessage() {} func (*ListSweepsResponse) ProtoMessage() {}
func (*ListSweepsResponse) Descriptor() ([]byte, []int) { func (*ListSweepsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{15} return fileDescriptor_6cc6942ac78249e5, []int{21}
} }
func (m *ListSweepsResponse) XXX_Unmarshal(b []byte) error { func (m *ListSweepsResponse) XXX_Unmarshal(b []byte) error {
@ -969,7 +1230,7 @@ func (m *ListSweepsResponse_TransactionIDs) Reset() { *m = ListSweepsRes
func (m *ListSweepsResponse_TransactionIDs) String() string { return proto.CompactTextString(m) } func (m *ListSweepsResponse_TransactionIDs) String() string { return proto.CompactTextString(m) }
func (*ListSweepsResponse_TransactionIDs) ProtoMessage() {} func (*ListSweepsResponse_TransactionIDs) ProtoMessage() {}
func (*ListSweepsResponse_TransactionIDs) Descriptor() ([]byte, []int) { func (*ListSweepsResponse_TransactionIDs) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{15, 0} return fileDescriptor_6cc6942ac78249e5, []int{21, 0}
} }
func (m *ListSweepsResponse_TransactionIDs) XXX_Unmarshal(b []byte) error { func (m *ListSweepsResponse_TransactionIDs) XXX_Unmarshal(b []byte) error {
@ -1013,7 +1274,7 @@ func (m *LabelTransactionRequest) Reset() { *m = LabelTransactionRequest
func (m *LabelTransactionRequest) String() string { return proto.CompactTextString(m) } func (m *LabelTransactionRequest) String() string { return proto.CompactTextString(m) }
func (*LabelTransactionRequest) ProtoMessage() {} func (*LabelTransactionRequest) ProtoMessage() {}
func (*LabelTransactionRequest) Descriptor() ([]byte, []int) { func (*LabelTransactionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{16} return fileDescriptor_6cc6942ac78249e5, []int{22}
} }
func (m *LabelTransactionRequest) XXX_Unmarshal(b []byte) error { func (m *LabelTransactionRequest) XXX_Unmarshal(b []byte) error {
@ -1065,7 +1326,7 @@ func (m *LabelTransactionResponse) Reset() { *m = LabelTransactionRespon
func (m *LabelTransactionResponse) String() string { return proto.CompactTextString(m) } func (m *LabelTransactionResponse) String() string { return proto.CompactTextString(m) }
func (*LabelTransactionResponse) ProtoMessage() {} func (*LabelTransactionResponse) ProtoMessage() {}
func (*LabelTransactionResponse) Descriptor() ([]byte, []int) { func (*LabelTransactionResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_6cc6942ac78249e5, []int{17} return fileDescriptor_6cc6942ac78249e5, []int{23}
} }
func (m *LabelTransactionResponse) XXX_Unmarshal(b []byte) error { func (m *LabelTransactionResponse) XXX_Unmarshal(b []byte) error {
@ -1088,6 +1349,12 @@ var xxx_messageInfo_LabelTransactionResponse proto.InternalMessageInfo
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((*ListUnspentResponse)(nil), "walletrpc.ListUnspentResponse")
proto.RegisterType((*LeaseOutputRequest)(nil), "walletrpc.LeaseOutputRequest")
proto.RegisterType((*LeaseOutputResponse)(nil), "walletrpc.LeaseOutputResponse")
proto.RegisterType((*ReleaseOutputRequest)(nil), "walletrpc.ReleaseOutputRequest")
proto.RegisterType((*ReleaseOutputResponse)(nil), "walletrpc.ReleaseOutputResponse")
proto.RegisterType((*KeyReq)(nil), "walletrpc.KeyReq") proto.RegisterType((*KeyReq)(nil), "walletrpc.KeyReq")
proto.RegisterType((*AddrRequest)(nil), "walletrpc.AddrRequest") proto.RegisterType((*AddrRequest)(nil), "walletrpc.AddrRequest")
proto.RegisterType((*AddrResponse)(nil), "walletrpc.AddrResponse") proto.RegisterType((*AddrResponse)(nil), "walletrpc.AddrResponse")
@ -1112,86 +1379,97 @@ func init() {
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{
// 1255 bytes of a gzipped FileDescriptorProto // 1428 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x6d, 0x6f, 0xda, 0x56, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xff, 0x6f, 0xda, 0xc8,
0x14, 0x6e, 0x42, 0x20, 0x70, 0x78, 0x09, 0x39, 0xe4, 0x85, 0xd2, 0x74, 0xc9, 0x5c, 0x6d, 0x8b, 0x12, 0x6f, 0xbe, 0x40, 0x60, 0x0c, 0x84, 0x2c, 0x24, 0xa1, 0x34, 0x6d, 0x52, 0x57, 0xef, 0xbd,
0xb6, 0x96, 0x68, 0xa9, 0x36, 0xad, 0x9d, 0x34, 0x2d, 0x01, 0x47, 0x44, 0x10, 0x9c, 0xd9, 0x6e, 0xe8, 0xbd, 0x96, 0xe8, 0xa5, 0xea, 0xa9, 0xed, 0x49, 0xa7, 0x4b, 0xc0, 0x11, 0x11, 0x04, 0x52,
0xa3, 0x6e, 0x1f, 0x2c, 0x83, 0x6f, 0x89, 0x15, 0x62, 0xbb, 0xd7, 0x97, 0x02, 0xdf, 0xf6, 0x2b, 0x43, 0x1a, 0xf5, 0xee, 0x07, 0xcb, 0xe0, 0x2d, 0xb1, 0x02, 0xb6, 0xbb, 0x5e, 0x8a, 0xf9, 0xed,
0x26, 0xf5, 0xef, 0xed, 0x97, 0x4c, 0xbe, 0x7e, 0xe1, 0x1a, 0x9a, 0x4a, 0xfb, 0x84, 0xef, 0x39, 0xfe, 0x8a, 0x93, 0xfa, 0x6f, 0xdd, 0x5f, 0x74, 0xda, 0x5d, 0x63, 0xd6, 0x40, 0x7a, 0x3a, 0xe9,
0xcf, 0x79, 0xce, 0x2b, 0xe7, 0x5e, 0x78, 0x3c, 0x35, 0xc7, 0x63, 0xc2, 0xa8, 0x37, 0x3c, 0x09, 0x7e, 0x8a, 0x77, 0x3e, 0x33, 0x9f, 0x99, 0x9d, 0x99, 0xcc, 0x0e, 0xf0, 0x78, 0x62, 0x0e, 0x87,
0xbf, 0xee, 0x6c, 0xd6, 0xf4, 0xa8, 0xcb, 0x5c, 0x2c, 0x24, 0xaa, 0x46, 0x81, 0x7a, 0xc3, 0x50, 0x98, 0x12, 0xaf, 0x7f, 0x22, 0xbe, 0xee, 0x6d, 0x5a, 0xf1, 0x88, 0x4b, 0x5d, 0x94, 0x8e, 0xa0,
0xda, 0xd8, 0xf1, 0xed, 0x91, 0x13, 0xc0, 0x83, 0x5f, 0x42, 0x43, 0xa9, 0xf4, 0x07, 0xe4, 0xba, 0x72, 0x9a, 0x78, 0x7d, 0x21, 0x2d, 0x17, 0x7d, 0x7b, 0xe0, 0x30, 0x75, 0xf6, 0x17, 0x13, 0x21,
0x64, 0xae, 0x92, 0x0f, 0x78, 0x0c, 0xd5, 0x3b, 0x32, 0x37, 0xde, 0xdb, 0xce, 0x88, 0x50, 0xc3, 0x55, 0x5b, 0x80, 0x9a, 0xb6, 0x4f, 0x6f, 0x1c, 0xdf, 0xc3, 0x0e, 0xd5, 0xf1, 0x97, 0x31, 0xf6,
0xa3, 0xb6, 0xc3, 0xea, 0x6b, 0x47, 0x6b, 0xc7, 0x59, 0xb5, 0x72, 0x47, 0xe6, 0x17, 0x5c, 0x7c, 0x29, 0x7a, 0x02, 0xe9, 0x91, 0xed, 0x18, 0x7d, 0xd7, 0xf9, 0xec, 0x97, 0xd6, 0x8e, 0xd6, 0x8e,
0x1d, 0x48, 0xf1, 0x29, 0x00, 0x47, 0x9a, 0xf7, 0xf6, 0x78, 0x5e, 0x5f, 0xe7, 0x98, 0x42, 0x80, 0x13, 0x7a, 0x6a, 0x64, 0x3b, 0x55, 0x76, 0xe6, 0xa0, 0x19, 0x84, 0xe0, 0x7a, 0x08, 0x9a, 0x01,
0xe1, 0x02, 0xa9, 0x0c, 0xc5, 0x33, 0xcb, 0xa2, 0x2a, 0xf9, 0x30, 0x21, 0x3e, 0x93, 0x24, 0x28, 0x07, 0xd5, 0xb7, 0x50, 0x88, 0xf1, 0xf9, 0x9e, 0xeb, 0xf8, 0x18, 0x3d, 0x87, 0xc4, 0x98, 0x06,
0x85, 0x47, 0xdf, 0x73, 0x1d, 0x9f, 0x20, 0xc2, 0x86, 0x69, 0x59, 0x94, 0x73, 0x17, 0x54, 0xfe, 0x2e, 0x23, 0xdb, 0x38, 0x56, 0x4e, 0x95, 0xca, 0x90, 0x85, 0x52, 0xb9, 0xa1, 0x81, 0xab, 0x0b,
0x2d, 0xbd, 0x86, 0xa2, 0x4e, 0x4d, 0xc7, 0x37, 0x87, 0xcc, 0x76, 0x1d, 0xdc, 0x85, 0x1c, 0x9b, 0x44, 0xfd, 0x00, 0xa8, 0x89, 0x4d, 0x1f, 0xb7, 0xc7, 0xd4, 0x1b, 0x47, 0x91, 0xe4, 0x60, 0xdd,
0x19, 0xb7, 0x64, 0xc6, 0x41, 0x25, 0x35, 0xcb, 0x66, 0x1d, 0x32, 0xc3, 0x1d, 0xc8, 0x8e, 0xcd, 0xb6, 0x78, 0x08, 0x19, 0x7d, 0xdd, 0xb6, 0xd0, 0xff, 0x20, 0xe5, 0x8e, 0xa9, 0xe7, 0xda, 0x0e,
0x01, 0x19, 0x73, 0x97, 0x05, 0x35, 0x3c, 0x48, 0x3f, 0xc3, 0xd6, 0xf5, 0x64, 0x30, 0xb6, 0xfd, 0xe5, 0xbe, 0x95, 0xd3, 0xed, 0x90, 0xab, 0x3d, 0xa6, 0xd7, 0x4c, 0xac, 0x47, 0x0a, 0xea, 0x1b,
0xdb, 0xc4, 0xc5, 0x33, 0x28, 0x7b, 0xa1, 0xc8, 0x20, 0x94, 0xba, 0xb1, 0xaf, 0x52, 0x24, 0x94, 0x28, 0xc4, 0x28, 0xc3, 0x60, 0x9e, 0x01, 0xe0, 0xc0, 0xb3, 0x89, 0x49, 0x6d, 0xd7, 0xe1, 0xdc,
0x03, 0x99, 0x44, 0x01, 0x35, 0xe2, 0x58, 0xca, 0x84, 0x79, 0x13, 0xe6, 0x47, 0xd1, 0xe2, 0x01, 0x9b, 0xba, 0x24, 0x51, 0x3b, 0x50, 0xd4, 0xf1, 0xf0, 0x1f, 0x8e, 0x65, 0x1f, 0x76, 0x17, 0x48,
0x80, 0x6f, 0x32, 0xc3, 0x23, 0xd4, 0xb8, 0x9b, 0x72, 0xbb, 0x8c, 0x9a, 0xf7, 0x4d, 0x76, 0x4d, 0x45, 0x34, 0xea, 0x07, 0x48, 0x36, 0xf0, 0x54, 0xc7, 0x5f, 0xd0, 0x31, 0xe4, 0xef, 0xf1, 0xd4,
0x68, 0x77, 0x8a, 0xc7, 0xb0, 0xe9, 0x86, 0xf8, 0xfa, 0xfa, 0x51, 0xe6, 0xb8, 0x78, 0x5a, 0x69, 0xf8, 0x6c, 0x3b, 0x03, 0x4c, 0x0c, 0x8f, 0x30, 0x5e, 0x91, 0xfc, 0xdc, 0x3d, 0x9e, 0x5e, 0x70,
0x46, 0x55, 0x6d, 0xea, 0x33, 0x65, 0xc2, 0xd4, 0x58, 0xbd, 0x88, 0x35, 0x23, 0xc6, 0xfa, 0x1c, 0xf1, 0x35, 0x93, 0xa2, 0xa7, 0x00, 0x5c, 0xd3, 0x1c, 0xd9, 0xc3, 0x69, 0x58, 0x83, 0x34, 0xd3,
0x6a, 0x29, 0x9f, 0x51, 0xbc, 0xbb, 0x90, 0xa3, 0xe6, 0xd4, 0x60, 0x49, 0xbe, 0xd4, 0x9c, 0xea, 0xe1, 0x02, 0x35, 0x0b, 0xca, 0x99, 0x65, 0x91, 0x30, 0x6e, 0x55, 0x85, 0x8c, 0x38, 0x86, 0xf7,
0x33, 0xe9, 0x27, 0x40, 0xd9, 0x67, 0xf6, 0xbd, 0xc9, 0xc8, 0x05, 0x21, 0x71, 0x84, 0x87, 0x50, 0x47, 0xb0, 0x69, 0x5a, 0x16, 0xe1, 0xdc, 0x69, 0x9d, 0x7f, 0xab, 0xef, 0x41, 0xe9, 0x12, 0xd3,
0x1c, 0xba, 0xce, 0x7b, 0x83, 0x99, 0x74, 0x44, 0xe2, 0x16, 0x41, 0x20, 0xd2, 0xb9, 0x44, 0x7a, 0xf1, 0xcd, 0x3e, 0x4b, 0x01, 0xda, 0x85, 0x24, 0x0d, 0x8c, 0x3b, 0x1c, 0x84, 0xd7, 0x4d, 0xd0,
0x09, 0xb5, 0x94, 0x59, 0xe4, 0xe4, 0x8b, 0x99, 0x49, 0x9f, 0x32, 0x50, 0xba, 0x26, 0x8e, 0x65, 0xa0, 0x8e, 0x03, 0x54, 0x84, 0xc4, 0xd0, 0xec, 0xe1, 0x21, 0x77, 0x99, 0xd6, 0xc5, 0x41, 0xfd,
0x3b, 0x23, 0x6d, 0x4a, 0x88, 0x87, 0x3f, 0x40, 0x3e, 0xc8, 0xc5, 0x8d, 0xc7, 0xa0, 0x78, 0xba, 0x01, 0xb6, 0xaf, 0xc7, 0xbd, 0xa1, 0xed, 0xdf, 0x45, 0x2e, 0x5e, 0x40, 0xd6, 0x13, 0x22, 0x03,
0xd5, 0x1c, 0xf3, 0x4c, 0x95, 0x09, 0xbb, 0x0e, 0xc4, 0x6a, 0x02, 0xc0, 0x57, 0x50, 0x9a, 0xda, 0x13, 0xe2, 0xce, 0x7c, 0x65, 0x42, 0xa1, 0xc6, 0x64, 0x2a, 0x01, 0xd4, 0xc1, 0x8e, 0x25, 0xf2,
0xcc, 0x21, 0xbe, 0x6f, 0xb0, 0xb9, 0x47, 0x78, 0x83, 0x2a, 0xa7, 0x7b, 0xcd, 0x64, 0x10, 0x9b, 0xe1, 0xcf, 0xb2, 0x7c, 0x00, 0xe0, 0x9b, 0xd4, 0xf0, 0x30, 0x31, 0xee, 0x27, 0xdc, 0x6e, 0x43,
0x37, 0xa1, 0x5a, 0x9f, 0x7b, 0x44, 0x2d, 0x4e, 0x17, 0x87, 0x60, 0x98, 0xcc, 0x7b, 0x77, 0xe2, 0x4f, 0xf9, 0x26, 0xbd, 0xc6, 0xa4, 0x31, 0x41, 0xc7, 0xb0, 0xe5, 0x0a, 0xfd, 0xd2, 0x3a, 0x6f,
0x30, 0xc3, 0x37, 0x19, 0xaf, 0x56, 0x59, 0x2d, 0x84, 0x12, 0xcd, 0x64, 0x78, 0x04, 0xa5, 0x38, 0xa5, 0x5c, 0x25, 0xec, 0xeb, 0x4a, 0x37, 0x68, 0x8f, 0xa9, 0x3e, 0x83, 0xe7, 0xb1, 0x6e, 0xc8,
0xea, 0xc1, 0x9c, 0x91, 0xfa, 0x06, 0x07, 0x40, 0x18, 0xf7, 0xf9, 0x9c, 0x11, 0x7c, 0x01, 0x38, 0xb1, 0xbe, 0x84, 0x42, 0xcc, 0x67, 0x18, 0xef, 0x2e, 0x24, 0x89, 0x39, 0x31, 0x68, 0x74, 0x5f,
0xa0, 0xae, 0x69, 0x0d, 0x4d, 0x9f, 0x19, 0x26, 0x63, 0xe4, 0xde, 0x63, 0x7e, 0x3d, 0xcb, 0x71, 0x62, 0x4e, 0xba, 0x81, 0xfa, 0x06, 0x90, 0xe6, 0x53, 0x7b, 0x64, 0x52, 0x7c, 0x81, 0xf1, 0x2c,
0xdb, 0x89, 0xe6, 0x2c, 0x52, 0xe0, 0x29, 0xec, 0x3a, 0x64, 0xc6, 0x8c, 0x85, 0xcd, 0x2d, 0xb1, 0xc2, 0x43, 0x50, 0x58, 0xf3, 0x1b, 0xd4, 0x24, 0x03, 0x3c, 0x2b, 0x11, 0x30, 0x51, 0x97, 0x4b,
0x47, 0xb7, 0xac, 0x9e, 0xe3, 0x16, 0xb5, 0x40, 0x79, 0x1e, 0xeb, 0x3a, 0x5c, 0x15, 0xd8, 0xd0, 0xd4, 0xd7, 0x50, 0x88, 0x99, 0x85, 0x4e, 0xbe, 0x7b, 0x33, 0xf5, 0xdb, 0x06, 0x64, 0xae, 0xb1,
0xb0, 0xfa, 0xc4, 0x32, 0xc4, 0xe2, 0xe7, 0x43, 0x9b, 0x44, 0xd9, 0x4a, 0xba, 0x80, 0x2f, 0x61, 0x63, 0xd9, 0xce, 0xa0, 0x33, 0xc1, 0xd8, 0x8b, 0xb5, 0xd7, 0xda, 0x5f, 0xb4, 0x17, 0x7a, 0x07,
0x6f, 0x61, 0x93, 0x4a, 0xa1, 0xb0, 0x64, 0xa4, 0x2d, 0x72, 0xd9, 0x81, 0xec, 0x7b, 0x97, 0x0e, 0x99, 0x89, 0x4d, 0x1d, 0xec, 0xfb, 0x06, 0x9d, 0x7a, 0x98, 0x17, 0x28, 0x77, 0xba, 0x57, 0x89,
0x49, 0x7d, 0xf3, 0x68, 0xed, 0x38, 0xaf, 0x86, 0x07, 0x69, 0x0f, 0x76, 0xc4, 0xd6, 0xc4, 0xb3, 0x46, 0x41, 0xe5, 0x56, 0xc0, 0xdd, 0xa9, 0x87, 0x75, 0x65, 0x32, 0x3f, 0xb0, 0x66, 0x32, 0x47,
0x2a, 0xdd, 0xc0, 0xee, 0x92, 0x3c, 0x6a, 0xf5, 0x6f, 0x50, 0xf1, 0x42, 0x85, 0xe1, 0x73, 0x4d, 0xee, 0xd8, 0xa1, 0x86, 0x6f, 0x52, 0x9e, 0xad, 0xac, 0x9e, 0x16, 0x92, 0x8e, 0x49, 0xd1, 0x11,
0x7d, 0x8d, 0x4f, 0xeb, 0xbe, 0xd0, 0x10, 0xd1, 0x52, 0x2d, 0x7b, 0x22, 0x8f, 0xf4, 0xcf, 0x1a, 0x64, 0x66, 0x51, 0xf7, 0xa6, 0x14, 0x97, 0x36, 0xb9, 0x02, 0x88, 0xb8, 0xcf, 0xa7, 0x14, 0xa3,
0x54, 0xce, 0x27, 0xf7, 0x9e, 0x30, 0x75, 0xff, 0x6b, 0x1c, 0x0e, 0xa1, 0x18, 0x16, 0x88, 0x17, 0x57, 0x80, 0x7a, 0xc4, 0x35, 0xad, 0xbe, 0xe9, 0x53, 0xc3, 0xa4, 0x14, 0x8f, 0x3c, 0xea, 0x97,
0x8b, 0x4f, 0x43, 0x59, 0x85, 0x50, 0x14, 0x94, 0x68, 0xa5, 0xab, 0x99, 0x95, 0xae, 0x26, 0x95, 0x12, 0x5c, 0x6f, 0x27, 0x42, 0xce, 0x42, 0x00, 0x9d, 0xc2, 0xae, 0x83, 0x03, 0x6a, 0xcc, 0x6d,
0xd8, 0x10, 0x2b, 0xb1, 0x0d, 0x5b, 0x49, 0x5c, 0x61, 0xae, 0xd2, 0x0b, 0xd8, 0xee, 0xd9, 0x3e, 0xee, 0xb0, 0x3d, 0xb8, 0xa3, 0xa5, 0x24, 0xb7, 0x28, 0x30, 0xf0, 0x7c, 0x86, 0xd5, 0x39, 0xc4,
0x4b, 0x55, 0x06, 0xeb, 0xb0, 0xf9, 0x91, 0xd0, 0x81, 0xeb, 0x13, 0x1e, 0x6c, 0x5e, 0x8d, 0x8f, 0x6c, 0x88, 0xc8, 0x3e, 0xb6, 0x0c, 0x39, 0xf9, 0x29, 0x61, 0x13, 0x81, 0xd5, 0xa8, 0x0a, 0xe8,
0xd2, 0xdf, 0xeb, 0x80, 0x22, 0x3e, 0xaa, 0x58, 0x0f, 0x6a, 0x6c, 0xb1, 0x80, 0x0c, 0x8b, 0x30, 0x35, 0xec, 0xcd, 0x6d, 0x62, 0x57, 0x48, 0x2f, 0x18, 0x75, 0xe6, 0x77, 0x29, 0x42, 0xe2, 0xb3,
0xd3, 0x1e, 0xfb, 0x51, 0xa6, 0x8f, 0xa3, 0x4c, 0x85, 0x15, 0xd5, 0x0e, 0x01, 0x9d, 0x47, 0x2a, 0x4b, 0xfa, 0xb8, 0xb4, 0x75, 0xb4, 0x76, 0x9c, 0xd2, 0xc5, 0x41, 0xdd, 0x83, 0xa2, 0x5c, 0x9a,
0xb2, 0x15, 0x29, 0xde, 0xc0, 0x96, 0xc8, 0x66, 0x5b, 0x3e, 0xaf, 0x41, 0xf1, 0xf4, 0xb9, 0xd0, 0x59, 0xaf, 0xaa, 0xb7, 0xb0, 0xbb, 0x20, 0x0f, 0x4b, 0xfd, 0x13, 0xe4, 0x3c, 0x01, 0x18, 0x3e,
0x80, 0xd5, 0x28, 0x44, 0x07, 0x97, 0xed, 0x80, 0xbc, 0x22, 0xd0, 0x5c, 0x5a, 0x7e, 0xe3, 0x15, 0x47, 0xc2, 0xc1, 0xb7, 0x2f, 0x15, 0x44, 0xb6, 0xd4, 0xb3, 0x9e, 0xcc, 0xa3, 0xfe, 0xbe, 0x06,
0x54, 0xd2, 0x18, 0xfc, 0x6e, 0xd5, 0x55, 0xd0, 0xeb, 0xc2, 0xb2, 0xe9, 0x79, 0x1e, 0x72, 0xe1, 0xb9, 0xf3, 0xf1, 0xc8, 0x93, 0xba, 0xee, 0x6f, 0xb5, 0xc3, 0x21, 0x28, 0x22, 0x41, 0x3c, 0x59,
0x2c, 0x48, 0x26, 0xec, 0xf7, 0x82, 0x6d, 0x24, 0x30, 0xc5, 0x75, 0x43, 0xd8, 0x60, 0x33, 0xdb, 0xbc, 0x1b, 0xb2, 0x3a, 0x08, 0x11, 0x4b, 0xd1, 0x52, 0x55, 0x37, 0x96, 0xaa, 0x1a, 0x65, 0x62,
0x8a, 0xd6, 0x10, 0xff, 0xfe, 0xfc, 0xd6, 0xc5, 0x03, 0x28, 0xb8, 0x1f, 0x09, 0x9d, 0x52, 0x3b, 0x53, 0xce, 0xc4, 0x0e, 0x6c, 0x47, 0x71, 0x85, 0x03, 0xec, 0x15, 0xec, 0xb0, 0x91, 0x1f, 0xcb,
0x6a, 0x5f, 0x5e, 0x5d, 0x08, 0xa4, 0x06, 0xd4, 0x57, 0x5d, 0x84, 0x49, 0x7e, 0xff, 0x29, 0x03, 0x0c, 0x2a, 0xc1, 0xd6, 0x57, 0x4c, 0x7a, 0xae, 0x8f, 0x79, 0xb0, 0x29, 0x7d, 0x76, 0x54, 0x7f,
0x45, 0x61, 0x1b, 0x60, 0x0d, 0xb6, 0xde, 0xf4, 0xbb, 0x7d, 0xe5, 0xa6, 0x6f, 0xdc, 0x5c, 0xea, 0x5b, 0x17, 0x4f, 0xce, 0x42, 0xc6, 0x9a, 0x50, 0xa0, 0xf3, 0x01, 0x64, 0x58, 0x98, 0x9a, 0xf6,
0x7d, 0x59, 0xd3, 0xaa, 0x8f, 0xb0, 0x0e, 0x3b, 0x2d, 0xe5, 0xea, 0xea, 0x52, 0xbf, 0x92, 0xfb, 0xd0, 0x0f, 0x6f, 0xfa, 0x38, 0xbc, 0xa9, 0x34, 0xa2, 0x6a, 0x42, 0xa1, 0xfe, 0x48, 0x47, 0x74,
0xba, 0xa1, 0x5f, 0x5e, 0xc9, 0x46, 0x4f, 0x69, 0x75, 0xab, 0x6b, 0xb8, 0x0f, 0x35, 0x41, 0xd3, 0x49, 0x8a, 0x6e, 0x61, 0x5b, 0x66, 0xb3, 0x2d, 0x3f, 0x9c, 0xd0, 0x2f, 0xa5, 0x02, 0x2c, 0x47,
0x57, 0x8c, 0xb6, 0xdc, 0x3b, 0x7b, 0x57, 0x5d, 0xc7, 0x5d, 0xd8, 0x16, 0x14, 0xaa, 0xfc, 0x56, 0x21, 0x3b, 0xb8, 0xac, 0x31, 0xf2, 0x9c, 0x44, 0x73, 0x69, 0xf9, 0xe5, 0x77, 0x90, 0x8b, 0xeb,
0xe9, 0xca, 0xd5, 0x4c, 0x80, 0xef, 0xe8, 0xbd, 0x96, 0xa1, 0x5c, 0x5c, 0xc8, 0xaa, 0xdc, 0x8e, 0xa0, 0xff, 0x2c, 0xbb, 0x62, 0xb5, 0x4e, 0x2f, 0x9a, 0x9e, 0xa7, 0x20, 0x29, 0x7a, 0x41, 0x35,
0x15, 0x1b, 0x81, 0x0b, 0xae, 0x38, 0x6b, 0xb5, 0xe4, 0x6b, 0x7d, 0xa1, 0xc9, 0xe2, 0x37, 0xf0, 0x61, 0xbf, 0xc9, 0xa6, 0x91, 0xc4, 0x34, 0xcb, 0x1b, 0x82, 0x4d, 0x1a, 0x44, 0xaf, 0x0c, 0xff,
0x75, 0xca, 0x24, 0x70, 0xaf, 0xbc, 0xd1, 0x0d, 0x4d, 0x6e, 0x29, 0xfd, 0xb6, 0xd1, 0x93, 0xdf, 0x5e, 0x3d, 0x75, 0xd1, 0x01, 0xa4, 0xdd, 0xaf, 0x98, 0x4c, 0x88, 0x1d, 0x96, 0x2f, 0xa5, 0xcf,
0xca, 0xbd, 0x6a, 0x0e, 0xbf, 0x05, 0x29, 0x4d, 0xa0, 0xbd, 0x69, 0xb5, 0x64, 0x4d, 0x4b, 0xe3, 0x05, 0x6a, 0x19, 0x4a, 0xcb, 0x2e, 0xc4, 0x25, 0xff, 0xfb, 0x6d, 0x03, 0x14, 0x69, 0x1a, 0xa0,
0x36, 0xf1, 0x10, 0x9e, 0x2c, 0x45, 0x70, 0xa5, 0xe8, 0x72, 0xcc, 0x5a, 0xcd, 0xe3, 0x11, 0x1c, 0x02, 0x6c, 0xdf, 0xb4, 0x1a, 0xad, 0xf6, 0x6d, 0xcb, 0xb8, 0xbd, 0xec, 0xb6, 0xb4, 0x4e, 0x27,
0x2c, 0x47, 0xc2, 0x11, 0x11, 0x5f, 0xb5, 0x80, 0x07, 0x50, 0xe7, 0x08, 0x91, 0x39, 0x8e, 0x17, 0xff, 0x08, 0x95, 0xa0, 0x58, 0x6d, 0x5f, 0x5d, 0x5d, 0x76, 0xaf, 0xb4, 0x56, 0xd7, 0xe8, 0x5e,
0x70, 0x07, 0xaa, 0x51, 0xe5, 0x8c, 0xae, 0xfc, 0xce, 0xe8, 0x9c, 0x69, 0x9d, 0x6a, 0x11, 0x9f, 0x5e, 0x69, 0x46, 0xb3, 0x5d, 0x6d, 0xe4, 0xd7, 0xd0, 0x3e, 0x14, 0x24, 0xa4, 0xd5, 0x36, 0x6a,
0xc0, 0x7e, 0x5f, 0xd6, 0x02, 0xba, 0x15, 0x65, 0x69, 0xa9, 0x58, 0x67, 0xfd, 0x56, 0x47, 0x51, 0x5a, 0xf3, 0xec, 0x53, 0x7e, 0x1d, 0xed, 0xc2, 0x8e, 0x04, 0xe8, 0xda, 0xc7, 0x76, 0x43, 0xcb,
0xab, 0xe5, 0xd3, 0x7f, 0xb3, 0x50, 0xb8, 0xe1, 0x13, 0xda, 0xb5, 0x19, 0xbe, 0x86, 0x72, 0x9b, 0x6f, 0x30, 0xfd, 0x7a, 0xb7, 0x59, 0x35, 0xda, 0x17, 0x17, 0x9a, 0xae, 0xd5, 0x66, 0xc0, 0x26,
0x50, 0xfb, 0x23, 0xe9, 0x93, 0x19, 0xeb, 0x92, 0x39, 0x6e, 0x0b, 0xe3, 0x1b, 0xbe, 0x1a, 0x1a, 0x73, 0xc1, 0x81, 0xb3, 0x6a, 0x55, 0xbb, 0xee, 0xce, 0x91, 0x04, 0xfa, 0x17, 0x3c, 0x8f, 0x99,
0x7b, 0xc9, 0x05, 0xd8, 0x25, 0xf3, 0x36, 0xf1, 0x87, 0xd4, 0xf6, 0x98, 0x4b, 0xf1, 0x17, 0x28, 0x30, 0xf7, 0xed, 0x9b, 0xae, 0xd1, 0xd1, 0xaa, 0xed, 0x56, 0xcd, 0x68, 0x6a, 0x1f, 0xb5, 0x66,
0x84, 0xb6, 0x81, 0x5d, 0x4d, 0x04, 0xf5, 0xdc, 0xa1, 0xc9, 0x5c, 0xfa, 0xa0, 0xe5, 0xaf, 0x90, 0x3e, 0x89, 0xfe, 0x0d, 0x6a, 0x9c, 0xa0, 0x73, 0x53, 0xad, 0x6a, 0x9d, 0x4e, 0x5c, 0x6f, 0x0b,
0x0f, 0xfc, 0x05, 0x6f, 0x06, 0x14, 0x6f, 0x10, 0xe1, 0x4d, 0xd1, 0xd8, 0x5f, 0x91, 0x47, 0xff, 0x1d, 0xc2, 0x93, 0x85, 0x08, 0xae, 0xda, 0x5d, 0x6d, 0xc6, 0x9a, 0x4f, 0xa1, 0x23, 0x38, 0x58,
0xe3, 0x0e, 0x60, 0xf4, 0x18, 0x10, 0xdf, 0x13, 0x22, 0x8d, 0x20, 0x6f, 0x34, 0xc4, 0x7d, 0xb8, 0x8c, 0x84, 0x6b, 0x84, 0x7c, 0xf9, 0x34, 0x3a, 0x80, 0x12, 0xd7, 0x90, 0x99, 0x67, 0xf1, 0x02,
0xf4, 0x86, 0xe8, 0x41, 0x51, 0xb8, 0xaa, 0xf1, 0xa9, 0x00, 0x5d, 0x7d, 0x36, 0x34, 0xbe, 0x7a, 0x2a, 0x42, 0x3e, 0xcc, 0x9c, 0xd1, 0xd0, 0x3e, 0x19, 0xf5, 0xb3, 0x4e, 0x3d, 0xaf, 0xa0, 0x27,
0x48, 0xbd, 0x60, 0x13, 0xee, 0xe4, 0x14, 0xdb, 0xea, 0x15, 0x9f, 0x62, 0xfb, 0xdc, 0x55, 0xae, 0xb0, 0xdf, 0xd2, 0x3a, 0x8c, 0x6e, 0x09, 0xcc, 0x2c, 0x24, 0xeb, 0xac, 0x55, 0xad, 0xb7, 0xf5,
0x42, 0x39, 0xb5, 0xf8, 0xf1, 0xf0, 0x81, 0xc5, 0x9e, 0xc4, 0x77, 0xf4, 0x30, 0x20, 0xe2, 0xfc, 0x7c, 0xf6, 0xf4, 0x8f, 0x2d, 0x48, 0xdf, 0xf2, 0x0e, 0x6d, 0xd8, 0x14, 0x35, 0x41, 0x91, 0xb6,
0x1d, 0x36, 0xa3, 0xd5, 0x8a, 0x8f, 0x05, 0x70, 0xfa, 0x1a, 0x48, 0x55, 0x6c, 0x69, 0x13, 0xe3, 0x29, 0xf4, 0x74, 0xa1, 0x79, 0xe3, 0x5b, 0x5b, 0xf9, 0xd9, 0x43, 0x70, 0xf4, 0x2f, 0xa6, 0x48,
0x25, 0xc0, 0x62, 0xa7, 0xe1, 0xc1, 0x03, 0xab, 0x2e, 0xe4, 0x79, 0xfa, 0xc5, 0x45, 0x88, 0x7f, 0xeb, 0x50, 0x9c, 0x6d, 0x69, 0xdb, 0x89, 0xb3, 0xad, 0xd8, 0xa2, 0x74, 0xc8, 0xc6, 0x16, 0x1a,
0x41, 0x75, 0x79, 0x7f, 0xa0, 0x24, 0x9a, 0x7c, 0x7e, 0x7f, 0x35, 0x9e, 0x7d, 0x11, 0x13, 0x92, 0x74, 0x28, 0x19, 0xac, 0xda, 0x9f, 0xca, 0x47, 0x0f, 0x2b, 0x84, 0x9c, 0xef, 0x21, 0x5b, 0xc3,
0x9f, 0xff, 0xf8, 0xe7, 0xc9, 0xc8, 0x66, 0xb7, 0x93, 0x41, 0x73, 0xe8, 0xde, 0x9f, 0x8c, 0x83, 0xc4, 0xfe, 0x8a, 0x5b, 0x38, 0xa0, 0x0d, 0x3c, 0x45, 0x3b, 0x92, 0x89, 0xd8, 0x92, 0xca, 0x7b,
0x1b, 0xde, 0xb1, 0x9d, 0x91, 0x43, 0xd8, 0xd4, 0xa5, 0x77, 0x27, 0x63, 0xc7, 0x3a, 0xe1, 0xfb, 0xd1, 0x83, 0xdf, 0xc0, 0xd3, 0x1a, 0xf6, 0xfb, 0xc4, 0xf6, 0xa8, 0x4b, 0xd0, 0x5b, 0x48, 0x0b,
0xfe, 0x24, 0xe1, 0x1a, 0xe4, 0xf8, 0x63, 0xf9, 0xe5, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x5b, 0x66, 0x57, 0x90, 0x95, 0x9a, 0x6e, 0xdf, 0xa4, 0x2e, 0x79, 0xd0, 0xf2, 0x47, 0x48, 0x31,
0xeb, 0x99, 0xb8, 0x75, 0x0b, 0x00, 0x00, 0x7f, 0x6c, 0x47, 0x42, 0xf2, 0x8b, 0x29, 0xed, 0x50, 0xe5, 0xfd, 0x25, 0x79, 0x18, 0x72, 0x1d,
0x50, 0xb8, 0xfc, 0xc8, 0xfb, 0x93, 0x4c, 0x23, 0xc9, 0xcb, 0x65, 0x79, 0xfe, 0x2f, 0xec, 0x4c,
0x4d, 0x50, 0xa4, 0xd5, 0x24, 0x56, 0x9e, 0xe5, 0x35, 0x29, 0x56, 0x9e, 0x55, 0x1b, 0x4d, 0x13,
0x14, 0x69, 0x07, 0x89, 0xb1, 0x2d, 0xaf, 0x34, 0x31, 0xb6, 0x55, 0xab, 0x8b, 0x0e, 0xd9, 0xd8,
0x43, 0x17, 0x2b, 0xf6, 0xaa, 0xa7, 0x31, 0x56, 0xec, 0xd5, 0x6f, 0xe4, 0xcf, 0xb0, 0x15, 0x3e,
0x25, 0xe8, 0xb1, 0xa4, 0x1c, 0x7f, 0xf6, 0x62, 0x19, 0x5b, 0x78, 0x79, 0xd0, 0x25, 0xc0, 0x7c,
0x86, 0xa3, 0x83, 0x07, 0x46, 0xbb, 0xe0, 0x79, 0xfa, 0xdd, 0xc1, 0x8f, 0x7e, 0x85, 0xfc, 0xe2,
0xbc, 0x44, 0xaa, 0x6c, 0xb2, 0x7a, 0x5e, 0x97, 0x5f, 0x7c, 0x57, 0x47, 0x90, 0x9f, 0xff, 0xff,
0x97, 0x93, 0x81, 0x4d, 0xef, 0xc6, 0xbd, 0x4a, 0xdf, 0x1d, 0x9d, 0x0c, 0xd9, 0x46, 0xe3, 0xd8,
0xce, 0xc0, 0xc1, 0x74, 0xe2, 0x92, 0xfb, 0x93, 0xa1, 0x63, 0x9d, 0xf0, 0xf7, 0xed, 0x24, 0xe2,
0xea, 0x25, 0xf9, 0xcf, 0xb3, 0xd7, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x01, 0xb2, 0xa4, 0x25,
0xe7, 0x0d, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -1206,6 +1484,22 @@ const _ = grpc.SupportPackageIsVersion4
// //
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type WalletKitClient interface { type WalletKitClient interface {
//
//ListUnspent returns a list of all utxos spendable by the wallet with a
//number of confirmations between the specified minimum and maximum.
ListUnspent(ctx context.Context, in *ListUnspentRequest, opts ...grpc.CallOption) (*ListUnspentResponse, error)
//
//LeaseOutput locks an output to the given ID, preventing it from being
//available for any future coin selection attempts. The absolute time of the
//lock's expiration is returned. The expiration of the lock can be extended by
//successive invocations of this RPC. Outputs can be unlocked before their
//expiration through `ReleaseOutput`.
LeaseOutput(ctx context.Context, in *LeaseOutputRequest, opts ...grpc.CallOption) (*LeaseOutputResponse, error)
//
//ReleaseOutput unlocks an output, allowing it to be available for coin
//selection if it remains unspent. The ID should match the one used to
//originally lock the output.
ReleaseOutput(ctx context.Context, in *ReleaseOutputRequest, opts ...grpc.CallOption) (*ReleaseOutputResponse, 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
@ -1292,6 +1586,33 @@ func NewWalletKitClient(cc *grpc.ClientConn) WalletKitClient {
return &walletKitClient{cc} return &walletKitClient{cc}
} }
func (c *walletKitClient) ListUnspent(ctx context.Context, in *ListUnspentRequest, opts ...grpc.CallOption) (*ListUnspentResponse, error) {
out := new(ListUnspentResponse)
err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/ListUnspent", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *walletKitClient) LeaseOutput(ctx context.Context, in *LeaseOutputRequest, opts ...grpc.CallOption) (*LeaseOutputResponse, error) {
out := new(LeaseOutputResponse)
err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/LeaseOutput", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *walletKitClient) ReleaseOutput(ctx context.Context, in *ReleaseOutputRequest, opts ...grpc.CallOption) (*ReleaseOutputResponse, error) {
out := new(ReleaseOutputResponse)
err := c.cc.Invoke(ctx, "/walletrpc.WalletKit/ReleaseOutput", 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...)
@ -1384,6 +1705,22 @@ func (c *walletKitClient) LabelTransaction(ctx context.Context, in *LabelTransac
// WalletKitServer is the server API for WalletKit service. // WalletKitServer is the server API for WalletKit service.
type WalletKitServer interface { type WalletKitServer interface {
//
//ListUnspent returns a list of all utxos spendable by the wallet with a
//number of confirmations between the specified minimum and maximum.
ListUnspent(context.Context, *ListUnspentRequest) (*ListUnspentResponse, error)
//
//LeaseOutput locks an output to the given ID, preventing it from being
//available for any future coin selection attempts. The absolute time of the
//lock's expiration is returned. The expiration of the lock can be extended by
//successive invocations of this RPC. Outputs can be unlocked before their
//expiration through `ReleaseOutput`.
LeaseOutput(context.Context, *LeaseOutputRequest) (*LeaseOutputResponse, error)
//
//ReleaseOutput unlocks an output, allowing it to be available for coin
//selection if it remains unspent. The ID should match the one used to
//originally lock the output.
ReleaseOutput(context.Context, *ReleaseOutputRequest) (*ReleaseOutputResponse, 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
@ -1466,6 +1803,60 @@ func RegisterWalletKitServer(s *grpc.Server, srv WalletKitServer) {
s.RegisterService(&_WalletKit_serviceDesc, srv) s.RegisterService(&_WalletKit_serviceDesc, srv)
} }
func _WalletKit_ListUnspent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListUnspentRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WalletKitServer).ListUnspent(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/walletrpc.WalletKit/ListUnspent",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WalletKitServer).ListUnspent(ctx, req.(*ListUnspentRequest))
}
return interceptor(ctx, in, info, handler)
}
func _WalletKit_LeaseOutput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(LeaseOutputRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WalletKitServer).LeaseOutput(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/walletrpc.WalletKit/LeaseOutput",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WalletKitServer).LeaseOutput(ctx, req.(*LeaseOutputRequest))
}
return interceptor(ctx, in, info, handler)
}
func _WalletKit_ReleaseOutput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ReleaseOutputRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WalletKitServer).ReleaseOutput(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/walletrpc.WalletKit/ReleaseOutput",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WalletKitServer).ReleaseOutput(ctx, req.(*ReleaseOutputRequest))
}
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 {
@ -1650,6 +2041,18 @@ var _WalletKit_serviceDesc = grpc.ServiceDesc{
ServiceName: "walletrpc.WalletKit", ServiceName: "walletrpc.WalletKit",
HandlerType: (*WalletKitServer)(nil), HandlerType: (*WalletKitServer)(nil),
Methods: []grpc.MethodDesc{ Methods: []grpc.MethodDesc{
{
MethodName: "ListUnspent",
Handler: _WalletKit_ListUnspent_Handler,
},
{
MethodName: "LeaseOutput",
Handler: _WalletKit_LeaseOutput_Handler,
},
{
MethodName: "ReleaseOutput",
Handler: _WalletKit_ReleaseOutput_Handler,
},
{ {
MethodName: "DeriveNextKey", MethodName: "DeriveNextKey",
Handler: _WalletKit_DeriveNextKey_Handler, Handler: _WalletKit_DeriveNextKey_Handler,

@ -10,6 +10,28 @@ option go_package = "github.com/lightningnetwork/lnd/lnrpc/walletrpc";
// WalletKit is a service that gives access to the core functionalities of the // WalletKit is a service that gives access to the core functionalities of the
// daemon's wallet. // daemon's wallet.
service WalletKit { service WalletKit {
/*
ListUnspent returns a list of all utxos spendable by the wallet with a
number of confirmations between the specified minimum and maximum.
*/
rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse);
/*
LeaseOutput locks an output to the given ID, preventing it from being
available for any future coin selection attempts. The absolute time of the
lock's expiration is returned. The expiration of the lock can be extended by
successive invocations of this RPC. Outputs can be unlocked before their
expiration through `ReleaseOutput`.
*/
rpc LeaseOutput (LeaseOutputRequest) returns (LeaseOutputResponse);
/*
ReleaseOutput unlocks an output, allowing it to be available for coin
selection if it remains unspent. The ID should match the one used to
originally lock the output.
*/
rpc ReleaseOutput (ReleaseOutputRequest) returns (ReleaseOutputResponse);
/* /*
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
@ -108,6 +130,48 @@ service WalletKit {
returns (LabelTransactionResponse); returns (LabelTransactionResponse);
} }
message ListUnspentRequest {
// The minimum number of confirmations to be included.
int32 min_confs = 1;
// The maximum number of confirmations to be included.
int32 max_confs = 2;
}
message ListUnspentResponse {
// A list of utxos satisfying the specified number of confirmations.
repeated lnrpc.Utxo utxos = 1;
}
message LeaseOutputRequest {
/*
An ID of 32 random bytes that must be unique for each distinct application
using this RPC which will be used to bound the output lease to.
*/
bytes id = 1;
// The identifying outpoint of the output being leased.
lnrpc.OutPoint outpoint = 2;
}
message LeaseOutputResponse {
/*
The absolute expiration of the output lease represented as a unix timestamp.
*/
uint64 expiration = 1;
}
message ReleaseOutputRequest {
// The unique ID that was used to lock the output.
bytes id = 1;
// The identifying outpoint of the output being released.
lnrpc.OutPoint outpoint = 2;
}
message ReleaseOutputResponse {
}
message KeyReq { message KeyReq {
/* /*
Is the key finger print of the root pubkey that this request is targeting. Is the key finger print of the root pubkey that this request is targeting.

@ -28,6 +28,18 @@
} }
} }
}, },
"lnrpcAddressType": {
"type": "string",
"enum": [
"WITNESS_PUBKEY_HASH",
"NESTED_PUBKEY_HASH",
"UNUSED_WITNESS_PUBKEY_HASH",
"UNUSED_NESTED_PUBKEY_HASH"
],
"default": "WITNESS_PUBKEY_HASH",
"description": "- `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0)\n- `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1)",
"title": "`AddressType` has to be one of:"
},
"lnrpcOutPoint": { "lnrpcOutPoint": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -112,6 +124,37 @@
} }
} }
}, },
"lnrpcUtxo": {
"type": "object",
"properties": {
"address_type": {
"$ref": "#/definitions/lnrpcAddressType",
"title": "The type of address"
},
"address": {
"type": "string",
"title": "The address"
},
"amount_sat": {
"type": "string",
"format": "int64",
"title": "The value of the unspent coin in satoshis"
},
"pk_script": {
"type": "string",
"title": "The pkscript in hex"
},
"outpoint": {
"$ref": "#/definitions/lnrpcOutPoint",
"title": "The outpoint in format txid:n"
},
"confirmations": {
"type": "string",
"format": "int64",
"title": "The number of confirmations for the Utxo"
}
}
},
"signrpcKeyDescriptor": { "signrpcKeyDescriptor": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -181,6 +224,16 @@
"walletrpcLabelTransactionResponse": { "walletrpcLabelTransactionResponse": {
"type": "object" "type": "object"
}, },
"walletrpcLeaseOutputResponse": {
"type": "object",
"properties": {
"expiration": {
"type": "string",
"format": "uint64",
"description": "The absolute expiration of the output lease represented as a unix timestamp."
}
}
},
"walletrpcListSweepsResponse": { "walletrpcListSweepsResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -192,6 +245,18 @@
} }
} }
}, },
"walletrpcListUnspentResponse": {
"type": "object",
"properties": {
"utxos": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcUtxo"
},
"description": "A list of utxos satisfying the specified number of confirmations."
}
}
},
"walletrpcPendingSweep": { "walletrpcPendingSweep": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -261,6 +326,9 @@
} }
} }
}, },
"walletrpcReleaseOutputResponse": {
"type": "object"
},
"walletrpcSendOutputsResponse": { "walletrpcSendOutputsResponse": {
"type": "object", "type": "object",
"properties": { "properties": {

@ -14,6 +14,7 @@ import (
"github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcwallet/wtxmgr"
"github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/input"
"github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/keychain"
"github.com/lightningnetwork/lnd/labels" "github.com/lightningnetwork/lnd/labels"
@ -98,6 +99,18 @@ var (
Entity: "onchain", Entity: "onchain",
Action: "write", Action: "write",
}}, }},
"/walletrpc.WalletKit/LeaseOutput": {{
Entity: "onchain",
Action: "write",
}},
"/walletrpc.WalletKit/ReleaseOutput": {{
Entity: "onchain",
Action: "write",
}},
"/walletrpc.WalletKit/ListUnspent": {{
Entity: "onchain",
Action: "read",
}},
} }
// DefaultWalletKitMacFilename is the default name of the wallet kit // DefaultWalletKitMacFilename is the default name of the wallet kit
@ -204,6 +217,101 @@ func (w *WalletKit) RegisterWithRootServer(grpcServer *grpc.Server) error {
return nil return nil
} }
// ListUnspent returns useful information about each unspent output owned by the
// wallet, as reported by the underlying `ListUnspentWitness`; the information
// returned is: outpoint, amount in satoshis, address, address type,
// scriptPubKey in hex and number of confirmations. The result is filtered to
// contain outputs whose number of confirmations is between a
// minimum and maximum number of confirmations specified by the user, with 0
// meaning unconfirmed.
func (w *WalletKit) ListUnspent(ctx context.Context,
req *ListUnspentRequest) (*ListUnspentResponse, error) {
// Validate the confirmation arguments.
minConfs, maxConfs, err := lnrpc.ParseConfs(req.MinConfs, req.MaxConfs)
if err != nil {
return nil, err
}
// With our arguments validated, we'll query the internal wallet for
// the set of UTXOs that match our query.
utxos, err := w.cfg.Wallet.ListUnspentWitness(minConfs, maxConfs)
if err != nil {
return nil, err
}
rpcUtxos, err := lnrpc.MarshalUtxos(utxos, w.cfg.ChainParams)
if err != nil {
return nil, err
}
return &ListUnspentResponse{
Utxos: rpcUtxos,
}, nil
}
// LeaseOutput locks an output to the given ID, preventing it from being
// available for any future coin selection attempts. The absolute time of the
// lock's expiration is returned. The expiration of the lock can be extended by
// successive invocations of this call. Outputs can be unlocked before their
// expiration through `ReleaseOutput`.
//
// If the output is not known, wtxmgr.ErrUnknownOutput is returned. If the
// output has already been locked to a different ID, then
// wtxmgr.ErrOutputAlreadyLocked is returned.
func (w *WalletKit) LeaseOutput(ctx context.Context,
req *LeaseOutputRequest) (*LeaseOutputResponse, error) {
if len(req.Id) != 32 {
return nil, errors.New("id must be 32 random bytes")
}
var lockID wtxmgr.LockID
copy(lockID[:], req.Id)
// Don't allow ID's of 32 bytes, but all zeros.
if lockID == (wtxmgr.LockID{}) {
return nil, errors.New("id must be 32 random bytes")
}
op, err := unmarshallOutPoint(req.Outpoint)
if err != nil {
return nil, err
}
expiration, err := w.cfg.Wallet.LeaseOutput(lockID, *op)
if err != nil {
return nil, err
}
return &LeaseOutputResponse{
Expiration: uint64(expiration.Unix()),
}, nil
}
// ReleaseOutput unlocks an output, allowing it to be available for coin
// selection if it remains unspent. The ID should match the one used to
// originally lock the output.
func (w *WalletKit) ReleaseOutput(ctx context.Context,
req *ReleaseOutputRequest) (*ReleaseOutputResponse, error) {
if len(req.Id) != 32 {
return nil, errors.New("id must be 32 random bytes")
}
var lockID wtxmgr.LockID
copy(lockID[:], req.Id)
op, err := unmarshallOutPoint(req.Outpoint)
if err != nil {
return nil, err
}
if err := w.cfg.Wallet.ReleaseOutput(lockID, *op); err != nil {
return nil, err
}
return &ReleaseOutputResponse{}, 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.

@ -19,6 +19,7 @@ import (
"github.com/btcsuite/btcwallet/wallet/txauthor" "github.com/btcsuite/btcwallet/wallet/txauthor"
"github.com/btcsuite/btcwallet/wallet/txrules" "github.com/btcsuite/btcwallet/wallet/txrules"
"github.com/btcsuite/btcwallet/walletdb" "github.com/btcsuite/btcwallet/walletdb"
"github.com/btcsuite/btcwallet/wtxmgr"
"github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/keychain"
"github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
@ -367,6 +368,27 @@ func (b *BtcWallet) UnlockOutpoint(o wire.OutPoint) {
b.wallet.UnlockOutpoint(o) b.wallet.UnlockOutpoint(o)
} }
// LeaseOutput locks an output to the given ID, preventing it from being
// available for any future coin selection attempts. The absolute time of the
// lock's expiration is returned. The expiration of the lock can be extended by
// successive invocations of this call. Outputs can be unlocked before their
// expiration through `ReleaseOutput`.
//
// If the output is not known, wtxmgr.ErrUnknownOutput is returned. If the
// output has already been locked to a different ID, then
// wtxmgr.ErrOutputAlreadyLocked is returned.
func (b *BtcWallet) LeaseOutput(id wtxmgr.LockID, op wire.OutPoint) (time.Time,
error) {
return b.wallet.LeaseOutput(id, op)
}
// ReleaseOutput unlocks an output, allowing it to be available for coin
// selection if it remains unspent. The ID should match the one used to
// originally lock the output.
func (b *BtcWallet) ReleaseOutput(id wtxmgr.LockID, op wire.OutPoint) error {
return b.wallet.ReleaseOutput(id, op)
}
// ListUnspentWitness returns a slice of all the unspent outputs the wallet // ListUnspentWitness returns a slice of all the unspent outputs the wallet
// controls which pay to witness programs either directly or indirectly. // controls which pay to witness programs either directly or indirectly.
// //

@ -4,12 +4,14 @@ import (
"errors" "errors"
"fmt" "fmt"
"sync" "sync"
"time"
"github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil"
"github.com/btcsuite/btcwallet/wallet/txauthor" "github.com/btcsuite/btcwallet/wallet/txauthor"
"github.com/btcsuite/btcwallet/wtxmgr"
"github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/input"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
) )
@ -221,6 +223,22 @@ type WalletController interface {
// eligible for coin selection. // eligible for coin selection.
UnlockOutpoint(o wire.OutPoint) UnlockOutpoint(o wire.OutPoint)
// LeaseOutput locks an output to the given ID, preventing it from being
// available for any future coin selection attempts. The absolute time
// of the lock's expiration is returned. The expiration of the lock can
// be extended by successive invocations of this call. Outputs can be
// unlocked before their expiration through `ReleaseOutput`.
//
// If the output is not known, wtxmgr.ErrUnknownOutput is returned. If
// the output has already been locked to a different ID, then
// wtxmgr.ErrOutputAlreadyLocked is returned.
LeaseOutput(id wtxmgr.LockID, op wire.OutPoint) (time.Time, error)
// ReleaseOutput unlocks an output, allowing it to be available for coin
// selection if it remains unspent. The ID should match the one used to
// originally lock the output.
ReleaseOutput(id wtxmgr.LockID, op wire.OutPoint) 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

10
mock.go

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time"
"github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg"
@ -13,6 +14,7 @@ import (
"github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil"
"github.com/btcsuite/btcwallet/wallet/txauthor" "github.com/btcsuite/btcwallet/wallet/txauthor"
"github.com/btcsuite/btcwallet/wtxmgr"
"github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/chainntnfs"
"github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/input"
@ -322,6 +324,14 @@ func (*mockWalletController) ListTransactionDetails(_, _ int32) ([]*lnwallet.Tra
} }
func (*mockWalletController) LockOutpoint(o wire.OutPoint) {} func (*mockWalletController) LockOutpoint(o wire.OutPoint) {}
func (*mockWalletController) UnlockOutpoint(o wire.OutPoint) {} func (*mockWalletController) UnlockOutpoint(o wire.OutPoint) {}
func (*mockWalletController) LeaseOutput(wtxmgr.LockID, wire.OutPoint) (time.Time, error) {
return time.Now(), nil
}
func (*mockWalletController) ReleaseOutput(wtxmgr.LockID, wire.OutPoint) error {
return nil
}
func (m *mockWalletController) PublishTransaction(tx *wire.MsgTx, _ string) error { func (m *mockWalletController) PublishTransaction(tx *wire.MsgTx, _ string) error {
m.publishedTransactions <- tx m.publishedTransactions <- tx
return nil return nil

@ -924,30 +924,20 @@ func (r *rpcServer) sendCoinsOnChain(paymentMap map[string]int64,
return &txHash, nil return &txHash, nil
} }
// ListUnspent returns useful information about each unspent output owned by // ListUnspent returns useful information about each unspent output owned by the
// the wallet, as reported by the underlying `ListUnspentWitness`; the // wallet, as reported by the underlying `ListUnspentWitness`; the information
// information returned is: outpoint, amount in satoshis, address, address // returned is: outpoint, amount in satoshis, address, address type,
// type, scriptPubKey in hex and number of confirmations. The result is // scriptPubKey in hex and number of confirmations. The result is filtered to
// filtered to contain outputs whose number of confirmations is between a // contain outputs whose number of confirmations is between a minimum and
// minimum and maximum number of confirmations specified by the user, with 0 // maximum number of confirmations specified by the user, with 0 meaning
// meaning unconfirmed. // unconfirmed.
func (r *rpcServer) ListUnspent(ctx context.Context, func (r *rpcServer) ListUnspent(ctx context.Context,
in *lnrpc.ListUnspentRequest) (*lnrpc.ListUnspentResponse, error) { in *lnrpc.ListUnspentRequest) (*lnrpc.ListUnspentResponse, error) {
minConfs := in.MinConfs // Validate the confirmation arguments.
maxConfs := in.MaxConfs minConfs, maxConfs, err := lnrpc.ParseConfs(in.MinConfs, in.MaxConfs)
if err != nil {
switch { return nil, err
// Ensure that the user didn't attempt to specify a negative number of
// confirmations, as that isn't possible.
case minConfs < 0:
return nil, fmt.Errorf("min confirmations must be >= 0")
// We'll also ensure that the min number of confs is strictly less than
// or equal to the max number of confs for sanity.
case minConfs > maxConfs:
return nil, fmt.Errorf("max confirmations must be >= min " +
"confirmations")
} }
// With our arguments validated, we'll query the internal wallet for // With our arguments validated, we'll query the internal wallet for
@ -957,69 +947,9 @@ func (r *rpcServer) ListUnspent(ctx context.Context,
return nil, err return nil, err
} }
resp := &lnrpc.ListUnspentResponse{ rpcUtxos, err := lnrpc.MarshalUtxos(utxos, activeNetParams.Params)
Utxos: make([]*lnrpc.Utxo, 0, len(utxos)), if err != nil {
} return nil, err
for _, utxo := range utxos {
// Translate lnwallet address type to the proper gRPC proto
// address type.
var addrType lnrpc.AddressType
switch utxo.AddressType {
case lnwallet.WitnessPubKey:
addrType = lnrpc.AddressType_WITNESS_PUBKEY_HASH
case lnwallet.NestedWitnessPubKey:
addrType = lnrpc.AddressType_NESTED_PUBKEY_HASH
case lnwallet.UnknownAddressType:
rpcsLog.Warnf("[listunspent] utxo with address of "+
"unknown type ignored: %v",
utxo.OutPoint.String())
continue
default:
return nil, fmt.Errorf("invalid utxo address type")
}
// Now that we know we have a proper mapping to an address,
// we'll convert the regular outpoint to an lnrpc variant.
outpoint := &lnrpc.OutPoint{
TxidBytes: utxo.OutPoint.Hash[:],
TxidStr: utxo.OutPoint.Hash.String(),
OutputIndex: utxo.OutPoint.Index,
}
utxoResp := lnrpc.Utxo{
AddressType: addrType,
AmountSat: int64(utxo.Value),
PkScript: hex.EncodeToString(utxo.PkScript),
Outpoint: outpoint,
Confirmations: utxo.Confirmations,
}
// Finally, we'll attempt to extract the raw address from the
// script so we can display a human friendly address to the end
// user.
_, outAddresses, _, err := txscript.ExtractPkScriptAddrs(
utxo.PkScript, activeNetParams.Params,
)
if err != nil {
return nil, err
}
// If we can't properly locate a single address, then this was
// an error in our mapping, and we'll return an error back to
// the user.
if len(outAddresses) != 1 {
return nil, fmt.Errorf("an output was unexpectedly " +
"multisig")
}
utxoResp.Address = outAddresses[0].String()
resp.Utxos = append(resp.Utxos, &utxoResp)
} }
maxStr := "" maxStr := ""
@ -1030,7 +960,9 @@ func (r *rpcServer) ListUnspent(ctx context.Context,
rpcsLog.Debugf("[listunspent] min=%v%v, generated utxos: %v", minConfs, rpcsLog.Debugf("[listunspent] min=%v%v, generated utxos: %v", minConfs,
maxStr, utxos) maxStr, utxos)
return resp, nil return &lnrpc.ListUnspentResponse{
Utxos: rpcUtxos,
}, nil
} }
// EstimateFee handles a request for estimating the fee for sending a // EstimateFee handles a request for estimating the fee for sending a

@ -162,6 +162,9 @@ func (s *subRPCServerConfigs) PopulateDependencies(cfg *Config, cc *chainControl
subCfgValue.FieldByName("Chain").Set( subCfgValue.FieldByName("Chain").Set(
reflect.ValueOf(cc.chainIO), reflect.ValueOf(cc.chainIO),
) )
subCfgValue.FieldByName("ChainParams").Set(
reflect.ValueOf(activeNetParams),
)
case *autopilotrpc.Config: case *autopilotrpc.Config:
subCfgValue := extractReflectValue(subCfg) subCfgValue := extractReflectValue(subCfg)