LCOV - code coverage report
Current view: top level - src/wallet/test - ismine_tests.cpp (source / functions) Coverage Total Hit
Test: test_bitcoin_coverage.info Lines: 100.0 % 481 481
Test Date: 2024-08-28 04:44:32 Functions: 100.0 % 3 3
Branches: 50.2 % 2092 1050

             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
        

Generated by: LCOV version 2.0-1