diff options
author | Anthony Towns <aj@erisian.com.au> | 2018-07-09 19:30:39 +1000 |
---|---|---|
committer | Anthony Towns <aj@erisian.com.au> | 2018-07-10 00:06:19 +1000 |
commit | d58055d25f41e942e04ffeae5f25e37a60ee8829 (patch) | |
tree | b672c2f0cdb88537a9112d7b750b65589c0b9853 /src/outputtype.cpp | |
parent | 9a44db2e46af2b73e0dbaa929244161b18c15162 (diff) | |
download | bitcoin-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.cpp | 25 |
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); + } +} |