Skip to main content

crypto-wallet-manager

A local CLI for managing crypto wallets: generate BIP39 HD wallets, derive Bitcoin (native segwit, BIP84) and Ethereum (BIP44) addresses, keep secrets encrypted at rest, and check on-chain balances via public APIs.

It deliberately does not sign or send transactions — it manages keys and watches balances only.

Install

Requires Python 3.10+.

pipx install crypto-wallet-manager    # from PyPI; puts `wallet-manager` on PATH
# or, from a checkout:
pipx install .

For development, or to run it without installing:

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt   # exact pinned versions
.venv/bin/python wallet_manager.py --help

Usage

wallet-manager create savings              # generate a new 24-word wallet
wallet-manager create hot --words 12       # 12-word variant
wallet-manager list                        # names + addresses (no password needed)
wallet-manager balance                     # on-chain balances for all wallets
wallet-manager balance savings             # ... or just one
wallet-manager show savings                # details incl. derivation paths
wallet-manager import old-wallet           # import an existing recovery phrase
wallet-manager import mm --eth-private-key # import a raw ETH private key
wallet-manager export savings              # reveal the recovery phrase (guarded)
wallet-manager export savings --eth-key    # reveal derived ETH private key (guarded)
wallet-manager delete old-wallet           # remove a wallet (password + typed confirmation)
wallet-manager change-password             # re-encrypt keystore with a new password
wallet-manager verify                      # prove stored addresses match their secrets

The first create/import asks you to set a master password for the keystore. Every command that touches or destroys secret material asks for it again; list, show, and balance never need it.

create prints the new recovery phrase only when stdout is a terminal, so it never lands in a log file or pipe by accident. Write it on paper.

Where things live

The keystore is a single JSON file (default ~/.crypto-wallet-manager/wallets.json, permissions 0600, written atomically). Override the location with --file <path> or $WALLET_MANAGER_FILE.

Wallet names and public addresses are plaintext; recovery phrases / private keys are encrypted with Fernet (AES-128-CBC + HMAC-SHA256). scrypt (N=2¹⁷, r=8, p=1 — the OWASP minimum, ~128 MiB and about half a second per unlock) stretches your master password into 64 bytes: half becomes the Fernet key, half an HMAC key that seals every wallet record, ciphertext included.

That seal means anyone who edits the file — to swap your deposit addresses for theirs, swap secrets between wallets, add or rename a wallet — is caught the next time you enter your password, and a keystore whose seal is missing is refused outright. list and balance skip the password, so they can't check the seal — if the file has been somewhere you don't trust, run verify, which additionally re-derives every address from its decrypted secret.

Derivation paths: ETH m/44'/60'/0'/0/0, BTC m/84'/0'/0'/0/0. These are the standard first-account paths, so any generated wallet can be restored in MetaMask, Sparrow, Electrum, Ledger, etc. from its phrase.

Balance sources: ethereum-rpc.publicnode.com (JSON-RPC) and blockstream.info (REST). Only your public addresses are sent to these services. balance exits non-zero if any lookup fails.

Limitations

  • One address per wallet per chain (account 0, index 0). Funds received on other addresses of the same seed are not shown by balance.
  • No BIP39 passphrase ("25th word") support.
  • English BIP39 word list only.
  • Keystores written by pre-release builds (format v1/v2) are not read. Recreate the keystore by importing each wallet from its recovery phrase.

Automation

$WALLET_MANAGER_PASSWORD (and $WALLET_MANAGER_NEW_PASSWORD for change-password) bypass the interactive prompts — meant for scripts and tests. When stdin is not a terminal, import reads the phrase or key from it, and export/delete read their confirmation from it. Don't put your real master password in shell history or dotfiles.

Security notes

  • Write recovery phrases on paper. The encrypted file protects against casual file theft, not against a compromised machine or a weak password.
  • export prints secrets to the terminal — clear scrollback afterwards.
  • This is a hot-wallet tool; keep meaningful funds on hardware wallets.

Development

pip install -e ".[dev]"
ruff check .
pytest

The tests never touch ~/.crypto-wallet-manager; they run against temporary keystores with a lowered scrypt cost. Known-answer vectors cover BIP39 → BIP44/BIP84 derivation, and the tamper tests mutate the keystore JSON directly.

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crypto_wallet_manager-0.1.0.tar.gz (15.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crypto_wallet_manager-0.1.0-py3-none-any.whl (12.2 kB view details)

Uploaded Python 3

File details

Details for the file crypto_wallet_manager-0.1.0.tar.gz.

File metadata

  • Download URL: crypto_wallet_manager-0.1.0.tar.gz
  • Upload date:
  • Size: 15.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for crypto_wallet_manager-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d84c716c0dc316cb9cc92996dbab8a4549651314d213ff0bc5b30811b70454bc
MD5 24de67a01243498308921db69806446a
BLAKE2b-256 c6435c18c01e7a7c56c013606ee916b69e48c0c3ebb728be38783ebccc6dfc51

See more details on using hashes here.

Provenance

The following attestation bundles were made for crypto_wallet_manager-0.1.0.tar.gz:

Publisher: publish.yml on RKursatV/crypto-wallet-manager

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crypto_wallet_manager-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for crypto_wallet_manager-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a660a002c34c305c486d9b7d59e9459665ec89e99d081002da63d50f921ada00
MD5 609b40bc2b20f9590e619b47cbf7f9a3
BLAKE2b-256 5468478a917da79b032dc136214d038a39e02619ddd4530e8feb2afa1baae7d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for crypto_wallet_manager-0.1.0-py3-none-any.whl:

Publisher: publish.yml on RKursatV/crypto-wallet-manager

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page