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

    Variable UTILA_ON_CHAIN_STATESConst

    UTILA_ON_CHAIN_STATES: readonly ["CONFIRMED", "MINED", "FAILED", "MINED_FAILED"] = ...

    Every terminal state in which the chain took money, and therefore every state that gets a row (§ 3.1).

    Utila's own enum documentation is what separates these from the states that cost nothing, and it splits on one question — did the transaction enter a block?

    CONFIRMED confirmed by multiple blocks MINED included in a block successfully FAILED "entered a block but in a failed state and was confirmed as such by multiple blocks" MINED_FAILED "entered a block but in a failed state"

    All four entered a block, so all four burned gas. The last two moved no value and produce the fee-only row of § 4.6. Every other terminal state — DECLINED, DECLINED_BY_AML_POLICY, CANCELED, DROPPED, EXPIRED, REPLACED — never reached the chain, cost nothing, and gets no row at all.

    Note that FAILED appears in UTILA_TRANSACTION_FAILURE_STATES, which the workflow layer uses to decide a SEND failed. Both readings are right: the send did fail, and the gas was still spent. They are different questions, so they get different lists rather than one shared one.