nostr-tools 1.8.3 → 1.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/esm/nostr.mjs CHANGED
@@ -121,6 +121,7 @@ var Kind = /* @__PURE__ */ ((Kind2) => {
121
121
  Kind2[Kind2["EncryptedDirectMessage"] = 4] = "EncryptedDirectMessage";
122
122
  Kind2[Kind2["EventDeletion"] = 5] = "EventDeletion";
123
123
  Kind2[Kind2["Reaction"] = 7] = "Reaction";
124
+ Kind2[Kind2["BadgeAward"] = 8] = "BadgeAward";
124
125
  Kind2[Kind2["ChannelCreation"] = 40] = "ChannelCreation";
125
126
  Kind2[Kind2["ChannelMetadata"] = 41] = "ChannelMetadata";
126
127
  Kind2[Kind2["ChannelMessage"] = 42] = "ChannelMessage";
@@ -131,6 +132,8 @@ var Kind = /* @__PURE__ */ ((Kind2) => {
131
132
  Kind2[Kind2["Zap"] = 9735] = "Zap";
132
133
  Kind2[Kind2["RelayList"] = 10002] = "RelayList";
133
134
  Kind2[Kind2["ClientAuth"] = 22242] = "ClientAuth";
135
+ Kind2[Kind2["BadgeDefinition"] = 30008] = "BadgeDefinition";
136
+ Kind2[Kind2["ProfileBadge"] = 30009] = "ProfileBadge";
134
137
  Kind2[Kind2["Article"] = 30023] = "Article";
135
138
  return Kind2;
136
139
  })(Kind || {});
@@ -165,8 +168,9 @@ function getEventHash(event) {
165
168
  let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)));
166
169
  return secp256k12.utils.bytesToHex(eventHash);
167
170
  }
171
+ var isRecord = (obj) => obj instanceof Object;
168
172
  function validateEvent(event) {
169
- if (typeof event !== "object")
173
+ if (!isRecord(event))
170
174
  return false;
171
175
  if (typeof event.kind !== "number")
172
176
  return false;
@@ -1032,7 +1036,7 @@ async function queryProfile(fullname) {
1032
1036
  domain = name;
1033
1037
  name = "_";
1034
1038
  }
1035
- if (!name.match(/^[A-Za-z0-9-_]+$/))
1039
+ if (!name.match(/^[A-Za-z0-9-_.]+$/))
1036
1040
  return null;
1037
1041
  if (!domain.includes("."))
1038
1042
  return null;
@@ -1139,13 +1143,44 @@ function parse(event) {
1139
1143
  return result;
1140
1144
  }
1141
1145
 
1146
+ // nip13.ts
1147
+ var nip13_exports = {};
1148
+ __export(nip13_exports, {
1149
+ getPow: () => getPow
1150
+ });
1151
+ import * as secp256k16 from "@noble/secp256k1";
1152
+ function getPow(id) {
1153
+ return getLeadingZeroBits(secp256k16.utils.hexToBytes(id));
1154
+ }
1155
+ function getLeadingZeroBits(hash) {
1156
+ let total, i, bits;
1157
+ for (i = 0, total = 0; i < hash.length; i++) {
1158
+ bits = msb(hash[i]);
1159
+ total += bits;
1160
+ if (bits !== 8) {
1161
+ break;
1162
+ }
1163
+ }
1164
+ return total;
1165
+ }
1166
+ function msb(b) {
1167
+ let n = 0;
1168
+ if (b === 0) {
1169
+ return 8;
1170
+ }
1171
+ while (b >>= 1) {
1172
+ n++;
1173
+ }
1174
+ return 7 - n;
1175
+ }
1176
+
1142
1177
  // nip26.ts
1143
1178
  var nip26_exports = {};
1144
1179
  __export(nip26_exports, {
1145
1180
  createDelegation: () => createDelegation,
1146
1181
  getDelegator: () => getDelegator
1147
1182
  });
1148
- import * as secp256k16 from "@noble/secp256k1";
1183
+ import * as secp256k17 from "@noble/secp256k1";
1149
1184
  import { sha256 as sha2562 } from "@noble/hashes/sha256";
1150
1185
  function createDelegation(privateKey, parameters) {
1151
1186
  let conditions = [];
@@ -1161,8 +1196,8 @@ function createDelegation(privateKey, parameters) {
1161
1196
  let sighash = sha2562(
1162
1197
  utf8Encoder.encode(`nostr:delegation:${parameters.pubkey}:${cond}`)
1163
1198
  );
1164
- let sig = secp256k16.utils.bytesToHex(
1165
- secp256k16.schnorr.signSync(sighash, privateKey)
1199
+ let sig = secp256k17.utils.bytesToHex(
1200
+ secp256k17.schnorr.signSync(sighash, privateKey)
1166
1201
  );
1167
1202
  return {
1168
1203
  from: getPublicKey(privateKey),
@@ -1193,7 +1228,7 @@ function getDelegator(event) {
1193
1228
  let sighash = sha2562(
1194
1229
  utf8Encoder.encode(`nostr:delegation:${event.pubkey}:${cond}`)
1195
1230
  );
1196
- if (!secp256k16.schnorr.verifySync(sig, sighash, pubkey))
1231
+ if (!secp256k17.schnorr.verifySync(sig, sighash, pubkey))
1197
1232
  return null;
1198
1233
  return pubkey;
1199
1234
  }
@@ -1339,11 +1374,11 @@ function makeZapReceipt({
1339
1374
  }
1340
1375
 
1341
1376
  // index.ts
1342
- import * as secp256k17 from "@noble/secp256k1";
1377
+ import * as secp256k18 from "@noble/secp256k1";
1343
1378
  import { hmac } from "@noble/hashes/hmac";
1344
1379
  import { sha256 as sha2563 } from "@noble/hashes/sha256";
1345
- secp256k17.utils.hmacSha256Sync = (key, ...msgs) => hmac(sha2563, key, secp256k17.utils.concatBytes(...msgs));
1346
- secp256k17.utils.sha256Sync = (...msgs) => sha2563(secp256k17.utils.concatBytes(...msgs));
1380
+ secp256k18.utils.hmacSha256Sync = (key, ...msgs) => hmac(sha2563, key, secp256k18.utils.concatBytes(...msgs));
1381
+ secp256k18.utils.sha256Sync = (...msgs) => sha2563(secp256k18.utils.concatBytes(...msgs));
1347
1382
  export {
1348
1383
  Kind,
1349
1384
  SimplePool,
@@ -1359,6 +1394,7 @@ export {
1359
1394
  nip05_exports as nip05,
1360
1395
  nip06_exports as nip06,
1361
1396
  nip10_exports as nip10,
1397
+ nip13_exports as nip13,
1362
1398
  nip19_exports as nip19,
1363
1399
  nip26_exports as nip26,
1364
1400
  nip39_exports as nip39,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../keys.ts", "../../event.ts", "../../utils.ts", "../../filter.ts", "../../fakejson.ts", "../../relay.ts", "../../pool.ts", "../../nip19.ts", "../../references.ts", "../../nip04.ts", "../../nip05.ts", "../../nip06.ts", "../../nip10.ts", "../../nip26.ts", "../../nip39.ts", "../../nip57.ts", "../../index.ts"],
4
- "sourcesContent": ["import * as secp256k1 from '@noble/secp256k1'\n\nexport function generatePrivateKey(): string {\n return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey())\n}\n\nexport function getPublicKey(privateKey: string): string {\n return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey))\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\n/* eslint-disable no-unused-vars */\nexport enum Kind {\n Metadata = 0,\n Text = 1,\n RecommendRelay = 2,\n Contacts = 3,\n EncryptedDirectMessage = 4,\n EventDeletion = 5,\n Reaction = 7,\n ChannelCreation = 40,\n ChannelMetadata = 41,\n ChannelMessage = 42,\n ChannelHideMessage = 43,\n ChannelMuteUser = 44,\n Report = 1984,\n ZapRequest = 9734,\n Zap = 9735,\n RelayList = 10002,\n ClientAuth = 22242,\n Article = 30023\n}\n\nexport type EventTemplate = {\n kind: Kind\n tags: string[][]\n content: string\n created_at: number\n}\n\nexport type UnsignedEvent = EventTemplate & {\n pubkey: string\n}\n\nexport type Event = UnsignedEvent & {\n id: string\n sig: string\n}\n\nexport function getBlankEvent(): EventTemplate {\n return {\n kind: 255,\n content: '',\n tags: [],\n created_at: 0\n }\n}\n\nexport function finishEvent(t: EventTemplate, privateKey: string): Event {\n let event = t as Event\n event.pubkey = getPublicKey(privateKey)\n event.id = getEventHash(event)\n event.sig = signEvent(event, privateKey)\n return event\n}\n\nexport function serializeEvent(evt: UnsignedEvent): string {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\")\n\n return JSON.stringify([\n 0,\n evt.pubkey,\n evt.created_at,\n evt.kind,\n evt.tags,\n evt.content\n ])\n}\n\nexport function getEventHash(event: UnsignedEvent): string {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))\n return secp256k1.utils.bytesToHex(eventHash)\n}\n\nexport function validateEvent<T>(event: T): event is T & UnsignedEvent {\n if (typeof event !== 'object') return false\n if (typeof event.kind !== 'number') return false\n if (typeof event.content !== 'string') return false\n if (typeof event.created_at !== 'number') return false\n if (typeof event.pubkey !== 'string') return false\n if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false\n\n if (!Array.isArray(event.tags)) return false\n for (let i = 0; i < event.tags.length; i++) {\n let tag = event.tags[i]\n if (!Array.isArray(tag)) return false\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === 'object') return false\n }\n }\n\n return true\n}\n\nexport function verifySignature(event: Event): boolean {\n return secp256k1.schnorr.verifySync(\n event.sig,\n getEventHash(event),\n event.pubkey\n )\n}\n\nexport function signEvent(event: UnsignedEvent, key: string): string {\n return secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(getEventHash(event), key)\n )\n}\n", "import {Event} from './event'\n\nexport const utf8Decoder = new TextDecoder('utf-8')\nexport const utf8Encoder = new TextEncoder()\n\nexport function normalizeURL(url: string): string {\n let p = new URL(url)\n p.pathname = p.pathname.replace(/\\/+/g, '/')\n if (p.pathname.endsWith('/')) p.pathname = p.pathname.slice(0, -1)\n if (\n (p.port === '80' && p.protocol === 'ws:') ||\n (p.port === '443' && p.protocol === 'wss:')\n )\n p.port = ''\n p.searchParams.sort()\n p.hash = ''\n return p.toString()\n}\n\n//\n// fast insert-into-sorted-array functions adapted from https://github.com/terrymorse58/fast-sorted-array\n//\nexport function insertEventIntoDescendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at < sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at >= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at > event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at < event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n\nexport function insertEventIntoAscendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at > sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at <= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at < event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at > event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n", "import {Event} from './event'\n\nexport type Filter = {\n ids?: string[]\n kinds?: number[]\n authors?: string[]\n since?: number\n until?: number\n limit?: number\n search?: string\n [key: `#${string}`]: string[]\n}\n\nexport function matchFilter(\n filter: Filter,\n event: Event\n): boolean {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n if (!filter.ids.some(prefix => event.id.startsWith(prefix))) {\n return false\n }\n }\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) return false\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n if (!filter.authors.some(prefix => event.pubkey.startsWith(prefix))) {\n return false\n }\n }\n\n for (let f in filter) {\n if (f[0] === '#') {\n let tagName = f.slice(1)\n let values = filter[`#${tagName}`]\n if (\n values &&\n !event.tags.find(\n ([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1\n )\n )\n return false\n }\n }\n\n if (filter.since && event.created_at < filter.since) return false\n if (filter.until && event.created_at >= filter.until) return false\n\n return true\n}\n\nexport function matchFilters(\n filters: Filter[],\n event: Event\n): boolean {\n for (let i = 0; i < filters.length; i++) {\n if (matchFilter(filters[i], event)) return true\n }\n return false\n}\n", "export function getHex64(json: string, field: string): string {\n let len = field.length + 3\n let idx = json.indexOf(`\"${field}\":`) + len\n let s = json.slice(idx).indexOf(`\"`) + idx + 1\n return json.slice(s, s + 64)\n}\n\nexport function getInt(json: string, field: string): number {\n let len = field.length\n let idx = json.indexOf(`\"${field}\":`) + len + 3\n let sliced = json.slice(idx)\n let end = Math.min(sliced.indexOf(','), sliced.indexOf('}'))\n return parseInt(sliced.slice(0, end), 10)\n}\n\nexport function getSubscriptionId(json: string): string | null {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`)\n if (idx === -1) return null\n\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`)\n if (pstart === -1) return null\n let start = idx + 7 + 1 + pstart\n\n let pend = json.slice(start + 1, 80).indexOf(`\"`)\n if (pend === -1) return null\n let end = start + 1 + pend\n\n return json.slice(start + 1, end)\n}\n\nexport function matchEventId(json: string, id: string): boolean {\n return id === getHex64(json, 'id')\n}\n\nexport function matchEventPubkey(json: string, pubkey: string): boolean {\n return pubkey === getHex64(json, 'pubkey')\n}\n\nexport function matchEventKind(json: string, kind: number): boolean {\n return kind === getInt(json, 'kind')\n}\n", "/* global WebSocket */\n\nimport {Event, verifySignature, validateEvent} from './event'\nimport {Filter, matchFilters} from './filter'\nimport {getHex64, getSubscriptionId} from './fakejson'\n\ntype RelayEvent = {\n connect: () => void | Promise<void>\n disconnect: () => void | Promise<void>\n error: () => void | Promise<void>\n notice: (msg: string) => void | Promise<void>\n}\ntype SubEvent = {\n event: (event: Event) => void | Promise<void>\n eose: () => void | Promise<void>\n}\nexport type Relay = {\n url: string\n status: number\n connect: () => Promise<void>\n close: () => void\n sub: (filters: Filter[], opts?: SubscriptionOptions) => Sub\n list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]>\n get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null>\n publish: (event: Event) => Pub\n off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => void\n on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => void\n}\nexport type Pub = {\n on: (type: 'ok' | 'failed', cb: any) => void\n off: (type: 'ok' | 'failed', cb: any) => void\n}\nexport type Sub = {\n sub: (filters: Filter[], opts: SubscriptionOptions) => Sub\n unsub: () => void\n on: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => void\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => void\n}\n\nexport type SubscriptionOptions = {\n id?: string\n skipVerification?: boolean\n alreadyHaveEvent?: null | ((id: string, relay: string) => boolean)\n}\n\nexport function relayInit(\n url: string,\n options: {\n getTimeout?: number\n listTimeout?: number\n } = {}\n): Relay {\n let {listTimeout = 3000, getTimeout = 3000} = options\n\n var ws: WebSocket\n var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}\n var listeners: {[TK in keyof RelayEvent]: RelayEvent[TK][]} = {\n connect: [],\n disconnect: [],\n error: [],\n notice: []\n }\n var subListeners: {\n [subid: string]: {[TK in keyof SubEvent]: SubEvent[TK][]}\n } = {}\n var pubListeners: {\n [eventid: string]: {\n ok: Array<() => void>\n seen: Array<() => void>\n failed: Array<(reason: string) => void>\n }\n } = {}\n\n var connectionPromise: Promise<void> | undefined\n async function connectRelay(): Promise<void> {\n if (connectionPromise) return connectionPromise\n connectionPromise = new Promise((resolve, reject) => {\n try {\n ws = new WebSocket(url)\n } catch (err) {\n reject(err)\n }\n\n ws.onopen = () => {\n listeners.connect.forEach(cb => cb())\n resolve()\n }\n ws.onerror = () => {\n connectionPromise = undefined\n listeners.error.forEach(cb => cb())\n reject()\n }\n ws.onclose = async () => {\n connectionPromise = undefined\n listeners.disconnect.forEach(cb => cb())\n }\n\n let incomingMessageQueue: string[] = []\n let handleNextInterval: any\n\n ws.onmessage = e => {\n incomingMessageQueue.push(e.data)\n if (!handleNextInterval) {\n handleNextInterval = setInterval(handleNext, 0)\n }\n }\n\n function handleNext() {\n if (incomingMessageQueue.length === 0) {\n clearInterval(handleNextInterval)\n handleNextInterval = null\n return\n }\n\n var json = incomingMessageQueue.shift()\n if (!json) return\n\n let subid = getSubscriptionId(json)\n if (subid) {\n let so = openSubs[subid]\n if (\n so &&\n so.alreadyHaveEvent &&\n so.alreadyHaveEvent(getHex64(json, 'id'), url)\n ) {\n return\n }\n }\n\n try {\n let data = JSON.parse(json)\n\n // we won't do any checks against the data since all failures (i.e. invalid messages from relays)\n // will naturally be caught by the encompassing try..catch block\n\n switch (data[0]) {\n case 'EVENT':\n let id = data[1]\n let event = data[2]\n if (\n validateEvent(event) &&\n openSubs[id] &&\n (openSubs[id].skipVerification || verifySignature(event)) &&\n matchFilters(openSubs[id].filters, event)\n ) {\n openSubs[id]\n ;(subListeners[id]?.event || []).forEach(cb => cb(event))\n }\n return\n case 'EOSE': {\n let id = data[1]\n if (id in subListeners) {\n subListeners[id].eose.forEach(cb => cb())\n subListeners[id].eose = [] // 'eose' only happens once per sub, so stop listeners here\n }\n return\n }\n case 'OK': {\n let id: string = data[1]\n let ok: boolean = data[2]\n let reason: string = data[3] || ''\n if (id in pubListeners) {\n if (ok) pubListeners[id].ok.forEach(cb => cb())\n else pubListeners[id].failed.forEach(cb => cb(reason))\n pubListeners[id].ok = [] // 'ok' only happens once per pub, so stop listeners here\n pubListeners[id].failed = []\n }\n return\n }\n case 'NOTICE':\n let notice = data[1]\n listeners.notice.forEach(cb => cb(notice))\n return\n }\n } catch (err) {\n return\n }\n }\n })\n\n return connectionPromise\n }\n\n function connected() {\n return ws?.readyState === 1\n }\n\n async function connect(): Promise<void> {\n if (connected()) return // ws already open\n await connectRelay()\n }\n\n async function trySend(params: [string, ...any]) {\n let msg = JSON.stringify(params)\n if (!connected()) {\n await new Promise(resolve => setTimeout(resolve, 1000))\n if (!connected()) {\n return\n }\n }\n try {\n ws.send(msg)\n } catch (err) {\n console.log(err)\n }\n }\n\n const sub = (\n filters: Filter[],\n {\n skipVerification = false,\n alreadyHaveEvent = null,\n id = Math.random().toString().slice(2)\n }: SubscriptionOptions = {}\n ): Sub => {\n let subid = id\n\n openSubs[subid] = {\n id: subid,\n filters,\n skipVerification,\n alreadyHaveEvent\n }\n trySend(['REQ', subid, ...filters])\n\n return {\n sub: (newFilters, newOpts = {}) =>\n sub(newFilters || filters, {\n skipVerification: newOpts.skipVerification || skipVerification,\n alreadyHaveEvent: newOpts.alreadyHaveEvent || alreadyHaveEvent,\n id: subid\n }),\n unsub: () => {\n delete openSubs[subid]\n delete subListeners[subid]\n trySend(['CLOSE', subid])\n },\n on: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): void => {\n subListeners[subid] = subListeners[subid] || {\n event: [],\n eose: []\n }\n subListeners[subid][type].push(cb)\n },\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): void => {\n let listeners = subListeners[subid]\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n }\n\n return {\n url,\n sub,\n on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): void => {\n listeners[type].push(cb)\n if (type === 'connect' && ws?.readyState === 1) {\n // i would love to know why we need this\n ;(cb as () => void)()\n }\n },\n off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): void => {\n let index = listeners[type].indexOf(cb)\n if (index !== -1) listeners[type].splice(index, 1)\n },\n list: (filters: Filter[], opts?: SubscriptionOptions): Promise<Event[]> =>\n new Promise(resolve => {\n let s = sub(filters, opts)\n let events: Event[] = []\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(events)\n }, listTimeout)\n s.on('eose', () => {\n s.unsub()\n clearTimeout(timeout)\n resolve(events)\n })\n s.on('event', (event: Event) => {\n events.push(event)\n })\n }),\n get: (filter: Filter, opts?: SubscriptionOptions): Promise<Event | null> =>\n new Promise(resolve => {\n let s = sub([filter], opts)\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(null)\n }, getTimeout)\n s.on('event', (event: Event) => {\n s.unsub()\n clearTimeout(timeout)\n resolve(event)\n })\n }),\n publish(event: Event): Pub {\n if (!event.id) throw new Error(`event ${event} has no id`)\n let id = event.id\n\n trySend(['EVENT', event])\n\n return {\n on: (type: 'ok' | 'failed', cb: any) => {\n pubListeners[id] = pubListeners[id] || {\n ok: [],\n failed: []\n }\n pubListeners[id][type].push(cb)\n },\n off: (type: 'ok' | 'failed', cb: any) => {\n let listeners = pubListeners[id]\n if (!listeners) return\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n },\n connect,\n close(): void {\n listeners = {connect: [], disconnect: [], error: [], notice: []}\n subListeners = {}\n pubListeners = {}\n if (ws.readyState === WebSocket.OPEN) {\n ws?.close()\n }\n },\n get status() {\n return ws?.readyState ?? 3\n }\n }\n}\n", "import {Relay, relayInit} from './relay'\nimport {normalizeURL} from './utils'\nimport {Filter} from './filter'\nimport {Event} from './event'\nimport {SubscriptionOptions, Sub, Pub} from './relay'\n\nexport class SimplePool {\n private _conn: {[url: string]: Relay}\n private _seenOn: {[id: string]: Set<string>} = {} // a map of all events we've seen in each relay\n\n private eoseSubTimeout: number\n private getTimeout: number\n\n constructor(options: {eoseSubTimeout?: number; getTimeout?: number} = {}) {\n this._conn = {}\n this.eoseSubTimeout = options.eoseSubTimeout || 3400\n this.getTimeout = options.getTimeout || 3400\n }\n\n close(relays: string[]): void {\n relays.forEach(url => {\n let relay = this._conn[normalizeURL(url)]\n if (relay) relay.close()\n })\n }\n\n async ensureRelay(url: string): Promise<Relay> {\n const nm = normalizeURL(url)\n\n if (!this._conn[nm]) {\n this._conn[nm] = relayInit(nm, {\n getTimeout: this.getTimeout * 0.9,\n listTimeout: this.getTimeout * 0.9\n })\n }\n\n const relay = this._conn[nm]\n await relay.connect()\n return relay\n }\n\n sub(relays: string[], filters: Filter[], opts?: SubscriptionOptions): Sub {\n let _knownIds: Set<string> = new Set()\n let modifiedOpts = {...(opts || {})}\n modifiedOpts.alreadyHaveEvent = (id, url) => {\n if (opts?.alreadyHaveEvent?.(id, url)) {\n return true\n }\n let set = this._seenOn[id] || new Set()\n set.add(url)\n this._seenOn[id] = set\n return _knownIds.has(id)\n }\n\n let subs: Sub[] = []\n let eventListeners: Set<(event: Event) => void> = new Set()\n let eoseListeners: Set<() => void> = new Set()\n let eosesMissing = relays.length\n\n let eoseSent = false\n let eoseTimeout = setTimeout(() => {\n eoseSent = true\n for (let cb of eoseListeners.values()) cb()\n }, this.eoseSubTimeout)\n\n relays.forEach(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n } catch (err) {\n handleEose()\n return\n }\n if (!r) return\n let s = r.sub(filters, modifiedOpts)\n s.on('event', (event: Event) => {\n _knownIds.add(event.id as string)\n for (let cb of eventListeners.values()) cb(event)\n })\n s.on('eose', () => {\n if (eoseSent) return\n handleEose()\n })\n subs.push(s)\n\n function handleEose() {\n eosesMissing--\n if (eosesMissing === 0) {\n clearTimeout(eoseTimeout)\n for (let cb of eoseListeners.values()) cb()\n }\n }\n })\n\n let greaterSub: Sub = {\n sub(filters, opts) {\n subs.forEach(sub => sub.sub(filters, opts))\n return greaterSub\n },\n unsub() {\n subs.forEach(sub => sub.unsub())\n },\n on(type, cb) {\n if (type === 'event') {\n eventListeners.add(cb)\n } else if (type === 'eose') {\n eoseListeners.add(cb as () => void | Promise<void>)\n }\n },\n off(type, cb) {\n if (type === 'event') {\n eventListeners.delete(cb)\n } else if (type === 'eose')\n eoseListeners.delete(cb as () => void | Promise<void>)\n }\n }\n\n return greaterSub\n }\n\n get(\n relays: string[],\n filter: Filter,\n opts?: SubscriptionOptions\n ): Promise<Event | null> {\n return new Promise(resolve => {\n let sub = this.sub(relays, [filter], opts)\n let timeout = setTimeout(() => {\n sub.unsub()\n resolve(null)\n }, this.getTimeout)\n sub.on('event', (event: Event) => {\n resolve(event)\n clearTimeout(timeout)\n sub.unsub()\n })\n })\n }\n\n list(\n relays: string[],\n filters: Filter[],\n opts?: SubscriptionOptions\n ): Promise<Event[]> {\n return new Promise(resolve => {\n let events: Event[] = []\n let sub = this.sub(relays, filters, opts)\n\n sub.on('event', (event: Event) => {\n events.push(event)\n })\n\n // we can rely on an eose being emitted here because pool.sub() will fake one\n sub.on('eose', () => {\n sub.unsub()\n resolve(events)\n })\n })\n }\n\n publish(relays: string[], event: Event): Pub {\n const pubPromises: Promise<Pub>[] = relays.map(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n return r.publish(event)\n } catch (_) {\n return {on() {}, off() {}}\n }\n })\n\n const callbackMap = new Map()\n\n return {\n on(type, cb) {\n relays.forEach(async (relay, i) => {\n let pub = await pubPromises[i]\n let callback = () => cb(relay)\n callbackMap.set(cb, callback)\n pub.on(type, callback)\n })\n },\n\n off(type, cb) {\n relays.forEach(async (_, i) => {\n let callback = callbackMap.get(cb)\n if (callback) {\n let pub = await pubPromises[i]\n pub.off(type, callback)\n }\n })\n }\n }\n }\n\n seenOn(id: string): string[] {\n return Array.from(this._seenOn[id]?.values?.() || [])\n }\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {bech32} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nconst Bech32MaxSize = 5000\n\nexport type ProfilePointer = {\n pubkey: string // hex\n relays?: string[]\n}\n\nexport type EventPointer = {\n id: string // hex\n relays?: string[]\n author?: string\n}\n\nexport type AddressPointer = {\n identifier: string\n pubkey: string\n kind: number\n relays?: string[]\n}\n\nexport function decode(nip19: string): {\n type: string\n data: ProfilePointer | EventPointer | AddressPointer | string\n} {\n let {prefix, words} = bech32.decode(nip19, Bech32MaxSize)\n let data = new Uint8Array(bech32.fromWords(words))\n\n switch (prefix) {\n case 'nprofile': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nprofile')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nprofile',\n data: {\n pubkey: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n case 'nevent': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n if (tlv[2] && tlv[2][0].length !== 32)\n throw new Error('TLV 2 should be 32 bytes')\n\n return {\n type: 'nevent',\n data: {\n id: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n author: tlv[2]?.[0]\n ? secp256k1.utils.bytesToHex(tlv[2][0])\n : undefined\n }\n }\n }\n\n case 'naddr': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for naddr')\n if (!tlv[2]?.[0]) throw new Error('missing TLV 2 for naddr')\n if (tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (!tlv[3]?.[0]) throw new Error('missing TLV 3 for naddr')\n if (tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'naddr',\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: secp256k1.utils.bytesToHex(tlv[2][0]),\n kind: parseInt(secp256k1.utils.bytesToHex(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n\n case 'nsec':\n case 'npub':\n case 'note':\n return {type: prefix, data: secp256k1.utils.bytesToHex(data)}\n\n default:\n throw new Error(`unknown prefix ${prefix}`)\n }\n}\n\ntype TLV = {[t: number]: Uint8Array[]}\n\nfunction parseTLV(data: Uint8Array): TLV {\n let result: TLV = {}\n let rest = data\n while (rest.length > 0) {\n let t = rest[0]\n let l = rest[1]\n let v = rest.slice(2, 2 + l)\n rest = rest.slice(2 + l)\n if (v.length < l) continue\n result[t] = result[t] || []\n result[t].push(v)\n }\n return result\n}\n\nexport function nsecEncode(hex: string): string {\n return encodeBytes('nsec', hex)\n}\n\nexport function npubEncode(hex: string): string {\n return encodeBytes('npub', hex)\n}\n\nexport function noteEncode(hex: string): string {\n return encodeBytes('note', hex)\n}\n\nfunction encodeBytes(prefix: string, hex: string): string {\n let data = secp256k1.utils.hexToBytes(hex)\n let words = bech32.toWords(data)\n return bech32.encode(prefix, words, Bech32MaxSize)\n}\n\nexport function nprofileEncode(profile: ProfilePointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(profile.pubkey)],\n 1: (profile.relays || []).map(url => utf8Encoder.encode(url))\n })\n let words = bech32.toWords(data)\n return bech32.encode('nprofile', words, Bech32MaxSize)\n}\n\nexport function neventEncode(event: EventPointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(event.id)],\n 1: (event.relays || []).map(url => utf8Encoder.encode(url)),\n 2: event.author ? [secp256k1.utils.hexToBytes(event.author)] : []\n })\n let words = bech32.toWords(data)\n return bech32.encode('nevent', words, Bech32MaxSize)\n}\n\nexport function naddrEncode(addr: AddressPointer): string {\n let kind = new ArrayBuffer(4)\n new DataView(kind).setUint32(0, addr.kind, false)\n\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n 2: [secp256k1.utils.hexToBytes(addr.pubkey)],\n 3: [new Uint8Array(kind)]\n })\n let words = bech32.toWords(data)\n return bech32.encode('naddr', words, Bech32MaxSize)\n}\n\nfunction encodeTLV(tlv: TLV): Uint8Array {\n let entries: Uint8Array[] = []\n\n Object.entries(tlv).forEach(([t, vs]) => {\n vs.forEach(v => {\n let entry = new Uint8Array(v.length + 2)\n entry.set([parseInt(t)], 0)\n entry.set([v.length], 1)\n entry.set(v, 2)\n entries.push(entry)\n })\n })\n\n return secp256k1.utils.concatBytes(...entries)\n}\n", "import {Event} from './event'\nimport {decode, AddressPointer, ProfilePointer, EventPointer} from './nip19'\n\ntype Reference = {\n text: string\n profile?: ProfilePointer\n event?: EventPointer\n address?: AddressPointer\n}\n\nconst mentionRegex =\n /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g\n\nexport function parseReferences(evt: Event): Reference[] {\n let references: Reference[] = []\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n // it's a NIP-27 mention\n try {\n let {type, data} = decode(ref[1])\n switch (type) {\n case 'npub': {\n references.push({\n text: ref[0],\n profile: {pubkey: data as string, relays: []}\n })\n break\n }\n case 'nprofile': {\n references.push({\n text: ref[0],\n profile: data as ProfilePointer\n })\n break\n }\n case 'note': {\n references.push({\n text: ref[0],\n event: {id: data as string, relays: []}\n })\n break\n }\n case 'nevent': {\n references.push({\n text: ref[0],\n event: data as EventPointer\n })\n break\n }\n case 'naddr': {\n references.push({\n text: ref[0],\n address: data as AddressPointer\n })\n break\n }\n }\n } catch (err) {\n /***/\n }\n } else if (ref[3]) {\n // it's a NIP-10 mention\n let idx = parseInt(ref[3], 10)\n let tag = evt.tags[idx]\n if (!tag) continue\n\n switch (tag[0]) {\n case 'p': {\n references.push({\n text: ref[0],\n profile: {pubkey: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'e': {\n references.push({\n text: ref[0],\n event: {id: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'a': {\n try {\n let [kind, pubkey, identifier] = tag[1].split(':')\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : []\n }\n })\n } catch (err) {\n /***/\n }\n break\n }\n }\n }\n }\n\n return references\n}\n", "import {randomBytes} from '@noble/hashes/utils'\nimport * as secp256k1 from '@noble/secp256k1'\nimport {base64} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nexport async function encrypt(\n privkey: string,\n pubkey: string,\n text: string\n): Promise<string> {\n const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n const normalizedKey = getNormalizedX(key)\n\n let iv = Uint8Array.from(randomBytes(16))\n let plaintext = utf8Encoder.encode(text)\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['encrypt']\n )\n let ciphertext = await crypto.subtle.encrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n plaintext\n )\n let ctb64 = base64.encode(new Uint8Array(ciphertext))\n let ivb64 = base64.encode(new Uint8Array(iv.buffer))\n\n return `${ctb64}?iv=${ivb64}`\n}\n\nexport async function decrypt(\n privkey: string,\n pubkey: string,\n data: string\n): Promise<string> {\n let [ctb64, ivb64] = data.split('?iv=')\n let key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n let normalizedKey = getNormalizedX(key)\n\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['decrypt']\n )\n let ciphertext = base64.decode(ctb64)\n let iv = base64.decode(ivb64)\n\n let plaintext = await crypto.subtle.decrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n ciphertext\n )\n\n let text = utf8Decoder.decode(plaintext)\n return text\n}\n\nfunction getNormalizedX(key: Uint8Array): Uint8Array {\n return key.slice(1, 33)\n}\n", "import {ProfilePointer} from './nip19'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function searchDomain(\n domain: string,\n query = ''\n): Promise<{[name: string]: string}> {\n try {\n let res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${query}`)\n ).json()\n\n return res.names\n } catch (_) {\n return {}\n }\n}\n\nexport async function queryProfile(\n fullname: string\n): Promise<ProfilePointer | null> {\n let [name, domain] = fullname.split('@')\n\n if (!domain) {\n // if there is no @, it is because it is just a domain, so assume the name is \"_\"\n domain = name\n name = '_'\n }\n\n if (!name.match(/^[A-Za-z0-9-_]+$/)) return null\n if (!domain.includes('.')) return null\n\n let res\n try {\n res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)\n ).json()\n } catch (err) {\n return null\n }\n\n if (!res?.names?.[name]) return null\n\n let pubkey = res.names[name] as string\n let relays = (res.relays?.[pubkey] || []) as string[] // nip35\n\n return {\n pubkey,\n relays\n }\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {wordlist} from '@scure/bip39/wordlists/english.js'\nimport {\n generateMnemonic,\n mnemonicToSeedSync,\n validateMnemonic\n} from '@scure/bip39'\nimport {HDKey} from '@scure/bip32'\n\nexport function privateKeyFromSeedWords(\n mnemonic: string,\n passphrase?: string\n): string {\n let root = HDKey.fromMasterSeed(mnemonicToSeedSync(mnemonic, passphrase))\n let privateKey = root.derive(`m/44'/1237'/0'/0/0`).privateKey\n if (!privateKey) throw new Error('could not derive private key')\n return secp256k1.utils.bytesToHex(privateKey)\n}\n\nexport function generateSeedWords(): string {\n return generateMnemonic(wordlist)\n}\n\nexport function validateWords(words: string): boolean {\n return validateMnemonic(words, wordlist)\n}\n", "import type {Event} from './event'\nimport type {EventPointer, ProfilePointer} from './nip19'\n\nexport type NIP10Result = {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events which may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n}\n\nexport function parse(event: Pick<Event, 'tags'>): NIP10Result {\n const result: NIP10Result = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: []\n }\n\n const eTags: string[][] = []\n\n for (const tag of event.tags) {\n if (tag[0] === 'e' && tag[1]) {\n eTags.push(tag)\n }\n\n if (tag[0] === 'p' && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : []\n })\n }\n }\n\n for (let eTagIndex = 0; eTagIndex < eTags.length; eTagIndex++) {\n const eTag = eTags[eTagIndex]\n\n const [_, eTagEventId, eTagRelayUrl, eTagMarker] = eTag as [\n string,\n string,\n undefined | string,\n undefined | string\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : []\n }\n\n const isFirstETag = eTagIndex === 0\n const isLastETag = eTagIndex === eTags.length - 1\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (isFirstETag) {\n result.root = eventPointer\n continue\n }\n\n if (isLastETag) {\n result.reply = eventPointer\n continue\n }\n\n result.mentions.push(eventPointer)\n }\n\n return result\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {Event} from './event'\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\nexport type Parameters = {\n pubkey: string // the key to whom the delegation will be given\n kind: number | undefined\n until: number | undefined // delegation will only be valid until this date\n since: number | undefined // delegation will be valid from this date on\n}\n\nexport type Delegation = {\n from: string // the pubkey who signed the delegation\n to: string // the pubkey that is allowed to use the delegation\n cond: string // the string of conditions as they should be included in the event tag\n sig: string\n}\n\nexport function createDelegation(\n privateKey: string,\n parameters: Parameters\n): Delegation {\n let conditions = []\n if ((parameters.kind || -1) >= 0) conditions.push(`kind=${parameters.kind}`)\n if (parameters.until) conditions.push(`created_at<${parameters.until}`)\n if (parameters.since) conditions.push(`created_at>${parameters.since}`)\n let cond = conditions.join('&')\n\n if (cond === '')\n throw new Error('refusing to create a delegation without any conditions')\n\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${parameters.pubkey}:${cond}`)\n )\n\n let sig = secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(sighash, privateKey)\n )\n\n return {\n from: getPublicKey(privateKey),\n to: parameters.pubkey,\n cond,\n sig\n }\n}\n\nexport function getDelegator(event: Event): string | null {\n // find delegation tag\n let tag = event.tags.find(tag => tag[0] === 'delegation' && tag.length >= 4)\n if (!tag) return null\n\n let pubkey = tag[1]\n let cond = tag[2]\n let sig = tag[3]\n\n // check conditions\n let conditions = cond.split('&')\n for (let i = 0; i < conditions.length; i++) {\n let [key, operator, value] = conditions[i].split(/\\b/)\n\n // the supported conditions are just 'kind' and 'created_at' for now\n if (key === 'kind' && operator === '=' && event.kind === parseInt(value))\n continue\n else if (\n key === 'created_at' &&\n operator === '<' &&\n event.created_at < parseInt(value)\n )\n continue\n else if (\n key === 'created_at' &&\n operator === '>' &&\n event.created_at > parseInt(value)\n )\n continue\n else return null // invalid condition\n }\n\n // check signature\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${event.pubkey}:${cond}`)\n )\n if (!secp256k1.schnorr.verifySync(sig, sighash, pubkey)) return null\n\n return pubkey\n}\n", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function validateGithub(\n pubkey: string,\n username: string,\n proof: string\n): Promise<boolean> {\n try {\n let res = await (\n await _fetch(`https://gist.github.com/${username}/${proof}/raw`)\n ).text()\n return (\n res ===\n `Verifying that I control the following Nostr public key: ${pubkey}`\n )\n } catch (_) {\n return false\n }\n}\n", "import {bech32} from '@scure/base'\n\nimport {Event, EventTemplate, validateEvent, verifySignature} from './event'\nimport {utf8Decoder} from './utils'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function getZapEndpoint(metadata: Event): Promise<null | string> {\n try {\n let lnurl: string = ''\n let {lud06, lud16} = JSON.parse(metadata.content)\n if (lud06) {\n let {words} = bech32.decode(lud06, 1000)\n let data = bech32.fromWords(words)\n lnurl = utf8Decoder.decode(data)\n } else if (lud16) {\n let [name, domain] = lud16.split('@')\n lnurl = `https://${domain}/.well-known/lnurlp/${name}`\n } else {\n return null\n }\n\n let res = await _fetch(lnurl)\n let body = await res.json()\n\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback\n }\n } catch (err) {\n /*-*/\n }\n\n return null\n}\n\nexport function makeZapRequest({\n profile,\n event,\n amount,\n relays,\n comment = ''\n}: {\n profile: string\n event: string | null\n amount: number\n comment: string\n relays: string[]\n}): EventTemplate {\n if (!amount) throw new Error('amount not given')\n if (!profile) throw new Error('profile not given')\n\n let zr = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1000),\n content: comment,\n tags: [\n ['p', profile],\n ['amount', amount.toString()],\n ['relays', ...relays]\n ]\n }\n\n if (event) {\n zr.tags.push(['e', event])\n }\n\n return zr\n}\n\nexport function validateZapRequest(zapRequestString: string): string | null {\n let zapRequest: Event\n\n try {\n zapRequest = JSON.parse(zapRequestString)\n } catch (err) {\n return 'Invalid zap request JSON.'\n }\n\n if (!validateEvent(zapRequest))\n return 'Zap request is not a valid Nostr event.'\n if (!verifySignature(zapRequest)) return 'Invalid signature on zap request.'\n\n let p = zapRequest.tags.find(([t, v]) => t === 'p' && v)\n if (!p) return \"Zap request doesn't have a 'p' tag.\"\n if (!p[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'p' tag is not valid hex.\"\n\n let e = zapRequest.tags.find(([t, v]) => t === 'e' && v)\n if (e && !e[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'e' tag is not valid hex.\"\n\n let relays = zapRequest.tags.find(([t, v]) => t === 'relays' && v)\n if (!relays) return \"Zap request doesn't have a 'relays' tag.\"\n\n return null\n}\n\nexport function makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt\n}: {\n zapRequest: string\n preimage: string | null\n bolt11: string\n paidAt: Date\n}): EventTemplate {\n let zr: Event = JSON.parse(zapRequest)\n let tagsFromZapRequest = zr.tags.filter(\n ([t]) => t === 'e' || t === 'p' || t === 'a'\n )\n\n let zap = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1000),\n content: '',\n tags: [\n ...tagsFromZapRequest,\n ['bolt11', bolt11],\n ['description', zapRequest]\n ]\n }\n\n if (preimage) {\n zap.tags.push(['preimage', preimage])\n }\n\n return zap\n}\n", "export * from './keys'\nexport * from './relay'\nexport * from './event'\nexport * from './filter'\nexport * from './pool'\nexport * from './references'\n\nexport * as nip04 from './nip04'\nexport * as nip05 from './nip05'\nexport * as nip06 from './nip06'\nexport * as nip10 from './nip10'\nexport * as nip19 from './nip19'\nexport * as nip26 from './nip26'\nexport * as nip39 from './nip39'\nexport * as nip57 from './nip57'\n\nexport * as fj from './fakejson'\nexport * as utils from './utils'\n\n// monkey patch secp256k1\nimport * as secp256k1 from '@noble/secp256k1'\nimport {hmac} from '@noble/hashes/hmac'\nimport {sha256} from '@noble/hashes/sha256'\nsecp256k1.utils.hmacSha256Sync = (key, ...msgs) =>\n hmac(sha256, key, secp256k1.utils.concatBytes(...msgs))\nsecp256k1.utils.sha256Sync = (...msgs) =>\n sha256(secp256k1.utils.concatBytes(...msgs))\n"],
5
- "mappings": "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",
6
- "names": ["secp256k1", "Kind", "id", "listeners", "filters", "opts", "secp256k1", "secp256k1", "secp256k1", "secp256k1", "sha256", "sha256", "tag", "useFetchImplementation", "_fetch", "useFetchImplementation", "bech32", "_fetch", "useFetchImplementation", "bech32", "secp256k1", "sha256"]
3
+ "sources": ["../../keys.ts", "../../event.ts", "../../utils.ts", "../../filter.ts", "../../fakejson.ts", "../../relay.ts", "../../pool.ts", "../../nip19.ts", "../../references.ts", "../../nip04.ts", "../../nip05.ts", "../../nip06.ts", "../../nip10.ts", "../../nip13.ts", "../../nip26.ts", "../../nip39.ts", "../../nip57.ts", "../../index.ts"],
4
+ "sourcesContent": ["import * as secp256k1 from '@noble/secp256k1'\n\nexport function generatePrivateKey(): string {\n return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey())\n}\n\nexport function getPublicKey(privateKey: string): string {\n return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey))\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\n/* eslint-disable no-unused-vars */\nexport enum Kind {\n Metadata = 0,\n Text = 1,\n RecommendRelay = 2,\n Contacts = 3,\n EncryptedDirectMessage = 4,\n EventDeletion = 5,\n Reaction = 7,\n BadgeAward = 8,\n ChannelCreation = 40,\n ChannelMetadata = 41,\n ChannelMessage = 42,\n ChannelHideMessage = 43,\n ChannelMuteUser = 44,\n Report = 1984,\n ZapRequest = 9734,\n Zap = 9735,\n RelayList = 10002,\n ClientAuth = 22242,\n BadgeDefinition = 30008,\n ProfileBadge = 30009,\n Article = 30023\n}\n\nexport type EventTemplate = {\n kind: Kind\n tags: string[][]\n content: string\n created_at: number\n}\n\nexport type UnsignedEvent = EventTemplate & {\n pubkey: string\n}\n\nexport type Event = UnsignedEvent & {\n id: string\n sig: string\n}\n\nexport function getBlankEvent(): EventTemplate {\n return {\n kind: 255,\n content: '',\n tags: [],\n created_at: 0\n }\n}\n\nexport function finishEvent(t: EventTemplate, privateKey: string): Event {\n let event = t as Event\n event.pubkey = getPublicKey(privateKey)\n event.id = getEventHash(event)\n event.sig = signEvent(event, privateKey)\n return event\n}\n\nexport function serializeEvent(evt: UnsignedEvent): string {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\")\n\n return JSON.stringify([\n 0,\n evt.pubkey,\n evt.created_at,\n evt.kind,\n evt.tags,\n evt.content\n ])\n}\n\nexport function getEventHash(event: UnsignedEvent): string {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))\n return secp256k1.utils.bytesToHex(eventHash)\n}\n\nconst isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\n\nexport function validateEvent<T>(event: T): event is T & UnsignedEvent {\n if (!isRecord(event)) return false\n if (typeof event.kind !== 'number') return false\n if (typeof event.content !== 'string') return false\n if (typeof event.created_at !== 'number') return false\n if (typeof event.pubkey !== 'string') return false\n if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false\n\n if (!Array.isArray(event.tags)) return false\n for (let i = 0; i < event.tags.length; i++) {\n let tag = event.tags[i]\n if (!Array.isArray(tag)) return false\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === 'object') return false\n }\n }\n\n return true\n}\n\nexport function verifySignature(event: Event): boolean {\n return secp256k1.schnorr.verifySync(\n event.sig,\n getEventHash(event),\n event.pubkey\n )\n}\n\nexport function signEvent(event: UnsignedEvent, key: string): string {\n return secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(getEventHash(event), key)\n )\n}\n", "import {Event} from './event'\n\nexport const utf8Decoder = new TextDecoder('utf-8')\nexport const utf8Encoder = new TextEncoder()\n\nexport function normalizeURL(url: string): string {\n let p = new URL(url)\n p.pathname = p.pathname.replace(/\\/+/g, '/')\n if (p.pathname.endsWith('/')) p.pathname = p.pathname.slice(0, -1)\n if (\n (p.port === '80' && p.protocol === 'ws:') ||\n (p.port === '443' && p.protocol === 'wss:')\n )\n p.port = ''\n p.searchParams.sort()\n p.hash = ''\n return p.toString()\n}\n\n//\n// fast insert-into-sorted-array functions adapted from https://github.com/terrymorse58/fast-sorted-array\n//\nexport function insertEventIntoDescendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at < sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at >= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at > event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at < event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n\nexport function insertEventIntoAscendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at > sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at <= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at < event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at > event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n", "import {Event} from './event'\n\nexport type Filter = {\n ids?: string[]\n kinds?: number[]\n authors?: string[]\n since?: number\n until?: number\n limit?: number\n search?: string\n [key: `#${string}`]: string[]\n}\n\nexport function matchFilter(\n filter: Filter,\n event: Event\n): boolean {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n if (!filter.ids.some(prefix => event.id.startsWith(prefix))) {\n return false\n }\n }\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) return false\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n if (!filter.authors.some(prefix => event.pubkey.startsWith(prefix))) {\n return false\n }\n }\n\n for (let f in filter) {\n if (f[0] === '#') {\n let tagName = f.slice(1)\n let values = filter[`#${tagName}`]\n if (\n values &&\n !event.tags.find(\n ([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1\n )\n )\n return false\n }\n }\n\n if (filter.since && event.created_at < filter.since) return false\n if (filter.until && event.created_at >= filter.until) return false\n\n return true\n}\n\nexport function matchFilters(\n filters: Filter[],\n event: Event\n): boolean {\n for (let i = 0; i < filters.length; i++) {\n if (matchFilter(filters[i], event)) return true\n }\n return false\n}\n", "export function getHex64(json: string, field: string): string {\n let len = field.length + 3\n let idx = json.indexOf(`\"${field}\":`) + len\n let s = json.slice(idx).indexOf(`\"`) + idx + 1\n return json.slice(s, s + 64)\n}\n\nexport function getInt(json: string, field: string): number {\n let len = field.length\n let idx = json.indexOf(`\"${field}\":`) + len + 3\n let sliced = json.slice(idx)\n let end = Math.min(sliced.indexOf(','), sliced.indexOf('}'))\n return parseInt(sliced.slice(0, end), 10)\n}\n\nexport function getSubscriptionId(json: string): string | null {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`)\n if (idx === -1) return null\n\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`)\n if (pstart === -1) return null\n let start = idx + 7 + 1 + pstart\n\n let pend = json.slice(start + 1, 80).indexOf(`\"`)\n if (pend === -1) return null\n let end = start + 1 + pend\n\n return json.slice(start + 1, end)\n}\n\nexport function matchEventId(json: string, id: string): boolean {\n return id === getHex64(json, 'id')\n}\n\nexport function matchEventPubkey(json: string, pubkey: string): boolean {\n return pubkey === getHex64(json, 'pubkey')\n}\n\nexport function matchEventKind(json: string, kind: number): boolean {\n return kind === getInt(json, 'kind')\n}\n", "/* global WebSocket */\n\nimport {Event, verifySignature, validateEvent} from './event'\nimport {Filter, matchFilters} from './filter'\nimport {getHex64, getSubscriptionId} from './fakejson'\n\ntype RelayEvent = {\n connect: () => void | Promise<void>\n disconnect: () => void | Promise<void>\n error: () => void | Promise<void>\n notice: (msg: string) => void | Promise<void>\n}\ntype SubEvent = {\n event: (event: Event) => void | Promise<void>\n eose: () => void | Promise<void>\n}\nexport type Relay = {\n url: string\n status: number\n connect: () => Promise<void>\n close: () => void\n sub: (filters: Filter[], opts?: SubscriptionOptions) => Sub\n list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]>\n get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null>\n publish: (event: Event) => Pub\n off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => void\n on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => void\n}\nexport type Pub = {\n on: (type: 'ok' | 'failed', cb: any) => void\n off: (type: 'ok' | 'failed', cb: any) => void\n}\nexport type Sub = {\n sub: (filters: Filter[], opts: SubscriptionOptions) => Sub\n unsub: () => void\n on: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => void\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => void\n}\n\nexport type SubscriptionOptions = {\n id?: string\n skipVerification?: boolean\n alreadyHaveEvent?: null | ((id: string, relay: string) => boolean)\n}\n\nexport function relayInit(\n url: string,\n options: {\n getTimeout?: number\n listTimeout?: number\n } = {}\n): Relay {\n let {listTimeout = 3000, getTimeout = 3000} = options\n\n var ws: WebSocket\n var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}\n var listeners: {[TK in keyof RelayEvent]: RelayEvent[TK][]} = {\n connect: [],\n disconnect: [],\n error: [],\n notice: []\n }\n var subListeners: {\n [subid: string]: {[TK in keyof SubEvent]: SubEvent[TK][]}\n } = {}\n var pubListeners: {\n [eventid: string]: {\n ok: Array<() => void>\n seen: Array<() => void>\n failed: Array<(reason: string) => void>\n }\n } = {}\n\n var connectionPromise: Promise<void> | undefined\n async function connectRelay(): Promise<void> {\n if (connectionPromise) return connectionPromise\n connectionPromise = new Promise((resolve, reject) => {\n try {\n ws = new WebSocket(url)\n } catch (err) {\n reject(err)\n }\n\n ws.onopen = () => {\n listeners.connect.forEach(cb => cb())\n resolve()\n }\n ws.onerror = () => {\n connectionPromise = undefined\n listeners.error.forEach(cb => cb())\n reject()\n }\n ws.onclose = async () => {\n connectionPromise = undefined\n listeners.disconnect.forEach(cb => cb())\n }\n\n let incomingMessageQueue: string[] = []\n let handleNextInterval: any\n\n ws.onmessage = e => {\n incomingMessageQueue.push(e.data)\n if (!handleNextInterval) {\n handleNextInterval = setInterval(handleNext, 0)\n }\n }\n\n function handleNext() {\n if (incomingMessageQueue.length === 0) {\n clearInterval(handleNextInterval)\n handleNextInterval = null\n return\n }\n\n var json = incomingMessageQueue.shift()\n if (!json) return\n\n let subid = getSubscriptionId(json)\n if (subid) {\n let so = openSubs[subid]\n if (\n so &&\n so.alreadyHaveEvent &&\n so.alreadyHaveEvent(getHex64(json, 'id'), url)\n ) {\n return\n }\n }\n\n try {\n let data = JSON.parse(json)\n\n // we won't do any checks against the data since all failures (i.e. invalid messages from relays)\n // will naturally be caught by the encompassing try..catch block\n\n switch (data[0]) {\n case 'EVENT':\n let id = data[1]\n let event = data[2]\n if (\n validateEvent(event) &&\n openSubs[id] &&\n (openSubs[id].skipVerification || verifySignature(event)) &&\n matchFilters(openSubs[id].filters, event)\n ) {\n openSubs[id]\n ;(subListeners[id]?.event || []).forEach(cb => cb(event))\n }\n return\n case 'EOSE': {\n let id = data[1]\n if (id in subListeners) {\n subListeners[id].eose.forEach(cb => cb())\n subListeners[id].eose = [] // 'eose' only happens once per sub, so stop listeners here\n }\n return\n }\n case 'OK': {\n let id: string = data[1]\n let ok: boolean = data[2]\n let reason: string = data[3] || ''\n if (id in pubListeners) {\n if (ok) pubListeners[id].ok.forEach(cb => cb())\n else pubListeners[id].failed.forEach(cb => cb(reason))\n pubListeners[id].ok = [] // 'ok' only happens once per pub, so stop listeners here\n pubListeners[id].failed = []\n }\n return\n }\n case 'NOTICE':\n let notice = data[1]\n listeners.notice.forEach(cb => cb(notice))\n return\n }\n } catch (err) {\n return\n }\n }\n })\n\n return connectionPromise\n }\n\n function connected() {\n return ws?.readyState === 1\n }\n\n async function connect(): Promise<void> {\n if (connected()) return // ws already open\n await connectRelay()\n }\n\n async function trySend(params: [string, ...any]) {\n let msg = JSON.stringify(params)\n if (!connected()) {\n await new Promise(resolve => setTimeout(resolve, 1000))\n if (!connected()) {\n return\n }\n }\n try {\n ws.send(msg)\n } catch (err) {\n console.log(err)\n }\n }\n\n const sub = (\n filters: Filter[],\n {\n skipVerification = false,\n alreadyHaveEvent = null,\n id = Math.random().toString().slice(2)\n }: SubscriptionOptions = {}\n ): Sub => {\n let subid = id\n\n openSubs[subid] = {\n id: subid,\n filters,\n skipVerification,\n alreadyHaveEvent\n }\n trySend(['REQ', subid, ...filters])\n\n return {\n sub: (newFilters, newOpts = {}) =>\n sub(newFilters || filters, {\n skipVerification: newOpts.skipVerification || skipVerification,\n alreadyHaveEvent: newOpts.alreadyHaveEvent || alreadyHaveEvent,\n id: subid\n }),\n unsub: () => {\n delete openSubs[subid]\n delete subListeners[subid]\n trySend(['CLOSE', subid])\n },\n on: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): void => {\n subListeners[subid] = subListeners[subid] || {\n event: [],\n eose: []\n }\n subListeners[subid][type].push(cb)\n },\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): void => {\n let listeners = subListeners[subid]\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n }\n\n return {\n url,\n sub,\n on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): void => {\n listeners[type].push(cb)\n if (type === 'connect' && ws?.readyState === 1) {\n // i would love to know why we need this\n ;(cb as () => void)()\n }\n },\n off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): void => {\n let index = listeners[type].indexOf(cb)\n if (index !== -1) listeners[type].splice(index, 1)\n },\n list: (filters: Filter[], opts?: SubscriptionOptions): Promise<Event[]> =>\n new Promise(resolve => {\n let s = sub(filters, opts)\n let events: Event[] = []\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(events)\n }, listTimeout)\n s.on('eose', () => {\n s.unsub()\n clearTimeout(timeout)\n resolve(events)\n })\n s.on('event', (event: Event) => {\n events.push(event)\n })\n }),\n get: (filter: Filter, opts?: SubscriptionOptions): Promise<Event | null> =>\n new Promise(resolve => {\n let s = sub([filter], opts)\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(null)\n }, getTimeout)\n s.on('event', (event: Event) => {\n s.unsub()\n clearTimeout(timeout)\n resolve(event)\n })\n }),\n publish(event: Event): Pub {\n if (!event.id) throw new Error(`event ${event} has no id`)\n let id = event.id\n\n trySend(['EVENT', event])\n\n return {\n on: (type: 'ok' | 'failed', cb: any) => {\n pubListeners[id] = pubListeners[id] || {\n ok: [],\n failed: []\n }\n pubListeners[id][type].push(cb)\n },\n off: (type: 'ok' | 'failed', cb: any) => {\n let listeners = pubListeners[id]\n if (!listeners) return\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n },\n connect,\n close(): void {\n listeners = {connect: [], disconnect: [], error: [], notice: []}\n subListeners = {}\n pubListeners = {}\n if (ws.readyState === WebSocket.OPEN) {\n ws?.close()\n }\n },\n get status() {\n return ws?.readyState ?? 3\n }\n }\n}\n", "import {Relay, relayInit} from './relay'\nimport {normalizeURL} from './utils'\nimport {Filter} from './filter'\nimport {Event} from './event'\nimport {SubscriptionOptions, Sub, Pub} from './relay'\n\nexport class SimplePool {\n private _conn: {[url: string]: Relay}\n private _seenOn: {[id: string]: Set<string>} = {} // a map of all events we've seen in each relay\n\n private eoseSubTimeout: number\n private getTimeout: number\n\n constructor(options: {eoseSubTimeout?: number; getTimeout?: number} = {}) {\n this._conn = {}\n this.eoseSubTimeout = options.eoseSubTimeout || 3400\n this.getTimeout = options.getTimeout || 3400\n }\n\n close(relays: string[]): void {\n relays.forEach(url => {\n let relay = this._conn[normalizeURL(url)]\n if (relay) relay.close()\n })\n }\n\n async ensureRelay(url: string): Promise<Relay> {\n const nm = normalizeURL(url)\n\n if (!this._conn[nm]) {\n this._conn[nm] = relayInit(nm, {\n getTimeout: this.getTimeout * 0.9,\n listTimeout: this.getTimeout * 0.9\n })\n }\n\n const relay = this._conn[nm]\n await relay.connect()\n return relay\n }\n\n sub(relays: string[], filters: Filter[], opts?: SubscriptionOptions): Sub {\n let _knownIds: Set<string> = new Set()\n let modifiedOpts = {...(opts || {})}\n modifiedOpts.alreadyHaveEvent = (id, url) => {\n if (opts?.alreadyHaveEvent?.(id, url)) {\n return true\n }\n let set = this._seenOn[id] || new Set()\n set.add(url)\n this._seenOn[id] = set\n return _knownIds.has(id)\n }\n\n let subs: Sub[] = []\n let eventListeners: Set<(event: Event) => void> = new Set()\n let eoseListeners: Set<() => void> = new Set()\n let eosesMissing = relays.length\n\n let eoseSent = false\n let eoseTimeout = setTimeout(() => {\n eoseSent = true\n for (let cb of eoseListeners.values()) cb()\n }, this.eoseSubTimeout)\n\n relays.forEach(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n } catch (err) {\n handleEose()\n return\n }\n if (!r) return\n let s = r.sub(filters, modifiedOpts)\n s.on('event', (event: Event) => {\n _knownIds.add(event.id as string)\n for (let cb of eventListeners.values()) cb(event)\n })\n s.on('eose', () => {\n if (eoseSent) return\n handleEose()\n })\n subs.push(s)\n\n function handleEose() {\n eosesMissing--\n if (eosesMissing === 0) {\n clearTimeout(eoseTimeout)\n for (let cb of eoseListeners.values()) cb()\n }\n }\n })\n\n let greaterSub: Sub = {\n sub(filters, opts) {\n subs.forEach(sub => sub.sub(filters, opts))\n return greaterSub\n },\n unsub() {\n subs.forEach(sub => sub.unsub())\n },\n on(type, cb) {\n if (type === 'event') {\n eventListeners.add(cb)\n } else if (type === 'eose') {\n eoseListeners.add(cb as () => void | Promise<void>)\n }\n },\n off(type, cb) {\n if (type === 'event') {\n eventListeners.delete(cb)\n } else if (type === 'eose')\n eoseListeners.delete(cb as () => void | Promise<void>)\n }\n }\n\n return greaterSub\n }\n\n get(\n relays: string[],\n filter: Filter,\n opts?: SubscriptionOptions\n ): Promise<Event | null> {\n return new Promise(resolve => {\n let sub = this.sub(relays, [filter], opts)\n let timeout = setTimeout(() => {\n sub.unsub()\n resolve(null)\n }, this.getTimeout)\n sub.on('event', (event: Event) => {\n resolve(event)\n clearTimeout(timeout)\n sub.unsub()\n })\n })\n }\n\n list(\n relays: string[],\n filters: Filter[],\n opts?: SubscriptionOptions\n ): Promise<Event[]> {\n return new Promise(resolve => {\n let events: Event[] = []\n let sub = this.sub(relays, filters, opts)\n\n sub.on('event', (event: Event) => {\n events.push(event)\n })\n\n // we can rely on an eose being emitted here because pool.sub() will fake one\n sub.on('eose', () => {\n sub.unsub()\n resolve(events)\n })\n })\n }\n\n publish(relays: string[], event: Event): Pub {\n const pubPromises: Promise<Pub>[] = relays.map(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n return r.publish(event)\n } catch (_) {\n return {on() {}, off() {}}\n }\n })\n\n const callbackMap = new Map()\n\n return {\n on(type, cb) {\n relays.forEach(async (relay, i) => {\n let pub = await pubPromises[i]\n let callback = () => cb(relay)\n callbackMap.set(cb, callback)\n pub.on(type, callback)\n })\n },\n\n off(type, cb) {\n relays.forEach(async (_, i) => {\n let callback = callbackMap.get(cb)\n if (callback) {\n let pub = await pubPromises[i]\n pub.off(type, callback)\n }\n })\n }\n }\n }\n\n seenOn(id: string): string[] {\n return Array.from(this._seenOn[id]?.values?.() || [])\n }\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {bech32} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nconst Bech32MaxSize = 5000\n\nexport type ProfilePointer = {\n pubkey: string // hex\n relays?: string[]\n}\n\nexport type EventPointer = {\n id: string // hex\n relays?: string[]\n author?: string\n}\n\nexport type AddressPointer = {\n identifier: string\n pubkey: string\n kind: number\n relays?: string[]\n}\n\nexport function decode(nip19: string): {\n type: string\n data: ProfilePointer | EventPointer | AddressPointer | string\n} {\n let {prefix, words} = bech32.decode(nip19, Bech32MaxSize)\n let data = new Uint8Array(bech32.fromWords(words))\n\n switch (prefix) {\n case 'nprofile': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nprofile')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nprofile',\n data: {\n pubkey: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n case 'nevent': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n if (tlv[2] && tlv[2][0].length !== 32)\n throw new Error('TLV 2 should be 32 bytes')\n\n return {\n type: 'nevent',\n data: {\n id: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n author: tlv[2]?.[0]\n ? secp256k1.utils.bytesToHex(tlv[2][0])\n : undefined\n }\n }\n }\n\n case 'naddr': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for naddr')\n if (!tlv[2]?.[0]) throw new Error('missing TLV 2 for naddr')\n if (tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (!tlv[3]?.[0]) throw new Error('missing TLV 3 for naddr')\n if (tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'naddr',\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: secp256k1.utils.bytesToHex(tlv[2][0]),\n kind: parseInt(secp256k1.utils.bytesToHex(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n\n case 'nsec':\n case 'npub':\n case 'note':\n return {type: prefix, data: secp256k1.utils.bytesToHex(data)}\n\n default:\n throw new Error(`unknown prefix ${prefix}`)\n }\n}\n\ntype TLV = {[t: number]: Uint8Array[]}\n\nfunction parseTLV(data: Uint8Array): TLV {\n let result: TLV = {}\n let rest = data\n while (rest.length > 0) {\n let t = rest[0]\n let l = rest[1]\n let v = rest.slice(2, 2 + l)\n rest = rest.slice(2 + l)\n if (v.length < l) continue\n result[t] = result[t] || []\n result[t].push(v)\n }\n return result\n}\n\nexport function nsecEncode(hex: string): string {\n return encodeBytes('nsec', hex)\n}\n\nexport function npubEncode(hex: string): string {\n return encodeBytes('npub', hex)\n}\n\nexport function noteEncode(hex: string): string {\n return encodeBytes('note', hex)\n}\n\nfunction encodeBytes(prefix: string, hex: string): string {\n let data = secp256k1.utils.hexToBytes(hex)\n let words = bech32.toWords(data)\n return bech32.encode(prefix, words, Bech32MaxSize)\n}\n\nexport function nprofileEncode(profile: ProfilePointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(profile.pubkey)],\n 1: (profile.relays || []).map(url => utf8Encoder.encode(url))\n })\n let words = bech32.toWords(data)\n return bech32.encode('nprofile', words, Bech32MaxSize)\n}\n\nexport function neventEncode(event: EventPointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(event.id)],\n 1: (event.relays || []).map(url => utf8Encoder.encode(url)),\n 2: event.author ? [secp256k1.utils.hexToBytes(event.author)] : []\n })\n let words = bech32.toWords(data)\n return bech32.encode('nevent', words, Bech32MaxSize)\n}\n\nexport function naddrEncode(addr: AddressPointer): string {\n let kind = new ArrayBuffer(4)\n new DataView(kind).setUint32(0, addr.kind, false)\n\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n 2: [secp256k1.utils.hexToBytes(addr.pubkey)],\n 3: [new Uint8Array(kind)]\n })\n let words = bech32.toWords(data)\n return bech32.encode('naddr', words, Bech32MaxSize)\n}\n\nfunction encodeTLV(tlv: TLV): Uint8Array {\n let entries: Uint8Array[] = []\n\n Object.entries(tlv).forEach(([t, vs]) => {\n vs.forEach(v => {\n let entry = new Uint8Array(v.length + 2)\n entry.set([parseInt(t)], 0)\n entry.set([v.length], 1)\n entry.set(v, 2)\n entries.push(entry)\n })\n })\n\n return secp256k1.utils.concatBytes(...entries)\n}\n", "import {Event} from './event'\nimport {decode, AddressPointer, ProfilePointer, EventPointer} from './nip19'\n\ntype Reference = {\n text: string\n profile?: ProfilePointer\n event?: EventPointer\n address?: AddressPointer\n}\n\nconst mentionRegex =\n /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g\n\nexport function parseReferences(evt: Event): Reference[] {\n let references: Reference[] = []\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n // it's a NIP-27 mention\n try {\n let {type, data} = decode(ref[1])\n switch (type) {\n case 'npub': {\n references.push({\n text: ref[0],\n profile: {pubkey: data as string, relays: []}\n })\n break\n }\n case 'nprofile': {\n references.push({\n text: ref[0],\n profile: data as ProfilePointer\n })\n break\n }\n case 'note': {\n references.push({\n text: ref[0],\n event: {id: data as string, relays: []}\n })\n break\n }\n case 'nevent': {\n references.push({\n text: ref[0],\n event: data as EventPointer\n })\n break\n }\n case 'naddr': {\n references.push({\n text: ref[0],\n address: data as AddressPointer\n })\n break\n }\n }\n } catch (err) {\n /***/\n }\n } else if (ref[3]) {\n // it's a NIP-10 mention\n let idx = parseInt(ref[3], 10)\n let tag = evt.tags[idx]\n if (!tag) continue\n\n switch (tag[0]) {\n case 'p': {\n references.push({\n text: ref[0],\n profile: {pubkey: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'e': {\n references.push({\n text: ref[0],\n event: {id: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'a': {\n try {\n let [kind, pubkey, identifier] = tag[1].split(':')\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : []\n }\n })\n } catch (err) {\n /***/\n }\n break\n }\n }\n }\n }\n\n return references\n}\n", "import {randomBytes} from '@noble/hashes/utils'\nimport * as secp256k1 from '@noble/secp256k1'\nimport {base64} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nexport async function encrypt(\n privkey: string,\n pubkey: string,\n text: string\n): Promise<string> {\n const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n const normalizedKey = getNormalizedX(key)\n\n let iv = Uint8Array.from(randomBytes(16))\n let plaintext = utf8Encoder.encode(text)\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['encrypt']\n )\n let ciphertext = await crypto.subtle.encrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n plaintext\n )\n let ctb64 = base64.encode(new Uint8Array(ciphertext))\n let ivb64 = base64.encode(new Uint8Array(iv.buffer))\n\n return `${ctb64}?iv=${ivb64}`\n}\n\nexport async function decrypt(\n privkey: string,\n pubkey: string,\n data: string\n): Promise<string> {\n let [ctb64, ivb64] = data.split('?iv=')\n let key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n let normalizedKey = getNormalizedX(key)\n\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['decrypt']\n )\n let ciphertext = base64.decode(ctb64)\n let iv = base64.decode(ivb64)\n\n let plaintext = await crypto.subtle.decrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n ciphertext\n )\n\n let text = utf8Decoder.decode(plaintext)\n return text\n}\n\nfunction getNormalizedX(key: Uint8Array): Uint8Array {\n return key.slice(1, 33)\n}\n", "import {ProfilePointer} from './nip19'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function searchDomain(\n domain: string,\n query = ''\n): Promise<{[name: string]: string}> {\n try {\n let res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${query}`)\n ).json()\n\n return res.names\n } catch (_) {\n return {}\n }\n}\n\nexport async function queryProfile(\n fullname: string\n): Promise<ProfilePointer | null> {\n let [name, domain] = fullname.split('@')\n\n if (!domain) {\n // if there is no @, it is because it is just a domain, so assume the name is \"_\"\n domain = name\n name = '_'\n }\n\n if (!name.match(/^[A-Za-z0-9-_.]+$/)) return null\n if (!domain.includes('.')) return null\n\n let res\n try {\n res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)\n ).json()\n } catch (err) {\n return null\n }\n\n if (!res?.names?.[name]) return null\n\n let pubkey = res.names[name] as string\n let relays = (res.relays?.[pubkey] || []) as string[] // nip35\n\n return {\n pubkey,\n relays\n }\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {wordlist} from '@scure/bip39/wordlists/english.js'\nimport {\n generateMnemonic,\n mnemonicToSeedSync,\n validateMnemonic\n} from '@scure/bip39'\nimport {HDKey} from '@scure/bip32'\n\nexport function privateKeyFromSeedWords(\n mnemonic: string,\n passphrase?: string\n): string {\n let root = HDKey.fromMasterSeed(mnemonicToSeedSync(mnemonic, passphrase))\n let privateKey = root.derive(`m/44'/1237'/0'/0/0`).privateKey\n if (!privateKey) throw new Error('could not derive private key')\n return secp256k1.utils.bytesToHex(privateKey)\n}\n\nexport function generateSeedWords(): string {\n return generateMnemonic(wordlist)\n}\n\nexport function validateWords(words: string): boolean {\n return validateMnemonic(words, wordlist)\n}\n", "import type {Event} from './event'\nimport type {EventPointer, ProfilePointer} from './nip19'\n\nexport type NIP10Result = {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events which may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n}\n\nexport function parse(event: Pick<Event, 'tags'>): NIP10Result {\n const result: NIP10Result = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: []\n }\n\n const eTags: string[][] = []\n\n for (const tag of event.tags) {\n if (tag[0] === 'e' && tag[1]) {\n eTags.push(tag)\n }\n\n if (tag[0] === 'p' && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : []\n })\n }\n }\n\n for (let eTagIndex = 0; eTagIndex < eTags.length; eTagIndex++) {\n const eTag = eTags[eTagIndex]\n\n const [_, eTagEventId, eTagRelayUrl, eTagMarker] = eTag as [\n string,\n string,\n undefined | string,\n undefined | string\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : []\n }\n\n const isFirstETag = eTagIndex === 0\n const isLastETag = eTagIndex === eTags.length - 1\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (isFirstETag) {\n result.root = eventPointer\n continue\n }\n\n if (isLastETag) {\n result.reply = eventPointer\n continue\n }\n\n result.mentions.push(eventPointer)\n }\n\n return result\n}\n", "import * as secp256k1 from '@noble/secp256k1'\n\n/** Get POW difficulty from a Nostr hex ID. */\nexport function getPow(id: string): number {\n return getLeadingZeroBits(secp256k1.utils.hexToBytes(id))\n}\n\n/**\n * Get number of leading 0 bits. Adapted from nostream.\n * https://github.com/Cameri/nostream/blob/fb6948fd83ca87ce552f39f9b5eb780ea07e272e/src/utils/proof-of-work.ts\n */\nfunction getLeadingZeroBits(hash: Uint8Array): number {\n let total: number, i: number, bits: number\n\n for (i = 0, total = 0; i < hash.length; i++) {\n bits = msb(hash[i])\n total += bits\n if (bits !== 8) {\n break\n }\n }\n return total\n}\n\n/**\n * Adapted from nostream.\n * https://github.com/Cameri/nostream/blob/fb6948fd83ca87ce552f39f9b5eb780ea07e272e/src/utils/proof-of-work.ts\n */\nfunction msb(b: number) {\n let n = 0\n\n if (b === 0) {\n return 8\n }\n\n // eslint-disable-next-line no-cond-assign\n while (b >>= 1) {\n n++\n }\n\n return 7 - n\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {Event} from './event'\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\nexport type Parameters = {\n pubkey: string // the key to whom the delegation will be given\n kind: number | undefined\n until: number | undefined // delegation will only be valid until this date\n since: number | undefined // delegation will be valid from this date on\n}\n\nexport type Delegation = {\n from: string // the pubkey who signed the delegation\n to: string // the pubkey that is allowed to use the delegation\n cond: string // the string of conditions as they should be included in the event tag\n sig: string\n}\n\nexport function createDelegation(\n privateKey: string,\n parameters: Parameters\n): Delegation {\n let conditions = []\n if ((parameters.kind || -1) >= 0) conditions.push(`kind=${parameters.kind}`)\n if (parameters.until) conditions.push(`created_at<${parameters.until}`)\n if (parameters.since) conditions.push(`created_at>${parameters.since}`)\n let cond = conditions.join('&')\n\n if (cond === '')\n throw new Error('refusing to create a delegation without any conditions')\n\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${parameters.pubkey}:${cond}`)\n )\n\n let sig = secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(sighash, privateKey)\n )\n\n return {\n from: getPublicKey(privateKey),\n to: parameters.pubkey,\n cond,\n sig\n }\n}\n\nexport function getDelegator(event: Event): string | null {\n // find delegation tag\n let tag = event.tags.find(tag => tag[0] === 'delegation' && tag.length >= 4)\n if (!tag) return null\n\n let pubkey = tag[1]\n let cond = tag[2]\n let sig = tag[3]\n\n // check conditions\n let conditions = cond.split('&')\n for (let i = 0; i < conditions.length; i++) {\n let [key, operator, value] = conditions[i].split(/\\b/)\n\n // the supported conditions are just 'kind' and 'created_at' for now\n if (key === 'kind' && operator === '=' && event.kind === parseInt(value))\n continue\n else if (\n key === 'created_at' &&\n operator === '<' &&\n event.created_at < parseInt(value)\n )\n continue\n else if (\n key === 'created_at' &&\n operator === '>' &&\n event.created_at > parseInt(value)\n )\n continue\n else return null // invalid condition\n }\n\n // check signature\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${event.pubkey}:${cond}`)\n )\n if (!secp256k1.schnorr.verifySync(sig, sighash, pubkey)) return null\n\n return pubkey\n}\n", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function validateGithub(\n pubkey: string,\n username: string,\n proof: string\n): Promise<boolean> {\n try {\n let res = await (\n await _fetch(`https://gist.github.com/${username}/${proof}/raw`)\n ).text()\n return (\n res ===\n `Verifying that I control the following Nostr public key: ${pubkey}`\n )\n } catch (_) {\n return false\n }\n}\n", "import {bech32} from '@scure/base'\n\nimport {Event, EventTemplate, validateEvent, verifySignature} from './event'\nimport {utf8Decoder} from './utils'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function getZapEndpoint(metadata: Event): Promise<null | string> {\n try {\n let lnurl: string = ''\n let {lud06, lud16} = JSON.parse(metadata.content)\n if (lud06) {\n let {words} = bech32.decode(lud06, 1000)\n let data = bech32.fromWords(words)\n lnurl = utf8Decoder.decode(data)\n } else if (lud16) {\n let [name, domain] = lud16.split('@')\n lnurl = `https://${domain}/.well-known/lnurlp/${name}`\n } else {\n return null\n }\n\n let res = await _fetch(lnurl)\n let body = await res.json()\n\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback\n }\n } catch (err) {\n /*-*/\n }\n\n return null\n}\n\nexport function makeZapRequest({\n profile,\n event,\n amount,\n relays,\n comment = ''\n}: {\n profile: string\n event: string | null\n amount: number\n comment: string\n relays: string[]\n}): EventTemplate {\n if (!amount) throw new Error('amount not given')\n if (!profile) throw new Error('profile not given')\n\n let zr = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1000),\n content: comment,\n tags: [\n ['p', profile],\n ['amount', amount.toString()],\n ['relays', ...relays]\n ]\n }\n\n if (event) {\n zr.tags.push(['e', event])\n }\n\n return zr\n}\n\nexport function validateZapRequest(zapRequestString: string): string | null {\n let zapRequest: Event\n\n try {\n zapRequest = JSON.parse(zapRequestString)\n } catch (err) {\n return 'Invalid zap request JSON.'\n }\n\n if (!validateEvent(zapRequest))\n return 'Zap request is not a valid Nostr event.'\n if (!verifySignature(zapRequest)) return 'Invalid signature on zap request.'\n\n let p = zapRequest.tags.find(([t, v]) => t === 'p' && v)\n if (!p) return \"Zap request doesn't have a 'p' tag.\"\n if (!p[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'p' tag is not valid hex.\"\n\n let e = zapRequest.tags.find(([t, v]) => t === 'e' && v)\n if (e && !e[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'e' tag is not valid hex.\"\n\n let relays = zapRequest.tags.find(([t, v]) => t === 'relays' && v)\n if (!relays) return \"Zap request doesn't have a 'relays' tag.\"\n\n return null\n}\n\nexport function makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt\n}: {\n zapRequest: string\n preimage: string | null\n bolt11: string\n paidAt: Date\n}): EventTemplate {\n let zr: Event = JSON.parse(zapRequest)\n let tagsFromZapRequest = zr.tags.filter(\n ([t]) => t === 'e' || t === 'p' || t === 'a'\n )\n\n let zap = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1000),\n content: '',\n tags: [\n ...tagsFromZapRequest,\n ['bolt11', bolt11],\n ['description', zapRequest]\n ]\n }\n\n if (preimage) {\n zap.tags.push(['preimage', preimage])\n }\n\n return zap\n}\n", "export * from './keys'\nexport * from './relay'\nexport * from './event'\nexport * from './filter'\nexport * from './pool'\nexport * from './references'\n\nexport * as nip04 from './nip04'\nexport * as nip05 from './nip05'\nexport * as nip06 from './nip06'\nexport * as nip10 from './nip10'\nexport * as nip13 from './nip13'\nexport * as nip19 from './nip19'\nexport * as nip26 from './nip26'\nexport * as nip39 from './nip39'\nexport * as nip57 from './nip57'\n\nexport * as fj from './fakejson'\nexport * as utils from './utils'\n\n// monkey patch secp256k1\nimport * as secp256k1 from '@noble/secp256k1'\nimport {hmac} from '@noble/hashes/hmac'\nimport {sha256} from '@noble/hashes/sha256'\nsecp256k1.utils.hmacSha256Sync = (key, ...msgs) =>\n hmac(sha256, key, secp256k1.utils.concatBytes(...msgs))\nsecp256k1.utils.sha256Sync = (...msgs) =>\n sha256(secp256k1.utils.concatBytes(...msgs))\n"],
5
+ "mappings": ";;;;;;;AAAA,YAAY,eAAe;AAEpB,SAAS,qBAA6B;AAC3C,SAAiB,gBAAM,WAAqB,gBAAM,iBAAiB,CAAC;AACtE;AAEO,SAAS,aAAa,YAA4B;AACvD,SAAiB,gBAAM,WAAqB,kBAAQ,aAAa,UAAU,CAAC;AAC9E;;;ACRA,YAAYA,gBAAe;AAC3B,SAAQ,cAAa;;;ACDrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,cAAc,IAAI,YAAY,OAAO;AAC3C,IAAM,cAAc,IAAI,YAAY;AAEpC,SAAS,aAAa,KAAqB;AAChD,MAAI,IAAI,IAAI,IAAI,GAAG;AACnB,IAAE,WAAW,EAAE,SAAS,QAAQ,QAAQ,GAAG;AAC3C,MAAI,EAAE,SAAS,SAAS,GAAG;AAAG,MAAE,WAAW,EAAE,SAAS,MAAM,GAAG,EAAE;AACjE,MACG,EAAE,SAAS,QAAQ,EAAE,aAAa,SAClC,EAAE,SAAS,SAAS,EAAE,aAAa;AAEpC,MAAE,OAAO;AACX,IAAE,aAAa,KAAK;AACpB,IAAE,OAAO;AACT,SAAO,EAAE,SAAS;AACpB;AAKO,SAAS,8BACd,aACA,OACA;AACA,MAAI,QAAQ;AACZ,MAAI,MAAM,YAAY,SAAS;AAC/B,MAAI;AACJ,MAAI,WAAW;AAEf,MAAI,MAAM,GAAG;AACX,eAAW;AAAA,EACb,WAAW,MAAM,aAAa,YAAY,KAAK,YAAY;AACzD,eAAW,MAAM;AAAA,EACnB,WAAW,MAAM,cAAc,YAAY,OAAO,YAAY;AAC5D,eAAW;AAAA,EACb;AACE,WAAO,MAAM;AACX,UAAI,OAAO,QAAQ,GAAG;AACpB,mBAAW;AACX;AAAA,MACF;AACA,iBAAW,KAAK,MAAM,SAAS,MAAM,SAAS,CAAC;AAC/C,UAAI,YAAY,UAAU,aAAa,MAAM,YAAY;AACvD,gBAAQ;AAAA,MACV,WAAW,YAAY,UAAU,aAAa,MAAM,YAAY;AAC9D,cAAM;AAAA,MACR,OAAO;AAEL,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AAGF,MAAI,YAAY,WAAW,OAAO,MAAM,IAAI;AAC1C,WAAO;AAAA,MACL,GAAG,YAAY,MAAM,GAAG,QAAQ;AAAA,MAChC;AAAA,MACA,GAAG,YAAY,MAAM,QAAQ;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,6BACd,aACA,OACA;AACA,MAAI,QAAQ;AACZ,MAAI,MAAM,YAAY,SAAS;AAC/B,MAAI;AACJ,MAAI,WAAW;AAEf,MAAI,MAAM,GAAG;AACX,eAAW;AAAA,EACb,WAAW,MAAM,aAAa,YAAY,KAAK,YAAY;AACzD,eAAW,MAAM;AAAA,EACnB,WAAW,MAAM,cAAc,YAAY,OAAO,YAAY;AAC5D,eAAW;AAAA,EACb;AACE,WAAO,MAAM;AACX,UAAI,OAAO,QAAQ,GAAG;AACpB,mBAAW;AACX;AAAA,MACF;AACA,iBAAW,KAAK,MAAM,SAAS,MAAM,SAAS,CAAC;AAC/C,UAAI,YAAY,UAAU,aAAa,MAAM,YAAY;AACvD,gBAAQ;AAAA,MACV,WAAW,YAAY,UAAU,aAAa,MAAM,YAAY;AAC9D,cAAM;AAAA,MACR,OAAO;AAEL,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AAGF,MAAI,YAAY,WAAW,OAAO,MAAM,IAAI;AAC1C,WAAO;AAAA,MACL,GAAG,YAAY,MAAM,GAAG,QAAQ;AAAA,MAChC;AAAA,MACA,GAAG,YAAY,MAAM,QAAQ;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;;;ADvGO,IAAK,OAAL,kBAAKC,UAAL;AACL,EAAAA,YAAA,cAAW,KAAX;AACA,EAAAA,YAAA,UAAO,KAAP;AACA,EAAAA,YAAA,oBAAiB,KAAjB;AACA,EAAAA,YAAA,cAAW,KAAX;AACA,EAAAA,YAAA,4BAAyB,KAAzB;AACA,EAAAA,YAAA,mBAAgB,KAAhB;AACA,EAAAA,YAAA,cAAW,KAAX;AACA,EAAAA,YAAA,gBAAa,KAAb;AACA,EAAAA,YAAA,qBAAkB,MAAlB;AACA,EAAAA,YAAA,qBAAkB,MAAlB;AACA,EAAAA,YAAA,oBAAiB,MAAjB;AACA,EAAAA,YAAA,wBAAqB,MAArB;AACA,EAAAA,YAAA,qBAAkB,MAAlB;AACA,EAAAA,YAAA,YAAS,QAAT;AACA,EAAAA,YAAA,gBAAa,QAAb;AACA,EAAAA,YAAA,SAAM,QAAN;AACA,EAAAA,YAAA,eAAY,SAAZ;AACA,EAAAA,YAAA,gBAAa,SAAb;AACA,EAAAA,YAAA,qBAAkB,SAAlB;AACA,EAAAA,YAAA,kBAAe,SAAf;AACA,EAAAA,YAAA,aAAU,SAAV;AArBU,SAAAA;AAAA,GAAA;AAwCL,SAAS,gBAA+B;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC;AAAA,IACP,YAAY;AAAA,EACd;AACF;AAEO,SAAS,YAAY,GAAkB,YAA2B;AACvE,MAAI,QAAQ;AACZ,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,KAAK,aAAa,KAAK;AAC7B,QAAM,MAAM,UAAU,OAAO,UAAU;AACvC,SAAO;AACT;AAEO,SAAS,eAAe,KAA4B;AACzD,MAAI,CAAC,cAAc,GAAG;AACpB,UAAM,IAAI,MAAM,wDAAwD;AAE1E,SAAO,KAAK,UAAU;AAAA,IACpB;AAAA,IACA,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN,CAAC;AACH;AAEO,SAAS,aAAa,OAA8B;AACzD,MAAI,YAAY,OAAO,YAAY,OAAO,eAAe,KAAK,CAAC,CAAC;AAChE,SAAiB,iBAAM,WAAW,SAAS;AAC7C;AAEA,IAAM,WAAW,CAAC,QAAiD,eAAe;AAE3E,SAAS,cAAiB,OAAsC;AACrE,MAAI,CAAC,SAAS,KAAK;AAAG,WAAO;AAC7B,MAAI,OAAO,MAAM,SAAS;AAAU,WAAO;AAC3C,MAAI,OAAO,MAAM,YAAY;AAAU,WAAO;AAC9C,MAAI,OAAO,MAAM,eAAe;AAAU,WAAO;AACjD,MAAI,OAAO,MAAM,WAAW;AAAU,WAAO;AAC7C,MAAI,CAAC,MAAM,OAAO,MAAM,gBAAgB;AAAG,WAAO;AAElD,MAAI,CAAC,MAAM,QAAQ,MAAM,IAAI;AAAG,WAAO;AACvC,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK,QAAQ,KAAK;AAC1C,QAAI,MAAM,MAAM,KAAK;AACrB,QAAI,CAAC,MAAM,QAAQ,GAAG;AAAG,aAAO;AAChC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAI,OAAO,IAAI,OAAO;AAAU,eAAO;AAAA,IACzC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAuB;AACrD,SAAiB,mBAAQ;AAAA,IACvB,MAAM;AAAA,IACN,aAAa,KAAK;AAAA,IAClB,MAAM;AAAA,EACR;AACF;AAEO,SAAS,UAAU,OAAsB,KAAqB;AACnE,SAAiB,iBAAM;AAAA,IACX,mBAAQ,SAAS,aAAa,KAAK,GAAG,GAAG;AAAA,EACrD;AACF;;;AExGO,SAAS,YACd,QACA,OACS;AACT,MAAI,OAAO,OAAO,OAAO,IAAI,QAAQ,MAAM,EAAE,MAAM,IAAI;AACrD,QAAI,CAAC,OAAO,IAAI,KAAK,YAAU,MAAM,GAAG,WAAW,MAAM,CAAC,GAAG;AAC3D,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,OAAO,SAAS,OAAO,MAAM,QAAQ,MAAM,IAAI,MAAM;AAAI,WAAO;AACpE,MAAI,OAAO,WAAW,OAAO,QAAQ,QAAQ,MAAM,MAAM,MAAM,IAAI;AACjE,QAAI,CAAC,OAAO,QAAQ,KAAK,YAAU,MAAM,OAAO,WAAW,MAAM,CAAC,GAAG;AACnE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,KAAK,QAAQ;AACpB,QAAI,EAAE,OAAO,KAAK;AAChB,UAAI,UAAU,EAAE,MAAM,CAAC;AACvB,UAAI,SAAS,OAAO,IAAI;AACxB,UACE,UACA,CAAC,MAAM,KAAK;AAAA,QACV,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,QAAQ,CAAC,MAAM;AAAA,MACxD;AAEA,eAAO;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,MAAM,aAAa,OAAO;AAAO,WAAO;AAC5D,MAAI,OAAO,SAAS,MAAM,cAAc,OAAO;AAAO,WAAO;AAE7D,SAAO;AACT;AAEO,SAAS,aACd,SACA,OACS;AACT,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,YAAY,QAAQ,IAAI,KAAK;AAAG,aAAO;AAAA,EAC7C;AACA,SAAO;AACT;;;ACzDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,SAAS,MAAc,OAAuB;AAC5D,MAAI,MAAM,MAAM,SAAS;AACzB,MAAI,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI;AACxC,MAAI,IAAI,KAAK,MAAM,GAAG,EAAE,QAAQ,GAAG,IAAI,MAAM;AAC7C,SAAO,KAAK,MAAM,GAAG,IAAI,EAAE;AAC7B;AAEO,SAAS,OAAO,MAAc,OAAuB;AAC1D,MAAI,MAAM,MAAM;AAChB,MAAI,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM;AAC9C,MAAI,SAAS,KAAK,MAAM,GAAG;AAC3B,MAAI,MAAM,KAAK,IAAI,OAAO,QAAQ,GAAG,GAAG,OAAO,QAAQ,GAAG,CAAC;AAC3D,SAAO,SAAS,OAAO,MAAM,GAAG,GAAG,GAAG,EAAE;AAC1C;AAEO,SAAS,kBAAkB,MAA6B;AAC7D,MAAI,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,QAAQ,SAAS;AAC7C,MAAI,QAAQ;AAAI,WAAO;AAEvB,MAAI,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,QAAQ,GAAG;AAChD,MAAI,WAAW;AAAI,WAAO;AAC1B,MAAI,QAAQ,MAAM,IAAI,IAAI;AAE1B,MAAI,OAAO,KAAK,MAAM,QAAQ,GAAG,EAAE,EAAE,QAAQ,GAAG;AAChD,MAAI,SAAS;AAAI,WAAO;AACxB,MAAI,MAAM,QAAQ,IAAI;AAEtB,SAAO,KAAK,MAAM,QAAQ,GAAG,GAAG;AAClC;AAEO,SAAS,aAAa,MAAc,IAAqB;AAC9D,SAAO,OAAO,SAAS,MAAM,IAAI;AACnC;AAEO,SAAS,iBAAiB,MAAc,QAAyB;AACtE,SAAO,WAAW,SAAS,MAAM,QAAQ;AAC3C;AAEO,SAAS,eAAe,MAAc,MAAuB;AAClE,SAAO,SAAS,OAAO,MAAM,MAAM;AACrC;;;ACiBO,SAAS,UACd,KACA,UAGI,CAAC,GACE;AACP,MAAI,EAAC,cAAc,KAAM,aAAa,IAAI,IAAI;AAE9C,MAAI;AACJ,MAAI,WAAsE,CAAC;AAC3E,MAAI,YAA0D;AAAA,IAC5D,SAAS,CAAC;AAAA,IACV,YAAY,CAAC;AAAA,IACb,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,EACX;AACA,MAAI,eAEA,CAAC;AACL,MAAI,eAMA,CAAC;AAEL,MAAI;AACJ,iBAAe,eAA8B;AAC3C,QAAI;AAAmB,aAAO;AAC9B,wBAAoB,IAAI,QAAQ,CAAC,SAAS,WAAW;AACnD,UAAI;AACF,aAAK,IAAI,UAAU,GAAG;AAAA,MACxB,SAAS,KAAP;AACA,eAAO,GAAG;AAAA,MACZ;AAEA,SAAG,SAAS,MAAM;AAChB,kBAAU,QAAQ,QAAQ,QAAM,GAAG,CAAC;AACpC,gBAAQ;AAAA,MACV;AACA,SAAG,UAAU,MAAM;AACjB,4BAAoB;AACpB,kBAAU,MAAM,QAAQ,QAAM,GAAG,CAAC;AAClC,eAAO;AAAA,MACT;AACA,SAAG,UAAU,YAAY;AACvB,4BAAoB;AACpB,kBAAU,WAAW,QAAQ,QAAM,GAAG,CAAC;AAAA,MACzC;AAEA,UAAI,uBAAiC,CAAC;AACtC,UAAI;AAEJ,SAAG,YAAY,OAAK;AAClB,6BAAqB,KAAK,EAAE,IAAI;AAChC,YAAI,CAAC,oBAAoB;AACvB,+BAAqB,YAAY,YAAY,CAAC;AAAA,QAChD;AAAA,MACF;AAEA,eAAS,aAAa;AACpB,YAAI,qBAAqB,WAAW,GAAG;AACrC,wBAAc,kBAAkB;AAChC,+BAAqB;AACrB;AAAA,QACF;AAEA,YAAI,OAAO,qBAAqB,MAAM;AACtC,YAAI,CAAC;AAAM;AAEX,YAAI,QAAQ,kBAAkB,IAAI;AAClC,YAAI,OAAO;AACT,cAAI,KAAK,SAAS;AAClB,cACE,MACA,GAAG,oBACH,GAAG,iBAAiB,SAAS,MAAM,IAAI,GAAG,GAAG,GAC7C;AACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AACF,cAAI,OAAO,KAAK,MAAM,IAAI;AAK1B,kBAAQ,KAAK,IAAI;AAAA,YACf,KAAK;AACH,kBAAI,KAAK,KAAK;AACd,kBAAI,QAAQ,KAAK;AACjB,kBACE,cAAc,KAAK,KACnB,SAAS,QACR,SAAS,IAAI,oBAAoB,gBAAgB,KAAK,MACvD,aAAa,SAAS,IAAI,SAAS,KAAK,GACxC;AACA,yBAAS;AACR,iBAAC,aAAa,KAAK,SAAS,CAAC,GAAG,QAAQ,QAAM,GAAG,KAAK,CAAC;AAAA,cAC1D;AACA;AAAA,YACF,KAAK,QAAQ;AACX,kBAAIC,MAAK,KAAK;AACd,kBAAIA,OAAM,cAAc;AACtB,6BAAaA,KAAI,KAAK,QAAQ,QAAM,GAAG,CAAC;AACxC,6BAAaA,KAAI,OAAO,CAAC;AAAA,cAC3B;AACA;AAAA,YACF;AAAA,YACA,KAAK,MAAM;AACT,kBAAIA,MAAa,KAAK;AACtB,kBAAI,KAAc,KAAK;AACvB,kBAAI,SAAiB,KAAK,MAAM;AAChC,kBAAIA,OAAM,cAAc;AACtB,oBAAI;AAAI,+BAAaA,KAAI,GAAG,QAAQ,QAAM,GAAG,CAAC;AAAA;AACzC,+BAAaA,KAAI,OAAO,QAAQ,QAAM,GAAG,MAAM,CAAC;AACrD,6BAAaA,KAAI,KAAK,CAAC;AACvB,6BAAaA,KAAI,SAAS,CAAC;AAAA,cAC7B;AACA;AAAA,YACF;AAAA,YACA,KAAK;AACH,kBAAI,SAAS,KAAK;AAClB,wBAAU,OAAO,QAAQ,QAAM,GAAG,MAAM,CAAC;AACzC;AAAA,UACJ;AAAA,QACF,SAAS,KAAP;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,WAAS,YAAY;AACnB,WAAO,IAAI,eAAe;AAAA,EAC5B;AAEA,iBAAe,UAAyB;AACtC,QAAI,UAAU;AAAG;AACjB,UAAM,aAAa;AAAA,EACrB;AAEA,iBAAe,QAAQ,QAA0B;AAC/C,QAAI,MAAM,KAAK,UAAU,MAAM;AAC/B,QAAI,CAAC,UAAU,GAAG;AAChB,YAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AACtD,UAAI,CAAC,UAAU,GAAG;AAChB;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,SAAG,KAAK,GAAG;AAAA,IACb,SAAS,KAAP;AACA,cAAQ,IAAI,GAAG;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,MAAM,CACV,SACA;AAAA,IACE,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;AAAA,EACvC,IAAyB,CAAC,MAClB;AACR,QAAI,QAAQ;AAEZ,aAAS,SAAS;AAAA,MAChB,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,CAAC,OAAO,OAAO,GAAG,OAAO,CAAC;AAElC,WAAO;AAAA,MACL,KAAK,CAAC,YAAY,UAAU,CAAC,MAC3B,IAAI,cAAc,SAAS;AAAA,QACzB,kBAAkB,QAAQ,oBAAoB;AAAA,QAC9C,kBAAkB,QAAQ,oBAAoB;AAAA,QAC9C,IAAI;AAAA,MACN,CAAC;AAAA,MACH,OAAO,MAAM;AACX,eAAO,SAAS;AAChB,eAAO,aAAa;AACpB,gBAAQ,CAAC,SAAS,KAAK,CAAC;AAAA,MAC1B;AAAA,MACA,IAAI,CACF,MACA,OACS;AACT,qBAAa,SAAS,aAAa,UAAU;AAAA,UAC3C,OAAO,CAAC;AAAA,UACR,MAAM,CAAC;AAAA,QACT;AACA,qBAAa,OAAO,MAAM,KAAK,EAAE;AAAA,MACnC;AAAA,MACA,KAAK,CACH,MACA,OACS;AACT,YAAIC,aAAY,aAAa;AAC7B,YAAI,MAAMA,WAAU,MAAM,QAAQ,EAAE;AACpC,YAAI,OAAO;AAAG,UAAAA,WAAU,MAAM,OAAO,KAAK,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,CACF,MACA,OACS;AACT,gBAAU,MAAM,KAAK,EAAE;AACvB,UAAI,SAAS,aAAa,IAAI,eAAe,GAAG;AAE9C;AAAC,QAAC,GAAkB;AAAA,MACtB;AAAA,IACF;AAAA,IACA,KAAK,CACH,MACA,OACS;AACT,UAAI,QAAQ,UAAU,MAAM,QAAQ,EAAE;AACtC,UAAI,UAAU;AAAI,kBAAU,MAAM,OAAO,OAAO,CAAC;AAAA,IACnD;AAAA,IACA,MAAM,CAAC,SAAmB,SACxB,IAAI,QAAQ,aAAW;AACrB,UAAI,IAAI,IAAI,SAAS,IAAI;AACzB,UAAI,SAAkB,CAAC;AACvB,UAAI,UAAU,WAAW,MAAM;AAC7B,UAAE,MAAM;AACR,gBAAQ,MAAM;AAAA,MAChB,GAAG,WAAW;AACd,QAAE,GAAG,QAAQ,MAAM;AACjB,UAAE,MAAM;AACR,qBAAa,OAAO;AACpB,gBAAQ,MAAM;AAAA,MAChB,CAAC;AACD,QAAE,GAAG,SAAS,CAAC,UAAiB;AAC9B,eAAO,KAAK,KAAK;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAAA,IACH,KAAK,CAAC,QAAgB,SACpB,IAAI,QAAQ,aAAW;AACrB,UAAI,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;AAC1B,UAAI,UAAU,WAAW,MAAM;AAC7B,UAAE,MAAM;AACR,gBAAQ,IAAI;AAAA,MACd,GAAG,UAAU;AACb,QAAE,GAAG,SAAS,CAAC,UAAiB;AAC9B,UAAE,MAAM;AACR,qBAAa,OAAO;AACpB,gBAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,IACH,QAAQ,OAAmB;AACzB,UAAI,CAAC,MAAM;AAAI,cAAM,IAAI,MAAM,SAAS,iBAAiB;AACzD,UAAI,KAAK,MAAM;AAEf,cAAQ,CAAC,SAAS,KAAK,CAAC;AAExB,aAAO;AAAA,QACL,IAAI,CAAC,MAAuB,OAAY;AACtC,uBAAa,MAAM,aAAa,OAAO;AAAA,YACrC,IAAI,CAAC;AAAA,YACL,QAAQ,CAAC;AAAA,UACX;AACA,uBAAa,IAAI,MAAM,KAAK,EAAE;AAAA,QAChC;AAAA,QACA,KAAK,CAAC,MAAuB,OAAY;AACvC,cAAIA,aAAY,aAAa;AAC7B,cAAI,CAACA;AAAW;AAChB,cAAI,MAAMA,WAAU,MAAM,QAAQ,EAAE;AACpC,cAAI,OAAO;AAAG,YAAAA,WAAU,MAAM,OAAO,KAAK,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA,QAAc;AACZ,kBAAY,EAAC,SAAS,CAAC,GAAG,YAAY,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAC;AAC/D,qBAAe,CAAC;AAChB,qBAAe,CAAC;AAChB,UAAI,GAAG,eAAe,UAAU,MAAM;AACpC,YAAI,MAAM;AAAA,MACZ;AAAA,IACF;AAAA,IACA,IAAI,SAAS;AACX,aAAO,IAAI,cAAc;AAAA,IAC3B;AAAA,EACF;AACF;;;AC7VO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA,UAAuC,CAAC;AAAA,EAExC;AAAA,EACA;AAAA,EAER,YAAY,UAA0D,CAAC,GAAG;AACxE,SAAK,QAAQ,CAAC;AACd,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,aAAa,QAAQ,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAM,QAAwB;AAC5B,WAAO,QAAQ,SAAO;AACpB,UAAI,QAAQ,KAAK,MAAM,aAAa,GAAG;AACvC,UAAI;AAAO,cAAM,MAAM;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,KAA6B;AAC7C,UAAM,KAAK,aAAa,GAAG;AAE3B,QAAI,CAAC,KAAK,MAAM,KAAK;AACnB,WAAK,MAAM,MAAM,UAAU,IAAI;AAAA,QAC7B,YAAY,KAAK,aAAa;AAAA,QAC9B,aAAa,KAAK,aAAa;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,MAAM,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAkB,SAAmB,MAAiC;AACxE,QAAI,YAAyB,oBAAI,IAAI;AACrC,QAAI,eAAe,EAAC,GAAI,QAAQ,CAAC,EAAE;AACnC,iBAAa,mBAAmB,CAAC,IAAI,QAAQ;AAC3C,UAAI,MAAM,mBAAmB,IAAI,GAAG,GAAG;AACrC,eAAO;AAAA,MACT;AACA,UAAI,MAAM,KAAK,QAAQ,OAAO,oBAAI,IAAI;AACtC,UAAI,IAAI,GAAG;AACX,WAAK,QAAQ,MAAM;AACnB,aAAO,UAAU,IAAI,EAAE;AAAA,IACzB;AAEA,QAAI,OAAc,CAAC;AACnB,QAAI,iBAA8C,oBAAI,IAAI;AAC1D,QAAI,gBAAiC,oBAAI,IAAI;AAC7C,QAAI,eAAe,OAAO;AAE1B,QAAI,WAAW;AACf,QAAI,cAAc,WAAW,MAAM;AACjC,iBAAW;AACX,eAAS,MAAM,cAAc,OAAO;AAAG,WAAG;AAAA,IAC5C,GAAG,KAAK,cAAc;AAEtB,WAAO,QAAQ,OAAM,UAAS;AAC5B,UAAI;AACJ,UAAI;AACF,YAAI,MAAM,KAAK,YAAY,KAAK;AAAA,MAClC,SAAS,KAAP;AACA,mBAAW;AACX;AAAA,MACF;AACA,UAAI,CAAC;AAAG;AACR,UAAI,IAAI,EAAE,IAAI,SAAS,YAAY;AACnC,QAAE,GAAG,SAAS,CAAC,UAAiB;AAC9B,kBAAU,IAAI,MAAM,EAAY;AAChC,iBAAS,MAAM,eAAe,OAAO;AAAG,aAAG,KAAK;AAAA,MAClD,CAAC;AACD,QAAE,GAAG,QAAQ,MAAM;AACjB,YAAI;AAAU;AACd,mBAAW;AAAA,MACb,CAAC;AACD,WAAK,KAAK,CAAC;AAEX,eAAS,aAAa;AACpB;AACA,YAAI,iBAAiB,GAAG;AACtB,uBAAa,WAAW;AACxB,mBAAS,MAAM,cAAc,OAAO;AAAG,eAAG;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,aAAkB;AAAA,MACpB,IAAIC,UAASC,OAAM;AACjB,aAAK,QAAQ,SAAO,IAAI,IAAID,UAASC,KAAI,CAAC;AAC1C,eAAO;AAAA,MACT;AAAA,MACA,QAAQ;AACN,aAAK,QAAQ,SAAO,IAAI,MAAM,CAAC;AAAA,MACjC;AAAA,MACA,GAAG,MAAM,IAAI;AACX,YAAI,SAAS,SAAS;AACpB,yBAAe,IAAI,EAAE;AAAA,QACvB,WAAW,SAAS,QAAQ;AAC1B,wBAAc,IAAI,EAAgC;AAAA,QACpD;AAAA,MACF;AAAA,MACA,IAAI,MAAM,IAAI;AACZ,YAAI,SAAS,SAAS;AACpB,yBAAe,OAAO,EAAE;AAAA,QAC1B,WAAW,SAAS;AAClB,wBAAc,OAAO,EAAgC;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IACE,QACA,QACA,MACuB;AACvB,WAAO,IAAI,QAAQ,aAAW;AAC5B,UAAI,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI;AACzC,UAAI,UAAU,WAAW,MAAM;AAC7B,YAAI,MAAM;AACV,gBAAQ,IAAI;AAAA,MACd,GAAG,KAAK,UAAU;AAClB,UAAI,GAAG,SAAS,CAAC,UAAiB;AAChC,gBAAQ,KAAK;AACb,qBAAa,OAAO;AACpB,YAAI,MAAM;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,KACE,QACA,SACA,MACkB;AAClB,WAAO,IAAI,QAAQ,aAAW;AAC5B,UAAI,SAAkB,CAAC;AACvB,UAAI,MAAM,KAAK,IAAI,QAAQ,SAAS,IAAI;AAExC,UAAI,GAAG,SAAS,CAAC,UAAiB;AAChC,eAAO,KAAK,KAAK;AAAA,MACnB,CAAC;AAGD,UAAI,GAAG,QAAQ,MAAM;AACnB,YAAI,MAAM;AACV,gBAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,QAAkB,OAAmB;AAC3C,UAAM,cAA8B,OAAO,IAAI,OAAM,UAAS;AAC5D,UAAI;AACJ,UAAI;AACF,YAAI,MAAM,KAAK,YAAY,KAAK;AAChC,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB,SAAS,GAAP;AACA,eAAO,EAAC,KAAK;AAAA,QAAC,GAAG,MAAM;AAAA,QAAC,EAAC;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,UAAM,cAAc,oBAAI,IAAI;AAE5B,WAAO;AAAA,MACL,GAAG,MAAM,IAAI;AACX,eAAO,QAAQ,OAAO,OAAO,MAAM;AACjC,cAAI,MAAM,MAAM,YAAY;AAC5B,cAAI,WAAW,MAAM,GAAG,KAAK;AAC7B,sBAAY,IAAI,IAAI,QAAQ;AAC5B,cAAI,GAAG,MAAM,QAAQ;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,MAEA,IAAI,MAAM,IAAI;AACZ,eAAO,QAAQ,OAAO,GAAG,MAAM;AAC7B,cAAI,WAAW,YAAY,IAAI,EAAE;AACjC,cAAI,UAAU;AACZ,gBAAI,MAAM,MAAM,YAAY;AAC5B,gBAAI,IAAI,MAAM,QAAQ;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,IAAsB;AAC3B,WAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,EACtD;AACF;;;ACtMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAYC,gBAAe;AAC3B,SAAQ,cAAa;AAIrB,IAAM,gBAAgB;AAoBf,SAAS,OAAO,OAGrB;AACA,MAAI,EAAC,QAAQ,MAAK,IAAI,OAAO,OAAO,OAAO,aAAa;AACxD,MAAI,OAAO,IAAI,WAAW,OAAO,UAAU,KAAK,CAAC;AAEjD,UAAQ,QAAQ;AAAA,IACd,KAAK,YAAY;AACf,UAAI,MAAM,SAAS,IAAI;AACvB,UAAI,CAAC,IAAI,KAAK;AAAI,cAAM,IAAI,MAAM,4BAA4B;AAC9D,UAAI,IAAI,GAAG,GAAG,WAAW;AAAI,cAAM,IAAI,MAAM,0BAA0B;AAEvE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,QAAkB,iBAAM,WAAW,IAAI,GAAG,EAAE;AAAA,UAC5C,QAAQ,IAAI,KAAK,IAAI,GAAG,IAAI,OAAK,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,UAAI,MAAM,SAAS,IAAI;AACvB,UAAI,CAAC,IAAI,KAAK;AAAI,cAAM,IAAI,MAAM,0BAA0B;AAC5D,UAAI,IAAI,GAAG,GAAG,WAAW;AAAI,cAAM,IAAI,MAAM,0BAA0B;AACvE,UAAI,IAAI,MAAM,IAAI,GAAG,GAAG,WAAW;AACjC,cAAM,IAAI,MAAM,0BAA0B;AAE5C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,IAAc,iBAAM,WAAW,IAAI,GAAG,EAAE;AAAA,UACxC,QAAQ,IAAI,KAAK,IAAI,GAAG,IAAI,OAAK,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC;AAAA,UAC3D,QAAQ,IAAI,KAAK,KACH,iBAAM,WAAW,IAAI,GAAG,EAAE,IACpC;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,SAAS;AACZ,UAAI,MAAM,SAAS,IAAI;AACvB,UAAI,CAAC,IAAI,KAAK;AAAI,cAAM,IAAI,MAAM,yBAAyB;AAC3D,UAAI,CAAC,IAAI,KAAK;AAAI,cAAM,IAAI,MAAM,yBAAyB;AAC3D,UAAI,IAAI,GAAG,GAAG,WAAW;AAAI,cAAM,IAAI,MAAM,0BAA0B;AACvE,UAAI,CAAC,IAAI,KAAK;AAAI,cAAM,IAAI,MAAM,yBAAyB;AAC3D,UAAI,IAAI,GAAG,GAAG,WAAW;AAAG,cAAM,IAAI,MAAM,yBAAyB;AAErE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,YAAY,YAAY,OAAO,IAAI,GAAG,EAAE;AAAA,UACxC,QAAkB,iBAAM,WAAW,IAAI,GAAG,EAAE;AAAA,UAC5C,MAAM,SAAmB,iBAAM,WAAW,IAAI,GAAG,EAAE,GAAG,EAAE;AAAA,UACxD,QAAQ,IAAI,KAAK,IAAI,GAAG,IAAI,OAAK,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAC,MAAM,QAAQ,MAAgB,iBAAM,WAAW,IAAI,EAAC;AAAA,IAE9D;AACE,YAAM,IAAI,MAAM,kBAAkB,QAAQ;AAAA,EAC9C;AACF;AAIA,SAAS,SAAS,MAAuB;AACvC,MAAI,SAAc,CAAC;AACnB,MAAI,OAAO;AACX,SAAO,KAAK,SAAS,GAAG;AACtB,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;AAC3B,WAAO,KAAK,MAAM,IAAI,CAAC;AACvB,QAAI,EAAE,SAAS;AAAG;AAClB,WAAO,KAAK,OAAO,MAAM,CAAC;AAC1B,WAAO,GAAG,KAAK,CAAC;AAAA,EAClB;AACA,SAAO;AACT;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,YAAY,QAAQ,GAAG;AAChC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,YAAY,QAAQ,GAAG;AAChC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,YAAY,QAAQ,GAAG;AAChC;AAEA,SAAS,YAAY,QAAgB,KAAqB;AACxD,MAAI,OAAiB,iBAAM,WAAW,GAAG;AACzC,MAAI,QAAQ,OAAO,QAAQ,IAAI;AAC/B,SAAO,OAAO,OAAO,QAAQ,OAAO,aAAa;AACnD;AAEO,SAAS,eAAe,SAAiC;AAC9D,MAAI,OAAO,UAAU;AAAA,IACnB,GAAG,CAAW,iBAAM,WAAW,QAAQ,MAAM,CAAC;AAAA,IAC9C,IAAI,QAAQ,UAAU,CAAC,GAAG,IAAI,SAAO,YAAY,OAAO,GAAG,CAAC;AAAA,EAC9D,CAAC;AACD,MAAI,QAAQ,OAAO,QAAQ,IAAI;AAC/B,SAAO,OAAO,OAAO,YAAY,OAAO,aAAa;AACvD;AAEO,SAAS,aAAa,OAA6B;AACxD,MAAI,OAAO,UAAU;AAAA,IACnB,GAAG,CAAW,iBAAM,WAAW,MAAM,EAAE,CAAC;AAAA,IACxC,IAAI,MAAM,UAAU,CAAC,GAAG,IAAI,SAAO,YAAY,OAAO,GAAG,CAAC;AAAA,IAC1D,GAAG,MAAM,SAAS,CAAW,iBAAM,WAAW,MAAM,MAAM,CAAC,IAAI,CAAC;AAAA,EAClE,CAAC;AACD,MAAI,QAAQ,OAAO,QAAQ,IAAI;AAC/B,SAAO,OAAO,OAAO,UAAU,OAAO,aAAa;AACrD;AAEO,SAAS,YAAY,MAA8B;AACxD,MAAI,OAAO,IAAI,YAAY,CAAC;AAC5B,MAAI,SAAS,IAAI,EAAE,UAAU,GAAG,KAAK,MAAM,KAAK;AAEhD,MAAI,OAAO,UAAU;AAAA,IACnB,GAAG,CAAC,YAAY,OAAO,KAAK,UAAU,CAAC;AAAA,IACvC,IAAI,KAAK,UAAU,CAAC,GAAG,IAAI,SAAO,YAAY,OAAO,GAAG,CAAC;AAAA,IACzD,GAAG,CAAW,iBAAM,WAAW,KAAK,MAAM,CAAC;AAAA,IAC3C,GAAG,CAAC,IAAI,WAAW,IAAI,CAAC;AAAA,EAC1B,CAAC;AACD,MAAI,QAAQ,OAAO,QAAQ,IAAI;AAC/B,SAAO,OAAO,OAAO,SAAS,OAAO,aAAa;AACpD;AAEA,SAAS,UAAU,KAAsB;AACvC,MAAI,UAAwB,CAAC;AAE7B,SAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM;AACvC,OAAG,QAAQ,OAAK;AACd,UAAI,QAAQ,IAAI,WAAW,EAAE,SAAS,CAAC;AACvC,YAAM,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC;AAC1B,YAAM,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;AACvB,YAAM,IAAI,GAAG,CAAC;AACd,cAAQ,KAAK,KAAK;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,SAAiB,iBAAM,YAAY,GAAG,OAAO;AAC/C;;;ACtKA,IAAM,eACJ;AAEK,SAAS,gBAAgB,KAAyB;AACvD,MAAI,aAA0B,CAAC;AAC/B,WAAS,OAAO,IAAI,QAAQ,SAAS,YAAY,GAAG;AAClD,QAAI,IAAI,IAAI;AAEV,UAAI;AACF,YAAI,EAAC,MAAM,KAAI,IAAI,OAAO,IAAI,EAAE;AAChC,gBAAQ,MAAM;AAAA,UACZ,KAAK,QAAQ;AACX,uBAAW,KAAK;AAAA,cACd,MAAM,IAAI;AAAA,cACV,SAAS,EAAC,QAAQ,MAAgB,QAAQ,CAAC,EAAC;AAAA,YAC9C,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK,YAAY;AACf,uBAAW,KAAK;AAAA,cACd,MAAM,IAAI;AAAA,cACV,SAAS;AAAA,YACX,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK,QAAQ;AACX,uBAAW,KAAK;AAAA,cACd,MAAM,IAAI;AAAA,cACV,OAAO,EAAC,IAAI,MAAgB,QAAQ,CAAC,EAAC;AAAA,YACxC,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK,UAAU;AACb,uBAAW,KAAK;AAAA,cACd,MAAM,IAAI;AAAA,cACV,OAAO;AAAA,YACT,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK,SAAS;AACZ,uBAAW,KAAK;AAAA,cACd,MAAM,IAAI;AAAA,cACV,SAAS;AAAA,YACX,CAAC;AACD;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAP;AAAA,MAEF;AAAA,IACF,WAAW,IAAI,IAAI;AAEjB,UAAI,MAAM,SAAS,IAAI,IAAI,EAAE;AAC7B,UAAI,MAAM,IAAI,KAAK;AACnB,UAAI,CAAC;AAAK;AAEV,cAAQ,IAAI,IAAI;AAAA,QACd,KAAK,KAAK;AACR,qBAAW,KAAK;AAAA,YACd,MAAM,IAAI;AAAA,YACV,SAAS,EAAC,QAAQ,IAAI,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAC;AAAA,UAC1D,CAAC;AACD;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,qBAAW,KAAK;AAAA,YACd,MAAM,IAAI;AAAA,YACV,OAAO,EAAC,IAAI,IAAI,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAC;AAAA,UACpD,CAAC;AACD;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,cAAI;AACF,gBAAI,CAAC,MAAM,QAAQ,UAAU,IAAI,IAAI,GAAG,MAAM,GAAG;AACjD,uBAAW,KAAK;AAAA,cACd,MAAM,IAAI;AAAA,cACV,SAAS;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA,MAAM,SAAS,MAAM,EAAE;AAAA,gBACvB,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,cAC/B;AAAA,YACF,CAAC;AAAA,UACH,SAAS,KAAP;AAAA,UAEF;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACvGA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,mBAAkB;AAC1B,YAAYC,gBAAe;AAC3B,SAAQ,cAAa;AAIrB,eAAsB,QACpB,SACA,QACA,MACiB;AACjB,QAAM,MAAgB,2BAAgB,SAAS,OAAO,MAAM;AAC5D,QAAM,gBAAgB,eAAe,GAAG;AAExC,MAAI,KAAK,WAAW,KAAK,YAAY,EAAE,CAAC;AACxC,MAAI,YAAY,YAAY,OAAO,IAAI;AACvC,MAAI,YAAY,MAAM,OAAO,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,IACA,EAAC,MAAM,UAAS;AAAA,IAChB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AACA,MAAI,aAAa,MAAM,OAAO,OAAO;AAAA,IACnC,EAAC,MAAM,WAAW,GAAE;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,OAAO,OAAO,IAAI,WAAW,UAAU,CAAC;AACpD,MAAI,QAAQ,OAAO,OAAO,IAAI,WAAW,GAAG,MAAM,CAAC;AAEnD,SAAO,GAAG,YAAY;AACxB;AAEA,eAAsB,QACpB,SACA,QACA,MACiB;AACjB,MAAI,CAAC,OAAO,KAAK,IAAI,KAAK,MAAM,MAAM;AACtC,MAAI,MAAgB,2BAAgB,SAAS,OAAO,MAAM;AAC1D,MAAI,gBAAgB,eAAe,GAAG;AAEtC,MAAI,YAAY,MAAM,OAAO,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,IACA,EAAC,MAAM,UAAS;AAAA,IAChB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AACA,MAAI,aAAa,OAAO,OAAO,KAAK;AACpC,MAAI,KAAK,OAAO,OAAO,KAAK;AAE5B,MAAI,YAAY,MAAM,OAAO,OAAO;AAAA,IAClC,EAAC,MAAM,WAAW,GAAE;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,OAAO,SAAS;AACvC,SAAO;AACT;AAEA,SAAS,eAAe,KAA6B;AACnD,SAAO,IAAI,MAAM,GAAG,EAAE;AACxB;;;ACjEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAI;AAEJ,IAAI;AACF,WAAS;AACX,QAAE;AAAO;AAEF,SAAS,uBAAuB,qBAA0B;AAC/D,WAAS;AACX;AAEA,eAAsB,aACpB,QACA,QAAQ,IAC2B;AACnC,MAAI;AACF,QAAI,MAAM,OACR,MAAM,OAAO,WAAW,sCAAsC,OAAO,GACrE,KAAK;AAEP,WAAO,IAAI;AAAA,EACb,SAAS,GAAP;AACA,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,aACpB,UACgC;AAChC,MAAI,CAAC,MAAM,MAAM,IAAI,SAAS,MAAM,GAAG;AAEvC,MAAI,CAAC,QAAQ;AAEX,aAAS;AACT,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,MAAM,mBAAmB;AAAG,WAAO;AAC7C,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO;AAElC,MAAI;AACJ,MAAI;AACF,UAAM,OACJ,MAAM,OAAO,WAAW,sCAAsC,MAAM,GACpE,KAAK;AAAA,EACT,SAAS,KAAP;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,QAAQ;AAAO,WAAO;AAEhC,MAAI,SAAS,IAAI,MAAM;AACvB,MAAI,SAAU,IAAI,SAAS,WAAW,CAAC;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AC3DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAYC,gBAAe;AAC3B,SAAQ,gBAAe;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAQ,aAAY;AAEb,SAAS,wBACd,UACA,YACQ;AACR,MAAI,OAAO,MAAM,eAAe,mBAAmB,UAAU,UAAU,CAAC;AACxE,MAAI,aAAa,KAAK,OAAO,oBAAoB,EAAE;AACnD,MAAI,CAAC;AAAY,UAAM,IAAI,MAAM,8BAA8B;AAC/D,SAAiB,iBAAM,WAAW,UAAU;AAC9C;AAEO,SAAS,oBAA4B;AAC1C,SAAO,iBAAiB,QAAQ;AAClC;AAEO,SAAS,cAAc,OAAwB;AACpD,SAAO,iBAAiB,OAAO,QAAQ;AACzC;;;ACzBA;AAAA;AAAA;AAAA;AAyBO,SAAS,MAAM,OAAyC;AAC7D,QAAM,SAAsB;AAAA,IAC1B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,IACX,UAAU,CAAC;AAAA,EACb;AAEA,QAAM,QAAoB,CAAC;AAE3B,aAAW,OAAO,MAAM,MAAM;AAC5B,QAAI,IAAI,OAAO,OAAO,IAAI,IAAI;AAC5B,YAAM,KAAK,GAAG;AAAA,IAChB;AAEA,QAAI,IAAI,OAAO,OAAO,IAAI,IAAI;AAC5B,aAAO,SAAS,KAAK;AAAA,QACnB,QAAQ,IAAI;AAAA,QACZ,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa;AAC7D,UAAM,OAAO,MAAM;AAEnB,UAAM,CAAC,GAAG,aAAa,cAAc,UAAU,IAAI;AAOnD,UAAM,eAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,QAAQ,eAAe,CAAC,YAAY,IAAI,CAAC;AAAA,IAC3C;AAEA,UAAM,cAAc,cAAc;AAClC,UAAM,aAAa,cAAc,MAAM,SAAS;AAEhD,QAAI,eAAe,QAAQ;AACzB,aAAO,OAAO;AACd;AAAA,IACF;AAEA,QAAI,eAAe,SAAS;AAC1B,aAAO,QAAQ;AACf;AAAA,IACF;AAEA,QAAI,eAAe,WAAW;AAC5B,aAAO,SAAS,KAAK,YAAY;AACjC;AAAA,IACF;AAEA,QAAI,aAAa;AACf,aAAO,OAAO;AACd;AAAA,IACF;AAEA,QAAI,YAAY;AACd,aAAO,QAAQ;AACf;AAAA,IACF;AAEA,WAAO,SAAS,KAAK,YAAY;AAAA,EACnC;AAEA,SAAO;AACT;;;AC/FA;AAAA;AAAA;AAAA;AAAA,YAAYC,gBAAe;AAGpB,SAAS,OAAO,IAAoB;AACzC,SAAO,mBAA6B,iBAAM,WAAW,EAAE,CAAC;AAC1D;AAMA,SAAS,mBAAmB,MAA0B;AACpD,MAAI,OAAe,GAAW;AAE9B,OAAK,IAAI,GAAG,QAAQ,GAAG,IAAI,KAAK,QAAQ,KAAK;AAC3C,WAAO,IAAI,KAAK,EAAE;AAClB,aAAS;AACT,QAAI,SAAS,GAAG;AACd;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,IAAI,GAAW;AACtB,MAAI,IAAI;AAER,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AAGA,SAAO,MAAM,GAAG;AACd;AAAA,EACF;AAEA,SAAO,IAAI;AACb;;;ACzCA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAYC,gBAAe;AAC3B,SAAQ,UAAAC,eAAa;AAoBd,SAAS,iBACd,YACA,YACY;AACZ,MAAI,aAAa,CAAC;AAClB,OAAK,WAAW,QAAQ,OAAO;AAAG,eAAW,KAAK,QAAQ,WAAW,MAAM;AAC3E,MAAI,WAAW;AAAO,eAAW,KAAK,cAAc,WAAW,OAAO;AACtE,MAAI,WAAW;AAAO,eAAW,KAAK,cAAc,WAAW,OAAO;AACtE,MAAI,OAAO,WAAW,KAAK,GAAG;AAE9B,MAAI,SAAS;AACX,UAAM,IAAI,MAAM,wDAAwD;AAE1E,MAAI,UAAUC;AAAA,IACZ,YAAY,OAAO,oBAAoB,WAAW,UAAU,MAAM;AAAA,EACpE;AAEA,MAAI,MAAgB,iBAAM;AAAA,IACd,mBAAQ,SAAS,SAAS,UAAU;AAAA,EAChD;AAEA,SAAO;AAAA,IACL,MAAM,aAAa,UAAU;AAAA,IAC7B,IAAI,WAAW;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,aAAa,OAA6B;AAExD,MAAI,MAAM,MAAM,KAAK,KAAK,CAAAC,SAAOA,KAAI,OAAO,gBAAgBA,KAAI,UAAU,CAAC;AAC3E,MAAI,CAAC;AAAK,WAAO;AAEjB,MAAI,SAAS,IAAI;AACjB,MAAI,OAAO,IAAI;AACf,MAAI,MAAM,IAAI;AAGd,MAAI,aAAa,KAAK,MAAM,GAAG;AAC/B,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,QAAI,CAAC,KAAK,UAAU,KAAK,IAAI,WAAW,GAAG,MAAM,IAAI;AAGrD,QAAI,QAAQ,UAAU,aAAa,OAAO,MAAM,SAAS,SAAS,KAAK;AACrE;AAAA,aAEA,QAAQ,gBACR,aAAa,OACb,MAAM,aAAa,SAAS,KAAK;AAEjC;AAAA,aAEA,QAAQ,gBACR,aAAa,OACb,MAAM,aAAa,SAAS,KAAK;AAEjC;AAAA;AACG,aAAO;AAAA,EACd;AAGA,MAAI,UAAUD;AAAA,IACZ,YAAY,OAAO,oBAAoB,MAAM,UAAU,MAAM;AAAA,EAC/D;AACA,MAAI,CAAW,mBAAQ,WAAW,KAAK,SAAS,MAAM;AAAG,WAAO;AAEhE,SAAO;AACT;;;ACzFA;AAAA;AAAA,gCAAAE;AAAA,EAAA;AAAA;AAAA,IAAIC;AAEJ,IAAI;AACF,EAAAA,UAAS;AACX,QAAE;AAAO;AAEF,SAASD,wBAAuB,qBAA0B;AAC/D,EAAAC,UAAS;AACX;AAEA,eAAsB,eACpB,QACA,UACA,OACkB;AAClB,MAAI;AACF,QAAI,MAAM,OACR,MAAMA,QAAO,2BAA2B,YAAY,WAAW,GAC/D,KAAK;AACP,WACE,QACA,4DAA4D;AAAA,EAEhE,SAAS,GAAP;AACA,WAAO;AAAA,EACT;AACF;;;AC1BA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA;AAAA,SAAQ,UAAAC,eAAa;AAKrB,IAAIC;AAEJ,IAAI;AACF,EAAAA,UAAS;AACX,QAAE;AAAO;AAEF,SAASC,wBAAuB,qBAA0B;AAC/D,EAAAD,UAAS;AACX;AAEA,eAAsB,eAAe,UAAyC;AAC5E,MAAI;AACF,QAAI,QAAgB;AACpB,QAAI,EAAC,OAAO,MAAK,IAAI,KAAK,MAAM,SAAS,OAAO;AAChD,QAAI,OAAO;AACT,UAAI,EAAC,MAAK,IAAIE,QAAO,OAAO,OAAO,GAAI;AACvC,UAAI,OAAOA,QAAO,UAAU,KAAK;AACjC,cAAQ,YAAY,OAAO,IAAI;AAAA,IACjC,WAAW,OAAO;AAChB,UAAI,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM,GAAG;AACpC,cAAQ,WAAW,6BAA6B;AAAA,IAClD,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,MAAMF,QAAO,KAAK;AAC5B,QAAI,OAAO,MAAM,IAAI,KAAK;AAE1B,QAAI,KAAK,eAAe,KAAK,aAAa;AACxC,aAAO,KAAK;AAAA,IACd;AAAA,EACF,SAAS,KAAP;AAAA,EAEF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAMkB;AAChB,MAAI,CAAC;AAAQ,UAAM,IAAI,MAAM,kBAAkB;AAC/C,MAAI,CAAC;AAAS,UAAM,IAAI,MAAM,mBAAmB;AAEjD,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACxC,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,CAAC,KAAK,OAAO;AAAA,MACb,CAAC,UAAU,OAAO,SAAS,CAAC;AAAA,MAC5B,CAAC,UAAU,GAAG,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,OAAO;AACT,OAAG,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,kBAAyC;AAC1E,MAAI;AAEJ,MAAI;AACF,iBAAa,KAAK,MAAM,gBAAgB;AAAA,EAC1C,SAAS,KAAP;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,cAAc,UAAU;AAC3B,WAAO;AACT,MAAI,CAAC,gBAAgB,UAAU;AAAG,WAAO;AAEzC,MAAI,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC;AACvD,MAAI,CAAC;AAAG,WAAO;AACf,MAAI,CAAC,EAAE,GAAG,MAAM,gBAAgB;AAC9B,WAAO;AAET,MAAI,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC;AACvD,MAAI,KAAK,CAAC,EAAE,GAAG,MAAM,gBAAgB;AACnC,WAAO;AAET,MAAI,SAAS,WAAW,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,YAAY,CAAC;AACjE,MAAI,CAAC;AAAQ,WAAO;AAEpB,SAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKkB;AAChB,MAAI,KAAY,KAAK,MAAM,UAAU;AACrC,MAAI,qBAAqB,GAAG,KAAK;AAAA,IAC/B,CAAC,CAAC,CAAC,MAAM,MAAM,OAAO,MAAM,OAAO,MAAM;AAAA,EAC3C;AAEA,MAAI,MAAM;AAAA,IACR,MAAM;AAAA,IACN,YAAY,KAAK,MAAM,OAAO,QAAQ,IAAI,GAAI;AAAA,IAC9C,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,GAAG;AAAA,MACH,CAAC,UAAU,MAAM;AAAA,MACjB,CAAC,eAAe,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,QAAI,KAAK,KAAK,CAAC,YAAY,QAAQ,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;;;ACpHA,YAAYG,gBAAe;AAC3B,SAAQ,YAAW;AACnB,SAAQ,UAAAC,eAAa;AACX,iBAAM,iBAAiB,CAAC,QAAQ,SACxC,KAAKA,SAAQ,KAAe,iBAAM,YAAY,GAAG,IAAI,CAAC;AAC9C,iBAAM,aAAa,IAAI,SAC/BA,QAAiB,iBAAM,YAAY,GAAG,IAAI,CAAC;",
6
+ "names": ["secp256k1", "Kind", "id", "listeners", "filters", "opts", "secp256k1", "secp256k1", "secp256k1", "secp256k1", "secp256k1", "sha256", "sha256", "tag", "useFetchImplementation", "_fetch", "useFetchImplementation", "bech32", "_fetch", "useFetchImplementation", "bech32", "secp256k1", "sha256"]
7
7
  }
package/lib/event.d.ts CHANGED
@@ -6,6 +6,7 @@ export declare enum Kind {
6
6
  EncryptedDirectMessage = 4,
7
7
  EventDeletion = 5,
8
8
  Reaction = 7,
9
+ BadgeAward = 8,
9
10
  ChannelCreation = 40,
10
11
  ChannelMetadata = 41,
11
12
  ChannelMessage = 42,
@@ -16,6 +17,8 @@ export declare enum Kind {
16
17
  Zap = 9735,
17
18
  RelayList = 10002,
18
19
  ClientAuth = 22242,
20
+ BadgeDefinition = 30008,
21
+ ProfileBadge = 30009,
19
22
  Article = 30023
20
23
  }
21
24
  export type EventTemplate = {
package/lib/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export * as nip04 from './nip04';
8
8
  export * as nip05 from './nip05';
9
9
  export * as nip06 from './nip06';
10
10
  export * as nip10 from './nip10';
11
+ export * as nip13 from './nip13';
11
12
  export * as nip19 from './nip19';
12
13
  export * as nip26 from './nip26';
13
14
  export * as nip39 from './nip39';
package/lib/nip13.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ /** Get POW difficulty from a Nostr hex ID. */
2
+ export declare function getPow(id: string): number;
@@ -3617,6 +3617,7 @@ zoo`.split("\n");
3617
3617
  nip05: () => nip05_exports,
3618
3618
  nip06: () => nip06_exports,
3619
3619
  nip10: () => nip10_exports,
3620
+ nip13: () => nip13_exports,
3620
3621
  nip19: () => nip19_exports,
3621
3622
  nip26: () => nip26_exports,
3622
3623
  nip39: () => nip39_exports,
@@ -5307,6 +5308,7 @@ zoo`.split("\n");
5307
5308
  Kind2[Kind2["EncryptedDirectMessage"] = 4] = "EncryptedDirectMessage";
5308
5309
  Kind2[Kind2["EventDeletion"] = 5] = "EventDeletion";
5309
5310
  Kind2[Kind2["Reaction"] = 7] = "Reaction";
5311
+ Kind2[Kind2["BadgeAward"] = 8] = "BadgeAward";
5310
5312
  Kind2[Kind2["ChannelCreation"] = 40] = "ChannelCreation";
5311
5313
  Kind2[Kind2["ChannelMetadata"] = 41] = "ChannelMetadata";
5312
5314
  Kind2[Kind2["ChannelMessage"] = 42] = "ChannelMessage";
@@ -5317,6 +5319,8 @@ zoo`.split("\n");
5317
5319
  Kind2[Kind2["Zap"] = 9735] = "Zap";
5318
5320
  Kind2[Kind2["RelayList"] = 10002] = "RelayList";
5319
5321
  Kind2[Kind2["ClientAuth"] = 22242] = "ClientAuth";
5322
+ Kind2[Kind2["BadgeDefinition"] = 30008] = "BadgeDefinition";
5323
+ Kind2[Kind2["ProfileBadge"] = 30009] = "ProfileBadge";
5320
5324
  Kind2[Kind2["Article"] = 30023] = "Article";
5321
5325
  return Kind2;
5322
5326
  })(Kind || {});
@@ -5351,8 +5355,9 @@ zoo`.split("\n");
5351
5355
  let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)));
5352
5356
  return utils.bytesToHex(eventHash);
5353
5357
  }
5358
+ var isRecord = (obj) => obj instanceof Object;
5354
5359
  function validateEvent(event) {
5355
- if (typeof event !== "object")
5360
+ if (!isRecord(event))
5356
5361
  return false;
5357
5362
  if (typeof event.kind !== "number")
5358
5363
  return false;
@@ -6606,7 +6611,7 @@ zoo`.split("\n");
6606
6611
  domain = name;
6607
6612
  name = "_";
6608
6613
  }
6609
- if (!name.match(/^[A-Za-z0-9-_]+$/))
6614
+ if (!name.match(/^[A-Za-z0-9-_.]+$/))
6610
6615
  return null;
6611
6616
  if (!domain.includes("."))
6612
6617
  return null;
@@ -7446,6 +7451,37 @@ zoo`.split("\n");
7446
7451
  return result;
7447
7452
  }
7448
7453
 
7454
+ // nip13.ts
7455
+ var nip13_exports = {};
7456
+ __export(nip13_exports, {
7457
+ getPow: () => getPow
7458
+ });
7459
+ init_define_process();
7460
+ function getPow(id) {
7461
+ return getLeadingZeroBits(utils.hexToBytes(id));
7462
+ }
7463
+ function getLeadingZeroBits(hash2) {
7464
+ let total, i, bits;
7465
+ for (i = 0, total = 0; i < hash2.length; i++) {
7466
+ bits = msb(hash2[i]);
7467
+ total += bits;
7468
+ if (bits !== 8) {
7469
+ break;
7470
+ }
7471
+ }
7472
+ return total;
7473
+ }
7474
+ function msb(b) {
7475
+ let n = 0;
7476
+ if (b === 0) {
7477
+ return 8;
7478
+ }
7479
+ while (b >>= 1) {
7480
+ n++;
7481
+ }
7482
+ return 7 - n;
7483
+ }
7484
+
7449
7485
  // nip26.ts
7450
7486
  var nip26_exports = {};
7451
7487
  __export(nip26_exports, {