* settings * fix name settings * management rpc * hook up the RPC server * working * format * update build script fix import error * remove accidental commit of vscode extension data * working ✔ * \n * add get mint quote get melt quote * gRPC cli update quotes commands * update mint melt quotes from cli * comment under get cli command group * keyset rotation not yet implemented * try fix * change back contact info default to be empty list * fix import * add server mTLS * ll * script for generating certificates * rename settings * move generation script * do not save TTL expiry into Cache object, rather always load from settings. * update lightning fees * update auth limits * auth rate limit cli * optional arguemnts * better error messages * tests for db update mint/melt quotes * start mint rpc tests * add tos_url field to get-info grpc response * format checks * add types to click groups where it's needed * tests on updating quotes * fix tests * skip updating mint quote state if on regtest * test edge case * unified test_add_remove_contact * mark pytest-asyncio * fix missing db argument * hopefully no more silly errors * fix test_db_update_mint_quote_state * pass in the quote id string. * add keyset rotation * test for keyset rotation through gRPC command * fix logger warning * remove rotation test because it breaks other tests * use different bolt11 invoices * assert returned melt quote has quote * is_postgres * try different things * skip if deprecated api * format checks * update .gitignore * default location for certificates
Cashu Nutshell
Nutshell is a Chaumian Ecash wallet and mint for Bitcoin Lightning based on the Cashu protocol.
Cashu is a free and open-source Ecash protocol based on David Wagner's variant of Chaumian blinding called Blind Diffie-Hellman Key Exchange scheme written down here.
Cashu protocol · Quick Install · Manual install · Configuration · Using Cashu · Run a mint
Feature overview
- Bitcoin Lightning support (LND, CLN, et al.)
- Full support for the Cashu protocol specifications
- Standalone CLI wallet and mint server
- Wallet and mint library you can include in other Python projects
- PostgreSQL and SQLite
- Wallet with builtin Tor
- Use multiple mints in a single wallet
Advanced features
- Deterministic wallet with seed phrase backup (NUT-13)
- Programmable ecash: P2PK and HTLCs (NUT-10)
- Wallet and mint support for keyset rotations
- DLEQ proofs for offline transactions (NUT-12)
- Send and receive tokens via nostr
- Optional caching using Redis (NUT-19)
- Optional authentication using Keycloak (NUT-21)
The Cashu protocol
Different Cashu clients and mints use the same protocol to achieve interoperability. See the documentation page for more information on other projects. If you are interested in developing on your own Cashu project, please refer to the protocol specs protocol specs.
Easy Install: Nutshell wallet
The easiest way to use Cashu is to install the package it via pip:
pip install cashu
To update Cashu, use pip install cashu -U.
If you have problems running the command above on Ubuntu, run sudo apt install -y pip pkg-config and pip install wheel. On macOS, you might have to run pip install wheel and brew install pkg-config.
You can skip the entire next section about Poetry and jump right to Using Cashu.
Easy Install: Nutshell mint
The easiest way to get a mint running is through Docker.
You can build the image yourself by running the following command. Make sure to adjust the environment variables in docker-compose.yaml.
docker compose up mint
Alternatively, you can use the pre-built Docker images, see Running a mint.
Manual install: Poetry
These steps help you install Python via pyenv and Poetry. If you already have Poetry running on your computer, you can skip this step and jump right to Poetry: Install Cashu Nutshell.
Poetry: Prerequisites
# on ubuntu:
sudo apt install -y build-essential pkg-config libffi-dev libpq-dev zlib1g-dev libssl-dev python3-dev libsqlite3-dev ncurses-dev libbz2-dev libreadline-dev lzma-dev liblzma-dev
# install python using pyenv
curl https://pyenv.run | bash
# !! follow the instructions of pyenv init to setup pyenv !!
pyenv init
# restart your shell (or source your .rc file), then install python:
pyenv install 3.10.4
# install poetry
curl -sSL https://install.python-poetry.org | python3 - --version 1.8.5
echo export PATH=\"$HOME/.local/bin:$PATH\" >> ~/.bashrc
source ~/.bashrc
Poetry: Install Cashu Nutshell
# install nutshell
git clone https://github.com/cashubtc/nutshell.git nutshell
cd nutshell
git checkout <latest_tag>
pyenv local 3.10.4
poetry install
Poetry: Update Cashu
To update Cashu to the newest version enter
git pull && poetry install
Poetry: Using the Nutshell wallet
Cashu should be now installed. To execute the following commands, activate your virtual Poetry environment via
poetry shell
If you don't activate your environment, just prepend poetry run to all following commands.
Configuration
mv .env.example .env
# edit .env file
vim .env
To use the wallet with the public test mint, you need to change the appropriate entries in the .env file.
Test instance
Warning: this instance is just for demonstration purposes and development only. The satoshis are not real.
Change the appropriate .env file settings to
MINT_URL=https://testnut.cashu.space
Using Cashu
cashu info
This command shows information about your wallet.
Check balance
cashu balance
Generate a Lightning invoice
This command will return a Lightning invoice that you need to pay to mint new ecash tokens.
cashu invoice 420
The client will check every few seconds if the invoice has been paid. If you abort this step but still pay the invoice, you can use the command cashu invoice <amount> --id <id>.
Pay a Lightning invoice
cashu pay lnbc120n1p3jfmdapp5r9jz...
Send tokens
To send tokens to another user, enter
cashu send 69
You should see the encoded token. Copy the token and send it to another user such as via email or a messenger. The token looks like this:
cashuBo2F0gaJhaUgA2...
Receive tokens
To receive tokens, another user enters:
cashu receive cashuBo2F0gaJhaUgA2...
Running a mint
This command runs the mint on your local computer. Skip this step if you want to use the public test mint instead.
Docker
docker run -d -p 3338:3338 --name nutshell -e MINT_BACKEND_BOLT11_SAT=FakeWallet -e MINT_LISTEN_HOST=0.0.0.0 -e MINT_LISTEN_PORT=3338 -e MINT_PRIVATE_KEY=TEST_PRIVATE_KEY cashubtc/nutshell:0.17.0 poetry run mint
From this repository
Before you can run your own mint, make sure to enable a Lightning backend in MINT_BACKEND_BOLT11_SAT and set MINT_PRIVATE_KEY in your .env file.
poetry run mint
For testing, you can use Nutshell without a Lightning backend by setting MINT_BACKEND_BOLT11_SAT=FakeWallet in the .env file.
NUT-19 Caching with Redis
To cache HTTP responses (NUT-19), you can either install Redis manually or use the docker compose file in docker/redis/docker-compose.yaml to start Redis in a container.
Edit the .env file and uncomment the Redis lines:
MINT_REDIS_CACHE_ENABLED=TRUE
MINT_REDIS_CACHE_URL=redis://localhost:6379
NUT-21 Authentication with Keycloak
Cashu supports clear and blind authentication as defined in NUT-21 and NUT-22 to limit the use of a mint to a registered set of users. Clear authentication is supported via a OICD provider such as Keycloak. You can set up and run Keycloak instance using the docker compose file docker/keycloak/docker-compose.yml in this repository.
Running tests
To run the tests in this repository, first install the dev dependencies with
poetry install --with dev
Then, make sure to set up your mint's .env file to use a fake Lightning backend and disable Tor:
MINT_BACKEND_BOLT11_SAT=FakeWallet
TOR=FALSE
You can run the tests with
poetry run pytest tests
Contributing
Developers are invited to contribute to Nutshell. Please see the contribution guide.