From ec3db81cee9b03885e959c1a02e736b2ad7c339b Mon Sep 17 00:00:00 2001 From: lollerfirst <43107113+lollerfirst@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:35:06 +0100 Subject: [PATCH] Update Error Codes (#702) * add new error codes * use the new errors in the code * fix unsorted import * fix test wallet --- cashu/core/errors.py | 32 ++++++++++++++++++++++++++++++++ cashu/mint/verification.py | 14 +++++++++----- tests/test_wallet.py | 2 +- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/cashu/core/errors.py b/cashu/core/errors.py index d1d0c6d..0dc9b52 100644 --- a/cashu/core/errors.py +++ b/cashu/core/errors.py @@ -87,6 +87,38 @@ class TransactionAmountExceedsLimitError(TransactionError): super().__init__(detail, code=self.code) +class TransactionDuplicateInputsError(TransactionError): + detail = "Duplicate inputs provided" + code = 11007 + + def __init__(self, detail: Optional[str] = None): + super().__init__(detail, code=self.code) + + +class TransactionDuplicateOutputsError(TransactionError): + detail = "Duplicate outputs provided" + code = 11008 + + def __init__(self, detail: Optional[str] = None): + super().__init__(detail, code=self.code) + + +class TransactionMultipleUnitsError(TransactionError): + detail = "Inputs/Outputs of multiple units" + code = 11009 + + def __init__(self, detail: Optional[str] = None): + super().__init__(detail, code=self.code) + + +class TransactionUnitMismatchError(TransactionError): + detail = "Inputs and outputs not of same unit" + code = 11010 + + def __init__(self, detail: Optional[str] = None): + super().__init__(detail, code=self.code) + + class KeysetError(CashuError): detail = "keyset error" code = 12000 diff --git a/cashu/mint/verification.py b/cashu/mint/verification.py index 6561e41..dd73e5d 100644 --- a/cashu/mint/verification.py +++ b/cashu/mint/verification.py @@ -19,8 +19,12 @@ from ..core.errors import ( NotAllowedError, OutputsAlreadySignedError, SecretTooLongError, + TransactionDuplicateInputsError, + TransactionDuplicateOutputsError, TransactionError, + TransactionMultipleUnitsError, TransactionUnitError, + TransactionUnitMismatchError, ) from ..core.nuts import nut20 from ..core.settings import settings @@ -67,7 +71,7 @@ class LedgerVerification( raise TransactionError("secrets do not match criteria.") # verify that only unique proofs were used if not self._verify_no_duplicate_proofs(proofs): - raise TransactionError("duplicate proofs.") + raise TransactionDuplicateInputsError() # Verify ecash signatures if not all([self._verify_proof_bdhke(p) for p in proofs]): raise InvalidProofsError() @@ -128,7 +132,7 @@ class LedgerVerification( raise TransactionError("invalid amount.") # verify that only unique outputs were used if not self._verify_no_duplicate_outputs(outputs): - raise TransactionError("duplicate outputs.") + raise TransactionDuplicateOutputsError() # verify that outputs have not been signed previously signed_before = await self._check_outputs_issued_before(outputs, conn) if any(signed_before): @@ -219,11 +223,11 @@ class LedgerVerification( units_proofs = [self.keysets[p.id].unit for p in proofs] units_outputs = [self.keysets[o.id].unit for o in outs if o.id] if not len(set(units_proofs)) == 1: - raise TransactionUnitError("inputs have different units.") + raise TransactionMultipleUnitsError("inputs have different units.") if not len(set(units_outputs)) == 1: - raise TransactionUnitError("outputs have different units.") + raise TransactionMultipleUnitsError("outputs have different units.") if not units_proofs[0] == units_outputs[0]: - raise TransactionUnitError("input and output keysets have different units.") + raise TransactionUnitMismatchError() return units_proofs[0] def get_fees_for_proofs(self, proofs: List[Proof]) -> int: diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 9135ace..0e0aba7 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -383,7 +383,7 @@ async def test_duplicate_proofs_double_spent(wallet1: Wallet): doublespend = await wallet1.mint(64, quote_id=mint_quote.quote) await assert_err( wallet1.split(wallet1.proofs + doublespend, 20), - "Mint Error: duplicate proofs.", + "Mint Error: Duplicate inputs provided", ) assert wallet1.balance == 64 assert wallet1.available_balance == 64