From 990bc46b2bdcb1dbf0c9402e42a42613ff090096 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 30 Jun 2021 11:20:59 +0100 Subject: [PATCH] Use a visitor for handling -mineraddress config option This makes it easier to add UA support. --- src/init.cpp | 5 ++--- src/miner.cpp | 10 ++++------ src/miner.h | 21 ++++++++++++++++++++- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index ca88b63f4..e1dcbd637 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1093,10 +1093,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (mapArgs.count("-mineraddress")) { CTxDestination addr = keyIO.DecodeDestination(mapArgs["-mineraddress"]); if (!IsValidDestination(addr)) { - // Try a Sapling address + // Try a payment address auto zaddr = keyIO.DecodePaymentAddress(mapArgs["-mineraddress"]); - if (!IsValidPaymentAddress(zaddr) || - std::get_if(&zaddr) == nullptr) + if (!std::visit(IsValidMinerAddress(), std::visit(ExtractMinerAddress(), zaddr))) { return InitError(strprintf( _("Invalid address for -mineraddress=: '%s' (must be a Sapling or transparent address)"), diff --git a/src/miner.cpp b/src/miner.cpp index 31dcf5279..a1dc0fa3a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -696,12 +696,10 @@ void GetMinerAddress(MinerAddress &minerAddress) mAddr->reserveScript = CScript() << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG; minerAddress = mAddr; } else { - // Try a Sapling address - auto zaddr = keyIO.DecodePaymentAddress(mAddrArg); - if (IsValidPaymentAddress(zaddr)) { - if (std::get_if(&zaddr) != nullptr) { - minerAddress = std::get(zaddr); - } + // Try a payment address + auto zaddr = std::visit(ExtractMinerAddress(), keyIO.DecodePaymentAddress(mAddrArg)); + if (std::visit(IsValidMinerAddress(), zaddr)) { + minerAddress = zaddr; } } } diff --git a/src/miner.h b/src/miner.h index b54207fab..686e963d8 100644 --- a/src/miner.h +++ b/src/miner.h @@ -29,7 +29,26 @@ public: friend bool operator<(const InvalidMinerAddress &a, const InvalidMinerAddress &b) { return true; } }; -typedef std::variant> MinerAddress; +typedef std::variant< + InvalidMinerAddress, + libzcash::SaplingPaymentAddress, + boost::shared_ptr> MinerAddress; + +class ExtractMinerAddress +{ +public: + ExtractMinerAddress() {} + + MinerAddress operator()(const libzcash::InvalidEncoding &invalid) const { + return InvalidMinerAddress(); + } + MinerAddress operator()(const libzcash::SproutPaymentAddress &addr) const { + return InvalidMinerAddress(); + } + MinerAddress operator()(const libzcash::SaplingPaymentAddress &addr) const { + return addr; + } +}; class KeepMinerAddress {