Stuck Transactions at Scale: RBF, CPFP and the Pinning Problem

Maciej Lewandowski · July 2026 · Field notes from custody & wallet infrastructure

A stuck transaction on your own wallet is an annoyance. A stuck transaction in a custody system is a client's money in limbo, an SLA burning down, and an operator asking what the runbook says. This is the runbook, or at least the reasoning behind one, for the three chain families where "stuck" means three different things.

Why transactions get stuck at all

Bitcoin: RBF, CPFP, and who controls the remedy

Replace-by-fee rebuilds the same payment with a higher fee. The replacement must generally pay for what it displaces (the BIP-125 rules), and since every signature commits to the transaction, RBF means re-signing. That is fine when the transaction is entirely yours. It stops being fine the moment other parties contributed inputs: their signatures die with the replacement, and your remediation now has a human coordination step in it.

Child-pays-for-parent attacks the problem from the other side: spend an output of the stuck transaction (typically your change) with a generously overpaying child. Miners evaluate the pair as a package, the ancestor feerate rises, both confirm. No re-signing, no counterparties, no permission needed. Which is why the practical rule is:

RBF when the transaction is entirely yours and cheap coordination is possible. CPFP when anyone else signed it, when the signing path is slow or cold, or when you simply need a remedy that depends on nobody. Design wallets so that CPFP is always available: always leave yourself a spendable output.

Pinning is the adversarial version. Package rules cut both ways: a counterparty who owns an output of your transaction can attach a large, low-feerate child, making replacement prohibitively expensive under the "pay for what you displace" rule, and the package unattractive to miners. The transaction is frozen in public view. Protocols that live and die by timely confirmation (Lightning, most visibly) evolved anchor outputs and package-relay improvements specifically to shrink this attack surface. If your flows include transactions co-signed with parties you do not fully trust, pinning belongs in your threat model, and "wait for mempool expiry, around two weeks by default" belongs in your expectations.

Ethereum: it is always the nonce

EVM remediation is mechanically simpler and operationally trickier:

Solana: stuck is temporary, dead is forever

Blockhash expiry means Solana rarely has zombie transactions; it has ambiguous ones. The dangerous window is between expiry-as-observed and expiry-as-fact: resubmit a "dead" transaction's intent as a new transaction too eagerly, and if the original squeaked in at the boundary you have paid twice. The discipline is the same as everywhere else, just compressed in time: track the transaction by signature until its blockhash is provably expired, then and only then rebuild with a fresh blockhash under the same idempotency key. For signing flows too slow for a 60-90 second window (cold storage, multi-approval), durable nonces exist precisely to opt out of expiry.

The ops layer: remediation is a policy, not a heroic act

Every remediation above is mechanical. What separates calm systems from noisy ones is that the mechanics are wired to policy instead of adrenaline:

  1. Age alarms per state, per chain. A transaction pending longer than its chain's expected profile triggers evaluation, automatically.
  2. Automatic fee-bumps within bounds. Policy defines the bump curve and the ceiling. Below the ceiling, no human is involved. At the ceiling, a human decides, with context in front of them.
  3. Idempotency keys survive remediation. Replacement, cancel and rebuild all inherit the original intent's key. The client asked to withdraw once; the ledger must agree regardless of how many transactions it took.
  4. REPLACED and EXPIRED are first-class states, so monitoring reports remediation as progress, not as a fresh incident.
  5. Nothing settles on broadcast. The stuck window is exactly why crediting, reporting and client notification key off confirmations, never off submission.

Stuck transactions are not edge cases. They are weather. Systems that treat them as storms stay in firefighting mode forever; systems that treat them as Tuesday build the umbrella into the architecture.