Wall•E is a Bitcoin Wallet written in Zig.
WARNING: Do not use this project with real BTC. It is not secure (yet)! The cryptographic part is built from scratch and it is not audited.
This project will produce 3 executables:
- walle: Bitcoin wallet CLI.
- indexer: This is the bitcoin blockchain indexer. It will only saves locally (in an sqlite db) the relevant transactions/outputs/inputs.
- wbx: Command line utility for Bitcoin (the name is inspired by libbitcoin-explorer)
zig build
You can also specify --release=<release mode>
. Check the Zig Docs for more information.
zig build test
zig build test --summary all -- src/bip39/bip39.zig src/bip38/bip38.zig
You can directly use devbox to create a complete dev environment. Check devbox.json and devbox docs for more information.
devbox shell
In order to get a shell with all the tools you need to contribute to this project you can run
direnv allow
This will enable the direnv
environment that will automatically makes you enter the development shell every time you enter the project directory (or any subdirectory). This uses nix (with flakes) and direnv.
This command
nix flake check
will run regular checks of the flake, in particular it will run git hooks.
This runs in the GHA flake-check
job.
The nix
shell will install the git hooks automatically.
The pre-commit configuration .pre-commit-config.yaml
is git-ignored because it will be a simple
link to the /nix/store
: the semantic is not changing but the location can differ from different
machines/configuration.
You can manually trigger the hooks on all files:
pre-commit run -a
Check the --help
for more usages.
walle needs a bitcoin-core node. You can run one using the Dockerfile. The configuration is defined in node/bitcoin.conf and it is used to create a regtest network.
docker build -t btcnode .
docker volume create btcnode
docker run --rm --name btcnode -v btcnode:/bitcoin-25.0/data -p 18444:18443 btcnode
The first time you run the node you need to create a new wallet (it is no longer created automatically, if the walle was already created use loadwallet) then you can getnewaddress and mine some blocks.
bitcoin-cli -rpcuser=walle -rpcpassword=password -rpcport=18443 createwallet walle
bitcoin-cli -rpcuser=walle -rpcpassword=password -rpcport=18443 getnewaddress
bitcoin-cli -rpcuser=walle -rpcpassword=password -rpcport=18443 generatetoaddress <nblocks> <address>
Walle uses rpc to communicate with bitcoin-core. Ex:
curl --verbose -L --user walle --data-binary '{"jsonrpc": "1.0", "id": "walle", "method": "getblockchaininfo", "params": []}' -H 'content-type: text/plain;' 0.0.0.0:18444
- Crypto (secp256k1, ecdsa signatures, ripemd160, bech32). Everything is built from scratch.
- Bip39 (Mnemonic generation)
- Bip32 (HD Wallets)
- BIP38 (Encrypting Bitcoin Private Key)
- Bip44
- Serialized Extendend Private/Public Key
- BTC core rpc integration
- Indexer
- Addresses
- Segwit
- Transactions (create/sign/broadcast)
- Support Legacy Wallet
- Support Script Hash (P2SH, P2WSH)
- Multisig Wallet
- Taproot
- Export private key
- Secure signature from hardware wallet
Join WALL•E's Discord channel to chat with the contributors and understand next steps, available tasks and bugs to be fixed.