aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Chow <github@achow101.com>2023-08-08 10:57:31 -0400
committerAndrew Chow <github@achow101.com>2023-08-14 17:38:27 -0400
commit7a172c76d2361fc3cdf6345590e26c79a7821672 (patch)
treef31f48f1870110717fe4988ac73f775c90871bdd
parent145f36ec81e79d2e391847520364c2420ef0e0e8 (diff)
downloadbitcoin-7a172c76d2361fc3cdf6345590e26c79a7821672.tar.xz
Move CTxDestination to its own file
CTxDestination is really our internal representation of an address and doesn't really have anything to do with standard script types, so move them to their own file.
-rw-r--r--src/Makefile.am2
-rw-r--r--src/addresstype.cpp150
-rw-r--r--src/addresstype.h121
-rw-r--r--src/bench/descriptors.cpp1
-rw-r--r--src/interfaces/wallet.h8
-rw-r--r--src/key_io.h1
-rw-r--r--src/outputtype.h2
-rw-r--r--src/script/signingprovider.h1
-rw-r--r--src/script/standard.cpp135
-rw-r--r--src/script/standard.h105
-rw-r--r--src/test/blockfilter_index_tests.cpp1
-rw-r--r--src/test/coins_tests.cpp1
-rw-r--r--src/test/fuzz/util.h1
-rw-r--r--src/test/miner_tests.cpp1
-rw-r--r--src/test/miniscript_tests.cpp1
-rw-r--r--src/test/sigopcount_tests.cpp1
-rw-r--r--src/test/txindex_tests.cpp1
-rw-r--r--src/wallet/scriptpubkeyman.h1
-rw-r--r--src/wallet/test/util.h2
-rw-r--r--src/wallet/test/wallet_tests.cpp1
-rw-r--r--src/wallet/wallet.h1
21 files changed, 291 insertions, 247 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index a108e60c86..3efc008e33 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -117,6 +117,7 @@ endif
.PHONY: FORCE check-symbols check-security
# bitcoin core #
BITCOIN_CORE_H = \
+ addresstype.h \
addrdb.h \
addrman.h \
addrman_impl.h \
@@ -657,6 +658,7 @@ libbitcoin_consensus_a_SOURCES = \
libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_common_a_SOURCES = \
+ addresstype.cpp \
base58.cpp \
bech32.cpp \
chainparams.cpp \
diff --git a/src/addresstype.cpp b/src/addresstype.cpp
new file mode 100644
index 0000000000..96428df846
--- /dev/null
+++ b/src/addresstype.cpp
@@ -0,0 +1,150 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+
+#include <addresstype.h>
+#include <script/script.h>
+#include <script/standard.h>
+#include <hash.h>
+#include <pubkey.h>
+#include <uint256.h>
+#include <util/hash_type.h>
+
+#include <vector>
+
+typedef std::vector<unsigned char> valtype;
+
+ScriptHash::ScriptHash(const CScript& in) : BaseHash(Hash160(in)) {}
+ScriptHash::ScriptHash(const CScriptID& in) : BaseHash(static_cast<uint160>(in)) {}
+
+PKHash::PKHash(const CPubKey& pubkey) : BaseHash(pubkey.GetID()) {}
+PKHash::PKHash(const CKeyID& pubkey_id) : BaseHash(pubkey_id) {}
+
+WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : BaseHash(pubkey.GetID()) {}
+WitnessV0KeyHash::WitnessV0KeyHash(const PKHash& pubkey_hash) : BaseHash(static_cast<uint160>(pubkey_hash)) {}
+
+CKeyID ToKeyID(const PKHash& key_hash)
+{
+ return CKeyID{static_cast<uint160>(key_hash)};
+}
+
+CKeyID ToKeyID(const WitnessV0KeyHash& key_hash)
+{
+ return CKeyID{static_cast<uint160>(key_hash)};
+}
+
+CScriptID ToScriptID(const ScriptHash& script_hash)
+{
+ return CScriptID{static_cast<uint160>(script_hash)};
+}
+
+WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in)
+{
+ CSHA256().Write(in.data(), in.size()).Finalize(begin());
+}
+
+bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
+{
+ std::vector<valtype> vSolutions;
+ TxoutType whichType = Solver(scriptPubKey, vSolutions);
+
+ switch (whichType) {
+ case TxoutType::PUBKEY: {
+ CPubKey pubKey(vSolutions[0]);
+ if (!pubKey.IsValid())
+ return false;
+
+ addressRet = PKHash(pubKey);
+ return true;
+ }
+ case TxoutType::PUBKEYHASH: {
+ addressRet = PKHash(uint160(vSolutions[0]));
+ return true;
+ }
+ case TxoutType::SCRIPTHASH: {
+ addressRet = ScriptHash(uint160(vSolutions[0]));
+ return true;
+ }
+ case TxoutType::WITNESS_V0_KEYHASH: {
+ WitnessV0KeyHash hash;
+ std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
+ addressRet = hash;
+ return true;
+ }
+ case TxoutType::WITNESS_V0_SCRIPTHASH: {
+ WitnessV0ScriptHash hash;
+ std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
+ addressRet = hash;
+ return true;
+ }
+ case TxoutType::WITNESS_V1_TAPROOT: {
+ WitnessV1Taproot tap;
+ std::copy(vSolutions[0].begin(), vSolutions[0].end(), tap.begin());
+ addressRet = tap;
+ return true;
+ }
+ case TxoutType::WITNESS_UNKNOWN: {
+ WitnessUnknown unk;
+ unk.version = vSolutions[0][0];
+ std::copy(vSolutions[1].begin(), vSolutions[1].end(), unk.program);
+ unk.length = vSolutions[1].size();
+ addressRet = unk;
+ return true;
+ }
+ case TxoutType::MULTISIG:
+ case TxoutType::NULL_DATA:
+ case TxoutType::NONSTANDARD:
+ return false;
+ } // no default case, so the compiler can warn about missing cases
+ assert(false);
+}
+
+namespace {
+class CScriptVisitor
+{
+public:
+ CScript operator()(const CNoDestination& dest) const
+ {
+ return CScript();
+ }
+
+ CScript operator()(const PKHash& keyID) const
+ {
+ return CScript() << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
+ }
+
+ CScript operator()(const ScriptHash& scriptID) const
+ {
+ return CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
+ }
+
+ CScript operator()(const WitnessV0KeyHash& id) const
+ {
+ return CScript() << OP_0 << ToByteVector(id);
+ }
+
+ CScript operator()(const WitnessV0ScriptHash& id) const
+ {
+ return CScript() << OP_0 << ToByteVector(id);
+ }
+
+ CScript operator()(const WitnessV1Taproot& tap) const
+ {
+ return CScript() << OP_1 << ToByteVector(tap);
+ }
+
+ CScript operator()(const WitnessUnknown& id) const
+ {
+ return CScript() << CScript::EncodeOP_N(id.version) << std::vector<unsigned char>(id.program, id.program + id.length);
+ }
+};
+} // namespace
+
+CScript GetScriptForDestination(const CTxDestination& dest)
+{
+ return std::visit(CScriptVisitor(), dest);
+}
+
+bool IsValidDestination(const CTxDestination& dest) {
+ return dest.index() != 0;
+}
diff --git a/src/addresstype.h b/src/addresstype.h
new file mode 100644
index 0000000000..6b651e9014
--- /dev/null
+++ b/src/addresstype.h
@@ -0,0 +1,121 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_ADDRESSTYPE_H
+#define BITCOIN_ADDRESSTYPE_H
+
+#include <pubkey.h>
+#include <script/script.h>
+#include <uint256.h>
+#include <util/hash_type.h>
+
+#include <variant>
+#include <algorithm>
+
+class CNoDestination {
+public:
+ friend bool operator==(const CNoDestination &a, const CNoDestination &b) { return true; }
+ friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
+};
+
+struct PKHash : public BaseHash<uint160>
+{
+ PKHash() : BaseHash() {}
+ explicit PKHash(const uint160& hash) : BaseHash(hash) {}
+ explicit PKHash(const CPubKey& pubkey);
+ explicit PKHash(const CKeyID& pubkey_id);
+};
+CKeyID ToKeyID(const PKHash& key_hash);
+
+struct WitnessV0KeyHash;
+
+struct ScriptHash : public BaseHash<uint160>
+{
+ ScriptHash() : BaseHash() {}
+ // These don't do what you'd expect.
+ // Use ScriptHash(GetScriptForDestination(...)) instead.
+ explicit ScriptHash(const WitnessV0KeyHash& hash) = delete;
+ explicit ScriptHash(const PKHash& hash) = delete;
+
+ explicit ScriptHash(const uint160& hash) : BaseHash(hash) {}
+ explicit ScriptHash(const CScript& script);
+ explicit ScriptHash(const CScriptID& script);
+};
+CScriptID ToScriptID(const ScriptHash& script_hash);
+
+struct WitnessV0ScriptHash : public BaseHash<uint256>
+{
+ WitnessV0ScriptHash() : BaseHash() {}
+ explicit WitnessV0ScriptHash(const uint256& hash) : BaseHash(hash) {}
+ explicit WitnessV0ScriptHash(const CScript& script);
+};
+
+struct WitnessV0KeyHash : public BaseHash<uint160>
+{
+ WitnessV0KeyHash() : BaseHash() {}
+ explicit WitnessV0KeyHash(const uint160& hash) : BaseHash(hash) {}
+ explicit WitnessV0KeyHash(const CPubKey& pubkey);
+ explicit WitnessV0KeyHash(const PKHash& pubkey_hash);
+};
+CKeyID ToKeyID(const WitnessV0KeyHash& key_hash);
+
+struct WitnessV1Taproot : public XOnlyPubKey
+{
+ WitnessV1Taproot() : XOnlyPubKey() {}
+ explicit WitnessV1Taproot(const XOnlyPubKey& xpk) : XOnlyPubKey(xpk) {}
+};
+
+//! CTxDestination subtype to encode any future Witness version
+struct WitnessUnknown
+{
+ unsigned int version;
+ unsigned int length;
+ unsigned char program[40];
+
+ friend bool operator==(const WitnessUnknown& w1, const WitnessUnknown& w2) {
+ if (w1.version != w2.version) return false;
+ if (w1.length != w2.length) return false;
+ return std::equal(w1.program, w1.program + w1.length, w2.program);
+ }
+
+ friend bool operator<(const WitnessUnknown& w1, const WitnessUnknown& w2) {
+ if (w1.version < w2.version) return true;
+ if (w1.version > w2.version) return false;
+ if (w1.length < w2.length) return true;
+ if (w1.length > w2.length) return false;
+ return std::lexicographical_compare(w1.program, w1.program + w1.length, w2.program, w2.program + w2.length);
+ }
+};
+
+/**
+ * A txout script template with a specific destination. It is either:
+ * * CNoDestination: no destination set
+ * * PKHash: TxoutType::PUBKEYHASH destination (P2PKH)
+ * * ScriptHash: TxoutType::SCRIPTHASH destination (P2SH)
+ * * WitnessV0ScriptHash: TxoutType::WITNESS_V0_SCRIPTHASH destination (P2WSH)
+ * * WitnessV0KeyHash: TxoutType::WITNESS_V0_KEYHASH destination (P2WPKH)
+ * * WitnessV1Taproot: TxoutType::WITNESS_V1_TAPROOT destination (P2TR)
+ * * WitnessUnknown: TxoutType::WITNESS_UNKNOWN destination (P2W???)
+ * A CTxDestination is the internal data type encoded in a bitcoin address
+ */
+using CTxDestination = std::variant<CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>;
+
+/** Check whether a CTxDestination is a CNoDestination. */
+bool IsValidDestination(const CTxDestination& dest);
+
+/**
+ * Parse a standard scriptPubKey for the destination address. Assigns result to
+ * the addressRet parameter and returns true if successful. Currently only works for P2PK,
+ * P2PKH, P2SH, P2WPKH, and P2WSH scripts.
+ */
+bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
+
+/**
+ * Generate a Bitcoin scriptPubKey for the given CTxDestination. Returns a P2PKH
+ * script for a CKeyID destination, a P2SH script for a CScriptID, and an empty
+ * script for CNoDestination.
+ */
+CScript GetScriptForDestination(const CTxDestination& dest);
+
+#endif // BITCOIN_ADDRESSTYPE_H
diff --git a/src/bench/descriptors.cpp b/src/bench/descriptors.cpp
index 5d28d26909..fbef1395fb 100644
--- a/src/bench/descriptors.cpp
+++ b/src/bench/descriptors.cpp
@@ -6,7 +6,6 @@
#include <key.h>
#include <pubkey.h>
#include <script/descriptor.h>
-#include <script/standard.h>
#include <string>
#include <utility>
diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h
index 9d8bebb406..9987681367 100644
--- a/src/interfaces/wallet.h
+++ b/src/interfaces/wallet.h
@@ -5,12 +5,12 @@
#ifndef BITCOIN_INTERFACES_WALLET_H
#define BITCOIN_INTERFACES_WALLET_H
+#include <addresstype.h>
#include <consensus/amount.h>
-#include <interfaces/chain.h> // For ChainClient
-#include <pubkey.h> // For CKeyID and CScriptID (definitions needed in CTxDestination instantiation)
+#include <interfaces/chain.h>
+#include <pubkey.h>
#include <script/script.h>
-#include <script/standard.h> // For CTxDestination
-#include <support/allocators/secure.h> // For SecureString
+#include <support/allocators/secure.h>
#include <util/fs.h>
#include <util/message.h>
#include <util/result.h>
diff --git a/src/key_io.h b/src/key_io.h
index 07b80c4b85..6d2aface4c 100644
--- a/src/key_io.h
+++ b/src/key_io.h
@@ -6,6 +6,7 @@
#ifndef BITCOIN_KEY_IO_H
#define BITCOIN_KEY_IO_H
+#include <addresstype.h>
#include <chainparams.h>
#include <key.h>
#include <pubkey.h>
diff --git a/src/outputtype.h b/src/outputtype.h
index 7c50f445fc..a2d5942320 100644
--- a/src/outputtype.h
+++ b/src/outputtype.h
@@ -6,8 +6,8 @@
#ifndef BITCOIN_OUTPUTTYPE_H
#define BITCOIN_OUTPUTTYPE_H
+#include <addresstype.h>
#include <script/signingprovider.h>
-#include <script/standard.h>
#include <array>
#include <optional>
diff --git a/src/script/signingprovider.h b/src/script/signingprovider.h
index 26886e0d57..40927f57bc 100644
--- a/src/script/signingprovider.h
+++ b/src/script/signingprovider.h
@@ -6,6 +6,7 @@
#ifndef BITCOIN_SCRIPT_SIGNINGPROVIDER_H
#define BITCOIN_SCRIPT_SIGNINGPROVIDER_H
+#include <addresstype.h>
#include <attributes.h>
#include <key.h>
#include <pubkey.h>
diff --git a/src/script/standard.cpp b/src/script/standard.cpp
index 01b074e27c..6cbcf9a016 100644
--- a/src/script/standard.cpp
+++ b/src/script/standard.cpp
@@ -16,35 +16,6 @@
typedef std::vector<unsigned char> valtype;
-ScriptHash::ScriptHash(const CScript& in) : BaseHash(Hash160(in)) {}
-ScriptHash::ScriptHash(const CScriptID& in) : BaseHash(static_cast<uint160>(in)) {}
-
-PKHash::PKHash(const CPubKey& pubkey) : BaseHash(pubkey.GetID()) {}
-PKHash::PKHash(const CKeyID& pubkey_id) : BaseHash(pubkey_id) {}
-
-WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : BaseHash(pubkey.GetID()) {}
-WitnessV0KeyHash::WitnessV0KeyHash(const PKHash& pubkey_hash) : BaseHash(static_cast<uint160>(pubkey_hash)) {}
-
-CKeyID ToKeyID(const PKHash& key_hash)
-{
- return CKeyID{static_cast<uint160>(key_hash)};
-}
-
-CKeyID ToKeyID(const WitnessV0KeyHash& key_hash)
-{
- return CKeyID{static_cast<uint160>(key_hash)};
-}
-
-CScriptID ToScriptID(const ScriptHash& script_hash)
-{
- return CScriptID{static_cast<uint160>(script_hash)};
-}
-
-WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in)
-{
- CSHA256().Write(in.data(), in.size()).Finalize(begin());
-}
-
std::string GetTxnOutputType(TxoutType t)
{
switch (t) {
@@ -236,108 +207,6 @@ TxoutType Solver(const CScript& scriptPubKey, std::vector<std::vector<unsigned c
return TxoutType::NONSTANDARD;
}
-bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
-{
- std::vector<valtype> vSolutions;
- TxoutType whichType = Solver(scriptPubKey, vSolutions);
-
- switch (whichType) {
- case TxoutType::PUBKEY: {
- CPubKey pubKey(vSolutions[0]);
- if (!pubKey.IsValid())
- return false;
-
- addressRet = PKHash(pubKey);
- return true;
- }
- case TxoutType::PUBKEYHASH: {
- addressRet = PKHash(uint160(vSolutions[0]));
- return true;
- }
- case TxoutType::SCRIPTHASH: {
- addressRet = ScriptHash(uint160(vSolutions[0]));
- return true;
- }
- case TxoutType::WITNESS_V0_KEYHASH: {
- WitnessV0KeyHash hash;
- std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
- addressRet = hash;
- return true;
- }
- case TxoutType::WITNESS_V0_SCRIPTHASH: {
- WitnessV0ScriptHash hash;
- std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
- addressRet = hash;
- return true;
- }
- case TxoutType::WITNESS_V1_TAPROOT: {
- WitnessV1Taproot tap;
- std::copy(vSolutions[0].begin(), vSolutions[0].end(), tap.begin());
- addressRet = tap;
- return true;
- }
- case TxoutType::WITNESS_UNKNOWN: {
- WitnessUnknown unk;
- unk.version = vSolutions[0][0];
- std::copy(vSolutions[1].begin(), vSolutions[1].end(), unk.program);
- unk.length = vSolutions[1].size();
- addressRet = unk;
- return true;
- }
- case TxoutType::MULTISIG:
- case TxoutType::NULL_DATA:
- case TxoutType::NONSTANDARD:
- return false;
- } // no default case, so the compiler can warn about missing cases
- assert(false);
-}
-
-namespace {
-class CScriptVisitor
-{
-public:
- CScript operator()(const CNoDestination& dest) const
- {
- return CScript();
- }
-
- CScript operator()(const PKHash& keyID) const
- {
- return CScript() << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
- }
-
- CScript operator()(const ScriptHash& scriptID) const
- {
- return CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
- }
-
- CScript operator()(const WitnessV0KeyHash& id) const
- {
- return CScript() << OP_0 << ToByteVector(id);
- }
-
- CScript operator()(const WitnessV0ScriptHash& id) const
- {
- return CScript() << OP_0 << ToByteVector(id);
- }
-
- CScript operator()(const WitnessV1Taproot& tap) const
- {
- return CScript() << OP_1 << ToByteVector(tap);
- }
-
- CScript operator()(const WitnessUnknown& id) const
- {
- return CScript() << CScript::EncodeOP_N(id.version) << std::vector<unsigned char>(id.program, id.program + id.length);
- }
-};
-} // namespace
-
-CScript GetScriptForDestination(const CTxDestination& dest)
-{
- return std::visit(CScriptVisitor(), dest);
-}
-
CScript GetScriptForRawPubKey(const CPubKey& pubKey)
{
return CScript() << std::vector<unsigned char>(pubKey.begin(), pubKey.end()) << OP_CHECKSIG;
@@ -354,7 +223,3 @@ CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys)
return script;
}
-
-bool IsValidDestination(const CTxDestination& dest) {
- return dest.index() != 0;
-}
diff --git a/src/script/standard.h b/src/script/standard.h
index 9555cc2b61..097ab92652 100644
--- a/src/script/standard.h
+++ b/src/script/standard.h
@@ -18,7 +18,6 @@
static const bool DEFAULT_ACCEPT_DATACARRIER = true;
-class CKeyID;
class CScript;
/**
@@ -41,96 +40,6 @@ enum class TxoutType {
WITNESS_UNKNOWN, //!< Only for Witness versions not already defined above
};
-class CNoDestination {
-public:
- friend bool operator==(const CNoDestination &a, const CNoDestination &b) { return true; }
- friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
-};
-
-struct PKHash : public BaseHash<uint160>
-{
- PKHash() : BaseHash() {}
- explicit PKHash(const uint160& hash) : BaseHash(hash) {}
- explicit PKHash(const CPubKey& pubkey);
- explicit PKHash(const CKeyID& pubkey_id);
-};
-CKeyID ToKeyID(const PKHash& key_hash);
-
-struct WitnessV0KeyHash;
-struct ScriptHash : public BaseHash<uint160>
-{
- ScriptHash() : BaseHash() {}
- // These don't do what you'd expect.
- // Use ScriptHash(GetScriptForDestination(...)) instead.
- explicit ScriptHash(const WitnessV0KeyHash& hash) = delete;
- explicit ScriptHash(const PKHash& hash) = delete;
-
- explicit ScriptHash(const uint160& hash) : BaseHash(hash) {}
- explicit ScriptHash(const CScript& script);
- explicit ScriptHash(const CScriptID& script);
-};
-CScriptID ToScriptID(const ScriptHash& script_hash);
-
-struct WitnessV0ScriptHash : public BaseHash<uint256>
-{
- WitnessV0ScriptHash() : BaseHash() {}
- explicit WitnessV0ScriptHash(const uint256& hash) : BaseHash(hash) {}
- explicit WitnessV0ScriptHash(const CScript& script);
-};
-
-struct WitnessV0KeyHash : public BaseHash<uint160>
-{
- WitnessV0KeyHash() : BaseHash() {}
- explicit WitnessV0KeyHash(const uint160& hash) : BaseHash(hash) {}
- explicit WitnessV0KeyHash(const CPubKey& pubkey);
- explicit WitnessV0KeyHash(const PKHash& pubkey_hash);
-};
-CKeyID ToKeyID(const WitnessV0KeyHash& key_hash);
-
-struct WitnessV1Taproot : public XOnlyPubKey
-{
- WitnessV1Taproot() : XOnlyPubKey() {}
- explicit WitnessV1Taproot(const XOnlyPubKey& xpk) : XOnlyPubKey(xpk) {}
-};
-
-//! CTxDestination subtype to encode any future Witness version
-struct WitnessUnknown
-{
- unsigned int version;
- unsigned int length;
- unsigned char program[40];
-
- friend bool operator==(const WitnessUnknown& w1, const WitnessUnknown& w2) {
- if (w1.version != w2.version) return false;
- if (w1.length != w2.length) return false;
- return std::equal(w1.program, w1.program + w1.length, w2.program);
- }
-
- friend bool operator<(const WitnessUnknown& w1, const WitnessUnknown& w2) {
- if (w1.version < w2.version) return true;
- if (w1.version > w2.version) return false;
- if (w1.length < w2.length) return true;
- if (w1.length > w2.length) return false;
- return std::lexicographical_compare(w1.program, w1.program + w1.length, w2.program, w2.program + w2.length);
- }
-};
-
-/**
- * A txout script template with a specific destination. It is either:
- * * CNoDestination: no destination set
- * * PKHash: TxoutType::PUBKEYHASH destination (P2PKH)
- * * ScriptHash: TxoutType::SCRIPTHASH destination (P2SH)
- * * WitnessV0ScriptHash: TxoutType::WITNESS_V0_SCRIPTHASH destination (P2WSH)
- * * WitnessV0KeyHash: TxoutType::WITNESS_V0_KEYHASH destination (P2WPKH)
- * * WitnessV1Taproot: TxoutType::WITNESS_V1_TAPROOT destination (P2TR)
- * * WitnessUnknown: TxoutType::WITNESS_UNKNOWN destination (P2W???)
- * A CTxDestination is the internal data type encoded in a bitcoin address
- */
-using CTxDestination = std::variant<CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>;
-
-/** Check whether a CTxDestination is a CNoDestination. */
-bool IsValidDestination(const CTxDestination& dest);
-
/** Get the name of a TxoutType as a string */
std::string GetTxnOutputType(TxoutType t);
@@ -151,20 +60,6 @@ constexpr bool IsPushdataOp(opcodetype opcode)
*/
TxoutType Solver(const CScript& scriptPubKey, std::vector<std::vector<unsigned char>>& vSolutionsRet);
-/**
- * Parse a standard scriptPubKey for the destination address. Assigns result to
- * the addressRet parameter and returns true if successful. Currently only works for P2PK,
- * P2PKH, P2SH, P2WPKH, and P2WSH scripts.
- */
-bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
-
-/**
- * Generate a Bitcoin scriptPubKey for the given CTxDestination. Returns a P2PKH
- * script for a CKeyID destination, a P2SH script for a CScriptID, and an empty
- * script for CNoDestination.
- */
-CScript GetScriptForDestination(const CTxDestination& dest);
-
/** Generate a P2PK script for the given pubkey. */
CScript GetScriptForRawPubKey(const CPubKey& pubkey);
diff --git a/src/test/blockfilter_index_tests.cpp b/src/test/blockfilter_index_tests.cpp
index 9bd5c7c2b6..cd90448e28 100644
--- a/src/test/blockfilter_index_tests.cpp
+++ b/src/test/blockfilter_index_tests.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <blockfilter.h>
#include <chainparams.h>
#include <consensus/merkle.h>
diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp
index 853dc6dc1e..f8a2917978 100644
--- a/src/test/coins_tests.cpp
+++ b/src/test/coins_tests.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <clientversion.h>
#include <coins.h>
#include <script/standard.h>
diff --git a/src/test/fuzz/util.h b/src/test/fuzz/util.h
index 5f2aff08da..2d612a8272 100644
--- a/src/test/fuzz/util.h
+++ b/src/test/fuzz/util.h
@@ -5,6 +5,7 @@
#ifndef BITCOIN_TEST_FUZZ_UTIL_H
#define BITCOIN_TEST_FUZZ_UTIL_H
+#include <addresstype.h>
#include <arith_uint256.h>
#include <coins.h>
#include <compat/compat.h>
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index 94e3f27930..ea13989eb3 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <coins.h>
#include <common/system.h>
#include <consensus/consensus.h>
diff --git a/src/test/miniscript_tests.cpp b/src/test/miniscript_tests.cpp
index 9c811db3e9..2a67da5cab 100644
--- a/src/test/miniscript_tests.cpp
+++ b/src/test/miniscript_tests.cpp
@@ -10,6 +10,7 @@
#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
+#include <addresstype.h>
#include <core_io.h>
#include <hash.h>
#include <pubkey.h>
diff --git a/src/test/sigopcount_tests.cpp b/src/test/sigopcount_tests.cpp
index a17be54419..e20b591c80 100644
--- a/src/test/sigopcount_tests.cpp
+++ b/src/test/sigopcount_tests.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <coins.h>
#include <consensus/consensus.h>
#include <consensus/tx_verify.h>
diff --git a/src/test/txindex_tests.cpp b/src/test/txindex_tests.cpp
index cb80dbed69..1471290d4b 100644
--- a/src/test/txindex_tests.cpp
+++ b/src/test/txindex_tests.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <chainparams.h>
#include <index/txindex.h>
#include <interfaces/chain.h>
diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h
index 00159abbef..c775d26c4f 100644
--- a/src/wallet/scriptpubkeyman.h
+++ b/src/wallet/scriptpubkeyman.h
@@ -5,6 +5,7 @@
#ifndef BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
#define BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
+#include <addresstype.h>
#include <logging.h>
#include <psbt.h>
#include <script/descriptor.h>
diff --git a/src/wallet/test/util.h b/src/wallet/test/util.h
index 2a1fe639de..8bd238648f 100644
--- a/src/wallet/test/util.h
+++ b/src/wallet/test/util.h
@@ -5,7 +5,7 @@
#ifndef BITCOIN_WALLET_TEST_UTIL_H
#define BITCOIN_WALLET_TEST_UTIL_H
-#include <script/standard.h>
+#include <addresstype.h>
#include <wallet/db.h>
#include <memory>
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index dd914f159c..1c128a85df 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -9,6 +9,7 @@
#include <stdint.h>
#include <vector>
+#include <addresstype.h>
#include <interfaces/chain.h>
#include <key_io.h>
#include <node/blockstorage.h>
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index cbd5008366..91c8e89d2d 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -6,6 +6,7 @@
#ifndef BITCOIN_WALLET_WALLET_H
#define BITCOIN_WALLET_WALLET_H
+#include <addresstype.h>
#include <consensus/amount.h>
#include <interfaces/chain.h>
#include <interfaces/handler.h>