@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.
- package/README.md +340 -0
- package/dist/api.d.ts +9 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +79 -0
- package/dist/api.js.map +1 -0
- package/dist/config/contracts.d.ts +169 -0
- package/dist/config/contracts.d.ts.map +1 -0
- package/dist/config/contracts.js +250 -0
- package/dist/config/contracts.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/networks.d.ts +11 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +21 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/endpoints/index.d.ts +2 -0
- package/dist/endpoints/index.d.ts.map +1 -0
- package/dist/endpoints/index.js +2 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/registry.d.ts +38 -0
- package/dist/endpoints/registry.d.ts.map +1 -0
- package/dist/endpoints/registry.js +935 -0
- package/dist/endpoints/registry.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/services/bitflow.service.d.ts +159 -0
- package/dist/services/bitflow.service.d.ts.map +1 -0
- package/dist/services/bitflow.service.js +325 -0
- package/dist/services/bitflow.service.js.map +1 -0
- package/dist/services/bns.service.d.ts +87 -0
- package/dist/services/bns.service.d.ts.map +1 -0
- package/dist/services/bns.service.js +312 -0
- package/dist/services/bns.service.js.map +1 -0
- package/dist/services/defi.service.d.ts +146 -0
- package/dist/services/defi.service.d.ts.map +1 -0
- package/dist/services/defi.service.js +461 -0
- package/dist/services/defi.service.js.map +1 -0
- package/dist/services/hiro-api.d.ts +438 -0
- package/dist/services/hiro-api.d.ts.map +1 -0
- package/dist/services/hiro-api.js +376 -0
- package/dist/services/hiro-api.js.map +1 -0
- package/dist/services/nft.service.d.ts +70 -0
- package/dist/services/nft.service.d.ts.map +1 -0
- package/dist/services/nft.service.js +148 -0
- package/dist/services/nft.service.js.map +1 -0
- package/dist/services/sbtc.service.d.ts +44 -0
- package/dist/services/sbtc.service.d.ts.map +1 -0
- package/dist/services/sbtc.service.js +100 -0
- package/dist/services/sbtc.service.js.map +1 -0
- package/dist/services/scaffold.service.d.ts +41 -0
- package/dist/services/scaffold.service.d.ts.map +1 -0
- package/dist/services/scaffold.service.js +1055 -0
- package/dist/services/scaffold.service.js.map +1 -0
- package/dist/services/stacking.service.d.ts +58 -0
- package/dist/services/stacking.service.d.ts.map +1 -0
- package/dist/services/stacking.service.js +153 -0
- package/dist/services/stacking.service.js.map +1 -0
- package/dist/services/tokens.service.d.ts +62 -0
- package/dist/services/tokens.service.d.ts.map +1 -0
- package/dist/services/tokens.service.js +119 -0
- package/dist/services/tokens.service.js.map +1 -0
- package/dist/services/wallet-manager.d.ts +107 -0
- package/dist/services/wallet-manager.d.ts.map +1 -0
- package/dist/services/wallet-manager.js +389 -0
- package/dist/services/wallet-manager.js.map +1 -0
- package/dist/services/x402.service.d.ts +26 -0
- package/dist/services/x402.service.d.ts.map +1 -0
- package/dist/services/x402.service.js +125 -0
- package/dist/services/x402.service.js.map +1 -0
- package/dist/tools/bitflow.tools.d.ts +3 -0
- package/dist/tools/bitflow.tools.d.ts.map +1 -0
- package/dist/tools/bitflow.tools.js +501 -0
- package/dist/tools/bitflow.tools.js.map +1 -0
- package/dist/tools/bns.tools.d.ts +3 -0
- package/dist/tools/bns.tools.d.ts.map +1 -0
- package/dist/tools/bns.tools.js +164 -0
- package/dist/tools/bns.tools.js.map +1 -0
- package/dist/tools/contract.tools.d.ts +3 -0
- package/dist/tools/contract.tools.d.ts.map +1 -0
- package/dist/tools/contract.tools.js +126 -0
- package/dist/tools/contract.tools.js.map +1 -0
- package/dist/tools/defi.tools.d.ts +3 -0
- package/dist/tools/defi.tools.d.ts.map +1 -0
- package/dist/tools/defi.tools.js +425 -0
- package/dist/tools/defi.tools.js.map +1 -0
- package/dist/tools/endpoint.tools.d.ts +3 -0
- package/dist/tools/endpoint.tools.d.ts.map +1 -0
- package/dist/tools/endpoint.tools.js +157 -0
- package/dist/tools/endpoint.tools.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/nft.tools.d.ts +3 -0
- package/dist/tools/nft.tools.d.ts.map +1 -0
- package/dist/tools/nft.tools.js +154 -0
- package/dist/tools/nft.tools.js.map +1 -0
- package/dist/tools/openrouter.tools.d.ts +3 -0
- package/dist/tools/openrouter.tools.d.ts.map +1 -0
- package/dist/tools/openrouter.tools.js +664 -0
- package/dist/tools/openrouter.tools.js.map +1 -0
- package/dist/tools/query.tools.d.ts +3 -0
- package/dist/tools/query.tools.d.ts.map +1 -0
- package/dist/tools/query.tools.js +209 -0
- package/dist/tools/query.tools.js.map +1 -0
- package/dist/tools/sbtc.tools.d.ts +3 -0
- package/dist/tools/sbtc.tools.d.ts.map +1 -0
- package/dist/tools/sbtc.tools.js +103 -0
- package/dist/tools/sbtc.tools.js.map +1 -0
- package/dist/tools/scaffold.tools.d.ts +3 -0
- package/dist/tools/scaffold.tools.d.ts.map +1 -0
- package/dist/tools/scaffold.tools.js +216 -0
- package/dist/tools/scaffold.tools.js.map +1 -0
- package/dist/tools/stacking.tools.d.ts +3 -0
- package/dist/tools/stacking.tools.d.ts.map +1 -0
- package/dist/tools/stacking.tools.js +112 -0
- package/dist/tools/stacking.tools.js.map +1 -0
- package/dist/tools/tokens.tools.d.ts +3 -0
- package/dist/tools/tokens.tools.d.ts.map +1 -0
- package/dist/tools/tokens.tools.js +154 -0
- package/dist/tools/tokens.tools.js.map +1 -0
- package/dist/tools/transfer.tools.d.ts +3 -0
- package/dist/tools/transfer.tools.d.ts.map +1 -0
- package/dist/tools/transfer.tools.js +62 -0
- package/dist/tools/transfer.tools.js.map +1 -0
- package/dist/tools/wallet-management.tools.d.ts +6 -0
- package/dist/tools/wallet-management.tools.d.ts.map +1 -0
- package/dist/tools/wallet-management.tools.js +390 -0
- package/dist/tools/wallet-management.tools.js.map +1 -0
- package/dist/tools/wallet.tools.d.ts +3 -0
- package/dist/tools/wallet.tools.d.ts.map +1 -0
- package/dist/tools/wallet.tools.js +105 -0
- package/dist/tools/wallet.tools.js.map +1 -0
- package/dist/transactions/builder.d.ts +56 -0
- package/dist/transactions/builder.d.ts.map +1 -0
- package/dist/transactions/builder.js +134 -0
- package/dist/transactions/builder.js.map +1 -0
- package/dist/transactions/clarity-values.d.ts +67 -0
- package/dist/transactions/clarity-values.d.ts.map +1 -0
- package/dist/transactions/clarity-values.js +169 -0
- package/dist/transactions/clarity-values.js.map +1 -0
- package/dist/transactions/post-conditions.d.ts +27 -0
- package/dist/transactions/post-conditions.d.ts.map +1 -0
- package/dist/transactions/post-conditions.js +101 -0
- package/dist/transactions/post-conditions.js.map +1 -0
- package/dist/utils/encryption.d.ts +33 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +110 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +84 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +132 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.d.ts +51 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +114 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/storage.d.ts +90 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +196 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +67 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +74 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wallet.d.ts +86 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +279 -0
- package/dist/wallet.js.map +1 -0
- 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":"AAAA,OAAO,EAAgB,MAAM,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAkB,UAAU,EAAwB,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAqC,MAAM,4BAA4B,CAAC;AA4B7F,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,OAAO,UAAU;IAGD;IAFZ,IAAI,CAAiB;IAE7B,YAAoB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QAClC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,OAAe,EACf,OAAkE;QAElE,MAAM,gBAAgB,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACrD,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,iBAAiB,EAAE,gBAAgB;SACpC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAe;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,UAAkB,EAClB,OAAe,EACf,aAAqB;QAErB,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,8BAA8B;QAE3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CACjD,UAAU,EACV,WAAW,EACX,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EACjB,aAAa,CACd,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjC,qDAAqD;gBACrD,oFAAoF;gBACpF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACzD,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QACxC,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAE3E,8BAA8B;QAC9B,MAAM,SAAS,GAAG,iBAAiB,CAAC,mBAAmB,IAAI,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjE,mDAAmD;QACnD,IAAI,WAA+B,CAAC;QACpC,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAC1D,UAAU,EACV,mBAAmB,EACnB,EAAE,EACF,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACzB,CAAC;YACF,IAAI,eAAe,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC9D,IAAI,KAAK,EAAE,CAAC;oBACV,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QAED,OAAO;YACL,UAAU;YACV,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI;YACxB,WAAW;YACX,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,UAAkB,EAClB,OAA6C;QAE7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAuB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;YACzB,IAAI,EAAE,KAAK,CAAC,KAAK;YACjB,WAAW,EAAE,KAAK,CAAC,YAAY;SAChC,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,OAAgB,EAChB,UAAkB,EAClB,OAAe,EACf,SAAiB;QAEjB,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAErF,uCAAuC;QACvC,sEAAsE;QACtE,MAAM,YAAY,GAAmB;YACnC,MAAM,CAAC,OAAO,CAAC;YACf,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5B,WAAW,CAAC,SAAS,CAAC;SACvB,CAAC;QAEF,OAAO,YAAY,CAAC,OAAO,EAAE;YAC3B,eAAe;YACf,YAAY;YACZ,YAAY,EAAE,UAAU;YACxB,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,OAAgB,EAChB,UAAkB,EAClB,SAAiB,EACjB,mBAA2B,MAAM;QAEjC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAErF,kFAAkF;QAClF,MAAM,YAAY,GAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAE9D,OAAO,YAAY,CAAC,OAAO,EAAE;YAC3B,eAAe;YACf,YAAY;YACZ,YAAY,EAAE,gBAAgB;YAC9B,YAAY;SACb,CAAC,CAAC;IACL,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,IAAI,mBAAmB,GAAsB,IAAI,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC;QACvE,mBAAmB,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
|