/tmp/bitcoin/src/wallet/test/wallet_transaction_tests.cpp
Line | Count | Source |
1 | | // Copyright (c) 2021-present The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #include <wallet/transaction.h> |
6 | | |
7 | | #include <primitives/transaction.h> |
8 | | #include <serialize.h> |
9 | | #include <streams.h> |
10 | | #include <test/util/common.h> |
11 | | #include <wallet/test/wallet_test_fixture.h> |
12 | | |
13 | | #include <boost/test/unit_test.hpp> |
14 | | |
15 | | namespace wallet { |
16 | | BOOST_FIXTURE_TEST_SUITE(wallet_transaction_tests, WalletTestingSetup) |
17 | | |
18 | | BOOST_AUTO_TEST_CASE(roundtrip) |
19 | 1 | { |
20 | 6 | for (uint8_t hash = 0; hash < 5; ++hash) { |
21 | 30 | for (int index = -2; index < 3; ++index) { |
22 | 25 | TxState state = TxStateInterpretSerialized(TxStateUnrecognized{uint256{hash}, index}); |
23 | 25 | BOOST_CHECK_EQUAL(TxStateSerializedBlockHash(state), uint256{hash}); |
24 | 25 | BOOST_CHECK_EQUAL(TxStateSerializedIndex(state), index); |
25 | 25 | } |
26 | 5 | } |
27 | 1 | } |
28 | | |
29 | | BOOST_AUTO_TEST_CASE(deserialize_rejects_mismatched_variant_txid) |
30 | 1 | { |
31 | | // Build tx_a and serialise it as a CWalletTx. |
32 | | // Needs at least one input: a zero-input tx serialises vin_count as 0x00, |
33 | | // which the witness-aware deserialiser misreads as the segwit marker byte. |
34 | 1 | CMutableTransaction mtx_a; |
35 | 1 | mtx_a.vin.emplace_back(COutPoint{Txid::FromUint256(uint256::ONE), 0}); |
36 | 1 | mtx_a.vout.emplace_back(COIN, CScript() << OP_TRUE); |
37 | 1 | CTransactionRef tx_a = MakeTransactionRef(std::move(mtx_a)); |
38 | 1 | CWalletTx wtx_a{tx_a, TxStateInactive{}}; |
39 | 1 | DataStream ss; |
40 | 1 | ss << wtx_a; |
41 | | |
42 | | // Build tx_b with a different txid to use as a bogus variant. |
43 | 1 | CMutableTransaction mtx_b; |
44 | 1 | mtx_b.vout.emplace_back(2 * COIN, CScript() << OP_TRUE); |
45 | 1 | CTransactionRef tx_b = MakeTransactionRef(std::move(mtx_b)); |
46 | 1 | BOOST_REQUIRE(tx_b->GetHash() != tx_a->GetHash()); |
47 | | |
48 | | // A variant whose txid doesn't match the canonical txid must be rejected. |
49 | 1 | std::map<Wtxid, CTransactionRef> bad_variants{{tx_b->GetWitnessHash(), tx_b}}; |
50 | 1 | try { |
51 | 1 | CWalletTx(deserialize, ss, bad_variants); |
52 | 1 | BOOST_FAIL("expected std::runtime_error was not thrown"); |
53 | 1 | } catch (const std::runtime_error& e) { |
54 | | BOOST_CHECK_EQUAL(std::string(e.what()), "variant txid does not match wallet txid"); |
55 | 1 | } |
56 | 1 | } |
57 | | |
58 | | BOOST_AUTO_TEST_SUITE_END() |
59 | | } // namespace wallet |