stacker.news/wallets/blink/server.js

64 lines
1.8 KiB
JavaScript

import { getScopes, SCOPE_READ, SCOPE_RECEIVE, SCOPE_WRITE, getWallet, request } from '@/wallets/blink/common'
import { msatsToSats } from '@/lib/format'
export * from '@/wallets/blink'
export async function testCreateInvoice ({ apiKeyRecv, currencyRecv }, { signal }) {
const scopes = await getScopes({ apiKey: apiKeyRecv }, { signal })
if (!scopes.includes(SCOPE_READ)) {
throw new Error('missing READ scope')
}
if (scopes.includes(SCOPE_WRITE)) {
throw new Error('WRITE scope must not be present')
}
if (!scopes.includes(SCOPE_RECEIVE)) {
throw new Error('missing RECEIVE scope')
}
currencyRecv = currencyRecv ? currencyRecv.toUpperCase() : 'BTC'
return await createInvoice({ msats: 1000, expiry: 1 }, { apiKeyRecv, currencyRecv }, { signal })
}
export async function createInvoice (
{ msats, description, expiry },
{ apiKeyRecv: apiKey, currencyRecv: currency },
{ signal }) {
currency = currency ? currency.toUpperCase() : 'BTC'
const wallet = await getWallet({ apiKey, currency }, { signal })
if (currency !== 'BTC') {
throw new Error('unsupported currency ' + currency)
}
const out = await request({
apiKey,
query: `
mutation LnInvoiceCreate($input: LnInvoiceCreateInput!) {
lnInvoiceCreate(input: $input) {
invoice {
paymentRequest
}
errors {
message
}
}
}`,
variables: {
input: {
amount: msatsToSats(msats),
expiresIn: Math.floor(expiry / 60) || 1,
memo: description,
walletId: wallet.id
}
}
}, { signal })
const res = out.data.lnInvoiceCreate
const errors = res.errors
if (errors && errors.length > 0) {
throw new Error(errors.map(e => e.code + ' ' + e.message).join(', '))
}
return res.invoice.paymentRequest
}