diff --git a/test/data/psbt_non_witness_utxo_segwit.patch b/test/data/psbt_non_witness_utxo_segwit.patch index 46719759d..57e41c0b2 100644 --- a/test/data/psbt_non_witness_utxo_segwit.patch +++ b/test/data/psbt_non_witness_utxo_segwit.patch @@ -1,4 +1,4 @@ -From 2789417a7ef31d4b58b2f80783e81a3518dd49af Mon Sep 17 00:00:00 2001 +From eec69a3f42a654a62eacad78164e66b4ae8a68a1 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Thu, 4 Jun 2020 23:43:25 -0400 Subject: [PATCH 1/4] rpc: show both UTXOs in decodepsbt @@ -8,7 +8,7 @@ Subject: [PATCH 1/4] rpc: show both UTXOs in decodepsbt 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp -index e14217c307..45cf6be3a0 100644 +index faec359d1c..5f8c02df65 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -1104,6 +1104,7 @@ UniValue decodepsbt(const JSONRPCRequest& request) @@ -45,7 +45,7 @@ index e14217c307..45cf6be3a0 100644 2.27.0 -From 8b7d74fd0e6d3180be0dfb315b4e190f0ad0057d Mon Sep 17 00:00:00 2001 +From 6aa6d5495299a8e09f2e89a71fd5447351fbcf90 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Thu, 4 Jun 2020 23:43:39 -0400 Subject: [PATCH 2/4] psbt: Allow both non_witness_utxo and witness_utxo @@ -59,7 +59,7 @@ Subject: [PATCH 2/4] psbt: Allow both non_witness_utxo and witness_utxo 5 files changed, 53 deletions(-) diff --git a/src/psbt.cpp b/src/psbt.cpp -index ef9781817a..4c8b40ca0b 100644 +index 10260740f0..71a3e06708 100644 --- a/src/psbt.cpp +++ b/src/psbt.cpp @@ -35,14 +35,6 @@ bool PartiallySignedTransaction::Merge(const PartiallySignedTransaction& psbt) @@ -96,7 +96,7 @@ index ef9781817a..4c8b40ca0b 100644 void PSBTOutput::FillSignatureData(SignatureData& sigdata) const { if (!redeem_script.empty()) { -@@ -250,11 +230,6 @@ bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& +@@ -261,11 +241,6 @@ bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& bool require_witness_sig = false; CTxOut utxo; @@ -108,7 +108,7 @@ index ef9781817a..4c8b40ca0b 100644 if (input.non_witness_utxo) { // If we're taking our information from a non-witness UTXO, verify that it matches the prevout. COutPoint prevout = tx.vin[index].prevout; -@@ -345,10 +320,6 @@ TransactionError CombinePSBTs(PartiallySignedTransaction& out, const std::vector +@@ -356,10 +331,6 @@ TransactionError CombinePSBTs(PartiallySignedTransaction& out, const std::vector return TransactionError::PSBT_MISMATCH; } } @@ -120,7 +120,7 @@ index ef9781817a..4c8b40ca0b 100644 } diff --git a/src/psbt.h b/src/psbt.h -index 888e0fd119..cbf4296bd2 100644 +index 0a8ea2ea0b..401889e2fe 100644 --- a/src/psbt.h +++ b/src/psbt.h @@ -62,7 +62,6 @@ struct PSBTInput @@ -179,10 +179,10 @@ index 64328fb66e..908e2b16f2 100644 for (const PSBTOutput& output : psbt.outputs) { diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp -index 8a2a798644..9fae27975d 100644 +index 3cc2611524..38d94335a3 100644 --- a/src/wallet/scriptpubkeyman.cpp +++ b/src/wallet/scriptpubkeyman.cpp -@@ -595,11 +595,6 @@ TransactionError LegacyScriptPubKeyMan::FillPSBT(PartiallySignedTransaction& psb +@@ -597,11 +597,6 @@ TransactionError LegacyScriptPubKeyMan::FillPSBT(PartiallySignedTransaction& psb continue; } @@ -194,7 +194,7 @@ index 8a2a798644..9fae27975d 100644 // Get the Sighash type if (sign && input.sighash_type > 0 && input.sighash_type != sighash_type) { return TransactionError::SIGHASH_MISMATCH; -@@ -2074,11 +2069,6 @@ TransactionError DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTransaction& +@@ -2086,11 +2081,6 @@ TransactionError DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTransaction& continue; } @@ -207,10 +207,10 @@ index 8a2a798644..9fae27975d 100644 if (sign && input.sighash_type > 0 && input.sighash_type != sighash_type) { return TransactionError::SIGHASH_MISMATCH; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp -index 89737ca7b5..054b312cd7 100644 +index 19acfa3322..974985acbf 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp -@@ -2490,11 +2490,6 @@ TransactionError CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bool& comp +@@ -2507,11 +2507,6 @@ TransactionError CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bool& comp continue; } @@ -226,7 +226,7 @@ index 89737ca7b5..054b312cd7 100644 2.27.0 -From a656eb32d35d2fdc1df5b8d55eba6a0c3efd1c2f Mon Sep 17 00:00:00 2001 +From 889f7b3ce8ba2fccd58ab352ca622e00648147fe Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Thu, 4 Jun 2020 23:43:43 -0400 Subject: [PATCH 3/4] psbt: always put a non_witness_utxo and don't remove it @@ -242,7 +242,7 @@ there. 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/psbt.cpp b/src/psbt.cpp -index 4c8b40ca0b..51f829d533 100644 +index 71a3e06708..3fb743e5db 100644 --- a/src/psbt.cpp +++ b/src/psbt.cpp @@ -136,8 +136,8 @@ void PSBTInput::Merge(const PSBTInput& input) @@ -255,7 +255,7 @@ index 4c8b40ca0b..51f829d533 100644 } partial_sigs.insert(input.partial_sigs.begin(), input.partial_sigs.end()); -@@ -263,10 +263,11 @@ bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& +@@ -274,10 +274,11 @@ bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& if (require_witness_sig && !sigdata.witness) return false; input.FromSignatureData(sigdata); @@ -270,7 +270,7 @@ index 4c8b40ca0b..51f829d533 100644 // Fill in the missing info diff --git a/src/psbt.h b/src/psbt.h -index cbf4296bd2..275fb03cd8 100644 +index 401889e2fe..0951b76f83 100644 --- a/src/psbt.h +++ b/src/psbt.h @@ -67,12 +67,12 @@ struct PSBTInput @@ -289,23 +289,23 @@ index cbf4296bd2..275fb03cd8 100644 SerializeToVector(s, witness_utxo); } diff --git a/src/wallet/test/psbt_wallet_tests.cpp b/src/wallet/test/psbt_wallet_tests.cpp -index b4c65a8665..119457aadf 100644 +index 3f85a48ff3..ce7e661b67 100644 --- a/src/wallet/test/psbt_wallet_tests.cpp +++ b/src/wallet/test/psbt_wallet_tests.cpp @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test) CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << psbtx; - std::string final_hex = HexStr(ssTx.begin(), ssTx.end()); + std::string final_hex = HexStr(ssTx); - BOOST_CHECK_EQUAL(final_hex, "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000"); + BOOST_CHECK_EQUAL(final_hex, "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001008a020000000158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8876500000001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000"); // Mutate the transaction so that one of the inputs is invalid psbtx.tx->vin[0].prevout.n = 2; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp -index 054b312cd7..7816a39ec1 100644 +index 974985acbf..235b269805 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp -@@ -2491,7 +2491,7 @@ TransactionError CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bool& comp +@@ -2508,7 +2508,7 @@ TransactionError CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bool& comp } // If we have no utxo, grab it from the wallet. @@ -315,10 +315,10 @@ index 054b312cd7..7816a39ec1 100644 const auto it = mapWallet.find(txhash); if (it != mapWallet.end()) { diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py -index 9b07c39606..2fe11ef116 100755 +index 660953be9b..7703c4ecb1 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py -@@ -37,6 +37,7 @@ class PSBTTest(BitcoinTestFramework): +@@ -38,6 +38,7 @@ class PSBTTest(BitcoinTestFramework): def skip_test_if_missing_module(self): self.skip_if_no_wallet() @@ -326,7 +326,7 @@ index 9b07c39606..2fe11ef116 100755 def test_utxo_conversion(self): mining_node = self.nodes[2] offline_node = self.nodes[0] -@@ -344,7 +345,8 @@ class PSBTTest(BitcoinTestFramework): +@@ -352,7 +353,8 @@ class PSBTTest(BitcoinTestFramework): for i, signer in enumerate(signers): self.nodes[2].unloadwallet("wallet{}".format(i)) @@ -340,7 +340,7 @@ index 9b07c39606..2fe11ef116 100755 2.27.0 -From 836d6fc375ae8709c6175d36f46df365776a497c Mon Sep 17 00:00:00 2001 +From 85d143347a9ef8d1be712b7a699da0f1835dc837 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Mon, 8 Jun 2020 19:27:16 -0400 Subject: [PATCH 4/4] tests: Check that segwit inputs in psbt have both UTXO @@ -351,10 +351,10 @@ Subject: [PATCH 4/4] tests: Check that segwit inputs in psbt have both UTXO 1 file changed, 4 insertions(+) diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py -index 2fe11ef116..df7d501e5b 100755 +index 7703c4ecb1..e5e62fd646 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py -@@ -149,6 +149,10 @@ class PSBTTest(BitcoinTestFramework): +@@ -157,6 +157,10 @@ class PSBTTest(BitcoinTestFramework): # spend single key from node 1 rawtx = self.nodes[1].walletcreatefundedpsbt([{"txid":txid,"vout":p2wpkh_pos},{"txid":txid,"vout":p2sh_p2wpkh_pos},{"txid":txid,"vout":p2pkh_pos}], {self.nodes[1].getnewaddress():29.99})['psbt'] walletprocesspsbt_out = self.nodes[1].walletprocesspsbt(rawtx)