Skip to content

Commit 6d1f798

Browse files
committed
allow spending from pubkeys
1 parent 32d3a24 commit 6d1f798

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

src/wallet/interfaces.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ WalletTx MakeWalletTx(CWallet& wallet, const CWalletTx& wtx)
6060
result.txout_address.reserve(wtx.tx->vout.size());
6161
result.txout_address_is_mine.reserve(wtx.tx->vout.size());
6262
for (const auto& txout : wtx.tx->vout) {
63+
CTxDestination address;
64+
ExtractDestination(txout.scriptPubKey, address);
6365
result.txout_is_mine.emplace_back(wallet.IsMine(txout));
64-
result.txout_address.emplace_back();
65-
result.txout_address_is_mine.emplace_back(ExtractDestination(txout.scriptPubKey, result.txout_address.back()) ?
66-
wallet.IsMine(result.txout_address.back()) :
67-
ISMINE_NO);
66+
result.txout_address.emplace_back(address);
67+
result.txout_address_is_mine.emplace_back(wallet.IsMine(txout));
6868
}
6969
result.credit = CachedTxGetCredit(wallet, wtx, ISMINE_ALL);
7070
result.debit = CachedTxGetDebit(wallet, wtx, ISMINE_ALL);

src/wallet/scriptpubkeyman.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2122,7 +2122,14 @@ bool DescriptorScriptPubKeyMan::SignTransaction(CMutableTransaction& tx, const s
21222122
{
21232123
std::unique_ptr<FlatSigningProvider> keys = std::make_unique<FlatSigningProvider>();
21242124
for (const auto& coin_pair : coins) {
2125-
std::unique_ptr<FlatSigningProvider> coin_keys = GetSigningProvider(coin_pair.second.out.scriptPubKey, true);
2125+
std::unique_ptr<FlatSigningProvider> coin_keys;
2126+
// handle pubkeys gracefully
2127+
std::vector<valtype> vSolutions;
2128+
TxoutType whichType = Solver(coin_pair.second.out.scriptPubKey, vSolutions);
2129+
if (whichType == TxoutType::PUBKEY)
2130+
coin_keys = GetSigningProvider(GetScriptForDestination(PKHash(CPubKey(vSolutions[0]))), true);
2131+
else
2132+
coin_keys = GetSigningProvider(coin_pair.second.out.scriptPubKey, true);
21262133
if (!coin_keys) {
21272134
continue;
21282135
}

src/wallet/wallet.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,14 @@ CAmount CWallet::GetDebit(const CTxIn &txin, const isminefilter& filter) const
13841384
isminetype CWallet::IsMine(const CTxOut& txout) const
13851385
{
13861386
AssertLockHeld(cs_wallet);
1387-
return IsMine(txout.scriptPubKey);
1387+
isminetype result = IsMine(txout.scriptPubKey);
1388+
if (result == ISMINE_NO) // try pubkeyhash version of the address
1389+
{
1390+
CTxDestination address;
1391+
ExtractDestination(txout.scriptPubKey, address);
1392+
result = IsMine(address);
1393+
}
1394+
return result;
13881395
}
13891396

13901397
isminetype CWallet::IsMine(const CTxDestination& dest) const

0 commit comments

Comments
 (0)