Seedelf-Wallet

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Repository Layout

This is a multi-language monorepo for Seedelf, a Cardano stealth wallet. Three top-level components:

The Rust code hardcodes the deployed contracts’ script hashes, reference UTxOs and reference outputs, per variant (seedelf-core’s constants.rs and references.rs). Variant 1 is what’s on chain and it’s frozen: commit 5b82530, built with Aiken v1.1.9 (see seedelf-contracts/README.md). The contracts’ current source, contracts/ and hashes/ are a later revision that was never deployed, so never copy hashes/ into the Rust constants. Changing validator code, the toolchain or the acabcafe random seed changes the hashes: putting that on chain is a new variant with its own reference UTxOs, added beside variant 1, never an edit to it.

Common Commands

Aiken contracts (seedelf-contracts/)

aiken check              # run all on-chain tests
aiken check -m <module>  # run tests in a specific module
./compile.sh             # full rebuild: aiken build + apply seed + emit plutus.json, contracts/, hashes/

compile.sh requires aiken, cardano-cli, python3, and the cbor2 python package. It bakes the seed acabcafe into each validator via aiken blueprint apply and writes the resulting script hashes to hashes/.

Rust workspace (seedelf-platform/)

Cargo workspace rooted at seedelf-platform/Cargo.toml. The workspace [patch.crates-io] section rewrites the inter-crate deps to local paths, so local edits propagate immediately — don’t remove this when bumping versions.

cargo build --release --bin seedelf-cli
cargo install --path seedelf-cli --bin seedelf-cli
cargo run -- help                    # run the CLI from the workspace root
cargo test -p <crate>                # run tests for one crate
cargo test -p seedelf-crypto <name>  # single test

Web wallet (seedelf-platform/seedelf-web-wallet/)

cd seedelf-platform/seedelf-web-wallet/extension
npm ci
npm run build       # wasm/build.sh, then Vite into dist/ (load it unpacked)
npm run typecheck
npm test            # Vitest
npm run e2e         # Playwright, on the built dist/

wasm/build.sh needs the toolchain seedelf-platform/rust-toolchain.toml pins (with wasm32-unknown-unknown), clang with a wasm32 backend, llvm-ar, and wasm-bindgen-cli at Cargo.lock’s version; it says what’s missing. CI is .github/workflows/web-wallet.yml. There’s no prettier config: don’t run a formatter. Everything else — the store package, live runs, the docs — starts at docs/development.md.

Data layer (seedelf-data/)

cd seedelf-data
cargo run -p seedelf-data-api                    # the API, with seedelf-data/.env (never committed)
cargo test                                       # offline; CI is .github/workflows/data-layer.yml
cargo test -- --ignored --test-threads=1         # the live tests, against home's services

seedelf-data/README.md is the API’s reference, and deploy/README.md the runbook for home and the VPS. Deploys go through .github/workflows/data-layer-deploy.yml alone: run by hand on main (deploy, rollback, status), and the owner approves each run. Never copy a binary to the VPS by hand. Home’s mainnet node is a stake pool’s relay: its own traffic never goes through the VPS.

Architecture

Crate boundaries (seedelf-platform/)

Dependency direction: cli → core, display, koios, crypto; seedelf-wasm → core, koios, crypto; core → crypto + koios; display → koios; koios → crypto. Crypto is the only leaf crate.

On-chain contracts (seedelf-contracts/)

Core protocol invariants

These constraints are load-bearing for correctness and safety — a mistake here can create permanently locked UTxOs (see README.md §Wallet Limitations):

Release & versioning

Two version lines, deliberately apart (the owner, 2026-09-29). Don’t align them.

Tagging: a web wallet tag must contain a /. .github/workflows/release.yml fires on tags matching *.*.* and builds, GPG-signs and publishes CLI binaries. A tag glob’s * matches anything but /, so v1.0.0 and seedelf-wallet-1.0.0 both match it and would ship a false CLI release. Use web-wallet/<version>, on the commit the uploaded zip was built from. None has been cut so far: a release’s commit and zip hash go in its handoff note instead (post-release-roadmap.md).