@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.
- package/dist/OneSatWallet.d.ts +222 -0
- package/dist/OneSatWallet.d.ts.map +1 -0
- package/dist/OneSatWallet.js +754 -0
- package/dist/OneSatWallet.js.map +1 -0
- package/dist/address-sync/AddressManager.d.ts +86 -0
- package/dist/address-sync/AddressManager.d.ts.map +1 -0
- package/dist/address-sync/AddressManager.js +108 -0
- package/dist/address-sync/AddressManager.js.map +1 -0
- package/dist/address-sync/AddressSyncManager.d.ts +204 -0
- package/dist/address-sync/AddressSyncManager.d.ts.map +1 -0
- package/dist/address-sync/AddressSyncManager.js +525 -0
- package/dist/address-sync/AddressSyncManager.js.map +1 -0
- package/dist/address-sync/AddressSyncQueueIdb.d.ts +31 -0
- package/dist/address-sync/AddressSyncQueueIdb.d.ts.map +1 -0
- package/dist/address-sync/AddressSyncQueueIdb.js +356 -0
- package/dist/address-sync/AddressSyncQueueIdb.js.map +1 -0
- package/dist/address-sync/AddressSyncQueueSqlite.d.ts +55 -0
- package/dist/address-sync/AddressSyncQueueSqlite.d.ts.map +1 -0
- package/dist/address-sync/AddressSyncQueueSqlite.js +198 -0
- package/dist/address-sync/AddressSyncQueueSqlite.js.map +1 -0
- package/dist/address-sync/index.d.ts +8 -0
- package/dist/address-sync/index.d.ts.map +1 -0
- package/dist/address-sync/index.js +5 -0
- package/dist/address-sync/index.js.map +1 -0
- package/dist/backup/FileBackupProvider.d.ts +97 -0
- package/dist/backup/FileBackupProvider.d.ts.map +1 -0
- package/dist/backup/FileBackupProvider.js +185 -0
- package/dist/backup/FileBackupProvider.js.map +1 -0
- package/dist/backup/FileRestoreReader.d.ts +59 -0
- package/dist/backup/FileRestoreReader.d.ts.map +1 -0
- package/dist/backup/FileRestoreReader.js +89 -0
- package/dist/backup/FileRestoreReader.js.map +1 -0
- package/dist/backup/index.d.ts +6 -0
- package/dist/backup/index.d.ts.map +1 -0
- package/dist/backup/index.js +5 -0
- package/dist/backup/index.js.map +1 -0
- package/dist/backup/types.d.ts +32 -0
- package/dist/backup/types.d.ts.map +1 -0
- package/dist/backup/types.js +2 -0
- package/dist/backup/types.js.map +1 -0
- package/dist/cwi/chrome.d.ts +12 -0
- package/dist/cwi/chrome.d.ts.map +1 -0
- package/dist/cwi/chrome.js +44 -0
- package/dist/cwi/chrome.js.map +1 -0
- package/dist/cwi/event.d.ts +12 -0
- package/dist/cwi/event.d.ts.map +1 -0
- package/dist/cwi/event.js +39 -0
- package/dist/cwi/event.js.map +1 -0
- package/dist/cwi/factory.d.ts +15 -0
- package/dist/cwi/factory.d.ts.map +1 -0
- package/dist/cwi/factory.js +45 -0
- package/dist/cwi/factory.js.map +1 -0
- package/dist/cwi/index.d.ts +12 -0
- package/dist/cwi/index.d.ts.map +1 -0
- package/dist/cwi/index.js +12 -0
- package/dist/cwi/index.js.map +1 -0
- package/dist/cwi/types.d.ts +40 -0
- package/dist/cwi/types.d.ts.map +1 -0
- package/dist/cwi/types.js +40 -0
- package/dist/cwi/types.js.map +1 -0
- package/dist/index.d.ts +17 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -21
- package/dist/index.js.map +1 -1
- package/dist/indexers/Bsv21Indexer.d.ts +36 -0
- package/dist/indexers/Bsv21Indexer.d.ts.map +1 -0
- package/dist/indexers/Bsv21Indexer.js +232 -0
- package/dist/indexers/Bsv21Indexer.js.map +1 -0
- package/dist/indexers/CosignIndexer.d.ts +14 -0
- package/dist/indexers/CosignIndexer.d.ts.map +1 -0
- package/dist/indexers/CosignIndexer.js +27 -0
- package/dist/indexers/CosignIndexer.js.map +1 -0
- package/dist/indexers/FundIndexer.d.ts +20 -0
- package/dist/indexers/FundIndexer.d.ts.map +1 -0
- package/dist/indexers/FundIndexer.js +65 -0
- package/dist/indexers/FundIndexer.js.map +1 -0
- package/dist/indexers/InscriptionIndexer.d.ts +33 -0
- package/dist/indexers/InscriptionIndexer.d.ts.map +1 -0
- package/dist/indexers/InscriptionIndexer.js +116 -0
- package/dist/indexers/InscriptionIndexer.js.map +1 -0
- package/dist/indexers/LockIndexer.d.ts +11 -0
- package/dist/indexers/LockIndexer.d.ts.map +1 -0
- package/dist/indexers/LockIndexer.js +44 -0
- package/dist/indexers/LockIndexer.js.map +1 -0
- package/dist/indexers/MapIndexer.d.ts +14 -0
- package/dist/indexers/MapIndexer.d.ts.map +1 -0
- package/dist/indexers/MapIndexer.js +65 -0
- package/dist/indexers/MapIndexer.js.map +1 -0
- package/dist/indexers/OpNSIndexer.d.ts +10 -0
- package/dist/indexers/OpNSIndexer.d.ts.map +1 -0
- package/dist/indexers/OpNSIndexer.js +39 -0
- package/dist/indexers/OpNSIndexer.js.map +1 -0
- package/dist/indexers/OrdLockIndexer.d.ts +18 -0
- package/dist/indexers/OrdLockIndexer.d.ts.map +1 -0
- package/dist/indexers/OrdLockIndexer.js +65 -0
- package/dist/indexers/OrdLockIndexer.js.map +1 -0
- package/dist/indexers/OriginIndexer.d.ts +38 -0
- package/dist/indexers/OriginIndexer.d.ts.map +1 -0
- package/dist/indexers/OriginIndexer.js +241 -0
- package/dist/indexers/OriginIndexer.js.map +1 -0
- package/dist/indexers/Outpoint.d.ts +11 -0
- package/dist/indexers/Outpoint.d.ts.map +1 -0
- package/dist/indexers/Outpoint.js +62 -0
- package/dist/indexers/Outpoint.js.map +1 -0
- package/dist/indexers/SigmaIndexer.d.ts +29 -0
- package/dist/indexers/SigmaIndexer.d.ts.map +1 -0
- package/dist/indexers/SigmaIndexer.js +134 -0
- package/dist/indexers/SigmaIndexer.js.map +1 -0
- package/dist/indexers/index.d.ts +14 -0
- package/dist/indexers/index.d.ts.map +1 -0
- package/dist/indexers/index.js +14 -0
- package/dist/indexers/index.js.map +1 -0
- package/dist/indexers/parseAddress.d.ts +10 -0
- package/dist/indexers/parseAddress.d.ts.map +1 -0
- package/dist/indexers/parseAddress.js +25 -0
- package/dist/indexers/parseAddress.js.map +1 -0
- package/dist/signers/ReadOnlySigner.d.ts +16 -0
- package/dist/signers/ReadOnlySigner.d.ts.map +1 -0
- package/dist/signers/ReadOnlySigner.js +48 -0
- package/dist/signers/ReadOnlySigner.js.map +1 -0
- 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"}
|