chia-peer 0.1.0

DIG Chia light-client connectivity: a wallet-protocol full-node client + ChainSource provider (dig-node seam 1)
Documentation
# chia-peer

DIG Chia light-client connectivity โ€” dig-node **seam 1**.

`chia-peer` lets a DIG node act as a Chia **wallet-protocol light client** (Sage-style): it connects
to Chia full nodes *as a client*, subscribes to coin-state and puzzle-hash state, tracks the peak,
handles reorgs, and submits spend bundles. It is a **thin wrapper** that configures and drives
[`chia-wallet-sdk`](https://crates.io/crates/chia-wallet-sdk) 0.34 โ€” the SDK already provides the
light-client `Peer`, the wallet-protocol wire, coin-state subscription, TLS, DNS-introducer
discovery, and transaction submission. This crate adds only DIG glue.

It exposes its read side through the ecosystem's canonical
[`dig-chainsource-interface`](https://crates.io/crates/dig-chainsource-interface) `ChainSource`
trait, so dig-node registers it as a provider via dependency injection.

## What it adds over the SDK

- **IPv6-first peer ordering** (CLAUDE.md ยง5.2): candidates are tried all-IPv6-first, IPv4 only as a
  fallback (`::1` before `127.0.0.1`).
- **Subscription cache**: coin-state and puzzle-hash subscriptions are tracked and their results
  cached, so reads answer from local state and reorgs roll the cache back correctly.
- **Fail-closed `ChainSource`**: a cache/subscribe miss falls back to a non-subscribing query;
  a transport or subscription-gap failure is an `Err`, **never** a false `Ok(None)`.
- **Typed spend submission** mapped onto a `SubmitOutcome` (not part of the reads-only `ChainSource`).

## Boundary (what it does NOT do)

- It does not reimplement the wallet protocol, TLS, or discovery โ€” those are the SDK's.
- It holds no keys and moves no value on its own; spend bundles are built and signed elsewhere and
  handed to `submit_spend`.
- It is not chia-query: chia-query is the aggregating coinset+peer read router; chia-peer is a single
  subscribing light-client provider. `chia-peer` has **no** dependency on chia-query.

## Usage

```rust,no_run
use chia_peer::{ChiaLightClient, ChiaPeerConfig};

# async fn demo() -> Result<(), Box<dyn std::error::Error>> {
let client = ChiaLightClient::connect(ChiaPeerConfig::mainnet()).await?;
let (height, header_hash) = client.peak().unwrap_or_default();
# Ok(())
# }
```

See [`SPEC.md`](./SPEC.md) for the normative contract (subscription model, peak/reorg semantics,
IPv6 order, the SDK reuse boundary, the `ChainSource` fail-closed mapping) and [`runbooks/`](./runbooks)
for release + local-run procedures.

## License

MIT