diff --git a/cashu/mint/ledger.py b/cashu/mint/ledger.py index 706a614..aeb76ba 100644 --- a/cashu/mint/ledger.py +++ b/cashu/mint/ledger.py @@ -668,12 +668,16 @@ class Ledger(LedgerVerification, LedgerSpendingConditions, LedgerTasks, LedgerFe # and therefore respond with internal transaction fees (0 for now) mint_quote = await self.crud.get_mint_quote(request=request, db=self.db) if mint_quote and mint_quote.unit == melt_quote.unit: + # check if the melt quote is partial and error if it is. + # it's just not possible to handle this case + if melt_quote.is_mpp: + raise TransactionError("internal mpp not allowed.") payment_quote = self.create_internal_melt_quote(mint_quote, melt_quote) else: # not internal # verify that the backend supports mpp if the quote request has an amount if melt_quote.is_mpp and not self.backends[method][unit].supports_mpp: - raise TransactionError("backend does not support mpp") + raise TransactionError("backend does not support mpp.") # get payment quote by backend payment_quote = await self.backends[method][unit].get_payment_quote( melt_quote=melt_quote diff --git a/tests/test_wallet_regtest_mpp.py b/tests/test_wallet_regtest_mpp.py index 8233cd6..0f788e6 100644 --- a/tests/test_wallet_regtest_mpp.py +++ b/tests/test_wallet_regtest_mpp.py @@ -11,6 +11,7 @@ from cashu.mint.ledger import Ledger from cashu.wallet.wallet import Wallet from tests.conftest import SERVER_ENDPOINT from tests.helpers import ( + assert_err, get_real_invoice, is_fake, partial_pay_real_invoice, @@ -139,3 +140,19 @@ async def test_regtest_pay_mpp_incomplete_payment(wallet: Wallet, ledger: Ledger await asyncio.sleep(2) assert wallet.balance <= 384 - 64 + + +@pytest.mark.asyncio +@pytest.mark.skipif(is_fake, reason="only regtest") +async def test_regtest_internal_mpp_melt_quotes(wallet: Wallet, ledger: Ledger): + # make sure that mpp is supported by the bolt11-sat backend + if not ledger.backends[Method["bolt11"]][wallet.unit].supports_mpp: + pytest.skip("backend does not support mpp") + + # create a mint quote + mint_quote = await wallet.request_mint(128) + + # try and create a multi-part melt quote + await assert_err( + wallet.melt_quote(mint_quote.request, 100), "internal mpp not allowed" + )