@@ -212,6 +212,11 @@ struct PubkeyProvider
212
212
213
213
/* * Derive a private key, if private data is available in arg. */
214
214
virtual bool GetPrivKey (int pos, const SigningProvider& arg, CKey& key) const = 0;
215
+
216
+ /* * Return the non-extended public key for this PubkeyProvider, if it has one. */
217
+ virtual std::optional<CPubKey> GetRootPubKey () const = 0;
218
+ /* * Return the extended public key for this PubkeyProvider, if it has one. */
219
+ virtual std::optional<CExtPubKey> GetRootExtPubKey () const = 0;
215
220
};
216
221
217
222
class OriginPubkeyProvider final : public PubkeyProvider
@@ -265,6 +270,14 @@ class OriginPubkeyProvider final : public PubkeyProvider
265
270
{
266
271
return m_provider->GetPrivKey (pos, arg, key);
267
272
}
273
+ std::optional<CPubKey> GetRootPubKey () const override
274
+ {
275
+ return m_provider->GetRootPubKey ();
276
+ }
277
+ std::optional<CExtPubKey> GetRootExtPubKey () const override
278
+ {
279
+ return m_provider->GetRootExtPubKey ();
280
+ }
268
281
};
269
282
270
283
/* * An object representing a parsed constant public key in a descriptor. */
@@ -310,6 +323,14 @@ class ConstPubkeyProvider final : public PubkeyProvider
310
323
{
311
324
return arg.GetKey (m_pubkey.GetID (), key);
312
325
}
326
+ std::optional<CPubKey> GetRootPubKey () const override
327
+ {
328
+ return m_pubkey;
329
+ }
330
+ std::optional<CExtPubKey> GetRootExtPubKey () const override
331
+ {
332
+ return std::nullopt;
333
+ }
313
334
};
314
335
315
336
enum class DeriveType {
@@ -525,6 +546,14 @@ class BIP32PubkeyProvider final : public PubkeyProvider
525
546
key = extkey.key ;
526
547
return true ;
527
548
}
549
+ std::optional<CPubKey> GetRootPubKey () const override
550
+ {
551
+ return std::nullopt;
552
+ }
553
+ std::optional<CExtPubKey> GetRootExtPubKey () const override
554
+ {
555
+ return m_root_extkey;
556
+ }
528
557
};
529
558
530
559
/* * Base class for all Descriptor implementations. */
@@ -720,6 +749,19 @@ class DescriptorImpl : public Descriptor
720
749
std::optional<int64_t > MaxSatisfactionWeight (bool ) const override { return {}; }
721
750
722
751
std::optional<int64_t > MaxSatisfactionElems () const override { return {}; }
752
+
753
+ void GetPubKeys (std::set<CPubKey>& pubkeys, std::set<CExtPubKey>& ext_pubs) const override
754
+ {
755
+ for (const auto & p : m_pubkey_args) {
756
+ std::optional<CPubKey> pub = p->GetRootPubKey ();
757
+ if (pub) pubkeys.insert (*pub);
758
+ std::optional<CExtPubKey> ext_pub = p->GetRootExtPubKey ();
759
+ if (ext_pub) ext_pubs.insert (*ext_pub);
760
+ }
761
+ for (const auto & arg : m_subdescriptor_args) {
762
+ arg->GetPubKeys (pubkeys, ext_pubs);
763
+ }
764
+ }
723
765
};
724
766
725
767
/* * A parsed addr(A) descriptor. */
0 commit comments