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 buildYou 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.zigYou can directly use devbox to create a complete dev environment. Check devbox.json and devbox docs for more information.
devbox shellIn order to get a shell with all the tools you need to contribute to this project you can run
direnv allowThis 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 checkwill 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 -aCheck 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 btcnodeEnter inside the btcnode container:
docker exec -ti btcnode bashThe 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>From outside the container, one can communicate with the btcnode via RPC.
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)
- Electrum Server
- Seed Signer
- Lightning Network
- TUI
- Multisig Wallet
- Taproot
- Legacy Wallet
Join WALL•E's Discord channel to chat with the contributors and understand next steps, available tasks and bugs to be fixed.