mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-30 02:31:05 +02:00
wallet: AvailableCoins, simplify output script type acquisition
This commit is contained in:
@ -260,32 +260,24 @@ CoinsResult AvailableCoins(const CWallet& wallet,
|
|||||||
// Filter by spendable outputs only
|
// Filter by spendable outputs only
|
||||||
if (!spendable && only_spendable) continue;
|
if (!spendable && only_spendable) continue;
|
||||||
|
|
||||||
// If the Output is P2SH and spendable, we want to know if it is
|
// Obtain script type
|
||||||
|
std::vector<std::vector<uint8_t>> script_solutions;
|
||||||
|
TxoutType type = Solver(output.scriptPubKey, script_solutions);
|
||||||
|
|
||||||
|
// If the output is P2SH and solvable, we want to know if it is
|
||||||
// a P2SH (legacy) or one of P2SH-P2WPKH, P2SH-P2WSH (P2SH-Segwit). We can determine
|
// a P2SH (legacy) or one of P2SH-P2WPKH, P2SH-P2WSH (P2SH-Segwit). We can determine
|
||||||
// this from the redeemScript. If the Output is not spendable, it will be classified
|
// this from the redeemScript. If the output is not solvable, it will be classified
|
||||||
// as a P2SH (legacy), since we have no way of knowing otherwise without the redeemScript
|
// as a P2SH (legacy), since we have no way of knowing otherwise without the redeemScript
|
||||||
CScript script;
|
|
||||||
bool is_from_p2sh{false};
|
bool is_from_p2sh{false};
|
||||||
if (output.scriptPubKey.IsPayToScriptHash() && solvable) {
|
if (type == TxoutType::SCRIPTHASH && solvable) {
|
||||||
CTxDestination destination;
|
CScript script;
|
||||||
if (!ExtractDestination(output.scriptPubKey, destination))
|
if (!provider->GetCScript(CScriptID(uint160(script_solutions[0])), script)) continue;
|
||||||
continue;
|
type = Solver(script, script_solutions);
|
||||||
const CScriptID& hash = CScriptID(std::get<ScriptHash>(destination));
|
|
||||||
if (!provider->GetCScript(hash, script))
|
|
||||||
continue;
|
|
||||||
is_from_p2sh = true;
|
is_from_p2sh = true;
|
||||||
} else {
|
|
||||||
script = output.scriptPubKey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
COutput coin(outpoint, output, nDepth, input_bytes, spendable, solvable, safeTx, wtx.GetTxTime(), tx_from_me, feerate);
|
result.Add(GetOutputType(type, is_from_p2sh),
|
||||||
|
COutput(outpoint, output, nDepth, input_bytes, spendable, solvable, safeTx, wtx.GetTxTime(), tx_from_me, feerate));
|
||||||
// When parsing a scriptPubKey, Solver returns the parsed pubkeys or hashes (depending on the script)
|
|
||||||
// We don't need those here, so we are leaving them in return_values_unused
|
|
||||||
std::vector<std::vector<uint8_t>> return_values_unused;
|
|
||||||
TxoutType type;
|
|
||||||
type = Solver(script, return_values_unused);
|
|
||||||
result.Add(GetOutputType(type, is_from_p2sh), coin);
|
|
||||||
|
|
||||||
// Cache total amount as we go
|
// Cache total amount as we go
|
||||||
result.total_amount += output.nValue;
|
result.total_amount += output.nValue;
|
||||||
|
Reference in New Issue
Block a user