GetMinFee() derives a base fee from nMinTxFee or nMinRelayTxFee and scales it with serialized transaction size.
mapNextTx is checked for an existing transaction spending the same outpoint; replacement is explicitly disabled in this path.
Low-fee transactions are rate-limited using an exponentially decaying counter and -limitfreerelay.
| Area | Source finding | Status |
|---|---|---|
| Minimum fee formula | GetMinFee() chooses nMinTxFee or nMinRelayTxFee, then computes (1 + nBytes/1000) × base fee. | Verified |
| Free transaction policy | With fAllowFree, transactions below the applicable size threshold can receive a zero minimum fee; relay mode uses DEFAULT_BLOCK_PRIORITY_SIZE - 1000 as the threshold. | Verified |
| Dust-related fee floor | When sending, if the calculated minimum is below base fee and an output is below CENT, the base fee is restored as the minimum. | Verified |
| Non-standard relay | On mainnet, AcceptToMemoryPool() rejects transactions failing IsStandardTx(). | Verified |
| Duplicate mempool transaction | Existing transaction hash is checked before continuing. | Verified |
| Same-input conflict | pool.mapNextTx is checked for each input; the inspected path explicitly says replacement is disabled and rejects the conflict. | Verified |
| Missing inputs | CCoinsViewMemPool is used; missing previous transaction hashes are detected and can set pfMissingInputs. | Verified |
| Already-spent inputs | view.HaveInputs(tx) rejects unavailable/spent inputs with bad-txns-inputs-spent. | Verified |
| Free-relay throttling | An exponentially decaying counter is used over an approximately 10-minute window; the default -limitfreerelay argument is 15 thousand-bytes-per-minute units. | Verified |
| Insane-fee guard | When enabled, fees above nMinRelayTxFee × 10000 are rejected. | Verified |
| Late script/input checks | CheckInputs() runs after earlier policy checks, explicitly to help prevent CPU-exhaustion DoS. | Verified |
| RBF replacement policy | Explicit replacement of a mempool conflict is disabled in this code path. | Verified |
| Current network relay behavior | No network-wide measurement of what independent VTA nodes currently relay was performed. | Not measured |
| Current effective fee floor | The exact runtime value of nMinRelayTxFee was not inferred from source alone; this requires a specific binary/runtime configuration measurement. | Not measured |
The source contains a deterministic minimum-fee policy, but a real payment benchmark still needs the runtime fee setting and observed transaction samples.
A transaction can be valid at the consensus layer while being rejected by a node's relay policy. This audit keeps those two concepts separate.
The inspected mempool path explicitly disables replacement for an existing same-input transaction. This is a policy observation, not a claim about all historical/future versions.