Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
ed0338d
Add wallet client management, with zcash-devtool as first client
zancas Jun 13, 2026
97f35c9
Consume zcash-devtool's machine-readable CLI surface
zancas Jun 13, 2026
0cc7dab
Consume zcash-devtool get-info; add Client::get_info
zancas Jun 16, 2026
a5d98d6
Wire NU6.2 through regtest-launcher; shrink e2e mining bootstrap
zancas Jun 26, 2026
ecf603f
DRY zcash_local_net integration tests into shared helpers
zancas Jun 26, 2026
e96bb6c
Add spec for consuming the new zcash-devtool CLI surface
zancas Jun 26, 2026
97d8424
Fix faucet_sends off-by-one: sync to the validator's real tip
zancas Jun 26, 2026
3a0ac92
Cut faucet test orchard mining: 8->5 and 9->6 blocks
zancas Jun 26, 2026
f4ba2ee
Merge pull request #270 from zingolabs/add_client_support
zancas Jul 2, 2026
f0ce0c1
feat: add zingo-consensus leaf crate, replacing zingo_common_components
zancas Jul 2, 2026
ccd8049
fix: regtest-launcher consumes zingo-consensus via local_net re-exports
zancas Jul 2, 2026
c8b7edc
docs: record the Rust-native tool-selection rule
zancas Jul 2, 2026
d32726b
Merge add_client_support (0cc7dab) into add_zingo_consensus
zancas Jul 2, 2026
0a003b4
fix: swap merged client-support code to zingo-consensus types
zancas Jul 2, 2026
15ba51f
Merge dev (add_client_support landed via #270)
zancas Jul 2, 2026
94b67da
fix: resolve cargo-deny advisories
zancas Jul 2, 2026
fc63e95
fix: pin cargo-check-external-types to 0.4.0
zancas Jul 2, 2026
4cb55f3
fix: exclude devtool_client integration tests from the ci profile
zancas Jul 2, 2026
ff65934
Merge pull request #275 from zingolabs/add_zingo_consensus
zancas Jul 3, 2026
b68f4d8
refactor: default miner address to the ABANDONART fixture, delete keygen
zancas Jul 3, 2026
b09d9c1
feat: replace zcash_protocol::PoolType with zingo_consensus::MinerPool
zancas Jul 3, 2026
7ae0673
refactor: take zebra_chain via zebra-rpc's re-export, declare rpc-client
zancas Jul 3, 2026
05c7dc9
feat: hand-rolled JSON-RPC client, drop zebra-node-services
zancas Jul 3, 2026
848422c
feat: bump zebra-rpc to 11.0, wire nu6.3 through the launcher CLI
zancas Jul 3, 2026
8e74e9e
feat: mod zebra_rpc with oracle-proven proposal assembly
zancas Jul 3, 2026
029e93e
feat: mine through mod zebra_rpc, demote zebra-rpc to dev-only oracle
zancas Jul 3, 2026
116bd5a
fix: allowlist the new public API's external types
zancas Jul 3, 2026
477504b
feat: delete the zebra-rpc oracle, zero zebra/zcash deps of any kind
zancas Jul 3, 2026
232cf9f
refactor: replace getset derives with hand-written accessors
zancas Jul 3, 2026
1874b8b
Merge pull request #276 from zingolabs/remove_unnecessary_deps
dannywillems Jul 3, 2026
2003aa2
cargo update
zancas Jul 3, 2026
3d45603
refactor: drop bip0039 and json deps, shrink lockfile 172->154
zancas Jul 3, 2026
19c702c
refactor: DRY block submission into zebra_rpc::submit_template_block
zancas Jul 3, 2026
3648aec
refactor: DRY the daemon launch path and shared parsing helpers
zancas Jul 3, 2026
40738ec
refactor: DRY Drop impls and accessors with in-repo macro_rules
zancas Jul 3, 2026
d16eb09
feat!: gate the legacy stack (zcashd + lightwalletd) behind non-defau…
zancas Jul 4, 2026
757f7fb
build: drop three low-value dev/build dependencies, lockfile 158 -> 142
zancas Jul 4, 2026
a6af852
bump toolchain
zancas Jul 4, 2026
226149d
docs: stamp CHANGELOG 0.7.0 and backfill the zebra-excision entries
zancas Jul 4, 2026
0b38b6e
docs: note the 1.95 -> 1.96 toolchain bump in the 0.7.0 CHANGELOG
zancas Jul 4, 2026
678cff9
feat!: activate NU6.3 across the regtest stack, harden the zebrad con…
zancas Jul 5, 2026
c57a346
feat: consume ironwood_spendable from devtool balance --json
zancas Jul 5, 2026
0dc4a51
test: assert shield value lands in the ironwood pool
zancas Jul 5, 2026
78511f7
feat!: make the Validator the sole source of activation-height truth,…
zancas Jul 7, 2026
fa2da0b
feat: allocate listener ports deterministically and add an Indexer-co…
zancas Jul 7, 2026
2a82fa6
fix: approve zingo_consensus::NetworkKind for the public API
zancas Jul 7, 2026
34fce91
fix: name the convergence test so binary-less CI filters it out
zancas Jul 7, 2026
1eb4966
chore: delete dead and duplicated shell scripts
zancas Jul 7, 2026
1a7b573
feat: port the trailing-whitespace check to a Rust workbench crate
zancas Jul 7, 2026
66df2cf
ci: cache the cargo build in the trailing-whitespace workflow
zancas Jul 7, 2026
8c3089e
feat: port the justfile recipes into the workbench crate
zancas Jul 7, 2026
c797ed2
feat!: define the Wallet abstraction the harness actuates generically
zancas Jul 8, 2026
f6a2af5
Merge pull request #280 from zingolabs/add_zingo_cli
zancas Jul 8, 2026
63b31a0
feat(zcash_local_net): add LocalNet::from_parts to expose the indexer…
zancas Jul 9, 2026
1a7bb7e
feat(zcash_local_net)!: publish front proxies as the canonical endpoints
zancas Jul 9, 2026
85502cd
fix(ci): exclude process-spawning test binaries by binary_id, not name
zancas Jul 9, 2026
23872a4
Merge pull request #278 from zingolabs/bump_to_NU6.3
Oscar-Pepper Jul 10, 2026
f9c64f9
Merge dev (PR #278 Ironwood/NU6.3) into the faucet branch
claude Jul 10, 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
12 changes: 11 additions & 1 deletion .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,14 @@ fail-fast = false

[profile.ci]
fail-fast = false
default-filter = 'not (test(zebra) | test(zaino))'
# These test binaries spawn real zcashd/zebrad/zainod/lightwalletd/devtool
# processes, which the CI image does not provide. Exclude by binary_id, not
# by test-name substring: name filters both missed binary-requiring tests
# with unconventional names and silently hid pure unit tests that happened
# to mention a binary in their name.
default-filter = '''
not (
binary_id(zcash_local_net::integration)
| binary_id(regtest-launcher::e2e)
)
'''
9 changes: 4 additions & 5 deletions .github/workflows/ci-pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,18 @@ jobs:
- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Install just
uses: extractions/setup-just@v2

- name: Install cargo-binstall
uses: taiki-e/install-action@v2
with:
tool: cargo-binstall

- name: Install cargo-check-external-types
run: cargo binstall cargo-check-external-types -y --force
# Pinned to match PINNED_NIGHTLY in workbench/src/main.rs (nightly-2025-10-18,
# rustdoc JSON format 56). 0.5.0 requires format 57; bump both together.
run: cargo binstall cargo-check-external-types@0.4.0 -y --force

- name: Run checks
run: just check-external-types
run: cargo +nightly-2025-10-18 run --release -p workbench -- check-external-types

reject-trailing-whitespace:
uses: ./.github/workflows/trailing-whitespace.yaml
Expand Down
8 changes: 1 addition & 7 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,13 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v6

- name: create binaries dir
run: mkdir -p ./test_binaries/bins

- name: Symlink lightwalletd and zcash binaries
run: ln -s /usr/bin/lightwalletd /usr/bin/zcashd /usr/bin/zcash-cli ./test_binaries/bins/

- name: Download archive
uses: actions/download-artifact@v6
with:
name: nextest-archive

- name: Run tests
run: |
cargo nextest run --verbose --profile ci --retries 2 -E 'not binary_id(regtest-launcher::e2e)' --archive-file nextest-archive.tar.zst \
cargo nextest run --verbose --profile ci --retries 2 --archive-file nextest-archive.tar.zst \
--workspace-remap ./ ${{ env.NEXTEST-FLAGS }}

5 changes: 4 additions & 1 deletion .github/workflows/trailing-whitespace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v6

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Reject trailing whitespace
run: ./utils/trailing-whitespace.sh reject
run: cargo run --release -p workbench -- trailing-whitespace reject
10 changes: 10 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
This file collects conventions that AI contributors (and humans
reviewing AI-authored work) should apply to PRs in this repository.

## 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. 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.

## Code-review checklist: bugs Rust won't catch

Memory-safety guarantees and the type system catch a lot, but the
Expand Down
93 changes: 93 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# infras

Test infrastructure for the Zcash ecosystem: harnesses that launch and drive
local Zcash networks (validators, indexers, clients) for integration testing.

## Language

**Validator**:
A full-node process that maintains chain state and serves the node RPC
(zebrad, or legacy zcashd).
_Avoid_: node, daemon, full node

**Indexer**:
A process that consumes a Validator's data and serves the light-client
gRPC protocol (zainod, or legacy lightwalletd).
_Avoid_: proxy, server

**Wallet**:
A light-client process the harness manages alongside the Validator and
Indexer: restored from a seed, synced through an Indexer, driven to
send and shield, and queried for balances and addresses. The harness
actuates every Wallet through one generic interface; each
implementation lives with its own binary (zcash-devtool, zingo-cli).
_Avoid_: client (the superseded name), lightclient

**Legacy stack**:
zcashd (Validator) and lightwalletd (Indexer). Opt-in only, scheduled for
simultaneous removal; neither is part of the harness's future.
_Avoid_: deprecated components, old stack

**Core stack**:
zebrad (Validator) and zainod (Indexer) — the components the harness is
built around and that survive Legacy-stack removal.
_Avoid_: new stack, default stack

**Compatibility conf**:
The `zcash.conf`-format file lightwalletd parses to discover its backend
Validator. Owned by the Legacy stack: zcashd uses it as its own process
config, and zebrad produces one only to serve lightwalletd. Dies with the
Legacy stack.
_Avoid_: zcashd config (when the lightwalletd-facing file is meant)

**Devtool contract**:
The behavioral interface the harness relies on from the zcash-devtool
binary: its CLI surface, its output formats, and the activation-heights
schema. A process boundary pinned by tests against the real binary — never
a Cargo dependency.
_Avoid_: devtool API, devtool dependency

**Canonical heights**:
The single regtest activation-heights shape the harness ships as its
default for launching Validators, validates, and golden-tests: every
network upgrade the Devtool contract knows about activates at height 2.
Exactly one shape exists per release; it advances in lockstep when a new
upgrade is adopted, and older shapes live only in older releases. Any
other shape is configured on the Validator alone; every other component
receives [[Validator heights]].
_Avoid_: all-at-2 (informal), custom heights, partial activation

**Front**:
The transparent TCP relay that is the canonical public endpoint of one
Backend listener. It binds `127.0.0.1:0` before the Backend starts,
every published port and address accessor returns it, and the
Backend's real endpoint is never published — so all clients, the
harness's own launch-time clients included, cross the Front for the
Backend's entire networked lifetime. A Front carries at most one
registered observer; with none it is pure passthrough.
_Avoid_: proxy (bare), tap (the observer is the tap; the Front is the
endpoint)

**Backend**:
A managed network service as the Front machinery sees it: start/stop
lifecycle, log access for readiness parsing, and — once ready — raw
listener endpoints as socket addresses. Processes are the only
implementation today; the contract deliberately fits a future
container whose endpoints are published host mappings.
_Avoid_: process (when the abstraction is meant), node

**Indexer convergence**:
The moment the Indexer's view of the chain includes the Validator's
tip. Mining returns as soon as the Validator has the blocks; the
Indexer catches up on its own cadence, so anything that reads through
the Indexer right after mining must wait for convergence rather than
poll around the gap.
_Avoid_: indexer catch-up, tip lag (as names for the barrier)

**Validator heights**:
Activation heights whose provenance is a query of the running Validator —
the only form in which any non-Validator component may hold regtest
heights. The Validator is configured with heights exactly once, at
launch; the Indexer and the wallet client derive theirs from it, and
supplying heights to those components by hand is unrepresentable.
_Avoid_: provider heights, custom heights, caller heights
Loading
Loading