fix: Wownero atomic unit is 10^11, not 10^12

The codebase was forked from xmrcheckout and kept Monero's 10^12 atomic-unit constant everywhere. Wownero uses 11 decimal places, not 12.

Effect: _xmr_to_atomic(amount) produced a required_atomic value 10× larger than what wallet-rpc actually reports for the subaddress. Invoices flagged total_paid_atomic correctly (that comes from the daemon) but is_paid = total_paid >= required was always false, so the reconciler never flipped status pending → payment_detected, webhook never fired, Medusa never saw the payment.

Fix all four places: reconciler._xmr_to_atomic, btcpay_routes._xmr_to_atomic, btcpay_routes._atomic_to_xmr, btcpay_routes._format_xmr_fixed, routes.py invoice-status response. Extracted a WOW_ATOMIC_UNITS constant so this doesn't get lost again when we touch these files.
This commit is contained in:
jwinterm
2026-04-19 15:51:45 -04:00
parent 240c2b2b9f
commit f9159f5877
3 changed files with 26 additions and 7 deletions
+4 -2
View File
@@ -302,8 +302,10 @@ def _public_invoice_status_response(
metadata = invoice.metadata_json or {}
update: dict[str, Any] = {}
if invoice.total_paid_atomic is not None:
total_paid = (Decimal(invoice.total_paid_atomic) / Decimal("1000000000000")).quantize(
Decimal("0.000000000001"), rounding=ROUND_DOWN
# Wownero uses 11 decimal places (10^11), NOT 12 like Monero. Using
# 10^12 here under-reports amount_paid by a factor of 10.
total_paid = (Decimal(invoice.total_paid_atomic) / Decimal("100000000000")).quantize(
Decimal("0.00000000001"), rounding=ROUND_DOWN
)
update["amount_paid_xmr"] = format_xmr_amount(total_paid)
btcpay_data = metadata.get("btcpay") if isinstance(metadata, dict) else None