rename: aldabra → aldabra (per Sulkta 2026-05-04)

Aldabra giant tortoise (Aldabrachelys gigantea) — endemic to the
Aldabra atoll, up to 250 kg, 150-year lifespan. Long-lived,
defended, slow but unstoppable. Better metaphor for the wallet
than 'aldabra' which was on-the-tin descriptive.

All renames in one pass:
- repo: Sulkta-Coop/aldabra → Sulkta-Coop/aldabra (via gitea API)
- workspace dir: aldabra → aldabra
- crate dirs: wallet-{core,chain,mcp} → aldabra-{core,chain,mcp}
- crate names + path imports in Cargo.toml workspace + each crate
- binary name: aldabra → aldabra
- README, ROADMAP, docs/architecture: all references swept
This commit is contained in:
Sulkta 2026-05-04 10:11:23 -07:00
parent 56bcceb593
commit edc976e5d9
9 changed files with 39 additions and 34 deletions

View file

@ -1,9 +1,14 @@
# Cargo workspace root for aldabra. # Cargo workspace root for aldabra.
# #
# Three crates: # Three crates:
# wallet-core — key derivation, signing, types, mnemonic handling # aldabra-core — key derivation, signing, types, mnemonic handling
# wallet-chain — pluggable chain backends (Koios, Ogmios). Trait-first. # aldabra-chain — pluggable chain backends (Koios, Ogmios). Trait-first.
# wallet-mcp — binary; the MCP server, glues core+chain together. # aldabra-mcp — binary; the MCP server, glues core+chain together.
#
# Named for the Aldabra giant tortoise (Aldabrachelys gigantea) — endemic
# to the Aldabra atoll in the Seychelles, up to 250 kg, 150-year lifespan.
# Long-lived, defended, slow but unstoppable. Fitting metaphor for a
# wallet that holds your money.
# #
# Workspace deps are pinned here so all three crates use the same versions. # Workspace deps are pinned here so all three crates use the same versions.
# Add a dep here, then reference it in each crate's Cargo.toml as # Add a dep here, then reference it in each crate's Cargo.toml as
@ -11,9 +16,9 @@
[workspace] [workspace]
resolver = "2" resolver = "2"
members = [ members = [
"crates/wallet-core", "crates/aldabra-core",
"crates/wallet-chain", "crates/aldabra-chain",
"crates/wallet-mcp", "crates/aldabra-mcp",
] ]
[workspace.package] [workspace.package]

View file

@ -25,20 +25,20 @@ Three crates in a Cargo workspace:
| Crate | Responsibility | | Crate | Responsibility |
|---|---| |---|---|
| `wallet-core` | Pure crypto + types. Mnemonic → root key (CIP-3), root → payment + stake key (CIP-1852), address construction, signing. **No I/O, no network.** This is the security boundary. | | `aldabra-core` | Pure crypto + types. Mnemonic → root key (CIP-3), root → payment + stake key (CIP-1852), address construction, signing. **No I/O, no network.** This is the security boundary. |
| `wallet-chain` | Pluggable backends for chain queries. `ChainBackend` trait, with Koios as the phase-1 implementation. Ogmios + submission paths in phase 2. | | `aldabra-chain` | Pluggable backends for chain queries. `ChainBackend` trait, with Koios as the phase-1 implementation. Ogmios + submission paths in phase 2. |
| `wallet-mcp` | Binary. MCP server speaking stdio. Glues core + chain together, exposes tools to the LLM client. | | `aldabra-mcp` | Binary. MCP server speaking stdio. Glues core + chain together, exposes tools to the LLM client. |
``` ```
┌─────────────────────────────┐ ┌─────────────────────────────┐
LLM client │ wallet-mcp (bin) │ stdio LLM client │ aldabra-mcp (bin) │ stdio
─────────► │ tool handlers, lifecycle │ ────► ─────────► │ tool handlers, lifecycle │ ────►
└──────────┬──────────────────┘ └──────────┬──────────────────┘
┌────────┴────────┐ ┌────────┴────────┐
▼ ▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
wallet-core │ │ wallet-chain │ aldabra-core │ │ aldabra-chain │
│ keys, sign │ │ Koios/Ogmios │ │ keys, sign │ │ Koios/Ogmios │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
``` ```
@ -84,7 +84,7 @@ ci-runner build aldabra
# "aldabra": { # "aldabra": {
# "command": "/path/to/aldabra", # "command": "/path/to/aldabra",
# "env": { # "env": {
# "ALDABRA_DATA": "/path/to/wallet-data-dir" # "ALDABRA_DATA": "/mnt/cache/appdata/aldabra"
# } # }
# } # }
``` ```

View file

@ -1,4 +1,4 @@
# wallet-chain — pluggable backends for chain queries. # aldabra-chain — pluggable backends for chain queries.
# #
# A `ChainBackend` trait abstracts over Koios (HTTPS), Ogmios (WS/HTTP), # A `ChainBackend` trait abstracts over Koios (HTTPS), Ogmios (WS/HTTP),
# or any future option. Phase 1 ships with a Koios implementation since # or any future option. Phase 1 ships with a Koios implementation since
@ -7,7 +7,7 @@
# Submission paths land in phase 2. Read-only queries first. # Submission paths land in phase 2. Read-only queries first.
[package] [package]
name = "wallet-chain" name = "aldabra-chain"
version.workspace = true version.workspace = true
edition.workspace = true edition.workspace = true
license-file.workspace = true license-file.workspace = true

View file

@ -1,4 +1,4 @@
# wallet-core — pure crypto + types. No I/O, no network. Deterministic # aldabra-core — pure crypto + types. No I/O, no network. Deterministic
# given the same mnemonic + derivation path. # given the same mnemonic + derivation path.
# #
# This crate is intentionally narrow: # This crate is intentionally narrow:
@ -6,18 +6,18 @@
# - Root key → payment / stake key (CIP-1852 derivation) # - Root key → payment / stake key (CIP-1852 derivation)
# - Address construction (mainnet, testnet) # - Address construction (mainnet, testnet)
# - Transaction signing (given an unsigned TX builder output from # - Transaction signing (given an unsigned TX builder output from
# wallet-chain or pallas-txbuilder) # aldabra-chain or pallas-txbuilder)
# #
# It deliberately does NOT: # It deliberately does NOT:
# - Do any chain queries (that's wallet-chain's job) # - Do any chain queries (that's aldabra-chain's job)
# - Talk to MCP (that's wallet-mcp's job) # - Talk to MCP (that's aldabra-mcp's job)
# - Touch files (the daemon owns disk I/O; we get keys handed in) # - Touch files (the daemon owns disk I/O; we get keys handed in)
# #
# Rationale: this is the most security-sensitive crate. Keeping it # Rationale: this is the most security-sensitive crate. Keeping it
# narrow + I/O-free makes it auditable. # narrow + I/O-free makes it auditable.
[package] [package]
name = "wallet-core" name = "aldabra-core"
version.workspace = true version.workspace = true
edition.workspace = true edition.workspace = true
license-file.workspace = true license-file.workspace = true

View file

@ -1,4 +1,4 @@
# wallet-mcp — the binary. MCP server speaking stdio that exposes # aldabra-mcp — the binary. MCP server speaking stdio that exposes
# the wallet's tools to an LLM. Spawned as a subprocess from any MCP # the wallet's tools to an LLM. Spawned as a subprocess from any MCP
# client (e.g. Claude Code). # client (e.g. Claude Code).
# #
@ -6,7 +6,7 @@
# between core + chain crates. # between core + chain crates.
[package] [package]
name = "wallet-mcp" name = "aldabra-mcp"
version.workspace = true version.workspace = true
edition.workspace = true edition.workspace = true
license-file.workspace = true license-file.workspace = true
@ -18,8 +18,8 @@ name = "aldabra"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [dependencies]
wallet-core = { path = "../wallet-core" } aldabra-core = { path = "../aldabra-core" }
wallet-chain = { path = "../wallet-chain" } aldabra-chain = { path = "../aldabra-chain" }
tokio = { workspace = true } tokio = { workspace = true }
anyhow = { workspace = true } anyhow = { workspace = true }

View file

@ -6,7 +6,7 @@
//! ## Phase 1 tools //! ## Phase 1 tools
//! //!
//! - `wallet.address` — return the derived base address (placeholder //! - `wallet.address` — return the derived base address (placeholder
//! until wallet-core's CIP-1852 derivation lands) //! until aldabra-core's CIP-1852 derivation lands)
//! - `wallet.balance` — query balance via the configured chain backend //! - `wallet.balance` — query balance via the configured chain backend
//! //!
//! ## Phase 2-4 tools (TODO) //! ## Phase 2-4 tools (TODO)
@ -47,9 +47,9 @@ async fn main() -> Result<()> {
// For now: a smoke-test print so the binary actually does something // For now: a smoke-test print so the binary actually does something
// when invoked manually (not through MCP). // when invoked manually (not through MCP).
tracing::info!( tracing::info!(
target_address = %wallet_core::derive_base_address( target_address = %aldabra_core::derive_base_address(
&dummy_root_key()?, &dummy_root_key()?,
wallet_core::Network::Mainnet, aldabra_core::Network::Mainnet,
0, 0,
0, 0,
)?, )?,
@ -62,13 +62,13 @@ async fn main() -> Result<()> {
/// Phase 1 only — produces a zero-bytes RootKey so the placeholder /// Phase 1 only — produces a zero-bytes RootKey so the placeholder
/// address derivation runs. Will be deleted once real mnemonic loading /// address derivation runs. Will be deleted once real mnemonic loading
/// lands. /// lands.
fn dummy_root_key() -> Result<wallet_core::RootKey> { fn dummy_root_key() -> Result<aldabra_core::RootKey> {
// Need a way to construct one from this crate without exposing // Need a way to construct one from this crate without exposing
// private fields. Phase 1: temporary public constructor on // private fields. Phase 1: temporary public constructor on
// wallet-core, gated behind a #[cfg(test)] or feature flag and // aldabra-core, gated behind a #[cfg(test)] or feature flag and
// removed before phase 2. // removed before phase 2.
// //
// For tonight: this fn is a TODO marker — the smoke test won't // For tonight: this fn is a TODO marker — the smoke test won't
// actually run until we finish wallet-core::Mnemonic::into_root_key. // actually run until we finish aldabra-core::Mnemonic::into_root_key.
anyhow::bail!("phase 1 scaffold: real mnemonic loading not yet implemented") anyhow::bail!("phase 1 scaffold: real mnemonic loading not yet implemented")
} }

View file

@ -7,15 +7,15 @@ Deeper design notes than the README. Read this before extending.
The three-crate split exists to keep the security-sensitive code The three-crate split exists to keep the security-sensitive code
auditable in isolation. auditable in isolation.
- `wallet-core` — **no I/O.** Given a mnemonic + a derivation path, - `aldabra-core` — **no I/O.** Given a mnemonic + a derivation path,
produces keys + addresses + signatures. Deterministic, no produces keys + addresses + signatures. Deterministic, no
dependencies on tokio, reqwest, MCP, or anything that could dependencies on tokio, reqwest, MCP, or anything that could
introduce side channels. Easy to audit because it's narrow. introduce side channels. Easy to audit because it's narrow.
- `wallet-chain` — **all the I/O lives here.** Trait-first so the MCP - `aldabra-chain` — **all the I/O lives here.** Trait-first so the MCP
layer never knows whether it's talking to Koios, Ogmios, or a future layer never knows whether it's talking to Koios, Ogmios, or a future
backend. Future contributors swap implementations without touching backend. Future contributors swap implementations without touching
the security-sensitive crate. the security-sensitive crate.
- `wallet-mcp` — **the binary glue.** Owns process lifecycle, config - `aldabra-mcp` — **the binary glue.** Owns process lifecycle, config
loading, MCP transport, tool registration, error mapping. The loading, MCP transport, tool registration, error mapping. The
thinnest layer. thinnest layer.
@ -36,7 +36,7 @@ roughly in order:
`--dry-run` flag for any state-changing tool. `--dry-run` flag for any state-changing tool.
2. **Daemon process compromise.** If the wallet binary is exploited 2. **Daemon process compromise.** If the wallet binary is exploited
(e.g. via a malformed Koios response triggering memory corruption), (e.g. via a malformed Koios response triggering memory corruption),
the keys are at risk. Mitigations: keep `wallet-core` narrow the keys are at risk. Mitigations: keep `aldabra-core` narrow
(smaller attack surface), zeroize on drop, future: drop (smaller attack surface), zeroize on drop, future: drop
privileges + seccomp the daemon. privileges + seccomp the daemon.
3. **Disk read.** The encrypted mnemonic on disk could be exfiltrated. 3. **Disk read.** The encrypted mnemonic on disk could be exfiltrated.
@ -56,7 +56,7 @@ roughly in order:
First run: First run:
user pastes mnemonic at interactive prompt user pastes mnemonic at interactive prompt
wallet-mcp asks for an encryption passphrase aldabra-mcp asks for an encryption passphrase
age-encrypt the mnemonic phrase age-encrypt the mnemonic phrase