@cfxlabsinc/b2b-services
    Preparing search index...

    One timelock operation still in flight, from its stored schedule row.

    type EvmTimelockOperation = {
        delaySeconds: EvmScheduleRow["delaySeconds"];
        executesAutomatically: boolean;
        hasReviewWindow: boolean;
        kind: "UPGRADE" | "DELAY";
        minDelaySeconds: number;
        operationId: Hex;
        readyAt: Temporal.Instant | null;
        release: EvmScheduleRow["release"];
        slot: string;
        state: "UNSENT" | "WAITING" | "READY";
        sweepFailure: EvmSweepFailure | null;
        walletTransactionId: EvmScheduleRow["walletTransactionId"];
    }
    Index
    delaySeconds: EvmScheduleRow["delaySeconds"]

    The minimum delay a delay change sets; null on an upgrade.

    executesAutomatically: boolean

    Upgrades execute on the sweep's next run once ready. Delay changes never do.

    hasReviewWindow: boolean

    False at a zero delay: there is no window in which to review it.

    kind: "UPGRADE" | "DELAY"
    minDelaySeconds: number

    The timelock's minimum delay.

    operationId: Hex
    readyAt: Temporal.Instant | null

    When it becomes ready; null while UNSENT.

    release: EvmScheduleRow["release"]

    The release an upgrade moves to; null on a delay change.

    slot: string
    state: "UNSENT" | "WAITING" | "READY"

    UNSENT: stored, not yet on chain. WAITING: on chain, delay running. READY: delay over.

    sweepFailure: EvmSweepFailure | null

    The sweep's execute row for a ready upgrade, once it is dead. The one state that offers Retry: a runtime mismatch, a stuck schedule row and a delay change stay null.

    walletTransactionId: EvmScheduleRow["walletTransactionId"]