Also, remove default values in CMerkleTx::AcceptToMemoryPool()tags/v0.15.1
@@ -813,7 +813,7 @@ std::string FormatStateMessage(const CValidationState &state) | |||
} | |||
bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, | |||
bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee, | |||
bool* pfMissingInputs, bool fOverrideMempoolLimit, CAmount nAbsurdFee, | |||
std::vector<uint256>& vHashTxnToUncache) | |||
{ | |||
const uint256 hash = tx.GetHash(); | |||
@@ -1002,10 +1002,10 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C | |||
dFreeCount += nSize; | |||
} | |||
if (fRejectAbsurdFee && nFees > maxTxFee) | |||
if (nAbsurdFee && nFees > nAbsurdFee) | |||
return state.Invalid(false, | |||
REJECT_HIGHFEE, "absurdly-high-fee", | |||
strprintf("%d > %d", nFees, maxTxFee)); | |||
strprintf("%d > %d", nFees, nAbsurdFee)); | |||
// Calculate in-mempool ancestors, up to a limit. | |||
CTxMemPool::setEntries setAncestors; | |||
@@ -1220,10 +1220,10 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C | |||
} | |||
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, | |||
bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee) | |||
bool* pfMissingInputs, bool fOverrideMempoolLimit, const CAmount nAbsurdFee) | |||
{ | |||
std::vector<uint256> vHashTxToUncache; | |||
bool res = AcceptToMemoryPoolWorker(pool, state, tx, fLimitFree, pfMissingInputs, fOverrideMempoolLimit, fRejectAbsurdFee, vHashTxToUncache); | |||
bool res = AcceptToMemoryPoolWorker(pool, state, tx, fLimitFree, pfMissingInputs, fOverrideMempoolLimit, nAbsurdFee, vHashTxToUncache); | |||
if (!res) { | |||
BOOST_FOREACH(const uint256& hashTx, vHashTxToUncache) | |||
pcoinsTip->Uncache(hashTx); |
@@ -281,7 +281,7 @@ void PruneAndFlush(); | |||
/** (try to) add transaction to memory pool **/ | |||
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, | |||
bool* pfMissingInputs, bool fOverrideMempoolLimit=false, bool fRejectAbsurdFee=false); | |||
bool* pfMissingInputs, bool fOverrideMempoolLimit=false, const CAmount nAbsurdFee=0); | |||
/** Convert CValidationState to a human-readable message for logging */ | |||
std::string FormatStateMessage(const CValidationState &state); |
@@ -810,9 +810,9 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp) | |||
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); | |||
uint256 hashTx = tx.GetHash(); | |||
bool fOverrideFees = false; | |||
if (params.size() > 1) | |||
fOverrideFees = params[1].get_bool(); | |||
CAmount nMaxRawTxFee = maxTxFee; | |||
if (params.size() > 1 && params[1].get_bool()) | |||
nMaxRawTxFee = 0; | |||
CCoinsViewCache &view = *pcoinsTip; | |||
const CCoins* existingCoins = view.AccessCoins(hashTx); | |||
@@ -822,7 +822,7 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp) | |||
// push to local node and sync with wallets | |||
CValidationState state; | |||
bool fMissingInputs; | |||
if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, false, !fOverrideFees)) { | |||
if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, false, nMaxRawTxFee)) { | |||
if (state.IsInvalid()) { | |||
throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason())); | |||
} else { |
@@ -23,7 +23,7 @@ ToMemPool(CMutableTransaction& tx) | |||
LOCK(cs_main); | |||
CValidationState state; | |||
return AcceptToMemoryPool(mempool, state, tx, false, NULL, true, false); | |||
return AcceptToMemoryPool(mempool, state, tx, false, NULL, true, 0); | |||
} | |||
BOOST_FIXTURE_TEST_CASE(tx_mempool_block_doublespend, TestChain100Setup) |
@@ -1251,7 +1251,7 @@ void CWallet::ReacceptWalletTransactions() | |||
CWalletTx& wtx = *(item.second); | |||
LOCK(mempool.cs); | |||
wtx.AcceptToMemoryPool(false); | |||
wtx.AcceptToMemoryPool(false, maxTxFee); | |||
} | |||
} | |||
@@ -2268,7 +2268,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey) | |||
if (fBroadcastTransactions) | |||
{ | |||
// Broadcast | |||
if (!wtxNew.AcceptToMemoryPool(false)) | |||
if (!wtxNew.AcceptToMemoryPool(false, maxTxFee)) | |||
{ | |||
// This must not fail. The transaction has already been signed and recorded. | |||
LogPrintf("CommitTransaction(): Error: Transaction not valid\n"); | |||
@@ -3025,8 +3025,8 @@ int CMerkleTx::GetBlocksToMaturity() const | |||
} | |||
bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, bool fRejectAbsurdFee) | |||
bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, CAmount nAbsurdFee) | |||
{ | |||
CValidationState state; | |||
return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, false, fRejectAbsurdFee); | |||
return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, false, nAbsurdFee); | |||
} |
@@ -7,6 +7,7 @@ | |||
#define BITCOIN_WALLET_WALLET_H | |||
#include "amount.h" | |||
#include "main.h" | |||
#include "streams.h" | |||
#include "tinyformat.h" | |||
#include "ui_interface.h" | |||
@@ -204,8 +205,8 @@ public: | |||
int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); } | |||
bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet) > 0; } | |||
int GetBlocksToMaturity() const; | |||
/** Pass this transaction to the mempool. Fails if absolute fee exceeds maxTxFee. */ | |||
bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true); | |||
/** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */ | |||
bool AcceptToMemoryPool(bool fLimitFree, CAmount nAbsurdFee); | |||
bool hashUnset() const { return (hashBlock.IsNull() || hashBlock == ABANDON_HASH); } | |||
bool isAbandoned() const { return (hashBlock == ABANDON_HASH); } | |||
void setAbandoned() { hashBlock = ABANDON_HASH; } |