diff --git a/event.ts b/event.ts index d1de4c2..8dc35ef 100644 --- a/event.ts +++ b/event.ts @@ -25,20 +25,22 @@ export enum Kind { Article = 30023 } -export type Event = { - id?: string - sig?: string +export type EventTemplate = { kind: Kind tags: string[][] - pubkey: string content: string created_at: number } -export function getBlankEvent(): Event { +export type Event = EventTemplate & { + pubkey: string + id: string + sig: string +} + +export function getBlankEvent(): EventTemplate { return { kind: 255, - pubkey: '', content: '', tags: [], created_at: 0 diff --git a/index.ts b/index.ts index 6e4757c..249c968 100644 --- a/index.ts +++ b/index.ts @@ -9,6 +9,7 @@ export * as nip05 from './nip05' export * as nip06 from './nip06' export * as nip19 from './nip19' export * as nip26 from './nip26' +export * as nip57 from './nip57' export * as fj from './fakejson' export * as utils from './utils' diff --git a/nip57.ts b/nip57.ts new file mode 100644 index 0000000..e0d50e7 --- /dev/null +++ b/nip57.ts @@ -0,0 +1,73 @@ +import {bech32} from '@scure/base' + +import {Event, EventTemplate} from './event' +import {utf8Decoder} from './utils' + +var _fetch: any + +try { + _fetch = fetch +} catch {} + +export function useFetchImplementation(fetchImplementation: any) { + _fetch = fetchImplementation +} + +export async function getZapEndpoint(metadata: Event): Promise { + try { + let lnurl: string = '' + let {lud06, lud16} = JSON.parse(metadata.content) + if (lud06) { + let {words} = bech32.decode(lud06, 1000) + let data = bech32.fromWords(words) + lnurl = utf8Decoder.decode(data) + } else if (lud16) { + let [name, domain] = lud16.split('@') + lnurl = `https://${domain}/.well-known/lnurlp/${name}` + } else { + return null + } + + let res = await _fetch(lnurl) + let body = await res.json() + + if (body.allowsNostr && body.nostrPubkey) { + return body.callback + } + } catch (err) { + /*-*/ + } + + return null +} + +export function makeZapRequest({ + profile, + event, + amount, + relays, + comment = '' +}: { + profile: string + event: string | null + amount: string + comment: string + relays: string[] +}): EventTemplate { + let zr = { + kind: 9734, + created_at: Math.round(Date.now() / 1000), + content: comment, + tags: [ + ['p', profile], + ['amount', amount], + ['relays', ...relays] + ] + } + + if (event) { + zr.tags.push(['e', event]) + } + + return zr +}