aboutsummaryrefslogtreecommitdiff
path: root/src/outputtype.cpp
diff options
context:
space:
mode:
authorAnthony Towns <aj@erisian.com.au>2018-07-09 19:30:39 +1000
committerAnthony Towns <aj@erisian.com.au>2018-07-10 00:06:19 +1000
commitd58055d25f41e942e04ffeae5f25e37a60ee8829 (patch)
treeb672c2f0cdb88537a9112d7b750b65589c0b9853 /src/outputtype.cpp
parent9a44db2e46af2b73e0dbaa929244161b18c15162 (diff)
downloadbitcoin-d58055d25f41e942e04ffeae5f25e37a60ee8829.tar.xz
Move AddAndGetDestinationForScript from wallet to outputype module
Makes AddAndGetDestinationForScript use a generic CKeyStore rather than the wallet, and makes it always add the script to the keystore, rather than only adding related (redeem) scripts.
Diffstat (limited to 'src/outputtype.cpp')
-rw-r--r--src/outputtype.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/outputtype.cpp b/src/outputtype.cpp
index 025d8a96fd..3ff28bf9c2 100644
--- a/src/outputtype.cpp
+++ b/src/outputtype.cpp
@@ -73,4 +73,29 @@ std::vector<CTxDestination> GetAllDestinationsForKey(const CPubKey& key)
}
}
+CTxDestination AddAndGetDestinationForScript(CKeyStore& keystore, const CScript& script, OutputType type)
+{
+ // Add script to keystore
+ keystore.AddCScript(script);
+ // Note that scripts over 520 bytes are not yet supported.
+ switch (type) {
+ case OutputType::LEGACY:
+ return CScriptID(script);
+ case OutputType::P2SH_SEGWIT:
+ case OutputType::BECH32: {
+ CTxDestination witdest = WitnessV0ScriptHash(script);
+ CScript witprog = GetScriptForDestination(witdest);
+ // Check if the resulting program is solvable (i.e. doesn't use an uncompressed key)
+ if (!IsSolvable(keystore, witprog)) return CScriptID(script);
+ // Add the redeemscript, so that P2WSH and P2SH-P2WSH outputs are recognized as ours.
+ keystore.AddCScript(witprog);
+ if (type == OutputType::BECH32) {
+ return witdest;
+ } else {
+ return CScriptID(witprog);
+ }
+ }
+ default: assert(false);
+ }
+}