Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
melonask avatar

Ladon

  • 2 installs
  • 1 repo stars
  • Updated July 14, 2026
  • melonask/ladon

Derives multi-chain HD wallet addresses for EVM, Bitcoin, and Solana, manages encrypted wallets, and runs an address-pool daemon via a Rust CLI.

About

A multi-chain HD wallet CLI, Rust library, and address-pool daemon supporting EVM, Bitcoin, and Solana with BIP-32/44 and SLIP-0010 derivation. A developer uses it to derive addresses, generate mnemonics, run watch-only xpub workflows, or manage a persistent address pool.

  • derive, decrypt, and pool sub-commands with TOML config
  • BIP-39 mnemonics and batch multi-chain address generation

Ladon by the numbers

  • 2 all-time installs (skills.sh)
  • Ranked #408 of 479 Web3 & Blockchain skills by installs in the Skillselion catalog
  • Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/melonask/ladon --skill ladon

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs2
repo stars1
Last updatedJuly 14, 2026
Repositorymelonask/ladon

What it does

Derives multi-chain HD wallet addresses for EVM, Bitcoin, and Solana, manages encrypted wallets, and runs an address-pool daemon via a Rust CLI.

Files

SKILL.mdMarkdownGitHub ↗

Ladon — Multi-Chain HD Wallet

Like the hundred-headed serpent of Greek myth, Ladon generates as many addresses as you need.

Ladon is a fast, minimal, multi-chain HD wallet CLI, Rust library, and address-pool daemon. It supports EVM, Bitcoin, and Solana chains with BIP-32/44 and SLIP-0010 derivation.

Install

cargo install ladon

Modes

Ladon has three sub-commands:

Sub-commandPurpose
deriveDerive one or more addresses and print to stdout
decryptDecrypt an encrypted wallet file
poolRun the address-pool daemon (requires [database] in config)

---

CLI Usage

Configuration

All settings live in Config.toml (or any path passed with --config / -C). Per-flag overrides are available on derive for ad-hoc use.

ladon --config /etc/ladon/Config.toml pool

Derive

Output goes to stdout; redirect it to whatever format you need:

# JSON (default) — pipe or redirect
ladon derive --chain evm --num 5
ladon derive --chain evm --num 20 > wallet.json

# CSV
ladon derive --chain evm --num 20 --format csv > wallet.csv

# Plain text (one address per line)
ladon derive --chain solana --num 10 --format text > addresses.txt

# Encrypted output
ladon derive --chain evm --num 5 --encrypt --password "secret" > wallet.enc

# Bitcoin from existing mnemonic
ladon derive --chain btc --mnemonic "word1 ... word12"

# Specific indexes or ranges
ladon derive --chain evm --indexes "0,5,22-44,55,66-109"

# Watch-only from xpub
ladon derive --chain evm --xpub xpub6C...

# From xpriv
ladon derive --chain evm --xpriv xprv9s...
Key Flags
FlagDefaultDescription
--chain / -cevmevm, btc, solana
--num / -n1Number of addresses
--index / -iSingle specific index
--indexesComma-separated indexes/ranges
--account0BIP-44 account
--change0BIP-44 change
--networkbitcoinBitcoin network
--passphrase""BIP-39 passphrase
--strength / -s12Mnemonic word count
--solana-modefullfull, cold-export, hsm-sim, pda
--program-idBase58 program ID for PDA mode
--xpubWatch-only from xpub
--xprivDerive from xpriv
--format / -fjsonjson, csv, text
--encryptfalseEncrypt output
--passwordEncryption password

Decrypt

ladon decrypt wallet.enc --password "secret"
ladon decrypt wallet.enc --password "secret" > wallet.json

---

Address-Pool Daemon

The pool sub-command runs a long-lived service that:

1. Connects to a SQLite or Postgres database. 2. Polls the pool table on a configurable interval. 3. Derives and inserts new addresses when the count drops below [pool].threshold. 4. Keeps the total at [pool].target addresses per chain.

Your application removes rows from the pool table as it assigns addresses to users.

Example Config.toml (pool mode)

# ── Derivation ──────────────────────────────────────────────────────────────────
[derive]

# How to obtain the master secret.  Supported "kind" values:
#   "env"        — mnemonic from an environment variable
#   "xpriv_env"  — raw hex xpriv from an environment variable
#   "file"       — mnemonic read from a plain-text file
[derive.secret]
kind = "env"
var  = "LADON_MNEMONIC"
# Optional: BIP-39 passphrase read from a separate env var
# passphrase_var = "LADON_PASSPHRASE"

# One [[derive.chains]] section per blockchain.
[[derive.chains]]
name    = "evm"
account = 0
change  = 0

[[derive.chains]]
name        = "solana"
account     = 0
change      = 0
solana_mode = "cold-export"   # "full" | "cold-export" | "hsm-sim" | "pda"
# program_id = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"

# [[derive.chains]]
# name    = "btc"
# account = 0
# change  = 0
# network = "bitcoin"   # "bitcoin" | "testnet" | "signet" | "regtest"

# ── Pool daemon ─────────────────────────────────────────────────────────────────
[pool]
target        = 1000   # keep this many addresses in the pool at all times
threshold     = 200    # start refilling when the count drops below this
batch         = 100    # derive this many at a time
interval_secs = 10     # poll the database every N seconds

# ── Database — SQLite ───────────────────────────────────────────────────────────
[database.sqlite]
path = "data/addresses.db"

[database.sqlite.table]
name = "derived_addresses"

[database.sqlite.table.columns]
id         = "id"
chain      = "chain"
address    = "address"
path       = "path"
index      = "index"
created_at = "created_at"

# ── Database — Postgres (comment out the sqlite section above if using this) ────
# [database.postgres]
# url      = "postgres://user:password@localhost:5432/ladon"
# # Alternatively, set the env var DATABASE_URL and omit `url` here.
# # url_env  = "DATABASE_URL"
# pool_size = 5
#
# [database.postgres.table]
# name = "derived_addresses"
#
# [database.postgres.table.columns]
# id         = "id"
# chain      = "chain"
# address    = "address"
# path       = "path"
# index      = "index"
# created_at = "created_at"

---

Docker

# Build and start the pool daemon with Postgres
docker compose -f deploy/docker-compose.yml up -d

Set LADON_MNEMONIC and DATABASE_URL in the environment or in deploy/.env. The container uses restart: unless-stopped so it recovers automatically.

Systemd (bare-metal)

sudo cp deploy/ladon.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now ladon

Store secrets in /etc/ladon/env:

LADON_MNEMONIC=word1 word2 ... word12
DATABASE_URL=postgres://ladon:secret@localhost/ladon
RUST_LOG=ladon=info

---

Library Usage (Rust)

use ladon::{derive, decrypt_data, encrypt_data, Params, WalletOutput};

let wallet: WalletOutput = derive(Params {
    chain: "evm".into(),
    num: 5,
    ..Default::default()
})?;

for key in &wallet.keys {
    println!("{}: {}", key.index, key.address);
}

---

Chains and Derivation Paths

ChainDefault path
EVMm/44'/60'/0'/0/*
Bitcoinm/44'/0'/0'/0/*
Solanam/44'/501'/0'/0' (hardened, SLIP-0010)

---

Security Notes

  • Private keys are zeroized on drop.
  • Use --solana-mode cold-export or --encrypt when storing derive output.
  • --password on the CLI is visible in shell history; prefer environment-specific secret management (LADON_MNEMONIC, vault agents, etc.) in automation.
  • Ed25519 derivation follows SLIP-0010 (all path segments hardened).
  • In the pool daemon, the mnemonic is never written to disk — it lives only in the process environment.

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.