diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 2b44a2ef5..cb6bfb6a2 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -425,7 +425,7 @@ void CRegTestParams::UpdateActivationParametersFromArgs(const ArgsManager& args) { if (gArgs.IsArgSet("-segwitheight")) { int height = gArgs.GetArg("-segwitheight", consensus.SegwitHeight); - if (height <= 0) { + if (height < 0) { LogPrintf("Segwit disabled for testing\n"); height = std::numeric_limits::max(); } diff --git a/src/txdb.cpp b/src/txdb.cpp index 1663289c3..afbff780c 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -117,7 +117,7 @@ bool CCoinsViewDB::BatchWrite(const CCoinsMap &mapCoins, const uint256 &hashBloc } changed++; } - if (crash_simulate && ++count % 200000 == 0) { + if (++count % 200000 == 0 && crash_simulate) { static FastRandomContext rng; if (rng.randrange(crash_simulate) == 0) { LogPrintf("Simulating a crash. Goodbye.\n"); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index f8817690a..072bb7e1b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2268,12 +2268,14 @@ CAmount CWalletTx::GetDebit(const isminefilter& filter) const if (tx->vin.empty()) return 0; + assert((filter & ISMINE_ALL) == filter); + CAmount debit = 0; if (filter & ISMINE_SPENDABLE) { - debit += GetCachableAmount(DEBIT, filter & ~ISMINE_WATCH_ONLY); + debit += GetCachableAmount(DEBIT, ISMINE_SPENDABLE); } if (filter & ISMINE_WATCH_ONLY) { - debit += GetCachableAmount(DEBIT, filter & ~ISMINE_SPENDABLE); + debit += GetCachableAmount(DEBIT, ISMINE_WATCH_ONLY); } return debit; } @@ -2284,13 +2286,15 @@ CAmount CWalletTx::GetCredit(interfaces::Chain::Lock& locked_chain, const ismine if (IsImmatureCoinBase(locked_chain)) return 0; + assert((filter & ISMINE_ALL) == filter); + CAmount credit = 0; if (filter & ISMINE_SPENDABLE) { // GetBalance can assume transactions in mapWallet won't change - credit += GetCachableAmount(CREDIT, filter & ~ISMINE_WATCH_ONLY); + credit += GetCachableAmount(CREDIT, ISMINE_SPENDABLE); } if (filter & ISMINE_WATCH_ONLY) { - credit += GetCachableAmount(CREDIT, filter & ~ISMINE_SPENDABLE); + credit += GetCachableAmount(CREDIT, ISMINE_WATCH_ONLY); } return credit; } @@ -2388,8 +2392,11 @@ bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain) const const CWalletTx* parent = pwallet->GetWalletTx(txin.prevout.hash); if (parent == nullptr) return false; + const CTxOut& parentOut = parent->tx->vout[txin.prevout.n]; - if (!(pwallet->IsMine(parentOut) & ISMINE_SPENDABLE)) + auto mine = pwallet->IsMine(parentOut); + const auto flags = ISMINE_SPENDABLE | ISMINE_STAKE; + if ((mine & flags) != mine) return false; } return true; diff --git a/test/functional/wallet_address_types.py b/test/functional/wallet_address_types.py index cdd11a82e..d57e8c78b 100755 --- a/test/functional/wallet_address_types.py +++ b/test/functional/wallet_address_types.py @@ -82,6 +82,10 @@ class AddressTypeTest(BitcoinTestFramework): [], ] + # whitelist all peers to speed up tx relay / mempool sync + for args in self.extra_args: + args.append("-whitelist=127.0.0.1") + def skip_test_if_missing_module(self): self.skip_if_no_wallet() diff --git a/test/functional/wallet_balance.py b/test/functional/wallet_balance.py index 6b7ba7a97..dea1f81a0 100755 --- a/test/functional/wallet_balance.py +++ b/test/functional/wallet_balance.py @@ -20,7 +20,8 @@ def create_transactions(node, address, amt, fees): # Create and sign raw transactions from node to address for amt. # Creates a transaction for each fee and returns an array # of the raw transactions. - utxos = [u for u in node.listunspent(0) if u['spendable']] + unspents = node.listunspent(0) + utxos = [u for u in unspents if u['spendable'] and u['safe']] # Create transactions inputs = [] @@ -52,8 +53,10 @@ class WalletTest(BitcoinTestFramework): self.setup_clean_chain = True self.extra_args = [ ['-limitdescendantcount=3', - '-segwitheight=0'], # Limit mempool descendants as a hack to have wallet txs rejected from the mempool - ['-segwitheight=0'], + '-segwitheight=0', # Limit mempool descendants as a hack to have wallet txs rejected from the mempool + '-whitelist=127.0.0.1'], + ['-segwitheight=0', + '-whitelist=127.0.0.1'] ] def skip_test_if_missing_module(self): @@ -111,10 +114,10 @@ class WalletTest(BitcoinTestFramework): def test_balances(*, fee_node_1=0): # getbalance without any arguments includes unconfirmed transactions, but not untrusted transactions assert_equal(self.nodes[0].getbalance(), Decimal('0.59')) # change from node 0's send - assert_equal(self.nodes[1].getbalance(), Decimal('0.39') - fee_node_1) # change from node 1's send + assert_equal(self.nodes[1].getbalance(), Decimal('0.4') - fee_node_1) # change from node 1's send # Same with minconf=0 assert_equal(self.nodes[0].getbalance(minconf=0), Decimal('0.59')) - assert_equal(self.nodes[1].getbalance(minconf=0), Decimal('0.39') - fee_node_1) + assert_equal(self.nodes[1].getbalance(minconf=0), Decimal('0.4') - fee_node_1) # getbalance with a minconf incorrectly excludes coins that have been spent more recently than the minconf blocks ago # TODO: fix getbalance tracking of coin spentness depth assert_equal(self.nodes[0].getbalance(minconf=1), Decimal('0.00')) @@ -128,7 +131,7 @@ class WalletTest(BitcoinTestFramework): assert_equal(self.nodes[1].getbalances()['mine']['untrusted_pending'], Decimal('0.4')) assert_equal(self.nodes[1].getwalletinfo()["unconfirmed_balance"], Decimal('0.4')) - test_balances(fee_node_1=Decimal('0')) + test_balances(fee_node_1=Decimal('0.01')) # Node 1 bumps the transaction fee and resends self.nodes[1].sendrawtransaction(txs[1]['hex']) @@ -136,7 +139,7 @@ class WalletTest(BitcoinTestFramework): self.sync_all() self.log.info("Test getbalance and getunconfirmedbalance with conflicted unconfirmed inputs") - test_balances(fee_node_1=Decimal('0.01')) + test_balances(fee_node_1=Decimal('0.02')) self.nodes[1].generatetoaddress(1, ADDRESS_WATCHONLY) self.sync_all() @@ -209,7 +212,7 @@ class WalletTest(BitcoinTestFramework): assert_equal(self.nodes[0].getbalance(minconf=0), 0) # wallet txs not in the mempool are untrusted # Now confirm tx_orig - self.restart_node(1, ['-persistmempool=0']) + self.restart_node(1, ['-persistmempool=0', '-segwitheight=0', '-whitelist=127.0.0.1']) connect_nodes(self.nodes[0], 1) sync_blocks(self.nodes) self.nodes[1].sendrawtransaction(tx_orig) diff --git a/test/functional/wallet_keypool_topup.py b/test/functional/wallet_keypool_topup.py index b5d04c850..0bd9424bd 100755 --- a/test/functional/wallet_keypool_topup.py +++ b/test/functional/wallet_keypool_topup.py @@ -27,8 +27,9 @@ class KeypoolRestoreTest(BitcoinTestFramework): self.num_nodes = 4 self.extra_args = [[], ['-keypool=100'], ['-keypool=100'], ['-keypool=100']] - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() + # whitelist all peers to speed up tx relay / mempool sync + for args in self.extra_args: + args.append("-whitelist=127.0.0.1") def skip_test_if_missing_module(self): self.skip_if_no_wallet()