Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
wallet
test
psbt_wallet_tests.cpp
Go to the documentation of this file.
1
// Copyright (c) 2017-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 <
key_io.h
>
6
#include <
node/types.h
>
7
#include <
util/bip32.h
>
8
#include <
util/strencodings.h
>
9
#include <
wallet/wallet.h
>
10
11
#include <boost/test/unit_test.hpp>
12
#include <
test/util/setup_common.h
>
13
#include <
wallet/test/wallet_test_fixture.h
>
14
15
using namespace
util::hex_literals
;
16
17
namespace
wallet
{
18
BOOST_FIXTURE_TEST_SUITE
(psbt_wallet_tests,
WalletTestingSetup
)
19
20
static
void
import_descriptor
(
CWallet
&
wallet
, const
std
::
string
& descriptor)
21
EXCLUSIVE_LOCKS_REQUIRED
(
wallet
.cs_wallet)
22
{
23
AssertLockHeld
(
wallet
.cs_wallet);
24
FlatSigningProvider
provider;
25
std::string error;
26
auto
descs =
Parse
(descriptor, provider, error,
/* require_checksum=*/
false
);
27
assert
(descs.size() == 1);
28
auto
& desc = descs.at(0);
29
WalletDescriptor
w_desc(std::move(desc), 0, 0, 10, 0);
30
Assert
(
wallet
.AddWalletDescriptor(w_desc, provider,
""
,
false
));
31
}
32
33
BOOST_AUTO_TEST_CASE
(psbt_updater_test)
34
{
35
LOCK
(m_wallet.cs_wallet);
36
m_wallet.SetWalletFlag(
WALLET_FLAG_DESCRIPTORS
);
37
38
// Create prevtxs and add to wallet
39
DataStream
s_prev_tx1{
40
"0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"
_hex,
41
};
42
CTransactionRef
prev_tx1;
43
s_prev_tx1 >>
TX_WITH_WITNESS
(prev_tx1);
44
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx1->GetHash()), std::forward_as_tuple(prev_tx1,
TxStateInactive
{}));
45
46
DataStream
s_prev_tx2{
47
"0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"
_hex,
48
};
49
CTransactionRef
prev_tx2;
50
s_prev_tx2 >>
TX_WITH_WITNESS
(prev_tx2);
51
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx2->GetHash()), std::forward_as_tuple(prev_tx2,
TxStateInactive
{}));
52
53
// Import descriptors for keys and scripts
54
import_descriptor
(m_wallet,
"sh(multi(2,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/0h,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/1h))"
);
55
import_descriptor
(m_wallet,
"sh(wsh(multi(2,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/2h,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/3h)))"
);
56
import_descriptor
(m_wallet,
"wpkh(xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/*h)"
);
57
58
// Call FillPSBT
59
PartiallySignedTransaction
psbtx;
60
DataStream
ssData{
61
"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000"
_hex,
62
};
63
ssData >> psbtx;
64
65
// Fill transaction with our data
66
bool
complete =
true
;
67
BOOST_REQUIRE(!m_wallet.FillPSBT(psbtx, complete, std::nullopt,
false
,
true
));
68
69
// Get the final tx
70
DataStream
ssTx{};
71
ssTx << psbtx;
72
std::string final_hex =
HexStr
(ssTx);
73
BOOST_CHECK_EQUAL
(final_hex,
"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001008a020000000158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8876500000001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000"
);
74
75
// Mutate the transaction so that one of the inputs is invalid
76
psbtx.
tx
->vin[0].prevout.n = 2;
77
78
// Try to sign the mutated input
79
SignatureData
sigdata;
80
BOOST_CHECK
(m_wallet.FillPSBT(psbtx, complete, std::nullopt,
true
,
true
));
81
}
82
83
BOOST_AUTO_TEST_CASE
(parse_hd_keypath)
84
{
85
std::vector<uint32_t> keypath;
86
87
BOOST_CHECK
(
ParseHDKeypath
(
"1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1"
, keypath));
88
BOOST_CHECK
(!
ParseHDKeypath
(
"///////////////////////////"
, keypath));
89
90
BOOST_CHECK
(
ParseHDKeypath
(
"1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1'/1"
, keypath));
91
BOOST_CHECK
(!
ParseHDKeypath
(
"//////////////////////////'/"
, keypath));
92
93
BOOST_CHECK
(
ParseHDKeypath
(
"1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/"
, keypath));
94
BOOST_CHECK
(!
ParseHDKeypath
(
"1///////////////////////////"
, keypath));
95
96
BOOST_CHECK
(
ParseHDKeypath
(
"1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1'/"
, keypath));
97
BOOST_CHECK
(!
ParseHDKeypath
(
"1/'//////////////////////////"
, keypath));
98
99
BOOST_CHECK
(
ParseHDKeypath
(
""
, keypath));
100
BOOST_CHECK
(!
ParseHDKeypath
(
" "
, keypath));
101
102
BOOST_CHECK
(
ParseHDKeypath
(
"0"
, keypath));
103
BOOST_CHECK
(!
ParseHDKeypath
(
"O"
, keypath));
104
105
BOOST_CHECK
(
ParseHDKeypath
(
"0000'/0000'/0000'"
, keypath));
106
BOOST_CHECK
(!
ParseHDKeypath
(
"0000,/0000,/0000,"
, keypath));
107
108
BOOST_CHECK
(
ParseHDKeypath
(
"01234"
, keypath));
109
BOOST_CHECK
(!
ParseHDKeypath
(
"0x1234"
, keypath));
110
111
BOOST_CHECK
(
ParseHDKeypath
(
"1"
, keypath));
112
BOOST_CHECK
(!
ParseHDKeypath
(
" 1"
, keypath));
113
114
BOOST_CHECK
(
ParseHDKeypath
(
"42"
, keypath));
115
BOOST_CHECK
(!
ParseHDKeypath
(
"m42"
, keypath));
116
117
BOOST_CHECK
(
ParseHDKeypath
(
"4294967295"
, keypath));
// 4294967295 == 0xFFFFFFFF (uint32_t max)
118
BOOST_CHECK
(!
ParseHDKeypath
(
"4294967296"
, keypath));
// 4294967296 == 0xFFFFFFFF (uint32_t max) + 1
119
120
BOOST_CHECK
(
ParseHDKeypath
(
"m"
, keypath));
121
BOOST_CHECK
(!
ParseHDKeypath
(
"n"
, keypath));
122
123
BOOST_CHECK
(
ParseHDKeypath
(
"m/"
, keypath));
124
BOOST_CHECK
(!
ParseHDKeypath
(
"n/"
, keypath));
125
126
BOOST_CHECK
(
ParseHDKeypath
(
"m/0"
, keypath));
127
BOOST_CHECK
(!
ParseHDKeypath
(
"n/0"
, keypath));
128
129
BOOST_CHECK
(
ParseHDKeypath
(
"m/0'"
, keypath));
130
BOOST_CHECK
(!
ParseHDKeypath
(
"m/0''"
, keypath));
131
132
BOOST_CHECK
(
ParseHDKeypath
(
"m/0'/0'"
, keypath));
133
BOOST_CHECK
(!
ParseHDKeypath
(
"m/'0/0'"
, keypath));
134
135
BOOST_CHECK
(
ParseHDKeypath
(
"m/0/0"
, keypath));
136
BOOST_CHECK
(!
ParseHDKeypath
(
"n/0/0"
, keypath));
137
138
BOOST_CHECK
(
ParseHDKeypath
(
"m/0/0/00"
, keypath));
139
BOOST_CHECK
(!
ParseHDKeypath
(
"m/0/0/f00"
, keypath));
140
141
BOOST_CHECK
(
ParseHDKeypath
(
"m/0/0/000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
, keypath));
142
BOOST_CHECK
(!
ParseHDKeypath
(
"m/1/1/111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
, keypath));
143
144
BOOST_CHECK
(
ParseHDKeypath
(
"m/0/00/0"
, keypath));
145
BOOST_CHECK
(!
ParseHDKeypath
(
"m/0'/00/'0"
, keypath));
146
147
BOOST_CHECK
(
ParseHDKeypath
(
"m/1/"
, keypath));
148
BOOST_CHECK
(!
ParseHDKeypath
(
"m/1//"
, keypath));
149
150
BOOST_CHECK
(
ParseHDKeypath
(
"m/0/4294967295"
, keypath));
// 4294967295 == 0xFFFFFFFF (uint32_t max)
151
BOOST_CHECK
(!
ParseHDKeypath
(
"m/0/4294967296"
, keypath));
// 4294967296 == 0xFFFFFFFF (uint32_t max) + 1
152
153
BOOST_CHECK
(
ParseHDKeypath
(
"m/4294967295"
, keypath));
// 4294967295 == 0xFFFFFFFF (uint32_t max)
154
BOOST_CHECK
(!
ParseHDKeypath
(
"m/4294967296"
, keypath));
// 4294967296 == 0xFFFFFFFF (uint32_t max) + 1
155
}
156
157
BOOST_AUTO_TEST_SUITE_END
()
158
}
// namespace wallet
ParseHDKeypath
bool ParseHDKeypath(const std::string &keypath_str, std::vector< uint32_t > &keypath)
Parse an HD keypaths like "m/7/0'/2000".
Definition
bip32.cpp:13
bip32.h
Assert
#define Assert(val)
Identity function.
Definition
check.h:113
DataStream
Double ended buffer combining vector and stream-like interfaces.
Definition
streams.h:133
wallet::CWallet
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
Definition
wallet.h:310
wallet::WalletDescriptor
Descriptor with some wallet metadata.
Definition
walletutil.h:64
Parse
static UniValue Parse(std::string_view raw, ParamFormat format=ParamFormat::JSON)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
Definition
client.cpp:395
BOOST_FIXTURE_TEST_SUITE
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END
BOOST_AUTO_TEST_SUITE_END()
HexStr
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition
hex_base.cpp:30
key_io.h
std
Definition
common.h:29
util::hex_literals
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
Definition
strencodings.h:400
wallet
Definition
wallet_balance.cpp:26
wallet::BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(bnb_test)
Definition
coinselection_tests.cpp:123
wallet::WALLET_FLAG_DESCRIPTORS
@ WALLET_FLAG_DESCRIPTORS
Indicate that this wallet supports DescriptorScriptPubKeyMan.
Definition
walletutil.h:53
wallet::import_descriptor
static void import_descriptor(CWallet &wallet, const std::string &descriptor) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
Definition
psbt_wallet_tests.cpp:20
types.h
BOOST_CHECK_EQUAL
#define BOOST_CHECK_EQUAL(v1, v2)
Definition
object.cpp:17
BOOST_CHECK
#define BOOST_CHECK(expr)
Definition
object.cpp:16
TX_WITH_WITNESS
static constexpr TransactionSerParams TX_WITH_WITNESS
Definition
transaction.h:180
CTransactionRef
std::shared_ptr< const CTransaction > CTransactionRef
Definition
transaction.h:403
setup_common.h
strencodings.h
FlatSigningProvider
Definition
signingprovider.h:224
PartiallySignedTransaction
A version of CTransaction with the PSBT format.
Definition
psbt.h:1139
PartiallySignedTransaction::tx
std::optional< CMutableTransaction > tx
Definition
psbt.h:1140
SignatureData
Definition
sign.h:77
wallet::TxStateInactive
Definition
transaction.h:59
wallet::WalletTestingSetup
Testing setup and teardown for wallet.
Definition
wallet_test_fixture.h:22
LOCK
#define LOCK(cs)
Definition
sync.h:258
AssertLockHeld
#define AssertLockHeld(cs)
Definition
sync.h:136
EXCLUSIVE_LOCKS_REQUIRED
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition
threadsafety.h:51
assert
assert(!tx.IsCoinBase())
wallet.h
wallet_test_fixture.h
Generated on
for Bitcoin Core by
1.17.0