diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 70d658e323..d0809de4dc 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3775,6 +3775,7 @@ bool CWallet::CreateTransactionInternal( CAmount minimum_value_for_change = GetDustThreshold(change_prototype_txout, discard_rate); if (nFeeRet >= fee_needed_with_change + minimum_value_for_change) { pick_new_inputs = false; + one_more_try_20347 = bnb_used; nFeeRet = fee_needed_with_change; continue; } diff --git a/test/functional/feature_issuance.py b/test/functional/feature_issuance.py index d10e6e37dd..6a9794f7fb 100755 --- a/test/functional/feature_issuance.py +++ b/test/functional/feature_issuance.py @@ -480,5 +480,23 @@ class IssuanceTest(BitcoinTestFramework): self.nodes[0].generate(1) assert_equal(self.nodes[0].gettransaction(tx_id)["confirmations"], 1) + ## Regression for one form of https://github.com/bitcoin/bitcoin/issues/20347 + # 1. Leave node 1 with only a single small explicit output + self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), self.nodes[1].getbalance()['bitcoin'], "", "", True) + blind_addr = self.nodes[1].getnewaddress() + nonblind_addr = self.nodes[1].validateaddress(blind_addr)['unconfidential'] + self.nodes[0].sendtoaddress(nonblind_addr, 0.0005) + self.sync_all() + self.nodes[0].generate(2) + self.sync_all() + + # 2. Try to do an unblinded issuance with only tokens -- the result will + # be an entirely unblinded tx in the 3-output case but a blinded tx + # in the 4-output case. As the bug causes us to do coin selection for + # the former while attempting to produce the latter, we will trigger + # an "impossible" case and a confusing/generic error message. + txid = self.nodes[1].issueasset(0, 1, False)["txid"] + tx = self.nodes[1].getrawtransaction(txid, True) + if __name__ == '__main__': IssuanceTest ().main ()