Overview
Thesinker.debug object provides access to the fault injection system. Register a fault before enqueueing a transaction to simulate any failure class on demand.
Methods
debug.injectFault()
Register a one-shot synthetic failure to inject into the nextPOST /internal/submit call.
The failure class to inject. One of:
'fee_too_low''expired_blockhash''bundle_failed''compute_exceeded''slot_skip'
Optional custom error string stored in the lifecycle entry’s
raw_error field.
Defaults to "Injected fault: {failureClass} (demo)".Promise<FaultInjectResult>
true when the fault was registered successfully.The failure class that was registered (echoed back for confirmation).
debug.runFaultDemo()
Register a fault and enqueue a transaction in one call. Returns the fault registration result and the tx handle.The failure class to inject.
Base64-encoded pre-signed transaction bytes.
Promise<{ faultRegistered: boolean; tx_id: string }>
What the sidecar does on a faulted submit
When a fault is registered andPOST /internal/submit is called:
- The tx queue is drained normally and bytes are retained for retry
- The fault spec is consumed (cleared from
next_fault) - A lifecycle entry is written with
stage: "failed"and the specifiedfailure_class TxStatusChangedSSE events are emitted for eachtx_id- A
BundleSettledSSE event fires withstage: "failed"andfailure_type - HTTP 200 is returned with a structured result — no Jito call is made
GET /tx/raw/:tx_id and re-enqueueing.
Fault coverage
All five failure classes have been validated against the full agent retry cycle on mainnet-beta:| Class | Fault injected | Agent retry | Result |
|---|---|---|---|
fee_too_low | ✅ | Escalate tip to p95 | ✅ PASS |
expired_blockhash | ✅ | Re-enqueue (fresh blockhash) | ✅ PASS |
bundle_failed | ✅ | Inspect error → retry | ✅ PASS |
compute_exceeded | ✅ | Hold (instruction broken) | ✅ PASS |
slot_skip | ✅ | Re-enqueue (same tip) | ✅ PASS |