@@ -254,18 +254,19 @@ enum class DeriveType {
254
254
/* * An object representing a parsed extended public key in a descriptor. */
255
255
class BIP32PubkeyProvider final : public PubkeyProvider
256
256
{
257
- CExtPubKey m_extkey;
257
+ // Root xpub, path, and final derivation step type being used, if any
258
+ CExtPubKey m_root_extkey;
258
259
KeyPath m_path;
259
260
DeriveType m_derive;
260
261
261
262
bool GetExtKey (const SigningProvider& arg, CExtKey& ret) const
262
263
{
263
264
CKey key;
264
- if (!arg.GetKey (m_extkey .pubkey .GetID (), key)) return false ;
265
- ret.nDepth = m_extkey .nDepth ;
266
- std::copy (m_extkey .vchFingerprint , m_extkey .vchFingerprint + sizeof (ret.vchFingerprint ), ret.vchFingerprint );
267
- ret.nChild = m_extkey .nChild ;
268
- ret.chaincode = m_extkey .chaincode ;
265
+ if (!arg.GetKey (m_root_extkey .pubkey .GetID (), key)) return false ;
266
+ ret.nDepth = m_root_extkey .nDepth ;
267
+ std::copy (m_root_extkey .vchFingerprint , m_root_extkey .vchFingerprint + sizeof (ret.vchFingerprint ), ret.vchFingerprint );
268
+ ret.nChild = m_root_extkey .nChild ;
269
+ ret.chaincode = m_root_extkey .chaincode ;
269
270
ret.key = key;
270
271
return true ;
271
272
}
@@ -280,7 +281,7 @@ class BIP32PubkeyProvider final : public PubkeyProvider
280
281
}
281
282
282
283
public:
283
- BIP32PubkeyProvider (uint32_t exp_index, const CExtPubKey& extkey, KeyPath path, DeriveType derive) : PubkeyProvider(exp_index), m_extkey (extkey), m_path(std::move(path)), m_derive(derive) {}
284
+ BIP32PubkeyProvider (uint32_t exp_index, const CExtPubKey& extkey, KeyPath path, DeriveType derive) : PubkeyProvider(exp_index), m_root_extkey (extkey), m_path(std::move(path)), m_derive(derive) {}
284
285
bool IsRange () const override { return m_derive != DeriveType::NO; }
285
286
size_t GetSize () const override { return 33 ; }
286
287
bool GetPubKey (int pos, const SigningProvider& arg, CPubKey* key, KeyOriginInfo& info) const override
@@ -292,7 +293,7 @@ class BIP32PubkeyProvider final : public PubkeyProvider
292
293
*key = priv_key.GetPubKey ();
293
294
} else {
294
295
// TODO: optimize by caching
295
- CExtPubKey extkey = m_extkey ;
296
+ CExtPubKey extkey = m_root_extkey ;
296
297
for (auto entry : m_path) {
297
298
extkey.Derive (extkey, entry);
298
299
}
@@ -301,7 +302,7 @@ class BIP32PubkeyProvider final : public PubkeyProvider
301
302
*key = extkey.pubkey ;
302
303
}
303
304
}
304
- CKeyID keyid = m_extkey .pubkey .GetID ();
305
+ CKeyID keyid = m_root_extkey .pubkey .GetID ();
305
306
std::copy (keyid.begin (), keyid.begin () + sizeof (info.fingerprint ), info.fingerprint );
306
307
info.path = m_path;
307
308
if (m_derive == DeriveType::UNHARDENED) info.path .push_back ((uint32_t )pos);
@@ -310,7 +311,7 @@ class BIP32PubkeyProvider final : public PubkeyProvider
310
311
}
311
312
std::string ToString () const override
312
313
{
313
- std::string ret = EncodeExtPubKey (m_extkey ) + FormatHDKeypath (m_path);
314
+ std::string ret = EncodeExtPubKey (m_root_extkey ) + FormatHDKeypath (m_path);
314
315
if (IsRange ()) {
315
316
ret += " /*" ;
316
317
if (m_derive == DeriveType::HARDENED) ret += ' \' ' ;
0 commit comments