@ -525,6 +525,18 @@ std::string FormatStateMessage(const CValidationState &state)
state . GetRejectCode ( ) ) ;
state . GetRejectCode ( ) ) ;
}
}
static bool IsCurrentForFeeEstimation ( )
{
AssertLockHeld ( cs_main ) ;
if ( IsInitialBlockDownload ( ) )
return false ;
if ( chainActive . Tip ( ) - > GetBlockTime ( ) < ( GetTime ( ) - MAX_FEE_ESTIMATION_TIP_AGE ) )
return false ;
if ( chainActive . Height ( ) < pindexBestHeader - > nHeight - 1 )
return false ;
return true ;
}
bool AcceptToMemoryPoolWorker ( CTxMemPool & pool , CValidationState & state , const CTransactionRef & ptx , bool fLimitFree ,
bool AcceptToMemoryPoolWorker ( CTxMemPool & pool , CValidationState & state , const CTransactionRef & ptx , bool fLimitFree ,
bool * pfMissingInputs , int64_t nAcceptTime , bool fOverrideMempoolLimit , const CAmount & nAbsurdFee ,
bool * pfMissingInputs , int64_t nAcceptTime , bool fOverrideMempoolLimit , const CAmount & nAbsurdFee ,
std : : vector < uint256 > & vHashTxnToUncache )
std : : vector < uint256 > & vHashTxnToUncache )
@ -941,8 +953,13 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
}
}
pool . RemoveStaged ( allConflicting , false ) ;
pool . RemoveStaged ( allConflicting , false ) ;
// This transaction should only count for fee estimation if
// the node is not behind and it is not dependent on any other
// transactions in the mempool
bool validForFeeEstimation = IsCurrentForFeeEstimation ( ) & & pool . HasNoInputsOf ( tx ) ;
// Store transaction in memory
// Store transaction in memory
pool . addUnchecked ( hash , entry , setAncestors , ! IsInitialBlockDownload ( ) & & pool . HasNoInputsOf ( tx ) ) ;
pool . addUnchecked ( hash , entry , setAncestors , validForFeeEstimation ) ;
// trim mempool and check if tx was trimmed
// trim mempool and check if tx was trimmed
if ( ! fOverrideMempoolLimit ) {
if ( ! fOverrideMempoolLimit ) {