@unicitylabs/nostr-js-sdk 0.0.1
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/README.md +290 -0
- package/dist/browser/index.js +8444 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/index.min.js +12 -0
- package/dist/browser/index.min.js.map +1 -0
- package/dist/browser/index.umd.js +8524 -0
- package/dist/browser/index.umd.js.map +1 -0
- package/dist/browser/index.umd.min.js +12 -0
- package/dist/browser/index.umd.min.js.map +1 -0
- package/dist/cjs/NostrKeyManager.js +265 -0
- package/dist/cjs/NostrKeyManager.js.map +1 -0
- package/dist/cjs/client/NostrClient.js +518 -0
- package/dist/cjs/client/NostrClient.js.map +1 -0
- package/dist/cjs/client/NostrEventListener.js +31 -0
- package/dist/cjs/client/NostrEventListener.js.map +1 -0
- package/dist/cjs/client/WebSocketAdapter.js +90 -0
- package/dist/cjs/client/WebSocketAdapter.js.map +1 -0
- package/dist/cjs/client/index.js +18 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/crypto/bech32.js +201 -0
- package/dist/cjs/crypto/bech32.js.map +1 -0
- package/dist/cjs/crypto/index.js +49 -0
- package/dist/cjs/crypto/index.js.map +1 -0
- package/dist/cjs/crypto/nip04.js +327 -0
- package/dist/cjs/crypto/nip04.js.map +1 -0
- package/dist/cjs/crypto/schnorr.js +101 -0
- package/dist/cjs/crypto/schnorr.js.map +1 -0
- package/dist/cjs/index.js +57 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/nametag/NametagBinding.js +196 -0
- package/dist/cjs/nametag/NametagBinding.js.map +1 -0
- package/dist/cjs/nametag/NametagUtils.js +156 -0
- package/dist/cjs/nametag/NametagUtils.js.map +1 -0
- package/dist/cjs/nametag/index.js +47 -0
- package/dist/cjs/nametag/index.js.map +1 -0
- package/dist/cjs/protocol/Event.js +209 -0
- package/dist/cjs/protocol/Event.js.map +1 -0
- package/dist/cjs/protocol/EventKinds.js +126 -0
- package/dist/cjs/protocol/EventKinds.js.map +1 -0
- package/dist/cjs/protocol/Filter.js +202 -0
- package/dist/cjs/protocol/Filter.js.map +1 -0
- package/dist/cjs/protocol/index.js +50 -0
- package/dist/cjs/protocol/index.js.map +1 -0
- package/dist/cjs/token/TokenTransferProtocol.js +196 -0
- package/dist/cjs/token/TokenTransferProtocol.js.map +1 -0
- package/dist/cjs/token/index.js +45 -0
- package/dist/cjs/token/index.js.map +1 -0
- package/dist/esm/NostrKeyManager.js +228 -0
- package/dist/esm/NostrKeyManager.js.map +1 -0
- package/dist/esm/client/NostrClient.js +481 -0
- package/dist/esm/client/NostrClient.js.map +1 -0
- package/dist/esm/client/NostrEventListener.js +27 -0
- package/dist/esm/client/NostrEventListener.js.map +1 -0
- package/dist/esm/client/WebSocketAdapter.js +52 -0
- package/dist/esm/client/WebSocketAdapter.js.map +1 -0
- package/dist/esm/client/index.js +7 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/crypto/bech32.js +193 -0
- package/dist/esm/crypto/bech32.js.map +1 -0
- package/dist/esm/crypto/index.js +10 -0
- package/dist/esm/crypto/index.js.map +1 -0
- package/dist/esm/crypto/nip04.js +286 -0
- package/dist/esm/crypto/nip04.js.map +1 -0
- package/dist/esm/crypto/schnorr.js +93 -0
- package/dist/esm/crypto/schnorr.js.map +1 -0
- package/dist/esm/index.js +32 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/nametag/NametagBinding.js +155 -0
- package/dist/esm/nametag/NametagBinding.js.map +1 -0
- package/dist/esm/nametag/NametagUtils.js +149 -0
- package/dist/esm/nametag/NametagUtils.js.map +1 -0
- package/dist/esm/nametag/index.js +8 -0
- package/dist/esm/nametag/index.js.map +1 -0
- package/dist/esm/protocol/Event.js +172 -0
- package/dist/esm/protocol/Event.js.map +1 -0
- package/dist/esm/protocol/EventKinds.js +119 -0
- package/dist/esm/protocol/EventKinds.js.map +1 -0
- package/dist/esm/protocol/Filter.js +197 -0
- package/dist/esm/protocol/Filter.js.map +1 -0
- package/dist/esm/protocol/index.js +8 -0
- package/dist/esm/protocol/index.js.map +1 -0
- package/dist/esm/token/TokenTransferProtocol.js +154 -0
- package/dist/esm/token/TokenTransferProtocol.js.map +1 -0
- package/dist/esm/token/index.js +6 -0
- package/dist/esm/token/index.js.map +1 -0
- package/dist/types/NostrKeyManager.d.ts +150 -0
- package/dist/types/NostrKeyManager.d.ts.map +1 -0
- package/dist/types/client/NostrClient.d.ts +154 -0
- package/dist/types/client/NostrClient.d.ts.map +1 -0
- package/dist/types/client/NostrEventListener.d.ts +40 -0
- package/dist/types/client/NostrEventListener.d.ts.map +1 -0
- package/dist/types/client/WebSocketAdapter.d.ts +55 -0
- package/dist/types/client/WebSocketAdapter.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +9 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/crypto/bech32.d.ts +51 -0
- package/dist/types/crypto/bech32.d.ts.map +1 -0
- package/dist/types/crypto/index.d.ts +10 -0
- package/dist/types/crypto/index.d.ts.map +1 -0
- package/dist/types/crypto/nip04.d.ts +56 -0
- package/dist/types/crypto/nip04.d.ts.map +1 -0
- package/dist/types/crypto/schnorr.d.ts +47 -0
- package/dist/types/crypto/schnorr.d.ts.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/nametag/NametagBinding.d.ts +68 -0
- package/dist/types/nametag/NametagBinding.d.ts.map +1 -0
- package/dist/types/nametag/NametagUtils.d.ts +44 -0
- package/dist/types/nametag/NametagUtils.d.ts.map +1 -0
- package/dist/types/nametag/index.d.ts +8 -0
- package/dist/types/nametag/index.d.ts.map +1 -0
- package/dist/types/protocol/Event.d.ts +112 -0
- package/dist/types/protocol/Event.d.ts.map +1 -0
- package/dist/types/protocol/EventKinds.d.ts +62 -0
- package/dist/types/protocol/EventKinds.d.ts.map +1 -0
- package/dist/types/protocol/Filter.d.ts +146 -0
- package/dist/types/protocol/Filter.d.ts.map +1 -0
- package/dist/types/protocol/index.d.ts +10 -0
- package/dist/types/protocol/index.d.ts.map +1 -0
- package/dist/types/token/TokenTransferProtocol.d.ts +67 -0
- package/dist/types/token/TokenTransferProtocol.d.ts.map +1 -0
- package/dist/types/token/index.d.ts +6 -0
- package/dist/types/token/index.d.ts.map +1 -0
- package/package.json +89 -0
package/README.md
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# Unicity Nostr SDK
|
|
2
|
+
|
|
3
|
+
A TypeScript SDK for Nostr protocol with Unicity extensions. Works in both Node.js and browser environments.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **BIP-340 Schnorr Signatures** - Full support for secp256k1 Schnorr signatures
|
|
8
|
+
- **NIP-04 Encryption** - AES-256-CBC encryption with ECDH key agreement
|
|
9
|
+
- **GZIP Compression** - Automatic compression for large messages (>1KB)
|
|
10
|
+
- **Multi-Relay Support** - Connect to multiple relays with automatic reconnection
|
|
11
|
+
- **Token Transfers** - Encrypted Unicity token transfers over Nostr
|
|
12
|
+
- **Nametag Bindings** - Privacy-preserving identity bindings (phone numbers, usernames)
|
|
13
|
+
- **Cross-Platform** - Works in Node.js 18+ and modern browsers
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @unicitylabs/nostr-sdk
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### Key Management
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { NostrKeyManager } from '@unicitylabs/nostr-sdk';
|
|
27
|
+
|
|
28
|
+
// Generate new keys
|
|
29
|
+
const keyManager = NostrKeyManager.generate();
|
|
30
|
+
|
|
31
|
+
// Or import existing keys
|
|
32
|
+
const keyManager = NostrKeyManager.fromPrivateKeyHex('...');
|
|
33
|
+
const keyManager = NostrKeyManager.fromNsec('nsec1...');
|
|
34
|
+
|
|
35
|
+
// Export keys
|
|
36
|
+
console.log(keyManager.getNpub()); // npub1...
|
|
37
|
+
console.log(keyManager.getNsec()); // nsec1...
|
|
38
|
+
console.log(keyManager.getPublicKeyHex());
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Connecting to Relays
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
import { NostrClient, NostrKeyManager } from '@unicitylabs/nostr-sdk';
|
|
45
|
+
|
|
46
|
+
const keyManager = NostrKeyManager.generate();
|
|
47
|
+
const client = new NostrClient(keyManager);
|
|
48
|
+
|
|
49
|
+
// Connect to relays
|
|
50
|
+
await client.connect(
|
|
51
|
+
'wss://relay.damus.io',
|
|
52
|
+
'wss://nos.lol'
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// Check connection status
|
|
56
|
+
console.log(client.isConnected());
|
|
57
|
+
console.log(client.getConnectedRelays());
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Publishing Events
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { Event, EventKinds } from '@unicitylabs/nostr-sdk';
|
|
64
|
+
|
|
65
|
+
// Create and publish a text note
|
|
66
|
+
const event = Event.create(keyManager, {
|
|
67
|
+
kind: EventKinds.TEXT_NOTE,
|
|
68
|
+
tags: [['t', 'unicity']],
|
|
69
|
+
content: 'Hello, Nostr!',
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const eventId = await client.publishEvent(event);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Encrypted Direct Messages
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Send encrypted DM
|
|
79
|
+
const recipientPubkey = '...';
|
|
80
|
+
await client.publishEncryptedMessage(recipientPubkey, 'Secret message');
|
|
81
|
+
|
|
82
|
+
// Or encrypt manually
|
|
83
|
+
const encrypted = await keyManager.encryptHex('Hello!', recipientPubkey);
|
|
84
|
+
const decrypted = await keyManager.decryptHex(encrypted, senderPubkey);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Subscriptions
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
import { Filter } from '@unicitylabs/nostr-sdk';
|
|
91
|
+
|
|
92
|
+
// Create a filter
|
|
93
|
+
const filter = Filter.builder()
|
|
94
|
+
.kinds(EventKinds.TEXT_NOTE)
|
|
95
|
+
.authors('pubkey1', 'pubkey2')
|
|
96
|
+
.limit(10)
|
|
97
|
+
.build();
|
|
98
|
+
|
|
99
|
+
// Subscribe
|
|
100
|
+
const subId = client.subscribe(filter, {
|
|
101
|
+
onEvent: (event) => {
|
|
102
|
+
console.log('Received event:', event.content);
|
|
103
|
+
},
|
|
104
|
+
onEndOfStoredEvents: (subId) => {
|
|
105
|
+
console.log('All stored events received');
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Unsubscribe
|
|
110
|
+
client.unsubscribe(subId);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Token Transfers
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { TokenTransferProtocol } from '@unicitylabs/nostr-sdk';
|
|
117
|
+
|
|
118
|
+
// Create token transfer event
|
|
119
|
+
const event = await TokenTransferProtocol.createTokenTransferEvent(
|
|
120
|
+
keyManager,
|
|
121
|
+
recipientPubkey,
|
|
122
|
+
JSON.stringify({ tokenId: '...', amount: 100 }),
|
|
123
|
+
100n, // amount (optional metadata)
|
|
124
|
+
'UNIT' // symbol (optional metadata)
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
await client.publishEvent(event);
|
|
128
|
+
|
|
129
|
+
// Parse received token transfer
|
|
130
|
+
const tokenJson = await TokenTransferProtocol.parseTokenTransfer(event, keyManager);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Nametag Bindings
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { NametagBinding, NametagUtils } from '@unicitylabs/nostr-sdk';
|
|
137
|
+
|
|
138
|
+
// Hash a nametag (privacy-preserving)
|
|
139
|
+
const hash = NametagUtils.hashNametag('+14155551234', 'US');
|
|
140
|
+
|
|
141
|
+
// Create binding event
|
|
142
|
+
const event = await NametagBinding.createBindingEvent(
|
|
143
|
+
keyManager,
|
|
144
|
+
'+14155551234',
|
|
145
|
+
'unicity_address_...'
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
await client.publishEvent(event);
|
|
149
|
+
|
|
150
|
+
// Query pubkey by nametag
|
|
151
|
+
const pubkey = await client.queryPubkeyByNametag('+14155551234');
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Token Transfer Format
|
|
155
|
+
|
|
156
|
+
Token transfers use Nostr event kind 31113 with NIP-04 encryption.
|
|
157
|
+
|
|
158
|
+
### Event Structure
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"id": "<sha256_event_hash>",
|
|
163
|
+
"pubkey": "<sender_pubkey_hex>",
|
|
164
|
+
"created_at": 1234567890,
|
|
165
|
+
"kind": 31113,
|
|
166
|
+
"tags": [
|
|
167
|
+
["p", "<recipient_pubkey_hex>"],
|
|
168
|
+
["type", "token_transfer"],
|
|
169
|
+
["amount", "1000000000000000000"],
|
|
170
|
+
["symbol", "UNIT"]
|
|
171
|
+
],
|
|
172
|
+
"content": "<NIP-04 encrypted content>",
|
|
173
|
+
"sig": "<schnorr_signature_hex>"
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Tags
|
|
178
|
+
|
|
179
|
+
| Tag | Required | Description |
|
|
180
|
+
|-----|----------|-------------|
|
|
181
|
+
| `p` | Yes | Recipient's public key (hex) |
|
|
182
|
+
| `type` | Yes | Always `"token_transfer"` |
|
|
183
|
+
| `amount` | No | Transfer amount (metadata for filtering) |
|
|
184
|
+
| `symbol` | No | Token symbol (metadata for filtering) |
|
|
185
|
+
|
|
186
|
+
### Encrypted Content
|
|
187
|
+
|
|
188
|
+
The `content` field is NIP-04 encrypted. When decrypted, it contains:
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
token_transfer:<token_transfer_package_json>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The **Token Transfer Package** is a JSON structure containing the source token and the transaction, passed to `createTokenTransferEvent()`.
|
|
195
|
+
|
|
196
|
+
For payloads >1KB, GZIP compression is automatically applied before encryption:
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
gz:<base64_ciphertext>?iv=<base64_iv>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Helper Functions
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// Check if event is a token transfer
|
|
206
|
+
TokenTransferProtocol.isTokenTransfer(event); // boolean
|
|
207
|
+
|
|
208
|
+
// Get metadata from tags
|
|
209
|
+
TokenTransferProtocol.getAmount(event); // bigint | undefined
|
|
210
|
+
TokenTransferProtocol.getSymbol(event); // string | undefined
|
|
211
|
+
TokenTransferProtocol.getRecipient(event); // string | undefined
|
|
212
|
+
TokenTransferProtocol.getSender(event); // string
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Browser Usage
|
|
216
|
+
|
|
217
|
+
### ES Modules
|
|
218
|
+
|
|
219
|
+
```html
|
|
220
|
+
<script type="module">
|
|
221
|
+
import { NostrKeyManager, NostrClient } from '@unicitylabs/nostr-sdk';
|
|
222
|
+
|
|
223
|
+
const keyManager = NostrKeyManager.generate();
|
|
224
|
+
console.log(keyManager.getNpub());
|
|
225
|
+
</script>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### UMD (Script Tag)
|
|
229
|
+
|
|
230
|
+
```html
|
|
231
|
+
<script src="node_modules/@unicitylabs/nostr-sdk/dist/browser/index.umd.min.js"></script>
|
|
232
|
+
<script>
|
|
233
|
+
const { NostrKeyManager, NostrClient } = UnicityNostr;
|
|
234
|
+
|
|
235
|
+
const keyManager = NostrKeyManager.generate();
|
|
236
|
+
console.log(keyManager.getNpub());
|
|
237
|
+
</script>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## API Reference
|
|
241
|
+
|
|
242
|
+
### Classes
|
|
243
|
+
|
|
244
|
+
- **NostrKeyManager** - Key pair management, signing, encryption
|
|
245
|
+
- **NostrClient** - Relay connections, event publishing, subscriptions
|
|
246
|
+
- **Event** - Nostr event creation, signing, verification
|
|
247
|
+
- **Filter** - Subscription filter building
|
|
248
|
+
|
|
249
|
+
### Modules
|
|
250
|
+
|
|
251
|
+
- **Bech32** - Bech32 encoding/decoding (npub, nsec)
|
|
252
|
+
- **SchnorrSigner** - BIP-340 Schnorr signatures
|
|
253
|
+
- **NIP04** - NIP-04 encryption/decryption
|
|
254
|
+
- **EventKinds** - Event kind constants
|
|
255
|
+
- **NametagUtils** - Nametag normalization and hashing
|
|
256
|
+
- **NametagBinding** - Nametag binding event creation
|
|
257
|
+
- **TokenTransferProtocol** - Token transfer protocol
|
|
258
|
+
|
|
259
|
+
## Event Kinds
|
|
260
|
+
|
|
261
|
+
| Kind | Name | Description |
|
|
262
|
+
|------|------|-------------|
|
|
263
|
+
| 0 | PROFILE | User profile metadata |
|
|
264
|
+
| 1 | TEXT_NOTE | Short text note |
|
|
265
|
+
| 4 | ENCRYPTED_DM | Encrypted direct message |
|
|
266
|
+
| 30078 | APP_DATA | Application-specific data |
|
|
267
|
+
| 31113 | TOKEN_TRANSFER | Unicity token transfer |
|
|
268
|
+
|
|
269
|
+
## Development
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# Install dependencies
|
|
273
|
+
npm install
|
|
274
|
+
|
|
275
|
+
# Type checking
|
|
276
|
+
npm run build:check
|
|
277
|
+
|
|
278
|
+
# Run tests
|
|
279
|
+
npm test
|
|
280
|
+
|
|
281
|
+
# Build all bundles
|
|
282
|
+
npm run build
|
|
283
|
+
|
|
284
|
+
# Lint
|
|
285
|
+
npm run lint
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## License
|
|
289
|
+
|
|
290
|
+
MIT
|