nostr-core 0.4.0 → 0.7.0

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.
Files changed (138) hide show
  1. package/dist/index.d.ts +93 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +99 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/lnurl.d.ts +161 -0
  6. package/dist/lnurl.d.ts.map +1 -0
  7. package/dist/lnurl.js +343 -0
  8. package/dist/lnurl.js.map +1 -0
  9. package/dist/nip02.d.ts +27 -0
  10. package/dist/nip02.d.ts.map +1 -0
  11. package/dist/nip02.js +55 -0
  12. package/dist/nip02.js.map +1 -0
  13. package/dist/nip05.d.ts +24 -0
  14. package/dist/nip05.d.ts.map +1 -0
  15. package/dist/nip05.js +57 -0
  16. package/dist/nip05.js.map +1 -0
  17. package/dist/nip06.d.ts +26 -0
  18. package/dist/nip06.d.ts.map +1 -0
  19. package/dist/nip06.js +49 -0
  20. package/dist/nip06.js.map +1 -0
  21. package/dist/nip09.d.ts +34 -0
  22. package/dist/nip09.d.ts.map +1 -0
  23. package/dist/nip09.js +66 -0
  24. package/dist/nip09.js.map +1 -0
  25. package/dist/nip10.d.ts +40 -0
  26. package/dist/nip10.d.ts.map +1 -0
  27. package/dist/nip10.js +69 -0
  28. package/dist/nip10.js.map +1 -0
  29. package/dist/nip11.d.ts +41 -0
  30. package/dist/nip11.d.ts.map +1 -0
  31. package/dist/nip11.js +38 -0
  32. package/dist/nip11.js.map +1 -0
  33. package/dist/nip13.d.ts +26 -0
  34. package/dist/nip13.d.ts.map +1 -0
  35. package/dist/nip13.js +75 -0
  36. package/dist/nip13.js.map +1 -0
  37. package/dist/nip18.d.ts +28 -0
  38. package/dist/nip18.d.ts.map +1 -0
  39. package/dist/nip18.js +66 -0
  40. package/dist/nip18.js.map +1 -0
  41. package/dist/nip21.d.ts +14 -0
  42. package/dist/nip21.d.ts.map +1 -0
  43. package/dist/nip21.js +24 -0
  44. package/dist/nip21.js.map +1 -0
  45. package/dist/nip22.d.ts +26 -0
  46. package/dist/nip22.d.ts.map +1 -0
  47. package/dist/nip22.js +109 -0
  48. package/dist/nip22.js.map +1 -0
  49. package/dist/nip23.d.ts +24 -0
  50. package/dist/nip23.d.ts.map +1 -0
  51. package/dist/nip23.js +70 -0
  52. package/dist/nip23.js.map +1 -0
  53. package/dist/nip24.d.ts +31 -0
  54. package/dist/nip24.d.ts.map +1 -0
  55. package/dist/nip24.js +75 -0
  56. package/dist/nip24.js.map +1 -0
  57. package/dist/nip25.d.ts +32 -0
  58. package/dist/nip25.d.ts.map +1 -0
  59. package/dist/nip25.js +54 -0
  60. package/dist/nip25.js.map +1 -0
  61. package/dist/nip27.d.ts +16 -0
  62. package/dist/nip27.d.ts.map +1 -0
  63. package/dist/nip27.js +44 -0
  64. package/dist/nip27.js.map +1 -0
  65. package/dist/nip28.d.ts +52 -0
  66. package/dist/nip28.d.ts.map +1 -0
  67. package/dist/nip28.js +118 -0
  68. package/dist/nip28.js.map +1 -0
  69. package/dist/nip29.d.ts +60 -0
  70. package/dist/nip29.d.ts.map +1 -0
  71. package/dist/nip29.js +122 -0
  72. package/dist/nip29.js.map +1 -0
  73. package/dist/nip30.d.ts +18 -0
  74. package/dist/nip30.d.ts.map +1 -0
  75. package/dist/nip30.js +24 -0
  76. package/dist/nip30.js.map +1 -0
  77. package/dist/nip31.d.ts +11 -0
  78. package/dist/nip31.d.ts.map +1 -0
  79. package/dist/nip31.js +15 -0
  80. package/dist/nip31.js.map +1 -0
  81. package/dist/nip36.d.ts +14 -0
  82. package/dist/nip36.d.ts.map +1 -0
  83. package/dist/nip36.js +24 -0
  84. package/dist/nip36.js.map +1 -0
  85. package/dist/nip40.d.ts +14 -0
  86. package/dist/nip40.d.ts.map +1 -0
  87. package/dist/nip40.js +26 -0
  88. package/dist/nip40.js.map +1 -0
  89. package/dist/nip42.d.ts +20 -0
  90. package/dist/nip42.d.ts.map +1 -0
  91. package/dist/nip42.js +38 -0
  92. package/dist/nip42.js.map +1 -0
  93. package/dist/nip48.d.ts +23 -0
  94. package/dist/nip48.d.ts.map +1 -0
  95. package/dist/nip48.js +30 -0
  96. package/dist/nip48.js.map +1 -0
  97. package/dist/nip50.d.ts +23 -0
  98. package/dist/nip50.d.ts.map +1 -0
  99. package/dist/nip50.js +47 -0
  100. package/dist/nip50.js.map +1 -0
  101. package/dist/nip51.d.ts +57 -0
  102. package/dist/nip51.d.ts.map +1 -0
  103. package/dist/nip51.js +118 -0
  104. package/dist/nip51.js.map +1 -0
  105. package/dist/nip52.d.ts +112 -0
  106. package/dist/nip52.d.ts.map +1 -0
  107. package/dist/nip52.js +405 -0
  108. package/dist/nip52.js.map +1 -0
  109. package/dist/nip56.d.ts +28 -0
  110. package/dist/nip56.d.ts.map +1 -0
  111. package/dist/nip56.js +60 -0
  112. package/dist/nip56.js.map +1 -0
  113. package/dist/nip57.d.ts +48 -0
  114. package/dist/nip57.d.ts.map +1 -0
  115. package/dist/nip57.js +140 -0
  116. package/dist/nip57.js.map +1 -0
  117. package/dist/nip58.d.ts +133 -0
  118. package/dist/nip58.d.ts.map +1 -0
  119. package/dist/nip58.js +275 -0
  120. package/dist/nip58.js.map +1 -0
  121. package/dist/nip59.js +1 -1
  122. package/dist/nip65.d.ts +28 -0
  123. package/dist/nip65.d.ts.map +1 -0
  124. package/dist/nip65.js +83 -0
  125. package/dist/nip65.js.map +1 -0
  126. package/dist/nip75.d.ts +43 -0
  127. package/dist/nip75.d.ts.map +1 -0
  128. package/dist/nip75.js +144 -0
  129. package/dist/nip75.js.map +1 -0
  130. package/dist/nip98.d.ts +24 -0
  131. package/dist/nip98.d.ts.map +1 -0
  132. package/dist/nip98.js +68 -0
  133. package/dist/nip98.js.map +1 -0
  134. package/dist/relay.d.ts +2 -0
  135. package/dist/relay.d.ts.map +1 -1
  136. package/dist/relay.js +20 -0
  137. package/dist/relay.js.map +1 -1
  138. package/package.json +35 -4
package/dist/nip57.js ADDED
@@ -0,0 +1,140 @@
1
+ import { finalizeEvent, verifyEvent } from './event.js';
2
+ export class ZapError extends Error {
3
+ code;
4
+ constructor(message, code = 'ZAP_ERROR') {
5
+ super(message);
6
+ this.name = 'ZapError';
7
+ this.code = code;
8
+ }
9
+ }
10
+ /**
11
+ * Create a kind 9734 zap request event template (unsigned).
12
+ */
13
+ export function createZapRequestEventTemplate(request) {
14
+ const tags = [
15
+ ['p', request.recipientPubkey],
16
+ ['amount', String(request.amount)],
17
+ ['relays', ...request.relays],
18
+ ];
19
+ if (request.eventId)
20
+ tags.push(['e', request.eventId]);
21
+ if (request.address)
22
+ tags.push(['a', request.address]);
23
+ if (request.lnurl)
24
+ tags.push(['lnurl', request.lnurl]);
25
+ return {
26
+ kind: 9734,
27
+ tags,
28
+ content: request.content ?? '',
29
+ created_at: Math.floor(Date.now() / 1000),
30
+ };
31
+ }
32
+ /**
33
+ * Create and sign a kind 9734 zap request event.
34
+ */
35
+ export function createZapRequestEvent(request, secretKey) {
36
+ return finalizeEvent(createZapRequestEventTemplate(request), secretKey);
37
+ }
38
+ /**
39
+ * Parse a kind 9735 zap receipt event.
40
+ */
41
+ export function parseZapReceipt(event) {
42
+ if (event.kind !== 9735)
43
+ throw new ZapError('Expected kind 9735 zap receipt', 'INVALID_KIND');
44
+ let recipientPubkey = '';
45
+ let senderPubkey;
46
+ let eventId;
47
+ let bolt11 = '';
48
+ let description = '';
49
+ let preimage;
50
+ let amount = 0;
51
+ for (const tag of event.tags) {
52
+ switch (tag[0]) {
53
+ case 'p':
54
+ recipientPubkey = tag[1];
55
+ break;
56
+ case 'bolt11':
57
+ bolt11 = tag[1];
58
+ break;
59
+ case 'description':
60
+ description = tag[1];
61
+ break;
62
+ case 'preimage':
63
+ preimage = tag[1];
64
+ break;
65
+ case 'e':
66
+ eventId = tag[1];
67
+ break;
68
+ }
69
+ }
70
+ // Extract sender pubkey from the description (zap request)
71
+ if (description) {
72
+ try {
73
+ const zapRequest = JSON.parse(description);
74
+ senderPubkey = zapRequest.pubkey;
75
+ const amountTag = zapRequest.tags.find(t => t[0] === 'amount');
76
+ if (amountTag)
77
+ amount = parseInt(amountTag[1], 10);
78
+ }
79
+ catch {
80
+ // Invalid description JSON
81
+ }
82
+ }
83
+ return { recipientPubkey, senderPubkey, eventId, amount, bolt11, description, preimage };
84
+ }
85
+ /**
86
+ * Validate a kind 9735 zap receipt event.
87
+ */
88
+ export function validateZapReceipt(receipt, request) {
89
+ if (receipt.kind !== 9735)
90
+ return false;
91
+ if (!verifyEvent(receipt))
92
+ return false;
93
+ const descriptionTag = receipt.tags.find(t => t[0] === 'description');
94
+ if (!descriptionTag?.[1])
95
+ return false;
96
+ let zapRequest;
97
+ try {
98
+ zapRequest = JSON.parse(descriptionTag[1]);
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ if (!verifyEvent(zapRequest))
104
+ return false;
105
+ if (zapRequest.kind !== 9734)
106
+ return false;
107
+ // If a specific request was provided, verify it matches
108
+ if (request) {
109
+ if (zapRequest.id !== request.id)
110
+ return false;
111
+ }
112
+ return true;
113
+ }
114
+ /**
115
+ * Fetch a zap invoice from an LNURL callback.
116
+ */
117
+ export async function fetchZapInvoice(opts) {
118
+ const separator = opts.lnurl.includes('?') ? '&' : '?';
119
+ const url = `${opts.lnurl}${separator}amount=${opts.amount}&nostr=${encodeURIComponent(JSON.stringify(opts.zapRequest))}`;
120
+ let json;
121
+ try {
122
+ const res = await fetch(url);
123
+ if (!res.ok)
124
+ throw new ZapError(`HTTP ${res.status} from LNURL callback`, 'FETCH_ERROR');
125
+ json = (await res.json());
126
+ }
127
+ catch (err) {
128
+ if (err instanceof ZapError)
129
+ throw err;
130
+ throw new ZapError(`Failed to fetch zap invoice: ${err.message}`, 'FETCH_ERROR');
131
+ }
132
+ if (json.status === 'ERROR') {
133
+ throw new ZapError(`LNURL error: ${json.reason || 'Unknown'}`, 'LNURL_ERROR');
134
+ }
135
+ const pr = json.pr;
136
+ if (!pr)
137
+ throw new ZapError('Missing invoice in LNURL response', 'MISSING_INVOICE');
138
+ return pr;
139
+ }
140
+ //# sourceMappingURL=nip57.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nip57.js","sourceRoot":"","sources":["../src/nip57.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import { type NostrEvent, type EventTemplate } from './event.js';
2
+ export type BadgeDefinition = {
3
+ identifier: string;
4
+ name?: string;
5
+ description?: string;
6
+ image?: string;
7
+ thumbs?: string[];
8
+ };
9
+ /**
10
+ * Create a kind 30009 badge definition event template.
11
+ */
12
+ export declare function createBadgeDefinitionTemplate(badge: BadgeDefinition): EventTemplate;
13
+ /**
14
+ * Create and sign a badge definition event.
15
+ */
16
+ export declare function createBadgeDefinitionEvent(badge: BadgeDefinition, secretKey: Uint8Array): NostrEvent;
17
+ /**
18
+ * Parse a kind 30009 badge definition event.
19
+ */
20
+ export declare function parseBadgeDefinition(event: NostrEvent): BadgeDefinition;
21
+ export type BadgeAward = {
22
+ badgeAddress: string;
23
+ recipients: string[];
24
+ };
25
+ /**
26
+ * Create a kind 8 badge award event template.
27
+ */
28
+ export declare function createBadgeAwardTemplate(award: BadgeAward): EventTemplate;
29
+ /**
30
+ * Create and sign a badge award event.
31
+ */
32
+ export declare function createBadgeAwardEvent(award: BadgeAward, secretKey: Uint8Array): NostrEvent;
33
+ /**
34
+ * Parse a kind 8 badge award event.
35
+ */
36
+ export declare function parseBadgeAward(event: NostrEvent): BadgeAward;
37
+ export type ProfileBadge = {
38
+ badgeAddress: string;
39
+ awardEventId: string;
40
+ };
41
+ /**
42
+ * Create a kind 30008 profile badges event template.
43
+ */
44
+ export declare function createProfileBadgesTemplate(badges: ProfileBadge[]): EventTemplate;
45
+ /**
46
+ * Create and sign a profile badges event.
47
+ */
48
+ export declare function createProfileBadgesEvent(badges: ProfileBadge[], secretKey: Uint8Array): NostrEvent;
49
+ /**
50
+ * Parse a kind 30008 profile badges event.
51
+ */
52
+ export declare function parseProfileBadges(event: NostrEvent): ProfileBadge[];
53
+ export type BadgeProofPow = {
54
+ type: 'pow';
55
+ difficulty: number;
56
+ nonce: string;
57
+ };
58
+ export type BadgeProofPayment = {
59
+ type: 'payment';
60
+ preimage: string;
61
+ invoice: string;
62
+ };
63
+ export type BadgeProofMembership = {
64
+ type: 'membership';
65
+ groupId: string;
66
+ membershipEventId: string;
67
+ };
68
+ export type BadgeProof = BadgeProofPow | BadgeProofPayment | BadgeProofMembership;
69
+ export type BadgeRequest = {
70
+ badgeAddress: string;
71
+ proof?: BadgeProof;
72
+ content?: string;
73
+ };
74
+ /**
75
+ * Create a badge request event template (kind 8433) with optional proof.
76
+ * This is a custom request flow — the requester publishes a request referencing
77
+ * a badge definition, along with a proof that qualifies them for the badge.
78
+ * The badge issuer can then verify the proof and award the badge.
79
+ */
80
+ export declare function createBadgeRequestTemplate(request: BadgeRequest): EventTemplate;
81
+ /**
82
+ * Parse a badge request event (kind 8433).
83
+ */
84
+ export declare function parseBadgeRequest(event: NostrEvent): BadgeRequest;
85
+ /**
86
+ * Extract a badge proof from event tags.
87
+ */
88
+ export declare function extractBadgeProof(event: NostrEvent): BadgeProof | undefined;
89
+ /**
90
+ * @deprecated Use `extractBadgeProof` instead.
91
+ */
92
+ export declare const verifyBadgeProof: typeof extractBadgeProof;
93
+ /**
94
+ * Validate that a badge award event references the correct badge definition.
95
+ */
96
+ export declare function validateBadgeAward(award: NostrEvent, definition: NostrEvent): boolean;
97
+ export type BadgeAcceptance = {
98
+ requestEventId: string;
99
+ badgeAddress: string;
100
+ recipientPubkey: string;
101
+ };
102
+ export type BadgeRejection = {
103
+ requestEventId: string;
104
+ badgeAddress: string;
105
+ reason?: string;
106
+ };
107
+ /**
108
+ * Create a badge acceptance event template (kind 8434).
109
+ * Published by the badge issuer to accept a badge request and implicitly award.
110
+ */
111
+ export declare function createBadgeAcceptanceTemplate(acceptance: BadgeAcceptance): EventTemplate;
112
+ /**
113
+ * Create and sign a badge acceptance event.
114
+ */
115
+ export declare function createBadgeAcceptanceEvent(acceptance: BadgeAcceptance, secretKey: Uint8Array): NostrEvent;
116
+ /**
117
+ * Create a badge rejection event template (kind 8435).
118
+ * Published by the badge issuer to reject a badge request.
119
+ */
120
+ export declare function createBadgeRejectionTemplate(rejection: BadgeRejection): EventTemplate;
121
+ /**
122
+ * Create and sign a badge rejection event.
123
+ */
124
+ export declare function createBadgeRejectionEvent(rejection: BadgeRejection, secretKey: Uint8Array): NostrEvent;
125
+ /**
126
+ * Build a badge address string (`30009:pubkey:identifier`) from a badge definition event.
127
+ */
128
+ export declare function buildBadgeAddress(definition: NostrEvent): string;
129
+ /**
130
+ * Check if a user has been awarded a specific badge by inspecting badge award events.
131
+ */
132
+ export declare function hasBeenAwarded(pubkey: string, badgeAwards: NostrEvent[]): boolean;
133
+ //# sourceMappingURL=nip58.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nip58.d.ts","sourceRoot":"","sources":["../src/nip58.ts"],"names":[],"mappings":"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"}
package/dist/nip58.js ADDED
@@ -0,0 +1,275 @@
1
+ import { finalizeEvent } from './event.js';
2
+ /**
3
+ * Create a kind 30009 badge definition event template.
4
+ */
5
+ export function createBadgeDefinitionTemplate(badge) {
6
+ const tags = [['d', badge.identifier]];
7
+ if (badge.name)
8
+ tags.push(['name', badge.name]);
9
+ if (badge.description)
10
+ tags.push(['description', badge.description]);
11
+ if (badge.image)
12
+ tags.push(['image', badge.image]);
13
+ if (badge.thumbs) {
14
+ for (const thumb of badge.thumbs)
15
+ tags.push(['thumb', thumb]);
16
+ }
17
+ return {
18
+ kind: 30009,
19
+ tags,
20
+ content: '',
21
+ created_at: Math.floor(Date.now() / 1000),
22
+ };
23
+ }
24
+ /**
25
+ * Create and sign a badge definition event.
26
+ */
27
+ export function createBadgeDefinitionEvent(badge, secretKey) {
28
+ return finalizeEvent(createBadgeDefinitionTemplate(badge), secretKey);
29
+ }
30
+ /**
31
+ * Parse a kind 30009 badge definition event.
32
+ */
33
+ export function parseBadgeDefinition(event) {
34
+ const result = { identifier: '' };
35
+ const thumbs = [];
36
+ for (const tag of event.tags) {
37
+ switch (tag[0]) {
38
+ case 'd':
39
+ result.identifier = tag[1] ?? '';
40
+ break;
41
+ case 'name':
42
+ result.name = tag[1];
43
+ break;
44
+ case 'description':
45
+ result.description = tag[1];
46
+ break;
47
+ case 'image':
48
+ result.image = tag[1];
49
+ break;
50
+ case 'thumb':
51
+ if (tag[1])
52
+ thumbs.push(tag[1]);
53
+ break;
54
+ }
55
+ }
56
+ if (thumbs.length > 0)
57
+ result.thumbs = thumbs;
58
+ return result;
59
+ }
60
+ /**
61
+ * Create a kind 8 badge award event template.
62
+ */
63
+ export function createBadgeAwardTemplate(award) {
64
+ const tags = [['a', award.badgeAddress]];
65
+ for (const recipient of award.recipients) {
66
+ tags.push(['p', recipient]);
67
+ }
68
+ return {
69
+ kind: 8,
70
+ tags,
71
+ content: '',
72
+ created_at: Math.floor(Date.now() / 1000),
73
+ };
74
+ }
75
+ /**
76
+ * Create and sign a badge award event.
77
+ */
78
+ export function createBadgeAwardEvent(award, secretKey) {
79
+ return finalizeEvent(createBadgeAwardTemplate(award), secretKey);
80
+ }
81
+ /**
82
+ * Parse a kind 8 badge award event.
83
+ */
84
+ export function parseBadgeAward(event) {
85
+ let badgeAddress = '';
86
+ const recipients = [];
87
+ for (const tag of event.tags) {
88
+ if (tag[0] === 'a')
89
+ badgeAddress = tag[1];
90
+ else if (tag[0] === 'p')
91
+ recipients.push(tag[1]);
92
+ }
93
+ return { badgeAddress, recipients };
94
+ }
95
+ /**
96
+ * Create a kind 30008 profile badges event template.
97
+ */
98
+ export function createProfileBadgesTemplate(badges) {
99
+ const tags = [['d', 'profile_badges']];
100
+ for (const badge of badges) {
101
+ tags.push(['a', badge.badgeAddress]);
102
+ tags.push(['e', badge.awardEventId]);
103
+ }
104
+ return {
105
+ kind: 30008,
106
+ tags,
107
+ content: '',
108
+ created_at: Math.floor(Date.now() / 1000),
109
+ };
110
+ }
111
+ /**
112
+ * Create and sign a profile badges event.
113
+ */
114
+ export function createProfileBadgesEvent(badges, secretKey) {
115
+ return finalizeEvent(createProfileBadgesTemplate(badges), secretKey);
116
+ }
117
+ /**
118
+ * Parse a kind 30008 profile badges event.
119
+ */
120
+ export function parseProfileBadges(event) {
121
+ const badges = [];
122
+ // Tags come in pairs: ['a', address], ['e', awardId]
123
+ const tags = event.tags.filter(t => t[0] === 'a' || t[0] === 'e');
124
+ let currentAddress;
125
+ for (const tag of tags) {
126
+ if (tag[0] === 'a') {
127
+ currentAddress = tag[1];
128
+ }
129
+ else if (tag[0] === 'e' && currentAddress) {
130
+ badges.push({ badgeAddress: currentAddress, awardEventId: tag[1] });
131
+ currentAddress = undefined;
132
+ }
133
+ }
134
+ return badges;
135
+ }
136
+ /**
137
+ * Create a badge request event template (kind 8433) with optional proof.
138
+ * This is a custom request flow — the requester publishes a request referencing
139
+ * a badge definition, along with a proof that qualifies them for the badge.
140
+ * The badge issuer can then verify the proof and award the badge.
141
+ */
142
+ export function createBadgeRequestTemplate(request) {
143
+ const tags = [['a', request.badgeAddress]];
144
+ if (request.proof) {
145
+ switch (request.proof.type) {
146
+ case 'pow':
147
+ tags.push(['proof', 'pow', String(request.proof.difficulty), request.proof.nonce]);
148
+ break;
149
+ case 'payment':
150
+ tags.push(['proof', 'payment', request.proof.preimage, request.proof.invoice]);
151
+ break;
152
+ case 'membership':
153
+ tags.push(['proof', 'membership', request.proof.groupId, request.proof.membershipEventId]);
154
+ break;
155
+ }
156
+ }
157
+ return {
158
+ kind: 8433,
159
+ tags,
160
+ content: request.content ?? '',
161
+ created_at: Math.floor(Date.now() / 1000),
162
+ };
163
+ }
164
+ /**
165
+ * Parse a badge request event (kind 8433).
166
+ */
167
+ export function parseBadgeRequest(event) {
168
+ const result = { badgeAddress: '' };
169
+ for (const tag of event.tags) {
170
+ if (tag[0] === 'a')
171
+ result.badgeAddress = tag[1];
172
+ }
173
+ const proof = extractBadgeProof(event);
174
+ if (proof)
175
+ result.proof = proof;
176
+ if (event.content)
177
+ result.content = event.content;
178
+ return result;
179
+ }
180
+ /**
181
+ * Extract a badge proof from event tags.
182
+ */
183
+ export function extractBadgeProof(event) {
184
+ const proofTag = event.tags.find(t => t[0] === 'proof');
185
+ if (!proofTag)
186
+ return undefined;
187
+ switch (proofTag[1]) {
188
+ case 'pow':
189
+ return { type: 'pow', difficulty: parseInt(proofTag[2], 10), nonce: proofTag[3] };
190
+ case 'payment':
191
+ return { type: 'payment', preimage: proofTag[2], invoice: proofTag[3] };
192
+ case 'membership':
193
+ return { type: 'membership', groupId: proofTag[2], membershipEventId: proofTag[3] };
194
+ default:
195
+ return undefined;
196
+ }
197
+ }
198
+ /**
199
+ * @deprecated Use `extractBadgeProof` instead.
200
+ */
201
+ export const verifyBadgeProof = extractBadgeProof;
202
+ /**
203
+ * Validate that a badge award event references the correct badge definition.
204
+ */
205
+ export function validateBadgeAward(award, definition) {
206
+ if (award.kind !== 8 || definition.kind !== 30009)
207
+ return false;
208
+ const awardAddress = award.tags.find(t => t[0] === 'a')?.[1];
209
+ if (!awardAddress)
210
+ return false;
211
+ const defIdentifier = definition.tags.find(t => t[0] === 'd')?.[1];
212
+ if (!defIdentifier)
213
+ return false;
214
+ // Address format: kind:pubkey:identifier
215
+ const expectedAddress = `30009:${definition.pubkey}:${defIdentifier}`;
216
+ return awardAddress === expectedAddress;
217
+ }
218
+ /**
219
+ * Create a badge acceptance event template (kind 8434).
220
+ * Published by the badge issuer to accept a badge request and implicitly award.
221
+ */
222
+ export function createBadgeAcceptanceTemplate(acceptance) {
223
+ return {
224
+ kind: 8434,
225
+ tags: [
226
+ ['e', acceptance.requestEventId],
227
+ ['a', acceptance.badgeAddress],
228
+ ['p', acceptance.recipientPubkey],
229
+ ],
230
+ content: '',
231
+ created_at: Math.floor(Date.now() / 1000),
232
+ };
233
+ }
234
+ /**
235
+ * Create and sign a badge acceptance event.
236
+ */
237
+ export function createBadgeAcceptanceEvent(acceptance, secretKey) {
238
+ return finalizeEvent(createBadgeAcceptanceTemplate(acceptance), secretKey);
239
+ }
240
+ /**
241
+ * Create a badge rejection event template (kind 8435).
242
+ * Published by the badge issuer to reject a badge request.
243
+ */
244
+ export function createBadgeRejectionTemplate(rejection) {
245
+ return {
246
+ kind: 8435,
247
+ tags: [
248
+ ['e', rejection.requestEventId],
249
+ ['a', rejection.badgeAddress],
250
+ ],
251
+ content: rejection.reason ?? '',
252
+ created_at: Math.floor(Date.now() / 1000),
253
+ };
254
+ }
255
+ /**
256
+ * Create and sign a badge rejection event.
257
+ */
258
+ export function createBadgeRejectionEvent(rejection, secretKey) {
259
+ return finalizeEvent(createBadgeRejectionTemplate(rejection), secretKey);
260
+ }
261
+ // ── Badge Utility: Build address from definition ───────────────────────
262
+ /**
263
+ * Build a badge address string (`30009:pubkey:identifier`) from a badge definition event.
264
+ */
265
+ export function buildBadgeAddress(definition) {
266
+ const identifier = definition.tags.find(t => t[0] === 'd')?.[1] ?? '';
267
+ return `30009:${definition.pubkey}:${identifier}`;
268
+ }
269
+ /**
270
+ * Check if a user has been awarded a specific badge by inspecting badge award events.
271
+ */
272
+ export function hasBeenAwarded(pubkey, badgeAwards) {
273
+ return badgeAwards.some(award => award.kind === 8 && award.tags.some(t => t[0] === 'p' && t[1] === pubkey));
274
+ }
275
+ //# sourceMappingURL=nip58.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nip58.js","sourceRoot":"","sources":["../src/nip58.ts"],"names":[],"mappings":"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"}
package/dist/nip59.js CHANGED
@@ -62,7 +62,7 @@ export function unwrap(wrap, recipientSecretKey) {
62
62
  const rumor = JSON.parse(rumorJson);
63
63
  // Verify pubkey consistency: seal.pubkey must match rumor.pubkey
64
64
  if (seal.pubkey !== rumor.pubkey) {
65
- throw new Error('Seal pubkey does not match rumor pubkey possible impersonation');
65
+ throw new Error('Seal pubkey does not match rumor pubkey - possible impersonation');
66
66
  }
67
67
  return rumor;
68
68
  }
@@ -0,0 +1,28 @@
1
+ import { type NostrEvent, type EventTemplate } from './event.js';
2
+ export type RelayReadWrite = {
3
+ url: string;
4
+ read: boolean;
5
+ write: boolean;
6
+ };
7
+ /**
8
+ * Parse a kind 10002 relay list event into structured relay entries.
9
+ */
10
+ export declare function parseRelayList(event: NostrEvent): RelayReadWrite[];
11
+ /**
12
+ * Create a kind 10002 relay list event template (unsigned).
13
+ * Sign with `finalizeEvent()` or pass to a Signer.
14
+ */
15
+ export declare function createRelayListEventTemplate(relays: RelayReadWrite[]): EventTemplate;
16
+ /**
17
+ * Create and sign a kind 10002 relay list event.
18
+ */
19
+ export declare function createRelayListEvent(relays: RelayReadWrite[], secretKey: Uint8Array): NostrEvent;
20
+ /**
21
+ * Get only read relays from a parsed relay list.
22
+ */
23
+ export declare function getReadRelays(relays: RelayReadWrite[]): string[];
24
+ /**
25
+ * Get only write relays from a parsed relay list.
26
+ */
27
+ export declare function getWriteRelays(relays: RelayReadWrite[]): string[];
28
+ //# sourceMappingURL=nip65.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nip65.d.ts","sourceRoot":"","sources":["../src/nip65.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAQ/E,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,EAAE,CA4BlE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,aAAa,CAwBpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAEhG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAEhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAEjE"}