Remove wallet -> node global function calls #15288

pull ryanofsky wants to merge 16 commits into bitcoin:master from ryanofsky:pr/wchain3 changing 21 files +298 −156
  1. ryanofsky commented at 2:48 am on January 30, 2019: member

    This change removes wallet calls to node functions that access global chain and mempool state.

    This is the next step in the larger #10973 refactoring change, which removes all other accesses to node global variables from wallet code. Doing this is useful to provide a better defined interface between the wallet and node, and necessary to allow wallet and node code to run in separate processes in #10102.

  2. fanquake added the label Refactoring on Jan 30, 2019
  3. fanquake added the label Wallet on Jan 30, 2019
  4. DrahtBot commented at 3:38 am on January 30, 2019: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #15491 (wallet: Improve log output for errors during load by gwillen)
    • #15487 ([WIP] descriptor based wallet by Sjors)
    • #15329 (Fix InitError() and InitWarning() content by hebasto)
    • #15253 (Net: Consistently log outgoing INV messages by Empact)
    • #15157 (rpc: Bumpfee units change, satoshis to BTC by benthecarman)
    • #15112 (build: Optionally enable -Wzero-as-null-pointer-constant by Empact)
    • #14707 ([RPC] Include coinbase transactions in receivedby RPCs by andrewtoth)
    • #14641 (rpc: Add min_conf option to fund transaction calls by promag)
    • #13756 (wallet: “avoid_reuse” wallet flag for improved privacy by kallewoof)
    • #11413 ([wallet] [rpc] sendtoaddress/sendmany: Add explicit feerate option by kallewoof)
    • #10823 (Allow all mempool txs to be replaced after a configurable timeout (default 6h) by greenaddress)
    • #9381 (Remove CWalletTx merging logic from AddToWallet by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  5. in src/interfaces/node.cpp:274 in 4f851c9249 outdated
    269@@ -270,7 +270,8 @@ class NodeImpl : public Node
    270     }
    271     std::unique_ptr<Handler> handleLoadWallet(LoadWalletFn fn) override
    272     {
    273-        return MakeHandler(::uiInterface.LoadWallet_connect([fn](std::shared_ptr<CWallet> wallet) { fn(MakeWallet(wallet)); }));
    274+        return MakeHandler(
    275+            ::uiInterface.LoadWallet_connect([fn](std::unique_ptr<Wallet>& wallet) { fn(std::move(wallet)); }));
    


    hebasto commented at 6:01 am on January 30, 2019:
    Is it required to break the line?

    ryanofsky commented at 10:24 pm on February 3, 2019:
    reformatted
  6. in src/wallet/wallet.cpp:1941 in 4f851c9249 outdated
    1936@@ -1941,10 +1937,8 @@ bool CWalletTx::InMempool() const
    1937 
    1938 bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain) const
    1939 {
    1940-    LockAnnotation lock(::cs_main); // Temporary, for CheckFinalTx below. Removed in upcoming commit.
    1941-
    1942     // Quick answer in most cases
    1943-    if (!CheckFinalTx(*tx))
    1944+    if (!locked_chain.checkFinalTx(*tx))
    


    hebasto commented at 6:10 am on January 30, 2019:
    0    if (!locked_chain.checkFinalTx(*tx)) {
    1        return false;
    2    }
    

    or

    0    if (!locked_chain.checkFinalTx(*tx)) return false;
    

    ryanofsky commented at 10:28 pm on February 3, 2019:
    added braces
  7. in src/wallet/wallet.cpp:1997 in 4f851c9249 outdated
    1993@@ -2000,7 +1994,7 @@ std::vector<uint256> CWallet::ResendWalletTransactionsBefore(interfaces::Chain::
    1994     for (const std::pair<const unsigned int, CWalletTx*>& item : mapSorted)
    1995     {
    1996         CWalletTx& wtx = *item.second;
    1997-        if (wtx.RelayWalletTransaction(locked_chain, connman))
    1998+        if (wtx.RelayWalletTransaction(locked_chain))
    


    hebasto commented at 6:13 am on January 30, 2019:
    0        if (wtx.RelayWalletTransaction(locked_chain)) {
    1            result.push_back(wtx.GetHash());
    2        }
    

    or

    0        if (wtx.RelayWalletTransaction(locked_chain)) result.push_back(wtx.GetHash());
    

    ryanofsky commented at 10:29 pm on February 3, 2019:
    added braces
  8. in src/wallet/wallet.cpp:2187 in 4f851c9249 outdated
    2183@@ -2191,7 +2184,7 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector<
    2184         const uint256& wtxid = entry.first;
    2185         const CWalletTx* pcoin = &entry.second;
    2186 
    2187-        if (!CheckFinalTx(*pcoin->tx))
    2188+        if (!locked_chain.checkFinalTx(*pcoin->tx))
    


    hebasto commented at 6:15 am on January 30, 2019:
    0        if (!locked_chain.checkFinalTx(*pcoin->tx)) {
    1            continue;
    2        }
    

    or

    0        if (!locked_chain.checkFinalTx(*pcoin->tx)) continue;
    

    ryanofsky commented at 10:30 pm on February 3, 2019:
    added braces
  9. in src/wallet/wallet.cpp:4252 in 4f851c9249 outdated
    4091+            chain.initError(AmountErrMsg("mintxfee", gArgs.GetArg("-mintxfee", "")));
    4092             return nullptr;
    4093         }
    4094         if (n > HIGH_TX_FEE_PER_KB) {
    4095-            InitWarning(AmountHighWarn("-mintxfee") + " " +
    4096+            chain.initWarning(AmountHighWarn("-mintxfee") + " " +
    


    hebasto commented at 6:20 am on January 30, 2019:

    Indentation:

    0            chain.initWarning(AmountHighWarn("-mintxfee") + " " +
    1                              _("This is the minimum transaction fee you pay on every transaction."));
    

    ryanofsky commented at 10:32 pm on February 3, 2019:
    added space
  10. in src/wallet/wallet.cpp:4266 in 4f851c9249 outdated
    4100+            chain.initError(strprintf(_("Invalid amount for -fallbackfee=<amount>: '%s'"), gArgs.GetArg("-fallbackfee", "")));
    4101             return nullptr;
    4102         }
    4103         if (nFeePerK > HIGH_TX_FEE_PER_KB) {
    4104-            InitWarning(AmountHighWarn("-fallbackfee") + " " +
    4105+            chain.initWarning(AmountHighWarn("-fallbackfee") + " " +
    


    hebasto commented at 6:20 am on January 30, 2019:

    Indentation:

    0            chain.initWarning(AmountHighWarn("-fallbackfee") + " " +
    1                              _("This is the transaction fee you may pay when fee estimates are not available."));
    

    ryanofsky commented at 10:32 pm on February 3, 2019:
    added space
  11. in src/wallet/wallet.cpp:4279 in 4f851c9249 outdated
    4113+            chain.initError(strprintf(_("Invalid amount for -discardfee=<amount>: '%s'"), gArgs.GetArg("-discardfee", "")));
    4114             return nullptr;
    4115         }
    4116         if (nFeePerK > HIGH_TX_FEE_PER_KB) {
    4117-            InitWarning(AmountHighWarn("-discardfee") + " " +
    4118+            chain.initWarning(AmountHighWarn("-discardfee") + " " +
    


    hebasto commented at 6:21 am on January 30, 2019:

    Indentation:

    0            chain.initWarning(AmountHighWarn("-discardfee") + " " +
    1                              _("This is the transaction fee you may discard if change is smaller than dust at this level"));
    

    ryanofsky commented at 10:33 pm on February 3, 2019:
    added space
  12. in src/wallet/wallet.cpp:4291 in 4f851c9249 outdated
    4127+            chain.initError(AmountErrMsg("paytxfee", gArgs.GetArg("-paytxfee", "")));
    4128             return nullptr;
    4129         }
    4130         if (nFeePerK > HIGH_TX_FEE_PER_KB) {
    4131-            InitWarning(AmountHighWarn("-paytxfee") + " " +
    4132+            chain.initWarning(AmountHighWarn("-paytxfee") + " " +
    


    hebasto commented at 6:22 am on January 30, 2019:

    Indentation:

    0            chain.initWarning(AmountHighWarn("-paytxfee") + " " +
    1                              _("This is the transaction fee you will pay if you send a transaction."));
    

    ryanofsky commented at 10:33 pm on February 3, 2019:
    added space
  13. in src/wallet/rpcdump.cpp:155 in 4f851c9249 outdated
    151@@ -152,7 +152,7 @@ UniValue importprivkey(const JSONRPCRequest& request)
    152         if (!request.params[2].isNull())
    153             fRescan = request.params[2].get_bool();
    154 
    155-        if (fRescan && fPruneMode)
    156+        if (fRescan && pwallet->chain().getPruneMode())
    


    hebasto commented at 6:27 am on January 30, 2019:
    0        if (fRescan && pwallet->chain().getPruneMode()) {
    1            throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled in pruned mode");
    2        }
    

    ryanofsky commented at 10:26 pm on February 3, 2019:
    added braces
  14. in src/wallet/rpcdump.cpp:311 in 4f851c9249 outdated
    307@@ -308,7 +308,7 @@ UniValue importaddress(const JSONRPCRequest& request)
    308     if (!request.params[2].isNull())
    309         fRescan = request.params[2].get_bool();
    310 
    311-    if (fRescan && fPruneMode)
    312+    if (fRescan && pwallet->chain().getPruneMode())
    


    hebasto commented at 6:28 am on January 30, 2019:
    0    if (fRescan && pwallet->chain().getPruneMode()) {
    1        throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled in pruned mode");
    2    }
    

    ryanofsky commented at 10:26 pm on February 3, 2019:
    added braces
  15. in src/wallet/rpcdump.cpp:499 in 4f851c9249 outdated
    495@@ -496,7 +496,7 @@ UniValue importpubkey(const JSONRPCRequest& request)
    496     if (!request.params[2].isNull())
    497         fRescan = request.params[2].get_bool();
    498 
    499-    if (fRescan && fPruneMode)
    500+    if (fRescan && pwallet->chain().getPruneMode())
    


    hebasto commented at 6:28 am on January 30, 2019:
    0    if (fRescan && pwallet->chain().getPruneMode()) {
    1        throw JSONRPCError(RPC_WALLET_ERROR, "Rescan is disabled in pruned mode");
    2    }
    

    ryanofsky commented at 10:26 pm on February 3, 2019:
    added braces
  16. in src/wallet/rpcdump.cpp:560 in 4f851c9249 outdated
    556@@ -557,7 +557,7 @@ UniValue importwallet(const JSONRPCRequest& request)
    557                 },
    558             }.ToString());
    559 
    560-    if (fPruneMode)
    561+    if (pwallet->chain().getPruneMode())
    


    hebasto commented at 6:29 am on January 30, 2019:
    0    if (pwallet->chain().getPruneMode()) {
    1        throw JSONRPCError(RPC_WALLET_ERROR, "Importing wallets is disabled in pruned mode");
    2    }
    

    ryanofsky commented at 10:26 pm on February 3, 2019:
    added braces
  17. in src/wallet/rpcwallet.cpp:628 in 4f851c9249 outdated
    624@@ -627,7 +625,7 @@ static UniValue getreceivedbyaddress(const JSONRPCRequest& request)
    625     CAmount nAmount = 0;
    626     for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
    627         const CWalletTx& wtx = pairWtx.second;
    628-        if (wtx.IsCoinBase() || !CheckFinalTx(*wtx.tx))
    629+        if (wtx.IsCoinBase() || !locked_chain->checkFinalTx(*wtx.tx))
    


    hebasto commented at 6:30 am on January 30, 2019:
    0        if (wtx.IsCoinBase() || !locked_chain->checkFinalTx(*wtx.tx)) {
    1            continue;
    2        }
    

    or

    0        if (wtx.IsCoinBase() || !locked_chain->checkFinalTx(*wtx.tx)) continue;
    

    ryanofsky commented at 10:27 pm on February 3, 2019:
    added braces
  18. in src/wallet/rpcwallet.cpp:693 in 4f851c9249 outdated
    689@@ -693,7 +690,7 @@ static UniValue getreceivedbylabel(const JSONRPCRequest& request)
    690     CAmount nAmount = 0;
    691     for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
    692         const CWalletTx& wtx = pairWtx.second;
    693-        if (wtx.IsCoinBase() || !CheckFinalTx(*wtx.tx))
    694+        if (wtx.IsCoinBase() || !locked_chain->checkFinalTx(*wtx.tx))
    


    hebasto commented at 6:31 am on January 30, 2019:
    0        if (wtx.IsCoinBase() || !locked_chain->checkFinalTx(*wtx.tx)) {
    1            continue;
    2        }
    

    or

    0        if (wtx.IsCoinBase() || !locked_chain->checkFinalTx(*wtx.tx)) continue;
    

    ryanofsky commented at 10:27 pm on February 3, 2019:
    added braces
  19. in src/wallet/rpcwallet.cpp:1078 in 4f851c9249 outdated
    1074@@ -1080,7 +1075,7 @@ static UniValue ListReceived(interfaces::Chain::Lock& locked_chain, CWallet * co
    1075     for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
    1076         const CWalletTx& wtx = pairWtx.second;
    1077 
    1078-        if (wtx.IsCoinBase() || !CheckFinalTx(*wtx.tx))
    1079+        if (wtx.IsCoinBase() || !locked_chain.checkFinalTx(*wtx.tx))
    


    hebasto commented at 6:32 am on January 30, 2019:
    0        if (wtx.IsCoinBase() || !locked_chain.checkFinalTx(*wtx.tx)) {
    1            continue;
    2        }
    

    or

    0        if (wtx.IsCoinBase() || !locked_chain.checkFinalTx(*wtx.tx)) continue;
    

    ryanofsky commented at 10:28 pm on February 3, 2019:
    added braces
  20. in src/wallet/rpcwallet.cpp:2696 in 4f851c9249 outdated
    2692@@ -2698,7 +2693,7 @@ static UniValue resendwallettransactions(const JSONRPCRequest& request)
    2693              }.ToString()
    2694             );
    2695 
    2696-    if (!g_connman)
    2697+    if (!pwallet->chain().p2pEnabled())
    


    hebasto commented at 6:32 am on January 30, 2019:
    0    if (!pwallet->chain().p2pEnabled()) {
    1        throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
    2    }
    

    ryanofsky commented at 10:28 pm on February 3, 2019:
    added braces
  21. in src/wallet/wallet.cpp:4120 in 4f851c9249 outdated
    3956             return nullptr;
    3957         }
    3958         else if (nLoadWalletRet == DBErrors::NONCRITICAL_ERROR)
    3959         {
    3960-            InitWarning(strprintf(_("Error reading %s! All keys read correctly, but transaction data"
    3961+            chain.initWarning(strprintf(_("Error reading %s! All keys read correctly, but transaction data"
    


    hebasto commented at 6:36 am on January 30, 2019:

    Indentation:

    0            chain.initWarning(strprintf(_("Error reading %s! All keys read correctly, but transaction data"
    1                                          " or address book entries might be missing or incorrect."),
    

    ryanofsky commented at 10:32 pm on February 3, 2019:
    added space
  22. in src/wallet/wallet.cpp:4174 in 4f851c9249 outdated
    4170@@ -4187,20 +4171,20 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
    4171         //We can't rescan beyond non-pruned blocks, stop and throw an error
    4172         //this might happen if a user uses an old wallet within a pruned node
    4173         // or if he ran -disablewallet for a longer time, then decided to re-enable
    4174-        if (fPruneMode)
    4175+        if (chain.getPruneMode())
    


    hebasto commented at 6:39 am on January 30, 2019:

    Brace on the same line:

    0        if (chain.getPruneMode()) {
    

    ryanofsky commented at 10:30 pm on February 3, 2019:
    moved brace
  23. hebasto changes_requested
  24. jnewbery commented at 3:41 pm on January 30, 2019: member

    Agree with @hebasto that the indentations should be fixed since those are misaligned by this PR. Not sure about fixing if braces - I would expect that it’s contributors choice whether they fix existing style in lines they touch, but they shouldn’t be obligated.

    git diff -U0 5ff7dc424~.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v throws up a couple more style suggestions if you’re interested.

    I’ll wait for Russ’s response to the style comments before doing a full review.

  25. ryanofsky commented at 4:11 pm on January 30, 2019: member

    I’ll wait for Russ’s response to the style comments before doing a full review.

    Will look more closely but probably I’ll fix whitespace in the existing commits and add braces in a new commit.

  26. jnewbery commented at 4:49 pm on January 30, 2019: member
    Obvious Concept ACK
  27. in src/interfaces/chain.cpp:30 in 81adc6a95d outdated
    25@@ -25,6 +26,8 @@
    26 #include <memory>
    27 #include <utility>
    28 
    29+class CReserveScript;
    


    Empact commented at 7:38 pm on January 30, 2019:
    unnecessary given this is declared in the header

    ryanofsky commented at 9:38 pm on February 3, 2019:

    unnecessary given this is declared in the header

    This was added by IWYU because CReserveScript is only forward declared in the headers included here, and defined in a different header. In theory this allows the other headers to change without breaking this file. I don’t think IWYU rationale is completely airtight, but I like the IWYU tool, and don’t personally think it’s worth spending effort to override it if it isn’t creating a problem.


    dongcarl commented at 5:52 pm on February 5, 2019:
    Aside: Perhaps IWYU can be included in doc/developer-notes.md

    MarcoFalke commented at 5:59 pm on February 5, 2019:
    Agree, and it should come with steps to install for Bitcoin Core.

    ryanofsky commented at 7:06 pm on February 5, 2019:

    Agree, and it should come with steps to install for Bitcoin Core.

    It’s not very convenient, but here are steps I’ve followed previously: #11878 (comment)

  28. in src/interfaces/chain.h:8 in adfd42c0c8 outdated
    4@@ -5,7 +5,8 @@
    5 #ifndef BITCOIN_INTERFACES_CHAIN_H
    6 #define BITCOIN_INTERFACES_CHAIN_H
    7 
    8-#include <optional.h>
    9+#include <optional.h>               // For Optional and nullopt
    


    Empact commented at 7:50 pm on January 30, 2019:
    nit: IMO we could do without this comment

    ryanofsky commented at 10:18 pm on February 3, 2019:

    nit: IMO we could do without this comment

    Not clear what change is being asked for. It would seem inconsistent to delete this comment and keep other comments around it.

  29. in src/interfaces/chain.h:146 in adfd42c0c8 outdated
    138@@ -138,6 +139,9 @@ class Chain
    139 
    140     //! Get virtual transaction size.
    141     virtual int64_t getVirtualTransactionSize(const CTransaction& tx) = 0;
    142+
    143+    //! Check if transaction is RBF opt in.
    144+    virtual RBFTransactionState isRBFOptIn(const CTransaction& tx) = 0;
    


    Empact commented at 7:54 pm on January 30, 2019:
    Could return the status string and thus avoid the include / simplify the interface.

    ryanofsky commented at 10:23 pm on February 3, 2019:

    Could return the status string and thus avoid the include / simplify the interface.

    Include could be removed with a forward declaration in the future. String would make the interface more cumbersome and generate JSONRPC error text in non-RPC code.


    Sjors commented at 10:18 am on February 27, 2019:
    Call me enum fanboy, but I like to avoid using strings when enums suffice, and let the RPC & GUI deal with rendering them as strings. So agree with keeping it as is.
  30. in src/Makefile.bench.include:46 in 02022184aa outdated
    42@@ -43,6 +43,10 @@ bench_bench_bitcoin_LDADD = \
    43   $(LIBBITCOIN_UTIL) \
    44   $(LIBBITCOIN_CONSENSUS) \
    45   $(LIBBITCOIN_CRYPTO) \
    46+  $(LIBBITCOIN_WALLET) \
    47+  $(LIBBITCOIN_SERVER) \
    48+  $(EVENT_PTHREADS_LIBS) \
    


    Empact commented at 8:04 pm on January 30, 2019:
    Could you explain these? Compiles successfully with just the EVENT_LIBS on my machine.

    ryanofsky commented at 9:29 pm on February 3, 2019:

    Could you explain these? Compiles successfully with just the EVENT_LIBS on my machine.

    I didn’t take the time go back and see why these were needed, but I dropped the wallet and server lines. We have circular dependencies so the need to repeat libraries on the linker command line comes and goes as dependencies between individual object files change: #14437 (review)

  31. in src/wallet/wallet.h:104 in 5340672d5e outdated
     98@@ -99,8 +99,6 @@ class CCoinControl;
     99 class COutput;
    100 class CReserveKey;
    101 class CScript;
    102-class CTxMemPool;
    103-class CBlockPolicyEstimator;
    


    Empact commented at 9:44 pm on January 30, 2019:
    note: last use removed in d97fe2016cc7739929aac5c44de5037163b17ad0
  32. in src/interfaces/chain.cpp:158 in 9eee26ef60 outdated
    138@@ -138,6 +139,12 @@ class LockImpl : public Chain::Lock
    139         LockAnnotation lock(::cs_main);
    140         return CheckFinalTx(tx);
    141     }
    142+    bool acceptToMemoryPool(CTransactionRef tx, CValidationState& state) override
    143+    {
    144+        LockAnnotation lock(::cs_main);
    145+        return AcceptToMemoryPool(::mempool, state, tx, nullptr /* missing inputs */, nullptr /* txn replaced */,
    146+            false /* bypass limits */, ::maxTxFee /* absurd fee */);
    


    Empact commented at 9:54 pm on January 30, 2019:
    nit: these read better if you lead with the param name comment IMO

    ryanofsky commented at 9:42 pm on February 3, 2019:

    nit: these read better if you lead with the param name comment IMO

    I don’t think there is anything to be done here. I just want to stick to one style, and would be happy with whatever style people like. If you want to see changes related to this, I’d suggest opening a PR adding a recommendation to the developer guide so the project could converge on one style.


    jnewbery commented at 3:54 pm on February 6, 2019:
    I don’t have an opinion on whether the comment should be before or after the parameter, but agree with Russ that this PR should stick to one style. A future PR could update the developer guide if we want to converge to a single style
  33. in src/interfaces/chain.cpp:256 in 76401da3a0 outdated
    258@@ -258,6 +259,7 @@ class ChainImpl : public Chain
    259     void initMessage(const std::string& message) override { ::uiInterface.InitMessage(message); }
    260     void initWarning(const std::string& message) override { InitWarning(message); }
    261     void initError(const std::string& message) override { InitError(message); }
    262+    void loadWallet(std::unique_ptr<Wallet> wallet) override { ::uiInterface.LoadWallet(wallet); }
    


    Empact commented at 9:58 pm on January 30, 2019:
    Should this be in interfaces/node? That’s where other ::uiInterface access is.

    ryanofsky commented at 10:16 pm on February 3, 2019:

    Should this be in interfaces/node? That’s where other ::uiInterface access is.

    Previous comment #15288 (review) about uiInterface also applies here, but in the future, the initMessage, initWarning, initError, and loadWallet methods will likely move to a new interface (maybe interfaces::WalletClient or interfaces::Ui) to allow the bitcoin-gui process to connect directly to the bitcoin-wallet process without going through bitcoin-node.

    I didn’t start down that road yet because ostensibly there are a lot of other ways the Chain object could be broken up, and in general I think it’s less confusing to have fewer class types with more methods than more class types with fewer methods. Especially if instances would have the same cardinality and just be sitting side by side anyway.


    promag commented at 6:45 pm on March 3, 2019:

    Thanks for the explanation.

    the initMessage, initWarning, initError, and loadWallet methods will likely move to a new interface

    I though it could be interfaces::Wallet, the CreateWalletFromFile caller would get the wallet interface asap, then request the loading etc and then signal the loading for everyone else.

  34. in src/interfaces/chain.cpp:255 in e8d3a84234 outdated
    251@@ -251,6 +252,9 @@ class ChainImpl : public Chain
    252     bool getPruneMode() override { return ::fPruneMode; }
    253     bool p2pEnabled() override { return g_connman != nullptr; }
    254     int64_t getAdjustedTime() override { return GetAdjustedTime(); }
    255+    void initMessage(const std::string& message) override { ::uiInterface.InitMessage(message); }
    256+    void initWarning(const std::string& message) override { InitWarning(message); }
    257+    void initError(const std::string& message) override { InitError(message); }
    


    Empact commented at 10:01 pm on January 30, 2019:
    Should this be in interfaces/node? That’s where other ::uiInterface access is.

    ryanofsky commented at 9:48 pm on February 3, 2019:

    Should this be in interfaces/node? That’s where other ::uiInterface access is.

    In #10102 there are three processes: bitcoin-node, bitcoin-wallet, and bitcoin-gui. interfaces::Node is used by the bitcoin-gui process to control the bitcoin-node process, and interfaces::Chain is used by the bitcoin-wallet process to interact with the bitcoin-node process (mainly by receiving blocks and transactions).

    The uiInterface variable is used in both NodeImpl and ChainImpl classes because they both execute in the same bitcoin-node process where uiInterface is valid.

  35. Empact commented at 10:01 pm on January 30, 2019: member
    Concept ACK
  36. hebasto commented at 10:57 pm on January 30, 2019: member
    Concept ACK.
  37. ryanofsky force-pushed on Feb 4, 2019
  38. ryanofsky referenced this in commit ba426f5370 on Feb 4, 2019
  39. in src/interfaces/chain.h:119 in ba426f5370 outdated
    110@@ -102,6 +111,12 @@ class Chain
    111         //! is guaranteed to be an ancestor of the block used to create the
    112         //! locator.
    113         virtual Optional<int> findLocatorFork(const CBlockLocator& locator) = 0;
    114+
    115+        //! Check if transaction will be final given chain height current time.
    116+        virtual bool checkFinalTx(const CTransaction& tx) = 0;
    117+
    118+        //! Add transaction to memory pool.
    119+        virtual bool acceptToMemoryPool(CTransactionRef tx, CValidationState& state) = 0;
    


    jnewbery commented at 3:57 pm on February 6, 2019:

    Suggestion: consider renaming this interface function submitToMemoryPool(). The wallet cannot itself accept a transaction to the memory pool, it can only submit it to the node, which will decide whether to accept the tx. I think changing the naming reinforces the division between wallet and node.

    Interested to hear your thoughts on this. If you agree, we can push the naming change to a future PR.


    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: #15288 (review)

    Suggestion: consider renaming this interface function submitToMemoryPool()

    Makes sense, changed.

  40. in src/interfaces/chain.cpp:158 in ba426f5370 outdated
    153+    }
    154+    bool acceptToMemoryPool(CTransactionRef tx, CValidationState& state) override
    155+    {
    156+        LockAnnotation lock(::cs_main);
    157+        return AcceptToMemoryPool(::mempool, state, tx, nullptr /* missing inputs */, nullptr /* txn replaced */,
    158+            false /* bypass limits */, ::maxTxFee /* absurd fee */);
    


    jnewbery commented at 4:14 pm on February 6, 2019:

    I have a slight concern about the maxTxFee being set by the node instead of the wallet here, but that’s more of a long-term design question (and is inherited from having a single maxTxFee for both the raw transaction RPCs and wallet RPCs). This PR simply moves the existing function calls to the interface classes. The API can be improved later.

    Longer term, the single -maxtxfee option should not be shared between the node and wallet. See #15355 for more details.


    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: #15288 (review)

    I replaced ::maxTxFee with an absurd_fee parameter here to help with goal of having separate settings. I think this also makes the current behavior more clear.

  41. in src/interfaces/chain.cpp:219 in ba426f5370 outdated
    214+        auto it_mp = ::mempool.mapTx.find(txid);
    215+        return it_mp != ::mempool.mapTx.end() && it_mp->GetCountWithDescendants() > 1;
    216+    }
    217+    bool relayTransaction(const uint256& txid) override
    218+    {
    219+        if (g_connman) {
    


    jnewbery commented at 7:30 pm on February 6, 2019:

    Are we ever expecting g_conman to be false? (except perhaps in the unit tests?)

    In any case, you could make this a bit tidier with:

    0if (g_conman == nullptr) return false
    1...
    

    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: https://github.com/bitcoin/bitcoin/pull/15288/files#r254417716

    In commit “Remove use of g_connman / PushInventory in wallet code” (9cd8d6a90df628ca805d0cfa5569d50a666674c9)

    Are we ever expecting g_conman to be false? (except perhaps in the unit tests?)

    I don’t think so, but it does seem reasonable for a test to leave g_connman set to null.

    This is just a cut and paste of the previous code, so that’s where the check comes from.

    In any case, you could make this a bit tidier

    Applied suggestion

  42. in src/wallet/wallet.cpp:1774 in ba426f5370 outdated
    1778-                CInv inv(MSG_TX, GetHash());
    1779-                connman->ForEachNode([&inv](CNode* pnode)
    1780-                {
    1781-                    pnode->PushInventory(inv);
    1782-                });
    1783+            if (pwallet->chain().relayTransaction(GetHash())) {
    


    jnewbery commented at 7:33 pm on February 6, 2019:

    could just:

    return pwallet->chain().relayTransaction(GetHash())

    here

    EDIT: in fact, after ff0c6daf3aee45cc806178a3737f64693e9f0f53, you could just change the conditional above to:

    0if (InMempool() || AcceptToMemoryPool(locked_chain, state) && pwallet->chain().p2pEnabled()) {
    1    pwallet->chain().relayTransaction(GetHash());
    2}
    

    and drop the return value from relayTransaction() (which doesn’t get called anywhere else)


    ryanofsky commented at 4:10 pm on February 7, 2019:

    re: #15288 (review)

    could just

    Nice suggestions, they do make things clearer and I think I applied them all.

  43. in src/interfaces/chain.cpp:239 in ba426f5370 outdated
    234+        CTxMemPool::setEntries setAncestors;
    235+        auto nLimitAncestors = gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT);
    236+        auto nLimitAncestorSize = gArgs.GetArg("-limitancestorsize", DEFAULT_ANCESTOR_SIZE_LIMIT) * 1000;
    237+        auto nLimitDescendants = gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT);
    238+        auto nLimitDescendantSize = gArgs.GetArg("-limitdescendantsize", DEFAULT_DESCENDANT_SIZE_LIMIT) * 1000;
    239+        std::string errString;
    


    jnewbery commented at 8:54 pm on February 6, 2019:
    The return value of errString is unused. A future PR could rename to dummy_string or add a comment. Not required for this move-only commit.

    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: #15288 (review)

    The return value of errString is unused. A future PR could rename to dummy_string or add a comment. Not required for this move-only commit.

    Applied suggestion here. This wasn’t 100% move only anyway, because size_t/auto change (I think made in response to practicalswift signed/unsigned warnings).

  44. in src/rpc/mining.h:16 in ba426f5370 outdated
    12@@ -13,6 +13,6 @@
    13 UniValue generateBlocks(std::shared_ptr<CReserveScript> coinbaseScript, int nGenerate, uint64_t nMaxTries, bool keepScript);
    14 
    15 /** Check bounds on a command line confirm target */
    16-unsigned int ParseConfirmTarget(const UniValue& value);
    17+unsigned int ParseConfirmTarget(const UniValue& value, unsigned int max_target);
    


    jnewbery commented at 9:01 pm on February 6, 2019:
    Wow. This should be moved into rpc/util (in a future PR). (also comment is outdated!)

    ryanofsky commented at 4:12 pm on February 7, 2019:

    #15288 (review)

    Wow. This should be moved into rpc/util (in a future PR). (also comment is outdated!)

    Done in #15373.

  45. in src/interfaces/chain.cpp:252 in ba426f5370 outdated
    247+    }
    248+    unsigned int estimateMaxBlocks() override
    249+    {
    250+        return ::feeEstimator.HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE);
    251+    }
    252+    CFeeRate poolMinFee() override
    


    jnewbery commented at 9:13 pm on February 6, 2019:
    nit: can you name this function mempoolMinFee()?

    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: #15288 (review)

    nit: can you name this function mempoolMinFee()?

    Renamed

  46. in src/interfaces/chain.h:194 in ba426f5370 outdated
    189+    virtual void initWarning(const std::string& message) = 0;
    190+
    191+    //! Send init error.
    192+    virtual void initError(const std::string& message) = 0;
    193+
    194+    //! Send wallet load notification.
    


    jnewbery commented at 9:38 pm on February 6, 2019:
    nit: change to “Send wallet load notification to the GUI.”

    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: #15288 (review)

    nit: change to “Send wallet load notification to the GUI.”

    Changed

  47. in src/interfaces/node.cpp:278 in ba426f5370 outdated
    269@@ -270,7 +270,7 @@ class NodeImpl : public Node
    270     }
    271     std::unique_ptr<Handler> handleLoadWallet(LoadWalletFn fn) override
    272     {
    273-        return MakeHandler(::uiInterface.LoadWallet_connect([fn](std::shared_ptr<CWallet> wallet) { fn(MakeWallet(wallet)); }));
    274+        return MakeHandler(::uiInterface.LoadWallet_connect([fn](std::unique_ptr<Wallet>& wallet) { fn(std::move(wallet)); }));
    


    jnewbery commented at 9:46 pm on February 6, 2019:
    It’s not obvious to me why this (and associated changes) is necessary. Can you perhaps add commentary to the commit message why you’re changing the function signature here?

    ryanofsky commented at 10:15 pm on February 6, 2019:

    re: #15288 (review)

    It’s not obvious to me why this (and associated changes) is necessary

    I’ll add information to the commit message, but just to give some feedback now, the idea is that in #10102 the CWallet class is internal to the bitcoin-wallet process. The other bitcoin-node and bitcoin-gui processes don’t use CWallet at all, and only access the wallet through interface classes (interfaces::ChainClient and interfaces::Wallet respectively).

    The change from shared_ptr to unique_ptr here just follows because CWallet is used with shared_ptr, while the interface classes have more defined lifetimes and don’t need shared_ptr. Any place an interface argument or return value is passed it’s always by reference or with unique_ptr.


    ryanofsky commented at 4:11 pm on February 7, 2019:

    re: #15288 (review)

    Can you perhaps add commentary to the commit message why you’re changing the function signature here?

    Added description in f40de055f0bbed97d0a4e1dddd2413be672bf717

  48. jnewbery commented at 9:54 pm on February 6, 2019: member

    utACK ba426f53709902a35a46732846226977fbfd5519. This is a great tidyup.

    There are lots of commits This could be split into smaller PRs, but they’re all very straightforward changes so I think it’s fine to keep as one PR.

    I have a few questions and suggested changes inline but none should hold up merge.

    Very tidy work Russ. Thanks for your persistence with this!

  49. jonasschnelli commented at 6:23 am on February 7, 2019: contributor
    Concept ACK
  50. ryanofsky referenced this in commit c7062070c1 on Feb 8, 2019
  51. ryanofsky force-pushed on Feb 8, 2019
  52. ryanofsky referenced this in commit 515e70defd on Feb 8, 2019
  53. ryanofsky force-pushed on Feb 8, 2019
  54. ryanofsky referenced this in commit f5d3f6be30 on Feb 8, 2019
  55. ryanofsky commented at 10:42 pm on February 8, 2019: member
    Updated ba426f53709902a35a46732846226977fbfd5519 -> f5d3f6be30489e110e09d1adf4dc1046d2898154 (pr/wchain3.2 -> pr/wchain3.3, compare) with suggested changes
  56. in src/interfaces/wallet.cpp:102 in f5d3f6be30 outdated
     98@@ -99,8 +99,6 @@ WalletTx MakeWalletTx(interfaces::Chain::Lock& locked_chain, CWallet& wallet, co
     99 //! Construct wallet tx status struct.
    100 WalletTxStatus MakeWalletTxStatus(interfaces::Chain::Lock& locked_chain, const CWalletTx& wtx)
    101 {
    102-    LockAnnotation lock(::cs_main); // Temporary, for CheckFinalTx below. Removed in upcoming commit.
    


    MarcoFalke commented at 2:23 pm on February 9, 2019:
    This is also used for ::mapBlockIndex, so can not be removed yet?

    ryanofsky commented at 9:20 pm on February 9, 2019:

    re: #15288 (review)

    This is also used for ::mapBlockIndex, so can not be removed yet?

    Seems like a silent merge conflict with #15321 (this PR has not been rebased since that was merged).

  57. ryanofsky force-pushed on Feb 9, 2019
  58. ryanofsky referenced this in commit fd66c52f09 on Feb 9, 2019
  59. ryanofsky commented at 9:24 pm on February 9, 2019: member
    Updated f5d3f6be30489e110e09d1adf4dc1046d2898154 -> fd66c52f099e8a3c5a6ba727f41691c684d5ab91 (pr/wchain3.3 -> pr/wchain3.4, compare), adding lockannotation needed to avoid merge conflict with #15321 if this is rebased or merged Rebased fd66c52f099e8a3c5a6ba727f41691c684d5ab91 -> a2f0f2daa3077d950e1537751d5b70f397994351 (pr/wchain3.4 -> pr/wchain3.5) due to conflicts with #15226 and #15373
  60. ryanofsky referenced this in commit 50e647210d on Feb 9, 2019
  61. DrahtBot added the label Needs rebase on Feb 10, 2019
  62. MarcoFalke referenced this in commit ad039aa0d3 on Feb 11, 2019
  63. ryanofsky force-pushed on Feb 11, 2019
  64. ryanofsky referenced this in commit a2f0f2daa3 on Feb 11, 2019
  65. DrahtBot removed the label Needs rebase on Feb 11, 2019
  66. in src/wallet/wallet.cpp:1901 in a2f0f2daa3 outdated
    1815     if (!IsCoinBase() && !isAbandoned() && GetDepthInMainChain(locked_chain) == 0)
    1816     {
    1817         CValidationState state;
    1818         /* GetDepthInMainChain already catches known conflicts. */
    1819-        if (InMempool() || AcceptToMemoryPool(locked_chain, maxTxFee, state)) {
    1820+        if (InMempool() || AcceptToMemoryPool(locked_chain, state)) {
    


    jnewbery commented at 4:30 pm on February 12, 2019:

    My previous comment wasn’t clear. I think this would be even better as:

    0if ((InMempool() || AcceptToMemoryPool(locked_chain, state) && pwallet->chain().p2pEnabled()) {
    1    pwallet->WalletLogPrintf("Relaying wtx %s\n", GetHash().ToString());
    2    return True;
    3}
    

    I think the existing behaviour, where Relaying wtx... is logged even when p2p is not enabled and the tx is not broadcast, is a logging bug.

    I can see this either way though. Changing this is a (minor) behaviour change in a PR which is supposed to be refactor only.


    ryanofsky commented at 9:02 pm on February 25, 2019:

    re: #15288 (review)

    I think this would be even better as

    Applied your suggestion in commit “Remove use of g_connman / PushInventory in wallet code” (ae6b51043e46e80c0fe89628776de48274d7c1b2)

    I think it’s still not a change in behavior, unless it really is possible for g_connman to be null at this point. Even if there is a change, only effect is dropping a misleading log message like you say.


    jnewbery commented at 9:41 pm on February 25, 2019:

    Your parens are slightly different from the existing precedence.

    What you have in this PR:

    0        if (InMempool() || (AcceptToMemoryPool(locked_chain, state) && pwallet->chain().p2pEnabled())) {
    

    instead of:

    0        if ((InMempool() || AcceptToMemoryPool(locked_chain, state)) && pwallet->chain().p2pEnabled()) {
    

    I suggest we revert the most recent change and leave tidying up for a follow-up PR. It doesn’t make sense to burden this already large PR with aesthetic improvements.


    ryanofsky commented at 10:15 pm on February 25, 2019:

    #15288 (review)

    Your parens are slightly different from the existing precedence

    Wow, not good. Reverted.

  67. jnewbery commented at 4:33 pm on February 12, 2019: member

    utACK a2f0f2daa3077d950e1537751d5b70f397994351. I’ve satisfied myself that the rebases and force pushes are as described by Russ.

    One other suggestion inline. utACK with or without that change.

  68. DrahtBot added the label Needs rebase on Feb 22, 2019
  69. ryanofsky force-pushed on Feb 22, 2019
  70. ryanofsky referenced this in commit 1885d47c8e on Feb 22, 2019
  71. ryanofsky force-pushed on Feb 22, 2019
  72. ryanofsky referenced this in commit 8086065133 on Feb 22, 2019
  73. DrahtBot removed the label Needs rebase on Feb 22, 2019
  74. Remove uses of CheckFinalTx in wallet code
    This commit does not change behavior.
    80f52a2267
  75. Remove use of IsRBFOptIn in wallet code
    This commit does not change behavior.
    bdc6628683
  76. Remove use of GetCountWithDescendants in wallet code
    This commit does not change behavior.
    291276f7f4
  77. Remove use of GetTransactionAncestry in wallet code
    This commit does not change behavior.
    cd32160af0
  78. Remove use of CalculateMemPoolAncestors in wallet code
    This commit does not change behavior.
    1fb0a4a04e
  79. Remove uses of fee globals in wallet code
    This commit does not change behavior.
    cc02c796d3
  80. Remove uses of fPruneMode in wallet code
    This commit does not change behavior.
    cc3836e8f9
  81. Remove uses of g_connman in wallet code
    This commit does not change behavior.
    00dfb2a440
  82. Remove use of g_connman / PushInventory in wallet code
    This commit does not change behavior.
    6d6bcc77c0
  83. Remove uses of GetAdjustedTime in wallet code
    This commit does not change behavior.
    c5e59a96a8
  84. Remove uses of InitMessage/Warning/Error in wallet code
    This commit does not change behavior.
    e2c8ba9f6e
  85. Remove use of AcceptToMemoryPool in wallet code
    This commit does not change behavior.
    d02b34c8a8
  86. circular-dependencies: Avoid treating some .h/.cpp files as a unit
    This avoids a bogus circular dependency error in the next commit:
    
    interfaces/chain -> interfaces/wallet -> wallet/wallet -> interfaces/chain
    
    Which is incorrect, because interfaces/chain.cpp depends only on the
    interfaces/wallet.h file, not the interfaces/wallet.cpp file, and it is
    wrong to treat these as a unit. Inside the interfaces directory, .h files
    contain abstract class definitions and .cpp files contain implementations of
    those classes, so you don't need to link against .cpp files if you're only
    using the abstract class definition in the .h file.
    
    An alternative fix might be to rename all the cpp files in the interfaces
    directory like: chain.cpp->chain_impl.cpp, node.cpp->node_impl.cpp. But just
    getting the linter to treat these files as independent dependencies seemed
    like it would allow keeping code organization straightforward and avoiding
    the need to rename things.
    318f41fb2c
  87. Remove use of uiInterface.LoadWallet in wallet code
    This also changes the uiInterface.LoadWallet signal argument type from
    shared_ptr<CWallet> to unique_ptr<interfaces::Wallet> because CWallet is an
    internal wallet class that shouldn't be used in non-wallet code (and also can't
    be passed across process boundaries).
    
    This commit does not change behavior.
    1106a6fde4
  88. Remove use of IsInitialBlockDownload in wallet code
    This commit does not change behavior.
    a1df1b48a8
  89. Change brace formatting
    Suggested https://github.com/bitcoin/bitcoin/pull/15288#pullrequestreview-197915100
    f7efd87c8f
  90. DrahtBot added the label Needs rebase on Feb 22, 2019
  91. ryanofsky force-pushed on Feb 22, 2019
  92. ryanofsky referenced this in commit a8da7492e6 on Feb 22, 2019
  93. DrahtBot removed the label Needs rebase on Feb 22, 2019
  94. HashUnlimited referenced this in commit 03f36e0848 on Feb 23, 2019
  95. ryanofsky force-pushed on Feb 25, 2019
  96. ryanofsky referenced this in commit bb0f2b04fd on Feb 25, 2019
  97. ryanofsky commented at 9:19 pm on February 25, 2019: member
    Rebased a2f0f2daa3077d950e1537751d5b70f397994351 -> 1885d47c8ec0a79d70ec79f20a45809e5b4ce8dd (pr/wchain3.5 -> pr/wchain3.6) due to conflict with #15458 Rebased 1885d47c8ec0a79d70ec79f20a45809e5b4ce8dd -> 8086065133a878c3cb47cde8ac2275611f6b7086 (pr/wchain3.6 -> pr/wchain3.7) due to (github-only) conflict with #15408 Rebased 8086065133a878c3cb47cde8ac2275611f6b7086 -> a8da7492e607c5ea44aa1252d42da32e87ce0c4a (pr/wchain3.7 -> pr/wchain3.8) due to conflict with #15435 Updated a8da7492e607c5ea44aa1252d42da32e87ce0c4a -> bb0f2b04fd2b03245a19aef298ec5e83a8d20481 (pr/wchain3.8 -> pr/wchain3.9, compare), making John’s suggested p2pEnabled change and reordering commits to fix some link errors that previously happened between commits.
  98. jnewbery commented at 9:42 pm on February 25, 2019: member
    utACK https://github.com/bitcoin/bitcoin/commit/bb0f2b04fd2b03245a19aef298ec5e83a8d20481 if you revert the RelayWalletTransaction() change.
  99. ryanofsky force-pushed on Feb 25, 2019
  100. ryanofsky force-pushed on Feb 25, 2019
  101. ryanofsky referenced this in commit 19afbb7e4a on Feb 25, 2019
  102. ryanofsky commented at 10:31 pm on February 25, 2019: member
    Updated bb0f2b04fd2b03245a19aef298ec5e83a8d20481 -> 19afbb7e4a840404b992851612583fb2c3793e56 (pr/wchain3.9 -> pr/wchain3.10, compare) reverting previous unintended wallet relay change
  103. jnewbery commented at 10:44 pm on February 25, 2019: member

    utACK https://github.com/bitcoin/bitcoin/commit/19afbb7e4a840404b992851612583fb2c3793e56 (only reviewed force-push diffs).

    Sorry for pushing you in the direction of unnecessary tidy-ups! We can tackle those later.

  104. in src/wallet/rpcwallet.cpp:3414 in 6f836c04d1 outdated
    3410@@ -3411,7 +3411,7 @@ UniValue generate(const JSONRPCRequest& request)
    3411         throw JSONRPCError(RPC_INTERNAL_ERROR, "No coinbase script available");
    3412     }
    3413 
    3414-    return generateBlocks(coinbase_script, num_generate, max_tries, true);
    3415+    return pwallet->chain().generateBlocks(coinbase_script, num_generate, max_tries, true);
    


    Sjors commented at 9:18 am on February 27, 2019:

    This causes RPC code to get entangled with pure wallet code, which adds a dependency on UniValue for the wallet and causes the need to change Makefile.

    generateBlocks itself should be split between:

    • rpc/mining.cpp: check the input parameters, loop over the number of blocks requested, request a block hash, convert the result(s) to JSON
    • interfaces/chain.cpp construct block and returns block hash

    Fortunately: The wallet generate rpc method is deprecated and will be fully removed in v0.19 so you can drop this entire commit and wait for #15492.


    ryanofsky commented at 6:39 am on February 28, 2019:

    re: #15288 (review)

    In commit “Remove use of generateBlocks in wallet code” (6f836c04d13bd49bcddff570c73820777a56f419)

    Dropped this commit as suggested to avoid unnecessary conflicts with #15492.

    This causes RPC code to get entangled with pure wallet code, which adds a dependency on UniValue for the wallet and causes the need to change Makefile.

    This isn’t really accurate. This is just the first commit in a PR adding more server code to chain.cpp. The server code is what needs univalue, and without this commit the same makefile changes are still needed.

  105. in src/wallet/feebumper.cpp:114 in 428e6c422c outdated
    110@@ -111,7 +111,7 @@ Result CreateTransaction(const CWallet* wallet, const uint256& txid, const CCoin
    111     }
    112 
    113     // Calculate the expected size of the new transaction.
    114-    int64_t txSize = GetVirtualTransactionSize(*(wtx.tx));
    115+    int64_t txSize = wallet->chain().getVirtualTransactionSize(*(wtx.tx));
    


    Sjors commented at 10:07 am on February 27, 2019:
    There should be no need to communicate with the node for pure utility functions like this, but we can worry about that later. Maybe we need a Utility interface? Or CTransaction should just have a ->VirtualSize() method.

    ryanofsky commented at 6:39 am on February 28, 2019:

    re: #15288 (review)

    In commit “Remove uses of GetVirtualTransactionSize in wallet code” (428e6c422c21f35ff991823697a373dfa5cb4e4f)

    There should be no need to communicate with the node for pure utility functions like this, but we can worry about that later. Maybe we need a Utility interface? Or CTransaction should just have a ->VirtualSize() method.

    Good catch, dropped this commit. I originally wrapped GetVirtualTransactionSize because the hide-globals.py script from #10244 detected it that relies on the nBytesPerSigOp global. But actually the global value doesn’t have any effect in the wallet call, so it’s fine to make the call from anywhere.

    In the future, it might be good to get rid of the PendingWalletTx::getVirtualSize method, too, since it’s also unnecessary:

    https://github.com/bitcoin/bitcoin/blob/f9dbb319d26f41c2b0b56982a79639844ddf1e9d/src/interfaces/wallet.h#L295-L296

  106. in src/interfaces/chain.cpp:250 in 6fdfa18dfb outdated
    233@@ -233,6 +234,7 @@ class ChainImpl : public Chain
    234         return ::mempool.GetMinFee(gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
    235     }
    236     bool getPruneMode() override { return ::fPruneMode; }
    237+    bool p2pEnabled() override { return g_connman != nullptr; }
    


    Sjors commented at 10:49 am on February 27, 2019:
    Note to other reviewers: p2pEnabled() is called 1835020e98259568e5e754a7930eb7e0995c7b34 which Github incorrectly shows as earlier.
  107. in src/interfaces/chain.h:117 in 8f24a26648 outdated
    111@@ -111,6 +112,10 @@ class Chain
    112 
    113         //! Check if transaction will be final given chain height current time.
    114         virtual bool checkFinalTx(const CTransaction& tx) = 0;
    115+
    116+        //! Add transaction to memory pool if the transaction fee is below the
    117+        //! specified amount (as a safeguard). */
    


    Sjors commented at 11:00 am on February 27, 2019:
    Nit: “below the amount specified by absurd_fee”

    ryanofsky commented at 6:39 am on February 28, 2019:

    re: #15288 (review)

    Nit: “below the amount specified by absurd_fee”

    Thanks, fixed.

  108. in src/wallet/wallet.cpp:1902 in 1835020e98 outdated
    1898@@ -1899,12 +1899,8 @@ bool CWalletTx::RelayWalletTransaction(interfaces::Chain::Lock& locked_chain, CC
    1899         /* GetDepthInMainChain already catches known conflicts. */
    1900         if (InMempool() || AcceptToMemoryPool(locked_chain, maxTxFee, state)) {
    1901             pwallet->WalletLogPrintf("Relaying wtx %s\n", GetHash().ToString());
    


    Sjors commented at 11:10 am on February 27, 2019:
    From discussion in commit Remove use of AcceptToMemoryPool in wallet code between you and @jnewbery: this Relaying wtx log message is displayed even if !p2pEnabled(). I’m fine with moving the log message down, or adding a TODO, or just ignoring this.

    ryanofsky commented at 6:42 am on February 28, 2019:

    re: #15288 (review)

    I’m fine with moving the log message down, or adding a TODO, or just ignoring this.

    I’m happy to go with whatever you and John want to see here. Since you’re ok with the status quo, I’m going to stick with this, since it follows the last suggestion from John.


    jnewbery commented at 5:56 pm on March 2, 2019:
    Leave it. Tidy ups can come in a later PR.
  109. in contrib/devtools/circular-dependencies.py:14 in 1e5f7a174c outdated
     7@@ -8,9 +8,18 @@
     8     'core_write.cpp': 'core_io.cpp',
     9 }
    10 
    11+# Directories with header-based modules, where the assumption that .cpp files
    12+# define functions and variables declared in corresponding .h files is
    13+# incorrect.
    14+HEADER_MODULE_PATHS = [
    


    Sjors commented at 11:13 am on February 27, 2019:
    nit: could be a separate commit

    ryanofsky commented at 6:38 am on February 28, 2019:

    re: #15288 (review)

    In commit “Remove use of uiInterface.LoadWallet in wallet code” (1e5f7a174c264cfe9e65a7206acc24f43d9255d7)

    nit: could be a separate commit

    Moved to 318f41fb2cae0a46b4e4be49156562b8ed640f0c.

  110. in src/ui_interface.h:108 in 1e5f7a174c outdated
    104@@ -102,7 +105,7 @@ class CClientUIInterface
    105     ADD_SIGNALS_DECL_WRAPPER(NotifyAlertChanged, void, );
    106 
    107     /** A wallet has been loaded. */
    108-    ADD_SIGNALS_DECL_WRAPPER(LoadWallet, void, std::shared_ptr<CWallet> wallet);
    109+    ADD_SIGNALS_DECL_WRAPPER(LoadWallet, void, std::unique_ptr<interfaces::Wallet>& wallet);
    


    Sjors commented at 11:27 am on February 27, 2019:

    To make this bouncing around of unique pointers easier to follow (another commit could) move std::string name = wallet->getWalletName(); all the way up in WalletModel* WalletController::getOrCreateWallet, and then add a comment that this is the last time it needs the unique pointer std::unique_ptr<interfaces::Wallet> wallet.

    Alternatively, but that’s too much behavior change for this PR, we could use the wallet name (or some canonical identifier) for the signal.

    cc @promag


    ryanofsky commented at 6:39 am on February 28, 2019:

    re: #15288 (review)

    In commit “Remove use of uiInterface.LoadWallet in wallet code” (1e5f7a174c264cfe9e65a7206acc24f43d9255d7)

    To make this bouncing around of unique pointers easier to follow (another commit could) move std::string name = wallet->getWalletName(); all the way up in WalletModel* WalletController::getOrCreateWallet, and then add a comment that this is the last time it needs the unique pointer std::unique_ptr<interfaces::Wallet> wallet.

    It shouldn’t matter for this PR, but I don’t think I understand the suggestion, specifically where you would move the getWalletName call.

    I think one thing that might make this code more understandable would be to stop using a boost signal (just replacing the signal with std::list<LoadWalletFn> or similar).


    promag commented at 6:54 pm on March 3, 2019:
    I think this is fine.
  111. Sjors approved
  112. Sjors commented at 11:31 am on February 27, 2019: member
    tACK 19afbb7e4a840404b992851612583fb2c3793e56, but with a preference for dropping 6f836c04d13bd49bcddff570c73820777a56f419 Remove use of generateBlocks in wallet code and rebasing on #15492 which removes generate RPC.
  113. jnewbery commented at 4:29 pm on February 27, 2019: member

    a preference for dropping 6f836c0 Remove use of generateBlocks in wallet code and rebasing on #15492 which removes generate RPC.

    My previous thoughts were that this PR could go in first and we could then remove the generate method, but I agree that removing generate first is cleaner due to the makefile changes.

  114. Sjors commented at 6:38 pm on February 27, 2019: member

    @ryanofsky wrote in #15492:

    I think there is some confusion in the #15288 discussion that generateBlocks method requires additional makefile changes that other Chain methods don’t require, but this is not true. The only reason makefile changes are part of the generateBlocks commit is because that commit comes first, so all the later commits just piggyback off of it.

    Sounds like it’s a good idea to split that commit then. That slightly reduces the case for waiting for #15288, though that’s still easier.

  115. jnewbery commented at 10:29 pm on February 27, 2019: member
    Since the makefile changes are required with or without the removal of generate, I’m reverting to my previous opinion: we should aim to get this in first, and then tidy up the API later (by removing generate amongst other things).
  116. ryanofsky force-pushed on Mar 1, 2019
  117. ryanofsky commented at 7:58 pm on March 1, 2019: member
    Updated 19afbb7e4a840404b992851612583fb2c3793e56 -> f7efd87c8fb49f82e268a95e989909d453500e2b (pr/wchain3.10 -> pr/wchain3.11, compare) with a few suggestions from Sjors.
  118. Sjors commented at 3:18 pm on March 2, 2019: member

    re f7efd87: is there a particular reason now why the Makefile changes are in Remove uses of g_connman in wallet code? Otherwise it makes more sense to me to have a separate commit for that. From inline discussion:

    This causes RPC code to get entangled with pure wallet code, which adds a dependency on UniValue for the wallet and causes the need to change Makefile.

    This isn’t really accurate. This is just the first commit in a PR adding more server code to chain.cpp. The server code is what needs univalue, and without this commit the same makefile changes are still needed.

    It’s not immediately obvious to me what change in chain.cpp is causing this (indirect?) dependency.

  119. ryanofsky commented at 5:11 pm on March 2, 2019: member

    re: #15288 (comment)

    Otherwise it makes more sense to me to have a separate commit for that.

    I disagree with this. I think when you add a new dependency in the source, you should be adding the new dependency in the build at the same time. If you add one dependency in two commits, history is harder to understand than it needs to be and it becomes more difficult to roll back and bisect correctly. It’s also just tedious and makes it things hard to follow when you have to track down different commits that reference each other instead of just doing simple things atomically.

    It’s not immediately obvious to me what change in chain.cpp is causing this (indirect?) dependency.

    I’m not sure what the source of confusion is, but I’m adding the dependency in commit “Remove uses of g_connman in wallet code” (00dfb2a440b94a24b61cafb519fb122f6a0ae176), which is the commit that requires the dependency. You can easily verify this by trying to build the commit without the Makefile changes:

      0$ git checkout 00dfb2a440b # Remove uses of g_connman in wallet code
      1$ git log -p -n1 src/Makefile* | git apply -R
      2$ make
      3Making all in src
      4make[1]: Entering directory '/home/russ/src/bitcoin/src'
      5make[2]: Entering directory '/home/russ/src/bitcoin/src'
      6make[3]: Entering directory '/home/russ/src/bitcoin'
      7make[3]: Leaving directory '/home/russ/src/bitcoin'
      8  CXXLD    bitcoin-wallet
      9libbitcoin_server.a(libbitcoin_server_a-init.o): In function `Shutdown(InitInterfaces&)':
     10/home/russ/src/bitcoin/src/init.cpp:(.text+0x8ff): undefined reference to `g_zmq_notification_interface'
     11/home/russ/src/bitcoin/src/init.cpp:283: undefined reference to `g_zmq_notification_interface'
     12/home/russ/src/bitcoin/src/init.cpp:(.text+0x924): undefined reference to `g_zmq_notification_interface'
     13/home/russ/src/bitcoin/src/init.cpp:(.text+0x94f): undefined reference to `g_zmq_notification_interface'
     14libbitcoin_server.a(libbitcoin_server_a-init.o): In function `SetupServerArgs()':
     15/home/russ/src/bitcoin/src/init.cpp:455: undefined reference to `g_wallet_init_interface'
     16/home/russ/src/bitcoin/src/init.cpp:462: undefined reference to `CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM'
     17/home/russ/src/bitcoin/src/init.cpp:463: undefined reference to `CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM'
     18/home/russ/src/bitcoin/src/init.cpp:464: undefined reference to `CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM'
     19/home/russ/src/bitcoin/src/init.cpp:465: undefined reference to `CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM'
     20libbitcoin_server.a(libbitcoin_server_a-init.o): In function `AppInitParameterInteraction()':
     21/home/russ/src/bitcoin/src/init.cpp:1147: undefined reference to `g_wallet_init_interface'
     22libbitcoin_server.a(libbitcoin_server_a-init.o): In function `AppInitMain(InitInterfaces&)':
     23/home/russ/src/bitcoin/src/init.cpp:1297: undefined reference to `g_wallet_init_interface'
     24/home/russ/src/bitcoin/src/init.cpp:1308: undefined reference to `RegisterZMQRPCCommands(CRPCTable&)'
     25/home/russ/src/bitcoin/src/init.cpp:1431: undefined reference to `CZMQNotificationInterface::Create()'
     26/home/russ/src/bitcoin/src/init.cpp:(.text+0x163c5): undefined reference to `g_zmq_notification_interface'
     27/home/russ/src/bitcoin/src/init.cpp:1434: undefined reference to `g_zmq_notification_interface'
     28libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_tx(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     29/home/russ/src/bitcoin/src/rest.cpp:382: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     30libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_chaininfo(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     31/home/russ/src/bitcoin/src/rest.cpp:283: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     32libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_mempool_info(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     33/home/russ/src/bitcoin/src/rest.cpp:305: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     34libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_mempool_contents(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     35/home/russ/src/bitcoin/src/rest.cpp:327: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     36libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_headers(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     37/home/russ/src/bitcoin/src/rest.cpp:181: undefined reference to `UniValue::push_back(UniValue const&)'
     38/home/russ/src/bitcoin/src/rest.cpp:183: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     39libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_getutxos(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     40/home/russ/src/bitcoin/src/rest.cpp:556: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     41/home/russ/src/bitcoin/src/rest.cpp:561: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     42/home/russ/src/bitcoin/src/rest.cpp:562: undefined reference to `UniValue::push_back(UniValue const&)'
     43/home/russ/src/bitcoin/src/rest.cpp:564: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     44/home/russ/src/bitcoin/src/rest.cpp:567: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     45libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_blockhash_by_height(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     46/home/russ/src/bitcoin/src/rest.cpp:615: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     47libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `rest_block(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)':
     48/home/russ/src/bitcoin/src/rest.cpp:246: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
     49libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `JSONRPCRequest':
     50/home/russ/src/bitcoin/src/./rpc/server.h:50: undefined reference to `NullUniValue'
     51libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)':
     52/home/russ/src/bitcoin/src/./univalue/include/univalue.h:138: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     53libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
     54/home/russ/src/bitcoin/src/./univalue/include/univalue.h:118: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     55libbitcoin_server.a(libbitcoin_server_a-rest.o): In function `UniValue':
     56/home/russ/src/bitcoin/src/./univalue/include/univalue.h:32: undefined reference to `UniValue::setInt(long)'
     57libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `blockToJSON(CBlock const&, CBlockIndex const*, CBlockIndex const*, bool)':
     58/home/russ/src/bitcoin/src/rpc/blockchain.cpp:139: undefined reference to `UniValue::push_back(UniValue const&)'
     59/home/russ/src/bitcoin/src/rpc/blockchain.cpp:144: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     60libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `mempoolToJSON(bool)':
     61/home/russ/src/bitcoin/src/rpc/blockchain.cpp:479: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     62libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `entryToJSON(UniValue&, CTxMemPoolEntry const&)':
     63/home/russ/src/bitcoin/src/rpc/blockchain.cpp:413: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     64/home/russ/src/bitcoin/src/rpc/blockchain.cpp:414: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     65/home/russ/src/bitcoin/src/rpc/blockchain.cpp:415: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     66libbitcoin_server.a(libbitcoin_server_a-blockchain.o):/home/russ/src/bitcoin/src/rpc/blockchain.cpp:416: more undefined references to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)' follow
     67libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `gettxout(JSONRPCRequest const&)':
     68/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1124: undefined reference to `UniValue::operator[](unsigned long) const'
     69/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1125: undefined reference to `UniValue::operator[](unsigned long) const'
     70/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1125: undefined reference to `UniValue::get_int() const'
     71/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1128: undefined reference to `UniValue::operator[](unsigned long) const'
     72/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1129: undefined reference to `UniValue::operator[](unsigned long) const'
     73/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1129: undefined reference to `UniValue::get_bool() const'
     74/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1136: undefined reference to `NullUniValue'
     75/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1140: undefined reference to `NullUniValue'
     76/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1151: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     77/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1154: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     78libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getblockchaininfo(JSONRPCRequest const&)':
     79/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1354: undefined reference to `UniValue::push_back(UniValue const&)'
     80/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1355: undefined reference to `UniValue::push_back(UniValue const&)'
     81/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1356: undefined reference to `UniValue::push_back(UniValue const&)'
     82/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1360: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     83/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1361: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     84libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `SoftForkDesc(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, CBlockIndex const*, Consensus::Params const&)':
     85/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1217: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     86libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `BIP9SoftForkDescPushBack(UniValue&, Consensus::Params const&, Consensus::DeploymentPos)':
     87/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1259: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     88libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `mempoolInfoToJSON()':
     89/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1496: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
     90libbitcoin_server.a(libbitcoin_server_a-blockchain.o):/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1497: more undefined references to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)' follow
     91libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `scantxoutset(JSONRPCRequest const&)':
     92/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2190: undefined reference to `UniValue::operator[](unsigned long) const'
     93/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2190: undefined reference to `UniValue::get_str[abi:cxx11]() const'
     94/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2194: undefined reference to `NullUniValue'
     95/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2198: undefined reference to `UniValue::operator[](unsigned long) const'
     96/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2198: undefined reference to `UniValue::get_str[abi:cxx11]() const'
     97/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2207: undefined reference to `UniValue::operator[](unsigned long) const'
     98/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2207: undefined reference to `UniValue::get_str[abi:cxx11]() const'
     99/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2217: undefined reference to `UniValue::operator[](unsigned long) const'
    100/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2217: undefined reference to `UniValue::get_array() const'
    101/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2217: undefined reference to `UniValue::getValues() const'
    102/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2221: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    103/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2223: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    104/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2225: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    105/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2226: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    106/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2228: undefined reference to `UniValue::get_int() const'
    107/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2284: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    108/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2287: undefined reference to `UniValue::push_back(UniValue const&)'
    109/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2289: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    110/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2290: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    111libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getchaintxstats(JSONRPCRequest const&)':
    112/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1676: undefined reference to `UniValue::operator[](unsigned long) const'
    113/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1680: undefined reference to `UniValue::operator[](unsigned long) const'
    114/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1693: undefined reference to `UniValue::operator[](unsigned long) const'
    115/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1696: undefined reference to `UniValue::operator[](unsigned long) const'
    116/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1696: undefined reference to `UniValue::get_int() const'
    117libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getblockstats(JSONRPCRequest const&)':
    118/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1845: undefined reference to `UniValue::operator[](unsigned long) const'
    119/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1846: undefined reference to `UniValue::operator[](unsigned long) const'
    120/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1846: undefined reference to `UniValue::get_int() const'
    121/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1857: undefined reference to `UniValue::operator[](unsigned long) const'
    122/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1870: undefined reference to `UniValue::operator[](unsigned long) const'
    123/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1871: undefined reference to `UniValue::operator[](unsigned long) const'
    124/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1871: undefined reference to `UniValue::get_array() const'
    125/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1873: undefined reference to `UniValue::operator[](unsigned long) const'
    126/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1873: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    127/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2005: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    128/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2037: undefined reference to `UniValue::operator[](std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
    129/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2041: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    130libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getblock(JSONRPCRequest const&)':
    131/home/russ/src/bitcoin/src/rpc/blockchain.cpp:884: undefined reference to `UniValue::operator[](unsigned long) const'
    132/home/russ/src/bitcoin/src/rpc/blockchain.cpp:887: undefined reference to `UniValue::operator[](unsigned long) const'
    133/home/russ/src/bitcoin/src/rpc/blockchain.cpp:888: undefined reference to `UniValue::operator[](unsigned long) const'
    134/home/russ/src/bitcoin/src/rpc/blockchain.cpp:889: undefined reference to `UniValue::operator[](unsigned long) const'
    135/home/russ/src/bitcoin/src/rpc/blockchain.cpp:889: undefined reference to `UniValue::get_int() const'
    136/home/russ/src/bitcoin/src/rpc/blockchain.cpp:891: undefined reference to `UniValue::operator[](unsigned long) const'
    137/home/russ/src/bitcoin/src/rpc/blockchain.cpp:891: undefined reference to `UniValue::get_bool() const'
    138libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getblockhash(JSONRPCRequest const&)':
    139/home/russ/src/bitcoin/src/rpc/blockchain.cpp:727: undefined reference to `UniValue::operator[](unsigned long) const'
    140/home/russ/src/bitcoin/src/rpc/blockchain.cpp:727: undefined reference to `UniValue::get_int() const'
    141libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getblockheader(JSONRPCRequest const&)':
    142/home/russ/src/bitcoin/src/rpc/blockchain.cpp:776: undefined reference to `UniValue::operator[](unsigned long) const'
    143/home/russ/src/bitcoin/src/rpc/blockchain.cpp:779: undefined reference to `UniValue::operator[](unsigned long) const'
    144/home/russ/src/bitcoin/src/rpc/blockchain.cpp:780: undefined reference to `UniValue::operator[](unsigned long) const'
    145/home/russ/src/bitcoin/src/rpc/blockchain.cpp:780: undefined reference to `UniValue::get_bool() const'
    146libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getchaintips(JSONRPCRequest const&)':
    147/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1482: undefined reference to `UniValue::push_back(UniValue const&)'
    148libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getmempoolancestors(JSONRPCRequest const&)':
    149/home/russ/src/bitcoin/src/rpc/blockchain.cpp:564: undefined reference to `UniValue::operator[](unsigned long) const'
    150/home/russ/src/bitcoin/src/rpc/blockchain.cpp:565: undefined reference to `UniValue::operator[](unsigned long) const'
    151/home/russ/src/bitcoin/src/rpc/blockchain.cpp:565: undefined reference to `UniValue::get_bool() const'
    152/home/russ/src/bitcoin/src/rpc/blockchain.cpp:567: undefined reference to `UniValue::operator[](unsigned long) const'
    153/home/russ/src/bitcoin/src/rpc/blockchain.cpp:595: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    154libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getmempooldescendants(JSONRPCRequest const&)':
    155/home/russ/src/bitcoin/src/rpc/blockchain.cpp:634: undefined reference to `UniValue::operator[](unsigned long) const'
    156/home/russ/src/bitcoin/src/rpc/blockchain.cpp:635: undefined reference to `UniValue::operator[](unsigned long) const'
    157/home/russ/src/bitcoin/src/rpc/blockchain.cpp:635: undefined reference to `UniValue::get_bool() const'
    158/home/russ/src/bitcoin/src/rpc/blockchain.cpp:637: undefined reference to `UniValue::operator[](unsigned long) const'
    159/home/russ/src/bitcoin/src/rpc/blockchain.cpp:665: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    160libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getmempoolentry(JSONRPCRequest const&)':
    161/home/russ/src/bitcoin/src/rpc/blockchain.cpp:692: undefined reference to `UniValue::operator[](unsigned long) const'
    162libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `getrawmempool(JSONRPCRequest const&)':
    163/home/russ/src/bitcoin/src/rpc/blockchain.cpp:525: undefined reference to `UniValue::operator[](unsigned long) const'
    164/home/russ/src/bitcoin/src/rpc/blockchain.cpp:526: undefined reference to `UniValue::operator[](unsigned long) const'
    165/home/russ/src/bitcoin/src/rpc/blockchain.cpp:526: undefined reference to `UniValue::get_bool() const'
    166libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `gettxoutsetinfo(JSONRPCRequest const&)':
    167/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1074: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    168libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `pruneblockchain(JSONRPCRequest const&)':
    169/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1006: undefined reference to `UniValue::operator[](unsigned long) const'
    170/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1006: undefined reference to `UniValue::get_int() const'
    171libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `savemempool(JSONRPCRequest const&)':
    172/home/russ/src/bitcoin/src/rpc/blockchain.cpp:2069: undefined reference to `NullUniValue'
    173libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `verifychain(JSONRPCRequest const&)':
    174/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1183: undefined reference to `UniValue::operator[](unsigned long) const'
    175/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1184: undefined reference to `UniValue::operator[](unsigned long) const'
    176/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1184: undefined reference to `UniValue::get_int() const'
    177/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1185: undefined reference to `UniValue::operator[](unsigned long) const'
    178/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1186: undefined reference to `UniValue::operator[](unsigned long) const'
    179/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1186: undefined reference to `UniValue::get_int() const'
    180libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `preciousblock(JSONRPCRequest const&)':
    181/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1546: undefined reference to `UniValue::operator[](unsigned long) const'
    182/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1564: undefined reference to `NullUniValue'
    183libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `invalidateblock(JSONRPCRequest const&)':
    184/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1583: undefined reference to `UniValue::operator[](unsigned long) const'
    185/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1604: undefined reference to `NullUniValue'
    186libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `reconsiderblock(JSONRPCRequest const&)':
    187/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1624: undefined reference to `UniValue::operator[](unsigned long) const'
    188/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1643: undefined reference to `NullUniValue'
    189libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `waitfornewblock(JSONRPCRequest const&)':
    190/home/russ/src/bitcoin/src/rpc/blockchain.cpp:232: undefined reference to `UniValue::operator[](unsigned long) const'
    191/home/russ/src/bitcoin/src/rpc/blockchain.cpp:233: undefined reference to `UniValue::operator[](unsigned long) const'
    192/home/russ/src/bitcoin/src/rpc/blockchain.cpp:233: undefined reference to `UniValue::get_int() const'
    193libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `waitforblock(JSONRPCRequest const&)':
    194/home/russ/src/bitcoin/src/rpc/blockchain.cpp:275: undefined reference to `UniValue::operator[](unsigned long) const'
    195/home/russ/src/bitcoin/src/rpc/blockchain.cpp:277: undefined reference to `UniValue::operator[](unsigned long) const'
    196/home/russ/src/bitcoin/src/rpc/blockchain.cpp:278: undefined reference to `UniValue::operator[](unsigned long) const'
    197/home/russ/src/bitcoin/src/rpc/blockchain.cpp:278: undefined reference to `UniValue::get_int() const'
    198libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `waitforblockheight(JSONRPCRequest const&)':
    199/home/russ/src/bitcoin/src/rpc/blockchain.cpp:321: undefined reference to `UniValue::operator[](unsigned long) const'
    200/home/russ/src/bitcoin/src/rpc/blockchain.cpp:321: undefined reference to `UniValue::get_int() const'
    201/home/russ/src/bitcoin/src/rpc/blockchain.cpp:323: undefined reference to `UniValue::operator[](unsigned long) const'
    202/home/russ/src/bitcoin/src/rpc/blockchain.cpp:324: undefined reference to `UniValue::operator[](unsigned long) const'
    203/home/russ/src/bitcoin/src/rpc/blockchain.cpp:324: undefined reference to `UniValue::get_int() const'
    204libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `syncwithvalidationinterfacequeue(JSONRPCRequest const&)':
    205/home/russ/src/bitcoin/src/rpc/blockchain.cpp:356: undefined reference to `NullUniValue'
    206libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `BIP9SoftForkDesc(Consensus::Params const&, Consensus::DeploymentPos)':
    207/home/russ/src/bitcoin/src/rpc/blockchain.cpp:1248: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    208libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, long)':
    209/home/russ/src/bitcoin/src/./univalue/include/univalue.h:126: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    210libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long)':
    211/home/russ/src/bitcoin/src/./univalue/include/univalue.h:130: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    212libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double)':
    213/home/russ/src/bitcoin/src/./univalue/include/univalue.h:142: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    214libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::push_back(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    215/home/russ/src/bitcoin/src/./univalue/include/univalue.h:90: undefined reference to `UniValue::push_back(UniValue const&)'
    216libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)':
    217/home/russ/src/bitcoin/src/./univalue/include/univalue.h:134: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    218libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue':
    219/home/russ/src/bitcoin/src/./univalue/include/univalue.h:35: undefined reference to `UniValue::setBool(bool)'
    220/home/russ/src/bitcoin/src/./univalue/include/univalue.h:29: undefined reference to `UniValue::setInt(unsigned long)'
    221/home/russ/src/bitcoin/src/./univalue/include/univalue.h:41: undefined reference to `UniValue::setFloat(double)'
    222libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::push_back(long)':
    223/home/russ/src/bitcoin/src/./univalue/include/univalue.h:102: undefined reference to `UniValue::push_back(UniValue const&)'
    224libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue':
    225/home/russ/src/bitcoin/src/./univalue/include/univalue.h:44: undefined reference to `UniValue::setStr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    226libbitcoin_server.a(libbitcoin_server_a-blockchain.o): In function `UniValue::setInt(int)':
    227/home/russ/src/bitcoin/src/./univalue/include/univalue.h:59: undefined reference to `UniValue::setInt(long)'
    228libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `getnetworkhashps(JSONRPCRequest const&)':
    229/home/russ/src/bitcoin/src/rpc/mining.cpp:98: undefined reference to `UniValue::operator[](unsigned long) const'
    230/home/russ/src/bitcoin/src/rpc/mining.cpp:98: undefined reference to `UniValue::operator[](unsigned long) const'
    231/home/russ/src/bitcoin/src/rpc/mining.cpp:98: undefined reference to `UniValue::get_int() const'
    232/home/russ/src/bitcoin/src/rpc/mining.cpp:98: undefined reference to `UniValue::operator[](unsigned long) const'
    233/home/russ/src/bitcoin/src/rpc/mining.cpp:98: undefined reference to `UniValue::operator[](unsigned long) const'
    234/home/russ/src/bitcoin/src/rpc/mining.cpp:98: undefined reference to `UniValue::get_int() const'
    235libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `getmininginfo(JSONRPCRequest const&)':
    236/home/russ/src/bitcoin/src/rpc/mining.cpp:221: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    237libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `prioritisetransaction(JSONRPCRequest const&)':
    238/home/russ/src/bitcoin/src/rpc/mining.cpp:256: undefined reference to `UniValue::operator[](unsigned long) const'
    239/home/russ/src/bitcoin/src/rpc/mining.cpp:257: undefined reference to `UniValue::operator[](unsigned long) const'
    240/home/russ/src/bitcoin/src/rpc/mining.cpp:257: undefined reference to `UniValue::get_int64() const'
    241/home/russ/src/bitcoin/src/rpc/mining.cpp:259: undefined reference to `UniValue::operator[](unsigned long) const'
    242/home/russ/src/bitcoin/src/rpc/mining.cpp:259: undefined reference to `UniValue::operator[](unsigned long) const'
    243/home/russ/src/bitcoin/src/rpc/mining.cpp:259: undefined reference to `UniValue::get_real() const'
    244libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `getblocktemplate(JSONRPCRequest const&)':
    245/home/russ/src/bitcoin/src/rpc/mining.cpp:379: undefined reference to `NullUniValue'
    246/home/russ/src/bitcoin/src/rpc/mining.cpp:382: undefined reference to `UniValue::operator[](unsigned long) const'
    247/home/russ/src/bitcoin/src/rpc/mining.cpp:384: undefined reference to `UniValue::operator[](unsigned long) const'
    248/home/russ/src/bitcoin/src/rpc/mining.cpp:384: undefined reference to `UniValue::get_obj() const'
    249/home/russ/src/bitcoin/src/rpc/mining.cpp:385: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    250/home/russ/src/bitcoin/src/rpc/mining.cpp:387: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    251/home/russ/src/bitcoin/src/rpc/mining.cpp:394: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    252/home/russ/src/bitcoin/src/rpc/mining.cpp:398: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    253/home/russ/src/bitcoin/src/rpc/mining.cpp:403: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    254/home/russ/src/bitcoin/src/rpc/mining.cpp:425: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    255/home/russ/src/bitcoin/src/rpc/mining.cpp:428: undefined reference to `UniValue::operator[](unsigned long) const'
    256/home/russ/src/bitcoin/src/rpc/mining.cpp:429: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    257/home/russ/src/bitcoin/src/rpc/mining.cpp:433: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    258/home/russ/src/bitcoin/src/rpc/mining.cpp:435: undefined reference to `UniValue::get_int64() const'
    259/home/russ/src/bitcoin/src/rpc/mining.cpp:464: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    260/home/russ/src/bitcoin/src/rpc/mining.cpp:566: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    261/home/russ/src/bitcoin/src/rpc/mining.cpp:578: undefined reference to `UniValue::push_back(UniValue const&)'
    262/home/russ/src/bitcoin/src/rpc/mining.cpp:592: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    263/home/russ/src/bitcoin/src/rpc/mining.cpp:637: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    264/home/russ/src/bitcoin/src/rpc/mining.cpp:638: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    265/home/russ/src/bitcoin/src/rpc/mining.cpp:650: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    266/home/russ/src/bitcoin/src/rpc/mining.cpp:651: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    267libbitcoin_server.a(libbitcoin_server_a-mining.o):/home/russ/src/bitcoin/src/rpc/mining.cpp:656: more undefined references to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)' follow
    268libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `submitblock(JSONRPCRequest const&)':
    269/home/russ/src/bitcoin/src/rpc/mining.cpp:722: undefined reference to `UniValue::operator[](unsigned long) const'
    270/home/russ/src/bitcoin/src/rpc/mining.cpp:722: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    271libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `submitheader(JSONRPCRequest const&)':
    272/home/russ/src/bitcoin/src/rpc/mining.cpp:787: undefined reference to `UniValue::operator[](unsigned long) const'
    273/home/russ/src/bitcoin/src/rpc/mining.cpp:787: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    274/home/russ/src/bitcoin/src/rpc/mining.cpp:799: undefined reference to `NullUniValue'
    275libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `generatetoaddress(JSONRPCRequest const&)':
    276/home/russ/src/bitcoin/src/rpc/mining.cpp:171: undefined reference to `UniValue::operator[](unsigned long) const'
    277/home/russ/src/bitcoin/src/rpc/mining.cpp:171: undefined reference to `UniValue::get_int() const'
    278/home/russ/src/bitcoin/src/rpc/mining.cpp:173: undefined reference to `UniValue::operator[](unsigned long) const'
    279/home/russ/src/bitcoin/src/rpc/mining.cpp:174: undefined reference to `UniValue::operator[](unsigned long) const'
    280/home/russ/src/bitcoin/src/rpc/mining.cpp:174: undefined reference to `UniValue::get_int() const'
    281/home/russ/src/bitcoin/src/rpc/mining.cpp:177: undefined reference to `UniValue::operator[](unsigned long) const'
    282/home/russ/src/bitcoin/src/rpc/mining.cpp:177: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    283libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `estimatesmartfee(JSONRPCRequest const&)':
    284/home/russ/src/bitcoin/src/rpc/mining.cpp:845: undefined reference to `UniValue::operator[](unsigned long) const'
    285/home/russ/src/bitcoin/src/rpc/mining.cpp:847: undefined reference to `UniValue::operator[](unsigned long) const'
    286/home/russ/src/bitcoin/src/rpc/mining.cpp:849: undefined reference to `UniValue::operator[](unsigned long) const'
    287/home/russ/src/bitcoin/src/rpc/mining.cpp:851: undefined reference to `UniValue::operator[](unsigned long) const'
    288/home/russ/src/bitcoin/src/rpc/mining.cpp:851: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    289/home/russ/src/bitcoin/src/rpc/mining.cpp:862: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    290/home/russ/src/bitcoin/src/rpc/mining.cpp:865: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    291libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `estimaterawfee(JSONRPCRequest const&)':
    292/home/russ/src/bitcoin/src/rpc/mining.cpp:918: undefined reference to `UniValue::operator[](unsigned long) const'
    293/home/russ/src/bitcoin/src/rpc/mining.cpp:920: undefined reference to `UniValue::operator[](unsigned long) const'
    294/home/russ/src/bitcoin/src/rpc/mining.cpp:922: undefined reference to `UniValue::operator[](unsigned long) const'
    295/home/russ/src/bitcoin/src/rpc/mining.cpp:923: undefined reference to `UniValue::operator[](unsigned long) const'
    296/home/russ/src/bitcoin/src/rpc/mining.cpp:923: undefined reference to `UniValue::get_real() const'
    297/home/russ/src/bitcoin/src/rpc/mining.cpp:958: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    298/home/russ/src/bitcoin/src/rpc/mining.cpp:961: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    299/home/russ/src/bitcoin/src/rpc/mining.cpp:963: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    300/home/russ/src/bitcoin/src/rpc/mining.cpp:968: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    301/home/russ/src/bitcoin/src/rpc/mining.cpp:970: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    302libbitcoin_server.a(libbitcoin_server_a-mining.o):/home/russ/src/bitcoin/src/rpc/mining.cpp:972: more undefined references to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)' follow
    303libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `BIP22ValidationResult(CValidationState const&)':
    304/home/russ/src/bitcoin/src/rpc/mining.cpp:(.text+0x10483): undefined reference to `NullUniValue'
    305libbitcoin_server.a(libbitcoin_server_a-mining.o): In function `UniValue':
    306/home/russ/src/bitcoin/src/./univalue/include/univalue.h:48: undefined reference to `UniValue::setStr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    307libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `getdescriptorinfo(JSONRPCRequest const&)':
    308/home/russ/src/bitcoin/src/rpc/misc.cpp:173: undefined reference to `UniValue::operator[](unsigned long) const'
    309/home/russ/src/bitcoin/src/rpc/misc.cpp:173: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    310libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `deriveaddresses(JSONRPCRequest const&)':
    311/home/russ/src/bitcoin/src/rpc/misc.cpp:216: undefined reference to `UniValue::operator[](unsigned long) const'
    312/home/russ/src/bitcoin/src/rpc/misc.cpp:216: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    313/home/russ/src/bitcoin/src/rpc/misc.cpp:225: undefined reference to `UniValue::operator[](unsigned long) const'
    314/home/russ/src/bitcoin/src/rpc/misc.cpp:225: undefined reference to `UniValue::get_int() const'
    315/home/russ/src/bitcoin/src/rpc/misc.cpp:226: undefined reference to `UniValue::operator[](unsigned long) const'
    316/home/russ/src/bitcoin/src/rpc/misc.cpp:226: undefined reference to `UniValue::get_int() const'
    317libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `logging(JSONRPCRequest const&)':
    318/home/russ/src/bitcoin/src/rpc/misc.cpp:549: undefined reference to `UniValue::operator[](unsigned long) const'
    319/home/russ/src/bitcoin/src/rpc/misc.cpp:550: undefined reference to `UniValue::operator[](unsigned long) const'
    320/home/russ/src/bitcoin/src/rpc/misc.cpp:552: undefined reference to `UniValue::operator[](unsigned long) const'
    321/home/russ/src/bitcoin/src/rpc/misc.cpp:553: undefined reference to `UniValue::operator[](unsigned long) const'
    322libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `EnableOrDisableLogCategories(UniValue, bool)':
    323/home/russ/src/bitcoin/src/rpc/misc.cpp:493: undefined reference to `UniValue::get_array() const'
    324/home/russ/src/bitcoin/src/rpc/misc.cpp:495: undefined reference to `UniValue::operator[](unsigned long) const'
    325/home/russ/src/bitcoin/src/rpc/misc.cpp:495: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    326libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `getmemoryinfo(JSONRPCRequest const&)':
    327/home/russ/src/bitcoin/src/rpc/misc.cpp:476: undefined reference to `UniValue::operator[](unsigned long) const'
    328/home/russ/src/bitcoin/src/rpc/misc.cpp:476: undefined reference to `UniValue::operator[](unsigned long) const'
    329/home/russ/src/bitcoin/src/rpc/misc.cpp:476: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    330/home/russ/src/bitcoin/src/rpc/misc.cpp:479: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    331libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `validateaddress(JSONRPCRequest const&)':
    332/home/russ/src/bitcoin/src/rpc/misc.cpp:62: undefined reference to `UniValue::operator[](unsigned long) const'
    333/home/russ/src/bitcoin/src/rpc/misc.cpp:62: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    334/home/russ/src/bitcoin/src/rpc/misc.cpp:76: undefined reference to `UniValue::pushKVs(UniValue const&)'
    335libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `createmultisig(JSONRPCRequest const&)':
    336/home/russ/src/bitcoin/src/rpc/misc.cpp:113: undefined reference to `UniValue::operator[](unsigned long) const'
    337/home/russ/src/bitcoin/src/rpc/misc.cpp:113: undefined reference to `UniValue::get_int() const'
    338/home/russ/src/bitcoin/src/rpc/misc.cpp:116: undefined reference to `UniValue::operator[](unsigned long) const'
    339/home/russ/src/bitcoin/src/rpc/misc.cpp:116: undefined reference to `UniValue::get_array() const'
    340/home/russ/src/bitcoin/src/rpc/misc.cpp:119: undefined reference to `UniValue::operator[](unsigned long) const'
    341/home/russ/src/bitcoin/src/rpc/misc.cpp:119: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    342/home/russ/src/bitcoin/src/rpc/misc.cpp:119: undefined reference to `UniValue::operator[](unsigned long) const'
    343/home/russ/src/bitcoin/src/rpc/misc.cpp:119: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    344/home/russ/src/bitcoin/src/rpc/misc.cpp:119: undefined reference to `UniValue::operator[](unsigned long) const'
    345/home/russ/src/bitcoin/src/rpc/misc.cpp:119: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    346/home/russ/src/bitcoin/src/rpc/misc.cpp:120: undefined reference to `UniValue::operator[](unsigned long) const'
    347/home/russ/src/bitcoin/src/rpc/misc.cpp:120: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    348/home/russ/src/bitcoin/src/rpc/misc.cpp:122: undefined reference to `UniValue::operator[](unsigned long) const'
    349/home/russ/src/bitcoin/src/rpc/misc.cpp:122: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    350/home/russ/src/bitcoin/src/rpc/misc.cpp:128: undefined reference to `UniValue::operator[](unsigned long) const'
    351/home/russ/src/bitcoin/src/rpc/misc.cpp:129: undefined reference to `UniValue::operator[](unsigned long) const'
    352/home/russ/src/bitcoin/src/rpc/misc.cpp:129: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    353/home/russ/src/bitcoin/src/rpc/misc.cpp:130: undefined reference to `UniValue::operator[](unsigned long) const'
    354/home/russ/src/bitcoin/src/rpc/misc.cpp:130: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    355libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `verifymessage(JSONRPCRequest const&)':
    356/home/russ/src/bitcoin/src/rpc/misc.cpp:303: undefined reference to `UniValue::operator[](unsigned long) const'
    357/home/russ/src/bitcoin/src/rpc/misc.cpp:303: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    358/home/russ/src/bitcoin/src/rpc/misc.cpp:304: undefined reference to `UniValue::operator[](unsigned long) const'
    359/home/russ/src/bitcoin/src/rpc/misc.cpp:304: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    360/home/russ/src/bitcoin/src/rpc/misc.cpp:305: undefined reference to `UniValue::operator[](unsigned long) const'
    361/home/russ/src/bitcoin/src/rpc/misc.cpp:305: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    362libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `signmessagewithprivkey(JSONRPCRequest const&)':
    363/home/russ/src/bitcoin/src/rpc/misc.cpp:357: undefined reference to `UniValue::operator[](unsigned long) const'
    364/home/russ/src/bitcoin/src/rpc/misc.cpp:357: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    365/home/russ/src/bitcoin/src/rpc/misc.cpp:358: undefined reference to `UniValue::operator[](unsigned long) const'
    366/home/russ/src/bitcoin/src/rpc/misc.cpp:358: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    367libbitcoin_server.a(libbitcoin_server_a-misc.o): In function `setmocktime(JSONRPCRequest const&)':
    368/home/russ/src/bitcoin/src/rpc/misc.cpp:402: undefined reference to `UniValue::operator[](unsigned long) const'
    369/home/russ/src/bitcoin/src/rpc/misc.cpp:402: undefined reference to `UniValue::get_int64() const'
    370/home/russ/src/bitcoin/src/rpc/misc.cpp:404: undefined reference to `NullUniValue'
    371libbitcoin_server.a(libbitcoin_server_a-net.o): In function `ping(JSONRPCRequest const&)':
    372/home/russ/src/bitcoin/src/rpc/net.cpp:73: undefined reference to `NullUniValue'
    373libbitcoin_server.a(libbitcoin_server_a-net.o): In function `getpeerinfo(JSONRPCRequest const&)':
    374/home/russ/src/bitcoin/src/rpc/net.cpp:185: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    375/home/russ/src/bitcoin/src/rpc/net.cpp:188: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    376/home/russ/src/bitcoin/src/rpc/net.cpp:195: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    377/home/russ/src/bitcoin/src/rpc/net.cpp:202: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    378/home/russ/src/bitcoin/src/rpc/net.cpp:204: undefined reference to `UniValue::push_back(UniValue const&)'
    379libbitcoin_server.a(libbitcoin_server_a-net.o): In function `addnode(JSONRPCRequest const&)':
    380/home/russ/src/bitcoin/src/rpc/net.cpp:213: undefined reference to `UniValue::operator[](unsigned long) const'
    381/home/russ/src/bitcoin/src/rpc/net.cpp:214: undefined reference to `UniValue::operator[](unsigned long) const'
    382/home/russ/src/bitcoin/src/rpc/net.cpp:214: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    383/home/russ/src/bitcoin/src/rpc/net.cpp:237: undefined reference to `UniValue::operator[](unsigned long) const'
    384/home/russ/src/bitcoin/src/rpc/net.cpp:237: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    385/home/russ/src/bitcoin/src/rpc/net.cpp:243: undefined reference to `NullUniValue'
    386/home/russ/src/bitcoin/src/rpc/net.cpp:257: undefined reference to `NullUniValue'
    387libbitcoin_server.a(libbitcoin_server_a-net.o): In function `disconnectnode(JSONRPCRequest const&)':
    388/home/russ/src/bitcoin/src/rpc/net.cpp:285: undefined reference to `UniValue::operator[](unsigned long) const'
    389/home/russ/src/bitcoin/src/rpc/net.cpp:286: undefined reference to `UniValue::operator[](unsigned long) const'
    390/home/russ/src/bitcoin/src/rpc/net.cpp:290: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    391/home/russ/src/bitcoin/src/rpc/net.cpp:291: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    392/home/russ/src/bitcoin/src/rpc/net.cpp:293: undefined reference to `UniValue::get_int64() const'
    393/home/russ/src/bitcoin/src/rpc/net.cpp:303: undefined reference to `NullUniValue'
    394libbitcoin_server.a(libbitcoin_server_a-net.o): In function `getaddednodeinfo(JSONRPCRequest const&)':
    395/home/russ/src/bitcoin/src/rpc/net.cpp:342: undefined reference to `UniValue::operator[](unsigned long) const'
    396/home/russ/src/bitcoin/src/rpc/net.cpp:345: undefined reference to `UniValue::operator[](unsigned long) const'
    397/home/russ/src/bitcoin/src/rpc/net.cpp:345: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    398/home/russ/src/bitcoin/src/rpc/net.cpp:367: undefined reference to `UniValue::push_back(UniValue const&)'
    399/home/russ/src/bitcoin/src/rpc/net.cpp:369: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    400/home/russ/src/bitcoin/src/rpc/net.cpp:370: undefined reference to `UniValue::push_back(UniValue const&)'
    401libbitcoin_server.a(libbitcoin_server_a-net.o): In function `getnettotals(JSONRPCRequest const&)':
    402/home/russ/src/bitcoin/src/rpc/net.cpp:420: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    403libbitcoin_server.a(libbitcoin_server_a-net.o): In function `getnetworkinfo(JSONRPCRequest const&)':
    404/home/russ/src/bitcoin/src/rpc/net.cpp:504: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    405/home/russ/src/bitcoin/src/rpc/net.cpp:505: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    406/home/russ/src/bitcoin/src/rpc/net.cpp:506: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    407/home/russ/src/bitcoin/src/rpc/net.cpp:516: undefined reference to `UniValue::push_back(UniValue const&)'
    408/home/russ/src/bitcoin/src/rpc/net.cpp:519: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    409libbitcoin_server.a(libbitcoin_server_a-net.o): In function `setban(JSONRPCRequest const&)':
    410/home/russ/src/bitcoin/src/rpc/net.cpp:527: undefined reference to `UniValue::operator[](unsigned long) const'
    411/home/russ/src/bitcoin/src/rpc/net.cpp:528: undefined reference to `UniValue::operator[](unsigned long) const'
    412/home/russ/src/bitcoin/src/rpc/net.cpp:528: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    413/home/russ/src/bitcoin/src/rpc/net.cpp:555: undefined reference to `UniValue::operator[](unsigned long) const'
    414/home/russ/src/bitcoin/src/rpc/net.cpp:555: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    415/home/russ/src/bitcoin/src/rpc/net.cpp:560: undefined reference to `UniValue::operator[](unsigned long) const'
    416/home/russ/src/bitcoin/src/rpc/net.cpp:560: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    417/home/russ/src/bitcoin/src/rpc/net.cpp:564: undefined reference to `UniValue::operator[](unsigned long) const'
    418/home/russ/src/bitcoin/src/rpc/net.cpp:564: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    419/home/russ/src/bitcoin/src/rpc/net.cpp:576: undefined reference to `UniValue::operator[](unsigned long) const'
    420/home/russ/src/bitcoin/src/rpc/net.cpp:577: undefined reference to `UniValue::operator[](unsigned long) const'
    421/home/russ/src/bitcoin/src/rpc/net.cpp:577: undefined reference to `UniValue::get_int64() const'
    422/home/russ/src/bitcoin/src/rpc/net.cpp:580: undefined reference to `UniValue::operator[](unsigned long) const'
    423/home/russ/src/bitcoin/src/rpc/net.cpp:601: undefined reference to `NullUniValue'
    424libbitcoin_server.a(libbitcoin_server_a-net.o): In function `listbanned(JSONRPCRequest const&)':
    425/home/russ/src/bitcoin/src/rpc/net.cpp:635: undefined reference to `UniValue::push_back(UniValue const&)'
    426libbitcoin_server.a(libbitcoin_server_a-net.o): In function `clearbanned(JSONRPCRequest const&)':
    427/home/russ/src/bitcoin/src/rpc/net.cpp:660: undefined reference to `NullUniValue'
    428libbitcoin_server.a(libbitcoin_server_a-net.o): In function `setnetworkactive(JSONRPCRequest const&)':
    429/home/russ/src/bitcoin/src/rpc/net.cpp:682: undefined reference to `UniValue::operator[](unsigned long) const'
    430/home/russ/src/bitcoin/src/rpc/net.cpp:682: undefined reference to `UniValue::get_bool() const'
    431libbitcoin_server.a(libbitcoin_server_a-net.o): In function `getnodeaddresses(JSONRPCRequest const&)':
    432/home/russ/src/bitcoin/src/rpc/net.cpp:718: undefined reference to `UniValue::operator[](unsigned long) const'
    433/home/russ/src/bitcoin/src/rpc/net.cpp:719: undefined reference to `UniValue::operator[](unsigned long) const'
    434/home/russ/src/bitcoin/src/rpc/net.cpp:719: undefined reference to `UniValue::get_int() const'
    435/home/russ/src/bitcoin/src/rpc/net.cpp:736: undefined reference to `UniValue::push_back(UniValue const&)'
    436libbitcoin_server.a(libbitcoin_server_a-net.o): In function `GetNetworksInfo()':
    437/home/russ/src/bitcoin/src/rpc/net.cpp:440: undefined reference to `UniValue::push_back(UniValue const&)'
    438libbitcoin_server.a(libbitcoin_server_a-net.o): In function `UniValue::push_back(int)':
    439/home/russ/src/bitcoin/src/./univalue/include/univalue.h:106: undefined reference to `UniValue::push_back(UniValue const&)'
    440libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `ConstructTransaction(UniValue const&, UniValue const&, UniValue const&, UniValue const&)':
    441/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:359: undefined reference to `UniValue::get_array() const'
    442/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:361: undefined reference to `UniValue::get_obj() const'
    443/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:361: undefined reference to `UniValue::get_array() const'
    444/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:366: undefined reference to `UniValue::get_int64() const'
    445/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:375: undefined reference to `UniValue::operator[](unsigned long) const'
    446/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:376: undefined reference to `UniValue::get_obj() const'
    447/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:380: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    448/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:383: undefined reference to `UniValue::get_int() const'
    449/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:397: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    450/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:399: undefined reference to `UniValue::get_int64() const'
    451/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:416: undefined reference to `UniValue::operator[](unsigned long) const'
    452/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:423: undefined reference to `UniValue::pushKVs(UniValue const&)'
    453/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:432: undefined reference to `UniValue::getKeys[abi:cxx11]() const'
    454/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:438: undefined reference to `UniValue::operator[](std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
    455/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:453: undefined reference to `UniValue::operator[](std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
    456libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `SignTransaction(interfaces::Chain&, CMutableTransaction&, UniValue const&, CBasicKeyStore*, bool, UniValue const&)':
    457/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:812: undefined reference to `UniValue::get_array() const'
    458/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:814: undefined reference to `UniValue::operator[](unsigned long) const'
    459/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:819: undefined reference to `UniValue::get_obj() const'
    460/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:830: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    461/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:830: undefined reference to `UniValue::get_int() const'
    462/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:851: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    463/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:864: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    464/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:873: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    465/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:935: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    466libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `TxInErrorToJSON(CTxIn const&, UniValue&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    467/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:701: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    468/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:705: undefined reference to `UniValue::push_back(UniValue const&)'
    469libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `decodepsbt(JSONRPCRequest const&)':
    470/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1289: undefined reference to `UniValue::operator[](unsigned long) const'
    471/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1289: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    472/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1298: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    473/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1305: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    474/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1320: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    475/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1325: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    476/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1326: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    477libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o):/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1330: more undefined references to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)' follow
    478libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `decodepsbt(JSONRPCRequest const&)':
    479/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1371: undefined reference to `UniValue::push_back(UniValue const&)'
    480/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1373: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    481/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1381: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    482/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1388: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    483/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1397: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    484/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1400: undefined reference to `UniValue::push_back(UniValue const&)'
    485/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1402: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    486/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1414: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    487/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1419: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    488/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1430: undefined reference to `UniValue::push_back(UniValue const&)'
    489/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1432: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    490/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1441: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    491/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1444: undefined reference to `UniValue::push_back(UniValue const&)'
    492/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1449: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    493/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1451: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    494libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `combinepsbt(JSONRPCRequest const&)':
    495/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1483: undefined reference to `UniValue::operator[](unsigned long) const'
    496/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1483: undefined reference to `UniValue::get_array() const'
    497/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1490: undefined reference to `UniValue::operator[](unsigned long) const'
    498/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1490: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    499libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `finalizepsbt(JSONRPCRequest const&)':
    500/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1540: undefined reference to `UniValue::operator[](unsigned long) const'
    501/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1540: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    502/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1544: undefined reference to `UniValue::operator[](unsigned long) const'
    503/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1544: undefined reference to `UniValue::operator[](unsigned long) const'
    504/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1544: undefined reference to `UniValue::operator[](unsigned long) const'
    505/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1544: undefined reference to `UniValue::get_bool() const'
    506libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `createpsbt(JSONRPCRequest const&)':
    507/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1624: undefined reference to `UniValue::operator[](unsigned long) const'
    508/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1624: undefined reference to `UniValue::operator[](unsigned long) const'
    509/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1624: undefined reference to `UniValue::operator[](unsigned long) const'
    510/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1624: undefined reference to `UniValue::operator[](unsigned long) const'
    511libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `converttopsbt(JSONRPCRequest const&)':
    512/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1675: undefined reference to `UniValue::operator[](unsigned long) const'
    513libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o):/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1675: more undefined references to `UniValue::operator[](unsigned long) const' follow
    514libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `converttopsbt(JSONRPCRequest const&)':
    515/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1675: undefined reference to `UniValue::get_bool() const'
    516/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1676: undefined reference to `UniValue::operator[](unsigned long) const'
    517/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1677: undefined reference to `UniValue::operator[](unsigned long) const'
    518/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1677: undefined reference to `UniValue::get_bool() const'
    519/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1680: undefined reference to `UniValue::operator[](unsigned long) const'
    520/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1680: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    521libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `utxoupdatepsbt(JSONRPCRequest const&)':
    522/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1732: undefined reference to `UniValue::operator[](unsigned long) const'
    523/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1732: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    524libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `joinpsbts(JSONRPCRequest const&)':
    525/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1799: undefined reference to `UniValue::operator[](unsigned long) const'
    526/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1799: undefined reference to `UniValue::get_array() const'
    527/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1810: undefined reference to `UniValue::operator[](unsigned long) const'
    528/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1810: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    529libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `analyzepsbt(JSONRPCRequest const&)':
    530/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1893: undefined reference to `UniValue::operator[](unsigned long) const'
    531/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1893: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    532/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1939: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    533/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1955: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    534/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1957: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    535/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1973: undefined reference to `UniValue::push_back(UniValue const&)'
    536/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1975: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    537/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:2025: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    538libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `getrawtransaction(JSONRPCRequest const&)':
    539/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:154: undefined reference to `UniValue::operator[](unsigned long) const'
    540/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:164: undefined reference to `UniValue::operator[](unsigned long) const'
    541/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:165: undefined reference to `UniValue::operator[](unsigned long) const'
    542/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:165: undefined reference to `UniValue::operator[](unsigned long) const'
    543/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:165: undefined reference to `UniValue::get_int() const'
    544/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:165: undefined reference to `UniValue::operator[](unsigned long) const'
    545/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:165: undefined reference to `UniValue::get_bool() const'
    546/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:168: undefined reference to `UniValue::operator[](unsigned long) const'
    547/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:171: undefined reference to `UniValue::operator[](unsigned long) const'
    548libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `createrawtransaction(JSONRPCRequest const&)':
    549/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:530: undefined reference to `UniValue::operator[](unsigned long) const'
    550/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:530: undefined reference to `UniValue::operator[](unsigned long) const'
    551/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:530: undefined reference to `UniValue::operator[](unsigned long) const'
    552libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o):/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:530: more undefined references to `UniValue::operator[](unsigned long) const' follow
    553libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `decoderawtransaction(JSONRPCRequest const&)':
    554/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:597: undefined reference to `UniValue::get_bool() const'
    555/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:598: undefined reference to `UniValue::operator[](unsigned long) const'
    556/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:598: undefined reference to `UniValue::operator[](unsigned long) const'
    557/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:598: undefined reference to `UniValue::get_bool() const'
    558/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:600: undefined reference to `UniValue::operator[](unsigned long) const'
    559/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:600: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    560libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `decodescript(JSONRPCRequest const&)':
    561/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:642: undefined reference to `UniValue::operator[](unsigned long) const'
    562/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:642: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    563/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:643: undefined reference to `UniValue::operator[](unsigned long) const'
    564/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:651: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    565/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:653: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    566/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:659: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    567/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:659: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    568/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:659: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    569/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:659: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    570/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:684: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    571libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `sendrawtransaction(JSONRPCRequest const&)':
    572/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1062: undefined reference to `UniValue::operator[](unsigned long) const'
    573/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1062: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    574/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1067: undefined reference to `UniValue::operator[](unsigned long) const'
    575/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1067: undefined reference to `UniValue::operator[](unsigned long) const'
    576/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1067: undefined reference to `UniValue::get_bool() const'
    577libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `combinerawtransaction(JSONRPCRequest const&)':
    578/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:732: undefined reference to `UniValue::operator[](unsigned long) const'
    579/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:732: undefined reference to `UniValue::get_array() const'
    580/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:736: undefined reference to `UniValue::operator[](unsigned long) const'
    581/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:736: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    582libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `signrawtransactionwithkey(JSONRPCRequest const&)':
    583/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1006: undefined reference to `UniValue::operator[](unsigned long) const'
    584/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1006: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    585/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1011: undefined reference to `UniValue::operator[](unsigned long) const'
    586/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1011: undefined reference to `UniValue::get_array() const'
    587/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1013: undefined reference to `UniValue::operator[](unsigned long) const'
    588/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1014: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    589/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1021: undefined reference to `UniValue::operator[](unsigned long) const'
    590/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1021: undefined reference to `UniValue::operator[](unsigned long) const'
    591libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `testmempoolaccept(JSONRPCRequest const&)':
    592/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1120: undefined reference to `UniValue::operator[](unsigned long) const'
    593/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1120: undefined reference to `UniValue::get_array() const'
    594/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1125: undefined reference to `UniValue::operator[](unsigned long) const'
    595/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1125: undefined reference to `UniValue::get_array() const'
    596/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1125: undefined reference to `UniValue::operator[](unsigned long) const'
    597/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1125: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    598/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1132: undefined reference to `UniValue::operator[](unsigned long) const'
    599/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1132: undefined reference to `UniValue::operator[](unsigned long) const'
    600/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1132: undefined reference to `UniValue::get_bool() const'
    601/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:1159: undefined reference to `UniValue::push_back(UniValue const&)'
    602libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `gettxoutproof(JSONRPCRequest const&)':
    603/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:240: undefined reference to `UniValue::operator[](unsigned long) const'
    604/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:240: undefined reference to `UniValue::get_array() const'
    605/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:242: undefined reference to `UniValue::operator[](unsigned long) const'
    606/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:245: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    607/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:252: undefined reference to `UniValue::operator[](unsigned long) const'
    608/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:254: undefined reference to `UniValue::operator[](unsigned long) const'
    609libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `verifytxoutproof(JSONRPCRequest const&)':
    610/home/russ/src/bitcoin/src/rpc/rawtransaction.cpp:326: undefined reference to `UniValue::operator[](unsigned long) const'
    611libbitcoin_server.a(libbitcoin_server_a-rawtransaction.o): In function `UniValue::exists(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const':
    612/home/russ/src/bitcoin/src/./univalue/include/univalue.h:76: undefined reference to `UniValue::findKey(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) const'
    613libbitcoin_server.a(libbitcoin_server_a-server.o): In function `RPCTypeCheck(UniValue const&, std::__cxx11::list<UniValueType, std::allocator<UniValueType> > const&, bool)':
    614/home/russ/src/bitcoin/src/rpc/server.cpp:88: undefined reference to `UniValue::operator[](unsigned long) const'
    615libbitcoin_server.a(libbitcoin_server_a-server.o): In function `RPCTypeCheckArgument(UniValue const&, UniValueType const&)':
    616/home/russ/src/bitcoin/src/rpc/server.cpp:99: undefined reference to `uvTypeName(UniValue::VType)'
    617/home/russ/src/bitcoin/src/rpc/server.cpp:99: undefined reference to `uvTypeName(UniValue::VType)'
    618libbitcoin_server.a(libbitcoin_server_a-server.o): In function `RPCTypeCheckObj(UniValue const&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, UniValueType, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, UniValueType> > > const&, bool, bool)':
    619/home/russ/src/bitcoin/src/rpc/server.cpp:109: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    620/home/russ/src/bitcoin/src/rpc/server.cpp:115: undefined reference to `uvTypeName(UniValue::VType)'
    621/home/russ/src/bitcoin/src/rpc/server.cpp:115: undefined reference to `uvTypeName(UniValue::VType)'
    622/home/russ/src/bitcoin/src/rpc/server.cpp:122: undefined reference to `UniValue::getKeys[abi:cxx11]() const'
    623libbitcoin_server.a(libbitcoin_server_a-server.o): In function `ParseHashV(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
    624/home/russ/src/bitcoin/src/rpc/server.cpp:147: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    625libbitcoin_server.a(libbitcoin_server_a-server.o): In function `ParseHashO(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
    626/home/russ/src/bitcoin/src/rpc/server.cpp:156: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    627libbitcoin_server.a(libbitcoin_server_a-server.o): In function `ParseHexV(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
    628/home/russ/src/bitcoin/src/rpc/server.cpp:162: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    629libbitcoin_server.a(libbitcoin_server_a-server.o): In function `ParseHexO(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
    630/home/russ/src/bitcoin/src/rpc/server.cpp:169: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    631libbitcoin_server.a(libbitcoin_server_a-server.o): In function `help(JSONRPCRequest const&)':
    632/home/russ/src/bitcoin/src/rpc/server.cpp:244: undefined reference to `UniValue::operator[](unsigned long) const'
    633/home/russ/src/bitcoin/src/rpc/server.cpp:244: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    634libbitcoin_server.a(libbitcoin_server_a-server.o): In function `stop(JSONRPCRequest const&)':
    635/home/russ/src/bitcoin/src/rpc/server.cpp:267: undefined reference to `UniValue::operator[](unsigned long) const'
    636/home/russ/src/bitcoin/src/rpc/server.cpp:268: undefined reference to `UniValue::operator[](unsigned long) const'
    637/home/russ/src/bitcoin/src/rpc/server.cpp:268: undefined reference to `UniValue::get_int() const'
    638libbitcoin_server.a(libbitcoin_server_a-server.o): In function `getrpcinfo(JSONRPCRequest const&)':
    639/home/russ/src/bitcoin/src/rpc/server.cpp:311: undefined reference to `UniValue::push_back(UniValue const&)'
    640/home/russ/src/bitcoin/src/rpc/server.cpp:315: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    641libbitcoin_server.a(libbitcoin_server_a-server.o): In function `JSONRPCRequest::parse(UniValue const&)':
    642/home/russ/src/bitcoin/src/rpc/server.cpp:419: undefined reference to `UniValue::get_obj() const'
    643/home/russ/src/bitcoin/src/rpc/server.cpp:422: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    644/home/russ/src/bitcoin/src/rpc/server.cpp:425: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    645/home/russ/src/bitcoin/src/rpc/server.cpp:430: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    646/home/russ/src/bitcoin/src/rpc/server.cpp:438: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    647libbitcoin_server.a(libbitcoin_server_a-server.o): In function `JSONRPCExecBatch[abi:cxx11](JSONRPCRequest const&, UniValue const&)':
    648/home/russ/src/bitcoin/src/rpc/server.cpp:481: undefined reference to `UniValue::operator[](unsigned long) const'
    649/home/russ/src/bitcoin/src/rpc/server.cpp:481: undefined reference to `UniValue::push_back(UniValue const&)'
    650/home/russ/src/bitcoin/src/rpc/server.cpp:483: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
    651libbitcoin_server.a(libbitcoin_server_a-server.o): In function `JSONRPCExecOne(JSONRPCRequest, UniValue const&)':
    652/home/russ/src/bitcoin/src/rpc/server.cpp:462: undefined reference to `NullUniValue'
    653/home/russ/src/bitcoin/src/rpc/server.cpp:466: undefined reference to `NullUniValue'
    654/home/russ/src/bitcoin/src/rpc/server.cpp:470: undefined reference to `NullUniValue'
    655libbitcoin_server.a(libbitcoin_server_a-server.o): In function `transformNamedArguments(JSONRPCRequest const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)':
    656/home/russ/src/bitcoin/src/rpc/server.cpp:496: undefined reference to `UniValue::getKeys[abi:cxx11]() const'
    657/home/russ/src/bitcoin/src/rpc/server.cpp:497: undefined reference to `UniValue::getValues() const'
    658/home/russ/src/bitcoin/src/rpc/server.cpp:519: undefined reference to `UniValue::push_back(UniValue const&)'
    659/home/russ/src/bitcoin/src/rpc/server.cpp:522: undefined reference to `UniValue::push_back(UniValue const&)'
    660libbitcoin_server.a(libbitcoin_server_a-util.o): In function `ParseConfirmTarget(UniValue const&, unsigned int)':
    661/home/russ/src/bitcoin/src/rpc/util.cpp:133: undefined reference to `UniValue::get_int() const'
    662libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `~TorControlConnection':
    663/home/russ/src/bitcoin/src/torcontrol.cpp:130: undefined reference to `bufferevent_free'
    664libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorControlConnection::readcb(bufferevent*, void*)':
    665/home/russ/src/bitcoin/src/torcontrol.cpp:136: undefined reference to `bufferevent_get_input'
    666/home/russ/src/bitcoin/src/torcontrol.cpp:141: undefined reference to `evbuffer_readln'
    667/home/russ/src/bitcoin/src/torcontrol.cpp:172: undefined reference to `evbuffer_get_length'
    668libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorControlConnection::Disconnect()':
    669/home/russ/src/bitcoin/src/torcontrol.cpp:228: undefined reference to `bufferevent_free'
    670libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorControlConnection::Connect(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (TorControlConnection&)> const&, std::function<void (TorControlConnection&)> const&)':
    671/home/russ/src/bitcoin/src/torcontrol.cpp:202: undefined reference to `evutil_parse_sockaddr_port'
    672/home/russ/src/bitcoin/src/torcontrol.cpp:209: undefined reference to `bufferevent_socket_new'
    673/home/russ/src/bitcoin/src/torcontrol.cpp:212: undefined reference to `bufferevent_setcb'
    674/home/russ/src/bitcoin/src/torcontrol.cpp:213: undefined reference to `bufferevent_enable'
    675/home/russ/src/bitcoin/src/torcontrol.cpp:218: undefined reference to `bufferevent_socket_connect'
    676libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorControlConnection::Command(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (TorControlConnection&, TorControlReply const&)> const&)':
    677/home/russ/src/bitcoin/src/torcontrol.cpp:236: undefined reference to `bufferevent_get_output'
    678/home/russ/src/bitcoin/src/torcontrol.cpp:239: undefined reference to `evbuffer_add'
    679/home/russ/src/bitcoin/src/torcontrol.cpp:240: undefined reference to `evbuffer_add'
    680libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorController':
    681/home/russ/src/bitcoin/src/torcontrol.cpp:457: undefined reference to `event_new'
    682libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorController::disconnected_cb(TorControlConnection&)':
    683/home/russ/src/bitcoin/src/torcontrol.cpp:704: undefined reference to `event_add'
    684libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `~TorController':
    685/home/russ/src/bitcoin/src/torcontrol.cpp:476: undefined reference to `event_free'
    686libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `StartTorControl()':
    687/home/russ/src/bitcoin/src/torcontrol.cpp:747: undefined reference to `evthread_use_pthreads'
    688/home/russ/src/bitcoin/src/torcontrol.cpp:749: undefined reference to `event_base_new'
    689libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `TorControlThread()':
    690/home/russ/src/bitcoin/src/torcontrol.cpp:738: undefined reference to `event_base_dispatch'
    691libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `InterruptTorControl()':
    692/home/russ/src/bitcoin/src/torcontrol.cpp:762: undefined reference to `event_base_loopbreak'
    693libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): In function `StopTorControl()':
    694/home/russ/src/bitcoin/src/torcontrol.cpp:770: undefined reference to `event_base_free'
    695libbitcoin_server.a(libbitcoin_server_a-httprpc.o): In function `StartHTTPRPC()':
    696/home/russ/src/bitcoin/src/httprpc.cpp:243: undefined reference to `g_wallet_init_interface'
    697libbitcoin_server.a(libbitcoin_server_a-httprpc.o): In function `HTTPReq_JSONRPC(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    698/home/russ/src/bitcoin/src/httprpc.cpp:195: undefined reference to `NullUniValue'
    699/home/russ/src/bitcoin/src/httprpc.cpp:199: undefined reference to `UniValue::get_array() const'
    700libbitcoin_server.a(libbitcoin_server_a-httprpc.o): In function `StopHTTPRPC()':
    701/home/russ/src/bitcoin/src/httprpc.cpp:262: undefined reference to `g_wallet_init_interface'
    702libbitcoin_server.a(libbitcoin_server_a-httprpc.o): In function `JSONErrorReply(HTTPRequest*, UniValue const&, UniValue const&)':
    703/home/russ/src/bitcoin/src/httprpc.cpp:74: undefined reference to `find_value(UniValue const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    704/home/russ/src/bitcoin/src/httprpc.cpp:74: undefined reference to `UniValue::get_int() const'
    705/home/russ/src/bitcoin/src/httprpc.cpp:81: undefined reference to `NullUniValue'
    706libbitcoin_server.a(libbitcoin_server_a-httprpc.o): In function `UniValue::read(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    707/home/russ/src/bitcoin/src/./univalue/include/univalue.h:152: undefined reference to `UniValue::read(char const*, unsigned long)'
    708libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `InitHTTPServer()':
    709/home/russ/src/bitcoin/src/httpserver.cpp:363: undefined reference to `event_set_log_callback'
    710/home/russ/src/bitcoin/src/httpserver.cpp:374: undefined reference to `evthread_use_pthreads'
    711/home/russ/src/bitcoin/src/httpserver.cpp:387: undefined reference to `evhttp_set_timeout'
    712/home/russ/src/bitcoin/src/httpserver.cpp:388: undefined reference to `evhttp_set_max_headers_size'
    713/home/russ/src/bitcoin/src/httpserver.cpp:389: undefined reference to `evhttp_set_max_body_size'
    714/home/russ/src/bitcoin/src/httpserver.cpp:390: undefined reference to `evhttp_set_gencb'
    715libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `UpdateHTTPServerLogging(bool)':
    716/home/russ/src/bitcoin/src/httpserver.cpp:411: undefined reference to `event_enable_debug_logging'
    717/home/russ/src/bitcoin/src/httpserver.cpp:413: undefined reference to `event_enable_debug_logging'
    718libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `http_request_cb(evhttp_request*, void*)':
    719/home/russ/src/bitcoin/src/httpserver.cpp:215: undefined reference to `event_get_version_number'
    720/home/russ/src/bitcoin/src/httpserver.cpp:215: undefined reference to `event_get_version_number'
    721/home/russ/src/bitcoin/src/httpserver.cpp:216: undefined reference to `evhttp_request_get_connection'
    722/home/russ/src/bitcoin/src/httpserver.cpp:218: undefined reference to `evhttp_connection_get_bufferevent'
    723/home/russ/src/bitcoin/src/httpserver.cpp:220: undefined reference to `bufferevent_disable'
    724libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPBindAddresses(evhttp*)':
    725/home/russ/src/bitcoin/src/httpserver.cpp:323: undefined reference to `evhttp_bind_socket_with_handle'
    726libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `ThreadHTTP(event_base*)':
    727/home/russ/src/bitcoin/src/httpserver.cpp:289: undefined reference to `event_base_dispatch'
    728/home/russ/src/bitcoin/src/httpserver.cpp:292: undefined reference to `event_base_got_break'
    729libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `InterruptHTTPServer()':
    730/home/russ/src/bitcoin/src/httpserver.cpp:442: undefined reference to `evhttp_set_gencb'
    731libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `http_reject_request_cb(evhttp_request*, void*)':
    732/home/russ/src/bitcoin/src/httpserver.cpp:281: undefined reference to `evhttp_send_error'
    733libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `StopHTTPServer()':
    734/home/russ/src/bitcoin/src/httpserver.cpp:463: undefined reference to `evhttp_del_accept_socket'
    735/home/russ/src/bitcoin/src/httpserver.cpp:471: undefined reference to `evhttp_free'
    736/home/russ/src/bitcoin/src/httpserver.cpp:475: undefined reference to `event_base_free'
    737libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPEvent':
    738/home/russ/src/bitcoin/src/httpserver.cpp:498: undefined reference to `event_new'
    739libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `~HTTPEvent':
    740/home/russ/src/bitcoin/src/httpserver.cpp:503: undefined reference to `event_free'
    741libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPEvent::trigger(timeval*)':
    742/home/russ/src/bitcoin/src/httpserver.cpp:508: undefined reference to `event_active'
    743/home/russ/src/bitcoin/src/httpserver.cpp:510: undefined reference to `event_add'
    744libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::WriteReply(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    745/home/russ/src/bitcoin/src/httpserver.cpp:576: undefined reference to `evhttp_request_get_output_buffer'
    746/home/russ/src/bitcoin/src/httpserver.cpp:578: undefined reference to `evbuffer_add'
    747libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::GetHeader(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const':
    748/home/russ/src/bitcoin/src/httpserver.cpp:528: undefined reference to `evhttp_request_get_input_headers'
    749/home/russ/src/bitcoin/src/httpserver.cpp:530: undefined reference to `evhttp_find_header'
    750libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::ReadBody[abi:cxx11]()':
    751/home/russ/src/bitcoin/src/httpserver.cpp:539: undefined reference to `evhttp_request_get_input_buffer'
    752/home/russ/src/bitcoin/src/httpserver.cpp:542: undefined reference to `evbuffer_get_length'
    753/home/russ/src/bitcoin/src/httpserver.cpp:549: undefined reference to `evbuffer_pullup'
    754/home/russ/src/bitcoin/src/httpserver.cpp:553: undefined reference to `evbuffer_drain'
    755libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::WriteHeader(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    756/home/russ/src/bitcoin/src/httpserver.cpp:559: undefined reference to `evhttp_request_get_output_headers'
    757/home/russ/src/bitcoin/src/httpserver.cpp:561: undefined reference to `evhttp_add_header'
    758libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::GetPeer() const':
    759/home/russ/src/bitcoin/src/httpserver.cpp:601: undefined reference to `evhttp_request_get_connection'
    760/home/russ/src/bitcoin/src/httpserver.cpp:607: undefined reference to `evhttp_connection_get_peer'
    761libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::GetURI[abi:cxx11]() const':
    762/home/russ/src/bitcoin/src/httpserver.cpp:615: undefined reference to `evhttp_request_get_uri'
    763libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `HTTPRequest::GetRequestMethod() const':
    764/home/russ/src/bitcoin/src/httpserver.cpp:620: undefined reference to `evhttp_request_get_command'
    765libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `urlDecode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    766/home/russ/src/bitcoin/src/httpserver.cpp:662: undefined reference to `evhttp_uridecode'
    767libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `operator()':
    768/home/russ/src/bitcoin/src/httpserver.cpp:581: undefined reference to `evhttp_send_reply'
    769/home/russ/src/bitcoin/src/httpserver.cpp:584: undefined reference to `event_get_version_number'
    770/home/russ/src/bitcoin/src/httpserver.cpp:584: undefined reference to `event_get_version_number'
    771/home/russ/src/bitcoin/src/httpserver.cpp:585: undefined reference to `evhttp_request_get_connection'
    772/home/russ/src/bitcoin/src/httpserver.cpp:587: undefined reference to `evhttp_connection_get_bufferevent'
    773/home/russ/src/bitcoin/src/httpserver.cpp:589: undefined reference to `bufferevent_enable'
    774libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `obtain_event_base()':
    775/home/russ/src/bitcoin/src/./support/events.h:31: undefined reference to `event_base_new'
    776libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `obtain_evhttp(event_base*)':
    777/home/russ/src/bitcoin/src/./support/events.h:42: undefined reference to `evhttp_new'
    778libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `event_base_deleter::operator()(event_base*)':
    779/home/russ/src/bitcoin/src/./support/events.h:24: undefined reference to `event_base_free'
    780libbitcoin_server.a(libbitcoin_server_a-httpserver.o): In function `evhttp_deleter::operator()(evhttp*)':
    781/home/russ/src/bitcoin/src/./support/events.h:26: undefined reference to `evhttp_free'
    782libbitcoin_common.a(libbitcoin_common_a-core_read.o): In function `ParseSighashString(UniValue const&)':
    783/home/russ/src/bitcoin/src/core_read.cpp:238: undefined reference to `UniValue::get_str[abi:cxx11]() const'
    784libbitcoin_common.a(libbitcoin_common_a-core_write.o): In function `ScriptPubKeyToUniv(CScript const&, UniValue&, bool)':
    785/home/russ/src/bitcoin/src/core_write.cpp:176: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    786libbitcoin_common.a(libbitcoin_common_a-core_write.o): In function `TxToUniv(CTransaction const&, uint256 const&, UniValue&, bool, int)':
    787/home/russ/src/bitcoin/src/core_write.cpp:201: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    788/home/russ/src/bitcoin/src/core_write.cpp:207: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    789/home/russ/src/bitcoin/src/core_write.cpp:211: undefined reference to `UniValue::push_back(UniValue const&)'
    790/home/russ/src/bitcoin/src/core_write.cpp:213: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    791/home/russ/src/bitcoin/src/core_write.cpp:221: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    792/home/russ/src/bitcoin/src/core_write.cpp:226: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    793/home/russ/src/bitcoin/src/core_write.cpp:227: undefined reference to `UniValue::push_back(UniValue const&)'
    794/home/russ/src/bitcoin/src/core_write.cpp:229: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    795libbitcoin_util.a(libbitcoin_util_a-protocol.o): In function `JSONRPCRequestObj(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&, UniValue const&)':
    796/home/russ/src/bitcoin/src/rpc/protocol.cpp:28: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    797/home/russ/src/bitcoin/src/rpc/protocol.cpp:29: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    798libbitcoin_util.a(libbitcoin_util_a-protocol.o): In function `JSONRPCReplyObj(UniValue const&, UniValue const&, UniValue const&)':
    799/home/russ/src/bitcoin/src/rpc/protocol.cpp:37: undefined reference to `NullUniValue'
    800/home/russ/src/bitcoin/src/rpc/protocol.cpp:37: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    801/home/russ/src/bitcoin/src/rpc/protocol.cpp:39: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    802/home/russ/src/bitcoin/src/rpc/protocol.cpp:40: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    803/home/russ/src/bitcoin/src/rpc/protocol.cpp:41: undefined reference to `UniValue::pushKV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, UniValue const&)'
    804libbitcoin_util.a(libbitcoin_util_a-protocol.o): In function `JSONRPCReply[abi:cxx11](UniValue const&, UniValue const&, UniValue const&)':
    805/home/russ/src/bitcoin/src/rpc/protocol.cpp:48: undefined reference to `UniValue::write[abi:cxx11](unsigned int, unsigned int) const'
    806libbitcoin_util.a(libbitcoin_util_a-protocol.o): In function `JSONRPCProcessBatchReply(UniValue const&, unsigned long)':
    807/home/russ/src/bitcoin/src/rpc/protocol.cpp:140: undefined reference to `UniValue::operator[](unsigned long) const'
    808/home/russ/src/bitcoin/src/rpc/protocol.cpp:144: undefined reference to `UniValue::operator[](std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
    809/home/russ/src/bitcoin/src/rpc/protocol.cpp:144: undefined reference to `UniValue::get_int() const'
    810clang: error: linker command failed with exit code 1 (use -v to see invocation)
    811Makefile:5037: recipe for target 'bitcoin-wallet' failed
    812make[2]: *** [bitcoin-wallet] Error 1
    813make[2]: Leaving directory '/home/russ/src/bitcoin/src'
    814Makefile:12466: recipe for target 'all-recursive' failed
    815make[1]: *** [all-recursive] Error 1
    816make[1]: Leaving directory '/home/russ/src/bitcoin/src'
    817Makefile:776: recipe for target 'all-recursive' failed
    818make: *** [all-recursive] Error 1
    

    I’m not sure how much you know already about static linking c++, but https://www.airs.com/blog/archives/48 is a nice concise description of the process the linker goes through to resolve symbols. In this case, 00dfb2a440b94a24b61cafb519fb122f6a0ae176 adds a reference to the g_connman symbol in src/interfaces/chain.cpp. That symbol is defined in init.cpp, when means all the other symbols init.cpp uses have to be pulled in as well. This pulls in many other object files and a few new libraries, which now have to be listed in the Makefile, so I am listing them in the Makefile.

    In bitcoin, historically people haven’t put much thought into where symbols are defined so sometimes they get defined in weird places. There could be some advantages in moving some symbol definitions and splitting up monolithic .cpp files: smaller binary sizes, faster link times, fewer dependencies that need to be listed in makefiles, and less makefile churn. One disadvantage might be fewer fascinating conversations about makefiles like this one.

  120. jnewbery commented at 6:02 pm on March 2, 2019: member

    utACK f7efd87c8fb49f82e268a95e989909d453500e2b (verified changes in the force push only). @ryanofsky - I edited your last comment by putting the build output in a collapsible <details> tag to make this issue easier to follow. I hope you don’t mind!

    I think this should be high priority for review/merge now that the v0.18 branch is split. Large PRs that touch a lot of files are best merged after a major release branch to minimize rebase pain.

  121. Sjors commented at 6:15 pm on March 2, 2019: member

    Ok, that’s a good explanation of why it’s in that particular g_connman commit. I’d love to see the include stuff get cleaned up one day, but that’s out of scope here. @jnewbery TIL you can collapse stuff Lorem ipsum

    utACK f7efd87

  122. jnewbery commented at 6:18 pm on March 2, 2019: member

    you can collapse stuff. How does that work?

    Put it in a <details></details> tag (with optional <summary>Click me!</summary>, like this:

    img

  123. jnewbery added this to the "Blockers" column in a project

  124. ryanofsky commented at 6:45 pm on March 2, 2019: member

    I’d love to see the include stuff get cleaned up one day, but that’s out of scope here.

    Just in case anybody is interested in following up on this, the main thing we need if we want predictable link dependencies is to remove circular dependencies:

    https://github.com/bitcoin/bitcoin/blob/46eb2755d456ca736c1cb7a0922bfece63c5151e/test/lint/lint-circular-dependencies.sh#L11-L42

    The circular dependencies lint check isn’t perfect for detecting link dependencies because it looks at preprecessor includes instead of linker symbols, but it’s a pretty good proxy.

  125. in src/interfaces/chain.h:9 in bdc6628683 outdated
     4@@ -5,7 +5,8 @@
     5 #ifndef BITCOIN_INTERFACES_CHAIN_H
     6 #define BITCOIN_INTERFACES_CHAIN_H
     7 
     8-#include <optional.h>
     9+#include <optional.h>               // For Optional and nullopt
    10+#include <policy/rbf.h>             // For RBFTransactionState
    


    MarcoFalke commented at 4:34 pm on March 4, 2019:

    in commit bdc6628683

    Can this be done as a forward decl?


    ryanofsky commented at 6:25 pm on March 4, 2019:

    re: #15288 (review)

    Can this be done as a forward decl?

    Done in #15531


    MarcoFalke commented at 6:44 pm on March 4, 2019:
     0diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h
     1index 60f8570e36..ef2b6607de 100644
     2--- a/src/interfaces/chain.h
     3+++ b/src/interfaces/chain.h
     4@@ -6,7 +6,7 @@
     5 #define BITCOIN_INTERFACES_CHAIN_H
     6 
     7 #include <optional.h>               // For Optional and nullopt
     8-#include <policy/rbf.h>             // For RBFTransactionState
     9+enum class RBFTransactionState;
    10 #include <primitives/transaction.h> // For CTransactionRef
    11 
    12 #include <memory>
    13@@ -16,6 +16,7 @@
    14 #include <vector>
    15 
    16 class CBlock;
    17+class CFeeRate;
    18 class CScheduler;
    19 class CValidationState;
    20 class uint256;
    
  126. in src/interfaces/chain.cpp:197 in 291276f7f4 outdated
    189@@ -190,6 +190,12 @@ class ChainImpl : public Chain
    190         LOCK(::mempool.cs);
    191         return IsRBFOptIn(tx, ::mempool);
    192     }
    193+    bool hasDescendantsInMempool(const uint256& txid) override
    194+    {
    195+        LOCK(::mempool.cs);
    196+        auto it_mp = ::mempool.mapTx.find(txid);
    197+        return it_mp != ::mempool.mapTx.end() && it_mp->GetCountWithDescendants() > 1;
    


    MarcoFalke commented at 4:37 pm on March 4, 2019:

    in commit 291276f7f4:

    Could use CTxMemPool::GetIter to avoid the direct access to mapTx (which should ideally be private to the mempool)


    ryanofsky commented at 6:25 pm on March 4, 2019:

    re: #15288 (review)

    Could use CTxMemPool::GetIter to avoid the direct access to mapTx (which should ideally be private to the mempool)

    Done in #15531

  127. in src/wallet/wallet.cpp:4531 in cd32160af0 outdated
    4527@@ -4528,7 +4528,7 @@ std::vector<OutputGroup> CWallet::GroupOutputs(const std::vector<COutput>& outpu
    4528             CInputCoin input_coin = output.GetInputCoin();
    4529 
    4530             size_t ancestors, descendants;
    4531-            mempool.GetTransactionAncestry(output.tx->GetHash(), ancestors, descendants);
    4532+            chain().getTransactionAncestry(output.tx->GetHash(), ancestors, descendants);
    


    MarcoFalke commented at 4:44 pm on March 4, 2019:

    in commit cd32160af0528cc746:

    I didn’t check if this needs a broader mempool (or main) lock (maybe for this whole function, since the mempool can remove/expire entries at will), but you are not changing this in your refactoring. So probably orthogonal to your changes. Still, I wanted to leave the comment.


    ryanofsky commented at 6:27 pm on March 4, 2019:

    re: #15288 (review)

    I didn’t check if this needs a broader mempool (or main) lock (maybe for this whole function, since the mempool can remove/expire entries at will), but you are not changing this in your refactoring. So probably orthogonal to your changes. Still, I wanted to leave the comment

    This is called from coin selection, so I’m guessing it’s just a tradeoff between having to keep the mempool locked continuously and selected outputs being possibly out of date.

    I think ideally the wallet wouldn’t have any ability to lock the mempool mutex for an extended period of time, so if there is a bug here, it would be better to resolve it by adding a batch TransactionAncestry lookup method, so the wallet could look up many transactions in a single call, but not be able to keep mempool.cs locked indefinitely over many calls.

  128. in src/interfaces/chain.cpp:208 in 1fb0a4a04e outdated
    199@@ -200,6 +200,20 @@ class ChainImpl : public Chain
    200     {
    201         ::mempool.GetTransactionAncestry(txid, ancestors, descendants);
    202     }
    203+    bool checkChainLimits(CTransactionRef tx) override
    204+    {
    205+        LockPoints lp;
    206+        CTxMemPoolEntry entry(tx, 0, 0, 0, false, 0, lp);
    207+        CTxMemPool::setEntries ancestors;
    208+        auto limit_ancestor_count = gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT);
    


    MarcoFalke commented at 4:49 pm on March 4, 2019:

    in commit cd32160af0528cc746:

    Any reason to rename the variables (set)ancestors and types (int)->(auto)? Breaks --color-moved=dimmed-zebra and makes review harder


    ryanofsky commented at 6:25 pm on March 4, 2019:

    re: #15288 (review)

    Any reason to rename the variables (set)ancestors and types (int)->(auto)? Breaks –color-moved=dimmed-zebra and makes review harder

    IIRC, John asked for variable renames, and I used auto to avoid signed/unsigned conversion errors reported by practicalswift.

  129. in src/interfaces/chain.h:116 in d02b34c8a8 outdated
    109@@ -109,6 +110,10 @@ class Chain
    110 
    111         //! Check if transaction will be final given chain height current time.
    112         virtual bool checkFinalTx(const CTransaction& tx) = 0;
    113+
    114+        //! Add transaction to memory pool if the transaction fee is below the
    115+        //! amount specified by absurd_fee (as a safeguard). */
    116+        virtual bool submitToMemoryPool(CTransactionRef tx, CAmount absurd_fee, CValidationState& state) = 0;
    


    MarcoFalke commented at 6:07 pm on March 4, 2019:

    in commit d02b34c8a8bd446c9620fe626b4379617f9a9639:

    Could take a const ref to CTransactionRef to avoid incrementing the shared ptr counter?


    ryanofsky commented at 6:25 pm on March 4, 2019:

    re: #15288 (review)

    Could take a const ref to CTransactionRef to avoid incrementing the shared ptr counter?

    Done in #15531

  130. in src/interfaces/chain.h:115 in d02b34c8a8 outdated
    109@@ -109,6 +110,10 @@ class Chain
    110 
    111         //! Check if transaction will be final given chain height current time.
    112         virtual bool checkFinalTx(const CTransaction& tx) = 0;
    113+
    114+        //! Add transaction to memory pool if the transaction fee is below the
    115+        //! amount specified by absurd_fee (as a safeguard). */
    


    MarcoFalke commented at 6:10 pm on March 4, 2019:

    in commit d02b34c8a8bd446c9620fe626b437:

    The absurd_fee is only one case this could return false, but should never happen. There might be other cases such as descendant limits?


    ryanofsky commented at 6:25 pm on March 4, 2019:

    re: #15288 (review)

    The absurd_fee is only one case this could return false, but should never happen. There might be other cases such as descendant limits?

    Updated comment in #15531

  131. MarcoFalke commented at 6:13 pm on March 4, 2019: member
    utACK f7efd87c8f
  132. MarcoFalke merged this on Mar 4, 2019
  133. MarcoFalke closed this on Mar 4, 2019

  134. MarcoFalke referenced this in commit 45f434f44d on Mar 4, 2019
  135. ryanofsky referenced this in commit de9f7f2d38 on Mar 4, 2019
  136. ryanofsky referenced this in commit 4d4e4c6448 on Mar 5, 2019
  137. ryanofsky commented at 1:29 pm on March 5, 2019: member
    Could remove this PR from the high priority list https://github.com/bitcoin/bitcoin/projects/8 (and maybe replace it with #10973)
  138. fanquake removed this from the "Blockers" column in a project

  139. MarcoFalke referenced this in commit d8a62db8bf on Mar 5, 2019
  140. meshcollider referenced this in commit 2607d960a0 on Mar 21, 2019
  141. HashUnlimited referenced this in commit 6339fe8653 on Aug 30, 2019
  142. HashUnlimited referenced this in commit ec60141ea8 on Aug 30, 2019
  143. barrystyle referenced this in commit 37c9a47b36 on Nov 11, 2019
  144. barrystyle referenced this in commit e3b4542070 on Nov 11, 2019
  145. ryanofsky added this to the "Done" column in a project

  146. deadalnix referenced this in commit 33dbf42235 on Apr 23, 2020
  147. deadalnix referenced this in commit 2bdc64fc41 on Apr 24, 2020
  148. deadalnix referenced this in commit a131d6f948 on Apr 24, 2020
  149. deadalnix referenced this in commit e925b2dd08 on Apr 24, 2020
  150. deadalnix referenced this in commit ff57e58d8a on Apr 25, 2020
  151. deadalnix referenced this in commit 154faf31ba on Apr 27, 2020
  152. deadalnix referenced this in commit ce4499d4eb on Apr 27, 2020
  153. deadalnix referenced this in commit 2e55f14c2d on Apr 27, 2020
  154. deadalnix referenced this in commit 8f63e71e0b on Apr 27, 2020
  155. deadalnix referenced this in commit 78e4b0b55c on Apr 28, 2020
  156. deadalnix referenced this in commit 72c645190b on Apr 28, 2020
  157. deadalnix referenced this in commit ceaafd20d7 on Apr 28, 2020
  158. deadalnix referenced this in commit c7342637bf on Apr 28, 2020
  159. deadalnix referenced this in commit 98cf108853 on Apr 28, 2020
  160. deadalnix referenced this in commit e6069992d7 on Apr 28, 2020
  161. deadalnix referenced this in commit f9a435c399 on May 4, 2020
  162. jonspock referenced this in commit d7ce72458b on Aug 14, 2020
  163. ftrader referenced this in commit 83f042c6bd on Aug 17, 2020
  164. jonspock referenced this in commit 6c266acc3f on Aug 27, 2020
  165. jonspock referenced this in commit dc44128a7a on Aug 28, 2020
  166. jonspock referenced this in commit cff9685e71 on Sep 4, 2020
  167. jonspock referenced this in commit 9056e4313d on Sep 5, 2020
  168. jonspock referenced this in commit 48955702f2 on Sep 6, 2020
  169. jonspock referenced this in commit cfe5305266 on Sep 13, 2020
  170. jonspock referenced this in commit c9cac17f03 on Sep 13, 2020
  171. jonspock referenced this in commit 0d50ca2cce on Sep 15, 2020
  172. jonspock referenced this in commit 3035de850a on Sep 16, 2020
  173. jonspock referenced this in commit 9791b5ff2f on Sep 16, 2020
  174. jonspock referenced this in commit 6660a23ebe on Sep 17, 2020
  175. jonspock referenced this in commit 833efc2218 on Sep 18, 2020
  176. jonspock referenced this in commit 1b533fb76f on Sep 21, 2020
  177. jonspock referenced this in commit 0a2b857270 on Sep 21, 2020
  178. jonspock referenced this in commit 46f03fc058 on Sep 23, 2020
  179. jonspock referenced this in commit b8bf03cc71 on Sep 24, 2020
  180. proteanx referenced this in commit 891bd1a716 on Sep 25, 2020
  181. Munkybooty referenced this in commit 7ca39f6330 on Aug 27, 2021
  182. Munkybooty referenced this in commit d474e479fa on Aug 28, 2021
  183. Munkybooty referenced this in commit 808ffe58b5 on Aug 29, 2021
  184. Munkybooty referenced this in commit 84262d02de on Sep 1, 2021
  185. Munkybooty referenced this in commit 69316c7f77 on Sep 5, 2021
  186. Munkybooty referenced this in commit 5cb84a2df1 on Sep 7, 2021
  187. Munkybooty referenced this in commit 9a5b485c52 on Sep 7, 2021
  188. Munkybooty referenced this in commit a0f7dade43 on Sep 9, 2021
  189. Munkybooty referenced this in commit fe26048800 on Sep 10, 2021
  190. Munkybooty referenced this in commit 7e05caae39 on Sep 13, 2021
  191. vijaydasmp referenced this in commit c9be29bcbb on Oct 16, 2021
  192. vijaydasmp referenced this in commit b2c2b9236e on Oct 16, 2021
  193. kittywhiskers referenced this in commit 98e1bd3da6 on Oct 16, 2021
  194. kittywhiskers referenced this in commit 81af14906c on Oct 16, 2021
  195. kittywhiskers referenced this in commit af2eb8c625 on Oct 31, 2021
  196. kittywhiskers referenced this in commit d9f19acead on Oct 31, 2021
  197. kittywhiskers referenced this in commit d4a513ba3c on Oct 31, 2021
  198. kittywhiskers referenced this in commit 94b013ca48 on Nov 1, 2021
  199. kittywhiskers referenced this in commit b0e70a9fba on Nov 4, 2021
  200. kittywhiskers referenced this in commit fbb268da5c on Nov 4, 2021
  201. kittywhiskers referenced this in commit 1f28839d70 on Nov 6, 2021
  202. kittywhiskers referenced this in commit cdc980caa7 on Nov 14, 2021
  203. kittywhiskers referenced this in commit f7a69edcd6 on Nov 14, 2021
  204. kittywhiskers referenced this in commit cdac124085 on Nov 14, 2021
  205. kittywhiskers referenced this in commit 2c98320c1a on Nov 14, 2021
  206. UdjinM6 referenced this in commit a3a8bfee08 on Nov 15, 2021
  207. pravblockc referenced this in commit d6f933913f on Nov 18, 2021
  208. Munkybooty referenced this in commit f8345672b6 on Nov 25, 2021
  209. Munkybooty referenced this in commit 48825dbfd3 on Nov 30, 2021
  210. vijaydasmp referenced this in commit 6b539f8198 on Dec 5, 2021
  211. vijaydasmp referenced this in commit a2b3ae0baf on Dec 6, 2021
  212. vijaydasmp referenced this in commit 309825f547 on Dec 6, 2021
  213. gades referenced this in commit c9c6a5c250 on May 30, 2022
  214. DrahtBot locked this on Nov 8, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-11-17 06:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me