Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto
2 : : // Copyright (c) 2009-present The Bitcoin Core developers
3 : : // Distributed under the MIT software license, see the accompanying
4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 : :
6 : : #include <outputtype.h>
7 : :
8 : : #include <pubkey.h>
9 : : #include <script/script.h>
10 : : #include <script/sign.h>
11 : : #include <script/signingprovider.h>
12 : :
13 : : #include <cassert>
14 : : #include <optional>
15 : : #include <string>
16 : :
17 : : static const std::string OUTPUT_TYPE_STRING_LEGACY = "legacy";
18 : : static const std::string OUTPUT_TYPE_STRING_P2SH_SEGWIT = "p2sh-segwit";
19 : : static const std::string OUTPUT_TYPE_STRING_BECH32 = "bech32";
20 : : static const std::string OUTPUT_TYPE_STRING_BECH32M = "bech32m";
21 : : static const std::string OUTPUT_TYPE_STRING_UNKNOWN = "unknown";
22 : :
23 : 1287 : std::optional<OutputType> ParseOutputType(const std::string& type)
24 : : {
25 [ + + ]: 1287 : if (type == OUTPUT_TYPE_STRING_LEGACY) {
26 : 42 : return OutputType::LEGACY;
27 [ + + ]: 1245 : } else if (type == OUTPUT_TYPE_STRING_P2SH_SEGWIT) {
28 : 23 : return OutputType::P2SH_SEGWIT;
29 [ + + ]: 1222 : } else if (type == OUTPUT_TYPE_STRING_BECH32) {
30 : 12 : return OutputType::BECH32;
31 [ + + ]: 1210 : } else if (type == OUTPUT_TYPE_STRING_BECH32M) {
32 : 16 : return OutputType::BECH32M;
33 : : }
34 : 1194 : return std::nullopt;
35 : : }
36 : :
37 : 29722 : const std::string& FormatOutputType(OutputType type)
38 : : {
39 [ + + + - : 29722 : switch (type) {
- + ]
40 : : case OutputType::LEGACY: return OUTPUT_TYPE_STRING_LEGACY;
41 : 7032 : case OutputType::P2SH_SEGWIT: return OUTPUT_TYPE_STRING_P2SH_SEGWIT;
42 : 8600 : case OutputType::BECH32: return OUTPUT_TYPE_STRING_BECH32;
43 : 7032 : case OutputType::BECH32M: return OUTPUT_TYPE_STRING_BECH32M;
44 : 0 : case OutputType::UNKNOWN: return OUTPUT_TYPE_STRING_UNKNOWN;
45 : : } // no default case, so the compiler can warn about missing cases
46 : 0 : assert(false);
47 : : }
48 : :
49 : 3144 : std::string FormatAllOutputTypes()
50 : : {
51 [ + - ]: 28296 : return util::Join(OUTPUT_TYPES, ", ", [](const auto& i) { return "\"" + FormatOutputType(i) + "\""; });
52 : : }
53 : :
54 : 81 : CTxDestination AddAndGetDestinationForScript(FlatSigningProvider& keystore, const CScript& script, OutputType type)
55 : : {
56 : : // Add script to keystore
57 : 81 : keystore.scripts.emplace(CScriptID(script), script);
58 : :
59 [ + + - ]: 81 : switch (type) {
60 : 71 : case OutputType::LEGACY:
61 : 71 : return ScriptHash(script);
62 : 10 : case OutputType::P2SH_SEGWIT:
63 : 10 : case OutputType::BECH32: {
64 [ + - ]: 10 : CTxDestination witdest = WitnessV0ScriptHash(script);
65 [ + - ]: 10 : CScript witprog = GetScriptForDestination(witdest);
66 : : // Add the redeemscript, so that P2WSH and P2SH-P2WSH outputs are recognized as ours.
67 [ + - + - ]: 10 : keystore.scripts.emplace(CScriptID(witprog), witprog);
68 [ + + ]: 10 : if (type == OutputType::BECH32) {
69 : 2 : return witdest;
70 : : } else {
71 [ + - ]: 8 : return ScriptHash(witprog);
72 : : }
73 : 10 : }
74 : 0 : case OutputType::BECH32M:
75 : 0 : case OutputType::UNKNOWN: {} // This function should not be used for BECH32M or UNKNOWN, so let it assert
76 : : } // no default case, so the compiler can warn about missing cases
77 : 0 : assert(false);
78 : : }
79 : :
80 : 5161 : std::optional<OutputType> OutputTypeFromDestination(const CTxDestination& dest) {
81 [ + - ]: 5161 : if (std::holds_alternative<PKHash>(dest) ||
82 [ + + ]: 5161 : std::holds_alternative<ScriptHash>(dest)) {
83 : 128 : return OutputType::LEGACY;
84 : : }
85 [ + + ]: 5033 : if (std::holds_alternative<WitnessV0KeyHash>(dest) ||
86 [ + + ]: 5030 : std::holds_alternative<WitnessV0ScriptHash>(dest)) {
87 : 84 : return OutputType::BECH32;
88 : : }
89 [ + + ]: 4949 : if (std::holds_alternative<WitnessV1Taproot>(dest) ||
90 [ + + ]: 4888 : std::holds_alternative<WitnessUnknown>(dest)) {
91 : 400 : return OutputType::BECH32M;
92 : : }
93 : 4549 : return std::nullopt;
94 : : }
|