diff --git a/go.mod b/go.mod index 922e18f..fa649d4 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/jholdstock/dcrvsp go 1.13 require ( - decred.org/dcrwallet v1.2.3-0.20200507155221-397dd551e317 + decred.org/dcrwallet v1.2.3-0.20200519180100-f1aa4c354e05 github.com/decred/dcrd/blockchain/stake/v3 v3.0.0-20200511175520-d08cb3f72b3b github.com/decred/dcrd/chaincfg/chainhash v1.0.2 github.com/decred/dcrd/chaincfg/v3 v3.0.0-20200511175520-d08cb3f72b3b diff --git a/go.sum b/go.sum index ab8aa4f..bce3b3c 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= decred.org/cspp v0.3.0/go.mod h1:UygjYilC94dER3BEU65Zzyoqy9ngJfWCD2rdJqvUs2A= -decred.org/dcrwallet v1.2.3-0.20200507155221-397dd551e317 h1:j1fUXpVowoLVVFlaJO7bibK4aSPeQa0EF+nPFuy76Hg= -decred.org/dcrwallet v1.2.3-0.20200507155221-397dd551e317/go.mod h1:V6pzOHJuuWZaUPUZZL2kiyx9Co3lVD0DRqDXJTWA+3c= +decred.org/dcrwallet v1.2.3-0.20200519180100-f1aa4c354e05 h1:xongFmW2UgEOGu4zQ4VcQFduExKVBa+dC4aLRQLCCnQ= +decred.org/dcrwallet v1.2.3-0.20200519180100-f1aa4c354e05/go.mod h1:V6pzOHJuuWZaUPUZZL2kiyx9Co3lVD0DRqDXJTWA+3c= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI= github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= diff --git a/rpc/client.go b/rpc/client.go index 518a973..3ca8969 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -4,13 +4,20 @@ import ( "context" "crypto/tls" "crypto/x509" + "fmt" "sync" + wallettypes "decred.org/dcrwallet/rpc/jsonrpc/types" + dcrdtypes "github.com/decred/dcrd/rpc/jsonrpc/types/v2" "github.com/jrick/wsrpc/v2" ) type Client func() (*wsrpc.Client, error) +const ( + requiredWalletVersion = "8.1.0" +) + // Setup accepts RPC connection details, creates an RPC client, and returns a // function which can be called to access the client. The returned function will // try to handle any client disconnects by attempting to reconnect, but will @@ -72,6 +79,40 @@ func Setup(ctx context.Context, shutdownWg *sync.WaitGroup, user, pass, addr str return nil, err } log.Infof("Dialed RPC websocket %v", addr) + + // Verify dcrwallet at is at the required api version + var verMap map[string]dcrdtypes.VersionResult + err = c.Call(ctx, "version", &verMap) + if err != nil { + c.Close() + return nil, fmt.Errorf("wallet %v version failed: %v", + addr, err) + } + walletVersion, exists := verMap["dcrwalletjsonrpcapi"] + if !exists { + c.Close() + return nil, fmt.Errorf("wallet %v version response "+ + "missing 'dcrwalletjsonrpcapi'", addr) + } + if walletVersion.VersionString != requiredWalletVersion { + c.Close() + return nil, fmt.Errorf("wallet %v is not at the "+ + "proper version: %s != %s", addr, + walletVersion.VersionString, requiredWalletVersion) + } + + // Verify dcrwallet is voting + var walletInfo wallettypes.WalletInfoResult + err = c.Call(ctx, "walletinfo", &walletInfo) + if err != nil { + c.Close() + return nil, err + } + if !walletInfo.Voting || !walletInfo.Unlocked { + c.Close() + return nil, fmt.Errorf("wallet %s has voting disabled", addr) + } + return c, nil } }