@1sat/wallet 0.0.3 → 0.0.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.
Files changed (141) hide show
  1. package/dist/OneSatWallet.d.ts +222 -0
  2. package/dist/OneSatWallet.d.ts.map +1 -0
  3. package/dist/OneSatWallet.js +754 -0
  4. package/dist/OneSatWallet.js.map +1 -0
  5. package/dist/address-sync/AddressManager.d.ts +86 -0
  6. package/dist/address-sync/AddressManager.d.ts.map +1 -0
  7. package/dist/address-sync/AddressManager.js +108 -0
  8. package/dist/address-sync/AddressManager.js.map +1 -0
  9. package/dist/address-sync/AddressSyncManager.d.ts +204 -0
  10. package/dist/address-sync/AddressSyncManager.d.ts.map +1 -0
  11. package/dist/address-sync/AddressSyncManager.js +525 -0
  12. package/dist/address-sync/AddressSyncManager.js.map +1 -0
  13. package/dist/address-sync/AddressSyncQueueIdb.d.ts +31 -0
  14. package/dist/address-sync/AddressSyncQueueIdb.d.ts.map +1 -0
  15. package/dist/address-sync/AddressSyncQueueIdb.js +356 -0
  16. package/dist/address-sync/AddressSyncQueueIdb.js.map +1 -0
  17. package/dist/address-sync/AddressSyncQueueSqlite.d.ts +55 -0
  18. package/dist/address-sync/AddressSyncQueueSqlite.d.ts.map +1 -0
  19. package/dist/address-sync/AddressSyncQueueSqlite.js +198 -0
  20. package/dist/address-sync/AddressSyncQueueSqlite.js.map +1 -0
  21. package/dist/address-sync/index.d.ts +8 -0
  22. package/dist/address-sync/index.d.ts.map +1 -0
  23. package/dist/address-sync/index.js +5 -0
  24. package/dist/address-sync/index.js.map +1 -0
  25. package/dist/backup/FileBackupProvider.d.ts +97 -0
  26. package/dist/backup/FileBackupProvider.d.ts.map +1 -0
  27. package/dist/backup/FileBackupProvider.js +185 -0
  28. package/dist/backup/FileBackupProvider.js.map +1 -0
  29. package/dist/backup/FileRestoreReader.d.ts +59 -0
  30. package/dist/backup/FileRestoreReader.d.ts.map +1 -0
  31. package/dist/backup/FileRestoreReader.js +89 -0
  32. package/dist/backup/FileRestoreReader.js.map +1 -0
  33. package/dist/backup/index.d.ts +6 -0
  34. package/dist/backup/index.d.ts.map +1 -0
  35. package/dist/backup/index.js +5 -0
  36. package/dist/backup/index.js.map +1 -0
  37. package/dist/backup/types.d.ts +32 -0
  38. package/dist/backup/types.d.ts.map +1 -0
  39. package/dist/backup/types.js +2 -0
  40. package/dist/backup/types.js.map +1 -0
  41. package/dist/browser.d.ts +6 -0
  42. package/dist/browser.d.ts.map +1 -0
  43. package/dist/browser.js +6 -0
  44. package/dist/browser.js.map +1 -0
  45. package/dist/cwi/chrome.d.ts +12 -0
  46. package/dist/cwi/chrome.d.ts.map +1 -0
  47. package/dist/cwi/chrome.js +44 -0
  48. package/dist/cwi/chrome.js.map +1 -0
  49. package/dist/cwi/event.d.ts +12 -0
  50. package/dist/cwi/event.d.ts.map +1 -0
  51. package/dist/cwi/event.js +39 -0
  52. package/dist/cwi/event.js.map +1 -0
  53. package/dist/cwi/factory.d.ts +15 -0
  54. package/dist/cwi/factory.d.ts.map +1 -0
  55. package/dist/cwi/factory.js +45 -0
  56. package/dist/cwi/factory.js.map +1 -0
  57. package/dist/cwi/index.d.ts +12 -0
  58. package/dist/cwi/index.d.ts.map +1 -0
  59. package/dist/cwi/index.js +12 -0
  60. package/dist/cwi/index.js.map +1 -0
  61. package/dist/cwi/types.d.ts +40 -0
  62. package/dist/cwi/types.d.ts.map +1 -0
  63. package/dist/cwi/types.js +40 -0
  64. package/dist/cwi/types.js.map +1 -0
  65. package/dist/factory/createWebWallet.d.ts +73 -0
  66. package/dist/factory/createWebWallet.d.ts.map +1 -0
  67. package/dist/factory/createWebWallet.js +251 -0
  68. package/dist/factory/createWebWallet.js.map +1 -0
  69. package/dist/factory/fullSync.d.ts +58 -0
  70. package/dist/factory/fullSync.d.ts.map +1 -0
  71. package/dist/factory/fullSync.js +92 -0
  72. package/dist/factory/fullSync.js.map +1 -0
  73. package/dist/factory/index.d.ts +5 -0
  74. package/dist/factory/index.d.ts.map +1 -0
  75. package/dist/factory/index.js +3 -0
  76. package/dist/factory/index.js.map +1 -0
  77. package/dist/index.d.ts +18 -20
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +24 -21
  80. package/dist/index.js.map +1 -1
  81. package/dist/indexers/Bsv21Indexer.d.ts +36 -0
  82. package/dist/indexers/Bsv21Indexer.d.ts.map +1 -0
  83. package/dist/indexers/Bsv21Indexer.js +232 -0
  84. package/dist/indexers/Bsv21Indexer.js.map +1 -0
  85. package/dist/indexers/CosignIndexer.d.ts +14 -0
  86. package/dist/indexers/CosignIndexer.d.ts.map +1 -0
  87. package/dist/indexers/CosignIndexer.js +27 -0
  88. package/dist/indexers/CosignIndexer.js.map +1 -0
  89. package/dist/indexers/FundIndexer.d.ts +20 -0
  90. package/dist/indexers/FundIndexer.d.ts.map +1 -0
  91. package/dist/indexers/FundIndexer.js +65 -0
  92. package/dist/indexers/FundIndexer.js.map +1 -0
  93. package/dist/indexers/InscriptionIndexer.d.ts +33 -0
  94. package/dist/indexers/InscriptionIndexer.d.ts.map +1 -0
  95. package/dist/indexers/InscriptionIndexer.js +116 -0
  96. package/dist/indexers/InscriptionIndexer.js.map +1 -0
  97. package/dist/indexers/LockIndexer.d.ts +11 -0
  98. package/dist/indexers/LockIndexer.d.ts.map +1 -0
  99. package/dist/indexers/LockIndexer.js +44 -0
  100. package/dist/indexers/LockIndexer.js.map +1 -0
  101. package/dist/indexers/MapIndexer.d.ts +14 -0
  102. package/dist/indexers/MapIndexer.d.ts.map +1 -0
  103. package/dist/indexers/MapIndexer.js +65 -0
  104. package/dist/indexers/MapIndexer.js.map +1 -0
  105. package/dist/indexers/OpNSIndexer.d.ts +10 -0
  106. package/dist/indexers/OpNSIndexer.d.ts.map +1 -0
  107. package/dist/indexers/OpNSIndexer.js +39 -0
  108. package/dist/indexers/OpNSIndexer.js.map +1 -0
  109. package/dist/indexers/OrdLockIndexer.d.ts +18 -0
  110. package/dist/indexers/OrdLockIndexer.d.ts.map +1 -0
  111. package/dist/indexers/OrdLockIndexer.js +65 -0
  112. package/dist/indexers/OrdLockIndexer.js.map +1 -0
  113. package/dist/indexers/OriginIndexer.d.ts +38 -0
  114. package/dist/indexers/OriginIndexer.d.ts.map +1 -0
  115. package/dist/indexers/OriginIndexer.js +241 -0
  116. package/dist/indexers/OriginIndexer.js.map +1 -0
  117. package/dist/indexers/Outpoint.d.ts +11 -0
  118. package/dist/indexers/Outpoint.d.ts.map +1 -0
  119. package/dist/indexers/Outpoint.js +62 -0
  120. package/dist/indexers/Outpoint.js.map +1 -0
  121. package/dist/indexers/SigmaIndexer.d.ts +29 -0
  122. package/dist/indexers/SigmaIndexer.d.ts.map +1 -0
  123. package/dist/indexers/SigmaIndexer.js +134 -0
  124. package/dist/indexers/SigmaIndexer.js.map +1 -0
  125. package/dist/indexers/index.d.ts +14 -0
  126. package/dist/indexers/index.d.ts.map +1 -0
  127. package/dist/indexers/index.js +14 -0
  128. package/dist/indexers/index.js.map +1 -0
  129. package/dist/indexers/parseAddress.d.ts +10 -0
  130. package/dist/indexers/parseAddress.d.ts.map +1 -0
  131. package/dist/indexers/parseAddress.js +25 -0
  132. package/dist/indexers/parseAddress.js.map +1 -0
  133. package/dist/node.d.ts +6 -0
  134. package/dist/node.d.ts.map +1 -0
  135. package/dist/node.js +6 -0
  136. package/dist/node.js.map +1 -0
  137. package/dist/signers/ReadOnlySigner.d.ts +16 -0
  138. package/dist/signers/ReadOnlySigner.d.ts.map +1 -0
  139. package/dist/signers/ReadOnlySigner.js +48 -0
  140. package/dist/signers/ReadOnlySigner.js.map +1 -0
  141. package/package.json +21 -8
@@ -0,0 +1,65 @@
1
+ import { Indexer, } from '@1sat/types';
2
+ import { parseAddress } from './parseAddress';
3
+ /**
4
+ * FundIndexer identifies P2PKH outputs to owned addresses.
5
+ * These are standard "funding" UTXOs that can be spent normally.
6
+ *
7
+ * Data structure: string (address)
8
+ *
9
+ * Basket: 'fund'
10
+ * Tags: None
11
+ */
12
+ export class FundIndexer extends Indexer {
13
+ owners;
14
+ network;
15
+ tag = 'fund';
16
+ name = 'Funds';
17
+ constructor(owners = new Set(), network = 'mainnet') {
18
+ super(owners, network);
19
+ this.owners = owners;
20
+ this.network = network;
21
+ }
22
+ async parse(txo) {
23
+ const script = txo.output.lockingScript;
24
+ const satoshis = BigInt(txo.output.satoshis || 0);
25
+ const address = parseAddress(script, 0, this.network);
26
+ if (satoshis < 2n)
27
+ return;
28
+ return {
29
+ data: address,
30
+ tags: [],
31
+ owner: address,
32
+ basket: 'fund',
33
+ };
34
+ }
35
+ async summarize(ctx) {
36
+ let satsOut = 0n;
37
+ let satsIn = 0n;
38
+ // Calculate satoshis spent from our addresses (inputs)
39
+ for (const input of ctx.tx.inputs) {
40
+ if (!input.sourceTransaction) {
41
+ // If we don't have source transaction data, we can't determine balance change
42
+ return;
43
+ }
44
+ const sourceOutput = input.sourceTransaction.outputs[input.sourceOutputIndex];
45
+ const address = parseAddress(sourceOutput.lockingScript, 0, this.network);
46
+ if (this.owners.has(address)) {
47
+ satsOut += BigInt(sourceOutput.satoshis || 0);
48
+ }
49
+ }
50
+ // Calculate satoshis received to our addresses (outputs)
51
+ satsIn = ctx.txos.reduce((acc, txo) => {
52
+ if (!txo.data[this.tag])
53
+ return acc;
54
+ const satoshis = BigInt(txo.output.satoshis || 0);
55
+ return acc + (txo.owner && this.owners.has(txo.owner) ? satoshis : 0n);
56
+ }, 0n);
57
+ const balance = Number(satsIn - satsOut);
58
+ if (balance) {
59
+ return {
60
+ amount: balance,
61
+ };
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=FundIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FundIndexer.js","sourceRoot":"","sources":["../../src/indexers/FundIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,OAAO,GAIP,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,OAAO;IAK/B;IACA;IALR,GAAG,GAAG,MAAM,CAAA;IACZ,IAAI,GAAG,OAAO,CAAA;IAEd,YACQ,SAAS,IAAI,GAAG,EAAU,EAC1B,UAAiC,SAAS;QAEjD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAHf,WAAM,GAAN,MAAM,CAAoB;QAC1B,YAAO,GAAP,OAAO,CAAmC;IAGlD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAQ;QACnB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAA;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACrD,IAAI,QAAQ,GAAG,EAAE;YAAE,OAAM;QAEzB,OAAO;YACN,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,MAAM;SACd,CAAA;IACF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAiB;QAChC,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,uDAAuD;QACvD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,8EAA8E;gBAC9E,OAAM;YACP,CAAC;YAED,MAAM,YAAY,GACjB,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACzD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YAEzE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;YAC9C,CAAC;QACF,CAAC;QAED,yDAAyD;QACzD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAA;YACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;YACjD,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACvE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;QACxC,IAAI,OAAO,EAAE,CAAC;YACb,OAAO;gBACN,MAAM,EAAE,OAAO;aACf,CAAA;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,33 @@
1
+ import { type IndexSummary, Indexer, type ParseContext, type ParseResult, type Txo } from '@1sat/types';
2
+ export interface File {
3
+ hash: string;
4
+ size: number;
5
+ type: string;
6
+ content: number[];
7
+ }
8
+ export interface Inscription {
9
+ file?: File;
10
+ fields?: {
11
+ [key: string]: string;
12
+ };
13
+ parent?: string;
14
+ }
15
+ /**
16
+ * InscriptionIndexer identifies and parses ordinal inscriptions.
17
+ * These are outputs with exactly 1 satoshi containing OP_FALSE OP_IF "ord" envelope.
18
+ *
19
+ * Data structure: Inscription with file, fields, and optional parent
20
+ *
21
+ * Basket: None (no basket assignment - this is preliminary data for other indexers)
22
+ * Events: address for owned outputs
23
+ */
24
+ export declare class InscriptionIndexer extends Indexer {
25
+ owners: Set<string>;
26
+ network: 'mainnet' | 'testnet';
27
+ tag: string;
28
+ name: string;
29
+ constructor(owners?: Set<string>, network?: 'mainnet' | 'testnet');
30
+ parse(txo: Txo): Promise<ParseResult | undefined>;
31
+ summarize(ctx: ParseContext): Promise<IndexSummary | undefined>;
32
+ }
33
+ //# sourceMappingURL=InscriptionIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InscriptionIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/InscriptionIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,MAAM,aAAa,CAAA;AAMpB,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,OAAO;IAKtC,MAAM;IACN,OAAO,EAAE,SAAS,GAAG,SAAS;IALtC,GAAG,SAAS;IACZ,IAAI,SAAiB;gBAGb,MAAM,cAAoB,EAC1B,OAAO,GAAE,SAAS,GAAG,SAAqB;IAK5C,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA4FjD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;CAUrE"}
@@ -0,0 +1,116 @@
1
+ import { Indexer, } from '@1sat/types';
2
+ import { Inscription as InscriptionTemplate } from '@bopen-io/templates';
3
+ import { OP, Script, Utils } from '@bsv/sdk';
4
+ import { MapIndexer } from './MapIndexer';
5
+ import { parseAddress } from './parseAddress';
6
+ /**
7
+ * InscriptionIndexer identifies and parses ordinal inscriptions.
8
+ * These are outputs with exactly 1 satoshi containing OP_FALSE OP_IF "ord" envelope.
9
+ *
10
+ * Data structure: Inscription with file, fields, and optional parent
11
+ *
12
+ * Basket: None (no basket assignment - this is preliminary data for other indexers)
13
+ * Events: address for owned outputs
14
+ */
15
+ export class InscriptionIndexer extends Indexer {
16
+ owners;
17
+ network;
18
+ tag = 'insc';
19
+ name = 'Inscriptions';
20
+ constructor(owners = new Set(), network = 'mainnet') {
21
+ super(owners, network);
22
+ this.owners = owners;
23
+ this.network = network;
24
+ }
25
+ async parse(txo) {
26
+ const satoshis = BigInt(txo.output.satoshis || 0);
27
+ if (satoshis !== 1n)
28
+ return;
29
+ const script = txo.output.lockingScript;
30
+ // Use template decode
31
+ const decoded = InscriptionTemplate.decode(script);
32
+ if (!decoded)
33
+ return;
34
+ // Extract owner from script prefix or suffix
35
+ let owner = parseAddress(script, 0, this.network);
36
+ if (!owner && decoded.scriptSuffix) {
37
+ // Try to find owner in suffix (after OP_ENDIF)
38
+ owner = parseAddress(decoded.scriptSuffix, 0, this.network);
39
+ // Also check for OP_CODESEPARATOR pattern
40
+ if (!owner &&
41
+ decoded.scriptSuffix.chunks[0]?.op === OP.OP_CODESEPARATOR) {
42
+ owner = parseAddress(decoded.scriptSuffix, 1, this.network);
43
+ }
44
+ }
45
+ // Handle MAP field if present (special case)
46
+ // Note: This writes to txo.data.map directly as a side effect
47
+ if (decoded.fields?.has('MAP')) {
48
+ const mapData = decoded.fields.get('MAP');
49
+ if (mapData) {
50
+ const map = MapIndexer.parseMap(Script.fromBinary(Array.from(mapData)), 0);
51
+ if (map) {
52
+ txo.data.map = { data: map, tags: [] };
53
+ }
54
+ }
55
+ }
56
+ // Convert to wallet-toolbox format
57
+ const insc = {
58
+ file: {
59
+ hash: Utils.toBase64(Array.from(decoded.file.hash)),
60
+ size: decoded.file.size,
61
+ type: decoded.file.type,
62
+ content: Array.from(decoded.file.content),
63
+ },
64
+ fields: {},
65
+ };
66
+ // Extract text content if it's a text-based inscription and small enough
67
+ let content;
68
+ const contentType = decoded.file.type.toLowerCase();
69
+ const isTextContent = contentType.startsWith('text/') || contentType === 'application/json';
70
+ if (isTextContent && decoded.file.size <= 1000) {
71
+ try {
72
+ content = new TextDecoder().decode(decoded.file.content);
73
+ }
74
+ catch {
75
+ // Ignore decoding errors
76
+ }
77
+ }
78
+ // Convert parent outpoint to string format
79
+ if (decoded.parent) {
80
+ try {
81
+ const reader = new Utils.Reader(Array.from(decoded.parent));
82
+ const txid = Utils.toHex(reader.read(32).reverse());
83
+ const vout = reader.readInt32LE();
84
+ insc.parent = `${txid}_${vout}`;
85
+ }
86
+ catch {
87
+ // Ignore parsing errors
88
+ }
89
+ }
90
+ // Convert fields to base64 strings
91
+ if (decoded.fields && insc.fields) {
92
+ for (const [key, value] of decoded.fields) {
93
+ if (key !== 'MAP') {
94
+ insc.fields[key] = Utils.toBase64(Array.from(value));
95
+ }
96
+ }
97
+ }
98
+ return {
99
+ data: insc,
100
+ tags: [],
101
+ owner,
102
+ content,
103
+ };
104
+ }
105
+ async summarize(ctx) {
106
+ // Clear file content before saving - content is loaded locally but shouldn't be persisted
107
+ for (const txo of ctx.txos) {
108
+ const insc = txo.data[this.tag]?.data;
109
+ if (insc?.file) {
110
+ insc.file.content = [];
111
+ }
112
+ }
113
+ return undefined;
114
+ }
115
+ }
116
+ //# sourceMappingURL=InscriptionIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InscriptionIndexer.js","sourceRoot":"","sources":["../../src/indexers/InscriptionIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type IndexSummary, Indexer, type ParseContext, type ParseResult, type Txo } from '@1sat/types';
2
+ export interface LockData {
3
+ until: number;
4
+ }
5
+ export declare class LockIndexer extends Indexer {
6
+ tag: string;
7
+ name: string;
8
+ parse(txo: Txo): Promise<ParseResult | undefined>;
9
+ summarize(ctx: ParseContext): Promise<IndexSummary | undefined>;
10
+ }
11
+ //# sourceMappingURL=LockIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/LockIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,MAAM,aAAa,CAAA;AAGpB,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,WAAY,SAAQ,OAAO;IACvC,GAAG,SAAS;IACZ,IAAI,SAAU;IAER,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAoBjD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;CAsBrE"}
@@ -0,0 +1,44 @@
1
+ import { Indexer, } from '@1sat/types';
2
+ import { Lock } from '@bopen-io/templates';
3
+ export class LockIndexer extends Indexer {
4
+ tag = 'lock';
5
+ name = 'Locks';
6
+ async parse(txo) {
7
+ const lockingScript = txo.output.lockingScript;
8
+ const decoded = Lock.decode(lockingScript, this.network === 'mainnet');
9
+ if (!decoded)
10
+ return;
11
+ const tags = [];
12
+ if (this.owners.has(decoded.address)) {
13
+ tags.push(`lock:until:${decoded.until}`);
14
+ }
15
+ return {
16
+ data: { until: decoded.until },
17
+ tags,
18
+ owner: decoded.address,
19
+ basket: 'lock',
20
+ protocol: 'basket insertion', // Custom Lock script requires manual unlock
21
+ };
22
+ }
23
+ async summarize(ctx) {
24
+ let locksOut = 0n;
25
+ for (const spend of ctx.spends) {
26
+ if (spend.data[this.tag]) {
27
+ const satoshis = BigInt(spend.output.satoshis || 0);
28
+ locksOut += spend.owner && this.owners.has(spend.owner) ? satoshis : 0n;
29
+ }
30
+ }
31
+ let locksIn = 0n;
32
+ for (const txo of ctx.txos) {
33
+ if (txo.data[this.tag]) {
34
+ const satoshis = BigInt(txo.output.satoshis || 0);
35
+ locksIn += txo.owner && this.owners.has(txo.owner) ? satoshis : 0n;
36
+ }
37
+ }
38
+ const balance = Number(locksIn - locksOut);
39
+ if (balance) {
40
+ return { amount: balance };
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=LockIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockIndexer.js","sourceRoot":"","sources":["../../src/indexers/LockIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,OAAO,GAIP,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAM1C,MAAM,OAAO,WAAY,SAAQ,OAAO;IACvC,GAAG,GAAG,MAAM,CAAA;IACZ,IAAI,GAAG,OAAO,CAAA;IAEd,KAAK,CAAC,KAAK,CAAC,GAAQ;QACnB,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAA;QAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAA;QACtE,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QACzC,CAAC;QAED,OAAO;YACN,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAc;YAC1C,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,kBAAkB,EAAE,4CAA4C;SAC1E,CAAA;IACF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAiB;QAChC,IAAI,QAAQ,GAAG,EAAE,CAAA;QACjB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;gBACnD,QAAQ,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;YACxE,CAAC;QACF,CAAC;QAED,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;gBACjD,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;YACnE,CAAC;QACF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAA;QAC1C,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QAC3B,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,14 @@
1
+ import { Indexer, type ParseResult, type Txo } from '@1sat/types';
2
+ import { Script } from '@bsv/sdk';
3
+ export declare class MapIndexer extends Indexer {
4
+ owners: Set<string>;
5
+ network: 'mainnet' | 'testnet';
6
+ tag: string;
7
+ name: string;
8
+ constructor(owners?: Set<string>, network?: 'mainnet' | 'testnet');
9
+ parse(txo: Txo): Promise<ParseResult | undefined>;
10
+ static parseMap(script: Script, mapPos: number): {
11
+ [key: string]: unknown;
12
+ } | undefined;
13
+ }
14
+ //# sourceMappingURL=MapIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/MapIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjE,OAAO,EAAM,MAAM,EAAS,MAAM,UAAU,CAAA;AAE5C,qBAAa,UAAW,SAAQ,OAAO;IAK9B,MAAM;IACN,OAAO,EAAE,SAAS,GAAG,SAAS;IALtC,GAAG,SAAQ;IACX,IAAI,SAAQ;gBAGJ,MAAM,cAAoB,EAC1B,OAAO,GAAE,SAAS,GAAG,SAAqB;IAK5C,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA4BvD,MAAM,CAAC,QAAQ,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACZ;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,SAAS;CAgCzC"}
@@ -0,0 +1,65 @@
1
+ import { Indexer } from '@1sat/types';
2
+ import { MAP_PREFIX } from '@bopen-io/templates';
3
+ import { OP, Script, Utils } from '@bsv/sdk';
4
+ export class MapIndexer extends Indexer {
5
+ owners;
6
+ network;
7
+ tag = 'map';
8
+ name = 'MAP';
9
+ constructor(owners = new Set(), network = 'mainnet') {
10
+ super(owners, network);
11
+ this.owners = owners;
12
+ this.network = network;
13
+ }
14
+ async parse(txo) {
15
+ const script = txo.output.lockingScript;
16
+ const retPos = script.chunks.findIndex((chunk) => chunk.op === OP.OP_RETURN);
17
+ if (retPos < 0 || !script.chunks[retPos]?.data?.length) {
18
+ return;
19
+ }
20
+ let chunks = Script.fromBinary(script.chunks[retPos].data).chunks;
21
+ while (chunks.length) {
22
+ if (Utils.toUTF8(chunks[0]?.data || []) === MAP_PREFIX) {
23
+ const map = MapIndexer.parseMap(new Script(chunks), 1);
24
+ const name = (map?.name ??
25
+ map?.subTypeData?.name ??
26
+ 'Unknown');
27
+ const tags = name ? [`name:${name}`] : [];
28
+ return map ? { data: map, tags } : undefined;
29
+ }
30
+ const pipePos = chunks.findIndex((chunk) => chunk.data?.length === 1 && chunk.data[0] !== 0x7c);
31
+ if (pipePos > -1) {
32
+ chunks = chunks.slice(pipePos + 1);
33
+ }
34
+ else
35
+ break;
36
+ }
37
+ }
38
+ static parseMap(script, mapPos) {
39
+ if (Utils.toUTF8(script.chunks[mapPos]?.data || []) !== 'SET') {
40
+ return;
41
+ }
42
+ const map = {};
43
+ for (let i = mapPos + 1; i < script.chunks.length; i += 2) {
44
+ const chunk = script.chunks[i];
45
+ if (chunk.op === OP.OP_RETURN ||
46
+ (chunk.data?.length === 1 && chunk.data[0] !== 0x7c)) {
47
+ break;
48
+ }
49
+ const key = Utils.toUTF8(chunk.data || []);
50
+ const value = Utils.toUTF8(script.chunks[i + 1]?.data || []);
51
+ if (key === 'subTypeData') {
52
+ try {
53
+ map[key] = JSON.parse(value);
54
+ continue;
55
+ }
56
+ catch {
57
+ // If JSON parsing fails, fall through to store as string
58
+ }
59
+ }
60
+ map[key] = value;
61
+ }
62
+ return map;
63
+ }
64
+ }
65
+ //# sourceMappingURL=MapIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapIndexer.js","sourceRoot":"","sources":["../../src/indexers/MapIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Indexer, type ParseResult, type Txo } from '@1sat/types';
2
+ export declare class OpNSIndexer extends Indexer {
3
+ owners: Set<string>;
4
+ network: 'mainnet' | 'testnet';
5
+ tag: string;
6
+ name: string;
7
+ constructor(owners?: Set<string>, network?: 'mainnet' | 'testnet');
8
+ parse(txo: Txo): Promise<ParseResult | undefined>;
9
+ }
10
+ //# sourceMappingURL=OpNSIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpNSIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/OpNSIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AAIjE,qBAAa,WAAY,SAAQ,OAAO;IAK/B,MAAM;IACN,OAAO,EAAE,SAAS,GAAG,SAAS;IALtC,GAAG,SAAS;IACZ,IAAI,SAAS;gBAGL,MAAM,cAAoB,EAC1B,OAAO,GAAE,SAAS,GAAG,SAAqB;IAK5C,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CA2BvD"}
@@ -0,0 +1,39 @@
1
+ import { Indexer } from '@1sat/types';
2
+ import { Utils } from '@bsv/sdk';
3
+ export class OpNSIndexer extends Indexer {
4
+ owners;
5
+ network;
6
+ tag = 'opns';
7
+ name = 'OpNS';
8
+ constructor(owners = new Set(), network = 'mainnet') {
9
+ super(owners, network);
10
+ this.owners = owners;
11
+ this.network = network;
12
+ }
13
+ async parse(txo) {
14
+ const insc = txo.data.insc?.data;
15
+ if (insc?.file?.type !== 'application/op-ns')
16
+ return;
17
+ const tags = [];
18
+ // Extract name from inscription content
19
+ if (insc.file?.content && txo.owner && this.owners.has(txo.owner)) {
20
+ try {
21
+ const content = Utils.toUTF8(insc.file.content);
22
+ const data = JSON.parse(content);
23
+ if (data.name) {
24
+ tags.push(`name:${data.name}`);
25
+ }
26
+ }
27
+ catch {
28
+ // Invalid JSON or missing name field
29
+ }
30
+ }
31
+ // TODO: Add validation against OpNS server (infrastructure not ready yet)
32
+ return {
33
+ data: insc,
34
+ tags,
35
+ basket: 'opns',
36
+ };
37
+ }
38
+ }
39
+ //# sourceMappingURL=OpNSIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpNSIndexer.js","sourceRoot":"","sources":["../../src/indexers/OpNSIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA8B,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAGhC,MAAM,OAAO,WAAY,SAAQ,OAAO;IAK/B;IACA;IALR,GAAG,GAAG,MAAM,CAAA;IACZ,IAAI,GAAG,MAAM,CAAA;IAEb,YACQ,SAAS,IAAI,GAAG,EAAU,EAC1B,UAAiC,SAAS;QAEjD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAHf,WAAM,GAAN,MAAM,CAAoB;QAC1B,YAAO,GAAP,OAAO,CAAmC;IAGlD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAQ;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAmB,CAAA;QAC/C,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,mBAAmB;YAAE,OAAM;QAEpD,MAAM,IAAI,GAAa,EAAE,CAAA;QAEzB,wCAAwC;QACxC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAChC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC/B,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,qCAAqC;YACtC,CAAC;QACF,CAAC;QAED,0EAA0E;QAE1E,OAAO;YACN,IAAI,EAAE,IAAI;YACV,IAAI;YACJ,MAAM,EAAE,MAAM;SACd,CAAA;IACF,CAAC;CACD"}
@@ -0,0 +1,18 @@
1
+ import { type IndexSummary, Indexer, type ParseContext, type ParseResult, type Txo } from '@1sat/types';
2
+ export declare class Listing {
3
+ payout: number[];
4
+ price: bigint;
5
+ constructor(payout?: number[], price?: bigint);
6
+ }
7
+ export declare class OrdLockIndexer extends Indexer {
8
+ owners: Set<string>;
9
+ network: 'mainnet' | 'testnet';
10
+ tag: string;
11
+ name: string;
12
+ constructor(owners?: Set<string>, network?: 'mainnet' | 'testnet');
13
+ parse(txo: Txo): Promise<ParseResult | undefined>;
14
+ summarize(ctx: ParseContext): Promise<IndexSummary | undefined>;
15
+ serialize(listing: Listing): string;
16
+ deserialize(str: string): Listing;
17
+ }
18
+ //# sourceMappingURL=OrdLockIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrdLockIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/OrdLockIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,MAAM,aAAa,CAAA;AAGpB,qBAAa,OAAO;IAEX,MAAM,EAAE,MAAM,EAAE;IAChB,KAAK;gBADL,MAAM,GAAE,MAAM,EAAO,EACrB,KAAK,SAAK;CAElB;AAED,qBAAa,cAAe,SAAQ,OAAO;IAKlC,MAAM;IACN,OAAO,EAAE,SAAS,GAAG,SAAS;IALtC,GAAG,SAAS;IACZ,IAAI,SAAa;gBAGT,MAAM,cAAoB,EAC1B,OAAO,GAAE,SAAS,GAAG,SAAqB;IAK5C,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAgBjD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAsBrE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAOnC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAIjC"}
@@ -0,0 +1,65 @@
1
+ import { Indexer, } from '@1sat/types';
2
+ import { OrdLock } from '@bopen-io/templates';
3
+ export class Listing {
4
+ payout;
5
+ price;
6
+ constructor(payout = [], price = 0n) {
7
+ this.payout = payout;
8
+ this.price = price;
9
+ }
10
+ }
11
+ export class OrdLockIndexer extends Indexer {
12
+ owners;
13
+ network;
14
+ tag = 'list';
15
+ name = 'Listings';
16
+ constructor(owners = new Set(), network = 'mainnet') {
17
+ super(owners, network);
18
+ this.owners = owners;
19
+ this.network = network;
20
+ }
21
+ async parse(txo) {
22
+ const lockingScript = txo.output.lockingScript;
23
+ const decoded = OrdLock.decode(lockingScript, this.network === 'mainnet');
24
+ if (!decoded)
25
+ return;
26
+ const listing = new Listing(decoded.payout, decoded.price);
27
+ return {
28
+ data: listing,
29
+ tags: [`list:${listing.price}`],
30
+ owner: decoded.seller,
31
+ protocol: 'basket insertion', // OrdLock script requires manual unlock
32
+ };
33
+ }
34
+ async summarize(ctx) {
35
+ // Check if any input was spending a listing
36
+ for (const [vin, spend] of ctx.spends.entries()) {
37
+ if (spend.data[this.tag]) {
38
+ const unlockingScript = ctx.tx.inputs[vin].unlockingScript;
39
+ if (unlockingScript && OrdLock.isPurchase(unlockingScript)) {
40
+ // Purchased via ordlock contract
41
+ return { amount: 1 };
42
+ }
43
+ // Cancelled/reclaimed by owner
44
+ return { amount: 0 };
45
+ }
46
+ }
47
+ // Check if any output is creating a listing
48
+ for (const txo of ctx.txos) {
49
+ if (txo.data[this.tag]) {
50
+ return { amount: -1 };
51
+ }
52
+ }
53
+ }
54
+ serialize(listing) {
55
+ return JSON.stringify({
56
+ payout: listing.payout,
57
+ price: listing.price.toString(10),
58
+ });
59
+ }
60
+ deserialize(str) {
61
+ const obj = JSON.parse(str);
62
+ return new Listing(obj.payout, BigInt(obj.price));
63
+ }
64
+ }
65
+ //# sourceMappingURL=OrdLockIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrdLockIndexer.js","sourceRoot":"","sources":["../../src/indexers/OrdLockIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,OAAO,GAIP,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7C,MAAM,OAAO,OAAO;IAEX;IACA;IAFR,YACQ,SAAmB,EAAE,EACrB,QAAQ,EAAE;QADV,WAAM,GAAN,MAAM,CAAe;QACrB,UAAK,GAAL,KAAK,CAAK;IACf,CAAC;CACJ;AAED,MAAM,OAAO,cAAe,SAAQ,OAAO;IAKlC;IACA;IALR,GAAG,GAAG,MAAM,CAAA;IACZ,IAAI,GAAG,UAAU,CAAA;IAEjB,YACQ,SAAS,IAAI,GAAG,EAAU,EAC1B,UAAiC,SAAS;QAEjD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAHf,WAAM,GAAN,MAAM,CAAoB;QAC1B,YAAO,GAAP,OAAO,CAAmC;IAGlD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAQ;QACnB,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAA;QAE9C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAA;QACzE,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAE1D,OAAO;YACN,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,CAAC,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,QAAQ,EAAE,kBAAkB,EAAE,wCAAwC;SACtE,CAAA;IACF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAiB;QAChC,4CAA4C;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAA;gBAC1D,IAAI,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC5D,iCAAiC;oBACjC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;gBACrB,CAAC;gBACD,+BAA+B;gBAC/B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;YACrB,CAAC;QACF,CAAC;QAED,4CAA4C;QAC5C,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAA;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAED,SAAS,CAAC,OAAgB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;SACjC,CAAC,CAAA;IACH,CAAC;IAED,WAAW,CAAC,GAAW;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAClD,CAAC;CACD"}
@@ -0,0 +1,38 @@
1
+ import { type OneSatServices } from '@1sat/client';
2
+ import { type IndexSummary, Indexer, type ParseContext, type ParseResult, type Txo } from '@1sat/types';
3
+ import type { Inscription } from './InscriptionIndexer';
4
+ import type { Sigma } from './SigmaIndexer';
5
+ export interface Origin {
6
+ outpoint?: string;
7
+ nonce?: number;
8
+ insc?: Inscription;
9
+ map?: {
10
+ [key: string]: unknown;
11
+ };
12
+ sigma?: Sigma[];
13
+ }
14
+ export declare class OriginIndexer extends Indexer {
15
+ owners: Set<string>;
16
+ network: 'mainnet' | 'testnet';
17
+ private services;
18
+ tag: string;
19
+ name: string;
20
+ constructor(owners: Set<string>, network: 'mainnet' | 'testnet', services: OneSatServices);
21
+ /**
22
+ * Parse identifies 1-sat ordinal outputs and extracts basic data.
23
+ * Origin tracking (determining if transfer vs new) is done in summarize()
24
+ * since it requires cross-output and cross-input context.
25
+ */
26
+ parse(txo: Txo): Promise<ParseResult | undefined>;
27
+ /**
28
+ * Summarize determines origin tracking (transfer vs new origin) and
29
+ * fetches metadata from OrdFS for transfers.
30
+ */
31
+ summarize(ctx: ParseContext): Promise<IndexSummary | undefined>;
32
+ /**
33
+ * Resolve origins for all 1-sat outputs in the transaction.
34
+ * This determines whether each is a new origin or a transfer.
35
+ */
36
+ private resolveOrigins;
37
+ }
38
+ //# sourceMappingURL=OriginIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OriginIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/OriginIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EACN,KAAK,YAAY,EACjB,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAG3C,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,GAAG,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;IAChC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAA;CACf;AAED,qBAAa,aAAc,SAAQ,OAAO;IAKjC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,SAAS;IACrC,OAAO,CAAC,QAAQ;IANjB,GAAG,SAAW;IACd,IAAI,SAAY;gBAGR,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EACnB,OAAO,EAAE,SAAS,GAAG,SAAS,EAC7B,QAAQ,EAAE,cAAc;IAKjC;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAwCvD;;;OAGG;IACG,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAqDrE;;;OAGG;YACW,cAAc;CAmJ5B"}