aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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>