FuelLabs/fuels-ts · warning · FuelError

TRANSACTION_SQUEEZED_OUT

TRANSACTION_SQUEEZED_OUT

Error message

Transaction Squeezed Out with reason: ${statusChange.reason}

What it means

Thrown inside `TransactionResponse.waitForPreConfirmation()`/status subscription loop when the node reports a `SqueezedOutStatus` for the transaction. 'Squeezed out' means the node dropped the transaction from its pool before inclusion (e.g. due to a competing tx, low gas price, or expiry). The error carries the node-supplied `reason` string and aborts the await.

Source

Thrown at packages/account/src/providers/transaction-response/transaction-response.ts:471

    }

    this.waitingForStreamData = true;

    const subscription =
      this.submitTxSubscription ??
      (await this.provider.operations.statusChange({
        transactionId: this.id,
        includePreConfirmation: true,
      }));

    for await (const sub of subscription) {
      // Handle both types of subscriptions
      const statusChange = 'statusChange' in sub ? sub.statusChange : sub.submitAndAwaitStatus;
      this.status = statusChange;

      // Transaction Squeezed Out
      if (statusChange.type === 'SqueezedOutStatus') {
        throw new FuelError(
          ErrorCode.TRANSACTION_SQUEEZED_OUT,
          `Transaction Squeezed Out with reason: ${statusChange.reason}`
        );
      }

      if (
        statusChange.type === 'PreconfirmationSuccessStatus' ||
        statusChange.type === 'PreconfirmationFailureStatus'
      ) {
        this.preConfirmationStatus = statusChange;
        this.resolveStatus('preConfirmation');
        // We should end the subscription here if we are not waiting for the confirmation status
        const pendingConfirmationResolvers = this.statusResolvers.get('confirmation');
        if (!pendingConfirmationResolvers) {
          this.waitingForStreamData = false;
          break;
        }
      }

View on GitHub (pinned to b3f37c91ac)

Solutions

  1. Retry submission with a higher gas price / max fee.
  2. Ensure the nonce is not already consumed by another in-flight transaction.
  3. Catch TRANSACTION_SQUEEZED_OUT specifically and resubmit a fresh transaction request.
  4. Check node mempool status and congestion before bulk submission.

Example fix

// before
await txResponse.waitForPreConfirmation(); // throws on squeeze
// after
try {
  await txResponse.waitForPreConfirmation();
} catch (e) {
  if (e.code === ErrorCode.TRANSACTION_SQUEEZED_OUT) {
    txResponse = await sender.sendTransaction(txRequest, { estimateTxDependencies: false });
    await txResponse.waitForPreConfirmation();
  } else { throw e; }
}
Defensive patterns

Strategy: retry

Validate before calling

null

Type guard

null

Try / catch

import { ErrorCode } from '@fuel-ts/errors';
try {
  await response.waitForPreConfirmation();
} catch (e) {
  if (e.code === ErrorCode.TRANSACTION_SQUEEZED_OUT) {
    response = await account.sendTransaction(request, { estimateTxDependencies: false });
    await response.waitForPreConfirmation();
  } else throw e;
}

Prevention

When it happens

Trigger: Awaiting a transaction response (`await txResponse.waitForPreConfirmation()` or `submitAndAwaitStatus`) and the fuel node emits `SqueezedOutStatus` on the status-change subscription stream before a Success/Failure.

Common situations: Gas price too low relative to competing transactions; transaction TTL expired in the mempool; same nonce reused by a faster transaction; node restart or congestion dropped pending txs; submitting many txs from one account without nonce management.

Related errors


AI-assisted analysis of FuelLabs/fuels-ts@b3f37c91ac (2026-08-12). Data as JSON: /api/errors/fe309385f5d27578. Report an issue: GitHub.