diff --git a/cashu/core/base.py b/cashu/core/base.py index 5c6c59d..02c789b 100644 --- a/cashu/core/base.py +++ b/cashu/core/base.py @@ -922,6 +922,9 @@ class Token(ABC): @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 e22ac4c..b759dcc 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 886a4cd..b253efa 100644 --- a/cashu/wallet/wallet.py +++ b/cashu/wallet/wallet.py @@ -400,12 +400,12 @@ class Wallet( 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: