{"version":3,"file":"index.mjs","names":["n","sha256","network: bolt11.Network | undefined","metadata: Array<Array<string>>","metadataHash: string","invoiceParams: { amount: number; comment?: string }","successAction: LNURLPaySuccessAction | undefined"],"sources":["../../node_modules/@oxc-project/runtime/src/helpers/esm/asyncToGenerator.js","../../src/utils.ts","../../src/request-pay-service-params.ts","../../src/request-invoice.ts"],"sourcesContent":["function asyncGeneratorStep(n, t, e, r, o, a, c) {\n  try {\n    var i = n[a](c),\n      u = i.value;\n  } catch (n) {\n    return void e(n);\n  }\n  i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n  return function () {\n    var t = this,\n      e = arguments;\n    return new Promise(function (r, o) {\n      var a = n.apply(t, e);\n      function _next(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n      }\n      function _throw(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n      }\n      _next(void 0);\n    });\n  };\n}\nexport { _asyncToGenerator as default };","import { bech32 } from 'bech32'\nimport axios from 'axios'\nimport aesjs from 'aes-js'\nimport Base64 from 'base64-js'\nimport * as bolt11 from 'bolt11'\nimport { Sha256 } from '@aws-crypto/sha256-js'\n\nimport type {\n  BufferEncoding,\n  LightningAddress,\n  LNURLPaySuccessAction,\n  Satoshis,\n} from './types'\n\nconst PROTOCOL_AND_DOMAIN = /^(?:\\w+:)?\\/\\/(\\S+)$/\nconst LOCALHOST_DOMAIN = /^localhost[:?\\d]*(?:[^:?\\d]\\S*)?$/\nconst NON_LOCALHOST_DOMAIN = /^[^\\s.]+\\.\\S{2,}$/\n\nconst LNURL_REGEX =\n  /^(?:http.*[&?]lightning=|lightning:)?(lnurl[0-9]{1,}[02-9ac-hj-np-z]+)/\n\nconst LN_ADDRESS_REGEX =\n  /^((?:[^<>()[\\]\\\\.,;:\\s@\"]+(?:\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(?:\".+\"))@((?:\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(?:(?:[a-zA-Z-0-9]+\\.)+[a-zA-Z]{2,}))$/\n\nconst ONION_REGEX = /^(http:\\/\\/[^/:@]+\\.onion(?::\\d{1,5})?)(\\/.*)?$/\n\nconst LNURLP_REGEX =\n  /^lnurlp:\\/\\/([\\w-]+\\.)+[\\w-]+(:\\d{1,5})?(\\/[\\w-./?%&=]*)?$/\n\n/**\n * Decode a bech32 encoded url (lnurl), lightning address or lnurlp url and return a url\n * @method decodeUrlOrAddress\n * @param  lnUrlOrAddress string to decode\n * @return  plain url or null if is an invalid url, lightning address or lnurlp\n */\nexport const decodeUrlOrAddress = (lnUrlOrAddress: string): string | null => {\n  const bech32Url = parseLnUrl(lnUrlOrAddress)\n  if (bech32Url) {\n    const decoded = bech32.decode(bech32Url, 20000)\n    return Buffer.from(bech32.fromWords(decoded.words)).toString()\n  }\n\n  const address = parseLightningAddress(lnUrlOrAddress)\n  if (address) {\n    const { username, domain } = address\n    const protocol = domain.match(/\\.onion$/) ? 'http' : 'https'\n    return `${protocol}://${domain}/.well-known/lnurlp/${username}`\n  }\n\n  return parseLnurlp(lnUrlOrAddress)\n}\n\n/**\n * Parse an url and return a bech32 encoded url (lnurl)\n * @method parseLnUrl\n * @param  url string to parse\n * @return  bech32 encoded url (lnurl) or null if is an invalid url\n */\nexport const parseLnUrl = (url: string): string | null => {\n  if (!url) return null\n  const result = LNURL_REGEX.exec(url.toLowerCase())\n  return result ? result[1] : null\n}\n\n/**\n * Verify if a string is a valid lnurl value\n * @method isLnurl\n * @param  url string to validate\n * @return  true if is a valid lnurl value\n */\nexport const isLnurl = (url: string): boolean => {\n  if (!url) return false\n  return LNURL_REGEX.test(url.toLowerCase())\n}\n\n/**\n * Verify if a string is a lightning adress\n * @method isLightningAddress\n * @param  address string to validate\n * @return  true if is a lightning address\n */\nexport const isLightningAddress = (address: string): boolean => {\n  if (!address) return false\n  return LN_ADDRESS_REGEX.test(address)\n}\n\n/**\n * Parse an address and return username and domain\n * @method parseLightningAddress\n * @param  address string to parse\n * @return  LightningAddress { username, domain }\n */\nexport const parseLightningAddress = (\n  address: string\n): LightningAddress | null => {\n  if (!address) return null\n  const result = LN_ADDRESS_REGEX.exec(address)\n  return result ? { username: result[1], domain: result[2] } : null\n}\n\n/**\n * Verify if a string is a lnurlp url\n * @method isLnurlp\n * @param  url string to validate\n * @return  true if is a lnurlp url\n */\nexport const isLnurlp = (url: string): boolean => {\n  if (!url) return false\n  return LNURLP_REGEX.test(url)\n}\n\n/**\n * Parse a lnurlp url and return an url with the proper protocol\n * @method parseLnurlp\n * @param  url string to parse\n * @return  url (http or https) or null if is an invalid lnurlp\n */\nexport const parseLnurlp = (url: string): string | null => {\n  if (!url) return null\n\n  const parsedUrl = url.toLowerCase()\n  if (!LNURLP_REGEX.test(parsedUrl)) return null\n\n  const protocol = parsedUrl.includes('.onion') ? 'http://' : 'https://'\n  return parsedUrl.replace('lnurlp://', protocol)\n}\n\n/**\n * Verify if a string is an url\n * @method isUrl\n * @param  url string to validate\n * @return  true if is an url\n */\nexport const isUrl = (url: string | null): url is string => {\n  if (!url) return false\n  if (typeof url !== 'string') {\n    return false\n  }\n\n  var match = url.match(PROTOCOL_AND_DOMAIN)\n  if (!match) {\n    return false\n  }\n\n  var everythingAfterProtocol = match[1]\n  if (!everythingAfterProtocol) {\n    return false\n  }\n\n  if (\n    LOCALHOST_DOMAIN.test(everythingAfterProtocol) ||\n    NON_LOCALHOST_DOMAIN.test(everythingAfterProtocol)\n  ) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * Verify if a string is an onion url\n * @method isOnionUrl\n * @param  url string to validate\n * @return  true if is an onion url\n */\nexport const isOnionUrl = (url: string | null): boolean => {\n  return isUrl(url) && ONION_REGEX.test(url.toLowerCase())\n}\n\n/**\n * Parse a number to Satoshis\n * @method checkedToSats\n * @param  value number to parse\n * @return  Satoshis or null\n */\nexport const checkedToSats = (value: number): Satoshis | null => {\n  if (value && value >= 0) return toSats(value)\n  return null\n}\n\n/**\n * Cast a number to Satoshis type\n * @method toSats\n * @param  value number to cast\n * @return  Satoshis\n */\nexport const toSats = (value: number): Satoshis => {\n  return value as Satoshis\n}\n\nexport const isValidAmount = ({\n  amount,\n  min,\n  max,\n}: {\n  amount: number\n  min: number\n  max: number\n}): boolean => {\n  const isValid = amount > 0 && amount >= min && amount <= max\n  const isFixed = min === max\n  return isValid && isFixed ? amount === min : isValid\n}\n\nexport const getJson = async ({\n  url,\n  params,\n}: {\n  url: string\n  params?: { [key: string]: string | number }\n}): Promise<{ [key: string]: string | number }> => {\n  return axios.get(url, { params }).then((response) => {\n    if (response.data.status === 'ERROR')\n      throw new Error(response.data.reason + '')\n    return response.data\n  })\n}\n\nexport const sha256 = (data: string, encoding: BufferEncoding = 'hex') => {\n  const sha256 = new Sha256()\n  sha256.update(Buffer.from(data, encoding))\n  return Buffer.from(sha256.digestSync()).toString('hex')\n}\n\nexport const decodeInvoice = (\n  invoice: string\n): (bolt11.PaymentRequestObject & { tagsObject: bolt11.TagsObject }) | null => {\n  if (!invoice) return null\n\n  try {\n    let network: bolt11.Network | undefined = undefined\n    // hack to support signet invoices, remove when it is supported in bolt11\n    if (invoice.startsWith('lntbs')) {\n      network = {\n        bech32: 'tbs',\n        pubKeyHash: 0x6f,\n        scriptHash: 0xc4,\n        validWitnessVersions: [0, 1],\n      }\n    }\n\n    return bolt11.decode(invoice, network)\n  } catch {\n    return null\n  }\n}\n\nexport const getHashFromInvoice = (invoice: string): string | null => {\n  if (!invoice) return null\n\n  try {\n    const decoded = decodeInvoice(invoice)\n    if (!decoded || !decoded.tags) return null\n\n    const hashTag = decoded.tags.find(\n      (value) => value.tagName === 'payment_hash'\n    )\n    if (!hashTag || !hashTag.data) return null\n\n    return hashTag.data.toString()\n  } catch {\n    return null\n  }\n}\n\nexport const isValidPreimage = ({\n  invoice,\n  preimage,\n}: {\n  invoice: string\n  preimage: string\n}): boolean => {\n  if (!invoice || !preimage) return false\n\n  const invoiceHash = getHashFromInvoice(invoice)\n  if (!invoiceHash) return false\n\n  try {\n    const preimageHash = sha256(preimage)\n    return invoiceHash === preimageHash\n  } catch {\n    return false\n  }\n}\n\nexport const decipherAES = ({\n  successAction,\n  preimage,\n}: {\n  successAction: LNURLPaySuccessAction\n  preimage: string\n}): string | null => {\n  if (\n    successAction.tag !== 'aes' ||\n    !successAction.iv ||\n    !successAction.ciphertext ||\n    !preimage\n  )\n    return null\n\n  const key = aesjs.utils.hex.toBytes(preimage)\n  const iv = Base64.toByteArray(successAction.iv)\n  const ciphertext = Base64.toByteArray(successAction.ciphertext)\n\n  const cbc = new aesjs.ModeOfOperation.cbc(key, iv)\n  let plaintext = cbc.decrypt(ciphertext)\n\n  // remove padding\n  const size = plaintext.length\n  const pad = plaintext[size - 1]\n  plaintext = plaintext.slice(0, size - pad)\n\n  return aesjs.utils.utf8.fromBytes(plaintext)\n}\n","import type { LnUrlPayServiceArgs, LnUrlPayServiceResponse } from './types'\nimport {\n  decodeUrlOrAddress,\n  isOnionUrl,\n  checkedToSats,\n  getJson,\n  isUrl,\n  sha256,\n} from './utils'\n\nconst TAG_PAY_REQUEST = 'payRequest'\n\nexport const requestPayServiceParams = async ({\n  lnUrlOrAddress,\n  onionAllowed = false,\n  fetchGet = getJson,\n}: LnUrlPayServiceArgs): Promise<LnUrlPayServiceResponse> => {\n  const url = decodeUrlOrAddress(lnUrlOrAddress)\n  if (!isUrl(url)) throw new Error('Invalid lnUrlOrAddress')\n  if (!onionAllowed && isOnionUrl(url))\n    throw new Error('Onion requests not allowed')\n\n  const json = await fetchGet({ url })\n  const params = parseLnUrlPayServiceResponse(json)\n  if (!params) throw new Error('Invalid pay service params')\n\n  return params\n}\n\n/**\n * Parse the ln service response to LnUrlPayServiceResponse\n * @method parseLnUrlPayServiceResponse\n * @param  data object to parse\n * @return  LnUrlPayServiceResponse\n */\nconst parseLnUrlPayServiceResponse = (data: {\n  [key: string]: string | number\n}): LnUrlPayServiceResponse | null => {\n  if (data.tag !== TAG_PAY_REQUEST) return null\n\n  const callback = (data.callback + '').trim()\n  if (!isUrl(callback)) return null\n\n  const min = checkedToSats(Math.ceil(Number(data.minSendable || 0) / 1000))\n  const max = checkedToSats(Math.floor(Number(data.maxSendable) / 1000))\n  if (!(min && max) || min > max) return null\n\n  let metadata: Array<Array<string>>\n  let metadataHash: string\n  try {\n    metadata = JSON.parse(data.metadata + '')\n    metadataHash = sha256(data.metadata + '', 'utf8')\n  } catch {\n    metadata = []\n    metadataHash = sha256('[]', 'utf8')\n  }\n\n  let image = ''\n  let description = ''\n  let identifier = ''\n  for (let i = 0; i < metadata.length; i++) {\n    const [k, v] = metadata[i]\n    switch (k) {\n      case 'text/plain':\n        description = v\n        break\n      case 'text/identifier':\n        identifier = v\n        break\n      case 'image/png;base64':\n      case 'image/jpeg;base64':\n        image = 'data:' + k + ',' + v\n        break\n    }\n  }\n\n  let domain\n  try {\n    domain = new URL(callback).hostname\n  } catch {\n    // fail silently and let domain remain undefined if callback is not a valid URL\n  }\n\n  return {\n    callback,\n    fixed: min === max,\n    min,\n    max,\n    domain,\n    metadata,\n    metadataHash,\n    identifier,\n    description,\n    image,\n    commentAllowed: Number(data.commentAllowed) || 0,\n    rawData: data,\n  }\n}\n","import {\n  decipherAES,\n  decodeInvoice,\n  getJson,\n  isOnionUrl,\n  isUrl,\n  isValidAmount,\n  isValidPreimage,\n} from './utils'\nimport type {\n  LNURLPaySuccessAction,\n  LnUrlRequestInvoiceArgs,\n  LnUrlRequestInvoiceResponse,\n  LnUrlrequestInvoiceWithServiceParamsArgs,\n} from './types'\nimport { requestPayServiceParams } from './request-pay-service-params'\n\nexport const requestInvoiceWithServiceParams = async ({\n  params,\n  tokens,\n  comment,\n  onionAllowed = false,\n  validateInvoice = false,\n  fetchGet = getJson,\n}: LnUrlrequestInvoiceWithServiceParamsArgs): Promise<LnUrlRequestInvoiceResponse> => {\n  const { callback, commentAllowed, min, max } = params\n  if (!isValidAmount({ amount: tokens, min, max }))\n    throw new Error('Invalid amount')\n\n  if (!isUrl(callback)) throw new Error('Callback must be a valid url')\n  if (!onionAllowed && isOnionUrl(callback))\n    throw new Error('Onion requests not allowed')\n\n  const invoiceParams: { amount: number; comment?: string } = {\n    amount: tokens * 1000,\n  }\n\n  if (comment && commentAllowed > 0 && comment.length > commentAllowed)\n    throw new Error(\n      `The comment length must be ${commentAllowed} characters or fewer`\n    )\n  if (comment) invoiceParams.comment = comment\n\n  const data = await fetchGet({ url: callback, params: invoiceParams })\n  const invoice = data && data.pr && data.pr.toString()\n  if (!invoice) throw new Error('Invalid pay service invoice')\n\n  const decodedInvoice = decodeInvoice(invoice)\n  const descriptionHash = decodedInvoice?.tags.find(\n    (t) => t.tagName === 'purpose_commit_hash'\n  )\n  const hasValidDescriptionHash = descriptionHash\n    ? params.metadataHash === descriptionHash.data\n    : false\n  if (validateInvoice && !hasValidDescriptionHash)\n    throw new Error(`Invoice description hash doesn't match metadata hash.`)\n\n  const hasValidAmount = decodedInvoice\n    ? decodedInvoice.satoshis === tokens\n    : false\n  if (validateInvoice && !hasValidAmount)\n    throw new Error(\n      `Invalid invoice amount ${decodedInvoice?.satoshis}. Expected ${tokens}`\n    )\n\n  let successAction: LNURLPaySuccessAction | undefined = undefined\n  if (data.successAction) {\n    const decipher = (preimage: string): string | null =>\n      decipherAES({ preimage, successAction: data.successAction })\n    successAction = Object.assign({ decipher }, data.successAction)\n  }\n\n  return {\n    params,\n    rawData: data,\n    invoice,\n    successAction,\n    hasValidAmount,\n    hasValidDescriptionHash,\n    validatePreimage: (preimage: string): boolean =>\n      isValidPreimage({ invoice, preimage }),\n  }\n}\n\nexport const requestInvoice = async ({\n  lnUrlOrAddress,\n  tokens,\n  comment,\n  onionAllowed = false,\n  validateInvoice = false,\n  fetchGet = getJson,\n}: LnUrlRequestInvoiceArgs): Promise<LnUrlRequestInvoiceResponse> => {\n  const params = await requestPayServiceParams({\n    lnUrlOrAddress,\n    onionAllowed,\n    fetchGet,\n  })\n  return requestInvoiceWithServiceParams({\n    params,\n    tokens,\n    comment,\n    onionAllowed,\n    validateInvoice,\n    fetchGet,\n  })\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}