diff --git a/lnbits/core/migrations.py b/lnbits/core/migrations.py index 890bf51fe..0f14d9df5 100644 --- a/lnbits/core/migrations.py +++ b/lnbits/core/migrations.py @@ -135,3 +135,29 @@ async def m003_add_invoice_webhook(db): await db.execute("ALTER TABLE apipayments ADD COLUMN webhook TEXT") await db.execute("ALTER TABLE apipayments ADD COLUMN webhook_status TEXT") + + +async def m004_ensure_fees_are_always_negative(db): + """ + Use abs() so wallet backends don't have to care about the sign of the fees. + """ + + await db.execute("DROP VIEW balances") + + await db.execute( + """ + CREATE VIEW IF NOT EXISTS balances AS + SELECT wallet, COALESCE(SUM(s), 0) AS balance FROM ( + SELECT wallet, SUM(amount) AS s -- incoming + FROM apipayments + WHERE amount > 0 AND pending = 0 -- don't sum pending + GROUP BY wallet + UNION ALL + SELECT wallet, SUM(amount - abs(fee)) AS s -- outgoing, sum fees + FROM apipayments + WHERE amount < 0 -- do sum pending + GROUP BY wallet + ) + GROUP BY wallet; + """ + ) diff --git a/lnbits/core/services.py b/lnbits/core/services.py index 703817fc4..d623b1183 100644 --- a/lnbits/core/services.py +++ b/lnbits/core/services.py @@ -154,7 +154,7 @@ async def pay_invoice( if payment.checking_id: await create_payment( checking_id=payment.checking_id, - fee=-abs(payment.fee_msat), + fee=payment.fee_msat, preimage=payment.preimage, pending=payment.ok == None, conn=conn,