front-end for lightning-to-fiat exchange at https://lnurl-pay.me
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.1 KiB
51 lines
1.1 KiB
|
|
import { bech32 } from 'bech32' |
|
import UTF8 from 'utf-8' |
|
|
|
function getDomain(url) { |
|
return url |
|
.split('://')[1] |
|
.split('/')[0] |
|
.split('@') |
|
.slice(-1)[0] |
|
.split(':')[0] |
|
} |
|
|
|
export function decodeLnurl(lnurl) { |
|
let obj = bech32.decode(lnurl,20000) |
|
if (obj.prefix!="lnurl") |
|
throw new Error("bad prefix") |
|
return UTF8.getStringFromBytes(bech32.fromWords(obj.words)) |
|
} |
|
|
|
export async function payStep1(url) { |
|
const r = await fetch(url) |
|
if (r.status >= 300) { |
|
throw new Error(await r.text()) |
|
} |
|
let res = await r.json() |
|
if (res.status == "ERROR") |
|
return res; |
|
if (res.tag != "payRequest") { |
|
throw new Error(`LNURL type ${r.tag}, expected: payRequest`) |
|
} |
|
try { |
|
res.decodedMetadata = JSON.parse(res.metadata) |
|
} catch (err) { |
|
res.decodedMetadata = [] |
|
} |
|
return res |
|
} |
|
|
|
export async function payStep2(url, res, msat, comment) { |
|
let cb = res.callback; |
|
let params = new URLSearchParams(); |
|
params.set("amount",msat); |
|
cb = cb+(cb.includes("?")?"&":"?")+params.toString() |
|
const r = await fetch(cb) |
|
if (r.status >= 300) { |
|
throw new Error(await r.text()) |
|
} |
|
let res2 = await r.json() |
|
return res2 |
|
}
|
|
|