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
- Retry submission with a higher gas price / max fee.
- Ensure the nonce is not already consumed by another in-flight transaction.
- Catch TRANSACTION_SQUEEZED_OUT specifically and resubmit a fresh transaction request.
- 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
- Use competitive gas prices and correct nonces to avoid squeezes.
- Wrap status waits in try/catch for TRANSACTION_SQUEEZED_OUT and resubmit.
- Avoid submitting many txs from one account without nonce coordination.
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
- TRANSACTION_NOT_FOUND
- TRANSACTION_FAILED
- TRANSACTION_FAILED
- Version '${forcVersion}' not found\n at ${pkgUrl}
- Version '${fuelCoreVersion}' not found\n at ${pkgUrl}
AI-assisted analysis of FuelLabs/fuels-ts@b3f37c91ac (2026-08-12).
Data as JSON: /api/errors/fe309385f5d27578.
Report an issue: GitHub.