@1sat/wallet 0.0.27 → 0.0.29

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.
@@ -1,615 +0,0 @@
1
- /**
2
- * AddressSyncManager - Syncs external transactions to the BRC-100 wallet.
3
- *
4
- * Split into two components for Chrome extension compatibility:
5
- * - AddressSyncFetcher: Calls SSE endpoint and enqueues txids (runs in UI context)
6
- * - AddressSyncProcessor: Processes queue and internalizes outputs (runs in service worker)
7
- *
8
- * This separation is necessary because EventSource (SSE) doesn't work reliably
9
- * in Chrome extension service workers due to their ephemeral nature.
10
- */
11
- import { Beef, Transaction } from '@bsv/sdk';
12
- import { Bsv21Indexer } from '../indexers/Bsv21Indexer';
13
- import { FundIndexer } from '../indexers/FundIndexer';
14
- import { InscriptionIndexer } from '../indexers/InscriptionIndexer';
15
- import { MapIndexer } from '../indexers/MapIndexer';
16
- import { OpNSIndexer } from '../indexers/OpNSIndexer';
17
- import { OriginIndexer } from '../indexers/OriginIndexer';
18
- import { Outpoint } from '../indexers/Outpoint';
19
- import { SigmaIndexer } from '../indexers/SigmaIndexer';
20
- import { BRC29_PROTOCOL_ID, } from './AddressManager';
21
- /** Reorg-safe depth - only update lastQueuedScore for outputs this many blocks deep */
22
- const REORG_SAFE_DEPTH = 6;
23
- /** Maximum score for a mined transaction. Scores above this are mempool timestamps. */
24
- const MAX_MINED_SCORE = 10_000_000;
25
- /** Default batch size for queue processing */
26
- const DEFAULT_BATCH_SIZE = 20;
27
- /**
28
- * AddressSyncFetcher - Fetches outputs via SSE and enqueues them.
29
- *
30
- * Run this from the UI context (popup) when the wallet opens.
31
- * It will fetch all new outputs since the last sync and add them to the queue.
32
- */
33
- export class AddressSyncFetcher {
34
- services;
35
- syncQueue;
36
- addressManager;
37
- unsubscribeStream = null;
38
- listeners = new Map();
39
- constructor(options) {
40
- this.services = options.services;
41
- this.syncQueue = options.syncQueue;
42
- this.addressManager = options.addressManager;
43
- }
44
- on(event, listener) {
45
- if (!this.listeners.has(event)) {
46
- this.listeners.set(event, new Set());
47
- }
48
- this.listeners
49
- .get(event)
50
- ?.add(listener);
51
- }
52
- off(event, listener) {
53
- this.listeners
54
- .get(event)
55
- ?.delete(listener);
56
- }
57
- emit(event, data) {
58
- for (const listener of this.listeners.get(event) ?? []) {
59
- listener(data);
60
- }
61
- }
62
- /**
63
- * Fetch new outputs via SSE and enqueue them.
64
- * Returns when the stream completes (all historical data fetched).
65
- */
66
- async fetch(currentHeight) {
67
- if (this.unsubscribeStream) {
68
- console.warn('Fetch already running');
69
- return 0;
70
- }
71
- const addresses = this.addressManager.getAddresses();
72
- if (addresses.length === 0) {
73
- console.warn('No addresses to fetch');
74
- return 0;
75
- }
76
- this.emit('fetch:start', { addresses });
77
- // Get last score for resumption
78
- const state = await this.syncQueue.getState();
79
- const fromScore = state.lastQueuedScore;
80
- let queuedCount = 0;
81
- return new Promise((resolve, reject) => {
82
- this.unsubscribeStream = this.services.owner.sync(addresses, async (output) => {
83
- await this.handleSyncOutput(output, currentHeight);
84
- queuedCount++;
85
- this.emit('fetch:queued', {
86
- outpoint: output.outpoint,
87
- score: output.score,
88
- });
89
- }, fromScore, () => {
90
- // Stream complete
91
- this.unsubscribeStream = null;
92
- this.emit('fetch:complete', { queuedCount });
93
- resolve(queuedCount);
94
- }, (error) => {
95
- this.unsubscribeStream = null;
96
- this.emit('fetch:error', { message: error.message });
97
- reject(error);
98
- });
99
- });
100
- }
101
- /**
102
- * Stop the SSE stream if running.
103
- */
104
- stop() {
105
- if (this.unsubscribeStream) {
106
- this.unsubscribeStream();
107
- this.unsubscribeStream = null;
108
- }
109
- }
110
- async handleSyncOutput(output, currentHeight) {
111
- // Only enqueue mined transactions (score encodes blockHeight.blockIndex).
112
- // Mempool transactions have a unix timestamp score (> 1 billion).
113
- if (output.score >= MAX_MINED_SCORE) {
114
- return;
115
- }
116
- await this.syncQueue.enqueue([
117
- {
118
- outpoint: output.outpoint,
119
- score: output.score,
120
- spendTxid: output.spendTxid,
121
- },
122
- ]);
123
- // Update lastQueuedScore only for reorg-safe outputs
124
- const outputHeight = Math.floor(output.score);
125
- if (currentHeight - outputHeight >= REORG_SAFE_DEPTH) {
126
- await this.syncQueue.setState({ lastQueuedScore: output.score });
127
- }
128
- }
129
- }
130
- /**
131
- * AddressSyncProcessor - Processes the sync queue and internalizes outputs.
132
- *
133
- * Run this from the service worker. It will process items from the queue
134
- * until the queue is empty or stop() is called.
135
- */
136
- export class AddressSyncProcessor {
137
- wallet;
138
- services;
139
- syncQueue;
140
- addressManager;
141
- network;
142
- batchSize;
143
- indexers;
144
- processorRunning = false;
145
- stopRequested = false;
146
- listeners = new Map();
147
- constructor(options) {
148
- this.wallet = options.wallet;
149
- this.services = options.services;
150
- this.syncQueue = options.syncQueue;
151
- this.addressManager = options.addressManager;
152
- this.network = options.network;
153
- this.batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;
154
- // Build owners set from address manager
155
- const owners = new Set(this.addressManager.getAddresses());
156
- // Initialize indexers for sync (P2PKH-based outputs only)
157
- this.indexers = options.indexers ?? [
158
- new FundIndexer(owners, this.network),
159
- new InscriptionIndexer(owners, this.network),
160
- new Bsv21Indexer(owners, this.network, this.services),
161
- new OriginIndexer(owners, this.network, this.services),
162
- new OpNSIndexer(owners, this.network),
163
- new SigmaIndexer(owners, this.network),
164
- new MapIndexer(owners, this.network),
165
- ];
166
- }
167
- on(event, listener) {
168
- if (!this.listeners.has(event)) {
169
- this.listeners.set(event, new Set());
170
- }
171
- this.listeners
172
- .get(event)
173
- ?.add(listener);
174
- }
175
- off(event, listener) {
176
- this.listeners
177
- .get(event)
178
- ?.delete(listener);
179
- }
180
- emit(event, data) {
181
- for (const listener of this.listeners.get(event) ?? []) {
182
- listener(data);
183
- }
184
- }
185
- /**
186
- * Start processing the queue.
187
- * Processes until queue is empty or stop() is called.
188
- */
189
- async start() {
190
- if (this.processorRunning) {
191
- console.warn('Processor already running');
192
- return;
193
- }
194
- // Reset any stuck processing items
195
- await this.syncQueue.resetProcessing();
196
- this.stopRequested = false;
197
- this.emit('process:start', {});
198
- await this.processQueueLoop();
199
- }
200
- /**
201
- * Stop processing the queue.
202
- */
203
- stop() {
204
- this.stopRequested = true;
205
- }
206
- /**
207
- * Check if processor is currently running.
208
- */
209
- isRunning() {
210
- return this.processorRunning;
211
- }
212
- async processQueueLoop() {
213
- this.processorRunning = true;
214
- try {
215
- while (!this.stopRequested) {
216
- // Claim batch of pending items grouped by txid
217
- const byTxid = await this.syncQueue.claim(this.batchSize);
218
- if (byTxid.size === 0) {
219
- // Queue empty - wait and poll again
220
- await new Promise((resolve) => setTimeout(resolve, 1000));
221
- continue;
222
- }
223
- // Process each txid in parallel
224
- await Promise.all(Array.from(byTxid.entries()).map(([txid, items]) => this.processTxid(txid, items)));
225
- // Emit progress
226
- const stats = await this.syncQueue.getStats();
227
- this.emit('process:progress', {
228
- pending: stats.pending,
229
- done: stats.done,
230
- failed: stats.failed,
231
- });
232
- }
233
- this.emit('process:complete', {});
234
- }
235
- catch (error) {
236
- this.emit('process:error', {
237
- message: error instanceof Error ? error.message : String(error),
238
- });
239
- }
240
- finally {
241
- this.processorRunning = false;
242
- }
243
- }
244
- async processTxid(txid, items) {
245
- try {
246
- // Build spend map: vout → spendTxid
247
- const spendMap = new Map();
248
- for (const item of items) {
249
- if (item.spendTxid) {
250
- const vout = Number.parseInt(item.outpoint.split('_')[1], 10);
251
- spendMap.set(vout, item.spendTxid);
252
- }
253
- }
254
- // If all items are spend-only (no new outputs), just mark outputs as spent
255
- const hasNewOutputs = items.some((item) => !item.spendTxid);
256
- if (!hasNewOutputs) {
257
- // TODO: Mark outputs as spent in wallet storage
258
- // For now, just complete the items
259
- await this.syncQueue.completeMany(items.map((i) => i.id));
260
- return;
261
- }
262
- // Load transaction as BEEF
263
- const beef = await this.services.beef.getBeef(txid);
264
- if (!beef) {
265
- throw new Error(`Failed to load transaction ${txid}`);
266
- }
267
- // Parse transaction with indexers
268
- const beefObj = Beef.fromBinary(Array.from(beef));
269
- const btx = beefObj.findTxid(txid);
270
- if (!btx?.tx) {
271
- throw new Error(`Transaction ${txid} not found in BEEF`);
272
- }
273
- // Ensure all inputs have source transactions loaded
274
- for (const input of btx.tx.inputs) {
275
- if (!input.sourceTransaction && input.sourceTXID) {
276
- const rawTx = await this.services.beef.getRawTx(input.sourceTXID);
277
- input.sourceTransaction = Transaction.fromBinary(Array.from(rawTx));
278
- }
279
- }
280
- const ctx = await this.parseTransaction(btx.tx);
281
- // Build InternalizeOutput entries for owned outputs
282
- const outputs = [];
283
- const ownedTxos = [];
284
- for (const txo of ctx.txos) {
285
- if (!txo.owner)
286
- continue;
287
- // Check if this output is at one of our receive addresses
288
- const derivation = this.addressManager.getDerivation(txo.owner);
289
- if (!derivation)
290
- continue;
291
- // Build internalize output using protocol from indexer
292
- const internalizeOutput = this.buildInternalizeOutput(txo, derivation);
293
- if (internalizeOutput) {
294
- outputs.push(internalizeOutput);
295
- ownedTxos.push(txo);
296
- }
297
- }
298
- // Internalize if we have owned outputs
299
- if (outputs.length > 0) {
300
- const args = {
301
- tx: Array.from(beef),
302
- outputs,
303
- description: this.buildDescription(ownedTxos),
304
- };
305
- console.log(`[AddressSyncProcessor] Internalizing ${outputs.length} outputs for txid ${txid}`, outputs.map((o) => ({ vout: o.outputIndex, protocol: o.protocol })));
306
- await this.wallet.internalizeAction(args);
307
- console.log(`[AddressSyncProcessor] Internalization complete for txid ${txid}`);
308
- this.emit('process:parsed', { internalizedCount: ownedTxos.length });
309
- }
310
- // Complete all items for this txid
311
- await this.syncQueue.completeMany(items.map((i) => i.id));
312
- }
313
- catch (error) {
314
- // Log error but leave items as 'processing'.
315
- // resetProcessing() runs on next start() and puts them back to 'pending'.
316
- const errorMsg = error instanceof Error ? error.message : String(error);
317
- console.error(`[AddressSyncProcessor] Failed to process txid ${txid}, will retry on next cycle:`, errorMsg);
318
- }
319
- }
320
- async parseTransaction(tx) {
321
- const txid = tx.id('hex');
322
- // Initialize parse context
323
- const ctx = {
324
- tx,
325
- txid,
326
- txos: [],
327
- spends: [],
328
- summary: {},
329
- indexers: this.indexers,
330
- };
331
- // Parse inputs into spends
332
- for (let vin = 0; vin < tx.inputs.length; vin++) {
333
- const input = tx.inputs[vin];
334
- if (!input.sourceTransaction) {
335
- throw new Error(`Missing sourceTransaction for input ${vin}`);
336
- }
337
- const sourceTxid = input.sourceTransaction.id('hex');
338
- const txo = {
339
- output: input.sourceTransaction.outputs[input.sourceOutputIndex],
340
- outpoint: new Outpoint(sourceTxid, input.sourceOutputIndex),
341
- data: {},
342
- };
343
- for (const indexer of this.indexers) {
344
- const result = await indexer.parse(txo);
345
- if (result) {
346
- txo.data[indexer.tag] = {
347
- data: result.data,
348
- tags: result.tags,
349
- content: result.content,
350
- };
351
- if (result.owner && !txo.owner) {
352
- txo.owner = result.owner;
353
- }
354
- if (result.basket && !txo.basket) {
355
- txo.basket = result.basket;
356
- }
357
- }
358
- }
359
- ctx.spends.push(txo);
360
- }
361
- // Parse each output
362
- for (let vout = 0; vout < tx.outputs.length; vout++) {
363
- const output = tx.outputs[vout];
364
- const txo = {
365
- output,
366
- outpoint: new Outpoint(txid, vout),
367
- data: {},
368
- };
369
- // Run through all indexers
370
- for (const indexer of this.indexers) {
371
- const result = await indexer.parse(txo);
372
- if (result) {
373
- txo.data[indexer.tag] = {
374
- data: result.data,
375
- tags: result.tags,
376
- content: result.content,
377
- };
378
- // First indexer to set owner wins
379
- if (result.owner && !txo.owner) {
380
- txo.owner = result.owner;
381
- }
382
- // First indexer to set basket wins
383
- if (result.basket && !txo.basket) {
384
- txo.basket = result.basket;
385
- }
386
- // First indexer to set protocol wins (custom scripts override P2PKH)
387
- if (result.protocol && !txo.protocol) {
388
- txo.protocol = result.protocol;
389
- }
390
- }
391
- }
392
- ctx.txos.push(txo);
393
- }
394
- // Run summarize phase for all indexers
395
- for (const indexer of this.indexers) {
396
- const summary = await indexer.summarize(ctx, true);
397
- if (summary) {
398
- ctx.summary[indexer.tag] = summary;
399
- }
400
- }
401
- return ctx;
402
- }
403
- buildInternalizeOutput(txo, derivation) {
404
- const vout = txo.outpoint.vout;
405
- // Use protocol from indexer, default to "wallet payment" for P2PKH
406
- const protocol = txo.protocol || 'wallet payment';
407
- if (protocol === 'basket insertion') {
408
- // Custom script - use basket insertion
409
- // These outputs need custom unlock scripts when spent
410
- const basket = txo.basket || 'custom';
411
- const tags = this.collectTags(txo);
412
- const nameTag = tags.find((t) => t.startsWith('name:'));
413
- return {
414
- outputIndex: vout,
415
- protocol: 'basket insertion',
416
- insertionRemittance: {
417
- basket,
418
- tags,
419
- customInstructions: JSON.stringify({
420
- derivationPrefix: derivation.derivationPrefix,
421
- derivationSuffix: derivation.derivationSuffix,
422
- senderIdentityKey: derivation.senderIdentityKey,
423
- ...(nameTag && { name: nameTag.slice(5).slice(0, 64) }),
424
- }),
425
- },
426
- };
427
- }
428
- // P2PKH ordinals/tokens: basket insertion so they don't get consumed as change
429
- if (txo.basket && txo.basket !== 'fund') {
430
- const tags = this.collectTags(txo);
431
- const nameTag = tags.find((t) => t.startsWith('name:'));
432
- return {
433
- outputIndex: vout,
434
- protocol: 'basket insertion',
435
- insertionRemittance: {
436
- basket: txo.basket,
437
- tags,
438
- customInstructions: JSON.stringify({
439
- protocolID: BRC29_PROTOCOL_ID,
440
- keyID: `${derivation.derivationPrefix} ${derivation.derivationSuffix}`,
441
- ...(nameTag && { name: nameTag.slice(5).slice(0, 64) }),
442
- }),
443
- },
444
- };
445
- }
446
- // P2PKH funding output - use wallet payment for auto-signing
447
- return {
448
- outputIndex: vout,
449
- protocol: 'wallet payment',
450
- paymentRemittance: {
451
- derivationPrefix: derivation.derivationPrefix,
452
- derivationSuffix: derivation.derivationSuffix,
453
- senderIdentityKey: derivation.senderIdentityKey,
454
- },
455
- };
456
- }
457
- collectTags(txo) {
458
- const tags = [];
459
- for (const indexData of Object.values(txo.data)) {
460
- tags.push(...indexData.tags);
461
- }
462
- return tags;
463
- }
464
- buildDescription(ownedTxos) {
465
- const parts = [];
466
- let sats = 0;
467
- for (const txo of ownedTxos) {
468
- if (txo.data.bsv21) {
469
- const token = txo.data.bsv21.data;
470
- const sym = token.sym || 'tokens';
471
- const amt = Number(token.amt) / 10 ** token.dec;
472
- parts.push(`${amt} ${sym}`);
473
- }
474
- else if (txo.basket === '1sat') {
475
- parts.push('ordinal');
476
- }
477
- else if (txo.basket === 'opns') {
478
- parts.push('OPNS name');
479
- }
480
- else if (txo.basket === 'fund') {
481
- sats += Number(txo.output.satoshis || 0);
482
- }
483
- }
484
- if (sats > 0) {
485
- parts.push(`${sats} sats`);
486
- }
487
- if (parts.length === 0)
488
- return 'Received via address sync';
489
- const desc = `Received ${parts.join(' + ')}`;
490
- if (desc.length <= 50)
491
- return desc;
492
- return `${desc.slice(0, 47)}...`;
493
- }
494
- }
495
- /**
496
- * AddressSyncManager - Class that combines SSE fetching and queue processing.
497
- *
498
- * For Chrome extensions, use AddressSyncFetcher (UI) and AddressSyncProcessor
499
- * (service worker) separately since EventSource doesn't work reliably in service workers.
500
- */
501
- export class AddressSyncManager {
502
- fetcher;
503
- processor;
504
- wallet;
505
- addressManager;
506
- listeners = new Map();
507
- fetchPromise = null;
508
- constructor(options) {
509
- this.wallet = options.wallet;
510
- this.addressManager = options.addressManager;
511
- // Create fetcher for SSE stream
512
- this.fetcher = new AddressSyncFetcher({
513
- services: options.services,
514
- syncQueue: options.syncQueue,
515
- addressManager: options.addressManager,
516
- });
517
- // Create processor for queue processing
518
- this.processor = new AddressSyncProcessor({
519
- wallet: options.wallet,
520
- services: options.services,
521
- syncQueue: options.syncQueue,
522
- addressManager: options.addressManager,
523
- network: options.network,
524
- batchSize: options.batchSize,
525
- indexers: options.indexers,
526
- });
527
- // Wire up event forwarding
528
- this.setupEventForwarding();
529
- }
530
- setupEventForwarding() {
531
- // Forward fetcher events
532
- this.fetcher.on('fetch:start', (data) => {
533
- this.emit('sync:start', { addresses: data.addresses });
534
- });
535
- this.fetcher.on('fetch:error', (data) => {
536
- this.emit('sync:error', { message: data.message });
537
- });
538
- // Forward processor events
539
- this.processor.on('process:progress', (data) => {
540
- this.emit('sync:progress', data);
541
- });
542
- this.processor.on('process:complete', () => {
543
- this.emit('sync:complete', {});
544
- });
545
- this.processor.on('process:error', (data) => {
546
- this.emit('sync:error', { message: data.message });
547
- });
548
- this.processor.on('process:parsed', (data) => {
549
- this.emit('sync:parsed', data);
550
- });
551
- }
552
- // ===== Event Emitter =====
553
- on(event, listener) {
554
- if (!this.listeners.has(event)) {
555
- this.listeners.set(event, new Set());
556
- }
557
- this.listeners
558
- .get(event)
559
- ?.add(listener);
560
- }
561
- off(event, listener) {
562
- this.listeners
563
- .get(event)
564
- ?.delete(listener);
565
- }
566
- emit(event, data) {
567
- for (const listener of this.listeners.get(event) ?? []) {
568
- listener(data);
569
- }
570
- }
571
- // ===== Sync Control =====
572
- /**
573
- * Start syncing - opens SSE stream and starts queue processor.
574
- */
575
- async sync() {
576
- if (this.fetchPromise || this.processor.isRunning()) {
577
- console.warn('Sync already running');
578
- return;
579
- }
580
- const addresses = this.addressManager.getAddresses();
581
- if (addresses.length === 0) {
582
- console.warn('No addresses to sync');
583
- return;
584
- }
585
- // Get current height for reorg protection
586
- const { height: currentHeight } = await this.wallet.getHeight({});
587
- // Start fetcher (SSE stream) - this runs until stream completes
588
- this.fetchPromise = this.fetcher.fetch(currentHeight);
589
- // Start processor in parallel - this processes items as they come in
590
- // and waits for more until fetch completes
591
- this.processor.start();
592
- // Wait for fetch to complete, then let processor finish
593
- try {
594
- await this.fetchPromise;
595
- }
596
- finally {
597
- this.fetchPromise = null;
598
- }
599
- }
600
- /**
601
- * Stop syncing - closes SSE stream and stops queue processor.
602
- */
603
- stop() {
604
- this.fetcher.stop();
605
- this.processor.stop();
606
- this.fetchPromise = null;
607
- }
608
- /**
609
- * Check if sync is currently running.
610
- */
611
- isSyncing() {
612
- return this.fetchPromise !== null || this.processor.isRunning();
613
- }
614
- }
615
- //# sourceMappingURL=AddressSyncManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AddressSyncManager.js","sourceRoot":"","sources":["../../src/address-sync/AddressSyncManager.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import type { AddressSyncQueueInput, AddressSyncQueueItem, AddressSyncQueueStats, AddressSyncQueueStorage, AddressSyncState } from '@1sat/types';
2
- /**
3
- * IndexedDB implementation of AddressSyncQueueStorage for browser environments.
4
- */
5
- export declare class AddressSyncQueueIdb implements AddressSyncQueueStorage {
6
- private dbName;
7
- private db;
8
- private dbPromise;
9
- /**
10
- * Create a new IndexedDB address sync queue.
11
- * @param accountId - Unique identifier for the account (e.g., address, pubkey hash)
12
- */
13
- constructor(accountId: string);
14
- private getDb;
15
- enqueue(items: AddressSyncQueueInput[]): Promise<void>;
16
- claim(count?: number): Promise<Map<string, AddressSyncQueueItem[]>>;
17
- private getPendingByTxid;
18
- private markProcessing;
19
- complete(id: string): Promise<void>;
20
- completeMany(ids: string[]): Promise<void>;
21
- fail(id: string, error: string): Promise<void>;
22
- getByTxid(txid: string): Promise<AddressSyncQueueItem[]>;
23
- getByStatus(status: AddressSyncQueueItem['status'], limit?: number): Promise<AddressSyncQueueItem[]>;
24
- getStats(): Promise<AddressSyncQueueStats>;
25
- getState(): Promise<AddressSyncState>;
26
- setState(state: Partial<AddressSyncState>): Promise<void>;
27
- resetProcessing(): Promise<number>;
28
- clear(): Promise<void>;
29
- close(): Promise<void>;
30
- }
31
- //# sourceMappingURL=AddressSyncQueueIdb.d.ts.map