From 77de51f3363b2a22b85dc1770e0190646eb52021 Mon Sep 17 00:00:00 2001 From: lollerfirst <43107113+lollerfirst@users.noreply.github.com> Date: Tue, 4 Mar 2025 12:38:47 +0100 Subject: [PATCH] add cli decode + fix crash when mint is offline (#709) --- cashu/core/base.py | 3 +++ cashu/wallet/cli/cli.py | 21 +++++++++++++++++++++ cashu/wallet/wallet.py | 6 +++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/cashu/core/base.py b/cashu/core/base.py index 5c6c59d5..02c789b8 100644 --- a/cashu/core/base.py +++ b/cashu/core/base.py @@ -922,6 +922,9 @@ def unit(self) -> str: ... @abstractmethod def unit(self, unit: str): ... + @abstractmethod + def serialize_to_dict(self, include_dleq: bool): ... + class TokenV3Token(BaseModel): mint: Optional[str] = None diff --git a/cashu/wallet/cli/cli.py b/cashu/wallet/cli/cli.py index e22ac4c1..b759dcc4 100644 --- a/cashu/wallet/cli/cli.py +++ b/cashu/wallet/cli/cli.py @@ -2,6 +2,7 @@ import asyncio import getpass +import json import os import time from datetime import datetime, timezone @@ -760,6 +761,26 @@ async def receive_cli( return await print_balance(ctx) +@cli.command("decode", help="Decode a cashu token and print in JSON format.") +@click.option( + "--no-dleq", default=False, is_flag=True, help="Do not include DLEQ proofs." +) +@click.option( + "--indent", "-i", default=2, is_flag=False, help="Number of spaces to indent JSON with." +) +@click.argument("token", type=str, default="") +def decode_to_json(token: str, no_dleq: bool, indent: int): + include_dleq = not no_dleq + if token: + token_obj = deserialize_token_from_string(token) + token_json = json.dumps( + token_obj.serialize_to_dict(include_dleq), + default=lambda obj: obj.hex() if isinstance(obj, bytes) else obj, + indent=indent, + ) + print(token_json) + else: + print("Error: enter a token") @cli.command("burn", help="Burn spent tokens.") @click.argument("token", required=False, type=str) diff --git a/cashu/wallet/wallet.py b/cashu/wallet/wallet.py index 886a4cde..b253efa1 100644 --- a/cashu/wallet/wallet.py +++ b/cashu/wallet/wallet.py @@ -400,12 +400,12 @@ async def load_mint(self, keyset_id: str = "", force_old_keysets=False) -> None: Defaults to False. """ logger.trace(f"Loading mint {self.url}") - await self.load_mint_keysets(force_old_keysets) - await self.activate_keyset(keyset_id) try: + await self.load_mint_keysets(force_old_keysets) + await self.activate_keyset(keyset_id) await self.load_mint_info(reload=True) except Exception as e: - logger.debug(f"Could not load mint info: {e}") + logger.error(f"Could not load mint info: {e}") pass async def load_proofs(self, reload: bool = False, all_keysets=False) -> None: