is_healthy is now true only if the block store is accessible and
has produced at least the genesis block.
Clients should poll chain_height twice with a delay to verify
the sequencer is making progress.
Refs #244
Previously check_health() always returned Ok(()) - completely useless.
Now returns HealthStatus { chain_height, is_healthy } so clients can:
1. Call check_health() once to get current chain_height
2. Wait a few seconds
3. Call again - if chain_height increased, sequencer is healthy
Refs #244
Previously check_health() always returned Ok(()) without checking
anything meaningful. A sequencer could be stuck and still pass.
Now check_health() returns the current chain height (BlockId).
Clients can call this twice with a delay to verify the chain is
progressing.
Refs #244
Introduce the ATA program, which derives deterministic per-token holding
accounts from (owner, token_definition) via SHA256, eliminating the need
to manually create and track holding account IDs.
Program (programs/associated_token_account/):
- Create, Transfer, and Burn instructions with PDA-based authorization
- Deterministic address derivation: SHA256(owner || definition) → seed → AccountId
- Idempotent Create (no-op if ATA already exists)
Wallet CLI (`wallet ata`):
- `address` — derive ATA address locally (no network call)
- `create` — initialize an ATA on-chain
- `send` — transfer tokens from owner's ATA to a recipient
- `burn` — burn tokens from owner's ATA
- `list` — query ATAs across multiple token definitions
Usage:
wallet deploy-program artifacts/program_methods/associated_token_account.bin
wallet ata address --owner <ID> --token-definition <DEF_ID>
wallet ata create --owner Public/<ID> --token-definition <DEF_ID>
wallet ata send --from Public/<ID> --token-definition <DEF_ID> --to <RECIPIENT> --amount 100
wallet ata burn --holder Public/<ID> --token-definition <DEF_ID> --amount 50
wallet ata list --owner <ID> --token-definition <DEF1> <DEF2>
Includes tutorial: docs/LEZ testnet v0.1 tutorials/associated-token-accounts.md