Branch data Line data Source code
1 : : // Copyright (c) 2017-2022 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.h>
6 : : #include <key_io.h>
7 : : #include <node/context.h>
8 : : #include <script/script.h>
9 : : #include <script/solver.h>
10 : : #include <script/signingprovider.h>
11 : : #include <test/util/setup_common.h>
12 : : #include <wallet/types.h>
13 : : #include <wallet/wallet.h>
14 : : #include <wallet/test/util.h>
15 : :
16 : : #include <boost/test/unit_test.hpp>
17 : :
18 : :
19 : : namespace wallet {
20 : : BOOST_FIXTURE_TEST_SUITE(ismine_tests, BasicTestingSetup)
21 : :
22 : 18 : wallet::ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string& desc_str, const bool success)
23 : : {
24 : 18 : keystore.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
25 : :
26 : 18 : FlatSigningProvider keys;
27 [ + - ]: 18 : std::string error;
28 [ + - ]: 18 : std::unique_ptr<Descriptor> parsed_desc = Parse(desc_str, keys, error, false);
29 [ + - + - : 36 : BOOST_CHECK(success == (parsed_desc != nullptr));
+ + ]
30 [ + + ]: 18 : if (!success) return nullptr;
31 : :
32 : 12 : const int64_t range_start = 0, range_end = 1, next_index = 0, timestamp = 1;
33 : :
34 [ + - + - ]: 12 : WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
35 : :
36 [ + - ]: 12 : LOCK(keystore.cs_wallet);
37 : :
38 [ + - + - : 12 : return Assert(keystore.AddWalletDescriptor(w_desc, keys,/*label=*/"", /*internal=*/false));
+ - + - ]
39 : 18 : };
40 : :
41 [ + - + - : 7 : BOOST_AUTO_TEST_CASE(ismine_standard)
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- ]
42 : : {
43 : 2 : CKey keys[2];
44 [ + + ]: 3 : CPubKey pubkeys[2];
45 [ + + ]: 3 : for (int i = 0; i < 2; i++) {
46 [ + - ]: 2 : keys[i].MakeNewKey(true);
47 [ + - ]: 2 : pubkeys[i] = keys[i].GetPubKey();
48 : : }
49 : :
50 : 1 : CKey uncompressedKey = GenerateRandomKey(/*compressed=*/false);
51 [ + - ]: 1 : CPubKey uncompressedPubkey = uncompressedKey.GetPubKey();
52 : 1 : std::unique_ptr<interfaces::Chain>& chain = m_node.chain;
53 : :
54 : 1 : CScript scriptPubKey;
55 : 1 : isminetype result;
56 : :
57 : : // P2PK compressed - Legacy
58 : 1 : {
59 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
60 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
61 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
62 [ + - ]: 2 : scriptPubKey = GetScriptForRawPubKey(pubkeys[0]);
63 : :
64 : : // Keystore does not have key
65 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
66 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
67 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
68 : :
69 : : // Keystore has key
70 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
71 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
72 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
73 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - +
- ]
74 : 1 : }
75 : :
76 : : // P2PK compressed - Descriptor
77 : 1 : {
78 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
79 [ + - + - ]: 2 : std::string desc_str = "pk(" + EncodeSecret(keys[0]) + ")";
80 : :
81 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
82 : :
83 [ + - ]: 2 : scriptPubKey = GetScriptForRawPubKey(pubkeys[0]);
84 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
85 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
86 : 1 : }
87 : :
88 : : // P2PK uncompressed - Legacy
89 : 1 : {
90 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
91 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
92 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
93 [ + - ]: 2 : scriptPubKey = GetScriptForRawPubKey(uncompressedPubkey);
94 : :
95 : : // Keystore does not have key
96 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
97 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
98 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
99 : :
100 : : // Keystore has key
101 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
+ - + - +
- ]
102 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
103 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
104 [ + - + - : 4 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - ]
105 : 1 : }
106 : :
107 : : // P2PK uncompressed - Descriptor
108 : 1 : {
109 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
110 [ + - + - ]: 2 : std::string desc_str = "pk(" + EncodeSecret(uncompressedKey) + ")";
111 : :
112 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
113 : :
114 [ + - ]: 2 : scriptPubKey = GetScriptForRawPubKey(uncompressedPubkey);
115 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
116 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
117 : 1 : }
118 : :
119 : : // P2PKH compressed - Legacy
120 : 1 : {
121 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
122 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
123 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
124 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(PKHash(pubkeys[0]));
125 : :
126 : : // Keystore does not have key
127 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
128 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
129 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
130 : :
131 : : // Keystore has key
132 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
133 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
134 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
135 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - +
- ]
136 : 1 : }
137 : :
138 : : // P2PKH compressed - Descriptor
139 : 1 : {
140 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
141 [ + - + - ]: 2 : std::string desc_str = "pkh(" + EncodeSecret(keys[0]) + ")";
142 : :
143 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
144 : :
145 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(PKHash(pubkeys[0]));
146 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
147 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
148 : 1 : }
149 : :
150 : : // P2PKH uncompressed - Legacy
151 : 1 : {
152 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
153 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
154 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
155 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(PKHash(uncompressedPubkey));
156 : :
157 : : // Keystore does not have key
158 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
159 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
160 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
161 : :
162 : : // Keystore has key
163 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
+ - + - +
- ]
164 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
165 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
166 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - +
- ]
167 : 1 : }
168 : :
169 : : // P2PKH uncompressed - Descriptor
170 : 1 : {
171 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
172 [ + - + - ]: 2 : std::string desc_str = "pkh(" + EncodeSecret(uncompressedKey) + ")";
173 : :
174 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
175 : :
176 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(PKHash(uncompressedPubkey));
177 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
178 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
179 : 1 : }
180 : :
181 : : // P2SH - Legacy
182 : 1 : {
183 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
184 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
185 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
186 : :
187 [ + - + - ]: 1 : CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));
188 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
189 : :
190 : : // Keystore does not have redeemScript or key
191 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
192 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
193 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
194 : :
195 : : // Keystore has redeemScript but no key
196 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemScript));
+ - + - +
- ]
197 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
198 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
199 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
200 : :
201 : : // Keystore has redeemScript and key
202 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
203 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
204 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
205 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - ]
206 [ + - ]: 2 : }
207 : :
208 : : // P2SH - Descriptor
209 : 1 : {
210 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
211 [ + - + - ]: 2 : std::string desc_str = "sh(pkh(" + EncodeSecret(keys[0]) + "))";
212 : :
213 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
214 : :
215 [ + - + - ]: 1 : CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));
216 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
217 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
218 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
219 : 1 : }
220 : :
221 : : // (P2PKH inside) P2SH inside P2SH (invalid) - Legacy
222 : 1 : {
223 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
224 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
225 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
226 : :
227 [ + - + - ]: 1 : CScript redeemscript_inner = GetScriptForDestination(PKHash(pubkeys[0]));
228 [ + - + - ]: 1 : CScript redeemscript = GetScriptForDestination(ScriptHash(redeemscript_inner));
229 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemscript));
230 : :
231 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemscript));
+ - + - +
- ]
232 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemscript_inner));
+ - + - +
- ]
233 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
234 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
235 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
236 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
237 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - ]
238 [ + - ]: 2 : }
239 : :
240 : : // (P2PKH inside) P2SH inside P2SH (invalid) - Descriptor
241 : 1 : {
242 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
243 [ + - + - ]: 2 : std::string desc_str = "sh(sh(" + EncodeSecret(keys[0]) + "))";
244 : :
245 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, false);
246 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(spk_manager, nullptr);
247 : 1 : }
248 : :
249 : : // (P2PKH inside) P2SH inside P2WSH (invalid) - Legacy
250 : 1 : {
251 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
252 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
253 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
254 : :
255 [ + - + - ]: 1 : CScript redeemscript = GetScriptForDestination(PKHash(pubkeys[0]));
256 [ + - + - ]: 1 : CScript witnessscript = GetScriptForDestination(ScriptHash(redeemscript));
257 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
258 : :
259 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript));
+ - + - +
- ]
260 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemscript));
+ - + - +
- ]
261 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
262 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
263 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
264 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
265 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - ]
266 [ + - ]: 2 : }
267 : :
268 : : // (P2PKH inside) P2SH inside P2WSH (invalid) - Descriptor
269 : 1 : {
270 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
271 [ + - + - ]: 2 : std::string desc_str = "wsh(sh(" + EncodeSecret(keys[0]) + "))";
272 : :
273 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, false);
274 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(spk_manager, nullptr);
275 : 1 : }
276 : :
277 : : // P2WPKH inside P2WSH (invalid) - Legacy
278 : 1 : {
279 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
280 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
281 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
282 : :
283 [ + - + - ]: 1 : CScript witnessscript = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
284 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
285 : :
286 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript));
+ - + - +
- ]
287 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
288 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
289 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
290 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
291 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - ]
292 [ + - ]: 2 : }
293 : :
294 : : // P2WPKH inside P2WSH (invalid) - Descriptor
295 : 1 : {
296 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
297 [ + - + - ]: 2 : std::string desc_str = "wsh(wpkh(" + EncodeSecret(keys[0]) + "))";
298 : :
299 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, false);
300 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(spk_manager, nullptr);
301 : 1 : }
302 : :
303 : : // (P2PKH inside) P2WSH inside P2WSH (invalid) - Legacy
304 : 1 : {
305 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
306 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
307 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
308 : :
309 [ + - + - ]: 1 : CScript witnessscript_inner = GetScriptForDestination(PKHash(pubkeys[0]));
310 [ + - + - ]: 1 : CScript witnessscript = GetScriptForDestination(WitnessV0ScriptHash(witnessscript_inner));
311 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
312 : :
313 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript_inner));
+ - + - +
- ]
314 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript));
+ - + - +
- ]
315 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
316 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
317 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
318 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
319 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - ]
320 [ + - ]: 2 : }
321 : :
322 : : // (P2PKH inside) P2WSH inside P2WSH (invalid) - Descriptor
323 : 1 : {
324 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
325 [ + - + - ]: 2 : std::string desc_str = "wsh(wsh(" + EncodeSecret(keys[0]) + "))";
326 : :
327 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, false);
328 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(spk_manager, nullptr);
329 : 1 : }
330 : :
331 : : // P2WPKH compressed - Legacy
332 : 1 : {
333 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
334 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
335 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
336 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
337 : :
338 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
339 : :
340 : : // Keystore implicitly has key and P2SH redeemScript
341 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
342 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
343 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
344 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - +
- ]
345 : 1 : }
346 : :
347 : : // P2WPKH compressed - Descriptor
348 : 1 : {
349 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
350 [ + - + - ]: 2 : std::string desc_str = "wpkh(" + EncodeSecret(keys[0]) + ")";
351 : :
352 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
353 : :
354 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
355 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
356 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
357 : 1 : }
358 : :
359 : : // P2WPKH uncompressed - Legacy
360 : 1 : {
361 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
362 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
363 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
364 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
+ - + - +
- ]
365 : :
366 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(uncompressedPubkey));
367 : :
368 : : // Keystore has key, but no P2SH redeemScript
369 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
370 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
371 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
372 : :
373 : : // Keystore has key and P2SH redeemScript
374 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
375 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
376 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
377 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
378 : 1 : }
379 : :
380 : : // P2WPKH uncompressed (invalid) - Descriptor
381 : 1 : {
382 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
383 [ + - + - ]: 2 : std::string desc_str = "wpkh(" + EncodeSecret(uncompressedKey) + ")";
384 : :
385 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, false);
386 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(spk_manager, nullptr);
387 : 1 : }
388 : :
389 : : // scriptPubKey multisig - Legacy
390 : 1 : {
391 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
392 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
393 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
394 : :
395 [ + - + - : 2 : scriptPubKey = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
+ - ]
396 : :
397 : : // Keystore does not have any keys
398 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
399 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
400 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
401 : :
402 : : // Keystore has 1/2 keys
403 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
+ - + - +
- ]
404 : :
405 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
406 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
407 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
408 : :
409 : : // Keystore has 2/2 keys
410 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
+ - + - +
- ]
411 : :
412 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
413 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
414 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
415 : :
416 : : // Keystore has 2/2 keys and the script
417 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
418 : :
419 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
420 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
421 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
422 : 1 : }
423 : :
424 : : // scriptPubKey multisig - Descriptor
425 : 1 : {
426 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
427 [ + - + - : 3 : std::string desc_str = "multi(2, " + EncodeSecret(uncompressedKey) + ", " + EncodeSecret(keys[1]) + ")";
+ - + - ]
428 : :
429 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
430 : :
431 [ + - + - : 2 : scriptPubKey = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
+ - ]
432 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
433 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
434 : 1 : }
435 : :
436 : : // P2SH multisig - Legacy
437 : 1 : {
438 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
439 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
440 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
441 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
+ - + - +
- ]
442 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
+ - + - +
- ]
443 : :
444 [ + - + - : 2 : CScript redeemScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
+ - ]
445 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
446 : :
447 : : // Keystore has no redeemScript
448 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
449 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
450 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
451 : :
452 : : // Keystore has redeemScript
453 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemScript));
+ - + - +
- ]
454 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
455 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
456 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - ]
457 [ + - ]: 2 : }
458 : :
459 : : // P2SH multisig - Descriptor
460 : 1 : {
461 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
462 : :
463 [ + - + - : 3 : std::string desc_str = "sh(multi(2, " + EncodeSecret(uncompressedKey) + ", " + EncodeSecret(keys[1]) + "))";
+ - + - ]
464 : :
465 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
466 : :
467 [ + - + - : 2 : CScript redeemScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
+ - ]
468 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
469 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
470 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
471 : 1 : }
472 : :
473 : : // P2WSH multisig with compressed keys - Legacy
474 : 1 : {
475 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
476 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
477 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
478 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
479 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
+ - + - +
- ]
480 : :
481 [ + - + - : 2 : CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
+ - ]
482 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
483 : :
484 : : // Keystore has keys, but no witnessScript or P2SH redeemScript
485 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
486 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
487 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
488 : :
489 : : // Keystore has keys and witnessScript, but no P2SH redeemScript
490 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessScript));
+ - + - +
- ]
491 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
492 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
493 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
494 : :
495 : : // Keystore has keys, witnessScript, P2SH redeemScript
496 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
497 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
498 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
499 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - ]
500 [ + - ]: 2 : }
501 : :
502 : : // P2WSH multisig with compressed keys - Descriptor
503 : 1 : {
504 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
505 : :
506 [ + - + - : 3 : std::string desc_str = "wsh(multi(2, " + EncodeSecret(keys[0]) + ", " + EncodeSecret(keys[1]) + "))";
+ - + - ]
507 : :
508 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
509 : :
510 [ + - + - : 2 : CScript redeemScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
+ - ]
511 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(redeemScript));
512 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
513 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
514 : 1 : }
515 : :
516 : : // P2WSH multisig with uncompressed key - Legacy
517 : 1 : {
518 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
519 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
520 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
521 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
+ - + - +
- ]
522 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
+ - + - +
- ]
523 : :
524 [ + - + - : 2 : CScript witnessScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
+ - ]
525 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
526 : :
527 : : // Keystore has keys, but no witnessScript or P2SH redeemScript
528 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
529 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
530 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
531 : :
532 : : // Keystore has keys and witnessScript, but no P2SH redeemScript
533 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessScript));
+ - + - +
- ]
534 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
535 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
536 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
537 : :
538 : : // Keystore has keys, witnessScript, P2SH redeemScript
539 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
+ - + - +
- ]
540 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
541 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
542 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - ]
543 [ + - ]: 2 : }
544 : :
545 : : // P2WSH multisig with uncompressed key (invalid) - Descriptor
546 : 1 : {
547 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
548 : :
549 [ + - + - : 3 : std::string desc_str = "wsh(multi(2, " + EncodeSecret(uncompressedKey) + ", " + EncodeSecret(keys[1]) + "))";
+ - + - ]
550 : :
551 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, false);
552 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(spk_manager, nullptr);
553 : 1 : }
554 : :
555 : : // P2WSH multisig wrapped in P2SH - Legacy
556 : 1 : {
557 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
558 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
559 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
560 : :
561 [ + - + - : 2 : CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
+ - ]
562 [ + - + - ]: 1 : CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
563 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
564 : :
565 : : // Keystore has no witnessScript, P2SH redeemScript, or keys
566 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
567 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
568 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
569 : :
570 : : // Keystore has witnessScript and P2SH redeemScript, but no keys
571 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemScript));
+ - + - +
- ]
572 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessScript));
+ - + - +
- ]
573 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
574 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
575 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
576 : :
577 : : // Keystore has keys, witnessScript, P2SH redeemScript
578 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - +
- ]
579 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
+ - + - +
- ]
580 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
581 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
582 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 1);
+ - + - ]
583 [ + - ]: 2 : }
584 : :
585 : : // P2WSH multisig wrapped in P2SH - Descriptor
586 : 1 : {
587 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
588 : :
589 [ + - + - : 3 : std::string desc_str = "sh(wsh(multi(2, " + EncodeSecret(keys[0]) + ", " + EncodeSecret(keys[1]) + ")))";
+ - + - ]
590 : :
591 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
592 : :
593 [ + - + - : 2 : CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
+ - ]
594 [ + - + - ]: 1 : CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
595 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
596 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
597 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
598 : 1 : }
599 : :
600 : : // Combo - Descriptor
601 : 1 : {
602 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
603 : :
604 [ + - + - ]: 2 : std::string desc_str = "combo(" + EncodeSecret(keys[0]) + ")";
605 : :
606 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
607 : :
608 : : // Test P2PK
609 [ + - + - ]: 1 : result = spk_manager->IsMine(GetScriptForRawPubKey(pubkeys[0]));
610 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
611 : :
612 : : // Test P2PKH
613 [ + - + - : 1 : result = spk_manager->IsMine(GetScriptForDestination(PKHash(pubkeys[0])));
+ - ]
614 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
615 : :
616 : : // Test P2SH (combo descriptor does not describe P2SH)
617 [ + - + - ]: 1 : CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));
618 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
619 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
620 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
621 : :
622 : : // Test P2WPKH
623 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
624 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
625 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
626 : :
627 : : // P2SH-P2WPKH output
628 [ + - + - ]: 2 : redeemScript = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
629 [ + - + - ]: 2 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
630 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
631 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
632 : :
633 : : // Test P2TR (combo descriptor does not describe P2TR)
634 [ + - ]: 1 : XOnlyPubKey xpk(pubkeys[0]);
635 [ + - + - ]: 1 : Assert(xpk.IsFullyValid());
636 [ + - ]: 1 : TaprootBuilder builder;
637 [ + - ]: 1 : builder.Finalize(xpk);
638 [ + - ]: 1 : WitnessV1Taproot output = builder.GetOutput();
639 [ + - ]: 2 : scriptPubKey = GetScriptForDestination(output);
640 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
641 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
642 : 1 : }
643 : :
644 : : // Taproot - Descriptor
645 : 1 : {
646 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
647 : :
648 [ + - + - ]: 2 : std::string desc_str = "tr(" + EncodeSecret(keys[0]) + ")";
649 : :
650 [ + - ]: 1 : auto spk_manager = CreateDescriptor(keystore, desc_str, true);
651 : :
652 [ + - ]: 1 : XOnlyPubKey xpk(pubkeys[0]);
653 [ + - + - ]: 1 : Assert(xpk.IsFullyValid());
654 [ + - ]: 1 : TaprootBuilder builder;
655 [ + - ]: 1 : builder.Finalize(xpk);
656 [ + - ]: 1 : WitnessV1Taproot output = builder.GetOutput();
657 [ + - ]: 2 : scriptPubKey = GetScriptForDestination(output);
658 [ + - ]: 1 : result = spk_manager->IsMine(scriptPubKey);
659 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
660 : 1 : }
661 : :
662 : : // OP_RETURN
663 : 1 : {
664 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
665 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
666 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
667 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - ]
668 : :
669 : 1 : scriptPubKey.clear();
670 [ + - + - ]: 1 : scriptPubKey << OP_RETURN << ToByteVector(pubkeys[0]);
671 : :
672 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
673 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
674 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
675 : 1 : }
676 : :
677 : : // witness unspendable
678 : 1 : {
679 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
680 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
681 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
682 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - ]
683 : :
684 : 1 : scriptPubKey.clear();
685 [ + - + - : 1 : scriptPubKey << OP_0 << ToByteVector(ParseHex("aabb"));
+ - ]
686 : :
687 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
688 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
689 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
690 : 1 : }
691 : :
692 : : // witness unknown
693 : 1 : {
694 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
695 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
696 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
697 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - ]
698 : :
699 : 1 : scriptPubKey.clear();
700 [ + - + - : 1 : scriptPubKey << OP_16 << ToByteVector(ParseHex("aabb"));
+ - ]
701 : :
702 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
703 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
704 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
705 : 1 : }
706 : :
707 : : // Nonstandard
708 : 1 : {
709 [ + - + - : 2 : CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());
+ - ]
710 [ + - ]: 1 : keystore.SetupLegacyScriptPubKeyMan();
711 [ + - + - ]: 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
712 [ + - + - : 2 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
+ - + - ]
713 : :
714 : 1 : scriptPubKey.clear();
715 [ + - + - : 1 : scriptPubKey << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
+ - + - ]
716 : :
717 [ + - + - ]: 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
718 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
719 [ + - + - : 3 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->GetScriptPubKeys().count(scriptPubKey) == 0);
+ - + - +
- ]
720 : 1 : }
721 [ + + - - ]: 4 : }
722 : :
723 : : BOOST_AUTO_TEST_SUITE_END()
724 : : } // namespace wallet
|