aboutsummaryrefslogtreecommitdiff
path: root/src/script/sign.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2019-02-16 14:18:54 -0800
committerPieter Wuille <pieter.wuille@gmail.com>2019-05-10 14:22:33 -0700
commiteaf4f887348a08c620732125ad4430e1a133d434 (patch)
tree81dcc32ec90bd4c5ea8b0ada61e348cfd6b4b0d2 /src/script/sign.cpp
parente79bbb73e08e3f191e97d3b67a2fbb510c5545ff (diff)
downloadbitcoin-eaf4f887348a08c620732125ad4430e1a133d434.tar.xz
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.
Diffstat (limited to 'src/script/sign.cpp')
-rw-r--r--src/script/sign.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/script/sign.cpp b/src/script/sign.cpp
index 36dd68a3d8..5320dc0876 100644
--- a/src/script/sign.cpp
+++ b/src/script/sign.cpp
@@ -505,3 +505,19 @@ FlatSigningProvider Merge(const FlatSigningProvider& a, const FlatSigningProvide
ret.origins.insert(b.origins.begin(), b.origins.end());
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;
+}