2013-11-06 17:10:22 +01:00
|
|
|
// Copyright (c) 2013 Conformal Systems LLC.
|
|
|
|
// Use of this source code is governed by an ISC
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package btcws
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"github.com/conformal/btcdb"
|
|
|
|
"github.com/conformal/btcjson"
|
|
|
|
"github.com/conformal/btcwire"
|
|
|
|
)
|
|
|
|
|
2014-01-24 16:55:36 +01:00
|
|
|
// Help texts
|
|
|
|
const (
|
|
|
|
authenticateHelp = `authenticate "username" "passphrase"
|
2014-01-22 20:11:01 +01:00
|
|
|
Authenticate the websocket with the RPC server. This is only required if the
|
|
|
|
credentials were not already supplied via HTTP auth headers. It must be the
|
2014-01-24 16:55:36 +01:00
|
|
|
first command sent or you will be disconnected.`
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2014-04-11 21:00:22 +02:00
|
|
|
btcjson.RegisterCustomCmd("authenticate", parseAuthenticateCmd, nil,
|
2014-01-24 16:55:36 +01:00
|
|
|
authenticateHelp)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("createencryptedwallet",
|
2014-04-11 21:00:22 +02:00
|
|
|
parseCreateEncryptedWalletCmd, nil, `TODO(jrick) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("exportwatchingwallet",
|
2014-04-11 21:00:22 +02:00
|
|
|
parseExportWatchingWalletCmd, nil, `TODO(jrick) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("getaddressbalance",
|
2014-04-11 21:00:22 +02:00
|
|
|
parseGetAddressBalanceCmd, nil, `TODO(jrick) fillmein`)
|
2014-05-11 09:32:24 +02:00
|
|
|
btcjson.RegisterCustomCmd("getbestblock", parseGetBestBlockCmd,
|
|
|
|
parseGetBestBlockCmdReply, `TODO(jrick) fillmein`)
|
2014-04-11 21:00:22 +02:00
|
|
|
btcjson.RegisterCustomCmd("getcurrentnet", parseGetCurrentNetCmd, nil,
|
2014-01-15 22:51:21 +01:00
|
|
|
`TODO(jrick) fillmein`)
|
|
|
|
btcjson.RegisterCustomCmd("getunconfirmedbalance",
|
2014-04-11 21:00:22 +02:00
|
|
|
parseGetUnconfirmedBalanceCmd, nil, `TODO(jrick) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("listaddresstransactions",
|
2014-04-11 21:03:36 +02:00
|
|
|
parseListAddressTransactionsCmd,
|
|
|
|
parseListAddressTransactionsCmdReply, `TODO(jrick) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("listalltransactions",
|
2014-04-11 21:00:22 +02:00
|
|
|
parseListAllTransactionsCmd, nil, `TODO(jrick) fillmein`)
|
|
|
|
btcjson.RegisterCustomCmd("notifyblocks", parseNotifyBlocksCmd, nil,
|
2014-01-15 22:51:21 +01:00
|
|
|
`TODO(jrick) fillmein`)
|
2014-04-15 02:09:15 +02:00
|
|
|
btcjson.RegisterCustomCmd("notifyreceived", parseNotifyReceivedCmd, nil,
|
2014-01-15 22:51:21 +01:00
|
|
|
`TODO(jrick) fillmein`)
|
2014-04-15 07:02:44 +02:00
|
|
|
btcjson.RegisterCustomCmd("notifynewtransactions",
|
|
|
|
parseNotifyNewTransactionsCmd, nil, `TODO(flam) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("notifyspent", parseNotifySpentCmd,
|
2014-04-11 21:00:22 +02:00
|
|
|
nil, `TODO(jrick) fillmein`)
|
2014-01-23 16:56:20 +01:00
|
|
|
btcjson.RegisterCustomCmd("recoveraddresses", parseRecoverAddressesCmd,
|
2014-04-11 21:00:22 +02:00
|
|
|
nil, `TODO(jrick) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("rescan", parseRescanCmd,
|
2014-04-11 21:00:22 +02:00
|
|
|
nil, `TODO(jrick) fillmein`)
|
2014-01-15 22:51:21 +01:00
|
|
|
btcjson.RegisterCustomCmd("walletislocked", parseWalletIsLockedCmd,
|
2014-04-11 21:00:22 +02:00
|
|
|
nil, `TODO(jrick) fillmein`)
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-01-22 20:11:01 +01:00
|
|
|
// AuthenticateCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of authenticate JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type AuthenticateCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Username string
|
|
|
|
Passphrase string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that AuthenticateCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &AuthenticateCmd{}
|
|
|
|
|
|
|
|
// NewAuthenticateCmd creates a new GetCurrentNetCmd.
|
|
|
|
func NewAuthenticateCmd(id interface{}, username, passphrase string) *AuthenticateCmd {
|
|
|
|
return &AuthenticateCmd{
|
|
|
|
id: id,
|
|
|
|
Username: username,
|
|
|
|
Passphrase: passphrase,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseAuthenticateCmd parses a RawCmd into a concrete type satisifying
|
|
|
|
// the btcjson.Cmd interface. This is used when registering the custom
|
|
|
|
// command with the btcjson parser.
|
|
|
|
func parseAuthenticateCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) != 2 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var username string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &username); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'username' must be " +
|
|
|
|
"a string: " + err.Error())
|
2014-01-22 20:11:01 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var passphrase string
|
|
|
|
if err := json.Unmarshal(r.Params[1], &passphrase); err != nil {
|
|
|
|
return nil, errors.New("second parameter 'passphrase' must " +
|
|
|
|
"be a string: " + err.Error())
|
2014-01-22 20:11:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return NewAuthenticateCmd(r.Id, username, passphrase), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *AuthenticateCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *AuthenticateCmd) Method() string {
|
|
|
|
return "authenticate"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *AuthenticateCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := []interface{}{
|
|
|
|
cmd.Username,
|
|
|
|
cmd.Passphrase,
|
|
|
|
}
|
|
|
|
|
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2014-01-22 20:11:01 +01:00
|
|
|
}
|
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *AuthenticateCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseAuthenticateCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*AuthenticateCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-11-06 17:10:22 +01:00
|
|
|
// GetCurrentNetCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of getcurrentnet JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type GetCurrentNetCmd struct {
|
|
|
|
id interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that GetCurrentNetCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &GetCurrentNetCmd{}
|
|
|
|
|
|
|
|
// NewGetCurrentNetCmd creates a new GetCurrentNetCmd.
|
|
|
|
func NewGetCurrentNetCmd(id interface{}) *GetCurrentNetCmd {
|
|
|
|
return &GetCurrentNetCmd{id: id}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseGetCurrentNetCmd parses a RawCmd into a concrete type satisifying
|
|
|
|
// the btcjson.Cmd interface. This is used when registering the custom
|
|
|
|
// command with the btcjson parser.
|
|
|
|
func parseGetCurrentNetCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) != 0 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
|
|
|
return NewGetCurrentNetCmd(r.Id), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *GetCurrentNetCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *GetCurrentNetCmd) Method() string {
|
|
|
|
return "getcurrentnet"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *GetCurrentNetCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), []interface{}{})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *GetCurrentNetCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseGetCurrentNetCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*GetCurrentNetCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2014-01-21 20:23:36 +01:00
|
|
|
// ExportWatchingWalletCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of exportwatchingwallet JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type ExportWatchingWalletCmd struct {
|
2014-01-22 16:08:09 +01:00
|
|
|
id interface{}
|
|
|
|
Account string
|
|
|
|
Download bool
|
2014-01-21 20:23:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that ExportWatchingWalletCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &ExportWatchingWalletCmd{}
|
|
|
|
|
|
|
|
// NewExportWatchingWalletCmd creates a new ExportWatchingWalletCmd.
|
|
|
|
func NewExportWatchingWalletCmd(id interface{}, optArgs ...interface{}) (*ExportWatchingWalletCmd, error) {
|
|
|
|
if len(optArgs) > 2 {
|
|
|
|
return nil, btcjson.ErrTooManyOptArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optional parameters set to their defaults.
|
|
|
|
account := ""
|
2014-01-22 16:08:09 +01:00
|
|
|
dl := false
|
2014-01-21 20:23:36 +01:00
|
|
|
|
|
|
|
if len(optArgs) > 0 {
|
|
|
|
a, ok := optArgs[0].(string)
|
|
|
|
if !ok {
|
|
|
|
return nil, errors.New("first optarg account must be a string")
|
|
|
|
}
|
|
|
|
account = a
|
|
|
|
}
|
|
|
|
if len(optArgs) > 1 {
|
2014-01-22 16:13:34 +01:00
|
|
|
b, ok := optArgs[1].(bool)
|
2014-01-21 20:23:36 +01:00
|
|
|
if !ok {
|
|
|
|
return nil, errors.New("second optarg zip must be a boolean")
|
|
|
|
}
|
2014-01-22 16:08:09 +01:00
|
|
|
dl = b
|
2014-01-21 20:23:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return &ExportWatchingWalletCmd{
|
2014-01-22 16:08:09 +01:00
|
|
|
id: id,
|
|
|
|
Account: account,
|
|
|
|
Download: dl,
|
2014-01-21 20:23:36 +01:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseExportWatchingWalletCmd parses a RawCmd into a concrete type
|
|
|
|
// satisifying the btcjson.Cmd interface. This is used when registering
|
|
|
|
// the custom command with the btcjson parser.
|
|
|
|
func parseExportWatchingWalletCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
if len(r.Params) > 2 {
|
|
|
|
return nil, btcjson.ErrTooManyOptArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
optArgs := make([]interface{}, 0, 2)
|
|
|
|
if len(r.Params) > 0 {
|
|
|
|
var account string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &account); err != nil {
|
|
|
|
return nil, errors.New("first optional parameter " +
|
|
|
|
" 'account' must be a string: " + err.Error())
|
|
|
|
}
|
|
|
|
optArgs = append(optArgs, account)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(r.Params) > 1 {
|
|
|
|
var download bool
|
|
|
|
if err := json.Unmarshal(r.Params[1], &download); err != nil {
|
|
|
|
return nil, errors.New("second optional parameter " +
|
|
|
|
" 'download' must be a bool: " + err.Error())
|
|
|
|
}
|
|
|
|
optArgs = append(optArgs, download)
|
|
|
|
}
|
|
|
|
|
|
|
|
return NewExportWatchingWalletCmd(r.Id, optArgs...)
|
2014-01-21 20:23:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *ExportWatchingWalletCmd) Id() interface{} {
|
2014-01-21 21:10:12 +01:00
|
|
|
return cmd.id
|
2014-01-21 20:23:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisifies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *ExportWatchingWalletCmd) Method() string {
|
|
|
|
return "exportwatchingwallet"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *ExportWatchingWalletCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 0, 2)
|
2014-01-22 16:08:09 +01:00
|
|
|
if cmd.Account != "" || cmd.Download {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Account)
|
2014-01-21 20:23:36 +01:00
|
|
|
}
|
2014-01-22 16:08:09 +01:00
|
|
|
if cmd.Download {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Download)
|
2014-01-21 20:23:36 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-01-21 20:23:36 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *ExportWatchingWalletCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseExportWatchingWalletCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*ExportWatchingWalletCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-12-30 19:53:43 +01:00
|
|
|
// GetUnconfirmedBalanceCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of getunconfirmedbalance JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type GetUnconfirmedBalanceCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Account string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that GetUnconfirmedBalanceCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &GetUnconfirmedBalanceCmd{}
|
|
|
|
|
|
|
|
// NewGetUnconfirmedBalanceCmd creates a new GetUnconfirmedBalanceCmd.
|
|
|
|
func NewGetUnconfirmedBalanceCmd(id interface{},
|
|
|
|
optArgs ...string) (*GetUnconfirmedBalanceCmd, error) {
|
|
|
|
|
|
|
|
if len(optArgs) > 1 {
|
|
|
|
return nil, btcjson.ErrTooManyOptArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optional parameters set to their defaults.
|
|
|
|
account := ""
|
|
|
|
|
|
|
|
if len(optArgs) == 1 {
|
|
|
|
account = optArgs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
return &GetUnconfirmedBalanceCmd{
|
|
|
|
id: id,
|
|
|
|
Account: account,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseGetUnconfirmedBalanceCmd parses a RawCmd into a concrete type
|
|
|
|
// satisifying the btcjson.Cmd interface. This is used when registering
|
|
|
|
// the custom command with the btcjson parser.
|
|
|
|
func parseGetUnconfirmedBalanceCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) > 1 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs := make([]string, 0, 1)
|
|
|
|
if len(r.Params) > 0 {
|
|
|
|
var account string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &account); err != nil {
|
|
|
|
return nil, errors.New("first optional parameter " +
|
|
|
|
" 'account' must be a string: " + err.Error())
|
|
|
|
}
|
|
|
|
optArgs = append(optArgs, account)
|
2013-12-30 19:53:43 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
return NewGetUnconfirmedBalanceCmd(r.Id, optArgs...)
|
2013-12-30 19:53:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *GetUnconfirmedBalanceCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisifies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *GetUnconfirmedBalanceCmd) Method() string {
|
|
|
|
return "getunconfirmedbalance"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *GetUnconfirmedBalanceCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 0, 1)
|
2013-12-30 19:53:43 +01:00
|
|
|
if cmd.Account != "" {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Account)
|
2013-12-30 19:53:43 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-12-30 19:53:43 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *GetUnconfirmedBalanceCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseGetUnconfirmedBalanceCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*GetUnconfirmedBalanceCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2014-04-10 23:42:28 +02:00
|
|
|
// GetBestBlockResult holds the result of a getbestblock response.
|
|
|
|
type GetBestBlockResult struct {
|
|
|
|
Hash string `json:"hash"`
|
|
|
|
Height int32 `json:"height"`
|
|
|
|
}
|
|
|
|
|
2013-11-06 17:10:22 +01:00
|
|
|
// GetBestBlockCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of getbestblock JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type GetBestBlockCmd struct {
|
|
|
|
id interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that GetBestBlockCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &GetBestBlockCmd{}
|
|
|
|
|
|
|
|
// NewGetBestBlockCmd creates a new GetBestBlock.
|
|
|
|
func NewGetBestBlockCmd(id interface{}) *GetBestBlockCmd {
|
|
|
|
return &GetBestBlockCmd{id: id}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseGetBestBlockCmd parses a RawCmd into a concrete type satisifying
|
|
|
|
// the btcjson.Cmd interface. This is used when registering the custom
|
|
|
|
// command with the btcjson parser.
|
|
|
|
func parseGetBestBlockCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) != 0 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
|
|
|
return NewGetBestBlockCmd(r.Id), nil
|
|
|
|
}
|
|
|
|
|
2014-05-11 09:32:24 +02:00
|
|
|
// parseGetBestBlockCmdReply parses a the reply to a GetBestBlockCmd into a
|
|
|
|
// concrete type and returns it packed into an interface. This is used when
|
|
|
|
// registering the custom command with btcjson.
|
|
|
|
func parseGetBestBlockCmdReply(message json.RawMessage) (interface{}, error) {
|
|
|
|
var res *GetBestBlockResult
|
|
|
|
if err := json.Unmarshal(message, &res); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2013-11-06 17:10:22 +01:00
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *GetBestBlockCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *GetBestBlockCmd) Method() string {
|
|
|
|
return "getbestblock"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *GetBestBlockCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), []interface{}{})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *GetBestBlockCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseGetBestBlockCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*GetBestBlockCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
2014-01-23 16:56:20 +01:00
|
|
|
|
|
|
|
// RecoverAddressesCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of recoveraddresses JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type RecoverAddressesCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Account string
|
|
|
|
N int
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that RecoverAddressesCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &RecoverAddressesCmd{}
|
|
|
|
|
|
|
|
// NewRecoverAddressesCmd creates a new RecoverAddressesCmd.
|
|
|
|
func NewRecoverAddressesCmd(id interface{}, account string, n int) *RecoverAddressesCmd {
|
|
|
|
return &RecoverAddressesCmd{
|
|
|
|
id: id,
|
|
|
|
Account: account,
|
|
|
|
N: n,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseRecoverAddressesCmd parses a RawCmd into a concrete type satisifying
|
|
|
|
// the btcjson.Cmd interface. This is used when registering the custom
|
|
|
|
// command with the btcjson parser.
|
|
|
|
func parseRecoverAddressesCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) != 2 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var account string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &account); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'account' must be a " +
|
|
|
|
"string: " + err.Error())
|
2014-01-23 16:56:20 +01:00
|
|
|
}
|
2014-04-10 21:33:21 +02:00
|
|
|
|
|
|
|
var n int
|
|
|
|
if err := json.Unmarshal(r.Params[1], &n); err != nil {
|
|
|
|
return nil, errors.New("second parameter 'n' must be an " +
|
|
|
|
"integer: " + err.Error())
|
2014-01-23 16:56:20 +01:00
|
|
|
}
|
2014-04-10 21:33:21 +02:00
|
|
|
|
|
|
|
return NewRecoverAddressesCmd(r.Id, account, n), nil
|
2014-01-23 16:56:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *RecoverAddressesCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *RecoverAddressesCmd) Method() string {
|
|
|
|
return "recoveraddresses"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *RecoverAddressesCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := []interface{}{
|
|
|
|
cmd.Account,
|
|
|
|
cmd.N,
|
2014-01-23 16:56:20 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-01-23 16:56:20 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *RecoverAddressesCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseRecoverAddressesCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*RecoverAddressesCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
2013-11-06 17:10:22 +01:00
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
// OutPoint describes a transaction outpoint that will be marshalled to and
|
|
|
|
// from JSON.
|
|
|
|
type OutPoint struct {
|
|
|
|
Hash string `json:"hash"`
|
|
|
|
Index uint32 `json:"index"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewOutPointFromWire creates a new OutPoint from the OutPoint structure
|
|
|
|
// of the btcwire package.
|
|
|
|
func NewOutPointFromWire(op *btcwire.OutPoint) *OutPoint {
|
|
|
|
return &OutPoint{
|
|
|
|
Hash: op.Hash.String(),
|
|
|
|
Index: op.Index,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-11-06 17:10:22 +01:00
|
|
|
// RescanCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of rescan JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type RescanCmd struct {
|
|
|
|
id interface{}
|
|
|
|
BeginBlock int32
|
2014-03-21 20:08:54 +01:00
|
|
|
Addresses []string
|
2014-04-10 21:33:21 +02:00
|
|
|
OutPoints []OutPoint
|
2013-11-06 17:10:22 +01:00
|
|
|
EndBlock int64 // TODO: switch this and btcdb.AllShas to int32
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that RescanCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &RescanCmd{}
|
|
|
|
|
|
|
|
// NewRescanCmd creates a new RescanCmd, parsing the optional
|
|
|
|
// arguments optArgs which may either be empty or a single upper
|
|
|
|
// block height.
|
2014-03-21 20:08:54 +01:00
|
|
|
func NewRescanCmd(id interface{}, begin int32, addresses []string,
|
2014-04-10 21:33:21 +02:00
|
|
|
outpoints []OutPoint, optArgs ...int64) (*RescanCmd, error) {
|
2013-11-06 17:10:22 +01:00
|
|
|
|
|
|
|
// Optional parameters set to their defaults.
|
|
|
|
end := btcdb.AllShas
|
|
|
|
|
|
|
|
if len(optArgs) > 0 {
|
|
|
|
if len(optArgs) > 1 {
|
|
|
|
return nil, btcjson.ErrTooManyOptArgs
|
|
|
|
}
|
|
|
|
end = optArgs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
return &RescanCmd{
|
|
|
|
id: id,
|
|
|
|
BeginBlock: begin,
|
|
|
|
Addresses: addresses,
|
2014-03-21 20:08:54 +01:00
|
|
|
OutPoints: outpoints,
|
2013-11-06 17:10:22 +01:00
|
|
|
EndBlock: end,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseRescanCmd parses a RawCmd into a concrete type satisifying
|
|
|
|
// the btcjson.Cmd interface. This is used when registering the custom
|
|
|
|
// command with the btcjson parser.
|
|
|
|
func parseRescanCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2014-03-21 20:08:54 +01:00
|
|
|
if len(r.Params) < 3 {
|
2013-11-06 17:10:22 +01:00
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var begin int32
|
|
|
|
if err := json.Unmarshal(r.Params[0], &begin); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'begin' must be a " +
|
|
|
|
"32-bit integer: " + err.Error())
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
2014-03-21 20:08:54 +01:00
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var addresses []string
|
|
|
|
if err := json.Unmarshal(r.Params[1], &addresses); err != nil {
|
|
|
|
return nil, errors.New("second parameter 'addresses' must be " +
|
|
|
|
"an array of strings: " + err.Error())
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
2014-03-21 20:08:54 +01:00
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var outpoints []OutPoint
|
|
|
|
if err := json.Unmarshal(r.Params[2], &outpoints); err != nil {
|
|
|
|
return nil, errors.New("third parameter 'outpoints' must be " +
|
|
|
|
"an array of transaction outpoint JSON objects: " +
|
|
|
|
err.Error())
|
2014-03-21 20:08:54 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs := make([]int64, 0, 1)
|
|
|
|
if len(r.Params) > 3 {
|
|
|
|
var endblock int64
|
|
|
|
if err := json.Unmarshal(r.Params[3], &endblock); err != nil {
|
|
|
|
return nil, errors.New("fourth optional parameter " +
|
|
|
|
" 'endblock' must be an integer: " + err.Error())
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs = append(optArgs, endblock)
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
return NewRescanCmd(r.Id, begin, addresses, outpoints, optArgs...)
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *RescanCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *RescanCmd) Method() string {
|
|
|
|
return "rescan"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *RescanCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 3, 4)
|
|
|
|
params[0] = cmd.BeginBlock
|
|
|
|
params[1] = cmd.Addresses
|
|
|
|
params[2] = cmd.OutPoints
|
2013-11-06 17:10:22 +01:00
|
|
|
if cmd.EndBlock != btcdb.AllShas {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.EndBlock)
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-11-06 17:10:22 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *RescanCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseRescanCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*RescanCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
2014-01-17 22:24:21 +01:00
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// NotifyBlocksCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of notifyblocks JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type NotifyBlocksCmd struct {
|
2014-01-21 20:23:36 +01:00
|
|
|
id interface{}
|
2014-01-17 22:24:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that NotifyBlocksCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &NotifyBlocksCmd{}
|
|
|
|
|
|
|
|
// NewNotifyBlocksCmd creates a new NotifyBlocksCmd.
|
|
|
|
func NewNotifyBlocksCmd(id interface{}) *NotifyBlocksCmd {
|
|
|
|
return &NotifyBlocksCmd{
|
2014-01-21 20:23:36 +01:00
|
|
|
id: id,
|
2014-01-17 22:24:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-21 20:23:36 +01:00
|
|
|
// parseNotifyBlocksCmd parses a NotifyBlocksCmd into a concrete type
|
2014-01-17 22:24:21 +01:00
|
|
|
// satisifying the btcjson.Cmd interface. This is used when registering
|
|
|
|
// the custom command with the btcjson parser.
|
2014-01-18 00:38:26 +01:00
|
|
|
func parseNotifyBlocksCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2014-01-21 20:23:36 +01:00
|
|
|
if len(r.Params) != 0 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
return NewNotifyBlocksCmd(r.Id), nil
|
2014-01-17 22:24:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *NotifyBlocksCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *NotifyBlocksCmd) Method() string {
|
|
|
|
return "notifyblocks"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *NotifyBlocksCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), []interface{}{})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2014-01-17 22:24:21 +01:00
|
|
|
}
|
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *NotifyBlocksCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-01-18 00:38:26 +01:00
|
|
|
newCmd, err := parseNotifyBlocksCmd(&r)
|
2014-01-17 22:24:21 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*NotifyBlocksCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2014-04-15 02:09:15 +02:00
|
|
|
// NotifyReceivedCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of notifyreceived JSON websocket extension
|
2013-11-06 17:10:22 +01:00
|
|
|
// commands.
|
2014-04-15 02:09:15 +02:00
|
|
|
type NotifyReceivedCmd struct {
|
2013-11-06 17:10:22 +01:00
|
|
|
id interface{}
|
|
|
|
Addresses []string
|
|
|
|
}
|
|
|
|
|
2014-04-15 02:09:15 +02:00
|
|
|
// Enforce that NotifyReceivedCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &NotifyReceivedCmd{}
|
2013-11-06 17:10:22 +01:00
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
// NewNotifyReceivedCmd creates a new NotifyReceivedCmd.
|
2014-04-15 02:09:15 +02:00
|
|
|
func NewNotifyReceivedCmd(id interface{}, addresses []string) *NotifyReceivedCmd {
|
|
|
|
return &NotifyReceivedCmd{
|
2013-11-06 17:10:22 +01:00
|
|
|
id: id,
|
|
|
|
Addresses: addresses,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-15 02:09:15 +02:00
|
|
|
// parseNotifyReceivedCmd parses a NotifyNewTXsCmd into a concrete type
|
2013-11-06 17:10:22 +01:00
|
|
|
// satisifying the btcjson.Cmd interface. This is used when registering
|
|
|
|
// the custom command with the btcjson parser.
|
2014-04-15 02:09:15 +02:00
|
|
|
func parseNotifyReceivedCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2013-11-06 17:10:22 +01:00
|
|
|
if len(r.Params) != 1 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var addresses []string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &addresses); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'addresses' must be " +
|
|
|
|
"an array of strings: " + err.Error())
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-15 02:09:15 +02:00
|
|
|
return NewNotifyReceivedCmd(r.Id, addresses), nil
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
2014-04-15 02:09:15 +02:00
|
|
|
func (cmd *NotifyReceivedCmd) Id() interface{} {
|
2013-11-06 17:10:22 +01:00
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
2014-04-15 02:09:15 +02:00
|
|
|
func (cmd *NotifyReceivedCmd) Method() string {
|
|
|
|
return "notifyreceived"
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
2014-04-15 02:09:15 +02:00
|
|
|
func (cmd *NotifyReceivedCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := []interface{}{
|
|
|
|
cmd.Addresses,
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-11-06 17:10:22 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
2014-04-15 02:09:15 +02:00
|
|
|
func (cmd *NotifyReceivedCmd) UnmarshalJSON(b []byte) error {
|
2013-11-06 17:10:22 +01:00
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-04-15 02:09:15 +02:00
|
|
|
newCmd, err := parseNotifyReceivedCmd(&r)
|
2013-11-06 17:10:22 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-04-15 02:09:15 +02:00
|
|
|
concreteCmd, ok := newCmd.(*NotifyReceivedCmd)
|
2013-11-06 17:10:22 +01:00
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
// NotifyNewTransactionsCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of notifynewtransactions JSON websocket extension
|
2014-02-08 23:03:22 +01:00
|
|
|
// commands.
|
2014-04-15 07:02:44 +02:00
|
|
|
type NotifyNewTransactionsCmd struct {
|
2014-02-08 23:03:22 +01:00
|
|
|
id interface{}
|
|
|
|
Verbose bool
|
|
|
|
}
|
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
// Enforce that NotifyNewTransactionsCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &NotifyNewTransactionsCmd{}
|
2014-02-08 23:03:22 +01:00
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
// NewNotifyNewTransactionsCmd creates a new NotifyNewTransactionsCmd that
|
|
|
|
// optionally takes a single verbose parameter that defaults to false.
|
|
|
|
func NewNotifyNewTransactionsCmd(id interface{}, optArgs ...bool) (*NotifyNewTransactionsCmd, error) {
|
2014-02-09 00:26:06 +01:00
|
|
|
verbose := false
|
|
|
|
|
|
|
|
optArgsLen := len(optArgs)
|
|
|
|
if optArgsLen > 0 {
|
|
|
|
if optArgsLen > 1 {
|
|
|
|
return nil, btcjson.ErrTooManyOptArgs
|
|
|
|
}
|
|
|
|
verbose = optArgs[0]
|
|
|
|
}
|
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
return &NotifyNewTransactionsCmd{
|
2014-02-08 23:03:22 +01:00
|
|
|
id: id,
|
|
|
|
Verbose: verbose,
|
2014-02-09 00:26:06 +01:00
|
|
|
}, nil
|
2014-02-08 23:03:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
// parseNotifyNewTransactionsCmd parses a NotifyNewTransactionsCmd into a
|
|
|
|
// concrete type satisifying the btcjson.Cmd interface. This is used when
|
|
|
|
// registering the custom command with the btcjson parser.
|
|
|
|
func parseNotifyNewTransactionsCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
if len(r.Params) > 1 {
|
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
2014-02-08 23:03:22 +01:00
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs := make([]bool, 0, 1)
|
|
|
|
if len(r.Params) > 0 {
|
|
|
|
var verbose bool
|
|
|
|
if err := json.Unmarshal(r.Params[0], &verbose); err != nil {
|
|
|
|
return nil, errors.New("first optional parameter " +
|
|
|
|
"'verbose' must be a bool: " + err.Error())
|
2014-02-09 00:26:06 +01:00
|
|
|
}
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs = append(optArgs, verbose)
|
2014-02-09 00:26:06 +01:00
|
|
|
}
|
2014-02-08 23:03:22 +01:00
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
return NewNotifyNewTransactionsCmd(r.Id, optArgs...)
|
2014-02-08 23:03:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
2014-04-15 07:02:44 +02:00
|
|
|
func (cmd *NotifyNewTransactionsCmd) Id() interface{} {
|
2014-02-08 23:03:22 +01:00
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
2014-04-15 07:02:44 +02:00
|
|
|
func (cmd *NotifyNewTransactionsCmd) Method() string {
|
|
|
|
return "notifynewtransactions"
|
2014-02-08 23:03:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
2014-04-15 07:02:44 +02:00
|
|
|
func (cmd *NotifyNewTransactionsCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := []interface{}{
|
|
|
|
cmd.Verbose,
|
2014-02-08 23:03:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-02-08 23:03:22 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
2014-04-15 07:02:44 +02:00
|
|
|
func (cmd *NotifyNewTransactionsCmd) UnmarshalJSON(b []byte) error {
|
2014-02-08 23:03:22 +01:00
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
newCmd, err := parseNotifyNewTransactionsCmd(&r)
|
2014-02-08 23:03:22 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-04-15 07:02:44 +02:00
|
|
|
concreteCmd, ok := newCmd.(*NotifyNewTransactionsCmd)
|
2014-02-08 23:03:22 +01:00
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-11-06 17:10:22 +01:00
|
|
|
// NotifySpentCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of notifyspent JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type NotifySpentCmd struct {
|
2014-05-06 17:49:46 +02:00
|
|
|
id interface{}
|
|
|
|
OutPoints []OutPoint
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that NotifySpentCmd satisifies the btcjson.Cmd interface.
|
|
|
|
var _ btcjson.Cmd = &NotifySpentCmd{}
|
|
|
|
|
2014-01-13 23:16:58 +01:00
|
|
|
// NewNotifySpentCmd creates a new NotifySpentCmd.
|
2014-05-06 17:49:46 +02:00
|
|
|
func NewNotifySpentCmd(id interface{}, outpoints []OutPoint) *NotifySpentCmd {
|
2013-11-06 17:10:22 +01:00
|
|
|
return &NotifySpentCmd{
|
2014-05-06 17:49:46 +02:00
|
|
|
id: id,
|
|
|
|
OutPoints: outpoints,
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseNotifySpentCmd parses a NotifySpentCmd into a concrete type
|
|
|
|
// satisifying the btcjson.Cmd interface. This is used when registering
|
|
|
|
// the custom command with the btcjson parser.
|
|
|
|
func parseNotifySpentCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
if len(r.Params) != 1 {
|
2013-11-06 17:10:22 +01:00
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-05-06 17:49:46 +02:00
|
|
|
var outpoints []OutPoint
|
|
|
|
if err := json.Unmarshal(r.Params[0], &outpoints); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'outpoints' must be a " +
|
|
|
|
"an array of transaction outpoint JSON objects: " +
|
|
|
|
err.Error())
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-05-06 17:49:46 +02:00
|
|
|
return NewNotifySpentCmd(r.Id, outpoints), nil
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *NotifySpentCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *NotifySpentCmd) Method() string {
|
|
|
|
return "notifyspent"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *NotifySpentCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := []interface{}{
|
2014-05-06 17:49:46 +02:00
|
|
|
cmd.OutPoints,
|
2013-11-06 17:10:22 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-11-06 17:10:22 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *NotifySpentCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseNotifySpentCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*NotifySpentCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
2013-11-12 17:57:06 +01:00
|
|
|
|
|
|
|
// CreateEncryptedWalletCmd is a type handling custom
|
|
|
|
// marshaling and unmarshaling of createencryptedwallet
|
|
|
|
// JSON websocket extension commands.
|
|
|
|
type CreateEncryptedWalletCmd struct {
|
2014-01-24 17:14:44 +01:00
|
|
|
id interface{}
|
|
|
|
Passphrase string
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that CreateEncryptedWalletCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &CreateEncryptedWalletCmd{}
|
|
|
|
|
|
|
|
// NewCreateEncryptedWalletCmd creates a new CreateEncryptedWalletCmd.
|
2014-01-24 17:14:44 +01:00
|
|
|
func NewCreateEncryptedWalletCmd(id interface{}, passphrase string) *CreateEncryptedWalletCmd {
|
2013-11-12 17:57:06 +01:00
|
|
|
return &CreateEncryptedWalletCmd{
|
2014-01-24 17:14:44 +01:00
|
|
|
id: id,
|
|
|
|
Passphrase: passphrase,
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseCreateEncryptedWalletCmd parses a CreateEncryptedWalletCmd
|
|
|
|
// into a concrete type satisifying the btcjson.Cmd interface.
|
|
|
|
// This is used when registering the custom command with the btcjson
|
|
|
|
// parser.
|
|
|
|
func parseCreateEncryptedWalletCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
2014-01-24 17:14:44 +01:00
|
|
|
if len(r.Params) != 1 {
|
2013-11-12 17:57:06 +01:00
|
|
|
return nil, btcjson.ErrWrongNumberOfParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var passphrase string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &passphrase); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'passphrase' must be " +
|
|
|
|
"a string: " + err.Error())
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
|
|
|
|
2014-01-24 17:14:44 +01:00
|
|
|
return NewCreateEncryptedWalletCmd(r.Id, passphrase), nil
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *CreateEncryptedWalletCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *CreateEncryptedWalletCmd) Method() string {
|
|
|
|
return "createencryptedwallet"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *CreateEncryptedWalletCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := []interface{}{
|
|
|
|
cmd.Passphrase,
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-11-12 17:57:06 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *CreateEncryptedWalletCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseCreateEncryptedWalletCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*CreateEncryptedWalletCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// WalletIsLockedCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of walletislocked JSON websocket extension commands.
|
|
|
|
type WalletIsLockedCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Account string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that WalletIsLockedCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &WalletIsLockedCmd{}
|
|
|
|
|
|
|
|
// NewWalletIsLockedCmd creates a new WalletIsLockedCmd.
|
|
|
|
func NewWalletIsLockedCmd(id interface{},
|
|
|
|
optArgs ...string) (*WalletIsLockedCmd, error) {
|
|
|
|
|
|
|
|
// Optional arguments set to their default values.
|
|
|
|
account := ""
|
|
|
|
|
|
|
|
if len(optArgs) > 1 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(optArgs) == 1 {
|
|
|
|
account = optArgs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
return &WalletIsLockedCmd{
|
|
|
|
id: id,
|
|
|
|
Account: account,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseWalletIsLockedCmd parses a WalletIsLockedCmd into a concrete
|
|
|
|
// type satisifying the btcjson.Cmd interface. This is used when
|
|
|
|
// registering the custom command with the btcjson parser.
|
|
|
|
func parseWalletIsLockedCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) > 1 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(r.Params) == 0 {
|
|
|
|
return NewWalletIsLockedCmd(r.Id)
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var account string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &account); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'account' must be a " +
|
|
|
|
"string: " + err.Error())
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
2014-04-10 21:33:21 +02:00
|
|
|
|
2013-11-12 17:57:06 +01:00
|
|
|
return NewWalletIsLockedCmd(r.Id, account)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *WalletIsLockedCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *WalletIsLockedCmd) Method() string {
|
|
|
|
return "walletislocked"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *WalletIsLockedCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 0, 1)
|
2013-11-12 17:57:06 +01:00
|
|
|
if cmd.Account != "" {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Account)
|
2013-11-12 17:57:06 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-11-12 17:57:06 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *WalletIsLockedCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseWalletIsLockedCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*WalletIsLockedCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
2013-12-02 20:59:09 +01:00
|
|
|
|
2014-02-04 23:04:05 +01:00
|
|
|
// ListAddressTransactionsCmd is a type handling custom marshaling and
|
|
|
|
// unmarshaling of listaddresstransactions JSON websocket extension commands.
|
2013-12-20 21:00:31 +01:00
|
|
|
type ListAddressTransactionsCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Account string
|
|
|
|
Addresses []string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that ListAddressTransactionsCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &ListAddressTransactionsCmd{}
|
|
|
|
|
|
|
|
// NewListAddressTransactionsCmd creates a new ListAddressTransactionsCmd.
|
|
|
|
func NewListAddressTransactionsCmd(id interface{}, addresses []string,
|
|
|
|
optArgs ...string) (*ListAddressTransactionsCmd, error) {
|
|
|
|
|
|
|
|
if len(optArgs) > 1 {
|
|
|
|
return nil, btcjson.ErrTooManyOptArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optional arguments set to their default values.
|
|
|
|
account := ""
|
|
|
|
|
|
|
|
if len(optArgs) == 1 {
|
|
|
|
account = optArgs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
return &ListAddressTransactionsCmd{
|
|
|
|
id: id,
|
|
|
|
Account: account,
|
|
|
|
Addresses: addresses,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseListAddressTransactionsCmd parses a ListAddressTransactionsCmd into
|
|
|
|
// a concrete type satisifying the btcjson.Cmd interface. This is used
|
|
|
|
// when registering the custom command with the btcjson parser.
|
|
|
|
func parseListAddressTransactionsCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) == 0 || len(r.Params) > 2 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var addresses []string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &addresses); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'addresses' must be " +
|
|
|
|
"an array of strings: " + err.Error())
|
2013-12-20 21:00:31 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs := make([]string, 0, 1)
|
|
|
|
if len(r.Params) > 1 {
|
|
|
|
var account string
|
|
|
|
if err := json.Unmarshal(r.Params[1], &account); err != nil {
|
|
|
|
return nil, errors.New("second optional parameter " +
|
|
|
|
"'account' must be a string: " + err.Error())
|
|
|
|
}
|
|
|
|
optArgs = append(optArgs, account)
|
2013-12-20 21:00:31 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
return NewListAddressTransactionsCmd(r.Id, addresses, optArgs...)
|
2013-12-20 21:00:31 +01:00
|
|
|
}
|
|
|
|
|
2014-04-11 21:03:36 +02:00
|
|
|
// parseListAddressTransactionsCmdReply parses a the reply to a
|
|
|
|
// ListAddressTransactionsCmd into a concrete type and returns it packed into
|
|
|
|
// an interface. This is used when registering the custom command with btcjson.
|
|
|
|
func parseListAddressTransactionsCmdReply(message json.RawMessage) (interface{}, error) {
|
|
|
|
var res []btcjson.ListTransactionsResult
|
|
|
|
if err := json.Unmarshal(message, &res); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2013-12-20 21:00:31 +01:00
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *ListAddressTransactionsCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *ListAddressTransactionsCmd) Method() string {
|
|
|
|
return "listaddresstransactions"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *ListAddressTransactionsCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 1, 2)
|
|
|
|
params[0] = cmd.Addresses
|
2013-12-20 21:00:31 +01:00
|
|
|
if cmd.Account != "" {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Account)
|
2013-12-20 21:00:31 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-12-20 21:00:31 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *ListAddressTransactionsCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseListAddressTransactionsCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*ListAddressTransactionsCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-12-02 20:59:09 +01:00
|
|
|
// ListAllTransactionsCmd is a type handling custom marshaling and
|
2013-12-02 21:05:16 +01:00
|
|
|
// unmarshaling of listalltransactions JSON websocket extension commands.
|
2013-12-02 20:59:09 +01:00
|
|
|
type ListAllTransactionsCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Account string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that ListAllTransactionsCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &ListAllTransactionsCmd{}
|
|
|
|
|
|
|
|
// NewListAllTransactionsCmd creates a new ListAllTransactionsCmd.
|
|
|
|
func NewListAllTransactionsCmd(id interface{},
|
|
|
|
optArgs ...string) (*ListAllTransactionsCmd, error) {
|
|
|
|
|
|
|
|
// Optional arguments set to their default values.
|
|
|
|
account := ""
|
|
|
|
|
|
|
|
if len(optArgs) > 1 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(optArgs) == 1 {
|
|
|
|
account = optArgs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
return &ListAllTransactionsCmd{
|
|
|
|
id: id,
|
|
|
|
Account: account,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseListAllTransactionsCmd parses a ListAllTransactionsCmd into a concrete
|
|
|
|
// type satisifying the btcjson.Cmd interface. This is used when
|
|
|
|
// registering the custom command with the btcjson parser.
|
|
|
|
func parseListAllTransactionsCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
if len(r.Params) > 1 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs := make([]string, 0, 1)
|
|
|
|
if len(r.Params) > 0 {
|
|
|
|
var account string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &account); err != nil {
|
|
|
|
return nil, errors.New("first optional parameter " +
|
|
|
|
"'account' must be a string: " + err.Error())
|
|
|
|
}
|
|
|
|
optArgs = append(optArgs, account)
|
2013-12-02 20:59:09 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
return NewListAllTransactionsCmd(r.Id, optArgs...)
|
2013-12-02 20:59:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *ListAllTransactionsCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *ListAllTransactionsCmd) Method() string {
|
|
|
|
return "listalltransactions"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *ListAllTransactionsCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 0, 1)
|
2013-12-02 20:59:09 +01:00
|
|
|
if cmd.Account != "" {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Account)
|
2013-12-02 20:59:09 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-12-02 20:59:09 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *ListAllTransactionsCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
newCmd, err := parseListAllTransactionsCmd(&r)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*ListAllTransactionsCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|
2013-12-10 22:14:35 +01:00
|
|
|
|
|
|
|
// GetAddressBalanceCmd is a type handling custom marshaling
|
|
|
|
// and unmarshaling of getaddressbalance JSON websocket extension
|
|
|
|
// commands.
|
|
|
|
type GetAddressBalanceCmd struct {
|
|
|
|
id interface{}
|
|
|
|
Address string
|
|
|
|
Minconf int
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enforce that GetAddressBalanceCmd satisifies the btcjson.Cmd
|
|
|
|
// interface.
|
|
|
|
var _ btcjson.Cmd = &GetAddressBalanceCmd{}
|
|
|
|
|
|
|
|
// parseGetAddressBalanceCmd parses a GetAddressBalanceCmd into a concrete
|
|
|
|
// type satisifying the btcjson.Cmd interface. This is used when
|
|
|
|
// registering the custom command with the btcjson parser.
|
|
|
|
func parseGetAddressBalanceCmd(r *btcjson.RawCmd) (btcjson.Cmd, error) {
|
|
|
|
// Length of param slice must be minimum 1 (one required parameter)
|
|
|
|
// and maximum 2 (1 optional parameter).
|
|
|
|
if len(r.Params) < 1 || len(r.Params) > 2 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
var address string
|
|
|
|
if err := json.Unmarshal(r.Params[0], &address); err != nil {
|
|
|
|
return nil, errors.New("first parameter 'address' must be a " +
|
|
|
|
" string: " + err.Error())
|
2013-12-10 22:14:35 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
optArgs := make([]int, 0, 1)
|
|
|
|
if len(r.Params) > 1 {
|
|
|
|
var minConf int
|
|
|
|
if err := json.Unmarshal(r.Params[1], &minConf); err != nil {
|
|
|
|
return nil, errors.New("second optional parameter " +
|
|
|
|
" 'minconf' must be an integer: " + err.Error())
|
|
|
|
}
|
|
|
|
optArgs = append(optArgs, minConf)
|
2013-12-10 22:14:35 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
return NewGetAddressBalanceCmd(r.Id, address, optArgs...)
|
2013-12-10 22:14:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewGetAddressBalanceCmd creates a new GetAddressBalanceCmd.
|
|
|
|
func NewGetAddressBalanceCmd(id interface{}, address string,
|
|
|
|
optArgs ...int) (*GetAddressBalanceCmd, error) {
|
|
|
|
|
|
|
|
// Optional arguments set to their default values.
|
|
|
|
minconf := 1
|
|
|
|
|
|
|
|
if len(optArgs) > 1 {
|
|
|
|
return nil, btcjson.ErrInvalidParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(optArgs) == 1 {
|
|
|
|
minconf = optArgs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
return &GetAddressBalanceCmd{
|
|
|
|
id: id,
|
|
|
|
Address: address,
|
|
|
|
Minconf: minconf,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Id satisifies the Cmd interface by returning the ID of the command.
|
|
|
|
func (cmd *GetAddressBalanceCmd) Id() interface{} {
|
|
|
|
return cmd.id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Method satisfies the Cmd interface by returning the RPC method.
|
|
|
|
func (cmd *GetAddressBalanceCmd) Method() string {
|
|
|
|
return "getaddressbalance"
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON returns the JSON encoding of cmd. Part of the Cmd interface.
|
|
|
|
func (cmd *GetAddressBalanceCmd) MarshalJSON() ([]byte, error) {
|
2014-04-10 21:33:21 +02:00
|
|
|
params := make([]interface{}, 1, 2)
|
|
|
|
params[0] = cmd.Address
|
2013-12-10 22:14:35 +01:00
|
|
|
if cmd.Minconf != 1 {
|
2014-04-10 21:33:21 +02:00
|
|
|
params = append(params, cmd.Minconf)
|
2013-12-10 22:14:35 +01:00
|
|
|
}
|
|
|
|
|
2014-04-10 21:33:21 +02:00
|
|
|
raw, err := btcjson.NewRawCmd(cmd.id, cmd.Method(), params)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-12-10 22:14:35 +01:00
|
|
|
return json.Marshal(raw)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals the JSON encoding of cmd into cmd. Part of
|
|
|
|
// the Cmd interface.
|
|
|
|
func (cmd *GetAddressBalanceCmd) UnmarshalJSON(b []byte) error {
|
|
|
|
// Unmarshal into a RawCmd.
|
|
|
|
var r btcjson.RawCmd
|
|
|
|
if err := json.Unmarshal(b, &r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-04-11 16:04:53 +02:00
|
|
|
newCmd, err := parseGetAddressBalanceCmd(&r)
|
2013-12-10 22:14:35 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
concreteCmd, ok := newCmd.(*GetAddressBalanceCmd)
|
|
|
|
if !ok {
|
|
|
|
return btcjson.ErrInternal
|
|
|
|
}
|
|
|
|
*cmd = *concreteCmd
|
|
|
|
return nil
|
|
|
|
}
|