fix(wallet): accept uppercase QR-scanned BOLT11 invoices on send #103

Merged
padreug merged 1 commit from fix/uppercase-bolt11-send into dev 2026-06-15 20:09:15 +00:00

View file

@ -240,21 +240,28 @@ export default class WalletService extends BaseService {
let endpoint = '' let endpoint = ''
let body: any = {} let body: any = {}
// Determine payment type and prepare request // Determine payment type and prepare request.
if (request.destination.startsWith('ln')) { // QR-scanned invoices are uppercase bech32, so detection must be
// Lightning invoice // case-insensitive. Match BOLT11 by its HRP (lnbc / lntb / lntbs /
// lnbcrt) rather than a bare "ln" prefix, which would also swallow
// bech32 LNURLs and misroute them to the bolt11 endpoint.
const dest = request.destination.trim()
const lower = dest.toLowerCase()
if (lower.startsWith('lnbc') || lower.startsWith('lntb') || lower.startsWith('lntbs') || lower.startsWith('lnbcrt')) {
// Lightning invoice (BOLT11) — send the lowercase canonical form
endpoint = `${config.api.baseUrl}/api/v1/payments` endpoint = `${config.api.baseUrl}/api/v1/payments`
body = { body = {
out: true, out: true,
bolt11: request.destination bolt11: lower
} }
} else if (request.destination.includes('@') || request.destination.toLowerCase().startsWith('lnurl')) { } else if (dest.includes('@') || lower.startsWith('lnurl')) {
// Lightning address or LNURL // Lightning address or LNURL
endpoint = `${config.api.baseUrl}/api/v1/payments/lnurl` endpoint = `${config.api.baseUrl}/api/v1/payments/lnurl`
body = { body = {
lnurl: request.destination.includes('@') lnurl: dest.includes('@')
? `https://${request.destination.split('@')[1]}/.well-known/lnurlp/${request.destination.split('@')[0]}` ? `https://${dest.split('@')[1]}/.well-known/lnurlp/${dest.split('@')[0]}`
: request.destination, : dest,
amount: request.amount * 1000, // Convert to millisats amount: request.amount * 1000, // Convert to millisats
comment: request.comment || '' comment: request.comment || ''
} }