lnurl-pay
Version:
Client library for lnurl-pay and lightning address
304 lines (245 loc) • 8.92 kB
Markdown
Client library for lnurl-pay and lightning address
Install the package with:
```bash
npm i lnurl-pay
yarn add lnurl-pay
```
```js
import { requestInvoice, utils } from 'lnurl-pay'
const {
invoice,
params,
rawData,
successAction,
hasValidAmount,
hasValidDescriptionHash,
validatePreimage,
} = await requestInvoice({
lnUrlOrAddress:
'lnurl1dp68gurn8ghj7urp0yh8xarpva5kueewvaskcmme9e5k7tewwajkcmpdddhx7amw9akxuatjd3cz7atnv4erqgfuvv5',
tokens: 333, // in TS you can use utils.checkedToSats or utils.toSats
})
```
```js
import { requestInvoice, utils } from 'lnurl-pay'
const {
invoice,
params,
rawData,
successAction,
hasValidAmount,
hasValidDescriptionHash,
validatePreimage,
} = await requestInvoice({
lnUrlOrAddress: 'user@domain.com',
tokens: 333, // in TS you can use utils.checkedToSats or utils.toSats
})
```
```js
import { requestInvoice, utils } from 'lnurl-pay'
const {
invoice,
params,
rawData,
successAction,
hasValidAmount,
hasValidDescriptionHash,
validatePreimage,
} = await requestInvoice({
lnUrlOrAddress: 'lnurlp://domain.com/path',
tokens: 333, // in TS you can use utils.checkedToSats or utils.toSats
})
```
- [requestInvoice](
- [requestPayServiceParams](
- [requestInvoiceWithServiceParams](
Request an invoice for lnurl o lightning address
```
{
lnUrlOrAddress: <Bech32 encoded url (lnurl) or lightning address String>
tokens: <Amount in satoshis Number>
[comment]: <Comment String>
[onionAllowed]: <Onion url allowed Bool> // Default to false
[validateInvoice]: <If true validates the invoice amount and description hash Bool> // Default to false
[fetchGet]: <Function to make a GET request Function> // Default to axios get
}
@throws <Error>
@returns
{
invoice: <Invoice returned by pay service String>
successAction: <Success action defined by lnurl-rfc Object>
params: {
callback: <Url used to request the invoice String>
fixed: <Indicates if amount must be a fixed amount Bool>
min: <Min amount in satoshis Number>
max: <Max amount in satoshis Number>
domain: <Callback domain String>
metadata: <Decoded metadata Array>
metadataHash: <Metadata hash String>
identifier: <Metadata identifier String>
description: <Metadata description String>
image: <Metadata base64 image String>
commentAllowed: <Number of characters accepted for the comment query parameter Number> // Default to 0 - not allowed
}
rawData: <Raw data response Object>
hasValidAmount: <True if the returned invoice amount is equal to tokens param Bool>
hasValidDescriptionHash: <True if the returned invoice description hash is equal to metadata hash Bool>
validatePreimage: <validates if preimage param is valid for invoice Function> // (preimage: string) => boolean
}
```
Example:
```node
const { invoice, params, successAction } = await requestInvoice({
lnUrlOrAddress:
'lnurl1dp68gurn8ghj7urp0yh8xarpva5kueewvaskcmme9e5k7tewwajkcmpdddhx7amw9akxuatjd3cz7atnv4erqgfuvv5',
tokens: 333,
})
```
Request pay service params for lnurl o lightning address (1st step)
```
{
lnUrlOrAddress: <Bech32 encoded url (lnurl) or lightning address String>
[onionAllowed]: <Onion url allowed Bool> // Default to false
[fetchGet]: <Function to make a GET request Function> // Default to axios get
}
@throws <Error>
@returns
{
callback: <Url used to request the invoice String>
fixed: <Indicates if amount must be a fixed amount Bool>
min: <Min amount in satoshis Number>
max: <Max amount in satoshis Number>
domain: <Callback domain String>
metadata: <Decoded metadata Array>
metadataHash: <Metadata hash String>
identifier: <Metadata identifier String>
description: <Metadata description String>
image: <Metadata base64 image String>
commentAllowed: <Number of characters accepted for the comment query parameter Number> // Default to 0 - not allowed
}
```
Example:
```node
const params = await requestPayServiceParams({
lnUrlOrAddress:
'lnurl1dp68gurn8ghj7urp0yh8xarpva5kueewvaskcmme9e5k7tewwajkcmpdddhx7amw9akxuatjd3cz7atnv4erqgfuvv5',
})
```
Request an invoice for lnurl o lightning address with the given service params (2nd step)
```
{
params: {
callback: <Url used to request the invoice String>
fixed: <Indicates if amount must be a fixed amount Bool>
min: <Min amount in satoshis Number>
max: <Max amount in satoshis Number>
domain: <Callback domain String>
metadata: <Decoded metadata Array>
metadataHash: <Metadata hash String>
identifier: <Metadata identifier String>
description: <Metadata description String>
image: <Metadata base64 image String>
commentAllowed: <Number of characters accepted for the comment query parameter Number> // Default to 0 - not allowed
}
tokens: <Amount in satoshis Number>
[]: <Comment String>
[]: <Onion url allowed Bool> // Default to false
[]: <If true validates the invoice amount and description hash Bool> // Default to false
[]: <Function to make a GET request Function> // Default to axios get
}
@throws <Error>
@returns
{
invoice: <Invoice returned by pay service String>
successAction: <Success action defined by lnurl-rfc Object>
params: {
callback: <Url used to request the invoice String>
fixed: <Indicates if amount must be a fixed amount Bool>
min: <Min amount in satoshis Number>
max: <Max amount in satoshis Number>
domain: <Callback domain String>
metadata: <Decoded metadata Array>
metadataHash: <Metadata hash String>
identifier: <Metadata identifier String>
description: <Metadata description String>
image: <Metadata base64 image String>
commentAllowed: <Number of characters accepted for the comment query parameter Number> // Default to 0 - not allowed
}
hasValidAmount: <True if the returned invoice amount is equal to tokens param>
hasValidDescriptionHash: <True if the returned invoice description hash is equal to metadata hash>
validatePreimage: <validates if preimage param is valid for invoice Function> // (preimage: string) => boolean
}
```
Example:
```node
const params = await requestInvoiceWithServiceParams({
params,
tokens: 333,
})
```
- [decodeUrlOrAddress](
- [isLnurl](
- [isLnurlp](
- [parseLnUrl](
- [parseLnurlp](
- [isLightningAddress](
- [parseLightningAddress](
- [isOnionUrl](
- [getHashFromInvoice](
- [isValidPreimage](
- [decipherAES](
Test with Jest framework:
```bash
yarn test
```
Build production (distribution) files in **dist** folder:
```bash
yarn build
```
It generates CommonJS (in **dist/cjs** folder), ES Modules (in **dist/esm** folder), bundled and minified UMD (in **dist/umd** folder), as well as TypeScript declaration files (in **dist/types** folder).
## Local development
Run:
```bash
yarn link
# or
npm link
```
and in your test project run:
```bash
yarn link lnurl-pay
# or
npm link lnurl-pay
```
If you want to remove the symlink, run:
```bash
# in your test project
yarn unlink lnurl-pay
# or
npm unlink lnurl-pay
# in lnurl-pay folder
yarn unlink
# or
npm unlink
```
Please check more details in [npm link](https://docs.npmjs.com/cli/v6/commands/npm-link) or [yarn link](https://yarnpkg.com/cli/link)
## References
This library was developed based on:
- [lnurl-rfc](https://github.com/fiatjaf/lnurl-rfc)
- [js-lnurl](https://github.com/fiatjaf/js-lnurl)
- [Lightning Address](https://github.com/andrerfneves/lightning-address)
- [BlueWallet](https://github.com/BlueWallet/BlueWallet)
- [Example TypeScript Package ](https://github.com/tomchen/example-typescript-package)