Branch data Line data Source code
# 1 : : // Copyright (c) 2017-2020 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 <node/context.h>
# 7 : : #include <script/script.h>
# 8 : : #include <script/standard.h>
# 9 : : #include <test/util/setup_common.h>
# 10 : : #include <wallet/ismine.h>
# 11 : : #include <wallet/wallet.h>
# 12 : :
# 13 : : #include <boost/test/unit_test.hpp>
# 14 : :
# 15 : :
# 16 : : BOOST_FIXTURE_TEST_SUITE(ismine_tests, BasicTestingSetup)
# 17 : :
# 18 : : BOOST_AUTO_TEST_CASE(ismine_standard)
# 19 : 1 : {
# 20 : 1 : CKey keys[2];
# 21 : 1 : CPubKey pubkeys[2];
# 22 [ + + ]: 3 : for (int i = 0; i < 2; i++) {
# 23 : 2 : keys[i].MakeNewKey(true);
# 24 : 2 : pubkeys[i] = keys[i].GetPubKey();
# 25 : 2 : }
# 26 : :
# 27 : 1 : CKey uncompressedKey;
# 28 : 1 : uncompressedKey.MakeNewKey(false);
# 29 : 1 : CPubKey uncompressedPubkey = uncompressedKey.GetPubKey();
# 30 : 1 : std::unique_ptr<interfaces::Chain>& chain = m_node.chain;
# 31 : :
# 32 : 1 : CScript scriptPubKey;
# 33 : 1 : isminetype result;
# 34 : :
# 35 : : // P2PK compressed
# 36 : 1 : {
# 37 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 38 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 39 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 40 : 1 : scriptPubKey = GetScriptForRawPubKey(pubkeys[0]);
# 41 : :
# 42 : : // Keystore does not have key
# 43 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 44 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 45 : :
# 46 : : // Keystore has key
# 47 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 48 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 49 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 50 : 1 : }
# 51 : :
# 52 : : // P2PK uncompressed
# 53 : 1 : {
# 54 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 55 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 56 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 57 : 1 : scriptPubKey = GetScriptForRawPubKey(uncompressedPubkey);
# 58 : :
# 59 : : // Keystore does not have key
# 60 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 61 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 62 : :
# 63 : : // Keystore has key
# 64 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
# 65 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 66 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 67 : 1 : }
# 68 : :
# 69 : : // P2PKH compressed
# 70 : 1 : {
# 71 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 72 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 73 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 74 : 1 : scriptPubKey = GetScriptForDestination(PKHash(pubkeys[0]));
# 75 : :
# 76 : : // Keystore does not have key
# 77 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 78 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 79 : :
# 80 : : // Keystore has key
# 81 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 82 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 83 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 84 : 1 : }
# 85 : :
# 86 : : // P2PKH uncompressed
# 87 : 1 : {
# 88 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 89 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 90 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 91 : 1 : scriptPubKey = GetScriptForDestination(PKHash(uncompressedPubkey));
# 92 : :
# 93 : : // Keystore does not have key
# 94 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 95 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 96 : :
# 97 : : // Keystore has key
# 98 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
# 99 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 100 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 101 : 1 : }
# 102 : :
# 103 : : // P2SH
# 104 : 1 : {
# 105 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 106 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 107 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 108 : :
# 109 : 1 : CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));
# 110 : 1 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
# 111 : :
# 112 : : // Keystore does not have redeemScript or key
# 113 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 114 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 115 : :
# 116 : : // Keystore has redeemScript but no key
# 117 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemScript));
# 118 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 119 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 120 : :
# 121 : : // Keystore has redeemScript and key
# 122 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 123 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 124 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 125 : 1 : }
# 126 : :
# 127 : : // (P2PKH inside) P2SH inside P2SH (invalid)
# 128 : 1 : {
# 129 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 130 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 131 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 132 : :
# 133 : 1 : CScript redeemscript_inner = GetScriptForDestination(PKHash(pubkeys[0]));
# 134 : 1 : CScript redeemscript = GetScriptForDestination(ScriptHash(redeemscript_inner));
# 135 : 1 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemscript));
# 136 : :
# 137 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemscript));
# 138 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemscript_inner));
# 139 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 140 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 141 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 142 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 143 : 1 : }
# 144 : :
# 145 : : // (P2PKH inside) P2SH inside P2WSH (invalid)
# 146 : 1 : {
# 147 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 148 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 149 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 150 : :
# 151 : 1 : CScript redeemscript = GetScriptForDestination(PKHash(pubkeys[0]));
# 152 : 1 : CScript witnessscript = GetScriptForDestination(ScriptHash(redeemscript));
# 153 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
# 154 : :
# 155 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript));
# 156 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemscript));
# 157 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 158 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 159 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 160 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 161 : 1 : }
# 162 : :
# 163 : : // P2WPKH inside P2WSH (invalid)
# 164 : 1 : {
# 165 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 166 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 167 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 168 : :
# 169 : 1 : CScript witnessscript = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
# 170 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
# 171 : :
# 172 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript));
# 173 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 174 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 175 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 176 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 177 : 1 : }
# 178 : :
# 179 : : // (P2PKH inside) P2WSH inside P2WSH (invalid)
# 180 : 1 : {
# 181 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 182 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 183 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 184 : :
# 185 : 1 : CScript witnessscript_inner = GetScriptForDestination(PKHash(pubkeys[0]));
# 186 : 1 : CScript witnessscript = GetScriptForDestination(WitnessV0ScriptHash(witnessscript_inner));
# 187 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
# 188 : :
# 189 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript_inner));
# 190 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessscript));
# 191 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 192 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 193 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 194 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 195 : 1 : }
# 196 : :
# 197 : : // P2WPKH compressed
# 198 : 1 : {
# 199 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 200 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 201 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 202 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 203 : :
# 204 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
# 205 : :
# 206 : : // Keystore implicitly has key and P2SH redeemScript
# 207 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 208 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 209 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 210 : 1 : }
# 211 : :
# 212 : : // P2WPKH uncompressed
# 213 : 1 : {
# 214 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 215 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 216 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 217 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
# 218 : :
# 219 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(uncompressedPubkey));
# 220 : :
# 221 : : // Keystore has key, but no P2SH redeemScript
# 222 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 223 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 224 : :
# 225 : : // Keystore has key and P2SH redeemScript
# 226 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 227 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 228 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 229 : 1 : }
# 230 : :
# 231 : : // scriptPubKey multisig
# 232 : 1 : {
# 233 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 234 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 235 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 236 : :
# 237 : 1 : scriptPubKey = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
# 238 : :
# 239 : : // Keystore does not have any keys
# 240 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 241 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 242 : :
# 243 : : // Keystore has 1/2 keys
# 244 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
# 245 : :
# 246 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 247 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 248 : :
# 249 : : // Keystore has 2/2 keys
# 250 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
# 251 : :
# 252 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 253 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 254 : :
# 255 : : // Keystore has 2/2 keys and the script
# 256 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 257 : :
# 258 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 259 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 260 : 1 : }
# 261 : :
# 262 : : // P2SH multisig
# 263 : 1 : {
# 264 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 265 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 266 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 267 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
# 268 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
# 269 : :
# 270 : 1 : CScript redeemScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
# 271 : 1 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
# 272 : :
# 273 : : // Keystore has no redeemScript
# 274 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 275 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 276 : :
# 277 : : // Keystore has redeemScript
# 278 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemScript));
# 279 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 280 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 281 : 1 : }
# 282 : :
# 283 : : // P2WSH multisig with compressed keys
# 284 : 1 : {
# 285 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 286 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 287 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 288 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 289 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
# 290 : :
# 291 : 1 : CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
# 292 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
# 293 : :
# 294 : : // Keystore has keys, but no witnessScript or P2SH redeemScript
# 295 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 296 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 297 : :
# 298 : : // Keystore has keys and witnessScript, but no P2SH redeemScript
# 299 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessScript));
# 300 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 301 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 302 : :
# 303 : : // Keystore has keys, witnessScript, P2SH redeemScript
# 304 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 305 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 306 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 307 : 1 : }
# 308 : :
# 309 : : // P2WSH multisig with uncompressed key
# 310 : 1 : {
# 311 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 312 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 313 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 314 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(uncompressedKey));
# 315 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
# 316 : :
# 317 : 1 : CScript witnessScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
# 318 : 1 : scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
# 319 : :
# 320 : : // Keystore has keys, but no witnessScript or P2SH redeemScript
# 321 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 322 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 323 : :
# 324 : : // Keystore has keys and witnessScript, but no P2SH redeemScript
# 325 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessScript));
# 326 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 327 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 328 : :
# 329 : : // Keystore has keys, witnessScript, P2SH redeemScript
# 330 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(scriptPubKey));
# 331 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 332 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 333 : 1 : }
# 334 : :
# 335 : : // P2WSH multisig wrapped in P2SH
# 336 : 1 : {
# 337 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 338 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 339 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 340 : :
# 341 : 1 : CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
# 342 : 1 : CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
# 343 : 1 : scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
# 344 : :
# 345 : : // Keystore has no witnessScript, P2SH redeemScript, or keys
# 346 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 347 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 348 : :
# 349 : : // Keystore has witnessScript and P2SH redeemScript, but no keys
# 350 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(redeemScript));
# 351 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddCScript(witnessScript));
# 352 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 353 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 354 : :
# 355 : : // Keystore has keys, witnessScript, P2SH redeemScript
# 356 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 357 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[1]));
# 358 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 359 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
# 360 : 1 : }
# 361 : :
# 362 : : // OP_RETURN
# 363 : 1 : {
# 364 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 365 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 366 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 367 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 368 : :
# 369 : 1 : scriptPubKey.clear();
# 370 : 1 : scriptPubKey << OP_RETURN << ToByteVector(pubkeys[0]);
# 371 : :
# 372 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 373 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 374 : 1 : }
# 375 : :
# 376 : : // witness unspendable
# 377 : 1 : {
# 378 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 379 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 380 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 381 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 382 : :
# 383 : 1 : scriptPubKey.clear();
# 384 : 1 : scriptPubKey << OP_0 << ToByteVector(ParseHex("aabb"));
# 385 : :
# 386 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 387 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 388 : 1 : }
# 389 : :
# 390 : : // witness unknown
# 391 : 1 : {
# 392 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 393 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 394 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 395 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 396 : :
# 397 : 1 : scriptPubKey.clear();
# 398 : 1 : scriptPubKey << OP_16 << ToByteVector(ParseHex("aabb"));
# 399 : :
# 400 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 401 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 402 : 1 : }
# 403 : :
# 404 : : // Nonstandard
# 405 : 1 : {
# 406 : 1 : CWallet keystore(chain.get(), "", CreateDummyWalletDatabase());
# 407 : 1 : keystore.SetupLegacyScriptPubKeyMan();
# 408 : 1 : LOCK(keystore.GetLegacyScriptPubKeyMan()->cs_KeyStore);
# 409 : 1 : BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
# 410 : :
# 411 : 1 : scriptPubKey.clear();
# 412 : 1 : scriptPubKey << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
# 413 : :
# 414 : 1 : result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
# 415 : 1 : BOOST_CHECK_EQUAL(result, ISMINE_NO);
# 416 : 1 : }
# 417 : 1 : }
# 418 : :
# 419 : : BOOST_AUTO_TEST_SUITE_END()
|