@cfxlabsinc/b2b-services
    Preparing search index...
    CachedLedgerAccountSearchItem: Omit<
        LedgerAccountSearchItem,
        "balance"
        | "address"
        | "tokenAccounts"
        | "createdAt"
        | "updatedAt",
    > & {
        address: string;
        balance: string;
        createdAt: string;
        tokenAccounts: Record<"MOVEUSD", { address: string }>;
        updatedAt: string;
    }

    L2 round-trips through JSON, so Date fields arrive as strings and BigNumber / Address-branded fields lose their runtime shape on cross-process / post-L1 reads. Store a JSON-safe projection and rehydrate on read.

    Non-JSON-native fields: balance (BigNumber↔string), address + tokenAccounts.MOVEUSD.address (Address↔string), createdAt / updatedAt (Date↔ISO string — both notNull in the schema). Everything else rides the spread unchanged.