Skip to content

Commit

Permalink
Remove coinselection.h -> wallet.h circular dependency
Browse files Browse the repository at this point in the history
Changes CInputCoin to coinselection and to use CTransactionRef in
order to avoid a circular dependency. Also moves other coin selection
specific variables out of wallet.h to coinselectoin.h
  • Loading branch information
achow101 committed Mar 13, 2018
1 parent 7d77eb1 commit 4b2716d
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 43 deletions.
39 changes: 38 additions & 1 deletion src/wallet/coinselection.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,44 @@
#include <amount.h>
#include <primitives/transaction.h>
#include <random.h>
#include <wallet/wallet.h>

//! target minimum change amount
static const CAmount MIN_CHANGE = CENT;
//! final minimum change amount after paying for fees
static const CAmount MIN_FINAL_CHANGE = MIN_CHANGE/2;

class CInputCoin {
public:
CInputCoin(const CTransactionRef& tx, unsigned int i)
{
if (!tx)
throw std::invalid_argument("tx should not be null");
if (i >= tx->vout.size())
throw std::out_of_range("The output index is out of range");

outpoint = COutPoint(tx->GetHash(), i);
txout = tx->vout[i];
effective_value = txout.nValue;
}

COutPoint outpoint;
CTxOut txout;
CAmount effective_value;
CAmount fee = 0;
CAmount long_term_fee = 0;

bool operator<(const CInputCoin& rhs) const {
return outpoint < rhs.outpoint;
}

bool operator!=(const CInputCoin& rhs) const {
return outpoint != rhs.outpoint;
}

bool operator==(const CInputCoin& rhs) const {
return outpoint == rhs.outpoint;
}
};

bool SelectCoinsBnB(std::vector<CInputCoin>& utxo_pool, const CAmount& target_value, const CAmount& cost_of_change, std::set<CInputCoin>& out_set, CAmount& value_ret, CAmount not_input_fees);

Expand Down
8 changes: 4 additions & 4 deletions src/wallet/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2516,7 +2516,7 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const CoinEligibil
if (!OutputEligibleForSpending(output, eligibilty_filter))
continue;

CInputCoin coin = CInputCoin(output.tx, output.i);
CInputCoin coin = CInputCoin(output.tx->tx, output.i);

if (coin.txout.nValue == nTargetValue)
{
Expand Down Expand Up @@ -2606,7 +2606,7 @@ bool CWallet::SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAm
if (!out.fSpendable)
continue;
nValueRet += out.tx->tx->vout[out.i].nValue;
setCoinsRet.insert(CInputCoin(out.tx, out.i));
setCoinsRet.insert(CInputCoin(out.tx->tx, out.i));
}
return (nValueRet >= nTargetValue);
}
Expand All @@ -2628,15 +2628,15 @@ bool CWallet::SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAm
if (pcoin->tx->vout.size() <= outpoint.n)
return false;
nValueFromPresetInputs += pcoin->tx->vout[outpoint.n].nValue;
setPresetCoins.insert(CInputCoin(pcoin, outpoint.n));
setPresetCoins.insert(CInputCoin(pcoin->tx, outpoint.n));
} else
return false; // TODO: Allow non-wallet inputs
}

// remove preset inputs from vCoins
for (std::vector<COutput>::iterator it = vCoins.begin(); it != vCoins.end() && coinControl && coinControl->HasSelected();)
{
if (setPresetCoins.count(CInputCoin(it->tx, it->i)))
if (setPresetCoins.count(CInputCoin(it->tx->tx, it->i)))
it = vCoins.erase(it);
else
++it;
Expand Down
39 changes: 1 addition & 38 deletions src/wallet/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <script/sign.h>
#include <util.h>
#include <wallet/crypter.h>
#include <wallet/coinselection.h>
#include <wallet/walletdb.h>
#include <wallet/rpcwallet.h>

Expand Down Expand Up @@ -53,10 +54,6 @@ static const CAmount DEFAULT_DISCARD_FEE = 10000;
static const CAmount DEFAULT_TRANSACTION_MINFEE = 1000;
//! minimum recommended increment for BIP 125 replacement txs
static const CAmount WALLET_INCREMENTAL_RELAY_FEE = 5000;
//! target minimum change amount
static const CAmount MIN_CHANGE = CENT;
//! final minimum change amount after paying for fees
static const CAmount MIN_FINAL_CHANGE = MIN_CHANGE/2;
//! Default for -spendzeroconfchange
static const bool DEFAULT_SPEND_ZEROCONF_CHANGE = true;
//! Default for -walletrejectlongchains
Expand Down Expand Up @@ -497,40 +494,6 @@ class CWalletTx : public CMerkleTx
std::set<uint256> GetConflicts() const;
};


class CInputCoin {
public:
CInputCoin(const CWalletTx* walletTx, unsigned int i)
{
if (!walletTx)
throw std::invalid_argument("walletTx should not be null");
if (i >= walletTx->tx->vout.size())
throw std::out_of_range("The output index is out of range");

outpoint = COutPoint(walletTx->GetHash(), i);
txout = walletTx->tx->vout[i];
effective_value = txout.nValue;
}

COutPoint outpoint;
CTxOut txout;
CAmount effective_value;
CAmount fee = 0;
CAmount long_term_fee = 0;

bool operator<(const CInputCoin& rhs) const {
return outpoint < rhs.outpoint;
}

bool operator!=(const CInputCoin& rhs) const {
return outpoint != rhs.outpoint;
}

bool operator==(const CInputCoin& rhs) const {
return outpoint == rhs.outpoint;
}
};

class COutput
{
public:
Expand Down

0 comments on commit 4b2716d

Please sign in to comment.