From e4ef4b459548b4032b9da03b3103525f935acb82 Mon Sep 17 00:00:00 2001
From: John Newbery <john@johnnewbery.com>
Date: Wed, 12 Sep 2018 10:05:00 -0400
Subject: [PATCH] [build] remove #ifdef ENABLE_WALLET from interfaces/node

Removes the final #ifdef ENABLE_WALLET from libbitcoin_server by calling
g_wallet_init_interface.HasWalletSupport(), and redifining GetWallets()
and MakeWallet() in dummywallet.cpp.
---
 src/dummywallet.cpp     | 18 ++++++++++++++++++
 src/interfaces/node.cpp | 20 +++++++-------------
 src/interfaces/wallet.h |  4 ++--
 3 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/src/dummywallet.cpp b/src/dummywallet.cpp
index 5b33daf85..3714187a9 100644
--- a/src/dummywallet.cpp
+++ b/src/dummywallet.cpp
@@ -6,6 +6,8 @@
 #include <util.h>
 #include <walletinitinterface.h>
 
+class CWallet;
+
 class DummyWalletInit : public WalletInitInterface {
 public:
 
@@ -31,3 +33,19 @@ void DummyWalletInit::AddWalletOptions() const
 }
 
 const WalletInitInterface& g_wallet_init_interface = DummyWalletInit();
+
+std::vector<std::shared_ptr<CWallet>> GetWallets()
+{
+    throw std::logic_error("Wallet function called in non-wallet build.");
+}
+
+namespace interfaces {
+
+class Wallet;
+
+std::unique_ptr<Wallet> MakeWallet(const std::shared_ptr<CWallet>& wallet)
+{
+    throw std::logic_error("Wallet function called in non-wallet build.");
+}
+
+} // namespace interfaces
diff --git a/src/interfaces/node.cpp b/src/interfaces/node.cpp
index 1da58fe48..d95b41657 100644
--- a/src/interfaces/node.cpp
+++ b/src/interfaces/node.cpp
@@ -32,19 +32,18 @@
 #if defined(HAVE_CONFIG_H)
 #include <config/bitcoin-config.h>
 #endif
-#ifdef ENABLE_WALLET
-#include <wallet/fees.h>
-#include <wallet/wallet.h>
-#define CHECK_WALLET(x) x
-#else
-#define CHECK_WALLET(x) throw std::logic_error("Wallet function called in non-wallet build.")
-#endif
 
 #include <atomic>
 #include <boost/thread/thread.hpp>
 #include <univalue.h>
 
+class CWallet;
+std::vector<std::shared_ptr<CWallet>> GetWallets();
+
 namespace interfaces {
+
+class Wallet;
+
 namespace {
 
 class NodeImpl : public Node
@@ -221,15 +220,11 @@ class NodeImpl : public Node
     }
     std::vector<std::unique_ptr<Wallet>> getWallets() override
     {
-#ifdef ENABLE_WALLET
         std::vector<std::unique_ptr<Wallet>> wallets;
         for (const std::shared_ptr<CWallet>& wallet : GetWallets()) {
             wallets.emplace_back(MakeWallet(wallet));
         }
         return wallets;
-#else
-        throw std::logic_error("Node::getWallets() called in non-wallet build.");
-#endif
     }
     std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override
     {
@@ -249,8 +244,7 @@ class NodeImpl : public Node
     }
     std::unique_ptr<Handler> handleLoadWallet(LoadWalletFn fn) override
     {
-        CHECK_WALLET(
-            return MakeHandler(::uiInterface.LoadWallet_connect([fn](std::shared_ptr<CWallet> wallet) { fn(MakeWallet(wallet)); })));
+        return MakeHandler(::uiInterface.LoadWallet_connect([fn](std::shared_ptr<CWallet> wallet) { fn(MakeWallet(wallet)); }));
     }
     std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) override
     {
diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h
index 44240a572..7aa91f37e 100644
--- a/src/interfaces/wallet.h
+++ b/src/interfaces/wallet.h
@@ -366,8 +366,8 @@ struct WalletTxOut
     bool is_spent = false;
 };
 
-//! Return implementation of Wallet interface. This function will be undefined
-//! in builds where ENABLE_WALLET is false.
+//! Return implementation of Wallet interface. This function is defined in
+//! dummywallet.cpp and throws if the wallet component is not compiled.
 std::unique_ptr<Wallet> MakeWallet(const std::shared_ptr<CWallet>& wallet);
 
 } // namespace interfaces