From f48d644635c33f9a60d9246f6552df8a3c9b19c8 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:40:24 +0200 Subject: [PATCH] fix: cashu send --lock --- cashu/wallet/helpers.py | 29 +++++++++++++++++++---------- tests/test_wallet_cli.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/cashu/wallet/helpers.py b/cashu/wallet/helpers.py index a6182347..9d020f9d 100644 --- a/cashu/wallet/helpers.py +++ b/cashu/wallet/helpers.py @@ -135,24 +135,33 @@ async def send( sig_all=True, n_sigs=1, ) - print(f"Secret lock: {secret_lock}") + logger.debug(f"Secret lock: {secret_lock}") await wallet.load_proofs() await wallet.load_mint() - # get a proof with specific amount - send_proofs, fees = await wallet.select_to_send( - wallet.proofs, - amount, - set_reserved=False, - offline=offline, - include_fees=include_fees, - ) + if secret_lock: + _, send_proofs = await wallet.split_to_send( + wallet.proofs, + amount, + set_reserved=False, # we set reserved later + secret_lock=secret_lock, + include_fees=include_fees, + ) + else: + send_proofs, fees = await wallet.select_to_send( + wallet.proofs, + amount, + set_reserved=False, # we set reserved later + offline=offline, + include_fees=include_fees, + ) token = await wallet.serialize_proofs( send_proofs, include_dleq=include_dleq, legacy=legacy, memo=memo ) + print(token) - await wallet.set_reserved(send_proofs, reserved=True) + await wallet.set_reserved(send_proofs, reserved=True) return wallet.available_balance, token diff --git a/tests/test_wallet_cli.py b/tests/test_wallet_cli.py index f0589665..81a2e4b6 100644 --- a/tests/test_wallet_cli.py +++ b/tests/test_wallet_cli.py @@ -483,3 +483,37 @@ def test_selfpay(cli_prefix): assert result.exception is None print(result.output) assert result.exit_code == 0 + + +def test_send_with_lock(mint, cli_prefix): + # call "cashu locks" first and get the lock + runner = CliRunner() + result = runner.invoke( + cli, + [*cli_prefix, "locks"], + ) + assert result.exception is None + print("test_send_with_lock", result.output) + # iterate through all words and get the word that starts with "P2PK:" + lock = None + for word in result.output.split(" "): + # strip the word + word = word.strip() + if word.startswith("P2PK:"): + lock = word + break + assert lock is not None, "no lock found" + pubkey = lock.split(":")[1] + + # now lock the token + runner = CliRunner() + result = runner.invoke( + cli, + [*cli_prefix, "send", "10", "--lock", lock], + ) + assert result.exception is None + print("test_send_with_lock", result.output) + token_str = result.output.split("\n")[0] + assert "cashuB" in token_str, "output does not have a token" + token = TokenV4.deserialize(token_str).to_tokenv3() + assert pubkey in token.token[0].proofs[0].secret