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.
exportprints 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d84c716c0dc316cb9cc92996dbab8a4549651314d213ff0bc5b30811b70454bc
|
|
| MD5 |
24de67a01243498308921db69806446a
|
|
| BLAKE2b-256 |
c6435c18c01e7a7c56c013606ee916b69e48c0c3ebb728be38783ebccc6dfc51
|
Provenance
The following attestation bundles were made for crypto_wallet_manager-0.1.0.tar.gz:
Publisher:
publish.yml on RKursatV/crypto-wallet-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crypto_wallet_manager-0.1.0.tar.gz -
Subject digest:
d84c716c0dc316cb9cc92996dbab8a4549651314d213ff0bc5b30811b70454bc - Sigstore transparency entry: 2852401694
- Sigstore integration time:
-
Permalink:
RKursatV/crypto-wallet-manager@d7e96fc29bd495830ed57b12c96038caee6c52af -
Branch / Tag:
refs/heads/main - Owner: https://github.com/RKursatV
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d7e96fc29bd495830ed57b12c96038caee6c52af -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file crypto_wallet_manager-0.1.0-py3-none-any.whl.
File metadata
- Download URL: crypto_wallet_manager-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a660a002c34c305c486d9b7d59e9459665ec89e99d081002da63d50f921ada00
|
|
| MD5 |
609b40bc2b20f9590e619b47cbf7f9a3
|
|
| BLAKE2b-256 |
5468478a917da79b032dc136214d038a39e02619ddd4530e8feb2afa1baae7d7
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crypto_wallet_manager-0.1.0-py3-none-any.whl -
Subject digest:
a660a002c34c305c486d9b7d59e9459665ec89e99d081002da63d50f921ada00 - Sigstore transparency entry: 2852401756
- Sigstore integration time:
-
Permalink:
RKursatV/crypto-wallet-manager@d7e96fc29bd495830ed57b12c96038caee6c52af -
Branch / Tag:
refs/heads/main - Owner: https://github.com/RKursatV
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d7e96fc29bd495830ed57b12c96038caee6c52af -
Trigger Event:
workflow_dispatch
-
Statement type: