Home / TxPipe / oura
Jun 06, 3-4 AM (0)
Jun 06, 4-5 AM (0)
Jun 06, 5-6 AM (0)
Jun 06, 6-7 AM (0)
Jun 06, 7-8 AM (0)
Jun 06, 8-9 AM (0)
Jun 06, 9-10 AM (0)
Jun 06, 10-11 AM (0)
Jun 06, 11-12 PM (0)
Jun 06, 12-1 PM (0)
Jun 06, 1-2 PM (0)
Jun 06, 2-3 PM (0)
Jun 06, 3-4 PM (0)
Jun 06, 4-5 PM (0)
Jun 06, 5-6 PM (0)
Jun 06, 6-7 PM (0)
Jun 06, 7-8 PM (0)
Jun 06, 8-9 PM (0)
Jun 06, 9-10 PM (0)
Jun 06, 10-11 PM (0)
Jun 06, 11-12 AM (0)
Jun 07, 12-1 AM (0)
Jun 07, 1-2 AM (0)
Jun 07, 2-3 AM (0)
Jun 07, 3-4 AM (0)
Jun 07, 4-5 AM (0)
Jun 07, 5-6 AM (0)
Jun 07, 6-7 AM (0)
Jun 07, 7-8 AM (0)
Jun 07, 8-9 AM (0)
Jun 07, 9-10 AM (0)
Jun 07, 10-11 AM (0)
Jun 07, 11-12 PM (0)
Jun 07, 12-1 PM (0)
Jun 07, 1-2 PM (0)
Jun 07, 2-3 PM (0)
Jun 07, 3-4 PM (0)
Jun 07, 4-5 PM (0)
Jun 07, 5-6 PM (0)
Jun 07, 6-7 PM (0)
Jun 07, 7-8 PM (0)
Jun 07, 8-9 PM (0)
Jun 07, 9-10 PM (0)
Jun 07, 10-11 PM (0)
Jun 07, 11-12 AM (0)
Jun 08, 12-1 AM (0)
Jun 08, 1-2 AM (0)
Jun 08, 2-3 AM (0)
Jun 08, 3-4 AM (0)
Jun 08, 4-5 AM (0)
Jun 08, 5-6 AM (0)
Jun 08, 6-7 AM (0)
Jun 08, 7-8 AM (0)
Jun 08, 8-9 AM (0)
Jun 08, 9-10 AM (0)
Jun 08, 10-11 AM (0)
Jun 08, 11-12 PM (0)
Jun 08, 12-1 PM (0)
Jun 08, 1-2 PM (0)
Jun 08, 2-3 PM (0)
Jun 08, 3-4 PM (0)
Jun 08, 4-5 PM (0)
Jun 08, 5-6 PM (0)
Jun 08, 6-7 PM (0)
Jun 08, 7-8 PM (0)
Jun 08, 8-9 PM (0)
Jun 08, 9-10 PM (0)
Jun 08, 10-11 PM (0)
Jun 08, 11-12 AM (0)
Jun 09, 12-1 AM (0)
Jun 09, 1-2 AM (0)
Jun 09, 2-3 AM (0)
Jun 09, 3-4 AM (0)
Jun 09, 4-5 AM (0)
Jun 09, 5-6 AM (0)
Jun 09, 6-7 AM (0)
Jun 09, 7-8 AM (0)
Jun 09, 8-9 AM (0)
Jun 09, 9-10 AM (0)
Jun 09, 10-11 AM (0)
Jun 09, 11-12 PM (0)
Jun 09, 12-1 PM (0)
Jun 09, 1-2 PM (0)
Jun 09, 2-3 PM (0)
Jun 09, 3-4 PM (0)
Jun 09, 4-5 PM (0)
Jun 09, 5-6 PM (0)
Jun 09, 6-7 PM (0)
Jun 09, 7-8 PM (0)
Jun 09, 8-9 PM (0)
Jun 09, 9-10 PM (0)
Jun 09, 10-11 PM (0)
Jun 09, 11-12 AM (0)
Jun 10, 12-1 AM (0)
Jun 10, 1-2 AM (0)
Jun 10, 2-3 AM (0)
Jun 10, 3-4 AM (0)
Jun 10, 4-5 AM (0)
Jun 10, 5-6 AM (0)
Jun 10, 6-7 AM (0)
Jun 10, 7-8 AM (0)
Jun 10, 8-9 AM (0)
Jun 10, 9-10 AM (0)
Jun 10, 10-11 AM (0)
Jun 10, 11-12 PM (0)
Jun 10, 12-1 PM (0)
Jun 10, 1-2 PM (0)
Jun 10, 2-3 PM (0)
Jun 10, 3-4 PM (0)
Jun 10, 4-5 PM (0)
Jun 10, 5-6 PM (0)
Jun 10, 6-7 PM (0)
Jun 10, 7-8 PM (0)
Jun 10, 8-9 PM (0)
Jun 10, 9-10 PM (0)
Jun 10, 10-11 PM (0)
Jun 10, 11-12 AM (0)
Jun 11, 12-1 AM (0)
Jun 11, 1-2 AM (0)
Jun 11, 2-3 AM (0)
Jun 11, 3-4 AM (0)
Jun 11, 4-5 AM (0)
Jun 11, 5-6 AM (0)
Jun 11, 6-7 AM (0)
Jun 11, 7-8 AM (0)
Jun 11, 8-9 AM (0)
Jun 11, 9-10 AM (0)
Jun 11, 10-11 AM (0)
Jun 11, 11-12 PM (0)
Jun 11, 12-1 PM (0)
Jun 11, 1-2 PM (0)
Jun 11, 2-3 PM (0)
Jun 11, 3-4 PM (0)
Jun 11, 4-5 PM (0)
Jun 11, 5-6 PM (0)
Jun 11, 6-7 PM (0)
Jun 11, 7-8 PM (0)
Jun 11, 8-9 PM (0)
Jun 11, 9-10 PM (0)
Jun 11, 10-11 PM (0)
Jun 11, 11-12 AM (0)
Jun 12, 12-1 AM (0)
Jun 12, 1-2 AM (0)
Jun 12, 2-3 AM (0)
Jun 12, 3-4 AM (0)
Jun 12, 4-5 AM (0)
Jun 12, 5-6 AM (0)
Jun 12, 6-7 AM (0)
Jun 12, 7-8 AM (0)
Jun 12, 8-9 AM (0)
Jun 12, 9-10 AM (0)
Jun 12, 10-11 AM (0)
Jun 12, 11-12 PM (0)
Jun 12, 12-1 PM (3)
Jun 12, 1-2 PM (0)
Jun 12, 2-3 PM (3)
Jun 12, 3-4 PM (2)
Jun 12, 4-5 PM (0)
Jun 12, 5-6 PM (0)
Jun 12, 6-7 PM (2)
Jun 12, 7-8 PM (5)
Jun 12, 8-9 PM (0)
Jun 12, 9-10 PM (0)
Jun 12, 10-11 PM (8)
Jun 12, 11-12 AM (0)
Jun 13, 12-1 AM (0)
Jun 13, 1-2 AM (0)
Jun 13, 2-3 AM (0)
Jun 13, 3-4 AM (0)
23 commits this week Jun 06, 2026 - Jun 13, 2026
ci: migrate e2e tests from EKS/Kubernetes to GitHub runners
Replaces the EKS-backed e2e workflow with one that runs entirely on
github-hosted runners. Each leg runs the release image via `docker run` +
`timeout` and gates on the process exit code; the new WorkStats filter gives
each test a finalization policy so oura self-terminates after N blocks
(exit 0), the Assert sink panics on a bad block (non-zero), and `timeout`
guards a hang (124).

- delete the `prepare` job (EKS kubeconfig / namespace / IRSA service account)
- extract each config from its k8s ConfigMap into .github/e2e/configs/*.toml,
  rewritten for the oura v2 schema (peers/socket_path, top-level
  chain/intersect, LegacyV1 filter for the Assert sink, SplitBlock+ParseCbor
  for cloud sinks, RollbackBuffer for min_depth, WorkStats for finalization)
- AWS creds via aws-actions/configure-aws-credentials (assuming the
  OuraE2ETest role) injected into the container instead of EKS IRSA
- n2c uses a Demeter dmtrcli socket port-forward (placeholder; DMTR_API_KEY
  secret) and is continue-on-error until that path is finalized

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix: install default rustls CryptoProvider for the u5c TLS path
The U5C source connects over TLS via tonic/rustls. In builds that pull more
than one rustls crypto provider (e.g. the `aws` feature brings in aws-lc-rs
alongside ring), rustls has no process-default provider and panics on the
first TLS handshake (`no process-level CryptoProvider available`). Install the
ring provider once at startup, gated on the `u5c` feature.

This only surfaced now because nothing exercised U5C in a multi-provider build;
the manual u5c tests built `--features u5c` alone (single provider).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
ci(e2e): add u5c (utxorpc) legs for mainnet/preprod/preview
Move the manual u5c checks into the e2e suite as three `kind: u5c` legs
against the Demeter utxorpc endpoints, using the standard exit-code gate via
a WorkStats finalization policy (3 blocks -> exit 0); a #921-style regression
(reset loop, no apply events) never finalizes -> timeout -> fail.

API keys are parameterized as ${DMTR_UTXORPC_KEY_*} and resolved by envsubst
from GitHub secrets.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
feat: bump gasket to 0.10 and derive exit code from finalization
Bumps gasket 0.7 -> 0.10, which brings the non-panicking teardown and the new
`TetherState::Finished(StagePhase)` (PR construkts/gasket-rs#35). Adapt to the
0.10 API:

- `Daemon(tethers)` -> `Daemon::new(tethers)`.
- `block`/`teardown` now consume `Daemon`. `dump`/`watch` just call `block`
  (which tears down on stop). `run_daemon` shares the daemon via `Arc` with the
  prometheus + tui tasks, so it drives the stop loop over `&self` and reclaims
  ownership (after the aborted tasks drop their clones) for a graceful teardown.
- `console` handles the new `Finished` tether state.

Crucially, in 0.10 a crashing stage no longer aborts the process (gasket
isolates it per-thread), so `run_daemon` now derives the exit code from the
stages' terminal state: a stage that reached `Ended` (a finalization filter
completed) or a user termination signal -> exit 0; otherwise a stage crashed or
stalled -> non-zero. This is what makes the e2e exit-code gate meaningful: a
WorkStats finalize exits 0, an Assert panic exits non-zero.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
feat: add work_stats filter with finalization policy
Introduces a pass-through `WorkStats` filter that tracks work stats and
enforces a finalization policy (until_hash / max_block_slot /
max_block_quantity). When the policy is reached the filter ends its stage,
which gracefully stops the whole daemon (gasket halts once any stage reaches
`Ended`).

Because it lives in the filter chain it is decoupled from any particular
source — restoring the v1 source `finalize` semantics for every source at
once, and re-enabling the previously commented-out `max_block_quantity`
(the block counter now lives naturally in the filter). The name leaves room
to grow into a home for richer progress/throughput stats; `block_count` and
`latest_slot` metrics are the seed.

Reuses framework::FinalizeConfig / should_finalize (fields made public,
quantity branch re-enabled) and adds unit tests for the policy.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
ci(e2e): add u5c (utxorpc) legs for mainnet/preprod/preview
Move the manual tmp_u5c_test checks into the streamlined e2e suite as three
`kind: u5c` legs against the Demeter utxorpc endpoints. Converts the old
time-bounded run.sh approach to the standard exit-code gate via a WorkStats
finalization policy (3 blocks → exit 0); a #921-style regression (reset loop,
no apply events) never finalizes → timeout → fail.

API keys are parameterized as ${DMTR_UTXORPC_KEY_*} (resolved by envsubst from
GitHub secrets) rather than hardcoded — the scratch files held real-looking
keys and this repo is public. The e2e image is built --all-features, so U5C is
available (and now TLS-safe per the preceding crypto-provider fix).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix: install default rustls CryptoProvider for the u5c TLS path
The U5C source connects over TLS via tonic/rustls. In builds that pull more
than one rustls crypto provider (e.g. the `aws` feature brings in aws-lc-rs
alongside ring), rustls has no process-default provider and panics on the
first TLS handshake (`no process-level CryptoProvider available`). Install the
ring provider once at startup, gated on the `u5c` feature.

This only surfaced now because nothing exercised U5C in a multi-provider build;
the manual u5c tests built `--features u5c` alone (single provider).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
ci(e2e): map Demeter relays per network
The three relay.cnode-m1.demeter.run endpoints are different networks, not
redundant mainnet relays:
  :3000 = Mainnet, :3001 = PreProd, :3002 = Preview

Point the mainnet legs at :3000 (only) and the preview n2n legs at :3002,
replacing the public preview relay. (:3001/PreProd is unused — no preprod legs.)

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
feat: add work_stats filter with finalization policy
Introduces a pass-through `WorkStats` filter that tracks work stats and
enforces a finalization policy (until_hash / max_block_slot /
max_block_quantity). When the policy is reached the filter ends its stage,
which gracefully stops the whole daemon (gasket halts once any stage reaches
`Ended`).

Because it lives in the filter chain it is decoupled from any particular
source — restoring the v1 source `finalize` semantics for every source at
once, and re-enabling the previously commented-out `max_block_quantity`
(the block counter now lives naturally in the filter). The name leaves room
to grow into a home for richer progress/throughput stats; `block_count` and
`latest_slot` metrics are the seed.

Reuses framework::FinalizeConfig / should_finalize (fields made public,
quantity branch re-enabled) and adds unit tests for the policy.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
ci: migrate e2e tests from EKS/Kubernetes to GitHub runners
Replaces the EKS-backed e2e workflow with one that runs entirely on
github-hosted runners. Each leg runs the release image via `docker run` +
`timeout` and gates on the process exit code; the new WorkStats filter gives
each test a finalization policy so oura self-terminates after N blocks
(exit 0), the Assert sink panics on a bad block (non-zero), and `timeout`
guards a hang (124).

- delete the `prepare` job (EKS kubeconfig / namespace / IRSA service account)
- extract each config from its k8s ConfigMap into .github/e2e/configs/*.toml,
  rewritten for the oura v2 schema (peers/socket_path, top-level
  chain/intersect, LegacyV1 filter for the Assert sink, SplitBlock+ParseCbor
  for cloud sinks, RollbackBuffer for min_depth, WorkStats for finalization)
- AWS creds via aws-actions/configure-aws-credentials (assuming the
  OuraE2ETest role) injected into the container instead of EKS IRSA
- n2c uses a Demeter dmtrcli socket port-forward (placeholder; DMTR_API_KEY
  secret) and is continue-on-error until that path is finalized

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix(ci): bump aws-lc-sys/aws-lc-rs for new MSVC compatibility
The Windows `Check` CI job failed compiling `[email protected]`'s C feature
tests (`c11.c`) under the runner's new MSVC toolchain (VS 18 / 14.51), which
GitHub is rolling out as it redirects windows-latest to windows-2025-vs2026.

Bump the rustls crypto backend, which transitively pulls a newer aws-lc-sys
that supports current compilers:

- aws-lc-rs  1.13.3 -> 1.17.0
- aws-lc-sys 0.30.0 -> 0.41.0

Lockfile-only change (transitive deps; the aws-sdk crates were already
current). Verified `cargo build --features aws` compiles locally; Windows
build is validated by CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix: clear pre-existing clippy lints to unblock the Lint CI job
The Lint job historically died at the cargo fmt step, so clippy never ran
and these latent lints accumulated unnoticed. Now that fmt passes, clear
them so `cargo clippy --all-features --all-targets -- -D warnings` is green:

- framework: derive `Default` for `ChainConfig` instead of a manual impl.
- select filter: use an array literal instead of `vec!` in a test.
- redis sink: remove the unused `StreamStrategy` enum.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix: bump pallas + utxorpc to utxorpc-spec 0.19 (#921)
The U5C source against current UTxORPC servers (e.g. Demeter) emitted one
`reset` event then looped on `x=grpc error` with no apply events. The cause
was a breaking change in the UTxORPC spec: oura was pinned to
`utxorpc-spec 0.15` (via `utxorpc` 0.10 and `pallas` 0.35) while servers now
speak `0.19`, in which `BlockRef.index` was renamed to `slot`.

Rather than decouple oura's parsed-data model from pallas (pallas owns the
`ParsedBlock`/`ParsedTx` types and the CBOR->spec mapper used by the whole
`select` filter and `parse_cbor`), bump pallas and utxorpc together so both
ride a single `utxorpc-spec 0.19`:

- `utxorpc` 0.10 -> 0.14, `pallas` 0.35 -> 1.1

Spec/API changes handled:

- `BlockRef.index` -> `slot` and `LiveTip::event()` now returns
  `Option<TipEvent>` (None = server closed the stream) in `sources/u5c.rs`.
  Also surface the real gRPC status via `inspect_err(... error!(?err))`
  before restarting, instead of the opaque "grpc error" that masked #921.
- `TxOutput.coin: u64` -> `Option<BigInt>` and `Asset.{output_coin,mint_coin}`
  -> `Asset.quantity: Option<asset::Quantity>`. Added `big_int_to_u64` /
  `asset_quantity_to_u64` helpers and routed the `select` predicate call
  sites and test fixtures through them.
- `LedgerContext` gained `get_slot_timestamp`; `NoOpContext` returns `None`.
- pallas 1.1: `Nullable<T>` -> `Option<T>` for `Relay`/`PoolMetadata` fields
  in `legacy_v1/map.rs`; `pallas::storage::hardano::immutable` ->
  `pallas::interop::hardano::storage::immutable` in `sources/mithril.rs`.

Verified: `cargo check --all-features` clean; default and `u5c` builds link;
`cargo test --features u5c` passes (18/18).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>