13 #include <txmempool.h> 63 uint64_t nConflictingCount = 0;
64 for (
const auto& mi : iters_conflicting) {
65 nConflictingCount += mi->GetCountWithDescendants();
71 return strprintf(
"rejecting replacement %s; too many potential replacements (%d > %d)\n",
89 std::set<uint256> parents_of_conflicts;
90 for (
const auto& mi : iters_conflicting) {
91 for (
const CTxIn& txin : mi->GetTx().vin) {
92 parents_of_conflicts.insert(txin.prevout.hash);
96 for (
unsigned int j = 0; j < tx.
vin.size(); j++) {
104 if (!parents_of_conflicts.count(tx.
vin[j].prevout.hash)) {
108 return strprintf(
"replacement %s adds unconfirmed input, idx %d",
117 const std::set<uint256>& direct_conflicts,
121 const uint256& hashAncestor = ancestorIt->GetTx().GetHash();
122 if (direct_conflicts.count(hashAncestor)) {
123 return strprintf(
"%s spends conflicting transaction %s",
135 for (
const auto& mi : iters_conflicting) {
146 CFeeRate original_feerate(mi->GetModifiedFee(), mi->GetTxSize());
147 if (replacement_feerate <= original_feerate) {
148 return strprintf(
"rejecting replacement %s; new feerate %s <= old feerate %s",
151 original_feerate.ToString());
159 size_t replacement_vsize,
166 if (replacement_fees < original_fees) {
167 return strprintf(
"rejecting replacement %s, less fees than conflicting txs; %s < %s",
174 CAmount additional_fees = replacement_fees - original_fees;
175 if (additional_fees < relay_fee.
GetFee(replacement_vsize)) {
176 return strprintf(
"rejecting replacement %s, not enough additional fees to relay; %s < %s",
std::optional< std::string > PaysForRBF(CAmount original_fees, CAmount replacement_fees, size_t replacement_vsize, CFeeRate relay_fee, const uint256 &txid)
The replacement transaction must pay more fees than the original transactions.
std::optional< std::string > PaysMoreThanConflicts(const CTxMemPool::setEntries &iters_conflicting, CFeeRate replacement_feerate, const uint256 &txid)
Check that the feerate of the replacement transaction(s) is higher than the feerate of each of the tr...
indexed_transaction_set::nth_index< 0 >::type::const_iterator txiter
RBFTransactionState IsRBFOptIn(const CTransaction &tx, const CTxMemPool &pool)
Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This inv...
static constexpr uint32_t MAX_REPLACEMENT_CANDIDATES
Maximum number of transactions that can be replaced by RBF (Rule #5).
std::optional< std::string > HasNoNewUnconfirmed(const CTransaction &tx, const CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting)
The replacement transaction may only include an unconfirmed input if that input was included in one o...
Either this tx or a mempool ancestor signals rbf.
bool exists(const GenTxid >xid) const
Unconfirmed tx that does not signal rbf and is not in the mempool.
void CalculateDescendants(txiter it, setEntries &setDescendants) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Populate setDescendants with all in-mempool descendants of hash.
std::optional< std::string > EntriesAndTxidsDisjoint(const CTxMemPool::setEntries &ancestors, const std::set< uint256 > &direct_conflicts, const uint256 &txid)
Check the intersection between two sets of transactions (a set of mempool entries and a set of txids)...
std::set< txiter, CompareIteratorByHash > setEntries
bool SignalsOptInRBF(const CTransaction &tx)
Check whether the sequence numbers on this transaction are signaling opt-in to replace-by-fee, according to BIP 125.
setEntries AssumeCalculateMemPoolAncestors(std::string_view calling_fn_name, const CTxMemPoolEntry &entry, const Limits &limits, bool fSearchForParents=true) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Same as CalculateMemPoolAncestors, but always returns a (non-optional) setEntries.
const std::vector< CTxIn > vin
RBFTransactionState
The rbf state of unconfirmed transactions.
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
std::optional< std::string > GetEntriesForConflicts(const CTransaction &tx, CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting, CTxMemPool::setEntries &all_conflicts)
Get all descendants of iters_conflicting.
int64_t CAmount
Amount in satoshis (Can be negative)
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
An input of a transaction.
const uint256 & GetHash() const
std::string ToString(const FeeEstimateMode &fee_estimate_mode=FeeEstimateMode::BTC_KVB) const
std::string ToString() const
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
CAmount GetFee(uint32_t num_bytes) const
Return the fee in satoshis for the given vsize in vbytes.
static constexpr MemPoolLimits NoLimits()
The basic transaction that is broadcasted on the network and contained in blocks. ...
static GenTxid Txid(const uint256 &hash)
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it...
Neither this tx nor a mempool ancestor signals rbf.