# Joinmarket support

JoinMarket is software to create a special kind of bitcoin transaction called a CoinJoin transaction. Its aim is to improve the confidentiality and privacy of bitcoin transactions.

You will be able to use your bitcoin to help other protect their privacy, while earning a yield for this service.

See the documentation of the joinmarket project (opens new window) for more details.

This is a very advanced functionality, and there is no easy way to recover if something goes wrong.

For hardcore bitcoiners only.

# How to use

. btcpay-setup.sh -i

Then you need to setup your default joinmarket wallet:

jm.sh wallet-tool-generate
jm.sh set-wallet <wallet_file_name> <password>

Once done, you will need to send some money to the joinmarket wallet:

jm.sh wallet-tool

# How to change joinmarket configuration?

Connect to your container, and edit your configuration:

jm.sh bash

# Managing your wallet

By running jm.sh without parameter, you will get a bunch of command that you can run such as:


Tooling to setup your joinmarket yield generator

    wallet-tool: Run wallet-tools.py on the wallet
    wallet-tool-generate: Generate a new wallet
    set-wallet: Set the wallet that the yield generator need to use
    bash: Open an interactive bash session in the joinmarket container
    receive-payjoin: Receive a payjoin payment
    sendpayment: Send a payjoin through coinjoin (password needed)

    * jm.sh wallet-tool-generate
    * jm.sh set-wallet wallet.jmdat mypassword
    * jm.sh wallet-tool
    * jm.sh receive-payjoin <amount>
    * jm.sh sendpayment <amount> <address>
    * jm.sh wallet-tool history
    * jm.sh bash

Note jm.sh commands are wrapper around joinmarket scripts. Those are just convenience command, you can always directly connect to the container via jm.sh bash and achieve the same result with the joinmarket python scripts.

# Getting command prompt into the container

You can connect to the container and have direct access to joinmarket scripts such as:

jm.sh bash
sendpayment.py wallet.jmdat ...

# Managing the services such as yield generators

First connect to the container's bash

jm.sh bash

You can list available services to run:

supervisorctl status

Which might show you

root> supervisorctl status
ob-watcher                       STOPPED   Not started
yg-privacyenhanced               STOPPED   Not started
yield-generator-basic            STOPPED   Not started

You can start a yield generator with:

supervisorctl start yg-privacyenhanced

*** Note that services will NOT be restarted automatically if the container restart. ***

If you want to automatically restart the service when the container restart,


Then remove the comment # in front of the service name you want to automatically restart.

# OB-Watcher

The ob-watcher service allows you to see an order book (opens new window).

You can activate it:

supervisorctl start ob-watcher

Then you can browse it by browsing https://<your-server>.com/obwatch/

# Troubleshooting

# Error: Failed to load wallet, you need to remove the lock file

You might sometimes get the following error when running a python script for joinmarket:

Failed to load wallet, error message: RetryableStorageError('File is currently in use (locked by pid 12822). If this is a leftover from a crashed instance you need to remove the lock file `/root/.joinmarket/wallets/.wallet.jmdat.lock` manually.')

This is because a service using the wallet is running, so you need to shut it down before running the command.

Check which service is running:

supervisorctl status

And stop it

supervisorctl stop yg-privacyenhanced

# Read the logs of services

You can use the supervisorctl tail command:

supervisorctl tail yg-privacyenhanced

You can also check the logs in the $DATADIR/logs folder.