author: fiatjaf
author: akumaigorodski
discussion: https://t.me/lnurl/139
-
User scans a LNURL QR code or pastes/shares an
lightning:LNURL..
link withLN WALLET
andLN WALLET
decodes LNURL. -
LN WALLET
makes a GET request toLN SERVICE
using the decoded LNURL. -
LN WALLET
gets JSON response fromLN SERVICE
of form:{ callback: String, // The URL from LN SERVICE which will accept the pay request parameters maxSendable: MilliSatoshi, // Max amount LN SERVICE is willing to receive minSendable: MilliSatoshi, // Min amount LN SERVICE is willing to receive, can not be less than 1 or more than `maxSendable` metadata: String, // Metadata json which must be presented as raw string here, this is required to pass signature verification at a later step tag: "payRequest" // Type of LNURL }
or
{"status": "ERROR", "reason": "error details..."}
metadata
json array must contain onetext/plain
entry, all other types of entries are optional.metadata
json array must contain either oneimage/png;base64
entry or oneimage/jpeg;base64
entry or neither.[ [ "text/plain", // must always be present content // actual metadata content ], [ "image/png;base64", // optional 512x512px PNG thumbnail which will represent this lnurl in a list or grid content // base64 string, up to 136536 characters (100Kb of image data in base-64 encoding) ], [ "image/jpeg;base64", // optional 512x512px JPG thumbnail which will represent this lnurl in a list or grid content // base64 string, up to 136536 characters (100Kb of image data in base-64 encoding) ], ... // more objects for future types ]
and be sent as a string:
"[[\"text/plain\", \"lorem ipsum blah blah\"]]"
-
LN WALLET
displays a payment dialog where user can specify an exact sum to be sent which would be bounded by:max can send = min(maxSendable, local estimation of how much can be sent from wallet) min can send = max(minSendable, local minimal value allowed by wallet)
Additionally, a payment dialog must include:
- Domain name extracted from
LNURL
query string. - A way to view the metadata sent of
text/plain
format.
And it may include:
- An image element with the contents of
image/png
orimage/jpeg
.
- Domain name extracted from
-
LN WALLET
makes a GET request using<callback><?|&>amount=<milliSatoshi>
amount
being the amount specified by the user in millisatoshis. -
LN Service
takes the GET request and returns JSON response of form:{ pr: String, // bech32-serialized lightning invoice routes: [], // an empty array }
or
{"status":"ERROR", "reason":"error details..."}
-
LN WALLET
Verifies thath
tag in provided invoice is a hash ofmetadata
string converted to byte array in UTF-8 encoding. -
LN WALLET
Verifies that amount in provided invoice equals an amount previously specified by user. -
LN WALLET
pays the invoice, no additional user confirmation is required at this point. -
Once payment is fulfilled
LN WALLET
executes a non-nullsuccessAction
. Formessage
, a toaster or popup is sufficient. Forurl
, the wallet should give the user a popup which displaysdescription
,url
, and a 'open' button to open theurl
in a new browser tab. Foraes
,LN WALLET
must attempt to decrypt aciphertext
with payment preimage.LN WALLET
should also storesuccessAction
data on the transaction record.
Construct a metadata object, turn it into json, then include in into parent json as string.
- Make a hash as follows:
sha256(utf8ByteArray(unescaped_metadata_string))
. - Generate a payment request using an obtained hash.