@aibtc/mcp-server 1.7.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -9
- package/dist/config/bitcoin-constants.d.ts +32 -0
- package/dist/config/bitcoin-constants.d.ts.map +1 -0
- package/dist/config/bitcoin-constants.js +32 -0
- package/dist/config/bitcoin-constants.js.map +1 -0
- package/dist/config/contracts.d.ts +12 -3
- package/dist/config/contracts.d.ts.map +1 -1
- package/dist/config/contracts.js +7 -1
- package/dist/config/contracts.js.map +1 -1
- package/dist/endpoints/registry.d.ts +3 -3
- package/dist/endpoints/registry.d.ts.map +1 -1
- package/dist/endpoints/registry.js +187 -3
- package/dist/endpoints/registry.js.map +1 -1
- package/dist/services/bitflow.service.d.ts +2 -1
- package/dist/services/bitflow.service.d.ts.map +1 -1
- package/dist/services/bitflow.service.js +3 -1
- package/dist/services/bitflow.service.js.map +1 -1
- package/dist/services/bns.service.d.ts +21 -5
- package/dist/services/bns.service.d.ts.map +1 -1
- package/dist/services/bns.service.js +145 -51
- package/dist/services/bns.service.js.map +1 -1
- package/dist/services/defi.service.d.ts +16 -6
- package/dist/services/defi.service.d.ts.map +1 -1
- package/dist/services/defi.service.js +99 -27
- package/dist/services/defi.service.js.map +1 -1
- package/dist/services/hiro-api.d.ts +26 -0
- package/dist/services/hiro-api.d.ts.map +1 -1
- package/dist/services/hiro-api.js +8 -0
- package/dist/services/hiro-api.js.map +1 -1
- package/dist/services/inscription-parser.d.ts +122 -0
- package/dist/services/inscription-parser.d.ts.map +1 -0
- package/dist/services/inscription-parser.js +163 -0
- package/dist/services/inscription-parser.js.map +1 -0
- package/dist/services/nft.service.d.ts +2 -1
- package/dist/services/nft.service.d.ts.map +1 -1
- package/dist/services/nft.service.js +3 -1
- package/dist/services/nft.service.js.map +1 -1
- package/dist/services/ordinal-indexer.d.ts +128 -0
- package/dist/services/ordinal-indexer.d.ts.map +1 -0
- package/dist/services/ordinal-indexer.js +128 -0
- package/dist/services/ordinal-indexer.js.map +1 -0
- package/dist/services/sbtc.service.d.ts +2 -1
- package/dist/services/sbtc.service.d.ts.map +1 -1
- package/dist/services/sbtc.service.js +3 -1
- package/dist/services/sbtc.service.js.map +1 -1
- package/dist/services/tokens.service.d.ts +2 -1
- package/dist/services/tokens.service.d.ts.map +1 -1
- package/dist/services/tokens.service.js +3 -1
- package/dist/services/tokens.service.js.map +1 -1
- package/dist/services/wallet-manager.d.ts +20 -12
- package/dist/services/wallet-manager.d.ts.map +1 -1
- package/dist/services/wallet-manager.js +41 -62
- package/dist/services/wallet-manager.js.map +1 -1
- package/dist/tools/bitcoin.tools.d.ts.map +1 -1
- package/dist/tools/bitcoin.tools.js +214 -34
- package/dist/tools/bitcoin.tools.js.map +1 -1
- package/dist/tools/bitflow.tools.d.ts.map +1 -1
- package/dist/tools/bitflow.tools.js +8 -3
- package/dist/tools/bitflow.tools.js.map +1 -1
- package/dist/tools/bns.tools.d.ts.map +1 -1
- package/dist/tools/bns.tools.js +87 -7
- package/dist/tools/bns.tools.js.map +1 -1
- package/dist/tools/contract.tools.d.ts.map +1 -1
- package/dist/tools/contract.tools.js +19 -4
- package/dist/tools/contract.tools.js.map +1 -1
- package/dist/tools/defi.tools.d.ts.map +1 -1
- package/dist/tools/defi.tools.js +43 -0
- package/dist/tools/defi.tools.js.map +1 -1
- package/dist/tools/index.d.ts +8 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +49 -32
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/nft.tools.d.ts.map +1 -1
- package/dist/tools/nft.tools.js +8 -3
- package/dist/tools/nft.tools.js.map +1 -1
- package/dist/tools/ordinals.tools.d.ts +15 -0
- package/dist/tools/ordinals.tools.d.ts.map +1 -0
- package/dist/tools/ordinals.tools.js +401 -0
- package/dist/tools/ordinals.tools.js.map +1 -0
- package/dist/tools/query.tools.d.ts.map +1 -1
- package/dist/tools/query.tools.js +71 -0
- package/dist/tools/query.tools.js.map +1 -1
- package/dist/tools/sbtc.tools.d.ts.map +1 -1
- package/dist/tools/sbtc.tools.js +8 -3
- package/dist/tools/sbtc.tools.js.map +1 -1
- package/dist/tools/signing.tools.d.ts +25 -0
- package/dist/tools/signing.tools.d.ts.map +1 -0
- package/dist/tools/signing.tools.js +776 -0
- package/dist/tools/signing.tools.js.map +1 -0
- package/dist/tools/tokens.tools.d.ts.map +1 -1
- package/dist/tools/tokens.tools.js +8 -3
- package/dist/tools/tokens.tools.js.map +1 -1
- package/dist/tools/transfer.tools.d.ts.map +1 -1
- package/dist/tools/transfer.tools.js +8 -3
- package/dist/tools/transfer.tools.js.map +1 -1
- package/dist/tools/wallet-management.tools.d.ts.map +1 -1
- package/dist/tools/wallet-management.tools.js +36 -11
- package/dist/tools/wallet-management.tools.js.map +1 -1
- package/dist/tools/wallet.tools.d.ts.map +1 -1
- package/dist/tools/wallet.tools.js +23 -8
- package/dist/tools/wallet.tools.js.map +1 -1
- package/dist/tools/yield-hunter.tools.d.ts.map +1 -1
- package/dist/tools/yield-hunter.tools.js +53 -48
- package/dist/tools/yield-hunter.tools.js.map +1 -1
- package/dist/transactions/bitcoin-builder.d.ts.map +1 -1
- package/dist/transactions/bitcoin-builder.js +1 -16
- package/dist/transactions/bitcoin-builder.js.map +1 -1
- package/dist/transactions/builder.d.ts +9 -5
- package/dist/transactions/builder.d.ts.map +1 -1
- package/dist/transactions/builder.js +8 -2
- package/dist/transactions/builder.js.map +1 -1
- package/dist/transactions/inscription-builder.d.ts +183 -0
- package/dist/transactions/inscription-builder.d.ts.map +1 -0
- package/dist/transactions/inscription-builder.js +230 -0
- package/dist/transactions/inscription-builder.js.map +1 -0
- package/dist/utils/bitcoin.d.ts +38 -0
- package/dist/utils/bitcoin.d.ts.map +1 -1
- package/dist/utils/bitcoin.js +59 -0
- package/dist/utils/bitcoin.js.map +1 -1
- package/dist/utils/fee.d.ts +41 -0
- package/dist/utils/fee.d.ts.map +1 -0
- package/dist/utils/fee.js +69 -0
- package/dist/utils/fee.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/storage.d.ts +12 -4
- package/dist/utils/storage.d.ts.map +1 -1
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/tokens.d.ts +13 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +24 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/yield-hunter/index.d.ts.map +1 -1
- package/dist/yield-hunter/index.js +10 -15
- package/dist/yield-hunter/index.js.map +1 -1
- package/package.json +7 -3
- package/skill/README.md +108 -0
- package/skill/SKILL.md +187 -0
- package/skill/references/pillar-wallet.md +213 -0
- package/skill/references/stacks-defi.md +258 -0
- package/skill/references/troubleshooting.md +211 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inscription Parser Service
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around micro-ordinals library for parsing inscriptions from
|
|
5
|
+
* Bitcoin transaction witness data and scripts.
|
|
6
|
+
*
|
|
7
|
+
* micro-ordinals API:
|
|
8
|
+
* - parseWitness(witness: Bytes[]): Inscription[] | undefined
|
|
9
|
+
* - parseInscriptions(script: ScriptType, strict?: boolean): Inscription[] | undefined
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://github.com/paulmillr/micro-ordinals
|
|
12
|
+
*/
|
|
13
|
+
import { type Inscription } from "micro-ordinals";
|
|
14
|
+
import type { Network } from "../config/networks.js";
|
|
15
|
+
/**
|
|
16
|
+
* Parsed inscription with metadata
|
|
17
|
+
*/
|
|
18
|
+
export interface ParsedInscription {
|
|
19
|
+
/**
|
|
20
|
+
* Content type (e.g., "text/plain", "image/png")
|
|
21
|
+
*/
|
|
22
|
+
contentType?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Inscription body as bytes
|
|
25
|
+
*/
|
|
26
|
+
body: Uint8Array;
|
|
27
|
+
/**
|
|
28
|
+
* Inscription body as UTF-8 string (if text content)
|
|
29
|
+
*/
|
|
30
|
+
bodyText?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Inscription body as base64 (for binary content)
|
|
33
|
+
*/
|
|
34
|
+
bodyBase64: string;
|
|
35
|
+
/**
|
|
36
|
+
* Whether this is a cursed inscription
|
|
37
|
+
*/
|
|
38
|
+
cursed?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Pointer tag (if present)
|
|
41
|
+
*/
|
|
42
|
+
pointer?: bigint;
|
|
43
|
+
/**
|
|
44
|
+
* Metaprotocol (if present)
|
|
45
|
+
*/
|
|
46
|
+
metaprotocol?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Content encoding (if present, e.g., "br" for Brotli)
|
|
49
|
+
*/
|
|
50
|
+
contentEncoding?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Metadata (if present)
|
|
53
|
+
*/
|
|
54
|
+
metadata?: any;
|
|
55
|
+
/**
|
|
56
|
+
* Rune tag (if present)
|
|
57
|
+
*/
|
|
58
|
+
rune?: bigint;
|
|
59
|
+
/**
|
|
60
|
+
* Note tag (if present)
|
|
61
|
+
*/
|
|
62
|
+
note?: string;
|
|
63
|
+
/**
|
|
64
|
+
* All tags from the inscription (raw, may contain Coder objects)
|
|
65
|
+
*/
|
|
66
|
+
rawTags: Inscription["tags"];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Inscription Parser Service
|
|
70
|
+
*/
|
|
71
|
+
export declare class InscriptionParser {
|
|
72
|
+
private readonly network;
|
|
73
|
+
private readonly mempoolApiUrl;
|
|
74
|
+
constructor(network: Network);
|
|
75
|
+
/**
|
|
76
|
+
* Parse inscriptions from transaction witness data
|
|
77
|
+
*
|
|
78
|
+
* This is the primary method for extracting inscriptions from reveal transactions.
|
|
79
|
+
* The witness data is typically in the first input of a reveal transaction.
|
|
80
|
+
*
|
|
81
|
+
* @param witness - Array of hex-encoded witness elements
|
|
82
|
+
* @returns Array of parsed inscriptions, or undefined if no inscriptions found
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const parser = new InscriptionParser('mainnet');
|
|
87
|
+
* const inscriptions = parser.parseWitness(tx.vin[0].witness);
|
|
88
|
+
* if (inscriptions) {
|
|
89
|
+
* console.log(`Found ${inscriptions.length} inscriptions`);
|
|
90
|
+
* }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
parseWitness(witness: string[]): ParsedInscription[] | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* Fetch a transaction and parse inscriptions from its witness data
|
|
96
|
+
*
|
|
97
|
+
* This is a convenience method that fetches a transaction from mempool.space
|
|
98
|
+
* and extracts inscriptions from the first input's witness data (typical for
|
|
99
|
+
* reveal transactions).
|
|
100
|
+
*
|
|
101
|
+
* @param txid - Transaction ID
|
|
102
|
+
* @returns Array of parsed inscriptions, or undefined if no inscriptions found
|
|
103
|
+
* @throws Error if transaction fetch fails
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const parser = new InscriptionParser('mainnet');
|
|
108
|
+
* const inscriptions = await parser.getInscriptionsFromTx(revealTxid);
|
|
109
|
+
* if (inscriptions) {
|
|
110
|
+
* inscriptions.forEach(i => {
|
|
111
|
+
* console.log(`Type: ${i.contentType}, Size: ${i.body.length} bytes`);
|
|
112
|
+
* });
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
getInscriptionsFromTx(txid: string): Promise<ParsedInscription[] | undefined>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create an inscription parser for the given network
|
|
120
|
+
*/
|
|
121
|
+
export declare function createInscriptionParser(network: Network): InscriptionParser;
|
|
122
|
+
//# sourceMappingURL=inscription-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inscription-parser.d.ts","sourceRoot":"","sources":["../../src/services/inscription-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AA4CrD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,IAAI,EAAE,UAAU,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9B;AA0DD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,EAAE,OAAO;IAK5B;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,GAAG,SAAS;IAehE;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,qBAAqB,CACzB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,EAAE,GAAG,SAAS,CAAC;CAqC5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAE3E"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inscription Parser Service
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around micro-ordinals library for parsing inscriptions from
|
|
5
|
+
* Bitcoin transaction witness data and scripts.
|
|
6
|
+
*
|
|
7
|
+
* micro-ordinals API:
|
|
8
|
+
* - parseWitness(witness: Bytes[]): Inscription[] | undefined
|
|
9
|
+
* - parseInscriptions(script: ScriptType, strict?: boolean): Inscription[] | undefined
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://github.com/paulmillr/micro-ordinals
|
|
12
|
+
*/
|
|
13
|
+
import { parseWitness as microOrdinalsParseWitness, } from "micro-ordinals";
|
|
14
|
+
import { getMempoolApiUrl } from "./mempool-api.js";
|
|
15
|
+
/**
|
|
16
|
+
* Convert hex string to Uint8Array
|
|
17
|
+
*/
|
|
18
|
+
function hexToBytes(hex) {
|
|
19
|
+
if (hex.length % 2 !== 0) {
|
|
20
|
+
throw new Error("Invalid hex string");
|
|
21
|
+
}
|
|
22
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
23
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
24
|
+
bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
|
|
25
|
+
}
|
|
26
|
+
return bytes;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Convert Uint8Array to base64 string
|
|
30
|
+
*/
|
|
31
|
+
function bytesToBase64(bytes) {
|
|
32
|
+
// Use Buffer for Node.js environment
|
|
33
|
+
return Buffer.from(bytes).toString("base64");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Try to decode bytes as UTF-8 text
|
|
37
|
+
*/
|
|
38
|
+
function tryDecodeText(bytes) {
|
|
39
|
+
try {
|
|
40
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse and enhance inscription data from micro-ordinals
|
|
48
|
+
*/
|
|
49
|
+
function enhanceInscription(inscription) {
|
|
50
|
+
const bodyBase64 = bytesToBase64(inscription.body);
|
|
51
|
+
const bodyText = tryDecodeText(inscription.body);
|
|
52
|
+
return {
|
|
53
|
+
contentType: inscription.tags.contentType,
|
|
54
|
+
body: inscription.body,
|
|
55
|
+
bodyText,
|
|
56
|
+
bodyBase64,
|
|
57
|
+
cursed: inscription.cursed,
|
|
58
|
+
pointer: inscription.tags.pointer,
|
|
59
|
+
metaprotocol: inscription.tags.metaprotocol,
|
|
60
|
+
contentEncoding: inscription.tags.contentEncoding,
|
|
61
|
+
metadata: inscription.tags.metadata,
|
|
62
|
+
rune: inscription.tags.rune,
|
|
63
|
+
note: inscription.tags.note,
|
|
64
|
+
rawTags: inscription.tags,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Inscription Parser Service
|
|
69
|
+
*/
|
|
70
|
+
export class InscriptionParser {
|
|
71
|
+
network;
|
|
72
|
+
mempoolApiUrl;
|
|
73
|
+
constructor(network) {
|
|
74
|
+
this.network = network;
|
|
75
|
+
this.mempoolApiUrl = getMempoolApiUrl(network);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse inscriptions from transaction witness data
|
|
79
|
+
*
|
|
80
|
+
* This is the primary method for extracting inscriptions from reveal transactions.
|
|
81
|
+
* The witness data is typically in the first input of a reveal transaction.
|
|
82
|
+
*
|
|
83
|
+
* @param witness - Array of hex-encoded witness elements
|
|
84
|
+
* @returns Array of parsed inscriptions, or undefined if no inscriptions found
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const parser = new InscriptionParser('mainnet');
|
|
89
|
+
* const inscriptions = parser.parseWitness(tx.vin[0].witness);
|
|
90
|
+
* if (inscriptions) {
|
|
91
|
+
* console.log(`Found ${inscriptions.length} inscriptions`);
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
parseWitness(witness) {
|
|
96
|
+
// Convert hex strings to Uint8Array
|
|
97
|
+
const witnessBytes = witness.map((hex) => hexToBytes(hex));
|
|
98
|
+
// Parse inscriptions using micro-ordinals
|
|
99
|
+
const inscriptions = microOrdinalsParseWitness(witnessBytes);
|
|
100
|
+
if (!inscriptions || inscriptions.length === 0) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
// Enhance inscriptions with additional metadata
|
|
104
|
+
return inscriptions.map(enhanceInscription);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Fetch a transaction and parse inscriptions from its witness data
|
|
108
|
+
*
|
|
109
|
+
* This is a convenience method that fetches a transaction from mempool.space
|
|
110
|
+
* and extracts inscriptions from the first input's witness data (typical for
|
|
111
|
+
* reveal transactions).
|
|
112
|
+
*
|
|
113
|
+
* @param txid - Transaction ID
|
|
114
|
+
* @returns Array of parsed inscriptions, or undefined if no inscriptions found
|
|
115
|
+
* @throws Error if transaction fetch fails
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const parser = new InscriptionParser('mainnet');
|
|
120
|
+
* const inscriptions = await parser.getInscriptionsFromTx(revealTxid);
|
|
121
|
+
* if (inscriptions) {
|
|
122
|
+
* inscriptions.forEach(i => {
|
|
123
|
+
* console.log(`Type: ${i.contentType}, Size: ${i.body.length} bytes`);
|
|
124
|
+
* });
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
async getInscriptionsFromTx(txid) {
|
|
129
|
+
try {
|
|
130
|
+
// Fetch transaction from mempool.space
|
|
131
|
+
const response = await fetch(`${this.mempoolApiUrl}/tx/${txid}`);
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
const errorText = await response.text().catch(() => "Unknown error");
|
|
134
|
+
throw new Error(`Failed to fetch transaction ${txid}: ${response.status} ${response.statusText} - ${errorText}`);
|
|
135
|
+
}
|
|
136
|
+
const tx = (await response.json());
|
|
137
|
+
// Check if transaction has inputs with witness data
|
|
138
|
+
if (!tx.vin || tx.vin.length === 0) {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
// Try to parse witness data from first input (typical for reveal txs)
|
|
142
|
+
const firstInput = tx.vin[0];
|
|
143
|
+
if (!firstInput.witness || firstInput.witness.length === 0) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
// Parse inscriptions from witness
|
|
147
|
+
return this.parseWitness(firstInput.witness);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error instanceof Error) {
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
throw new Error(`Failed to get inscriptions from transaction: ${String(error)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create an inscription parser for the given network
|
|
159
|
+
*/
|
|
160
|
+
export function createInscriptionParser(network) {
|
|
161
|
+
return new InscriptionParser(network);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=inscription-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inscription-parser.js","sourceRoot":"","sources":["../../src/services/inscription-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,8 +59,9 @@ export declare class NftService {
|
|
|
59
59
|
}>;
|
|
60
60
|
/**
|
|
61
61
|
* Transfer an NFT (SIP-009 standard)
|
|
62
|
+
* @param fee Optional fee in micro-STX. If omitted, fee is auto-estimated.
|
|
62
63
|
*/
|
|
63
|
-
transfer(account: Account, contractId: string, tokenId: number, recipient: string): Promise<TransferResult>;
|
|
64
|
+
transfer(account: Account, contractId: string, tokenId: number, recipient: string, fee?: bigint): Promise<TransferResult>;
|
|
64
65
|
/**
|
|
65
66
|
* Mint an NFT (contract-specific, not part of SIP-009)
|
|
66
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nft.service.d.ts","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAY,MAAM,eAAe,CAAC;AACjF,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAM7F,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,qBAAa,UAAU;IAGT,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,IAAI,CAAiB;gBAET,OAAO,EAAE,OAAO;IAIpC;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GACjE,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAcjD;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxE;;OAEG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBzB;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmCvE;;OAEG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAiBzD
|
|
1
|
+
{"version":3,"file":"nft.service.d.ts","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAY,MAAM,eAAe,CAAC;AACjF,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAM7F,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,qBAAa,UAAU;IAGT,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,IAAI,CAAiB;gBAET,OAAO,EAAE,OAAO;IAIpC;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GACjE,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAcjD;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxE;;OAEG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBzB;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmCvE;;OAEG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAiBzD;;;OAGG;IACG,QAAQ,CACZ,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,CAAC;IAoB1B;;OAEG;IACG,IAAI,CACR,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,gBAAgB,GAAE,MAAe,GAChC,OAAO,CAAC,cAAc,CAAC;CAa3B;AAQD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAK1D"}
|
|
@@ -103,8 +103,9 @@ export class NftService {
|
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
105
105
|
* Transfer an NFT (SIP-009 standard)
|
|
106
|
+
* @param fee Optional fee in micro-STX. If omitted, fee is auto-estimated.
|
|
106
107
|
*/
|
|
107
|
-
async transfer(account, contractId, tokenId, recipient) {
|
|
108
|
+
async transfer(account, contractId, tokenId, recipient, fee) {
|
|
108
109
|
const { address: contractAddress, name: contractName } = parseContractId(contractId);
|
|
109
110
|
// SIP-009 transfer function signature:
|
|
110
111
|
// (transfer (token-id uint) (sender principal) (recipient principal))
|
|
@@ -118,6 +119,7 @@ export class NftService {
|
|
|
118
119
|
contractName,
|
|
119
120
|
functionName: "transfer",
|
|
120
121
|
functionArgs,
|
|
122
|
+
...(fee !== undefined && { fee }),
|
|
121
123
|
});
|
|
122
124
|
}
|
|
123
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nft.service.js","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nft.service.js","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordinal Indexer Service
|
|
3
|
+
*
|
|
4
|
+
* Combines Hiro Ordinals API with mempool.space to classify UTXOs:
|
|
5
|
+
* - Cardinal: Safe to spend (no inscriptions)
|
|
6
|
+
* - Ordinal: Contains inscriptions (must not spend accidentally)
|
|
7
|
+
*
|
|
8
|
+
* Uses free APIs:
|
|
9
|
+
* - Hiro Ordinals API: https://api.hiro.so/ordinals/v1/inscriptions?address={address}
|
|
10
|
+
* - mempool.space API: via MempoolApi service
|
|
11
|
+
*/
|
|
12
|
+
import type { Network } from "../config/networks.js";
|
|
13
|
+
import type { UTXO } from "./mempool-api.js";
|
|
14
|
+
/**
|
|
15
|
+
* Inscription data from Hiro Ordinals API
|
|
16
|
+
*/
|
|
17
|
+
export interface Inscription {
|
|
18
|
+
/**
|
|
19
|
+
* Inscription ID (txid + inscription number)
|
|
20
|
+
*/
|
|
21
|
+
id: string;
|
|
22
|
+
/**
|
|
23
|
+
* Inscription number (global ordinal)
|
|
24
|
+
*/
|
|
25
|
+
number: number;
|
|
26
|
+
/**
|
|
27
|
+
* Content type (e.g., "text/plain", "image/png")
|
|
28
|
+
*/
|
|
29
|
+
content_type: string;
|
|
30
|
+
/**
|
|
31
|
+
* Content length in bytes
|
|
32
|
+
*/
|
|
33
|
+
content_length: number;
|
|
34
|
+
/**
|
|
35
|
+
* Genesis transaction ID
|
|
36
|
+
*/
|
|
37
|
+
genesis_tx_id: string;
|
|
38
|
+
/**
|
|
39
|
+
* Genesis block height
|
|
40
|
+
*/
|
|
41
|
+
genesis_block_height: number;
|
|
42
|
+
/**
|
|
43
|
+
* Genesis block hash
|
|
44
|
+
*/
|
|
45
|
+
genesis_block_hash: string;
|
|
46
|
+
/**
|
|
47
|
+
* Genesis timestamp
|
|
48
|
+
*/
|
|
49
|
+
genesis_timestamp: number;
|
|
50
|
+
/**
|
|
51
|
+
* Location of the inscription (txid:vout:offset)
|
|
52
|
+
*/
|
|
53
|
+
location: string;
|
|
54
|
+
/**
|
|
55
|
+
* Output reference (txid:vout) - this is what we use to match UTXOs
|
|
56
|
+
*/
|
|
57
|
+
output: string;
|
|
58
|
+
/**
|
|
59
|
+
* Current owner address
|
|
60
|
+
*/
|
|
61
|
+
address: string;
|
|
62
|
+
/**
|
|
63
|
+
* Offset within the output
|
|
64
|
+
*/
|
|
65
|
+
offset: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Classified UTXOs
|
|
69
|
+
*/
|
|
70
|
+
export interface ClassifiedUtxos {
|
|
71
|
+
/**
|
|
72
|
+
* Cardinal UTXOs - safe to spend (no inscriptions)
|
|
73
|
+
*/
|
|
74
|
+
cardinal: UTXO[];
|
|
75
|
+
/**
|
|
76
|
+
* Ordinal UTXOs - contain inscriptions (do not spend)
|
|
77
|
+
*/
|
|
78
|
+
ordinal: UTXO[];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Ordinal Indexer Service
|
|
82
|
+
*
|
|
83
|
+
* Note: Hiro Ordinals API only supports mainnet. On testnet, all UTXOs are
|
|
84
|
+
* treated as cardinal (safe to spend) since we cannot index inscriptions.
|
|
85
|
+
*/
|
|
86
|
+
export declare class OrdinalIndexer {
|
|
87
|
+
private readonly network;
|
|
88
|
+
private readonly mempoolApi;
|
|
89
|
+
private readonly isMainnet;
|
|
90
|
+
constructor(network: Network);
|
|
91
|
+
/**
|
|
92
|
+
* Get all inscriptions for a Bitcoin address
|
|
93
|
+
*
|
|
94
|
+
* @param address - Bitcoin address (bc1... for mainnet)
|
|
95
|
+
* @returns Array of inscriptions with their output references (empty on testnet)
|
|
96
|
+
* @throws Error if API request fails
|
|
97
|
+
*/
|
|
98
|
+
getInscriptionsForAddress(address: string): Promise<Inscription[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Classify UTXOs into cardinal (safe to spend) and ordinal (contains inscriptions)
|
|
101
|
+
*
|
|
102
|
+
* @param address - Bitcoin address
|
|
103
|
+
* @returns Classified UTXOs
|
|
104
|
+
* @throws Error if API requests fail
|
|
105
|
+
*/
|
|
106
|
+
classifyUtxos(address: string): Promise<ClassifiedUtxos>;
|
|
107
|
+
/**
|
|
108
|
+
* Get cardinal UTXOs (safe to spend - no inscriptions)
|
|
109
|
+
*
|
|
110
|
+
* @param address - Bitcoin address
|
|
111
|
+
* @returns Cardinal UTXOs only
|
|
112
|
+
* @throws Error if API requests fail
|
|
113
|
+
*/
|
|
114
|
+
getCardinalUtxos(address: string): Promise<UTXO[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Get ordinal UTXOs (contain inscriptions - do not spend)
|
|
117
|
+
*
|
|
118
|
+
* @param address - Bitcoin address
|
|
119
|
+
* @returns Ordinal UTXOs only
|
|
120
|
+
* @throws Error if API requests fail
|
|
121
|
+
*/
|
|
122
|
+
getOrdinalUtxos(address: string): Promise<UTXO[]>;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create an ordinal indexer for the given network
|
|
126
|
+
*/
|
|
127
|
+
export declare function createOrdinalIndexer(network: Network): OrdinalIndexer;
|
|
128
|
+
//# sourceMappingURL=ordinal-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordinal-indexer.d.ts","sourceRoot":"","sources":["../../src/services/ordinal-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAYD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB;;OAEG;IACH,OAAO,EAAE,IAAI,EAAE,CAAC;CACjB;AAID;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,OAAO,EAAE,OAAO;IAM5B;;;;;;OAMG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2CxE;;;;;;OAMG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B9D;;;;;;OAMG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAKxD;;;;;;OAMG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAKxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAErE"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordinal Indexer Service
|
|
3
|
+
*
|
|
4
|
+
* Combines Hiro Ordinals API with mempool.space to classify UTXOs:
|
|
5
|
+
* - Cardinal: Safe to spend (no inscriptions)
|
|
6
|
+
* - Ordinal: Contains inscriptions (must not spend accidentally)
|
|
7
|
+
*
|
|
8
|
+
* Uses free APIs:
|
|
9
|
+
* - Hiro Ordinals API: https://api.hiro.so/ordinals/v1/inscriptions?address={address}
|
|
10
|
+
* - mempool.space API: via MempoolApi service
|
|
11
|
+
*/
|
|
12
|
+
import { MempoolApi } from "./mempool-api.js";
|
|
13
|
+
const HIRO_ORDINALS_API_URL = "https://api.hiro.so/ordinals/v1";
|
|
14
|
+
/**
|
|
15
|
+
* Ordinal Indexer Service
|
|
16
|
+
*
|
|
17
|
+
* Note: Hiro Ordinals API only supports mainnet. On testnet, all UTXOs are
|
|
18
|
+
* treated as cardinal (safe to spend) since we cannot index inscriptions.
|
|
19
|
+
*/
|
|
20
|
+
export class OrdinalIndexer {
|
|
21
|
+
network;
|
|
22
|
+
mempoolApi;
|
|
23
|
+
isMainnet;
|
|
24
|
+
constructor(network) {
|
|
25
|
+
this.network = network;
|
|
26
|
+
this.mempoolApi = new MempoolApi(network);
|
|
27
|
+
this.isMainnet = network === "mainnet";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get all inscriptions for a Bitcoin address
|
|
31
|
+
*
|
|
32
|
+
* @param address - Bitcoin address (bc1... for mainnet)
|
|
33
|
+
* @returns Array of inscriptions with their output references (empty on testnet)
|
|
34
|
+
* @throws Error if API request fails
|
|
35
|
+
*/
|
|
36
|
+
async getInscriptionsForAddress(address) {
|
|
37
|
+
// Testnet: return empty (Hiro API doesn't index testnet inscriptions)
|
|
38
|
+
if (!this.isMainnet) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const allInscriptions = [];
|
|
42
|
+
let offset = 0;
|
|
43
|
+
const limit = 60; // Hiro API default/max per page
|
|
44
|
+
try {
|
|
45
|
+
// Fetch all pages
|
|
46
|
+
while (true) {
|
|
47
|
+
const url = `${HIRO_ORDINALS_API_URL}/inscriptions?address=${address}&limit=${limit}&offset=${offset}`;
|
|
48
|
+
const response = await fetch(url);
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorText = await response.text().catch(() => "Unknown error");
|
|
51
|
+
throw new Error(`Failed to fetch inscriptions from Hiro API: ${response.status} ${response.statusText} - ${errorText}`);
|
|
52
|
+
}
|
|
53
|
+
const data = (await response.json());
|
|
54
|
+
allInscriptions.push(...data.results);
|
|
55
|
+
// Check if we've fetched all inscriptions
|
|
56
|
+
if (offset + data.results.length >= data.total) {
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
offset += limit;
|
|
60
|
+
}
|
|
61
|
+
return allInscriptions;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof Error) {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
throw new Error(`Failed to fetch inscriptions: ${String(error)}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Classify UTXOs into cardinal (safe to spend) and ordinal (contains inscriptions)
|
|
72
|
+
*
|
|
73
|
+
* @param address - Bitcoin address
|
|
74
|
+
* @returns Classified UTXOs
|
|
75
|
+
* @throws Error if API requests fail
|
|
76
|
+
*/
|
|
77
|
+
async classifyUtxos(address) {
|
|
78
|
+
// Fetch UTXOs from mempool.space
|
|
79
|
+
const utxos = await this.mempoolApi.getUtxos(address);
|
|
80
|
+
// Fetch inscriptions from Hiro Ordinals API
|
|
81
|
+
const inscriptions = await this.getInscriptionsForAddress(address);
|
|
82
|
+
// Build set of outputs that contain inscriptions
|
|
83
|
+
// Hiro API returns "output" field as "txid:vout"
|
|
84
|
+
const ordinalOutputs = new Set(inscriptions.map((inscription) => inscription.output));
|
|
85
|
+
// Classify UTXOs
|
|
86
|
+
const cardinal = [];
|
|
87
|
+
const ordinal = [];
|
|
88
|
+
for (const utxo of utxos) {
|
|
89
|
+
const outputRef = `${utxo.txid}:${utxo.vout}`;
|
|
90
|
+
if (ordinalOutputs.has(outputRef)) {
|
|
91
|
+
ordinal.push(utxo);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
cardinal.push(utxo);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { cardinal, ordinal };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get cardinal UTXOs (safe to spend - no inscriptions)
|
|
101
|
+
*
|
|
102
|
+
* @param address - Bitcoin address
|
|
103
|
+
* @returns Cardinal UTXOs only
|
|
104
|
+
* @throws Error if API requests fail
|
|
105
|
+
*/
|
|
106
|
+
async getCardinalUtxos(address) {
|
|
107
|
+
const classified = await this.classifyUtxos(address);
|
|
108
|
+
return classified.cardinal;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get ordinal UTXOs (contain inscriptions - do not spend)
|
|
112
|
+
*
|
|
113
|
+
* @param address - Bitcoin address
|
|
114
|
+
* @returns Ordinal UTXOs only
|
|
115
|
+
* @throws Error if API requests fail
|
|
116
|
+
*/
|
|
117
|
+
async getOrdinalUtxos(address) {
|
|
118
|
+
const classified = await this.classifyUtxos(address);
|
|
119
|
+
return classified.ordinal;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create an ordinal indexer for the given network
|
|
124
|
+
*/
|
|
125
|
+
export function createOrdinalIndexer(network) {
|
|
126
|
+
return new OrdinalIndexer(network);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=ordinal-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordinal-indexer.js","sourceRoot":"","sources":["../../src/services/ordinal-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,8 +28,9 @@ export declare class SbtcService {
|
|
|
28
28
|
getBalance(address: string): Promise<SbtcBalance>;
|
|
29
29
|
/**
|
|
30
30
|
* Transfer sBTC to a recipient
|
|
31
|
+
* @param fee Optional fee in micro-STX. If omitted, fee is auto-estimated.
|
|
31
32
|
*/
|
|
32
|
-
transfer(account: Account, recipient: string, amount: bigint, memo?: string): Promise<TransferResult>;
|
|
33
|
+
transfer(account: Account, recipient: string, amount: bigint, memo?: string, fee?: bigint): Promise<TransferResult>;
|
|
33
34
|
/**
|
|
34
35
|
* Get sBTC deposit instructions
|
|
35
36
|
* Note: sBTC deposits require interacting with the Bitcoin network directly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sbtc.service.d.ts","sourceRoot":"","sources":["../../src/services/sbtc.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAM7F,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,qBAAa,WAAW;IAIV,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,SAAS,CAAkC;gBAE/B,OAAO,EAAE,OAAO;IAKpC;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevD
|
|
1
|
+
{"version":3,"file":"sbtc.service.d.ts","sourceRoot":"","sources":["../../src/services/sbtc.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAM7F,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,qBAAa,WAAW;IAIV,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,SAAS,CAAkC;gBAE/B,OAAO,EAAE,OAAO;IAKpC;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevD;;;OAGG;IACG,QAAQ,CACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,CAAC;IAyB1B;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC;IAehD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;CAgBzC;AAQD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAK5D"}
|
|
@@ -31,8 +31,9 @@ export class SbtcService {
|
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Transfer sBTC to a recipient
|
|
34
|
+
* @param fee Optional fee in micro-STX. If omitted, fee is auto-estimated.
|
|
34
35
|
*/
|
|
35
|
-
async transfer(account, recipient, amount, memo) {
|
|
36
|
+
async transfer(account, recipient, amount, memo, fee) {
|
|
36
37
|
const sbtcContract = this.contracts.SBTC_TOKEN;
|
|
37
38
|
const { address: contractAddress, name: contractName } = parseContractId(sbtcContract);
|
|
38
39
|
const functionArgs = [
|
|
@@ -50,6 +51,7 @@ export class SbtcService {
|
|
|
50
51
|
contractName,
|
|
51
52
|
functionName: "transfer",
|
|
52
53
|
functionArgs,
|
|
54
|
+
...(fee !== undefined && { fee }),
|
|
53
55
|
});
|
|
54
56
|
}
|
|
55
57
|
/**
|