Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
456f7b5
Harden init-podman-volumes against stale volume records
zancas Jul 1, 2026
6d87cb0
Derive seam depth from NON_FINALIZED_DEPTH, not stale literal 100/99
zancas Jul 1, 2026
81e93dc
Introduce zaino_common::consensus; single-source seam depth & coinbas…
zancas Jul 1, 2026
961410d
Add fast-test-seam feature so cross-crate tests can use the tractable…
zancas Jul 1, 2026
fdf9bc9
Rename NON_FINALIZED_DEPTH -> OPERATIONAL_NFS_DEPTH in zaino-state
zancas Jul 1, 2026
3e30d47
Single-source cross-crate test-side seam references
zancas Jul 1, 2026
c29b082
Fix send_to_transparent_finalization off-by-one; advance past the seam
zancas Jul 1, 2026
908f844
Fix zcashd finalization off-by-one; seam-derive both advances
zancas Jul 1, 2026
1f3d56d
Remove internal "round-N PX" spec jargon from live-test docs
zancas Jul 1, 2026
8780e94
Rename `makers test` set `package` -> `packages`
zancas Jul 2, 2026
9923aaa
added ChainIndexRpcExt trait to split functionality not required by z…
idky137 Jul 2, 2026
2e82736
Merge pull request #1348 from zingolabs/harden_init_podman_volumes
zancas Jul 2, 2026
91577d0
Merge pull request #1354 from zingolabs/fix_nfs_depth_bug
zancas Jul 2, 2026
abbeb86
move methods into chain_index / blockchainsource pt 1
idky137 Jul 2, 2026
c7671b8
move methods into chain_index / blockchainsource pt 2 - get_block / g…
idky137 Jul 2, 2026
06146fe
docs: record the Rust-native tool-selection rule
zancas Jul 2, 2026
ba01451
feat: drop the zingo_common_components dependency
zancas Jul 2, 2026
fc063cb
build: bump zcash_local_net pin to remove_unnecessary_deps head
zancas Jul 3, 2026
92c8e8f
build: track zcash_local_net on the remove_unnecessary_deps branch
zancas Jul 3, 2026
ddbdda9
build: re-lock zcash_local_net to remove_unnecessary_deps head 232cf9fb
zancas Jul 3, 2026
3610da0
Add publish dry-run CI check
nachog00 Jul 3, 2026
2a4df3f
move methods into chain_index / blockchainsource pt 2 - get_block_deltas
idky137 Jul 3, 2026
4b2c231
move methods into chain_index / blockchainsource - get_difficulty
idky137 Jul 3, 2026
91c3772
move methods into chain_index / blockchainsource - proxy methods
idky137 Jul 3, 2026
68cb4fb
move methods into chain_index / blockchainsource - validate address
idky137 Jul 3, 2026
179feab
move methods into chain_index / blockchainsource - blockchain info
idky137 Jul 3, 2026
60a8dc2
move methods into chain_index / blockchainsource - subtree roots
idky137 Jul 3, 2026
511fe58
move methods into chain_index / blockchainsource - mempool
idky137 Jul 3, 2026
9c697ee
moved last split functionality out of indexerservices
idky137 Jul 3, 2026
9680004
Merge pull request #1357 from zingolabs/drop_zingo_common_components
zancas Jul 3, 2026
c158d4e
Merge branch 'dev' into test_tool_update
zancas Jul 3, 2026
dc9a473
Merge pull request #1359 from zingolabs/ci/publish-dry-run
zancas Jul 3, 2026
d8584be
initial dep bumps and compilation fixes
idky137 Jul 3, 2026
ab4f83c
updated zaino-fetch block / transaction parsing to use zcashserialise
idky137 Jul 3, 2026
ec88a88
updated zaino-proto plus compact block structs, added ironwood treest…
idky137 Jul 3, 2026
75fa0ff
updated IndexedBlock and internal block parsing
idky137 Jul 3, 2026
7346037
update finalised state for ironwood
idky137 Jul 4, 2026
cce2e62
fixed crate tests
idky137 Jul 4, 2026
65cc2b9
reconcile ironwood rebase onto dev
idky137 Jul 4, 2026
0e057e2
fixed ironwood treestates and cargo fmt
idky137 Jul 4, 2026
060ee6e
refactor(backends): name the treestate components in z_get_treestate
zancas Jul 4, 2026
5fae0ae
refactor(chain-index): DRY pool-root gating and retire unwrap families
zancas Jul 4, 2026
2fbdcb8
refactor(chain-index): walk block ranges with a Height-typed iterator
zancas Jul 4, 2026
9ea9c75
test(chain-index): pin sapling point-lookup skip width (known red)
zancas Jul 4, 2026
44ebd43
fix(chain-index): skip sapling outputs at the output width
zancas Jul 4, 2026
30438d3
test(zaino-fetch): pin GetTransactionResponse ironwood JSON key (know…
zancas Jul 4, 2026
637bc1d
fix(zaino-fetch): read the ironwood bundle from the "ironwood" JSON key
zancas Jul 4, 2026
57f6b7e
test(chain-index): pin the ironwood treestate-slot contract (known red)
zancas Jul 4, 2026
618e8c2
fix(chain-index): omit the ironwood treestate below NU6.3 activation
zancas Jul 4, 2026
453c64e
Resolve the zebra source-build git ref in the workbench, not in-conta…
zancas Jul 4, 2026
8005b50
test(chain-index): pin None-preservation of the stored ironwood root …
zancas Jul 4, 2026
c4f6b4f
fix(chain-index): store the ironwood root as None when the pool has n…
zancas Jul 4, 2026
8cb2941
test(zaino-fetch): pin five-pool valuePools deserialization (known red)
zancas Jul 4, 2026
857072d
fix(zaino-fetch): accept any number of valuePools from the validator
zancas Jul 4, 2026
77753e1
test(chain-index): pin sparse ironwood rows (known red)
zancas Jul 4, 2026
c85ebe1
fix(chain-index): write ironwood rows only for blocks with ironwood data
zancas Jul 4, 2026
d60a3d9
refactor(chain-index): one cursor walk for the shielded-pool point lo…
zancas Jul 4, 2026
5bd1abc
chore: version-mark Ironwood builds and document the NU6.3 work per p…
zancas Jul 4, 2026
1ffe6e8
test(chain-index): plumb per-pool treestates; pin finalRoot pass-thro…
zancas Jul 4, 2026
a72b107
fix(chain-index): serve finalRoot for every pool in z_gettreestate
zancas Jul 4, 2026
ddad666
chore(test-env): bump devtool pin to ironwood-valar-portables (zcash#…
zancas Jul 4, 2026
0d7f60d
refactor(chain-index): small cleanups from the PR #1362 review
zancas Jul 4, 2026
0725316
refactor(chain-index): gate the unused ironwood roots accessor to tests
zancas Jul 4, 2026
66c500f
refactor(chain-index): one range collector for the ephemeral per-heig…
zancas Jul 4, 2026
1a1df16
refactor(backends): share the gRPC TreeState builder between backends
zancas Jul 4, 2026
aac9b16
refactor(chain-index): one row reader and one range scanner for the v…
zancas Jul 4, 2026
7c22666
refactor(chain-index): share the per-block entry building between wri…
zancas Jul 4, 2026
348558e
docs: propose pool-indexed dispatch for the chain index
zancas Jul 4, 2026
b1783b9
fix(zaino-proto): serve ironwood to unfiltered compact-block requests
zancas Jul 5, 2026
289d63d
ci(publish-dry-run): verify the workspace as a set and gate version r…
zancas Jul 5, 2026
8e4a0a4
docs: start a CONTEXT.md glossary with the release-engineering terms
zancas Jul 5, 2026
cee8c38
ci(publish-dry-run): skip packaged-form verify while versions are unb…
zancas Jul 5, 2026
b13c4d9
refactor(chain-index): pool activation dispatch on ShieldedPool
zancas Jul 4, 2026
c7b1a47
fix(chain-index): drop needless borrows in the batch write loop
zancas Jul 4, 2026
bf7a876
refactor(chain-index): pool table dispatch in the v1 shielded reads
zancas Jul 4, 2026
019ab23
refactor(zaino-proto): one definition of the unfiltered pool set
zancas Jul 5, 2026
438a755
test(chain-index): in-crate compact-block metadata consistency walk
zancas Jul 5, 2026
f5a4323
test(chain-index): demonstrate zebra's missing V6 Arbitrary generatio…
zancas Jul 5, 2026
36e017f
test(chain-index): package-tier era triple for compact-block consistency
zancas Jul 5, 2026
ee9ed33
test(live): clientless and e2e era triples with tier-exclusive predic…
zancas Jul 5, 2026
5aa718d
test(config): retries are 0 in every nextest profile
zancas Jul 5, 2026
63c4583
fix(live): enable zaino in the clientless era-test launches
zancas Jul 5, 2026
1bfe61c
test(live): full-chain routing report keyed to the issue #1368 hypoth…
zancas Jul 5, 2026
e9cbf4c
test(live): gate ironwood-era tests on the CI image's missing routing
zancas Jul 5, 2026
9606e4b
build(live): bump zcash_local_net past the NU6.3-dropping launcher; u…
zancas Jul 5, 2026
be3c879
fix(live): fetch the oracle block at verbosity 1, not 2
zancas Jul 5, 2026
13b306a
fix(live): align zebrad default heights with the devtool canonical set
zancas Jul 5, 2026
2258a8e
test(e2e): gate wallet-funding tests on the ironwood scanning gap; fi…
zancas Jul 5, 2026
d174f4f
update devtool
zancas Jul 5, 2026
3554c91
test(e2e): un-gate the wallet-funding family for the ironwood-capable…
zancas Jul 5, 2026
df443c9
test(e2e): follow devtool's NU6.3 output routing — receipts land in I…
zancas Jul 5, 2026
6a06967
Merge pull request #1362 from zingolabs/feat/ironwood_nu6_3
zancas Jul 5, 2026
6d838c0
merged fetchservice and stateservice into unified NodeBackedIndexerSe…
idky137 Jul 5, 2026
3bf2c27
Merge remote-tracking branch 'origin/dev' into move_functionality_int…
idky137 Jul 5, 2026
ec44cff
refactor(zaino-common): DRY logging and activation-height conversions
zancas Jul 5, 2026
7d19e0e
build(zaino-common): drop unused deps thiserror, nu-ansi-term, hex
zancas Jul 5, 2026
24c31aa
fix: install rustls CryptoProvider explicitly and pin provider to ring
zancas Jul 4, 2026
13163ea
build: drop unnecessary rustls "std" feature from zaino-common
zancas Jul 4, 2026
30681b9
ci: report advisory publish dry-run failures as warnings, not a red X
zancas Jul 4, 2026
90522a2
docs: ADR-0006 — prefer aws-lc-rs CryptoProvider; start CONTEXT.md gl…
zancas Jul 5, 2026
a62dcd3
build: prefer aws-lc-rs CryptoProvider with post-quantum key exchange
zancas Jul 5, 2026
94cccea
fix(workbench): satisfy clippy manual_pattern_char_comparison
zancas Jul 5, 2026
5e4d45e
make persistent db validation wait on migration
idky137 Jul 6, 2026
9385878
Merge pull request #1366 from zingolabs/debug_1360
zancas Jul 6, 2026
b155101
fixed ironwood migration
idky137 Jul 6, 2026
8c2378b
Merge branch 'dev' into dry_zaino_common
zancas Jul 7, 2026
7180e3c
feat!: enforce the Validator as the sole source of activation-height …
zancas Jul 7, 2026
d445446
test(e2e): wallet-tier Ironwood activation suite on the transition fi…
zancas Jul 7, 2026
c6ec679
test: enforce the Ironwood boundary invariants at its edges, and on t…
zancas Jul 7, 2026
888d0cc
build(makers): add an ironwood set to the test front door
zancas Jul 7, 2026
8aeb2d3
fix(e2e): position the boundary cells from the observed tip and pin t…
zancas Jul 7, 2026
6402edd
test(zaino-fetch): pin the verbosity-2 getblock transaction-object sh…
zancas Jul 7, 2026
576b72d
fix(zaino-fetch): deserialize verbosity-2 getblock transaction objects
zancas Jul 7, 2026
d3538cf
Merge branch 'dev' into fix_ironwood_db_migration
zancas Jul 7, 2026
17df071
Merge pull request #1379 from zingolabs/fix_ironwood_db_migration
zancas Jul 7, 2026
1c8249c
Merge pull request #1376 from zingolabs/ironwood_demos
zancas Jul 7, 2026
d634327
Merge branch 'dev' into fix_getblock_verbosity_2
zancas Jul 7, 2026
d1d3551
Merge branch 'dev' into move_functionality_into_blockchainsource
zancas Jul 7, 2026
63dc84c
refactor(state): apply ironwood-migration polish from review of #1379
zancas Jul 7, 2026
933c52c
Merge branch 'dev' into heights_from_validator
zancas Jul 7, 2026
083ced1
test!: expect derived Sapling keys from z_validateaddress on all conn…
zancas Jul 8, 2026
5f2ac73
fix(zaino-state): preserve typed error causes across the BlockchainSo…
zancas Jul 8, 2026
fd322a1
fix(zaino-state): keep the typed RpcError on sendrawtransaction hex r…
zancas Jul 8, 2026
39053f1
fix(zaino-state)!: return Option from chaintip_update_subscriber inst…
zancas Jul 8, 2026
dfc6d98
fix(zaino-state): replace the getaddressdeltas tip unwrap with a type…
zancas Jul 8, 2026
e094e56
fix(zaino-state): make the service teardown safe off the multi-thread…
zancas Jul 8, 2026
61d1192
fix(zaino-state): omit multi-address outputs from getblockdeltas again
zancas Jul 8, 2026
d198d9d
fix(zaino-state): proxy getchaintips to the validator while still syn…
zancas Jul 8, 2026
0d62a5a
fix(zaino-state): resolve tip-relative getblock heights, keep the -8 …
zancas Jul 8, 2026
493032b
fix(zaino-state): never let the source syncer task outlive its chain …
zancas Jul 8, 2026
06fd01f
test(zaino-state): pin the getblockheader raw-to-wire serde round-trip
zancas Jul 8, 2026
8048bf8
Merge pull request #1361 from zingolabs/move_functionality_into_block…
zancas Jul 9, 2026
064b177
fix: wait for the validator's first block in the connector spawn paths
aphelionz Jul 9, 2026
b93daac
Merge pull request #1389 from aphelionz/fix_startup_no_blocks_crash_loop
zancas Jul 9, 2026
144da39
Merge pull request #1355 from zingolabs/test_tool_update
nachog00 Jul 9, 2026
a1a4431
Merge branch 'dev' into fix_getblock_verbosity_2
nachog00 Jul 9, 2026
1cfc75f
Merge pull request #1381 from zingolabs/fix_getblock_verbosity_2
nachog00 Jul 9, 2026
0460df6
Merge branch 'dev' into ironwood_migration_polish
nachog00 Jul 9, 2026
72695a2
Merge pull request #1384 from zingolabs/ironwood_migration_polish
nachog00 Jul 9, 2026
bddf4ad
Merge branch 'dev' into dry_zaino_common
zancas Jul 9, 2026
86f9303
build: bump zcash_local_net to the tip of infrastructure PR #278
zancas Jul 9, 2026
c9f9524
Merge pull request #1371 from zingolabs/dry_zaino_common
nachog00 Jul 9, 2026
2185ab6
Merge branch 'dev' into heights_from_validator
zancas Jul 9, 2026
0789c36
Merge branch 'dev' into heights_from_validator
zancas Jul 9, 2026
4285738
build: record zaino-common's rustls dependency in the lockfile
zancas Jul 9, 2026
5bc7180
refactor: derive the adoption plumbing from the mirror macro
zancas Jul 9, 2026
ef3ed37
feat: verify the public-network schedule against the validator at spawn
zancas Jul 9, 2026
0713cfb
refactor!: name The Public Testnet exactly, everywhere it is meant
zancas Jul 9, 2026
5ecfe71
style: clear the two outstanding clippy warnings
zancas Jul 9, 2026
c94ae24
Merge pull request #1375 from zingolabs/heights_from_validator
zancas Jul 9, 2026
46c5e93
bump deps
zancas Jul 13, 2026
1a795db
build(zainod): drop the unused zebra-chain dependency
zancas Jul 13, 2026
1e255d0
build: advance ZEBRA_VERSION to the 6.0.0 final release
zancas Jul 13, 2026
483a6ca
build: remove unused dependency edges across the workspace
zancas Jul 13, 2026
46d18c6
build: demote test-only dependencies to dev-dependencies
zancas Jul 13, 2026
4141a5d
feat(test-runner): add a packages row and per-suite timing to the sum…
zancas Jul 13, 2026
2f3541a
fix(ci): refresh the trixie apt pins the point release superseded
zancas Jul 13, 2026
45ed68d
refactor(test-runner): measure wall-clock time with Instant, not outp…
nachog00 Jul 13, 2026
642a405
Merge pull request #1394 from zingolabs/bump_deps
zancas Jul 13, 2026
dda8497
fix(ci): make publish dry-run advisory for PRs targeting rc/stable
nachog00 Jul 13, 2026
bf6101d
Merge pull request #1398 from zingolabs/fix/publish-dry-run-advisory-…
zancas Jul 13, 2026
5aa5934
Merge pull request #1397 from zingolabs/dev
nachog00 Jul 13, 2026
87ae07f
build: bump crate versions for 0.6.0-rc.3
nachog00 Jul 13, 2026
b8bc7e3
Merge pull request #1400 from zingolabs/version-bump-0.6.0-rc.3
nachog00 Jul 13, 2026
903224e
Merge remote-tracking branch 'origin/rc/0.6.0' into release/0.6.0
nachog00 Jul 13, 2026
3d36756
build: merge rc/0.6.0 and bump crate versions for 0.6.0 release
nachog00 Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,15 @@ path = "junit.xml"
[test-groups]
live-validators = { max-threads = 6 }

# Live-package tuning: capped concurrency (via the group), a slow-timeout for
# validator startup, and retries to absorb RPC-timing flakiness. Scoped to the
# live packages so production unit tests keep retries = 0 and no slow-timeout.
# Live-package tuning: capped concurrency (via the group) and a slow-timeout for
# validator startup. Scoped to the live packages so production unit tests keep
# no slow-timeout. Retries are 0 everywhere: a flaky live test is a signal to
# fix, not to absorb.
[[profile.default.overrides]]
filter = 'package(e2e) | package(clientless)'
test-group = "live-validators"
slow-timeout = { period = "60s", terminate-after = "10" }
retries = 2
retries = 0

# The canonical test-target inventory consumed by the update/validate-test-targets
# scripts via `cargo nextest list` -- NOT the CI test run (that is `default`).
Expand Down
6 changes: 4 additions & 2 deletions .env.testing-artifacts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# zcashd Git tag (https://github.com/zcash/zcash/releases)
ZCASH_VERSION=6.20.0

ZEBRA_VERSION=5.2.0
ZEBRA_VERSION=6.0.0

# zcash-devtool git ref (https://github.com/zingolabs/zcash-devtool) —
# the wallet client driven by wallet-tests via zcash_local_net, built
Expand All @@ -14,4 +14,6 @@ ZEBRA_VERSION=5.2.0
# (get-ci-image-tag.sh → resolve_devtool_rev), so a branch HEAD advancing
# changes the tag automatically and the rebuild always bakes the current
# binary — no manual SHA bump needed. Pin a tag here only to freeze it.
DEVTOOL_VERSION=add_regtest
# Pinned to the NU6.3/Ironwood support commit: tip of
# `ironwood-valar-portables`, under review as zcash/zcash-devtool#208.
DEVTOOL_VERSION=2efc8e9c690c6b4a844d6bb0a49bc66ba6fcbb14
6 changes: 6 additions & 0 deletions .github/workflows/build-n-push-ci-image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,15 @@ jobs:
source .env.testing-artifacts
set +a
RUST_VERSION=$(cargo run -q --manifest-path tools/workbench/Cargo.toml --bin get-rust-version)
# Resolve ZEBRA_VERSION (the Docker Hub tag) to the git ref the
# zebra-builder source stage checks out; fails the job here on an
# unresolvable value instead of mid-build.
ZEBRA_GIT_REF=$(cargo run -q --manifest-path tools/workbench/Cargo.toml --bin get-zebra-git-ref -- "$ZEBRA_VERSION")
echo "sha_short=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT"
echo "RUST_VERSION=$RUST_VERSION" >> "$GITHUB_ENV"
echo "ZCASH_VERSION=$ZCASH_VERSION" >> "$GITHUB_ENV"
echo "ZEBRA_VERSION=$ZEBRA_VERSION" >> "$GITHUB_ENV"
echo "ZEBRA_GIT_REF=$ZEBRA_GIT_REF" >> "$GITHUB_ENV"
echo "DEVTOOL_VERSION=$DEVTOOL_VERSION" >> "$GITHUB_ENV"

- name: Define build target
Expand All @@ -79,4 +84,5 @@ jobs:
RUST_VERSION=${{ env.RUST_VERSION }}
ZCASH_VERSION=${{ env.ZCASH_VERSION }}
ZEBRA_VERSION=${{ env.ZEBRA_VERSION }}
ZEBRA_GIT_REF=${{ env.ZEBRA_GIT_REF }}
DEVTOOL_VERSION=${{ env.DEVTOOL_VERSION }}
105 changes: 105 additions & 0 deletions .github/workflows/publish-dry-run.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: Publish dry-run

on:
workflow_dispatch:
push:
branches:
- 'rc/**'
- stable
pull_request:
types: [opened, synchronize, reopened, ready_for_review]

jobs:
publish-dry-run:
name: cargo publish --dry-run
runs-on: ubuntu-latest
# Blocking context: direct pushes to rc/** or stable — the branch is in
# release-prep state and must publish cleanly. Advisory context: everything
# else, including PRs that *target* rc/** or stable. Those PRs carry
# unbumped dev code; version bumps happen on the RC branch after merge, so
# a publish failure at PR time is expected, not actionable.
steps:
- name: Checkout repository
uses: actions/checkout@v7

# rust-toolchain.toml auto-installs the pinned toolchain on first cargo
# invocation, so no explicit toolchain setup step is needed.

- name: Compute check mode
id: mode
run: |
if [[ "${{ github.event_name }}" == "push" ]]; then
target="${{ github.ref_name }}"
else
# PRs (including those targeting rc/** or stable) are always
# advisory — they carry pre-bump code by design.
target=""
fi
if [[ "$target" == rc/* || "$target" == stable ]]; then
echo "mode=blocking" >> "$GITHUB_OUTPUT"
else
echo "mode=advisory" >> "$GITHUB_OUTPUT"
fi

# A publishable crate whose exact version is already on crates.io with
# different content cannot be released without a bump. Advisory mode
# warns (unbumped-but-changed is the normal bump-at-release state on
# feature branches); blocking mode fails. Also emits the `violations`
# output consumed by the dry-run step below.
- name: Check for version-reuse violations
id: version-check
run: |
cargo run --manifest-path tools/workbench/Cargo.toml \
--bin check-published-versions -- --mode "${{ steps.mode.outputs.mode }}"

# --workspace resolves sibling dependencies against a local overlay
# registry, so packaging succeeds even when members depend on
# unpublished sibling changes — emulating a real dependency-ordered
# release. A per-crate dry-run loop cannot do this: nothing is uploaded
# between iterations, so dependents resolve siblings from crates.io and
# any cross-crate change fails spuriously.
#
# The verify build is weaker than packaging: when a local crate reuses
# an already-published version number, the registry artifact shadows
# the overlay copy, so dependents verify-compile against the published
# content, not the tree's. While version-reuse violations exist
# (advisory contexts only — blocking contexts already failed above),
# verification is therefore meaningless and the dry-run degrades to
# packaging/resolution checks. Release prep bumps the versions, and the
# full verify then runs where this job gates.
- name: Dry-run publish (workspace overlay)
run: |
set -euo pipefail

verify_flag=""
if [[ "${{ steps.version-check.outputs.violations }}" == "true" ]]; then
verify_flag="--no-verify"
echo "Version-reuse violations present: packaged crates would verify-compile"
echo "against the already-published versions that shadow the workspace overlay."
echo "Running packaging and resolution checks only (--no-verify) until the"
echo "versions are bumped at release prep."
echo ""
fi

if ! cargo publish --workspace --dry-run $verify_flag 2>&1; then
echo ""
echo "============================================"
echo "cargo publish --workspace --dry-run FAILED"
echo "============================================"
echo ""
echo "The workspace does not publish cleanly as a set. Common causes:"
echo " - a [patch.crates-io] override pulling in unreleased upstream"
echo " code (published crates cannot depend on unpublished revisions)"
echo " - a dependency on a git revision or path outside the workspace"
echo " - a crate that does not compile from its packaged form"
echo " - new cross-crate API or features that exist in the workspace but"
echo " not in the published dependency; resolved by the version bump +"
echo " publish of that dependency at the next release"
echo ""
if [[ "${{ steps.mode.outputs.mode }}" == "advisory" ]]; then
echo "::warning::publish dry-run failed — the workspace would not release cleanly. Advisory on this branch, but it must be resolved before the next release."
exit 0
fi
echo "::error::publish dry-run failed — the workspace would not release cleanly."
exit 1
fi
40 changes: 40 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,46 @@ and this library adheres to Rust's notion of
## Unreleased

### Changed
- `zaino-state`: `FetchService` and `StateService` are merged into a single
generic `NodeBackedIndexerService<Source>` (module
`zaino_state::indexer::node_backed_indexer`; the former `backends` module is
gone). The validator connection is now selected at runtime rather than by type:
`NodeBackedIndexerServiceConfig { common, connection }` carries a
`ValidatorConnectionType` of either `Rpc` (JSON-RPC, formerly `Fetch`) or
`Direct(DirectConnectionConfig)` (Zebra `ReadStateService`, formerly `State`).
The per-backend `Fetch/StateServiceConfig`, `Fetch/StateServiceError`, and
`BackendConfig` types are replaced by `NodeBackedIndexerServiceConfig`,
`NodeBackedIndexerServiceError`, and `ValidatorConnectionType`.
- **Breaking** — config: `zainod.toml`'s `backend` selector is renamed
`state` → `direct` and `fetch` → `rpc`. The legacy `"state"` / `"fetch"`
values are still accepted as aliases, so existing config files keep working.
- `zaino-state`: the `ChainIndex` trait is split into `ChainIndex` (the
wallet-essential core: chain/tx/address/mempool access) and a
`ChainIndexRpcExt: ChainIndex` extension (compact-block serving, subtree
roots, and the block-explorer / mining / node-passthrough RPCs). The split is
a provisional first pass to be refined into finer capability traits later.
- `zaino-state`: all remaining backend-split RPC functionality has moved out of
the `FetchService` (`JsonRpSeeConnector`) and `StateService`
(`ReadStateService`) backends and into `BlockchainSource` /
`ChainIndex`. Both backends now resolve every fetch through their `ChainIndex`
indexer — building responses from Zaino's own indexed state where possible and
delegating to the `ValidatorConnector` (`BlockchainSource`) only for
validator-only or passthrough data. Validator connection/syncer spawning also
moves into `ValidatorConnector::spawn_fetch` / `spawn_state`, so each
service/subscriber now holds only `{ indexer, data, config }`. This readies
the two backends for their eventual merge into a single
`ValidatorBackedIndexerService`. No behaviour change.
- TLS: zaino now installs rustls's **aws-lc-rs** CryptoProvider as its
preferred process-level default (was ring) and enables rustls's
`prefer-post-quantum` feature, so the X25519MLKEM768 hybrid key exchange
leads zaino's outbound handshakes (ADR-0006). Installation remains
first-install-wins: an embedder that installs a provider before zaino
keeps its choice.

### Deprecated
- Classical TLS key exchange (X25519, SECP256R1, SECP384R1) is deprecated:
still offered and accepted for wallet compatibility, slated for refusal
once major wallet stacks negotiate hybrid key exchange (ADR-0006).
- **Breaking** — config: `storage.database.sync_write_batch_bytes` (bytes) is
renamed to `sync_write_batch_size` and given in **GiB** (default raised from
4 GiB to 32 GiB); this budget now also bounds the txout-set accumulator
Expand Down
10 changes: 10 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Zaino AI Contributor Guidelines

## Tool selection

Always prefer Rust-native tools in domains where they are designed to operate.
Dependency and manifest changes go through `cargo add` / `cargo remove` /
`cargo update`. Code navigation and refactors go through rust-analyzer (see
the LSP section below). Verification goes through `cargo check` /
`cargo clippy` / `cargo fmt` / `cargo nextest`. Do not reach for Python, sed,
or regex sweeps over Rust source or `Cargo.toml` when a Rust tool covers the
job.

## Visibility: minimum required scope

All items (functions, methods, structs, enums, fields, modules) MUST use the
Expand Down
98 changes: 98 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# Zaino

Zaino is a Zcash indexing service. This glossary pins down the canonical
terms for concepts where the team has picked one word among several.

## Language

### Release engineering

**Publishable set**:
The workspace members released to crates.io as a unit — every member not
marked `publish = false`. Derived from workspace metadata, never from a
hard-coded list.
_Avoid_: crate list, publish list

**Blocking context**:
A CI context in which release checks must pass: pushes to `rc/**` or
`stable`, and pull requests targeting them.
_Avoid_: strict mode, release mode

**Advisory context**:
Any CI context that is not a blocking context. Release checks report
findings (warnings, annotations) but do not fail the build there.
_Avoid_: soft mode, informational mode

**Version-reuse violation**:
A publishable crate whose exact version already exists on crates.io while
its packaged content differs. The tree cannot be released until that crate's
version is bumped. An unchanged crate keeping its published version is not a
violation.
_Avoid_: stale version, forgotten bump

### Chains and networks

**The Public Testnet**:
The public Zcash test network, and only that. Its regimes are
non-hermetic — state is shared with other participants, and an epoch
the public chain has left (e.g. pre-NU6.3 once NU6.3 activates there)
cannot be re-entered. Always this exact phrase in prose; identifiers
use `the_pub_testnet` and types use `PubTestnet`.
_Avoid_: bare "Testnet"/"testnet", and especially "testnet" for any
locally-launched chain, even one launched under a testnet network kind

**Regtest net**:
A hermetic, locally-launched chain whose activation heights the
launcher chooses. Every hermetic local net is a regtest net, whatever
network-kind flag it runs under.
_Avoid_: local testnet, custom testnet

### Pools and upgrades

**Ironwood / Orchard (era naming)**:
Eras, fixtures, and predicates that speak of shielded pools are named by
pool — Orchard, Ironwood — and a name that mentions one pool pairs with
the other pool's name, never with the upgrade's. **NU6.3** names only the
network upgrade itself: activation heights, consensus branch ID,
consensus rules.
_Avoid_: mixing vocabularies in one name or one sibling set (e.g. an
`ORCHARD_ONLY_*` fixture whose sibling is `NU6_3_ACTIVE_*` — the sibling
is `IRONWOOD_ONLY_*`)

**Cross-address restriction**:
The post-NU6.3 rule the Orchard Action circuit enforces: "(g_d, pk_d)
of the output note must equal (g_d, pk_d) of the spent note" — the
output note must carry the same expanded receiver (diversified base
g_d, diversified transmission key pk_d) as its spent note, so each
Orchard action is either change to the spent note's own address or a
withdrawal (positive value balance). Orchard-to-Orchard transfers to
any other address — including another address of the same wallet — are
prohibited. A companion transaction-level rule forbids new value
entering the pool. Source:
<https://zcash.github.io/ironwood/design/action-circuit.html#the-cross-address-restriction>
_Avoid_: "exit-only" (overclaims — same-receiver change still lands in
the pool and its commitment tree still grows)

### TLS and cryptography

**Preferred CryptoProvider**:
The TLS cryptography provider zaino installs as the process-wide default
when no provider is installed yet. A preference, not a mandate: an
embedder (e.g. zallet) that installs a provider before zaino keeps its
choice, and zaino handshakes through it.
_Avoid_: "enforced provider" (implies zaino overrides an embedder's
already-installed provider; it never does)

**Hybrid key exchange**:
A TLS 1.3 key-exchange group combining a classical curve with a
post-quantum KEM (key-encapsulation mechanism), e.g. X25519MLKEM768.
Secure if either component holds. Hybrids are the post-quantum
deployment vehicle, not a classical fallback.
_Avoid_: calling hybrids "classical" because they contain a classical
component

**Classical key exchange**:
A key-exchange group with no post-quantum component (X25519, SECP256R1,
SECP384R1). Deprecated in zaino: still accepted for client
compatibility, slated for refusal once major wallet stacks negotiate
hybrids.
Loading
Loading