Abstract out IsSegWitOutput from utxoupdatepsbt
This is not a pure refactor; additional functionality is added in IsSegWitOutput which lets it recurse into P2SH when a SigningProvider is provided that knows about the inner script.
This commit is contained in:
parent
e79bbb73e0
commit
eaf4f88734
3 changed files with 20 additions and 3 deletions
|
@ -1540,9 +1540,7 @@ UniValue utxoupdatepsbt(const JSONRPCRequest& request)
|
||||||
|
|
||||||
const Coin& coin = view.AccessCoin(psbtx.tx->vin[i].prevout);
|
const Coin& coin = view.AccessCoin(psbtx.tx->vin[i].prevout);
|
||||||
|
|
||||||
std::vector<std::vector<unsigned char>> solutions_data;
|
if (IsSegWitOutput(DUMMY_SIGNING_PROVIDER, coin.out.scriptPubKey)) {
|
||||||
txnouttype which_type = Solver(coin.out.scriptPubKey, solutions_data);
|
|
||||||
if (which_type == TX_WITNESS_V0_SCRIPTHASH || which_type == TX_WITNESS_V0_KEYHASH || which_type == TX_WITNESS_UNKNOWN) {
|
|
||||||
input.witness_utxo = coin.out;
|
input.witness_utxo = coin.out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -505,3 +505,19 @@ FlatSigningProvider Merge(const FlatSigningProvider& a, const FlatSigningProvide
|
||||||
ret.origins.insert(b.origins.begin(), b.origins.end());
|
ret.origins.insert(b.origins.begin(), b.origins.end());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsSegWitOutput(const SigningProvider& provider, const CScript& script)
|
||||||
|
{
|
||||||
|
std::vector<valtype> solutions;
|
||||||
|
auto whichtype = Solver(script, solutions);
|
||||||
|
if (whichtype == TX_WITNESS_V0_SCRIPTHASH || whichtype == TX_WITNESS_V0_KEYHASH || whichtype == TX_WITNESS_UNKNOWN) return true;
|
||||||
|
if (whichtype == TX_SCRIPTHASH) {
|
||||||
|
auto h160 = uint160(solutions[0]);
|
||||||
|
CScript subscript;
|
||||||
|
if (provider.GetCScript(h160, subscript)) {
|
||||||
|
whichtype = Solver(subscript, solutions);
|
||||||
|
if (whichtype == TX_WITNESS_V0_SCRIPTHASH || whichtype == TX_WITNESS_V0_KEYHASH || whichtype == TX_WITNESS_UNKNOWN) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -232,4 +232,7 @@ void UpdateInput(CTxIn& input, const SignatureData& data);
|
||||||
* Solvability is unrelated to whether we consider this output to be ours. */
|
* Solvability is unrelated to whether we consider this output to be ours. */
|
||||||
bool IsSolvable(const SigningProvider& provider, const CScript& script);
|
bool IsSolvable(const SigningProvider& provider, const CScript& script);
|
||||||
|
|
||||||
|
/** Check whether a scriptPubKey is known to be segwit. */
|
||||||
|
bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
|
||||||
|
|
||||||
#endif // BITCOIN_SCRIPT_SIGN_H
|
#endif // BITCOIN_SCRIPT_SIGN_H
|
||||||
|
|
Loading…
Reference in a new issue