@1sat/wallet 0.0.3 → 0.0.5

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 (121) 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/cwi/chrome.d.ts +12 -0
  42. package/dist/cwi/chrome.d.ts.map +1 -0
  43. package/dist/cwi/chrome.js +44 -0
  44. package/dist/cwi/chrome.js.map +1 -0
  45. package/dist/cwi/event.d.ts +12 -0
  46. package/dist/cwi/event.d.ts.map +1 -0
  47. package/dist/cwi/event.js +39 -0
  48. package/dist/cwi/event.js.map +1 -0
  49. package/dist/cwi/factory.d.ts +15 -0
  50. package/dist/cwi/factory.d.ts.map +1 -0
  51. package/dist/cwi/factory.js +45 -0
  52. package/dist/cwi/factory.js.map +1 -0
  53. package/dist/cwi/index.d.ts +12 -0
  54. package/dist/cwi/index.d.ts.map +1 -0
  55. package/dist/cwi/index.js +12 -0
  56. package/dist/cwi/index.js.map +1 -0
  57. package/dist/cwi/types.d.ts +40 -0
  58. package/dist/cwi/types.d.ts.map +1 -0
  59. package/dist/cwi/types.js +40 -0
  60. package/dist/cwi/types.js.map +1 -0
  61. package/dist/index.d.ts +17 -20
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +22 -21
  64. package/dist/index.js.map +1 -1
  65. package/dist/indexers/Bsv21Indexer.d.ts +36 -0
  66. package/dist/indexers/Bsv21Indexer.d.ts.map +1 -0
  67. package/dist/indexers/Bsv21Indexer.js +232 -0
  68. package/dist/indexers/Bsv21Indexer.js.map +1 -0
  69. package/dist/indexers/CosignIndexer.d.ts +14 -0
  70. package/dist/indexers/CosignIndexer.d.ts.map +1 -0
  71. package/dist/indexers/CosignIndexer.js +27 -0
  72. package/dist/indexers/CosignIndexer.js.map +1 -0
  73. package/dist/indexers/FundIndexer.d.ts +20 -0
  74. package/dist/indexers/FundIndexer.d.ts.map +1 -0
  75. package/dist/indexers/FundIndexer.js +65 -0
  76. package/dist/indexers/FundIndexer.js.map +1 -0
  77. package/dist/indexers/InscriptionIndexer.d.ts +33 -0
  78. package/dist/indexers/InscriptionIndexer.d.ts.map +1 -0
  79. package/dist/indexers/InscriptionIndexer.js +116 -0
  80. package/dist/indexers/InscriptionIndexer.js.map +1 -0
  81. package/dist/indexers/LockIndexer.d.ts +11 -0
  82. package/dist/indexers/LockIndexer.d.ts.map +1 -0
  83. package/dist/indexers/LockIndexer.js +44 -0
  84. package/dist/indexers/LockIndexer.js.map +1 -0
  85. package/dist/indexers/MapIndexer.d.ts +14 -0
  86. package/dist/indexers/MapIndexer.d.ts.map +1 -0
  87. package/dist/indexers/MapIndexer.js +65 -0
  88. package/dist/indexers/MapIndexer.js.map +1 -0
  89. package/dist/indexers/OpNSIndexer.d.ts +10 -0
  90. package/dist/indexers/OpNSIndexer.d.ts.map +1 -0
  91. package/dist/indexers/OpNSIndexer.js +39 -0
  92. package/dist/indexers/OpNSIndexer.js.map +1 -0
  93. package/dist/indexers/OrdLockIndexer.d.ts +18 -0
  94. package/dist/indexers/OrdLockIndexer.d.ts.map +1 -0
  95. package/dist/indexers/OrdLockIndexer.js +65 -0
  96. package/dist/indexers/OrdLockIndexer.js.map +1 -0
  97. package/dist/indexers/OriginIndexer.d.ts +38 -0
  98. package/dist/indexers/OriginIndexer.d.ts.map +1 -0
  99. package/dist/indexers/OriginIndexer.js +241 -0
  100. package/dist/indexers/OriginIndexer.js.map +1 -0
  101. package/dist/indexers/Outpoint.d.ts +11 -0
  102. package/dist/indexers/Outpoint.d.ts.map +1 -0
  103. package/dist/indexers/Outpoint.js +62 -0
  104. package/dist/indexers/Outpoint.js.map +1 -0
  105. package/dist/indexers/SigmaIndexer.d.ts +29 -0
  106. package/dist/indexers/SigmaIndexer.d.ts.map +1 -0
  107. package/dist/indexers/SigmaIndexer.js +134 -0
  108. package/dist/indexers/SigmaIndexer.js.map +1 -0
  109. package/dist/indexers/index.d.ts +14 -0
  110. package/dist/indexers/index.d.ts.map +1 -0
  111. package/dist/indexers/index.js +14 -0
  112. package/dist/indexers/index.js.map +1 -0
  113. package/dist/indexers/parseAddress.d.ts +10 -0
  114. package/dist/indexers/parseAddress.d.ts.map +1 -0
  115. package/dist/indexers/parseAddress.js +25 -0
  116. package/dist/indexers/parseAddress.js.map +1 -0
  117. package/dist/signers/ReadOnlySigner.d.ts +16 -0
  118. package/dist/signers/ReadOnlySigner.d.ts.map +1 -0
  119. package/dist/signers/ReadOnlySigner.js +48 -0
  120. package/dist/signers/ReadOnlySigner.js.map +1 -0
  121. package/package.json +8 -6
@@ -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"}
@@ -0,0 +1,241 @@
1
+ import { HttpError } from '@1sat/client';
2
+ import { Indexer, } from '@1sat/types';
3
+ import { parseAddress } from './parseAddress';
4
+ export class OriginIndexer extends Indexer {
5
+ owners;
6
+ network;
7
+ services;
8
+ tag = 'origin';
9
+ name = 'Origins';
10
+ constructor(owners, network, services) {
11
+ super(owners, network);
12
+ this.owners = owners;
13
+ this.network = network;
14
+ this.services = services;
15
+ }
16
+ /**
17
+ * Parse identifies 1-sat ordinal outputs and extracts basic data.
18
+ * Origin tracking (determining if transfer vs new) is done in summarize()
19
+ * since it requires cross-output and cross-input context.
20
+ */
21
+ async parse(txo) {
22
+ const satoshis = BigInt(txo.output.satoshis || 0);
23
+ // Only parse 1-satoshi outputs, exclude BSV-20 tokens
24
+ if (satoshis !== 1n)
25
+ return;
26
+ const insc = txo.data.insc?.data;
27
+ if (insc?.file?.type === 'application/bsv-20')
28
+ return;
29
+ // Parse the address
30
+ const script = txo.output.lockingScript;
31
+ const address = parseAddress(script, 0, this.network);
32
+ // Start with placeholder origin - will be populated in summarize()
33
+ const origin = {
34
+ outpoint: '', // Will be set in summarize()
35
+ nonce: 0,
36
+ sigma: txo.data.sigma?.data,
37
+ };
38
+ // Merge current output's MAP data
39
+ const currentMap = txo.data.map?.data;
40
+ if (currentMap) {
41
+ origin.map = { ...currentMap };
42
+ }
43
+ // If current output has inscription, use it
44
+ if (insc) {
45
+ origin.insc = insc;
46
+ }
47
+ return {
48
+ data: origin,
49
+ tags: [], // Tags will be added in summarize() once origin is determined
50
+ owner: address,
51
+ basket: '1sat',
52
+ };
53
+ }
54
+ /**
55
+ * Summarize determines origin tracking (transfer vs new origin) and
56
+ * fetches metadata from OrdFS for transfers.
57
+ */
58
+ async summarize(ctx) {
59
+ // First, calculate satoshi positions and determine origins for all outputs
60
+ await this.resolveOrigins(ctx);
61
+ // Now compute balance summary
62
+ let balance = 0;
63
+ let hasTag = false;
64
+ let icon;
65
+ let id = '';
66
+ // Check inputs
67
+ for (const spend of ctx.spends) {
68
+ if (spend.data[this.tag]) {
69
+ const origin = spend.data[this.tag].data;
70
+ if (spend.owner && this.owners.has(spend.owner)) {
71
+ hasTag = true;
72
+ balance--;
73
+ if (!icon && origin?.insc?.file?.type.startsWith('image/')) {
74
+ icon = origin?.outpoint;
75
+ id = origin.map?.name || '';
76
+ }
77
+ }
78
+ }
79
+ }
80
+ // Check outputs
81
+ for (const txo of ctx.txos) {
82
+ if (txo.data[this.tag]) {
83
+ if (txo.owner && this.owners.has(txo.owner)) {
84
+ hasTag = true;
85
+ balance++;
86
+ const origin = txo.data.origin?.data;
87
+ if (!icon && origin?.insc?.file?.type.startsWith('image/')) {
88
+ icon = origin?.outpoint;
89
+ }
90
+ }
91
+ // Clear file content before saving - content is loaded locally but shouldn't be persisted
92
+ const origin = txo.data[this.tag].data;
93
+ if (origin?.insc?.file) {
94
+ origin.insc.file.content = [];
95
+ }
96
+ }
97
+ }
98
+ if (hasTag) {
99
+ return {
100
+ id,
101
+ amount: balance,
102
+ icon,
103
+ };
104
+ }
105
+ }
106
+ /**
107
+ * Resolve origins for all 1-sat outputs in the transaction.
108
+ * This determines whether each is a new origin or a transfer.
109
+ */
110
+ async resolveOrigins(ctx) {
111
+ // Calculate satoshi positions for all outputs
112
+ const satPositions = [];
113
+ let cumulative = 0n;
114
+ for (const txo of ctx.txos) {
115
+ satPositions.push(cumulative);
116
+ cumulative += BigInt(txo.output.satoshis || 0);
117
+ }
118
+ // Process each output that has origin data
119
+ for (let vout = 0; vout < ctx.txos.length; vout++) {
120
+ const txo = ctx.txos[vout];
121
+ const originData = txo.data[this.tag];
122
+ if (!originData)
123
+ continue;
124
+ const origin = originData.data;
125
+ const outSat = satPositions[vout];
126
+ // Track accumulated input satoshis to find which input contains our satoshi
127
+ let satsIn = 0n;
128
+ let sourceOutpoint;
129
+ for (const spend of ctx.spends) {
130
+ const spendSatoshis = BigInt(spend.output.satoshis || 0);
131
+ // Check if this input's satoshi range contains our output's satoshi
132
+ if (satsIn === outSat && spendSatoshis === 1n) {
133
+ sourceOutpoint = spend.outpoint.toOrdinalString();
134
+ break;
135
+ }
136
+ satsIn += spendSatoshis;
137
+ // If we've passed our satoshi position, this is a new origin
138
+ if (satsIn > outSat) {
139
+ break;
140
+ }
141
+ }
142
+ if (sourceOutpoint) {
143
+ // Transfer - fetch metadata from OrdFS
144
+ try {
145
+ const metadata = await this.services.ordfs.getMetadata(sourceOutpoint, 0);
146
+ origin.outpoint = metadata.origin || sourceOutpoint;
147
+ origin.nonce = metadata.sequence + 1;
148
+ // Merge inherited map with current
149
+ if (metadata.map) {
150
+ origin.map = { ...metadata.map, ...(origin.map || {}) };
151
+ }
152
+ // If no inscription on current output, use metadata from source
153
+ // and potentially fetch text content
154
+ if (!origin.insc) {
155
+ origin.insc = {
156
+ file: {
157
+ hash: '',
158
+ size: metadata.contentLength,
159
+ type: metadata.contentType,
160
+ content: [],
161
+ },
162
+ };
163
+ // Fetch text content if it qualifies
164
+ const contentType = metadata.contentType.toLowerCase();
165
+ const isTextContent = contentType.startsWith('text/') ||
166
+ contentType === 'application/json';
167
+ if (isTextContent && metadata.contentLength <= 1000) {
168
+ try {
169
+ const { data } = await this.services.ordfs.getContent(origin.outpoint || sourceOutpoint);
170
+ if (data) {
171
+ originData.content = new TextDecoder().decode(data);
172
+ }
173
+ }
174
+ catch {
175
+ // Ignore content fetch errors
176
+ }
177
+ }
178
+ }
179
+ }
180
+ catch (e) {
181
+ if (e instanceof HttpError && e.status === 404) {
182
+ // Source outpoint not found in OrdFS - treat as new origin
183
+ origin.outpoint = txo.outpoint.toOrdinalString();
184
+ }
185
+ else {
186
+ throw e;
187
+ }
188
+ }
189
+ }
190
+ else {
191
+ // New origin
192
+ origin.outpoint = txo.outpoint.toOrdinalString();
193
+ }
194
+ // Validate parent if inscription claims one
195
+ const insc = txo.data.insc?.data;
196
+ if (insc?.parent) {
197
+ try {
198
+ const metadata = await this.services.ordfs.getMetadata(txo.outpoint.toOrdinalString(), 0);
199
+ if (metadata.parent !== insc.parent) {
200
+ if (origin.insc) {
201
+ origin.insc.parent = undefined;
202
+ }
203
+ }
204
+ }
205
+ catch (e) {
206
+ if (e instanceof HttpError && e.status === 404) {
207
+ // Can't verify parent claim - remove it
208
+ if (origin.insc) {
209
+ origin.insc.parent = undefined;
210
+ }
211
+ }
212
+ else {
213
+ throw e;
214
+ }
215
+ }
216
+ }
217
+ // Clear large file content to save space
218
+ if (origin.insc?.file?.size && origin.insc.file.size > 4096) {
219
+ origin.insc.file.content = [];
220
+ }
221
+ // Now add tags since origin is determined
222
+ if (txo.owner && this.owners.has(txo.owner)) {
223
+ originData.tags.push(`origin:${origin.outpoint || ''}`);
224
+ if (origin.insc?.file?.type) {
225
+ const fullType = origin.insc.file.type;
226
+ const baseType = fullType.split(';')[0].trim();
227
+ const category = baseType.split('/')[0];
228
+ originData.tags.push(`type:${category}`);
229
+ originData.tags.push(`type:${baseType}`);
230
+ }
231
+ // Extract name from map data
232
+ const name = (origin.map?.name ??
233
+ origin.map?.subTypeData?.name);
234
+ if (name) {
235
+ originData.tags.push(`name:${name}`);
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ //# sourceMappingURL=OriginIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OriginIndexer.js","sourceRoot":"","sources":["../../src/indexers/OriginIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class Outpoint {
2
+ txid: string;
3
+ vout: number;
4
+ constructor(txidOrOutpoint: string | number[] | Outpoint, vout?: number);
5
+ toString(): string;
6
+ toOrdinalString(): string;
7
+ toBinary(): number[];
8
+ toBEBinary(): number[];
9
+ toJSON(): string;
10
+ }
11
+ //# sourceMappingURL=Outpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Outpoint.d.ts","sourceRoot":"","sources":["../../src/indexers/Outpoint.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAQ;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;gBAEA,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM;IAgCvE,QAAQ,IAAI,MAAM;IAIlB,eAAe,IAAI,MAAM;IAIzB,QAAQ,IAAI,MAAM,EAAE;IAOpB,UAAU,IAAI,MAAM,EAAE;IAOtB,MAAM,IAAI,MAAM;CAGhB"}
@@ -0,0 +1,62 @@
1
+ import { Utils } from '@bsv/sdk';
2
+ export class Outpoint {
3
+ txid;
4
+ vout;
5
+ constructor(txidOrOutpoint, vout) {
6
+ if (vout !== undefined) {
7
+ this.vout = vout;
8
+ if (typeof txidOrOutpoint === 'string') {
9
+ this.txid = txidOrOutpoint;
10
+ }
11
+ else if (Array.isArray(txidOrOutpoint)) {
12
+ this.txid = Utils.toHex(txidOrOutpoint);
13
+ }
14
+ else {
15
+ throw new Error('Invalid Outpoint');
16
+ }
17
+ }
18
+ else if (Array.isArray(txidOrOutpoint)) {
19
+ const reader = new Utils.Reader(txidOrOutpoint);
20
+ this.txid = Utils.toHex(reader.read(32).reverse());
21
+ this.vout = reader.readInt32LE();
22
+ }
23
+ else if (typeof txidOrOutpoint === 'string') {
24
+ this.txid = txidOrOutpoint.substring(0, 64);
25
+ // Support both separators: period (SDK canonical) or underscore (1sat legacy)
26
+ const separator = txidOrOutpoint[64];
27
+ if (separator !== '.' && separator !== '_') {
28
+ throw new Error(`Invalid outpoint separator: expected '.' or '_', got '${separator}'`);
29
+ }
30
+ this.vout = Number.parseInt(txidOrOutpoint.substring(65), 10);
31
+ }
32
+ else if (typeof txidOrOutpoint === 'object') {
33
+ this.txid = txidOrOutpoint.txid;
34
+ this.vout = txidOrOutpoint.vout;
35
+ }
36
+ else {
37
+ throw new Error('Invalid Outpoint');
38
+ }
39
+ }
40
+ toString() {
41
+ return `${this.txid}.${this.vout}`;
42
+ }
43
+ toOrdinalString() {
44
+ return `${this.txid}_${this.vout}`;
45
+ }
46
+ toBinary() {
47
+ const writer = new Utils.Writer();
48
+ writer.write(Utils.toArray(this.txid, 'hex').reverse());
49
+ writer.writeUInt32LE(this.vout);
50
+ return writer.toArray();
51
+ }
52
+ toBEBinary() {
53
+ const writer = new Utils.Writer();
54
+ writer.write(Utils.toArray(this.txid, 'hex'));
55
+ writer.writeUInt32BE(this.vout);
56
+ return writer.toArray();
57
+ }
58
+ toJSON() {
59
+ return this.toString();
60
+ }
61
+ }
62
+ //# sourceMappingURL=Outpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Outpoint.js","sourceRoot":"","sources":["../../src/indexers/Outpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Indexer, type ParseContext, type ParseResult, type Txo } from '@1sat/types';
2
+ export interface Sigma {
3
+ algorithm: string;
4
+ address: string;
5
+ signature: number[];
6
+ vin: number;
7
+ valid: boolean;
8
+ }
9
+ export declare class SigmaIndexer extends Indexer {
10
+ owners: Set<string>;
11
+ network: 'mainnet' | 'testnet';
12
+ tag: string;
13
+ name: string;
14
+ constructor(owners?: Set<string>, network?: 'mainnet' | 'testnet');
15
+ /**
16
+ * Parse extracts raw sigma protocol data without validation.
17
+ * Validation requires ctx.spends and is done in summarize().
18
+ */
19
+ parse(txo: Txo): Promise<ParseResult | undefined>;
20
+ /**
21
+ * Validate all sigma signatures against ctx.spends.
22
+ */
23
+ summarize(ctx: ParseContext, _isBroadcasted: boolean): Promise<undefined>;
24
+ /**
25
+ * Find the data position for a sigma in the script (position before the pipe separator).
26
+ */
27
+ private findSigmaDataPos;
28
+ }
29
+ //# sourceMappingURL=SigmaIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SigmaIndexer.d.ts","sourceRoot":"","sources":["../../src/indexers/SigmaIndexer.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,MAAM,aAAa,CAAA;AAGpB,MAAM,WAAW,KAAK;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;CACd;AAED,qBAAa,YAAa,SAAQ,OAAO;IAKhC,MAAM;IACN,OAAO,EAAE,SAAS,GAAG,SAAS;IALtC,GAAG,SAAU;IACb,IAAI,SAAU;gBAGN,MAAM,cAAoB,EAC1B,OAAO,GAAE,SAAS,GAAG,SAAqB;IAKlD;;;OAGG;IACG,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA6CvD;;OAEG;IACG,SAAS,CACd,GAAG,EAAE,YAAY,EACjB,cAAc,EAAE,OAAO,GACrB,OAAO,CAAC,SAAS,CAAC;IAoDrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAoCxB"}