{"id":50490875,"url":"https://github.com/melonask/ladon","last_synced_at":"2026-06-02T02:31:19.512Z","repository":{"id":361446341,"uuid":"1253940037","full_name":"melonask/ladon","owner":"melonask","description":"Fast, minimal, multi-chain HD wallet CLI and library — EVM, Bitcoin, Solana.","archived":false,"fork":false,"pushed_at":"2026-05-30T18:09:08.000Z","size":91,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T18:14:41.668Z","etag":null,"topics":["arbitrum","base","bitcoin","ethereum","evm","evm-blockchain","hd-wallet","hd-wallet-generator","hdwallet","polygon","solana"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/ladon","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/melonask.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-30T00:57:06.000Z","updated_at":"2026-05-30T18:08:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/melonask/ladon","commit_stats":null,"previous_names":["melonask/ladon"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/melonask/ladon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melonask%2Fladon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melonask%2Fladon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melonask%2Fladon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melonask%2Fladon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/melonask","download_url":"https://codeload.github.com/melonask/ladon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melonask%2Fladon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33803734,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arbitrum","base","bitcoin","ethereum","evm","evm-blockchain","hd-wallet","hd-wallet-generator","hdwallet","polygon","solana"],"created_at":"2026-06-02T02:31:18.547Z","updated_at":"2026-06-02T02:31:19.503Z","avatar_url":"https://github.com/melonask.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ladon\n\n\u003cimg align=\"right\" src=\"https://raw.githubusercontent.com/melonask/ladon/refs/heads/main/logo.svg\" alt=\"Fast, minimal, multi-chain HD wallet CLI and library — EVM, Bitcoin, Solana\" width=\"160\" /\u003e\n\n\u003e *Like the hundred-headed serpent of Greek myth, Ladon generates as many addresses as you need.*\n\nFast, minimal, multi-chain HD wallet CLI, library, and address-pool daemon — EVM, Bitcoin, Solana.\n\n---\n\n## Install\n\n```sh\ncargo install ladon\n```\n\n---\n\n## Modes\n\nladon has three sub-commands:\n\n| Sub-command | Purpose |\n|-------------|---------|\n| `derive`    | Derive one or more addresses and print to stdout |\n| `decrypt`   | Decrypt an encrypted wallet file |\n| `pool`      | Run the address-pool daemon (requires `[database]` in config) |\n\n---\n\n## CLI\n\n### Configuration file\n\nAll settings live in `Config.toml` (or any path passed with `--config`/`-C`).\nPer-flag overrides are available on `derive` for ad-hoc use.\n\n```sh\nladon --config /etc/ladon/Config.toml pool\n```\n\nSee [Config.toml](./Config.toml) for a fully annotated example.\n\n---\n\n### Derive\n\nOutput goes to stdout. Redirect it to whatever format you need:\n\n```sh\n# JSON (default) — pipe or redirect\nladon derive --chain evm --num 5\nladon derive --chain evm --num 20 \u003e wallet.json\n\n# CSV\nladon derive --chain evm --num 20 --format csv \u003e wallet.csv\n\n# Plain text (one address per line)\nladon derive --chain solana --num 10 --format text \u003e addresses.txt\n\n# Encrypted output\nladon derive --chain evm --num 5 --encrypt --password \"secret\" \u003e wallet.enc\n\n# Bitcoin from existing mnemonic\nladon derive --chain btc --mnemonic \"word1 ... word12\"\n\n# Specific indexes or ranges\nladon derive --chain evm --indexes \"0,5,22-44,55,66-109\"\n\n# Watch-only from xpub\nladon derive --chain evm --xpub xpub6C...\n\n# From xpriv\nladon derive --chain evm --xpriv xprv9s...\n```\n\n#### Key flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--chain` / `-c` | `evm` | `evm`, `btc`, `solana` |\n| `--num` / `-n` | `1` | Number of addresses |\n| `--index` / `-i` | — | Single specific index |\n| `--indexes` | — | Comma-separated indexes/ranges |\n| `--account` | `0` | BIP-44 account |\n| `--change` | `0` | BIP-44 change |\n| `--network` | `bitcoin` | Bitcoin network |\n| `--passphrase` | `\"\"` | BIP-39 passphrase |\n| `--strength` / `-s` | `12` | Mnemonic word count |\n| `--solana-mode` | `full` | `full`, `cold-export`, `hsm-sim`, `pda` |\n| `--program-id` | — | Base58 program ID for PDA mode |\n| `--xpub` | — | Watch-only from xpub |\n| `--xpriv` | — | Derive from xpriv |\n| `--format` / `-f` | `json` | `json`, `csv`, `text` |\n| `--encrypt` | false | Encrypt output |\n| `--password` | — | Encryption password |\n\n### Decrypt\n\n```sh\nladon decrypt wallet.enc --password \"secret\"\nladon decrypt wallet.enc --password \"secret\" \u003e wallet.json\n```\n\n---\n\n## Address-pool daemon\n\nThe `pool` sub-command runs a long-lived service that:\n\n1. Connects to a SQLite or Postgres database.\n2. Polls the pool table on a configurable interval.\n3. Derives and inserts new addresses when the count drops below `[pool].threshold`.\n4. Keeps the total at `[pool].target` addresses per chain.\n\nYour application removes rows from the pool table as it assigns addresses to users.\n\n### Example Config.toml (pool mode)\n\n```toml\n[derive.secret]\nkind = \"env\"\nvar  = \"LADON_MNEMONIC\"\n\n[[derive.chains]]\nname = \"evm\"\n\n[pool]\ntarget        = 1000\nthreshold     = 200\nbatch         = 100\ninterval_secs = 10\n\n[database.sqlite]\npath = \"data/addresses.db\"\n\n[database.sqlite.table]\nname = \"derived_addresses\"\n\n[database.sqlite.table.columns]\nid         = \"id\"\nchain      = \"chain\"\naddress    = \"address\"\npath       = \"path\"\nindex      = \"index\"\ncreated_at = \"created_at\"\n```\n\n---\n\n## Docker\n\nPublished images are available from GitHub Container Registry. The image does\nnot include a config file. Mount your environment-specific `Config.toml` at\nruntime and provide secrets through environment variables.\n\n```sh\ndocker run --rm \\\n  -e LADON_MNEMONIC=\"word1 word2 ... word12\" \\\n  -e DATABASE_URL=\"postgres://user:password@host:5432/ladon\" \\\n  -v \"$PWD/Config.toml:/app/Config.toml:ro\" \\\n  ghcr.io/melonask/ladon:latest\n```\n\nFor SQLite-backed pool mode, also mount a writable data directory:\n\n```sh\ndocker run --rm \\\n  -e LADON_MNEMONIC=\"word1 word2 ... word12\" \\\n  -v \"$PWD/Config.toml:/app/Config.toml:ro\" \\\n  -v \"$PWD/data:/app/data\" \\\n  ghcr.io/melonask/ladon:latest\n```\n\nThe default container command is `pool`. Override it to run other commands:\n\n```sh\ndocker run --rm ghcr.io/melonask/ladon:latest derive --chain evm --num 5\ndocker run --rm \\\n  -v \"$PWD/prod.toml:/config/Config.toml:ro\" \\\n  ghcr.io/melonask/ladon:latest --config /config/Config.toml pool\n```\n\n```sh\n# Start the pool daemon with Postgres using deploy/docker-compose.yml\nexport LADON_IMAGE=\"ghcr.io/melonask/ladon:latest\"\ndocker compose -f deploy/docker-compose.yml up -d\n```\n\nSet `LADON_IMAGE` and `LADON_MNEMONIC` in the environment or in `deploy/.env`.\nThe compose file points `DATABASE_URL` at its bundled Postgres service. Edit it\nif you want to use an external database.\nThe container uses `restart: unless-stopped` so it recovers automatically.\n\n---\n\n## Systemd (bare-metal)\n\n```sh\nsudo cp deploy/ladon.service /etc/systemd/system/\nsudo systemctl daemon-reload\nsudo systemctl enable --now ladon\n```\n\nStore secrets in `/etc/ladon/env`:\n\n```\nLADON_MNEMONIC=word1 word2 ... word12\nDATABASE_URL=postgres://ladon:secret@localhost/ladon\nRUST_LOG=ladon=info\n```\n\n---\n\n## Library\n\n```rust\nuse ladon::{derive, decrypt_data, encrypt_data, Params, WalletOutput};\n\nlet wallet: WalletOutput = derive(Params {\n    chain: \"evm\".into(),\n    num: 5,\n    ..Default::default()\n})?;\n\nfor key in \u0026wallet.keys {\n    println!(\"{}: {}\", key.index, key.address);\n}\n```\n\n---\n\n## Chains \u0026 derivation paths\n\n| Chain | Default path |\n|-------|-------------|\n| EVM | `m/44'/60'/0'/0/*` |\n| Bitcoin | `m/44'/0'/0'/0/*` |\n| Solana | `m/44'/501'/0'/0'` (hardened, SLIP-0010) |\n\n---\n\n## Security notes\n\n- Private keys are **zeroized on drop**.\n- Use `--solana-mode cold-export` or `--encrypt` when storing derive output.\n- `--password` on the CLI is visible in shell history. Prefer environment-specific\n  secret management (`LADON_MNEMONIC`, vault agents, etc.) in automation.\n- Ed25519 derivation follows **SLIP-0010** (all path segments hardened).\n- In the pool daemon, the mnemonic is never written to disk — it lives only\n  in the process environment.\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmelonask%2Fladon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmelonask%2Fladon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmelonask%2Fladon/lists"}