diff --git a/client/asset/btc/btc.go b/client/asset/btc/btc.go index 7340176e50..7fb83607e8 100644 --- a/client/asset/btc/btc.go +++ b/client/asset/btc/btc.go @@ -30,7 +30,7 @@ import ( "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcutil" - "github.com/decred/dcrd/rpcclient/v6" + "github.com/decred/dcrd/rpcclient/v7" ) const ( diff --git a/client/asset/dcr/config.go b/client/asset/dcr/config.go index 4aba8013ea..b4f1e20117 100644 --- a/client/asset/dcr/config.go +++ b/client/asset/dcr/config.go @@ -11,7 +11,7 @@ import ( "decred.org/dcrdex/dex" "decred.org/dcrdex/dex/config" "github.com/decred/dcrd/chaincfg/v3" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" ) const ( diff --git a/client/asset/dcr/dcr.go b/client/asset/dcr/dcr.go index e66bbc5e3b..5c99c0813b 100644 --- a/client/asset/dcr/dcr.go +++ b/client/asset/dcr/dcr.go @@ -26,18 +26,18 @@ import ( "decred.org/dcrdex/dex" "decred.org/dcrdex/dex/calc" dexdcr "decred.org/dcrdex/dex/networks/dcr" - "decred.org/dcrwallet/rpc/client/dcrwallet" - walletjson "decred.org/dcrwallet/rpc/jsonrpc/types" + "decred.org/dcrwallet/v2/rpc/client/dcrwallet" + walletjson "decred.org/dcrwallet/v2/rpc/jsonrpc/types" "github.com/decred/dcrd/chaincfg/chainhash" "github.com/decred/dcrd/chaincfg/v3" "github.com/decred/dcrd/dcrec" "github.com/decred/dcrd/dcrec/secp256k1/v3" "github.com/decred/dcrd/dcrec/secp256k1/v3/ecdsa" "github.com/decred/dcrd/dcrjson/v3" - "github.com/decred/dcrd/dcrutil/v3" - chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v2" - "github.com/decred/dcrd/rpcclient/v6" - "github.com/decred/dcrd/txscript/v3" + "github.com/decred/dcrd/dcrutil/v4" + chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v3" + "github.com/decred/dcrd/rpcclient/v7" + "github.com/decred/dcrd/txscript/v4" "github.com/decred/dcrd/wire" ) @@ -66,7 +66,7 @@ const ( var ( requiredWalletVersion = dex.Semver{Major: 8, Minor: 4, Patch: 0} - requiredNodeVersion = dex.Semver{Major: 6, Minor: 1, Patch: 2} + requiredNodeVersion = dex.Semver{Major: 7, Minor: 0, Patch: 0} ) var ( @@ -149,10 +149,10 @@ var ( // rpcClient is an rpcclient.Client, or a stub for testing. type rpcClient interface { - EstimateSmartFee(ctx context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (float64, error) + EstimateSmartFee(ctx context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (*chainjson.EstimateSmartFeeResult, error) GetBlockChainInfo(ctx context.Context) (*chainjson.GetBlockChainInfoResult, error) SendRawTransaction(ctx context.Context, tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) - GetTxOut(ctx context.Context, txHash *chainhash.Hash, index uint32, mempool bool) (*chainjson.GetTxOutResult, error) + GetTxOut(ctx context.Context, txHash *chainhash.Hash, index uint32, tree int8, mempool bool) (*chainjson.GetTxOutResult, error) GetBalanceMinConf(ctx context.Context, account string, minConfirms int) (*walletjson.GetBalanceResult, error) GetBestBlock(ctx context.Context) (*chainhash.Hash, int64, error) GetBlockHash(ctx context.Context, blockHeight int64) (*chainhash.Hash, error) @@ -677,11 +677,11 @@ func (dcr *ExchangeWallet) feeRate(confTarget uint64) (uint64, error) { if confTarget < 2 { confTarget = 2 } - dcrPerKB, err := dcr.node.EstimateSmartFee(dcr.ctx, int64(confTarget), chainjson.EstimateSmartFeeConservative) + estimateFeeResult, err := dcr.node.EstimateSmartFee(dcr.ctx, int64(confTarget), chainjson.EstimateSmartFeeConservative) if err != nil { return 0, translateRPCCancelErr(err) } - atomsPerKB, err := dcrutil.NewAmount(dcrPerKB) // satPerKB is 0 when err != nil + atomsPerKB, err := dcrutil.NewAmount(estimateFeeResult.FeeRate) // satPerKB is 0 when err != nil if err != nil { return 0, err } @@ -1230,7 +1230,7 @@ func (dcr *ExchangeWallet) FundingCoins(ids []dex.Bytes) (asset.Coins, error) { if !notFound[pt] { continue } - txOut, err := dcr.node.GetTxOut(dcr.ctx, txHash, output.Vout, true) + txOut, err := dcr.getTxOut(txHash, output.Vout, true) if err != nil { return nil, fmt.Errorf("gettxout error for locked output %v: %w", pt.String(), translateRPCCancelErr(err)) } @@ -1499,7 +1499,7 @@ func (dcr *ExchangeWallet) SignMessage(coin asset.Coin, msg dex.Bytes) (pubkeys, addr = fCoin.addr } else { // Check if we can get the address from gettxout. - txOut, err := dcr.node.GetTxOut(dcr.ctx, op.txHash(), op.vout(), true) + txOut, err := dcr.getTxOut(op.txHash(), op.vout(), true) if err == nil && txOut != nil { addrs := txOut.ScriptPubKey.Addresses if len(addrs) != 1 { @@ -1547,7 +1547,7 @@ func (dcr *ExchangeWallet) AuditContract(coinID, contract dex.Bytes) (*asset.Aud return nil, fmt.Errorf("error extracting swap addresses: %w", err) } // Get the contracts P2SH address from the tx output's pubkey script. - txOut, err := dcr.node.GetTxOut(dcr.ctx, txHash, vout, true) + txOut, err := dcr.getTxOut(txHash, vout, true) if err != nil { return nil, fmt.Errorf("error finding unspent contract: %w", translateRPCCancelErr(err)) } @@ -1957,7 +1957,7 @@ func (dcr *ExchangeWallet) Refund(coinID, contract dex.Bytes) (dex.Bytes, error) return nil, err } // Grab the unspent output to make sure it's good and to get the value. - utxo, err := dcr.node.GetTxOut(dcr.ctx, txHash, vout, true) + utxo, err := dcr.getTxOut(txHash, vout, true) if err != nil { return nil, fmt.Errorf("error finding unspent contract: %w", translateRPCCancelErr(err)) } @@ -2112,7 +2112,7 @@ func (dcr *ExchangeWallet) Confirmations(ctx context.Context, id dex.Bytes) (con return 0, false, err } // Check for an unspent output. - txOut, err := dcr.node.GetTxOut(ctx, txHash, vout, true) + txOut, err := dcr.getTxOut(txHash, vout, true) if err == nil && txOut != nil { return uint32(txOut.Confirmations), false, nil } @@ -2245,6 +2245,16 @@ func (dcr *ExchangeWallet) lockedAtoms() (uint64, error) { return sum, nil } +// getTxOut attempts to find the specified txout from the regular tree and if +// not found in the regular tree, checks the stake tree. +func (dcr *ExchangeWallet) getTxOut(txHash *chainhash.Hash, index uint32, mempool bool) (*chainjson.GetTxOutResult, error) { + txout, err := dcr.node.GetTxOut(dcr.ctx, txHash, index, wire.TxTreeRegular, mempool) // check regular tree first + if err == nil && txout == nil { + txout, err = dcr.node.GetTxOut(dcr.ctx, txHash, index, wire.TxTreeStake, mempool) // check stake tree + } + return txout, err +} + // convertCoin converts the asset.Coin to an unspent output. func (dcr *ExchangeWallet) convertCoin(coin asset.Coin) (*output, error) { op, _ := coin.(*output) @@ -2255,7 +2265,7 @@ func (dcr *ExchangeWallet) convertCoin(coin asset.Coin) (*output, error) { if err != nil { return nil, err } - txOut, err := dcr.node.GetTxOut(dcr.ctx, txHash, vout, true) + txOut, err := dcr.getTxOut(txHash, vout, true) if err != nil { return nil, fmt.Errorf("error finding unspent output %s:%d: %w", txHash, vout, translateRPCCancelErr(err)) } diff --git a/client/asset/dcr/dcr_test.go b/client/asset/dcr/dcr_test.go index 97f049d628..4a93affb5e 100644 --- a/client/asset/dcr/dcr_test.go +++ b/client/asset/dcr/dcr_test.go @@ -19,16 +19,16 @@ import ( "decred.org/dcrdex/dex" "decred.org/dcrdex/dex/calc" dexdcr "decred.org/dcrdex/dex/networks/dcr" - "decred.org/dcrwallet/rpc/client/dcrwallet" - walletjson "decred.org/dcrwallet/rpc/jsonrpc/types" + "decred.org/dcrwallet/v2/rpc/client/dcrwallet" + walletjson "decred.org/dcrwallet/v2/rpc/jsonrpc/types" "github.com/decred/dcrd/chaincfg/chainhash" "github.com/decred/dcrd/chaincfg/v3" "github.com/decred/dcrd/dcrec" "github.com/decred/dcrd/dcrec/secp256k1/v3" "github.com/decred/dcrd/dcrec/secp256k1/v3/ecdsa" - "github.com/decred/dcrd/dcrutil/v3" - chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v2" - "github.com/decred/dcrd/txscript/v3" + "github.com/decred/dcrd/dcrutil/v4" + chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v3" + "github.com/decred/dcrd/txscript/v4" "github.com/decred/dcrd/wire" ) @@ -237,13 +237,13 @@ func newTRPCClient() *tRPCClient { } } -func (c *tRPCClient) EstimateSmartFee(_ context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (float64, error) { +func (c *tRPCClient) EstimateSmartFee(_ context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (*chainjson.EstimateSmartFeeResult, error) { if c.estFeeErr != nil { - return 0, c.estFeeErr + return nil, c.estFeeErr } - optimalRate := float64(optimalFeeRate) * 1e-5 + optimalRate := float64(optimalFeeRate) * 1e-5 // optimalFeeRate: 22 atoms/byte = 0.00022 DCR/KB * 1e8 atoms/DCR * 1e-3 KB/Byte // fmt.Println((float64(optimalFeeRate)*1e-5)-0.00022) - return optimalRate, nil // optimalFeeRate: 22 atoms/byte = 0.00022 DCR/KB * 1e8 atoms/DCR * 1e-3 KB/Byte + return &chainjson.EstimateSmartFeeResult{FeeRate: optimalRate}, nil } func (c *tRPCClient) GetBlockChainInfo(_ context.Context) (*chainjson.GetBlockChainInfoResult, error) { @@ -259,7 +259,7 @@ func (c *tRPCClient) SendRawTransaction(_ context.Context, tx *wire.MsgTx, allow return c.sendRawHash, c.sendRawErr } -func (c *tRPCClient) GetTxOut(_ context.Context, txHash *chainhash.Hash, vout uint32, mempool bool) (*chainjson.GetTxOutResult, error) { +func (c *tRPCClient) GetTxOut(_ context.Context, txHash *chainhash.Hash, vout uint32, tree int8, mempool bool) (*chainjson.GetTxOutResult, error) { return c.txOutRes[newOutPoint(txHash, vout)], c.txOutErr } diff --git a/client/cmd/dexc/config.go b/client/cmd/dexc/config.go index 46c77b0b36..f25e6ed8ab 100644 --- a/client/cmd/dexc/config.go +++ b/client/cmd/dexc/config.go @@ -14,7 +14,7 @@ import ( "decred.org/dcrdex/client/cmd/dexc/version" "decred.org/dcrdex/dex" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" flags "github.com/jessevdk/go-flags" ) diff --git a/client/cmd/dexcctl/config.go b/client/cmd/dexcctl/config.go index d39c6aa2d5..d5c59b7919 100644 --- a/client/cmd/dexcctl/config.go +++ b/client/cmd/dexcctl/config.go @@ -15,7 +15,7 @@ import ( flags "github.com/jessevdk/go-flags" "decred.org/dcrdex/client/rpcserver" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" ) const ( diff --git a/dex/networks/dcr/script.go b/dex/networks/dcr/script.go index afc8c380ab..9a2b5b3069 100644 --- a/dex/networks/dcr/script.go +++ b/dex/networks/dcr/script.go @@ -11,11 +11,11 @@ import ( "fmt" "decred.org/dcrdex/dex" - "decred.org/dcrwallet/wallet/txsizes" + "decred.org/dcrwallet/v2/wallet/txsizes" "github.com/decred/dcrd/chaincfg/v3" "github.com/decred/dcrd/dcrec" - "github.com/decred/dcrd/dcrutil/v3" - "github.com/decred/dcrd/txscript/v3" + "github.com/decred/dcrd/dcrutil/v4" + "github.com/decred/dcrd/txscript/v4" "github.com/decred/dcrd/wire" ) diff --git a/dex/networks/dcr/script_test.go b/dex/networks/dcr/script_test.go index 1be482231a..2d4a5e3a23 100644 --- a/dex/networks/dcr/script_test.go +++ b/dex/networks/dcr/script_test.go @@ -13,8 +13,8 @@ import ( "github.com/decred/dcrd/chaincfg/v3" "github.com/decred/dcrd/dcrec" "github.com/decred/dcrd/dcrec/secp256k1/v3" - "github.com/decred/dcrd/dcrutil/v3" - "github.com/decred/dcrd/txscript/v3" + "github.com/decred/dcrd/dcrutil/v4" + "github.com/decred/dcrd/txscript/v4" "github.com/decred/dcrd/wire" ) diff --git a/docs/examples/rpcclient/main.go b/docs/examples/rpcclient/main.go index 19ddfdeaf0..123fef28d7 100644 --- a/docs/examples/rpcclient/main.go +++ b/docs/examples/rpcclient/main.go @@ -18,7 +18,7 @@ import ( "decred.org/dcrdex/client/rpcserver" "decred.org/dcrdex/dex/msgjson" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" "github.com/gorilla/websocket" ) diff --git a/go.mod b/go.mod index b4e4eb7a15..73b8d1d6d4 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,11 @@ module decred.org/dcrdex go 1.14 require ( - decred.org/dcrwallet v1.6.0-rc4 + decred.org/dcrwallet/v2 v2.0.0-20210129212301-69cae76621d1 github.com/btcsuite/btcd v0.20.1-beta.0.20200615134404-e4f59022a387 github.com/btcsuite/btcutil v1.0.2 github.com/davecgh/go-spew v1.1.1 - github.com/decred/dcrd/blockchain/stake/v3 v3.0.0 + github.com/decred/dcrd/blockchain/stake/v4 v4.0.0-20210129220646-5834ce08e290 github.com/decred/dcrd/certgen v1.1.1 github.com/decred/dcrd/chaincfg/chainhash v1.0.2 github.com/decred/dcrd/chaincfg/v3 v3.0.0 @@ -16,11 +16,11 @@ require ( github.com/decred/dcrd/dcrec/edwards/v2 v2.0.1 github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 github.com/decred/dcrd/dcrjson/v3 v3.1.0 - github.com/decred/dcrd/dcrutil/v3 v3.0.0 + github.com/decred/dcrd/dcrutil/v4 v4.0.0-20210129220646-5834ce08e290 github.com/decred/dcrd/hdkeychain/v3 v3.0.0 - github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.3.0 - github.com/decred/dcrd/rpcclient/v6 v6.0.2 - github.com/decred/dcrd/txscript/v3 v3.0.0 + github.com/decred/dcrd/rpc/jsonrpc/types/v3 v3.0.0-20210129220646-5834ce08e290 + github.com/decred/dcrd/rpcclient/v7 v7.0.0-20210129220646-5834ce08e290 + github.com/decred/dcrd/txscript/v4 v4.0.0-20210129220646-5834ce08e290 github.com/decred/dcrd/wire v1.4.0 github.com/decred/go-socks v1.1.0 github.com/decred/slog v1.1.0 diff --git a/go.sum b/go.sum index 0b3c5b8138..d967a3905e 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.6.0-rc4 h1:5IT6mFa+2YMqenu6aE2LetD0N8QSUVFyAFl205PvIIE= -decred.org/dcrwallet v1.6.0-rc4/go.mod h1:lsrNbuKxkPGeHXPufxNTckwQopCEDz0r3t0a8JCKAmU= +decred.org/dcrwallet/v2 v2.0.0-20210129212301-69cae76621d1 h1:UTev1ywAZaCqiqIX/knNDw0sev34YzU34E0pnFrSisE= +decred.org/dcrwallet/v2 v2.0.0-20210129212301-69cae76621d1/go.mod h1:a/gCARd0EX8yS4iML21MQME75+bxtaGqVKjgCPAXeno= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OpenBazaar/jsonpb v0.0.0-20171123000858-37d32ddf4eef/go.mod h1:55mCznBcN9WQgrtgaAkv+p2LxeW/tQRdidyyE9D0I5k= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= @@ -39,10 +39,12 @@ github.com/dchest/siphash v1.2.2/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBl github.com/decred/base58 v1.0.3 h1:KGZuh8d1WEMIrK0leQRM47W85KqCAdl2N+uagbctdDI= github.com/decred/base58 v1.0.3/go.mod h1:pXP9cXCfM2sFLb2viz2FNIdeMWmZDBKG3ZBYbiSM78E= github.com/decred/dcrd/addrmgr v1.2.0/go.mod h1:QlZF9vkzwYh0qs25C76SAFZBRscjETga/K28GEE6qIc= -github.com/decred/dcrd/blockchain/stake/v3 v3.0.0 h1:vr0o0ICjuEzg1End6YtBfwgDuPkg+FYIwGVEz18kFg0= github.com/decred/dcrd/blockchain/stake/v3 v3.0.0/go.mod h1:5GIUwsrHQCJauacgCegIR6t92SaeVi28Qls/BLN9vOw= +github.com/decred/dcrd/blockchain/stake/v4 v4.0.0-20210129192908-660d0518b4cf/go.mod h1:zALtZt59lCrhoj6dVMptHHAMw1hq0Zz9s2ZULWjhtZs= +github.com/decred/dcrd/blockchain/stake/v4 v4.0.0-20210129220646-5834ce08e290 h1:IsABUVl6wuwUSOHiYKXodMht04wyRV0US/6HTXsXKyM= +github.com/decred/dcrd/blockchain/stake/v4 v4.0.0-20210129220646-5834ce08e290/go.mod h1:zALtZt59lCrhoj6dVMptHHAMw1hq0Zz9s2ZULWjhtZs= github.com/decred/dcrd/blockchain/standalone/v2 v2.0.0/go.mod h1:t2qaZ3hNnxHZ5kzVJDgW5sp47/8T5hYJt7SR+/JtRhI= -github.com/decred/dcrd/blockchain/v3 v3.0.2/go.mod h1:LD5VA95qdb+DlRiPI8VLBimDqvlDCAJsidZ5oD6nc/U= +github.com/decred/dcrd/blockchain/v4 v4.0.0-20210129200153-14fd1a785bf2/go.mod h1:AwWyfS769nQVXTbfwrSVsAMAwkpoU1N//6XYkYwXJUU= github.com/decred/dcrd/certgen v1.1.1 h1:MYPG5jCysnbF4OiJ1++YumFEu2p/MsM/zxmmqC9mVFg= github.com/decred/dcrd/certgen v1.1.1/go.mod h1:ivkPLChfjdAgFh7ZQOtl6kJRqVkfrCq67dlq3AbZBQE= github.com/decred/dcrd/chaincfg/chainhash v1.0.2 h1:rt5Vlq/jM3ZawwiacWjPa+smINyLRN07EO0cNBV6DGU= @@ -54,28 +56,39 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/ripemd160 v1.0.1 h1:TjRL4LfftzTjXzaufov96iDAkbY2R3aTvH2YMYa1IOc= github.com/decred/dcrd/crypto/ripemd160 v1.0.1/go.mod h1:F0H8cjIuWTRoixr/LM3REB8obcWkmYx0gbxpQWR8RPg= -github.com/decred/dcrd/database/v2 v2.0.2 h1:t1ch4sk2qIhxGcAmWQJkFwsbqKITEcVa8E+BFpxOf7s= github.com/decred/dcrd/database/v2 v2.0.2/go.mod h1:S78KbTCCJWUTJDVTByiQuB+HmL0DM2vIMsa2WsrF9KM= +github.com/decred/dcrd/database/v2 v2.0.3-0.20210129190127-4ebd135a82f1 h1:+oUVvEK/+TQeJqJs0bbnVcs2IvFkL4Z8nIKupeFDV3A= +github.com/decred/dcrd/database/v2 v2.0.3-0.20210129190127-4ebd135a82f1/go.mod h1:C5nb1qImTy2sxAfV1KJFW6KHae+NbD6lSMJl58KY7XM= github.com/decred/dcrd/dcrec v1.0.0 h1:W+z6Es+Rai3MXYVoPAxYr5U1DGis0Co33scJ6uH2J6o= github.com/decred/dcrd/dcrec v1.0.0/go.mod h1:HIaqbEJQ+PDzQcORxnqen5/V1FR3B4VpIfmePklt8Q8= github.com/decred/dcrd/dcrec/edwards/v2 v2.0.1 h1:V6eqU1crZzuoFT4KG2LhaU5xDSdkHuvLQsj25wd7Wb4= github.com/decred/dcrd/dcrec/edwards/v2 v2.0.1/go.mod h1:d0H8xGMWbiIQP7gN3v2rByWUcuZPm9YsgmnfoxgbINc= github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 h1:sgNeV1VRMDzs6rzyPpxyM0jp317hnwiq58Filgag2xw= github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210127014238-b33b46cf1a24 h1:L718+uXQkWq02GqdBdEAUIbBPh/Il/kudTsOEf0pItQ= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210127014238-b33b46cf1a24/go.mod h1:UkVqoxmJlLgUvBjJD+GdJz6mgdSdf3UjX83xfwUAYDk= github.com/decred/dcrd/dcrjson/v3 v3.1.0 h1:Y2VjCXCNWbNIa52wMKEuNiU+9rUgnjYb5c1JQW6PuzM= github.com/decred/dcrd/dcrjson/v3 v3.1.0/go.mod h1:fnTHev/ABGp8IxFudDhjGi9ghLiXRff1qZz/wvq12Mg= github.com/decred/dcrd/dcrutil/v3 v3.0.0 h1:n6uQaTQynIhCY89XsoDk2WQqcUcnbD+zUM9rnZcIOZo= github.com/decred/dcrd/dcrutil/v3 v3.0.0/go.mod h1:iVsjcqVzLmYFGCZLet2H7Nq+7imV9tYcuY+0lC2mNsY= -github.com/decred/dcrd/gcs/v2 v2.1.0 h1:foECqwfE3UJztU4CYtqUYqvR254x1Z9clXVfNdOjBQ8= +github.com/decred/dcrd/dcrutil/v4 v4.0.0-20210129181600-6ae0142d3b28/go.mod h1:xe59jKcMx5G/dbRmsZ8+FzY+WQDE/7YBP3k3uzJTtmI= +github.com/decred/dcrd/dcrutil/v4 v4.0.0-20210129220646-5834ce08e290 h1:7RQ9u2ckoolEM+lWgdMCSDhV8dzAO2UusW+VMklAavs= +github.com/decred/dcrd/dcrutil/v4 v4.0.0-20210129220646-5834ce08e290/go.mod h1:xe59jKcMx5G/dbRmsZ8+FzY+WQDE/7YBP3k3uzJTtmI= github.com/decred/dcrd/gcs/v2 v2.1.0/go.mod h1:MbnJOINFcp42NMRAQ+CjX/xGz+53AwNgMzKZhwBibdM= +github.com/decred/dcrd/gcs/v3 v3.0.0-20210129195202-a4265d63b619 h1:YEx0oEkwh9uBPVzzZTkemyKieBpQwmHSI+BdW0VHoAA= +github.com/decred/dcrd/gcs/v3 v3.0.0-20210129195202-a4265d63b619/go.mod h1:aGuAajYbDJB2oal17G371wiosGgVCc5d5FlT2EwZtoE= github.com/decred/dcrd/hdkeychain/v3 v3.0.0 h1:hOPb4c8+K6bE3a/qFtzt2Z2yzK4SpmXmxvCTFp8vMxI= github.com/decred/dcrd/hdkeychain/v3 v3.0.0/go.mod h1:Vz7PJSlLzhqmOR2lmjGD9JqAZgmUnM8P6r8hg7U4Zho= -github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.3.0 h1:KZ2zihwY5Mx6EeYwEA3bL3k+qDXdCraQL+iDIG1BP5k= -github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.3.0/go.mod h1:krn89ZOgSa8yc7sA4WpDK95p61NnjNWFkNlMnGrKbMc= -github.com/decred/dcrd/rpcclient/v6 v6.0.2 h1:bPHPeKGrPZPsHDSRIJxj5xhqoxwM5R7+OsEZXFpDxPk= -github.com/decred/dcrd/rpcclient/v6 v6.0.2/go.mod h1:t6ECC72j2xWQ323poL85IFNq0EUfcSTfwL8j7jDJ6mw= -github.com/decred/dcrd/txscript/v3 v3.0.0 h1:74NmirXAIskbGP0g9OWtrmN7OxDbWJ9G73a5uoxTkcM= +github.com/decred/dcrd/lru v1.1.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/decred/dcrd/rpc/jsonrpc/types/v3 v3.0.0-20210129200153-14fd1a785bf2/go.mod h1:9izQEJ5wU0ZwYHESMaaOIvE6H6y3IvDsQL3ByYGn9oc= +github.com/decred/dcrd/rpc/jsonrpc/types/v3 v3.0.0-20210129220646-5834ce08e290 h1:7PowasA+x5sC9G0A7TaUtvxhlf/fXSWdei76gajN7KY= +github.com/decred/dcrd/rpc/jsonrpc/types/v3 v3.0.0-20210129220646-5834ce08e290/go.mod h1:9izQEJ5wU0ZwYHESMaaOIvE6H6y3IvDsQL3ByYGn9oc= +github.com/decred/dcrd/rpcclient/v7 v7.0.0-20210129220646-5834ce08e290 h1:+pYqZw/DQB2qYb1wZyvDRWkcvU0HoqlDa3qkCRvHu6g= +github.com/decred/dcrd/rpcclient/v7 v7.0.0-20210129220646-5834ce08e290/go.mod h1:6hJkpRGYSSgW4BYOg5VgTvyUVTP7ElaWscn2t/Z7Y0U= github.com/decred/dcrd/txscript/v3 v3.0.0/go.mod h1:pdvnlD4KGdDoc09cvWRJ8EoRQUaiUz41uDevOWuEfII= +github.com/decred/dcrd/txscript/v4 v4.0.0-20210129190127-4ebd135a82f1/go.mod h1:EnS4vtxTESoI59geLo9M8AUOvIprJy+O4gSVsQp6/h4= +github.com/decred/dcrd/txscript/v4 v4.0.0-20210129220646-5834ce08e290 h1:uiu2RSbQcBLsiM7yWr1PA6P+Watjfr6N96UsLbbAwPQ= +github.com/decred/dcrd/txscript/v4 v4.0.0-20210129220646-5834ce08e290/go.mod h1:EnS4vtxTESoI59geLo9M8AUOvIprJy+O4gSVsQp6/h4= github.com/decred/dcrd/wire v1.3.0/go.mod h1:fnKGlUY2IBuqnpxx5dYRU5Oiq392OBqAuVjRVSkIoXM= github.com/decred/dcrd/wire v1.4.0 h1:KmSo6eTQIvhXS0fLBQ/l7hG7QLcSJQKSwSyzSqJYDk0= github.com/decred/dcrd/wire v1.4.0/go.mod h1:WxC/0K+cCAnBh+SKsRjIX9YPgvrjhmE+6pZlel1G7Ro= diff --git a/server/asset/dcr/cache.go b/server/asset/dcr/cache.go index f558d2065c..06249a599d 100644 --- a/server/asset/dcr/cache.go +++ b/server/asset/dcr/cache.go @@ -9,7 +9,7 @@ import ( "decred.org/dcrdex/dex" "github.com/decred/dcrd/chaincfg/chainhash" - chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v2" + chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v3" ) // The dcrBlock structure should hold a minimal amount of information about a diff --git a/server/asset/dcr/config.go b/server/asset/dcr/config.go index db58db1d14..5a81f5334b 100644 --- a/server/asset/dcr/config.go +++ b/server/asset/dcr/config.go @@ -10,7 +10,7 @@ import ( "decred.org/dcrdex/dex" "github.com/decred/dcrd/chaincfg/v3" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" flags "github.com/jessevdk/go-flags" ) diff --git a/server/asset/dcr/dcr.go b/server/asset/dcr/dcr.go index 8323e72b86..1f63d2fc72 100644 --- a/server/asset/dcr/dcr.go +++ b/server/asset/dcr/dcr.go @@ -20,13 +20,13 @@ import ( "decred.org/dcrdex/dex" dexdcr "decred.org/dcrdex/dex/networks/dcr" "decred.org/dcrdex/server/asset" - "github.com/decred/dcrd/blockchain/stake/v3" + "github.com/decred/dcrd/blockchain/stake/v4" "github.com/decred/dcrd/chaincfg/chainhash" "github.com/decred/dcrd/dcrjson/v3" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" "github.com/decred/dcrd/hdkeychain/v3" - chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v2" - "github.com/decred/dcrd/rpcclient/v6" + chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v3" + "github.com/decred/dcrd/rpcclient/v7" "github.com/decred/dcrd/wire" ) @@ -57,7 +57,7 @@ var ( // check for new blocks. blockPollInterval = time.Second - requiredNodeVersion = dex.Semver{Major: 6, Minor: 1, Patch: 2} + requiredNodeVersion = dex.Semver{Major: 7, Minor: 0, Patch: 0} ) const ( @@ -69,8 +69,8 @@ const ( // satisfied by rpcclient.Client, and all methods are matches for Client // methods. For testing, it can be satisfied by a stub. type dcrNode interface { - EstimateSmartFee(ctx context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (float64, error) - GetTxOut(ctx context.Context, txHash *chainhash.Hash, index uint32, mempool bool) (*chainjson.GetTxOutResult, error) + EstimateSmartFee(ctx context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (*chainjson.EstimateSmartFeeResult, error) + GetTxOut(ctx context.Context, txHash *chainhash.Hash, index uint32, tree int8, mempool bool) (*chainjson.GetTxOutResult, error) GetRawTransactionVerbose(ctx context.Context, txHash *chainhash.Hash) (*chainjson.TxRawResult, error) GetBlockVerbose(ctx context.Context, blockHash *chainhash.Hash, verboseTx bool) (*chainjson.GetBlockVerboseResult, error) GetBlockHash(ctx context.Context, blockHeight int64) (*chainhash.Hash, error) @@ -241,11 +241,11 @@ func (dcr *Backend) InitTxSizeBase() uint32 { // FeeRate returns the current optimal fee rate in atoms / byte. func (dcr *Backend) FeeRate() (uint64, error) { // estimatesmartfee 1 returns extremely high rates on DCR. - dcrPerKB, err := dcr.node.EstimateSmartFee(dcr.ctx, 2, chainjson.EstimateSmartFeeConservative) + estimateFeeResult, err := dcr.node.EstimateSmartFee(dcr.ctx, 2, chainjson.EstimateSmartFeeConservative) if err != nil { return 0, translateRPCCancelErr(err) } - atomsPerKB, err := dcrutil.NewAmount(dcrPerKB) + atomsPerKB, err := dcrutil.NewAmount(estimateFeeResult.FeeRate) if err != nil { return 0, err } @@ -393,7 +393,10 @@ func (dcr *Backend) VerifyUnspentCoin(ctx context.Context, coinID []byte) error if err != nil { return fmt.Errorf("error decoding coin ID %x: %w", coinID, err) } - txOut, err := dcr.node.GetTxOut(ctx, txHash, vout, true) + txOut, err := dcr.node.GetTxOut(ctx, txHash, vout, wire.TxTreeRegular, true) // check regular tree first + if err == nil && txOut == nil { + txOut, err = dcr.node.GetTxOut(ctx, txHash, vout, wire.TxTreeStake, true) // check stake tree + } if err != nil { return fmt.Errorf("GetTxOut (%s:%d): %w", txHash.String(), vout, translateRPCCancelErr(err)) } @@ -902,8 +905,8 @@ func msgTxFromHex(txhex string) (*wire.MsgTx, error) { } // Get information for an unspent transaction output. -func (dcr *Backend) getUnspentTxOut(ctx context.Context, txHash *chainhash.Hash, vout uint32) (*chainjson.GetTxOutResult, []byte, error) { - txOut, err := dcr.node.GetTxOut(ctx, txHash, vout, true) +func (dcr *Backend) getUnspentTxOut(ctx context.Context, txHash *chainhash.Hash, vout uint32, tree int8) (*chainjson.GetTxOutResult, []byte, error) { + txOut, err := dcr.node.GetTxOut(ctx, txHash, vout, tree, true) if err != nil { return nil, nil, fmt.Errorf("GetTxOut error for output %s:%d: %w", txHash, vout, translateRPCCancelErr(err)) @@ -921,14 +924,19 @@ func (dcr *Backend) getUnspentTxOut(ctx context.Context, txHash *chainhash.Hash, // Get information for an unspent transaction output, plus the verbose // transaction. func (dcr *Backend) getTxOutInfo(ctx context.Context, txHash *chainhash.Hash, vout uint32) (*chainjson.GetTxOutResult, *chainjson.TxRawResult, []byte, error) { - txOut, pkScript, err := dcr.getUnspentTxOut(ctx, txHash, vout) - if err != nil { - return nil, nil, nil, err - } verboseTx, err := dcr.node.GetRawTransactionVerbose(ctx, txHash) if err != nil { return nil, nil, nil, fmt.Errorf("GetRawTransactionVerbose for txid %s: %w", txHash, translateRPCCancelErr(err)) } + msgTx, err := msgTxFromHex(verboseTx.Hex) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to decode MsgTx from hex for transaction %s: %w", txHash, err) + } + txTree := stake.DetermineTxType(msgTx, msgTx.Version == wire.TxVersionTreasury) + txOut, pkScript, err := dcr.getUnspentTxOut(ctx, txHash, vout, int8(txTree)) + if err != nil { + return nil, nil, nil, err + } return txOut, verboseTx, pkScript, nil } diff --git a/server/asset/dcr/dcr_test.go b/server/asset/dcr/dcr_test.go index 8f34793232..2ff730264e 100644 --- a/server/asset/dcr/dcr_test.go +++ b/server/asset/dcr/dcr_test.go @@ -27,10 +27,10 @@ import ( "github.com/decred/dcrd/dcrec/secp256k1/v3" "github.com/decred/dcrd/dcrec/secp256k1/v3/ecdsa" "github.com/decred/dcrd/dcrec/secp256k1/v3/schnorr" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" "github.com/decred/dcrd/hdkeychain/v3" - chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v2" - "github.com/decred/dcrd/txscript/v3" + chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v3" + "github.com/decred/dcrd/txscript/v4" "github.com/decred/dcrd/wire" flags "github.com/jessevdk/go-flags" ) @@ -187,14 +187,14 @@ func txOutID(txHash *chainhash.Hash, index uint32) string { const optimalFeeRate uint64 = 22 -func (*testNode) EstimateSmartFee(_ context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (float64, error) { - optimalRate := float64(optimalFeeRate) * 1e-5 +func (*testNode) EstimateSmartFee(_ context.Context, confirmations int64, mode chainjson.EstimateSmartFeeMode) (*chainjson.EstimateSmartFeeResult, error) { + optimalRate := float64(optimalFeeRate) * 1e-5 // optimalFeeRate: 22 atoms/byte = 0.00022 DCR/KB * 1e8 atoms/DCR * 1e-3 KB/Byte // fmt.Println((float64(optimalFeeRate)*1e-5)-0.00022) - return optimalRate, nil // optimalFeeRate: 22 atoms/byte = 0.00022 DCR/KB * 1e8 atoms/DCR * 1e-3 KB/Byte + return &chainjson.EstimateSmartFeeResult{FeeRate: optimalRate}, nil } // Part of the dcrNode interface. -func (*testNode) GetTxOut(_ context.Context, txHash *chainhash.Hash, index uint32, _ bool) (*chainjson.GetTxOutResult, error) { +func (*testNode) GetTxOut(_ context.Context, txHash *chainhash.Hash, index uint32, tree int8, _ bool) (*chainjson.GetTxOutResult, error) { outID := txOutID(txHash, index) testChainMtx.RLock() defer testChainMtx.RUnlock() diff --git a/server/asset/dcr/live_test.go b/server/asset/dcr/live_test.go index a670a8a062..91fc15ef5a 100644 --- a/server/asset/dcr/live_test.go +++ b/server/asset/dcr/live_test.go @@ -34,7 +34,7 @@ import ( "decred.org/dcrdex/dex" dexdcr "decred.org/dcrdex/dex/networks/dcr" "github.com/decred/dcrd/chaincfg/chainhash" - chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v2" + chainjson "github.com/decred/dcrd/rpc/jsonrpc/types/v3" "github.com/decred/dcrd/wire" ) diff --git a/server/asset/dcr/utxo.go b/server/asset/dcr/utxo.go index 3ed892d8ae..21374b2b9e 100644 --- a/server/asset/dcr/utxo.go +++ b/server/asset/dcr/utxo.go @@ -15,7 +15,7 @@ import ( "decred.org/dcrdex/server/asset" "github.com/decred/dcrd/chaincfg/chainhash" "github.com/decred/dcrd/dcrec" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" ) const ErrReorgDetected = dex.ErrorKind("reorg detected") diff --git a/server/cmd/dcrdex/config.go b/server/cmd/dcrdex/config.go index ef90d90a7a..e36dd12a54 100644 --- a/server/cmd/dcrdex/config.go +++ b/server/cmd/dcrdex/config.go @@ -27,7 +27,7 @@ import ( "decred.org/dcrdex/server/market" "decred.org/dcrdex/server/matcher" "decred.org/dcrdex/server/swap" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" flags "github.com/jessevdk/go-flags" ) diff --git a/server/db/driver/pg/accounts.go b/server/db/driver/pg/accounts.go index 1cefc7e656..f247ed2337 100644 --- a/server/db/driver/pg/accounts.go +++ b/server/db/driver/pg/accounts.go @@ -12,7 +12,7 @@ import ( "decred.org/dcrdex/server/db" "decred.org/dcrdex/server/db/driver/pg/internal" "github.com/decred/dcrd/chaincfg/chainhash" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" "github.com/decred/dcrd/hdkeychain/v3" ) diff --git a/server/db/driver/pg/pg.go b/server/db/driver/pg/pg.go index 45ae5d5995..8c534e8e22 100644 --- a/server/db/driver/pg/pg.go +++ b/server/db/driver/pg/pg.go @@ -13,7 +13,7 @@ import ( "decred.org/dcrdex/dex" "decred.org/dcrdex/server/db" "github.com/decred/dcrd/chaincfg/v3" - "github.com/decred/dcrd/dcrutil/v3" + "github.com/decred/dcrd/dcrutil/v4" "github.com/decred/dcrd/hdkeychain/v3" )