diff --git a/docs/usage.md b/docs/usage.md index 57b9bd4..9130e26 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -252,10 +252,15 @@ For clarity reasons, nix-bitcoin renames all scripts to `jm-*` without `.py`, fo example `wallet-tool.py` becomes `jm-wallet-tool`. The rest of this section details nix-bitcoin specific workflows for JoinMarket. -## Initialize JoinMarket Wallet +## Wallets -By default, nix-bitcoin's JoinMarket module automatically generates a wallet for -you. If however, you want to manually initialize your wallet, follow these steps. +By default, a wallet is automatically generated at service startup. +It's stored at `/var/lib/joinmarket/wallets/wallet.jmdat`, and its mnmenoic recovery +seed phrase is stored at `/var/lib/joinmarket/jm-wallet-seed`. + +A missing wallet file is automatically recreated if the seed file is still present. + +If you want to manually initialize your wallet instead, follow these steps: 1. Enable JoinMarket in your node configuration diff --git a/examples/configuration.nix b/examples/configuration.nix index edc0fa6..9346e59 100644 --- a/examples/configuration.nix +++ b/examples/configuration.nix @@ -260,6 +260,6 @@ # The nix-bitcoin release version that your config is compatible with. # When upgrading to a backwards-incompatible release, nix-bitcoin will display an # an error and provide hints for migrating your config to the new release. - nix-bitcoin.configVersion = "0.0.49"; + nix-bitcoin.configVersion = "0.0.51"; } diff --git a/modules/joinmarket.nix b/modules/joinmarket.nix index e6e873d..506628e 100644 --- a/modules/joinmarket.nix +++ b/modules/joinmarket.nix @@ -250,17 +250,31 @@ in { if [[ ! -f $wallet ]]; then ${optionalString (cfg.rpcWalletFile != null) '' echo "Create watch-only wallet ${cfg.rpcWalletFile}" - ${bitcoind.cli}/bin/bitcoin-cli -named createwallet \ - wallet_name="${cfg.rpcWalletFile}" disable_private_keys=true + if ! output=$(${bitcoind.cli}/bin/bitcoin-cli -named createwallet \ + wallet_name="${cfg.rpcWalletFile}" disable_private_keys=true 2>&1); then + # Ignore error if bitcoind wallet already exists + if [[ $output != *"already exists"* ]]; then + echo "$output" + exit 1 + fi + fi ''} + # Restore wallet from seed if available + seed= + if [[ -e jm-wallet-seed ]]; then + seed="--recovery-seed-file jm-wallet-seed" + fi cd ${cfg.dataDir} # Strip trailing newline from password file if ! tr -d "\n" <"${secretsDir}/jm-wallet-password" \ | ${nbPkgs.joinmarket}/bin/jm-genwallet \ - --datadir=${cfg.dataDir} --wallet-password-stdin $walletname \ - | grep 'recovery_seed' \ - | cut -d ':' -f2 \ - | (umask u=r,go=; cat > jm-wallet-seed); then + --datadir=${cfg.dataDir} --wallet-password-stdin $seed $walletname \ + | (if [[ ! $seed ]]; then + umask u=r,go= + grep -ohP '(?<=recovery_seed:).*' > jm-wallet-seed + else + cat > /dev/null + fi); then echo "wallet creation failed" rm -f "$wallet" jm-wallet-seed exit 1 diff --git a/modules/versioning.nix b/modules/versioning.nix index 004a2c7..76c8af8 100644 --- a/modules/versioning.nix +++ b/modules/versioning.nix @@ -100,6 +100,29 @@ let [1] https://github.com/bitcoin/bitcoin/pull/15454 ''; } + { + version = "0.0.51"; + condition = config.services.joinmarket.enable; + message = let + jmDataDir = config.services.joinmarket.dataDir; + in '' + Joinmarket 0.9.1 has added support for Fidelity Bonds [1]. + + If you've used joinmarket before, do the following to enable Fidelity Bonds in your existing wallet. + Enabling Fidelity Bonds has no effect if you don't use them. + + 1. Deploy the new system config to your node + 2. Run the following on your node: + # Ensure that the wallet seed exists and rename the wallet + ls ${jmDataDir}/jm-wallet-seed && mv ${jmDataDir}/wallets/wallet.jmdat{,.bak} + # This automatically recreates the wallet with Fidelity Bonds support + systemctl restart joinmarket + # Remove wallet backup if update was successful + rm ${jmDataDir}/wallets/wallet.jmdat.bak + + [1] https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/fidelity-bonds.md + ''; + } ]; mkOnionServiceChange = service: { diff --git a/pkgs/joinmarket/default.nix b/pkgs/joinmarket/default.nix index ddc1ab2..de0344e 100644 --- a/pkgs/joinmarket/default.nix +++ b/pkgs/joinmarket/default.nix @@ -1,10 +1,20 @@ -{ stdenv, lib, fetchurl, python3, nbPython3Packages, pkgs }: +{ stdenv, lib, fetchurl, applyPatches, fetchpatch, python3, nbPython3Packages, pkgs }: let version = "0.9.1"; - src = fetchurl { - url = "https://github.com/JoinMarket-Org/joinmarket-clientserver/archive/v${version}.tar.gz"; - sha256 = "0a8jlzi3ll1dw60fwnqs5awmcfxdjynh6i1gfmcc29qhwjpx5djl"; + src = applyPatches { + src = fetchurl { + url = "https://github.com/JoinMarket-Org/joinmarket-clientserver/archive/v${version}.tar.gz"; + sha256 = "0a8jlzi3ll1dw60fwnqs5awmcfxdjynh6i1gfmcc29qhwjpx5djl"; + }; + patches = [ + (fetchpatch { + # https://github.com/JoinMarket-Org/joinmarket-clientserver/pull/999 + name = "improve-genwallet"; + url = "https://patch-diff.githubusercontent.com/raw/JoinMarket-Org/joinmarket-clientserver/pull/999.patch"; + sha256 = "08x2i1q8qsn5rxmfmmj4i8s1d2yc862i152riw3d8zwz7x2cq40h"; + }) + ]; }; runtimePackages = with nbPython3Packages; [