@aibtc/mcp-server 1.0.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.
Files changed (178) hide show
  1. package/README.md +340 -0
  2. package/dist/api.d.ts +9 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +79 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/config/contracts.d.ts +169 -0
  7. package/dist/config/contracts.d.ts.map +1 -0
  8. package/dist/config/contracts.js +250 -0
  9. package/dist/config/contracts.js.map +1 -0
  10. package/dist/config/index.d.ts +3 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +3 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/config/networks.d.ts +11 -0
  15. package/dist/config/networks.d.ts.map +1 -0
  16. package/dist/config/networks.js +21 -0
  17. package/dist/config/networks.js.map +1 -0
  18. package/dist/endpoints/index.d.ts +2 -0
  19. package/dist/endpoints/index.d.ts.map +1 -0
  20. package/dist/endpoints/index.js +2 -0
  21. package/dist/endpoints/index.js.map +1 -0
  22. package/dist/endpoints/registry.d.ts +38 -0
  23. package/dist/endpoints/registry.d.ts.map +1 -0
  24. package/dist/endpoints/registry.js +935 -0
  25. package/dist/endpoints/registry.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +79 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/services/bitflow.service.d.ts +159 -0
  31. package/dist/services/bitflow.service.d.ts.map +1 -0
  32. package/dist/services/bitflow.service.js +325 -0
  33. package/dist/services/bitflow.service.js.map +1 -0
  34. package/dist/services/bns.service.d.ts +87 -0
  35. package/dist/services/bns.service.d.ts.map +1 -0
  36. package/dist/services/bns.service.js +312 -0
  37. package/dist/services/bns.service.js.map +1 -0
  38. package/dist/services/defi.service.d.ts +146 -0
  39. package/dist/services/defi.service.d.ts.map +1 -0
  40. package/dist/services/defi.service.js +461 -0
  41. package/dist/services/defi.service.js.map +1 -0
  42. package/dist/services/hiro-api.d.ts +438 -0
  43. package/dist/services/hiro-api.d.ts.map +1 -0
  44. package/dist/services/hiro-api.js +376 -0
  45. package/dist/services/hiro-api.js.map +1 -0
  46. package/dist/services/nft.service.d.ts +70 -0
  47. package/dist/services/nft.service.d.ts.map +1 -0
  48. package/dist/services/nft.service.js +148 -0
  49. package/dist/services/nft.service.js.map +1 -0
  50. package/dist/services/sbtc.service.d.ts +44 -0
  51. package/dist/services/sbtc.service.d.ts.map +1 -0
  52. package/dist/services/sbtc.service.js +100 -0
  53. package/dist/services/sbtc.service.js.map +1 -0
  54. package/dist/services/scaffold.service.d.ts +41 -0
  55. package/dist/services/scaffold.service.d.ts.map +1 -0
  56. package/dist/services/scaffold.service.js +1055 -0
  57. package/dist/services/scaffold.service.js.map +1 -0
  58. package/dist/services/stacking.service.d.ts +58 -0
  59. package/dist/services/stacking.service.d.ts.map +1 -0
  60. package/dist/services/stacking.service.js +153 -0
  61. package/dist/services/stacking.service.js.map +1 -0
  62. package/dist/services/tokens.service.d.ts +62 -0
  63. package/dist/services/tokens.service.d.ts.map +1 -0
  64. package/dist/services/tokens.service.js +119 -0
  65. package/dist/services/tokens.service.js.map +1 -0
  66. package/dist/services/wallet-manager.d.ts +107 -0
  67. package/dist/services/wallet-manager.d.ts.map +1 -0
  68. package/dist/services/wallet-manager.js +389 -0
  69. package/dist/services/wallet-manager.js.map +1 -0
  70. package/dist/services/x402.service.d.ts +26 -0
  71. package/dist/services/x402.service.d.ts.map +1 -0
  72. package/dist/services/x402.service.js +125 -0
  73. package/dist/services/x402.service.js.map +1 -0
  74. package/dist/tools/bitflow.tools.d.ts +3 -0
  75. package/dist/tools/bitflow.tools.d.ts.map +1 -0
  76. package/dist/tools/bitflow.tools.js +501 -0
  77. package/dist/tools/bitflow.tools.js.map +1 -0
  78. package/dist/tools/bns.tools.d.ts +3 -0
  79. package/dist/tools/bns.tools.d.ts.map +1 -0
  80. package/dist/tools/bns.tools.js +164 -0
  81. package/dist/tools/bns.tools.js.map +1 -0
  82. package/dist/tools/contract.tools.d.ts +3 -0
  83. package/dist/tools/contract.tools.d.ts.map +1 -0
  84. package/dist/tools/contract.tools.js +126 -0
  85. package/dist/tools/contract.tools.js.map +1 -0
  86. package/dist/tools/defi.tools.d.ts +3 -0
  87. package/dist/tools/defi.tools.d.ts.map +1 -0
  88. package/dist/tools/defi.tools.js +425 -0
  89. package/dist/tools/defi.tools.js.map +1 -0
  90. package/dist/tools/endpoint.tools.d.ts +3 -0
  91. package/dist/tools/endpoint.tools.d.ts.map +1 -0
  92. package/dist/tools/endpoint.tools.js +157 -0
  93. package/dist/tools/endpoint.tools.js.map +1 -0
  94. package/dist/tools/index.d.ts +6 -0
  95. package/dist/tools/index.d.ts.map +1 -0
  96. package/dist/tools/index.js +52 -0
  97. package/dist/tools/index.js.map +1 -0
  98. package/dist/tools/nft.tools.d.ts +3 -0
  99. package/dist/tools/nft.tools.d.ts.map +1 -0
  100. package/dist/tools/nft.tools.js +154 -0
  101. package/dist/tools/nft.tools.js.map +1 -0
  102. package/dist/tools/openrouter.tools.d.ts +3 -0
  103. package/dist/tools/openrouter.tools.d.ts.map +1 -0
  104. package/dist/tools/openrouter.tools.js +664 -0
  105. package/dist/tools/openrouter.tools.js.map +1 -0
  106. package/dist/tools/query.tools.d.ts +3 -0
  107. package/dist/tools/query.tools.d.ts.map +1 -0
  108. package/dist/tools/query.tools.js +209 -0
  109. package/dist/tools/query.tools.js.map +1 -0
  110. package/dist/tools/sbtc.tools.d.ts +3 -0
  111. package/dist/tools/sbtc.tools.d.ts.map +1 -0
  112. package/dist/tools/sbtc.tools.js +103 -0
  113. package/dist/tools/sbtc.tools.js.map +1 -0
  114. package/dist/tools/scaffold.tools.d.ts +3 -0
  115. package/dist/tools/scaffold.tools.d.ts.map +1 -0
  116. package/dist/tools/scaffold.tools.js +216 -0
  117. package/dist/tools/scaffold.tools.js.map +1 -0
  118. package/dist/tools/stacking.tools.d.ts +3 -0
  119. package/dist/tools/stacking.tools.d.ts.map +1 -0
  120. package/dist/tools/stacking.tools.js +112 -0
  121. package/dist/tools/stacking.tools.js.map +1 -0
  122. package/dist/tools/tokens.tools.d.ts +3 -0
  123. package/dist/tools/tokens.tools.d.ts.map +1 -0
  124. package/dist/tools/tokens.tools.js +154 -0
  125. package/dist/tools/tokens.tools.js.map +1 -0
  126. package/dist/tools/transfer.tools.d.ts +3 -0
  127. package/dist/tools/transfer.tools.d.ts.map +1 -0
  128. package/dist/tools/transfer.tools.js +62 -0
  129. package/dist/tools/transfer.tools.js.map +1 -0
  130. package/dist/tools/wallet-management.tools.d.ts +6 -0
  131. package/dist/tools/wallet-management.tools.d.ts.map +1 -0
  132. package/dist/tools/wallet-management.tools.js +390 -0
  133. package/dist/tools/wallet-management.tools.js.map +1 -0
  134. package/dist/tools/wallet.tools.d.ts +3 -0
  135. package/dist/tools/wallet.tools.d.ts.map +1 -0
  136. package/dist/tools/wallet.tools.js +105 -0
  137. package/dist/tools/wallet.tools.js.map +1 -0
  138. package/dist/transactions/builder.d.ts +56 -0
  139. package/dist/transactions/builder.d.ts.map +1 -0
  140. package/dist/transactions/builder.js +134 -0
  141. package/dist/transactions/builder.js.map +1 -0
  142. package/dist/transactions/clarity-values.d.ts +67 -0
  143. package/dist/transactions/clarity-values.d.ts.map +1 -0
  144. package/dist/transactions/clarity-values.js +169 -0
  145. package/dist/transactions/clarity-values.js.map +1 -0
  146. package/dist/transactions/post-conditions.d.ts +27 -0
  147. package/dist/transactions/post-conditions.d.ts.map +1 -0
  148. package/dist/transactions/post-conditions.js +101 -0
  149. package/dist/transactions/post-conditions.js.map +1 -0
  150. package/dist/utils/encryption.d.ts +33 -0
  151. package/dist/utils/encryption.d.ts.map +1 -0
  152. package/dist/utils/encryption.js +110 -0
  153. package/dist/utils/encryption.js.map +1 -0
  154. package/dist/utils/errors.d.ts +84 -0
  155. package/dist/utils/errors.d.ts.map +1 -0
  156. package/dist/utils/errors.js +132 -0
  157. package/dist/utils/errors.js.map +1 -0
  158. package/dist/utils/formatting.d.ts +51 -0
  159. package/dist/utils/formatting.d.ts.map +1 -0
  160. package/dist/utils/formatting.js +114 -0
  161. package/dist/utils/formatting.js.map +1 -0
  162. package/dist/utils/index.d.ts +6 -0
  163. package/dist/utils/index.d.ts.map +1 -0
  164. package/dist/utils/index.js +6 -0
  165. package/dist/utils/index.js.map +1 -0
  166. package/dist/utils/storage.d.ts +90 -0
  167. package/dist/utils/storage.d.ts.map +1 -0
  168. package/dist/utils/storage.js +196 -0
  169. package/dist/utils/storage.js.map +1 -0
  170. package/dist/utils/validation.d.ts +67 -0
  171. package/dist/utils/validation.d.ts.map +1 -0
  172. package/dist/utils/validation.js +74 -0
  173. package/dist/utils/validation.js.map +1 -0
  174. package/dist/wallet.d.ts +86 -0
  175. package/dist/wallet.d.ts.map +1 -0
  176. package/dist/wallet.js +279 -0
  177. package/dist/wallet.js.map +1 -0
  178. package/package.json +58 -0
@@ -0,0 +1,376 @@
1
+ import { serializeCV } from "@stacks/transactions";
2
+ import { getApiBaseUrl } from "../config/networks.js";
3
+ import { parseContractId } from "../config/contracts.js";
4
+ // ============================================================================
5
+ // Hiro API Service
6
+ // ============================================================================
7
+ export class HiroApiService {
8
+ network;
9
+ baseUrl;
10
+ constructor(network) {
11
+ this.network = network;
12
+ this.baseUrl = getApiBaseUrl(network);
13
+ }
14
+ async fetch(path, options) {
15
+ const url = `${this.baseUrl}${path}`;
16
+ const response = await fetch(url, {
17
+ ...options,
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ ...options?.headers,
21
+ },
22
+ });
23
+ if (!response.ok) {
24
+ const errorText = await response.text();
25
+ throw new Error(`Hiro API error (${response.status}): ${errorText}`);
26
+ }
27
+ return response.json();
28
+ }
29
+ // ==========================================================================
30
+ // Account Operations
31
+ // ==========================================================================
32
+ async getAccountInfo(address) {
33
+ return this.fetch(`/v2/accounts/${address}`);
34
+ }
35
+ async getStxBalance(address) {
36
+ return this.fetch(`/extended/v1/address/${address}/stx`);
37
+ }
38
+ async getAccountBalances(address) {
39
+ return this.fetch(`/extended/v1/address/${address}/balances`);
40
+ }
41
+ async getAccountTransactions(address, options) {
42
+ const params = new URLSearchParams();
43
+ if (options?.limit)
44
+ params.set("limit", options.limit.toString());
45
+ if (options?.offset)
46
+ params.set("offset", options.offset.toString());
47
+ if (options?.type)
48
+ options.type.forEach((t) => params.append("type", t));
49
+ const query = params.toString() ? `?${params.toString()}` : "";
50
+ return this.fetch(`/extended/v1/address/${address}/transactions${query}`);
51
+ }
52
+ async getAccountNonce(address) {
53
+ const info = await this.getAccountInfo(address);
54
+ return info.nonce;
55
+ }
56
+ // ==========================================================================
57
+ // Token Operations
58
+ // ==========================================================================
59
+ async getTokenBalance(address, contractId) {
60
+ const balances = await this.getAccountBalances(address);
61
+ const tokenKey = Object.keys(balances.fungible_tokens).find((key) => key.startsWith(contractId + "::") || key === contractId);
62
+ if (!tokenKey) {
63
+ return "0";
64
+ }
65
+ return balances.fungible_tokens[tokenKey].balance;
66
+ }
67
+ async getTokenMetadata(contractId) {
68
+ try {
69
+ return await this.fetch(`/metadata/v1/ft/${contractId}`);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ async getTokenHolders(contractId, options) {
76
+ const params = new URLSearchParams();
77
+ if (options?.limit)
78
+ params.set("limit", options.limit.toString());
79
+ if (options?.offset)
80
+ params.set("offset", options.offset.toString());
81
+ const query = params.toString() ? `?${params.toString()}` : "";
82
+ return this.fetch(`/extended/v1/tokens/ft/${contractId}/holders${query}`);
83
+ }
84
+ async getUserTokens(address) {
85
+ const balances = await this.getAccountBalances(address);
86
+ return Object.entries(balances.fungible_tokens).map(([asset_identifier, data]) => ({
87
+ asset_identifier,
88
+ balance: data.balance,
89
+ }));
90
+ }
91
+ // ==========================================================================
92
+ // NFT Operations
93
+ // ==========================================================================
94
+ async getNftHoldings(address, options) {
95
+ const params = new URLSearchParams();
96
+ if (options?.limit)
97
+ params.set("limit", options.limit.toString());
98
+ if (options?.offset)
99
+ params.set("offset", options.offset.toString());
100
+ if (options?.asset_identifiers) {
101
+ options.asset_identifiers.forEach((id) => params.append("asset_identifiers", id));
102
+ }
103
+ const query = params.toString() ? `?${params.toString()}` : "";
104
+ return this.fetch(`/extended/v1/tokens/nft/holdings${query}&principal=${address}`);
105
+ }
106
+ async getNftEvents(contractId, options) {
107
+ const params = new URLSearchParams();
108
+ if (options?.limit)
109
+ params.set("limit", options.limit.toString());
110
+ if (options?.offset)
111
+ params.set("offset", options.offset.toString());
112
+ const query = params.toString() ? `?${params.toString()}` : "";
113
+ return this.fetch(`/extended/v1/tokens/nft/history${query}&asset_identifier=${contractId}`);
114
+ }
115
+ async getNftMetadata(contractId, tokenId) {
116
+ return this.fetch(`/metadata/v1/nft/${contractId}/${tokenId}`);
117
+ }
118
+ // ==========================================================================
119
+ // Contract Operations
120
+ // ==========================================================================
121
+ async getContractInfo(contractId) {
122
+ return this.fetch(`/extended/v1/contract/${contractId}`);
123
+ }
124
+ async getContractInterface(contractId) {
125
+ const { address, name } = parseContractId(contractId);
126
+ return this.fetch(`/v2/contracts/interface/${address}/${name}`);
127
+ }
128
+ async getContractSource(contractId) {
129
+ const { address, name } = parseContractId(contractId);
130
+ return this.fetch(`/v2/contracts/source/${address}/${name}`);
131
+ }
132
+ async callReadOnlyFunction(contractId, functionName, functionArgs, senderAddress) {
133
+ const { address, name } = parseContractId(contractId);
134
+ const body = {
135
+ sender: senderAddress,
136
+ arguments: functionArgs.map((arg) => {
137
+ const serialized = serializeCV(arg);
138
+ // serializeCV returns hex string in newer versions, Uint8Array in older
139
+ if (typeof serialized === "string") {
140
+ return serialized;
141
+ }
142
+ return Buffer.from(serialized).toString("hex");
143
+ }),
144
+ };
145
+ return this.fetch(`/v2/contracts/call-read/${address}/${name}/${functionName}`, {
146
+ method: "POST",
147
+ body: JSON.stringify(body),
148
+ });
149
+ }
150
+ async getContractEvents(contractId, options) {
151
+ const params = new URLSearchParams();
152
+ if (options?.limit)
153
+ params.set("limit", options.limit.toString());
154
+ if (options?.offset)
155
+ params.set("offset", options.offset.toString());
156
+ const query = params.toString() ? `?${params.toString()}` : "";
157
+ return this.fetch(`/extended/v1/contract/${contractId}/events${query}`);
158
+ }
159
+ // ==========================================================================
160
+ // Transaction Operations
161
+ // ==========================================================================
162
+ async getTransaction(txid) {
163
+ return this.fetch(`/extended/v1/tx/${txid}`);
164
+ }
165
+ async getTransactionStatus(txid) {
166
+ try {
167
+ const tx = await this.getTransaction(txid);
168
+ return {
169
+ status: tx.tx_status,
170
+ block_height: tx.block_height,
171
+ tx_result: tx.tx_result,
172
+ };
173
+ }
174
+ catch (error) {
175
+ if (error instanceof Error && error.message.includes("404")) {
176
+ return { status: "pending" };
177
+ }
178
+ throw error;
179
+ }
180
+ }
181
+ async searchTransactions(query, options) {
182
+ const params = new URLSearchParams();
183
+ params.set("query", query);
184
+ if (options?.limit)
185
+ params.set("limit", options.limit.toString());
186
+ if (options?.offset)
187
+ params.set("offset", options.offset.toString());
188
+ return this.fetch(`/extended/v1/search?${params.toString()}`);
189
+ }
190
+ async getMempoolTransactions(options) {
191
+ const params = new URLSearchParams();
192
+ if (options?.sender_address)
193
+ params.set("sender_address", options.sender_address);
194
+ if (options?.recipient_address)
195
+ params.set("recipient_address", options.recipient_address);
196
+ if (options?.limit)
197
+ params.set("limit", options.limit.toString());
198
+ if (options?.offset)
199
+ params.set("offset", options.offset.toString());
200
+ const query = params.toString() ? `?${params.toString()}` : "";
201
+ return this.fetch(`/extended/v1/tx/mempool${query}`);
202
+ }
203
+ async estimateFee(txPayload) {
204
+ return this.fetch("/v2/fees/transaction", {
205
+ method: "POST",
206
+ body: JSON.stringify({ transaction_payload: txPayload }),
207
+ });
208
+ }
209
+ // ==========================================================================
210
+ // Block Operations
211
+ // ==========================================================================
212
+ async getBlockByHeight(height) {
213
+ return this.fetch(`/extended/v1/block/by_height/${height}`);
214
+ }
215
+ async getBlockByHash(hash) {
216
+ return this.fetch(`/extended/v1/block/${hash}`);
217
+ }
218
+ async getLatestBlock() {
219
+ const response = await this.fetch("/extended/v1/block?limit=1");
220
+ if (!response.results.length) {
221
+ throw new Error("No blocks found");
222
+ }
223
+ return response.results[0];
224
+ }
225
+ async getBlocks(options) {
226
+ const params = new URLSearchParams();
227
+ if (options?.limit)
228
+ params.set("limit", options.limit.toString());
229
+ if (options?.offset)
230
+ params.set("offset", options.offset.toString());
231
+ const query = params.toString() ? `?${params.toString()}` : "";
232
+ return this.fetch(`/extended/v1/block${query}`);
233
+ }
234
+ // ==========================================================================
235
+ // Stacking / PoX Operations
236
+ // ==========================================================================
237
+ async getPoxInfo() {
238
+ return this.fetch("/v2/pox");
239
+ }
240
+ async getStackerInfo(address) {
241
+ return this.fetch(`/extended/v1/address/${address}/stx_inbound`);
242
+ }
243
+ // ==========================================================================
244
+ // BNS Operations
245
+ // ==========================================================================
246
+ async getBnsNameInfo(name) {
247
+ return this.fetch(`/v1/names/${name}`);
248
+ }
249
+ async getBnsNamesOwnedByAddress(address) {
250
+ return this.fetch(`/v1/addresses/stacks/${address}`);
251
+ }
252
+ async getBnsNamePrice(name) {
253
+ const [namespace] = name.split(".").reverse();
254
+ return this.fetch(`/v2/prices/names/${namespace}/${name}`);
255
+ }
256
+ async resolveBnsName(name) {
257
+ try {
258
+ const info = await this.getBnsNameInfo(name);
259
+ return info.address;
260
+ }
261
+ catch {
262
+ return null;
263
+ }
264
+ }
265
+ // ==========================================================================
266
+ // Network Status
267
+ // ==========================================================================
268
+ async getNetworkStatus() {
269
+ return this.fetch("/extended/v1/status");
270
+ }
271
+ async getCoreApiInfo() {
272
+ return this.fetch("/v2/info");
273
+ }
274
+ }
275
+ // ============================================================================
276
+ // Helper Functions
277
+ // ============================================================================
278
+ let _hiroApiInstance = null;
279
+ export function getHiroApi(network) {
280
+ if (!_hiroApiInstance || _hiroApiInstance["network"] !== network) {
281
+ _hiroApiInstance = new HiroApiService(network);
282
+ }
283
+ return _hiroApiInstance;
284
+ }
285
+ export async function getStxBalance(address, network) {
286
+ const api = getHiroApi(network);
287
+ const balance = await api.getStxBalance(address);
288
+ return {
289
+ stx: balance.balance,
290
+ stxLocked: balance.locked,
291
+ };
292
+ }
293
+ export async function getTransactionStatus(txid, network) {
294
+ const api = getHiroApi(network);
295
+ return api.getTransactionStatus(txid);
296
+ }
297
+ // ============================================================================
298
+ // BNS V2 API Service (for .btc names)
299
+ // ============================================================================
300
+ const BNSV2_API_URL = "https://api.bnsv2.com";
301
+ export class BnsV2ApiService {
302
+ baseUrl;
303
+ constructor() {
304
+ this.baseUrl = BNSV2_API_URL;
305
+ }
306
+ async fetch(path, options) {
307
+ const url = `${this.baseUrl}${path}`;
308
+ const response = await fetch(url, {
309
+ ...options,
310
+ headers: {
311
+ "Content-Type": "application/json",
312
+ ...options?.headers,
313
+ },
314
+ });
315
+ if (!response.ok) {
316
+ const errorText = await response.text();
317
+ throw new Error(`BNS V2 API error (${response.status}): ${errorText}`);
318
+ }
319
+ return response.json();
320
+ }
321
+ /**
322
+ * Get BNS V2 name info
323
+ */
324
+ async getNameInfo(name) {
325
+ const fullName = name.endsWith(".btc") ? name : `${name}.btc`;
326
+ return this.fetch(`/names/${fullName}`);
327
+ }
328
+ /**
329
+ * Get names owned by an address
330
+ */
331
+ async getNamesOwnedByAddress(address) {
332
+ return this.fetch(`/names/address/${address}/valid`);
333
+ }
334
+ /**
335
+ * Check if a name exists (is registered)
336
+ */
337
+ async nameExists(name) {
338
+ try {
339
+ const info = await this.getNameInfo(name);
340
+ return info.status === "active" && info.data.is_valid && !info.data.revoked;
341
+ }
342
+ catch (error) {
343
+ if (error instanceof Error && error.message.includes("404")) {
344
+ return false;
345
+ }
346
+ if (error instanceof Error && error.message.includes("Name not found")) {
347
+ return false;
348
+ }
349
+ throw error;
350
+ }
351
+ }
352
+ /**
353
+ * Resolve a name to an address
354
+ */
355
+ async resolveName(name) {
356
+ try {
357
+ const info = await this.getNameInfo(name);
358
+ if (info.status === "active" && info.data.is_valid && !info.data.revoked) {
359
+ return info.data.owner;
360
+ }
361
+ return null;
362
+ }
363
+ catch {
364
+ return null;
365
+ }
366
+ }
367
+ }
368
+ // BNS V2 singleton
369
+ let _bnsV2ApiInstance = null;
370
+ export function getBnsV2Api() {
371
+ if (!_bnsV2ApiInstance) {
372
+ _bnsV2ApiInstance = new BnsV2ApiService();
373
+ }
374
+ return _bnsV2ApiInstance;
375
+ }
376
+ //# sourceMappingURL=hiro-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hiro-api.js","sourceRoot":"","sources":["../../src/services/hiro-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { NftHolding } from "./hiro-api.js";
2
+ import { type Network } from "../config/index.js";
3
+ import { type Account, type TransferResult } from "../transactions/builder.js";
4
+ export interface NftInfo {
5
+ contractId: string;
6
+ tokenId: number;
7
+ owner: string;
8
+ metadata?: unknown;
9
+ }
10
+ export interface NftCollectionInfo {
11
+ contractId: string;
12
+ name?: string;
13
+ totalSupply?: number;
14
+ functions: string[];
15
+ }
16
+ export interface NftTransferEvent {
17
+ sender: string;
18
+ recipient: string;
19
+ tokenId: string;
20
+ txId: string;
21
+ blockHeight: number;
22
+ }
23
+ export declare class NftService {
24
+ private network;
25
+ private hiro;
26
+ constructor(network: Network);
27
+ /**
28
+ * Get all NFTs owned by an address
29
+ */
30
+ getHoldings(address: string, options?: {
31
+ limit?: number;
32
+ offset?: number;
33
+ contractId?: string;
34
+ }): Promise<{
35
+ total: number;
36
+ nfts: NftHolding[];
37
+ }>;
38
+ /**
39
+ * Get NFT metadata
40
+ */
41
+ getMetadata(contractId: string, tokenId: number): Promise<unknown>;
42
+ /**
43
+ * Get NFT owner by calling the contract
44
+ */
45
+ getOwner(contractId: string, tokenId: number, senderAddress: string): Promise<string | null>;
46
+ /**
47
+ * Get collection information
48
+ */
49
+ getCollectionInfo(contractId: string): Promise<NftCollectionInfo>;
50
+ /**
51
+ * Get NFT transfer history
52
+ */
53
+ getHistory(contractId: string, options?: {
54
+ limit?: number;
55
+ offset?: number;
56
+ }): Promise<{
57
+ total: number;
58
+ events: NftTransferEvent[];
59
+ }>;
60
+ /**
61
+ * Transfer an NFT (SIP-009 standard)
62
+ */
63
+ transfer(account: Account, contractId: string, tokenId: number, recipient: string): Promise<TransferResult>;
64
+ /**
65
+ * Mint an NFT (contract-specific, not part of SIP-009)
66
+ */
67
+ mint(account: Account, contractId: string, recipient: string, mintFunctionName?: string): Promise<TransferResult>;
68
+ }
69
+ export declare function getNftService(network: Network): NftService;
70
+ //# sourceMappingURL=nft.service.d.ts.map
@@ -0,0 +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;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAmB1B;;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"}
@@ -0,0 +1,148 @@
1
+ import { uintCV, principalCV } from "@stacks/transactions";
2
+ import { getHiroApi } from "./hiro-api.js";
3
+ import { parseContractId } from "../config/index.js";
4
+ import { callContract } from "../transactions/builder.js";
5
+ // ============================================================================
6
+ // NFT Service (SIP-009)
7
+ // ============================================================================
8
+ export class NftService {
9
+ network;
10
+ hiro;
11
+ constructor(network) {
12
+ this.network = network;
13
+ this.hiro = getHiroApi(network);
14
+ }
15
+ /**
16
+ * Get all NFTs owned by an address
17
+ */
18
+ async getHoldings(address, options) {
19
+ const assetIdentifiers = options?.contractId ? [options.contractId] : undefined;
20
+ const result = await this.hiro.getNftHoldings(address, {
21
+ limit: options?.limit,
22
+ offset: options?.offset,
23
+ asset_identifiers: assetIdentifiers,
24
+ });
25
+ return {
26
+ total: result.total,
27
+ nfts: result.results,
28
+ };
29
+ }
30
+ /**
31
+ * Get NFT metadata
32
+ */
33
+ async getMetadata(contractId, tokenId) {
34
+ return this.hiro.getNftMetadata(contractId, tokenId);
35
+ }
36
+ /**
37
+ * Get NFT owner by calling the contract
38
+ */
39
+ async getOwner(contractId, tokenId, senderAddress) {
40
+ parseContractId(contractId); // Validate contract ID format
41
+ try {
42
+ const result = await this.hiro.callReadOnlyFunction(contractId, "get-owner", [uintCV(tokenId)], senderAddress);
43
+ if (result.okay && result.result) {
44
+ // Parse the result - it returns (optional principal)
45
+ // This is a simplified parsing - actual implementation may need more robust parsing
46
+ const match = result.result.match(/\(some\s+([^\)]+)\)/);
47
+ if (match) {
48
+ return match[1];
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ /**
58
+ * Get collection information
59
+ */
60
+ async getCollectionInfo(contractId) {
61
+ const contractInterface = await this.hiro.getContractInterface(contractId);
62
+ // Get the NFT token type info
63
+ const nftTokens = contractInterface.non_fungible_tokens || [];
64
+ const functions = contractInterface.functions.map((f) => f.name);
65
+ // Try to get the last token ID to determine supply
66
+ let totalSupply;
67
+ try {
68
+ // Many NFT contracts have get-last-token-id function (SIP-009 requirement)
69
+ const lastTokenResult = await this.hiro.callReadOnlyFunction(contractId, "get-last-token-id", [], contractId.split(".")[0]);
70
+ if (lastTokenResult.okay && lastTokenResult.result) {
71
+ const match = lastTokenResult.result.match(/\(ok\s+u(\d+)\)/);
72
+ if (match) {
73
+ totalSupply = parseInt(match[1], 10);
74
+ }
75
+ }
76
+ }
77
+ catch {
78
+ // Function may not exist or may fail
79
+ }
80
+ return {
81
+ contractId,
82
+ name: nftTokens[0]?.name,
83
+ totalSupply,
84
+ functions,
85
+ };
86
+ }
87
+ /**
88
+ * Get NFT transfer history
89
+ */
90
+ async getHistory(contractId, options) {
91
+ const result = await this.hiro.getNftEvents(contractId, options);
92
+ const events = result.results.map((event) => ({
93
+ sender: event.sender,
94
+ recipient: event.recipient,
95
+ tokenId: event.value.repr,
96
+ txId: event.tx_id,
97
+ blockHeight: event.block_height,
98
+ }));
99
+ return {
100
+ total: result.total,
101
+ events,
102
+ };
103
+ }
104
+ /**
105
+ * Transfer an NFT (SIP-009 standard)
106
+ */
107
+ async transfer(account, contractId, tokenId, recipient) {
108
+ const { address: contractAddress, name: contractName } = parseContractId(contractId);
109
+ // SIP-009 transfer function signature:
110
+ // (transfer (token-id uint) (sender principal) (recipient principal))
111
+ const functionArgs = [
112
+ uintCV(tokenId),
113
+ principalCV(account.address),
114
+ principalCV(recipient),
115
+ ];
116
+ return callContract(account, {
117
+ contractAddress,
118
+ contractName,
119
+ functionName: "transfer",
120
+ functionArgs,
121
+ });
122
+ }
123
+ /**
124
+ * Mint an NFT (contract-specific, not part of SIP-009)
125
+ */
126
+ async mint(account, contractId, recipient, mintFunctionName = "mint") {
127
+ const { address: contractAddress, name: contractName } = parseContractId(contractId);
128
+ // This is a generic mint call - actual parameters depend on the specific contract
129
+ const functionArgs = [principalCV(recipient)];
130
+ return callContract(account, {
131
+ contractAddress,
132
+ contractName,
133
+ functionName: mintFunctionName,
134
+ functionArgs,
135
+ });
136
+ }
137
+ }
138
+ // ============================================================================
139
+ // Helper Functions
140
+ // ============================================================================
141
+ let _nftServiceInstance = null;
142
+ export function getNftService(network) {
143
+ if (!_nftServiceInstance || _nftServiceInstance["network"] !== network) {
144
+ _nftServiceInstance = new NftService(network);
145
+ }
146
+ return _nftServiceInstance;
147
+ }
148
+ //# sourceMappingURL=nft.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nft.service.js","sourceRoot":"","sources":["../../src/services/nft.service.ts"],"names":[],"mappings":"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"}