rpcclient: implement getwalletinfo command
This commit is contained in:
parent
1340513786
commit
e9a51e8dcd
4 changed files with 154 additions and 9 deletions
|
@ -6,6 +6,8 @@ package btcjson
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/txscript"
|
"github.com/btcsuite/btcd/txscript"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -150,6 +152,58 @@ type GetTransactionResult struct {
|
||||||
Hex string `json:"hex"`
|
Hex string `json:"hex"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ScanningOrFalse struct {
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ScanProgress struct {
|
||||||
|
Duration int `json:"duration"`
|
||||||
|
Progress float64 `json:"progress"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaler interface
|
||||||
|
func (h ScanningOrFalse) MarshalJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(h.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON implements the json.Unmarshaler interface
|
||||||
|
func (h *ScanningOrFalse) UnmarshalJSON(data []byte) error {
|
||||||
|
var unmarshalled interface{}
|
||||||
|
if err := json.Unmarshal(data, &unmarshalled); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch v := unmarshalled.(type) {
|
||||||
|
case bool:
|
||||||
|
h.Value = v
|
||||||
|
case map[string]interface{}:
|
||||||
|
h.Value = ScanProgress{
|
||||||
|
Duration: int(v["duration"].(float64)),
|
||||||
|
Progress: v["progress"].(float64),
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid scanning value: %v", unmarshalled)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetWalletInfoResult models the result of the getwalletinfo command.
|
||||||
|
type GetWalletInfoResult struct {
|
||||||
|
WalletName string `json:"walletname"`
|
||||||
|
WalletVersion int `json:"walletversion"`
|
||||||
|
TransactionCount int `json:"txcount"`
|
||||||
|
KeyPoolOldest int `json:"keypoololdest"`
|
||||||
|
KeyPoolSize int `json:"keypoolsize"`
|
||||||
|
KeyPoolSizeHDInternal *int `json:"keypoolsize_hd_internal,omitempty"`
|
||||||
|
UnlockedUntil *int `json:"unlocked_until,omitempty"`
|
||||||
|
PayTransactionFee float64 `json:"paytxfee"`
|
||||||
|
HDSeedID *string `json:"hdseedid,omitempty"`
|
||||||
|
PrivateKeysEnabled bool `json:"private_keys_enabled"`
|
||||||
|
AvoidReuse bool `json:"avoid_reuse"`
|
||||||
|
Scanning ScanningOrFalse `json:"scanning"`
|
||||||
|
}
|
||||||
|
|
||||||
// InfoWalletResult models the data returned by the wallet server getinfo
|
// InfoWalletResult models the data returned by the wallet server getinfo
|
||||||
// command.
|
// command.
|
||||||
type InfoWalletResult struct {
|
type InfoWalletResult struct {
|
||||||
|
|
|
@ -78,3 +78,50 @@ func TestGetAddressInfoResult(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestGetWalletInfoResult ensures that custom unmarshalling of
|
||||||
|
// GetWalletInfoResult works as intended.
|
||||||
|
func TestGetWalletInfoResult(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
result string
|
||||||
|
want GetWalletInfoResult
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "GetWalletInfoResult - not scanning",
|
||||||
|
result: `{"scanning":false}`,
|
||||||
|
want: GetWalletInfoResult{
|
||||||
|
Scanning: ScanningOrFalse{Value: false},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "GetWalletInfoResult - scanning",
|
||||||
|
result: `{"scanning":{"duration":10,"progress":1.0}}`,
|
||||||
|
want: GetWalletInfoResult{
|
||||||
|
Scanning: ScanningOrFalse{
|
||||||
|
Value: ScanProgress{Duration: 10, Progress: 1.0},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Logf("Running %d tests", len(tests))
|
||||||
|
for i, test := range tests {
|
||||||
|
var out GetWalletInfoResult
|
||||||
|
err := json.Unmarshal([]byte(test.result), &out)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Test #%d (%s) unexpected error: %v", i,
|
||||||
|
test.name, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(out, test.want) {
|
||||||
|
t.Errorf("Test #%d (%s) unexpected unmarshalled data - "+
|
||||||
|
"got %v, want %v", i, test.name, spew.Sdump(out),
|
||||||
|
spew.Sdump(test.want))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -82,14 +82,6 @@ func ExampleClient_DeriveAddresses() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExampleClient_GetAddressInfo() {
|
func ExampleClient_GetAddressInfo() {
|
||||||
connCfg = &ConnConfig{
|
|
||||||
Host: "localhost:18332",
|
|
||||||
User: "user",
|
|
||||||
Pass: "pass",
|
|
||||||
HTTPPostMode: true,
|
|
||||||
DisableTLS: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
client, err := New(connCfg, nil)
|
client, err := New(connCfg, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
@ -106,3 +98,21 @@ func ExampleClient_GetAddressInfo() {
|
||||||
fmt.Println(*info.HDKeyPath) // m/49'/1'/0'/0/4
|
fmt.Println(*info.HDKeyPath) // m/49'/1'/0'/0/4
|
||||||
fmt.Println(info.Embedded.Address) // tb1q3x2h2kh57wzg7jz00jhwn0ycvqtdk2ane37j27
|
fmt.Println(info.Embedded.Address) // tb1q3x2h2kh57wzg7jz00jhwn0ycvqtdk2ane37j27
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleClient_GetWalletInfo() {
|
||||||
|
client, err := New(connCfg, nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer client.Shutdown()
|
||||||
|
|
||||||
|
info, err := client.GetWalletInfo()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(info.WalletVersion) // 169900
|
||||||
|
fmt.Println(info.TransactionCount) // 22
|
||||||
|
fmt.Println(*info.HDSeedID) // eb44e4e9b864ef17e7ba947da746375b000f5d94
|
||||||
|
fmt.Println(info.Scanning.Value) // false
|
||||||
|
}
|
||||||
|
|
|
@ -2573,10 +2573,44 @@ func (c *Client) WalletProcessPsbt(
|
||||||
return c.WalletProcessPsbtAsync(psbt, sign, sighashType, bip32Derivs).Receive()
|
return c.WalletProcessPsbtAsync(psbt, sign, sighashType, bip32Derivs).Receive()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FutureGetWalletInfoResult is a future promise to deliver the result of an
|
||||||
|
// GetWalletInfoAsync RPC invocation (or an applicable error).
|
||||||
|
type FutureGetWalletInfoResult chan *response
|
||||||
|
|
||||||
|
// Receive waits for the response promised by the future and returns the result
|
||||||
|
// of wallet state info.
|
||||||
|
func (r FutureGetWalletInfoResult) Receive() (*btcjson.GetWalletInfoResult, error) {
|
||||||
|
res, err := receiveFuture(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var getWalletInfoResult btcjson.GetWalletInfoResult
|
||||||
|
err = json.Unmarshal(res, &getWalletInfoResult)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &getWalletInfoResult, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetWalletInfoAsync returns an instance of a type that can be used to get the result
|
||||||
|
// of the RPC at some future time by invoking the Receive function on the
|
||||||
|
// returned instance.
|
||||||
|
//
|
||||||
|
// See GetWalletInfo for the blocking version and more details.
|
||||||
|
func (c *Client) GetWalletInfoAsync() FutureGetWalletInfoResult {
|
||||||
|
cmd := btcjson.NewGetWalletInfoCmd()
|
||||||
|
return c.sendCmd(cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetWalletInfo returns various wallet state info.
|
||||||
|
func (c *Client) GetWalletInfo() (*btcjson.GetWalletInfoResult, error) {
|
||||||
|
return c.GetWalletInfoAsync().Receive()
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(davec): Implement
|
// TODO(davec): Implement
|
||||||
// backupwallet (NYI in btcwallet)
|
// backupwallet (NYI in btcwallet)
|
||||||
// encryptwallet (Won't be supported by btcwallet since it's always encrypted)
|
// encryptwallet (Won't be supported by btcwallet since it's always encrypted)
|
||||||
// getwalletinfo (NYI in btcwallet or btcjson)
|
|
||||||
// listaddressgroupings (NYI in btcwallet)
|
// listaddressgroupings (NYI in btcwallet)
|
||||||
// listreceivedbyaccount (NYI in btcwallet)
|
// listreceivedbyaccount (NYI in btcwallet)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue