func (c *Client) GetBestBlockAsync() FutureGetBestBlockResult {
	cmd := soterjson.NewGetBestBlockCmd()
	return c.sendCmd(cmd)
}
GetBestBlockAsync 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 GetBestBlock for the blocking version and more details.

NOTE: This is a soterd extension.
package rpcclient
import (
	"bytes"
	"encoding/base64"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"github.com/soteria-dag/soterd/soterjson"
	"github.com/soteria-dag/soterd/chaincfg/chainhash"
	"github.com/soteria-dag/soterd/wire"
	"github.com/soteria-dag/soterd/soterutil"
)
type FutureDebugLevelResult chan *response
func (r FutureDebugLevelResult) Receive() (string, error) {
	res, err := receiveFuture(r)
	if err != nil {
		return "", err
	}
	var result string
	err = json.Unmarshal(res, &result)
	if err != nil {
		return "", err
	}
	return result, nil
}
func (c *Client) DebugLevelAsync(levelSpec string) FutureDebugLevelResult {
	cmd := soterjson.NewDebugLevelCmd(levelSpec)
	return c.sendCmd(cmd)
}
func (c *Client) DebugLevel(levelSpec string) (string, error) {
	return c.DebugLevelAsync(levelSpec).Receive()
}
type FutureCreateEncryptedWalletResult chan *response
func (r FutureCreateEncryptedWalletResult) Receive() error {
	_, err := receiveFuture(r)
	return err
}
func (c *Client) CreateEncryptedWalletAsync(passphrase string) FutureCreateEncryptedWalletResult {
	cmd := soterjson.NewCreateEncryptedWalletCmd(passphrase)
	return c.sendCmd(cmd)
}
func (c *Client) CreateEncryptedWallet(passphrase string) error {
	return c.CreateEncryptedWalletAsync(passphrase).Receive()
}
type FutureListAddressTransactionsResult chan *response
func (r FutureListAddressTransactionsResult) Receive() ([]soterjson.ListTransactionsResult, error) {
	res, err := receiveFuture(r)
	if err != nil {
		return nil, err
	}
	var transactions []soterjson.ListTransactionsResult
	err = json.Unmarshal(res, &transactions)
	if err != nil {
		return nil, err
	}
	return transactions, nil
}
func (c *Client) ListAddressTransactionsAsync(addresses []soterutil.Address, account string) FutureListAddressTransactionsResult {
	addrs := make([]string, 0, len(addresses))
	for _, addr := range addresses {
		addrs = append(addrs, addr.EncodeAddress())
	}
	cmd := soterjson.NewListAddressTransactionsCmd(addrs, &account)
	return c.sendCmd(cmd)
}
func (c *Client) ListAddressTransactions(addresses []soterutil.Address, account string) ([]soterjson.ListTransactionsResult, error) {
	return c.ListAddressTransactionsAsync(addresses, account).Receive()
}
type FutureGetBestBlockResult chan *response
func (r FutureGetBestBlockResult) Receive() (*chainhash.Hash, int32, error) {
	res, err := receiveFuture(r)
	if err != nil {
		return nil, 0, err
	}
	var bestBlock soterjson.GetBestBlockResult
	err = json.Unmarshal(res, &bestBlock)
	if err != nil {
		return nil, 0, err
	}
	hash, err := chainhash.NewHashFromStr(bestBlock.Hash)
	if err != nil {
		return nil, 0, err
	}
	return hash, bestBlock.Height, nil
}