chia-explorer 0.1.4 → 0.1.6

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 (37) hide show
  1. package/README.md +22 -4
  2. package/dist/chia/offer.d.ts +58 -0
  3. package/dist/chia/offer.js +356 -0
  4. package/dist/chia/offer.js.map +1 -0
  5. package/dist/coinset/pagination.d.ts +2 -0
  6. package/dist/coinset/pagination.js +4 -0
  7. package/dist/coinset/pagination.js.map +1 -1
  8. package/dist/server.js +18 -0
  9. package/dist/server.js.map +1 -1
  10. package/dist/tools/blockchain/get-block-additions-and-removals.d.ts +2 -0
  11. package/dist/tools/blockchain/get-block-additions-and-removals.js +52 -0
  12. package/dist/tools/blockchain/get-block-additions-and-removals.js.map +1 -0
  13. package/dist/tools/coins/get-coin-records-by-parent-ids.d.ts +2 -0
  14. package/dist/tools/coins/get-coin-records-by-parent-ids.js +40 -0
  15. package/dist/tools/coins/get-coin-records-by-parent-ids.js.map +1 -0
  16. package/dist/tools/coins/get-puzzle-and-solution.d.ts +2 -0
  17. package/dist/tools/coins/get-puzzle-and-solution.js +51 -0
  18. package/dist/tools/coins/get-puzzle-and-solution.js.map +1 -0
  19. package/dist/tools/mempool/estimate-fee.d.ts +2 -0
  20. package/dist/tools/mempool/estimate-fee.js +73 -0
  21. package/dist/tools/mempool/estimate-fee.js.map +1 -0
  22. package/dist/tools/mempool/get-mempool.d.ts +2 -0
  23. package/dist/tools/mempool/get-mempool.js +51 -0
  24. package/dist/tools/mempool/get-mempool.js.map +1 -0
  25. package/dist/tools/mempool/is-in-mempool.d.ts +2 -0
  26. package/dist/tools/mempool/is-in-mempool.js +37 -0
  27. package/dist/tools/mempool/is-in-mempool.js.map +1 -0
  28. package/dist/tools/offers/decode-offer.d.ts +2 -0
  29. package/dist/tools/offers/decode-offer.js +20 -0
  30. package/dist/tools/offers/decode-offer.js.map +1 -0
  31. package/dist/tools/offers/decode-spend-bundle.d.ts +2 -0
  32. package/dist/tools/offers/decode-spend-bundle.js +20 -0
  33. package/dist/tools/offers/decode-spend-bundle.js.map +1 -0
  34. package/dist/tools/offers/decompile-puzzle.d.ts +2 -0
  35. package/dist/tools/offers/decompile-puzzle.js +62 -0
  36. package/dist/tools/offers/decompile-puzzle.js.map +1 -0
  37. package/package.json +2 -1
package/README.md CHANGED
@@ -2,16 +2,21 @@
2
2
 
3
3
  MCP server that answers questions about the Chia blockchain. Read-only, no keys, no signing.
4
4
 
5
- Backed by the public [coinset.org](https://www.coinset.org) full-node API. Supports mainnet (default) and testnet11. Auto-detects network from `xch` or `txch` address prefixes.
5
+ Backed by the public [coinset.org](https://www.coinset.org) full-node API for chain data and [CoinGecko](https://www.coingecko.com) for XCH price. Offer strings and CLVM puzzles are decoded locally via the [chia-wallet-sdk](https://github.com/xch-dev/chia-wallet-sdk) native module — no extra services. Supports mainnet (default) and testnet11. Auto-detects network from `xch` or `txch` address prefixes.
6
6
 
7
7
  ## What it can answer
8
8
 
9
9
  - What is the current netspace? Peak height? Sync status?
10
- - What is the header hash of block N? How many transactions in that block?
10
+ - What is the header hash of block N? How many transactions in that block? What coins were created or destroyed?
11
11
  - What is the balance of `xch1...` (or `txch1...`, or a raw puzzle hash)?
12
- - Look up a coin by name. Calculate a coin name from its fields.
12
+ - Look up a coin by name. Calculate a coin name from its fields. Find the children produced by spending a coin.
13
+ - Fetch the CLVM puzzle reveal and solution for a spent coin, plus an automatic classification (xch / cat / nft / did) and parsed conditions.
14
+ - Decode a Chia `offer1...` string locally and tell you what's being traded. Same for any raw spend bundle.
15
+ - Decompile any puzzle reveal and identify its kind (CAT with asset_id, NFT with launcher_id, settlement-payments, plain p2, etc.).
16
+ - What's currently in the mempool? Is my specific transaction pending? What fee should I pay for inclusion in 1/5/15 minutes?
13
17
  - Convert between addresses and puzzle hashes in either direction.
14
18
  - What is XCH worth in USD (or EUR, GBP, BTC, ...) right now? What's this balance worth?
19
+ - How much XCH is left in the strategic reserve? Where has it been sent? Which destinations are known partners, market makers, or exchanges?
15
20
 
16
21
  ## Install
17
22
 
@@ -56,16 +61,28 @@ Add to your `claude_desktop_config.json`:
56
61
  | `get_block_by_height` | Block record + header hash for a height |
57
62
  | `get_block_by_hash` | Block record for a header hash |
58
63
  | `count_block_transactions` | Coin spends, additions, removals counts for a block |
64
+ | `get_block_additions_and_removals` | Every coin created and destroyed in a block (full lists, not just counts) |
59
65
  | `get_balance` | Balance of an address or puzzle hash (paginated, unspent coins) |
60
66
  | `get_coin_records_by_puzzle_hash` | Raw coin records for a puzzle hash or address |
67
+ | `get_coin_records_by_parent_ids` | Children of one or more spent coins (the usual coin-lineage step) |
61
68
  | `get_coin_by_name` | Coin record by coin name |
62
69
  | `calculate_coin_name` | sha256(parent_coin_info \|\| puzzle_hash \|\| amount) — no RPC |
70
+ | `get_puzzle_and_solution` | CLVM puzzle reveal + solution for a spent coin, plus automatic puzzle classification and parsed conditions |
71
+ | `decode_offer` | Decode a `offer1...` string locally into offered / requested assets (XCH, CATs with asset_id, NFTs with launcher_id) |
72
+ | `decode_spend_bundle` | Same trade-summary shape as `decode_offer` but for any raw hex spend bundle (e.g. a mempool item) |
73
+ | `decompile_puzzle` | Classify any CLVM puzzle reveal (or fetch via coin_id+height) and optionally parse the conditions a spend emits |
74
+ | `get_mempool` | List tx_ids currently in the mempool (paginated, with optional full items) |
75
+ | `is_in_mempool` | Check whether a specific tx_id is sitting in the mempool right now |
76
+ | `estimate_fee` | Recommended mojo fee for inclusion in 1/5/15 minutes (configurable target_times + spend_type bias) |
63
77
  | `address_to_puzzle_hash` | bech32m decode — no RPC |
64
78
  | `puzzle_hash_to_address` | bech32m encode — no RPC |
65
79
  | `get_xch_price` | Current XCH spot price in one or more currencies (CoinGecko) |
66
80
  | `convert_xch_to_fiat` | Convert a mojo amount to fiat using the current XCH price |
81
+ | `get_prefarm_status` | Live per-wallet balances of the 21M XCH strategic reserve, plus total spent |
82
+ | `get_prefarm_spends` | Outflows from the reserve, with destinations labelled when known (partners / market makers / exchanges). Filter by wallet, height, or count |
83
+ | `list_prefarm_addresses` | The hardcoded registry: custody wallets and known destination addresses. No network call |
67
84
 
68
- Blockchain tools take an optional `network: "mainnet" | "testnet11"` (default `mainnet`). The price tools don't take a network arg.
85
+ Blockchain tools take an optional `network: "mainnet" | "testnet11"` (default `mainnet`). The price tools take no network arg. The prefarm tools are mainnet only.
69
86
 
70
87
  ## Optional config
71
88
 
@@ -76,6 +93,7 @@ Blockchain tools take an optional `network: "mainnet" | "testnet11"` (default `m
76
93
  - `network_status` — quick snapshot of current chain state
77
94
  - `address_summary` — balance and recent activity for an address
78
95
  - `block_summary` — block details plus transaction counts
96
+ - `prefarm_summary` — strategic reserve balances, recent outflows, and known destinations
79
97
 
80
98
  ## What it isn't
81
99
 
@@ -0,0 +1,58 @@
1
+ export type AssetKind = 'xch' | 'cat' | 'nft' | 'singleton' | 'did' | 'unknown';
2
+ export interface OfferedAsset {
3
+ asset_kind: AssetKind;
4
+ asset_id?: string | undefined;
5
+ nft_launcher_id?: string | undefined;
6
+ amount_mojo: string;
7
+ amount_xch?: string | undefined;
8
+ source_puzzle_hash: string;
9
+ source_coin_id: string;
10
+ }
11
+ export interface RequestedAsset {
12
+ asset_kind: AssetKind;
13
+ asset_id?: string | undefined;
14
+ nft_launcher_id?: string | undefined;
15
+ amount_mojo: string;
16
+ amount_xch?: string | undefined;
17
+ destination_puzzle_hash: string;
18
+ nonce: string;
19
+ }
20
+ export interface TradeSummary {
21
+ offered: OfferedAsset[];
22
+ requested: RequestedAsset[];
23
+ fee_mojo: string;
24
+ coin_spends_count: number;
25
+ aggregated_signature: string;
26
+ }
27
+ export interface ClassifiedSpend {
28
+ kind: AssetKind;
29
+ asset_id?: string | undefined;
30
+ launcher_id?: string | undefined;
31
+ inner_puzzle_hash?: string | undefined;
32
+ puzzle_hash: string;
33
+ /** True when the inner puzzle is the settlement-payments mod (i.e. this coin holds requested payments). */
34
+ is_settlement: boolean;
35
+ }
36
+ export interface ParsedCondition {
37
+ opcode: string;
38
+ data: Record<string, unknown>;
39
+ }
40
+ export interface ParsedConditions {
41
+ create_coins: Array<{
42
+ puzzle_hash: string;
43
+ amount: string;
44
+ memos: string[];
45
+ }>;
46
+ reserve_fee_mojo: string;
47
+ agg_sigs_count: number;
48
+ announcements: Array<{
49
+ kind: 'create_coin' | 'create_puzzle';
50
+ message: string;
51
+ }>;
52
+ asserts: ParsedCondition[];
53
+ other: ParsedCondition[];
54
+ }
55
+ export declare function classifyPuzzle(puzzleRevealHex: string): ClassifiedSpend;
56
+ export declare function parseConditions(puzzleRevealHex: string, solutionHex: string): ParsedConditions;
57
+ export declare function decodeOfferString(offer: string): TradeSummary;
58
+ export declare function summarizeSpendBundleHex(bundleHex: string): TradeSummary;
@@ -0,0 +1,356 @@
1
+ import { Clvm, Constants, SpendBundle, bytesEqual, decodeOffer, toHex, } from 'chia-wallet-sdk';
2
+ import { hexToBytes, stripHexPrefix } from './hex.js';
3
+ import { mojoToXch } from './amounts.js';
4
+ function memosToStrings(memos) {
5
+ if (!memos)
6
+ return [];
7
+ const list = memos.toList();
8
+ if (!list)
9
+ return [];
10
+ const out = [];
11
+ for (const m of list) {
12
+ const atom = m.toAtom();
13
+ if (atom)
14
+ out.push(toHex(atom));
15
+ }
16
+ return out;
17
+ }
18
+ function classifyProgram(clvm, puzzleProgram) {
19
+ const puzzle = puzzleProgram.puzzle();
20
+ const puzzleHash = toHex(puzzle.puzzleHash);
21
+ const settlementHash = Constants.settlementPaymentHash();
22
+ if (bytesEqual(puzzle.puzzleHash, settlementHash)) {
23
+ return {
24
+ kind: 'xch',
25
+ is_settlement_outer: true,
26
+ is_settlement_inner: false,
27
+ puzzle_hash: puzzleHash,
28
+ };
29
+ }
30
+ const catInfo = puzzle.parseCatInfo();
31
+ if (catInfo) {
32
+ const inner = catInfo.info.p2PuzzleHash;
33
+ const inner_puzzle_hash = toHex(inner);
34
+ return {
35
+ kind: 'cat',
36
+ asset_id: toHex(catInfo.info.assetId),
37
+ inner_puzzle_hash,
38
+ is_settlement_outer: false,
39
+ is_settlement_inner: bytesEqual(inner, settlementHash),
40
+ puzzle_hash: puzzleHash,
41
+ };
42
+ }
43
+ const nftInfo = puzzle.parseNftInfo();
44
+ if (nftInfo) {
45
+ const inner = nftInfo.info.p2PuzzleHash;
46
+ return {
47
+ kind: 'nft',
48
+ launcher_id: toHex(nftInfo.info.launcherId),
49
+ inner_puzzle_hash: toHex(inner),
50
+ is_settlement_outer: false,
51
+ is_settlement_inner: bytesEqual(inner, settlementHash),
52
+ puzzle_hash: puzzleHash,
53
+ };
54
+ }
55
+ const didInfo = puzzle.parseDidInfo();
56
+ if (didInfo) {
57
+ return {
58
+ kind: 'did',
59
+ launcher_id: toHex(didInfo.info.launcherId),
60
+ inner_puzzle_hash: toHex(didInfo.info.p2PuzzleHash),
61
+ is_settlement_outer: false,
62
+ is_settlement_inner: false,
63
+ puzzle_hash: puzzleHash,
64
+ };
65
+ }
66
+ // Singleton-shaped puzzles without a recognised inner layer.
67
+ if (bytesEqual(puzzle.modHash, Constants.singletonTopLayerHash())) {
68
+ return {
69
+ kind: 'singleton',
70
+ is_settlement_outer: false,
71
+ is_settlement_inner: false,
72
+ puzzle_hash: puzzleHash,
73
+ };
74
+ }
75
+ return {
76
+ kind: 'unknown',
77
+ is_settlement_outer: false,
78
+ is_settlement_inner: false,
79
+ puzzle_hash: puzzleHash,
80
+ };
81
+ }
82
+ export function classifyPuzzle(puzzleRevealHex) {
83
+ const bytes = hexToBytes(stripHexPrefix(puzzleRevealHex));
84
+ const clvm = new Clvm();
85
+ const program = clvm.deserialize(bytes);
86
+ const c = classifyProgram(clvm, program);
87
+ return {
88
+ kind: c.kind,
89
+ asset_id: c.asset_id,
90
+ launcher_id: c.launcher_id,
91
+ inner_puzzle_hash: c.inner_puzzle_hash,
92
+ puzzle_hash: c.puzzle_hash,
93
+ is_settlement: c.is_settlement_outer || c.is_settlement_inner,
94
+ };
95
+ }
96
+ function safeCall(fn) {
97
+ try {
98
+ return fn();
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ export function parseConditions(puzzleRevealHex, solutionHex) {
105
+ const clvm = new Clvm();
106
+ const puzzle = clvm.deserialize(hexToBytes(stripHexPrefix(puzzleRevealHex)));
107
+ const solution = clvm.deserialize(hexToBytes(stripHexPrefix(solutionHex)));
108
+ const output = puzzle.run(solution, 11000000000n, false);
109
+ const conditions = output.value.toList() ?? [];
110
+ const create_coins = [];
111
+ let reserve_fee = 0n;
112
+ let agg_sigs_count = 0;
113
+ const announcements = [];
114
+ const asserts = [];
115
+ const other = [];
116
+ for (const cond of conditions) {
117
+ const cc = safeCall(() => cond.parseCreateCoin());
118
+ if (cc) {
119
+ create_coins.push({
120
+ puzzle_hash: toHex(cc.puzzleHash),
121
+ amount: cc.amount.toString(),
122
+ memos: memosToStrings(cc.memos),
123
+ });
124
+ continue;
125
+ }
126
+ const rf = safeCall(() => cond.parseReserveFee());
127
+ if (rf) {
128
+ reserve_fee += rf.amount;
129
+ continue;
130
+ }
131
+ const cca = safeCall(() => cond.parseCreateCoinAnnouncement());
132
+ if (cca) {
133
+ announcements.push({ kind: 'create_coin', message: toHex(cca.message) });
134
+ continue;
135
+ }
136
+ const cpa = safeCall(() => cond.parseCreatePuzzleAnnouncement());
137
+ if (cpa) {
138
+ announcements.push({ kind: 'create_puzzle', message: toHex(cpa.message) });
139
+ continue;
140
+ }
141
+ if (safeCall(() => cond.parseAggSigMe()) ||
142
+ safeCall(() => cond.parseAggSigParent()) ||
143
+ safeCall(() => cond.parseAggSigPuzzle()) ||
144
+ safeCall(() => cond.parseAggSigAmount()) ||
145
+ safeCall(() => cond.parseAggSigParentAmount()) ||
146
+ safeCall(() => cond.parseAggSigParentPuzzle()) ||
147
+ safeCall(() => cond.parseAggSigPuzzleAmount()) ||
148
+ safeCall(() => cond.parseAggSigUnsafe())) {
149
+ agg_sigs_count++;
150
+ continue;
151
+ }
152
+ const opcodeProgram = safeCall(() => cond.first());
153
+ const opcode = opcodeProgram?.toInt() ?? null;
154
+ const opcodeStr = opcode === null ? 'unknown' : opcode.toString();
155
+ const assertParsers = [
156
+ () => cond.parseAssertMyCoinId(),
157
+ () => cond.parseAssertMyParentId(),
158
+ () => cond.parseAssertMyPuzzleHash(),
159
+ () => cond.parseAssertMyAmount(),
160
+ () => cond.parseAssertCoinAnnouncement(),
161
+ () => cond.parseAssertPuzzleAnnouncement(),
162
+ () => cond.parseAssertSecondsRelative(),
163
+ () => cond.parseAssertSecondsAbsolute(),
164
+ () => cond.parseAssertHeightRelative(),
165
+ () => cond.parseAssertHeightAbsolute(),
166
+ () => cond.parseAssertBeforeSecondsRelative(),
167
+ () => cond.parseAssertBeforeSecondsAbsolute(),
168
+ () => cond.parseAssertBeforeHeightRelative(),
169
+ () => cond.parseAssertBeforeHeightAbsolute(),
170
+ ];
171
+ let matchedAssert = false;
172
+ for (const p of assertParsers) {
173
+ if (safeCall(p)) {
174
+ asserts.push({ opcode: opcodeStr, data: {} });
175
+ matchedAssert = true;
176
+ break;
177
+ }
178
+ }
179
+ if (matchedAssert)
180
+ continue;
181
+ other.push({ opcode: opcodeStr, data: {} });
182
+ }
183
+ return {
184
+ create_coins,
185
+ reserve_fee_mojo: reserve_fee.toString(),
186
+ agg_sigs_count,
187
+ announcements,
188
+ asserts,
189
+ other,
190
+ };
191
+ }
192
+ function extractNotarizedPayments(solution) {
193
+ const list = solution.toList();
194
+ if (!list)
195
+ return [];
196
+ const rows = [];
197
+ for (const item of list) {
198
+ const np = safeCall(() => item.parseNotarizedPayment());
199
+ if (!np)
200
+ continue;
201
+ const nonceHex = toHex(np.nonce);
202
+ for (const p of np.payments) {
203
+ rows.push({
204
+ nonce: nonceHex,
205
+ puzzle_hash: toHex(p.puzzleHash),
206
+ amount: p.amount,
207
+ });
208
+ }
209
+ }
210
+ return rows;
211
+ }
212
+ function summarizeBundle(bundle) {
213
+ const clvm = new Clvm();
214
+ const offered = [];
215
+ const requested = [];
216
+ let fee = 0n;
217
+ for (const cs of bundle.coinSpends) {
218
+ let puzzleProgram;
219
+ let solutionProgram;
220
+ try {
221
+ puzzleProgram = clvm.deserialize(cs.puzzleReveal);
222
+ solutionProgram = clvm.deserialize(cs.solution);
223
+ }
224
+ catch {
225
+ // Unparseable spend — record it as unknown offered and continue.
226
+ offered.push({
227
+ asset_kind: 'unknown',
228
+ amount_mojo: cs.coin.amount.toString(),
229
+ source_puzzle_hash: toHex(cs.coin.puzzleHash),
230
+ source_coin_id: toHex(cs.coin.coinId()),
231
+ });
232
+ continue;
233
+ }
234
+ const c = classifyProgram(clvm, puzzleProgram);
235
+ if (c.is_settlement_outer) {
236
+ // Pure XCH settlement-payments coin → requested XCH payments.
237
+ for (const row of extractNotarizedPayments(solutionProgram)) {
238
+ requested.push({
239
+ asset_kind: 'xch',
240
+ amount_mojo: row.amount.toString(),
241
+ amount_xch: mojoToXch(row.amount),
242
+ destination_puzzle_hash: row.puzzle_hash,
243
+ nonce: row.nonce,
244
+ });
245
+ }
246
+ continue;
247
+ }
248
+ if (c.is_settlement_inner) {
249
+ // Settlement wrapped in CAT/NFT — requested CAT or NFT side.
250
+ // The CAT/NFT solution contains the inner (settlement) solution as one of its members.
251
+ // For CAT: solution = (inner_puzzle_reveal inner_solution ...). We extract the second.
252
+ // For NFT: solution = (inner_solution ...). For a singleton-layer NFT the inner_solution is the first.
253
+ // Robust strategy: walk the solution looking for any sub-program that parses as a list of notarized payments.
254
+ const candidates = [];
255
+ const stack = [solutionProgram];
256
+ while (stack.length) {
257
+ const node = stack.pop();
258
+ candidates.push(node);
259
+ if (node.isPair()) {
260
+ const f = safeCall(() => node.first());
261
+ const r = safeCall(() => node.rest());
262
+ if (f)
263
+ stack.push(f);
264
+ if (r)
265
+ stack.push(r);
266
+ }
267
+ }
268
+ let found = [];
269
+ for (const cand of candidates) {
270
+ const rows = extractNotarizedPayments(cand);
271
+ if (rows.length > 0) {
272
+ found = rows;
273
+ break;
274
+ }
275
+ }
276
+ for (const row of found) {
277
+ requested.push({
278
+ asset_kind: c.kind,
279
+ asset_id: c.asset_id,
280
+ nft_launcher_id: c.kind === 'nft' ? c.launcher_id : undefined,
281
+ amount_mojo: row.amount.toString(),
282
+ amount_xch: c.kind === 'xch' ? mojoToXch(row.amount) : undefined,
283
+ destination_puzzle_hash: row.puzzle_hash,
284
+ nonce: row.nonce,
285
+ });
286
+ }
287
+ if (found.length === 0) {
288
+ // Couldn't extract — still record the requested-side kind with a 0 amount placeholder
289
+ // so the caller knows something was requested. Use the coin's amount as a best-effort.
290
+ requested.push({
291
+ asset_kind: c.kind,
292
+ asset_id: c.asset_id,
293
+ nft_launcher_id: c.kind === 'nft' ? c.launcher_id : undefined,
294
+ amount_mojo: cs.coin.amount.toString(),
295
+ destination_puzzle_hash: toHex(cs.coin.puzzleHash),
296
+ nonce: '',
297
+ });
298
+ }
299
+ continue;
300
+ }
301
+ // Non-settlement spend → maker's offered asset.
302
+ offered.push({
303
+ asset_kind: c.kind,
304
+ asset_id: c.asset_id,
305
+ nft_launcher_id: c.kind === 'nft' ? c.launcher_id : undefined,
306
+ amount_mojo: cs.coin.amount.toString(),
307
+ amount_xch: c.kind === 'xch' ? mojoToXch(cs.coin.amount) : undefined,
308
+ source_puzzle_hash: toHex(cs.coin.puzzleHash),
309
+ source_coin_id: toHex(cs.coin.coinId()),
310
+ });
311
+ // Best-effort reserve-fee extraction from this spend's conditions.
312
+ try {
313
+ const out = puzzleProgram.run(solutionProgram, 11000000000n, false);
314
+ const conds = out.value.toList() ?? [];
315
+ for (const cond of conds) {
316
+ const rf = safeCall(() => cond.parseReserveFee());
317
+ if (rf)
318
+ fee += rf.amount;
319
+ }
320
+ }
321
+ catch {
322
+ // ignore — running an offer's maker spend can fail without full chain context
323
+ }
324
+ }
325
+ return {
326
+ offered,
327
+ requested,
328
+ fee_mojo: fee.toString(),
329
+ coin_spends_count: bundle.coinSpends.length,
330
+ aggregated_signature: toHex(bundle.aggregatedSignature.toBytes()),
331
+ };
332
+ }
333
+ export function decodeOfferString(offer) {
334
+ let bundle;
335
+ try {
336
+ bundle = decodeOffer(offer);
337
+ }
338
+ catch (err) {
339
+ const msg = err instanceof Error ? err.message : String(err);
340
+ throw new Error(`invalid offer string: ${msg}`, { cause: err });
341
+ }
342
+ return summarizeBundle(bundle);
343
+ }
344
+ export function summarizeSpendBundleHex(bundleHex) {
345
+ const bytes = hexToBytes(stripHexPrefix(bundleHex));
346
+ let bundle;
347
+ try {
348
+ bundle = SpendBundle.fromBytes(bytes);
349
+ }
350
+ catch (err) {
351
+ const msg = err instanceof Error ? err.message : String(err);
352
+ throw new Error(`invalid spend bundle hex: ${msg}`, { cause: err });
353
+ }
354
+ return summarizeBundle(bundle);
355
+ }
356
+ //# sourceMappingURL=offer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer.js","sourceRoot":"","sources":["../../src/chia/offer.ts"],"names":[],"mappings":"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"}
@@ -29,4 +29,6 @@ export declare function fetchCoinRecordsByPuzzleHash(agent: RPCAgent, puzzleHash
29
29
  }): Promise<CoinRecordLike[]>;
30
30
  export declare function fetchCoinRecordsByParentIds(agent: RPCAgent, parentIds: readonly string[], options?: {
31
31
  includeSpent?: boolean;
32
+ startHeight?: number;
33
+ endHeight?: number;
32
34
  }): Promise<CoinRecordLike[]>;
@@ -60,6 +60,10 @@ export async function fetchCoinRecordsByParentIds(agent, parentIds, options = {}
60
60
  parent_ids: batch,
61
61
  include_spent_coins: includeSpent,
62
62
  };
63
+ if (options.startHeight !== undefined)
64
+ payload.start_height = options.startHeight;
65
+ if (options.endHeight !== undefined)
66
+ payload.end_height = options.endHeight;
63
67
  const res = await get_coin_records_by_parent_ids(agent, payload);
64
68
  const records = (res.coin_records ?? []);
65
69
  all.push(...records);
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/coinset/pagination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/coinset/pagination.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -6,10 +6,13 @@ import { register as registerGetPeakHeight } from './tools/blockchain/get-peak-h
6
6
  import { register as registerGetBlockByHeight } from './tools/blockchain/get-block-by-height.js';
7
7
  import { register as registerGetBlockByHash } from './tools/blockchain/get-block-by-hash.js';
8
8
  import { register as registerCountBlockTransactions } from './tools/blockchain/count-block-transactions.js';
9
+ import { register as registerGetBlockAdditionsAndRemovals } from './tools/blockchain/get-block-additions-and-removals.js';
9
10
  import { register as registerGetBalance } from './tools/coins/get-balance.js';
10
11
  import { register as registerGetCoinRecordsByPuzzleHash } from './tools/coins/get-coin-records-by-puzzle-hash.js';
12
+ import { register as registerGetCoinRecordsByParentIds } from './tools/coins/get-coin-records-by-parent-ids.js';
11
13
  import { register as registerGetCoinByName } from './tools/coins/get-coin-by-name.js';
12
14
  import { register as registerCalculateCoinName } from './tools/coins/calculate-coin-name.js';
15
+ import { register as registerGetPuzzleAndSolution } from './tools/coins/get-puzzle-and-solution.js';
13
16
  import { register as registerAddressToPuzzleHash } from './tools/addresses/address-to-puzzle-hash.js';
14
17
  import { register as registerPuzzleHashToAddress } from './tools/addresses/puzzle-hash-to-address.js';
15
18
  import { register as registerGetXchPrice } from './tools/price/get-xch-price.js';
@@ -17,6 +20,12 @@ import { register as registerConvertXchToFiat } from './tools/price/convert-xch-
17
20
  import { register as registerGetPrefarmStatus } from './tools/prefarm/get-prefarm-status.js';
18
21
  import { register as registerGetPrefarmSpends } from './tools/prefarm/get-prefarm-spends.js';
19
22
  import { register as registerListPrefarmAddresses } from './tools/prefarm/list-prefarm-addresses.js';
23
+ import { register as registerDecodeOffer } from './tools/offers/decode-offer.js';
24
+ import { register as registerDecodeSpendBundle } from './tools/offers/decode-spend-bundle.js';
25
+ import { register as registerDecompilePuzzle } from './tools/offers/decompile-puzzle.js';
26
+ import { register as registerGetMempool } from './tools/mempool/get-mempool.js';
27
+ import { register as registerIsInMempool } from './tools/mempool/is-in-mempool.js';
28
+ import { register as registerEstimateFee } from './tools/mempool/estimate-fee.js';
20
29
  import { register as registerNetworkStatusPrompt } from './prompts/network-status.js';
21
30
  import { register as registerAddressSummaryPrompt } from './prompts/address-summary.js';
22
31
  import { register as registerBlockSummaryPrompt } from './prompts/block-summary.js';
@@ -36,10 +45,13 @@ export function createServer() {
36
45
  registerGetBlockByHeight(server);
37
46
  registerGetBlockByHash(server);
38
47
  registerCountBlockTransactions(server);
48
+ registerGetBlockAdditionsAndRemovals(server);
39
49
  registerGetBalance(server);
40
50
  registerGetCoinRecordsByPuzzleHash(server);
51
+ registerGetCoinRecordsByParentIds(server);
41
52
  registerGetCoinByName(server);
42
53
  registerCalculateCoinName(server);
54
+ registerGetPuzzleAndSolution(server);
43
55
  registerAddressToPuzzleHash(server);
44
56
  registerPuzzleHashToAddress(server);
45
57
  registerGetXchPrice(server);
@@ -47,6 +59,12 @@ export function createServer() {
47
59
  registerGetPrefarmStatus(server);
48
60
  registerGetPrefarmSpends(server);
49
61
  registerListPrefarmAddresses(server);
62
+ registerDecodeOffer(server);
63
+ registerDecodeSpendBundle(server);
64
+ registerDecompilePuzzle(server);
65
+ registerGetMempool(server);
66
+ registerIsInMempool(server);
67
+ registerEstimateFee(server);
50
68
  registerNetworkStatusPrompt(server);
51
69
  registerAddressSummaryPrompt(server);
52
70
  registerBlockSummaryPrompt(server);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ import { get_additions_and_removals, get_block_record_by_height, } from 'chia-agent/api/rpc/full_node/index.js';
3
+ import { getAgent } from '../../coinset/agent.js';
4
+ import { hex32Schema, heightSchema, networkSchema } from '../../schemas/common.js';
5
+ import { stripHexPrefix } from '../../chia/hex.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('get_block_additions_and_removals', 'List every coin created (additions) and destroyed (removals) in a single block. Pass either height OR header_hash. Use this when a singleton control coin and funds coin spend together — direct parent-id lookup misses the funds child but this tool surfaces it.', {
9
+ height: heightSchema.optional(),
10
+ header_hash: hex32Schema.optional(),
11
+ network: networkSchema,
12
+ }, async ({ height, header_hash, network }) => {
13
+ try {
14
+ if (height === undefined && header_hash === undefined) {
15
+ throw new Error('provide either height or header_hash');
16
+ }
17
+ if (height !== undefined && header_hash !== undefined) {
18
+ throw new Error('provide only one of height or header_hash, not both');
19
+ }
20
+ const agent = getAgent(network);
21
+ let resolvedHash;
22
+ let resolvedHeight = null;
23
+ if (header_hash !== undefined) {
24
+ resolvedHash = stripHexPrefix(header_hash).toLowerCase();
25
+ }
26
+ else {
27
+ const rec = await get_block_record_by_height(agent, { height: height });
28
+ if (!rec.block_record)
29
+ throw new Error(`no block record at height ${height}`);
30
+ resolvedHash = rec.block_record.header_hash;
31
+ resolvedHeight = rec.block_record.height;
32
+ }
33
+ const res = await get_additions_and_removals(agent, { header_hash: resolvedHash });
34
+ const additions = res.additions ?? [];
35
+ const removals = res.removals ?? [];
36
+ return jsonText({
37
+ network,
38
+ height: resolvedHeight,
39
+ header_hash: resolvedHash,
40
+ additions_count: additions.length,
41
+ removals_count: removals.length,
42
+ additions,
43
+ removals,
44
+ });
45
+ }
46
+ catch (err) {
47
+ return errorText(err);
48
+ }
49
+ });
50
+ }
51
+ void z;
52
+ //# sourceMappingURL=get-block-additions-and-removals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block-additions-and-removals.js","sourceRoot":"","sources":["../../../src/tools/blockchain/get-block-additions-and-removals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kCAAkC,EAClC,qQAAqQ,EACrQ;QACE,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE;QAC/B,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;QACnC,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,IAAI,YAAoB,CAAC;YACzB,IAAI,cAAc,GAAkB,IAAI,CAAC;YACzC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAgB,EAAE,CAAC,CAAC;gBAClF,IAAI,CAAC,GAAG,CAAC,YAAY;oBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAO,EAAE,CAAC,CAAC;gBAC/E,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;gBAC5C,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;YAC3C,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACnF,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,MAAM,EAAE,cAAc;gBACtB,WAAW,EAAE,YAAY;gBACzB,eAAe,EAAE,SAAS,CAAC,MAAM;gBACjC,cAAc,EAAE,QAAQ,CAAC,MAAM;gBAC/B,SAAS;gBACT,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,KAAK,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { fetchCoinRecordsByParentIds } from '../../coinset/pagination.js';
4
+ import { hex32Schema, networkSchema } from '../../schemas/common.js';
5
+ import { stripHexPrefix } from '../../chia/hex.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('get_coin_records_by_parent_ids', 'Return raw coin records for the given parent coin names. Use this to find the children produced by spending a coin. include_spent_coins defaults to true.', {
9
+ parent_ids: z
10
+ .array(hex32Schema)
11
+ .min(1)
12
+ .max(1000)
13
+ .describe('32-byte coin names (parent ids), 0x-prefixed or bare hex'),
14
+ include_spent_coins: z.boolean().optional().describe('Include spent children (default true)'),
15
+ start_height: z.number().int().nonnegative().optional(),
16
+ end_height: z.number().int().nonnegative().optional(),
17
+ network: networkSchema,
18
+ }, async ({ parent_ids, include_spent_coins, start_height, end_height, network }) => {
19
+ try {
20
+ const agent = getAgent(network);
21
+ const normalized = parent_ids.map((id) => stripHexPrefix(id).toLowerCase());
22
+ const records = await fetchCoinRecordsByParentIds(agent, normalized, {
23
+ includeSpent: include_spent_coins ?? true,
24
+ ...(start_height !== undefined ? { startHeight: start_height } : {}),
25
+ ...(end_height !== undefined ? { endHeight: end_height } : {}),
26
+ });
27
+ return jsonText({
28
+ network,
29
+ parent_ids: normalized,
30
+ parent_count: normalized.length,
31
+ coin_count: records.length,
32
+ coin_records: records,
33
+ });
34
+ }
35
+ catch (err) {
36
+ return errorText(err);
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=get-coin-records-by-parent-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-coin-records-by-parent-ids.js","sourceRoot":"","sources":["../../../src/tools/coins/get-coin-records-by-parent-ids.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,2JAA2J,EAC3J;QACE,UAAU,EAAE,CAAC;aACV,KAAK,CAAC,WAAW,CAAC;aAClB,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,IAAI,CAAC;aACT,QAAQ,CAAC,0DAA0D,CAAC;QACvE,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACrD,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,MAAM,2BAA2B,CAAC,KAAK,EAAE,UAAU,EAAE;gBACnE,YAAY,EAAE,mBAAmB,IAAI,IAAI;gBACzC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,UAAU,EAAE,UAAU;gBACtB,YAAY,EAAE,UAAU,CAAC,MAAM;gBAC/B,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,YAAY,EAAE,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,51 @@
1
+ import { get_puzzle_and_solution } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { hex32Schema, heightSchema, networkSchema } from '../../schemas/common.js';
4
+ import { stripHexPrefix } from '../../chia/hex.js';
5
+ import { classifyPuzzle, parseConditions } from '../../chia/offer.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('get_puzzle_and_solution', 'Fetch the CLVM puzzle reveal and solution for a coin at its spent block height. Reveals what a spend actually did — required for decoding singleton state transitions. Now also returns a `classification` of the puzzle (xch / cat / nft / did / unknown, plus asset_id / launcher_id) and the `parsed_conditions` emitted by running the puzzle with its solution.', {
9
+ coin_id: hex32Schema.describe('32-byte coin name'),
10
+ height: heightSchema.describe('The spent_block_index of the coin (the block where the coin was spent)'),
11
+ network: networkSchema,
12
+ }, async ({ coin_id, height, network }) => {
13
+ try {
14
+ const agent = getAgent(network);
15
+ const normalized = stripHexPrefix(coin_id).toLowerCase();
16
+ const res = await get_puzzle_and_solution(agent, {
17
+ coin_id: normalized,
18
+ height,
19
+ });
20
+ const out = {
21
+ network,
22
+ coin_id: normalized,
23
+ height,
24
+ coin_solution: res.coin_solution,
25
+ };
26
+ const puzzleReveal = res.coin_solution?.puzzle_reveal;
27
+ const solution = res.coin_solution?.solution;
28
+ if (typeof puzzleReveal === 'string') {
29
+ try {
30
+ out.classification = classifyPuzzle(puzzleReveal);
31
+ }
32
+ catch (err) {
33
+ out.classification_error = err instanceof Error ? err.message : String(err);
34
+ }
35
+ if (typeof solution === 'string') {
36
+ try {
37
+ out.parsed_conditions = parseConditions(puzzleReveal, solution);
38
+ }
39
+ catch (err) {
40
+ out.parsed_conditions_error = err instanceof Error ? err.message : String(err);
41
+ }
42
+ }
43
+ }
44
+ return jsonText(out);
45
+ }
46
+ catch (err) {
47
+ return errorText(err);
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=get-puzzle-and-solution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-puzzle-and-solution.js","sourceRoot":"","sources":["../../../src/tools/coins/get-puzzle-and-solution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,sWAAsW,EACtW;QACE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAClD,MAAM,EAAE,YAAY,CAAC,QAAQ,CAC3B,wEAAwE,CACzE;QACD,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE;gBAC/C,OAAO,EAAE,UAAU;gBACnB,MAAM;aACP,CAAC,CAAC;YACH,MAAM,GAAG,GAA4B;gBACnC,OAAO;gBACP,OAAO,EAAE,UAAU;gBACnB,MAAM;gBACN,aAAa,EAAE,GAAG,CAAC,aAAa;aACjC,CAAC;YACF,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC;YACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC;YAC7C,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,GAAG,CAAC,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,oBAAoB,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9E,CAAC;gBACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACjC,IAAI,CAAC;wBACH,GAAG,CAAC,iBAAiB,GAAG,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;oBAClE,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,GAAG,CAAC,uBAAuB,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,73 @@
1
+ import { z } from 'zod';
2
+ import { get_fee_estimate } from 'chia-agent/api/rpc/full_node/index.js';
3
+ import { getAgent } from '../../coinset/agent.js';
4
+ import { networkSchema } from '../../schemas/common.js';
5
+ import { mojoToXch, toBigInt } from '../../chia/amounts.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ const SPEND_TYPES = [
8
+ 'send_xch_transaction',
9
+ 'cat_spend',
10
+ 'take_offer',
11
+ 'cancel_offer',
12
+ 'nft_set_nft_did',
13
+ 'nft_transfer_nft',
14
+ 'create_new_pool_wallet',
15
+ 'pw_absorb_rewards',
16
+ 'create_new_did_wallet',
17
+ ];
18
+ export function register(server) {
19
+ server.tool('estimate_fee', 'Estimate the recommended mojo fee for inclusion in the next block within each target time (in seconds). Default target_times = [60, 300, 900] (1, 5, 15 minutes). Optionally bias the estimate by passing `spend_type` and `spend_count`, or supply an explicit CLVM `cost`.', {
20
+ target_times: z
21
+ .array(z.number().int().positive())
22
+ .min(1)
23
+ .max(20)
24
+ .default([60, 300, 900])
25
+ .describe('Target inclusion times in seconds. Non-empty array, max 20 entries.'),
26
+ cost: z
27
+ .number()
28
+ .int()
29
+ .positive()
30
+ .optional()
31
+ .describe('Optional CLVM cost of the spend bundle you plan to send.'),
32
+ spend_type: z
33
+ .enum(SPEND_TYPES)
34
+ .optional()
35
+ .describe('Optional hint about the kind of spend (biases the estimate).'),
36
+ spend_count: z
37
+ .number()
38
+ .int()
39
+ .positive()
40
+ .optional()
41
+ .describe('Optional hint: number of spends in the bundle.'),
42
+ network: networkSchema,
43
+ }, async ({ target_times, cost, spend_type, spend_count, network }) => {
44
+ try {
45
+ const agent = getAgent(network);
46
+ const payload = { target_times };
47
+ if (cost !== undefined)
48
+ payload.cost = cost;
49
+ if (spend_type !== undefined)
50
+ payload.spend_type = spend_type;
51
+ if (spend_count !== undefined)
52
+ payload.spend_count = spend_count;
53
+ const res = await get_fee_estimate(agent, payload);
54
+ const estimates_mojo = (res.estimates ?? []).map((e) => toBigInt(e).toString());
55
+ const estimates_xch = estimates_mojo.map((m) => mojoToXch(m));
56
+ return jsonText({
57
+ network,
58
+ target_times: res.target_times,
59
+ estimates_mojo,
60
+ estimates_xch,
61
+ current_fee_rate: res.current_fee_rate,
62
+ mempool_size: res.mempool_size,
63
+ mempool_fees: res.mempool_fees,
64
+ full_node_synced: res.full_node_synced,
65
+ peak_height: res.peak_height,
66
+ });
67
+ }
68
+ catch (err) {
69
+ return errorText(err);
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=estimate-fee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-fee.js","sourceRoot":"","sources":["../../../src/tools/mempool/estimate-fee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { get_all_mempool_items, get_all_mempool_tx_ids, } from 'chia-agent/api/rpc/full_node/index.js';
3
+ import { getAgent } from '../../coinset/agent.js';
4
+ import { networkSchema } from '../../schemas/common.js';
5
+ import { errorText, jsonText } from '../shared/response.js';
6
+ export function register(server) {
7
+ server.tool('get_mempool', 'List transaction ids currently in the full node mempool. By default returns the first `limit` ids (default 100, max 1000) plus a `truncated` flag. Pass `include_items: true` to also return the full mempool items (warning: can be large on a busy mempool).', {
8
+ limit: z
9
+ .number()
10
+ .int()
11
+ .min(1)
12
+ .max(1000)
13
+ .default(100)
14
+ .describe('Maximum number of tx_ids (and items) to return. 1..1000.'),
15
+ include_items: z
16
+ .boolean()
17
+ .default(false)
18
+ .describe('If true, also fetch full mempool items via get_all_mempool_items.'),
19
+ network: networkSchema,
20
+ }, async ({ limit, include_items, network }) => {
21
+ try {
22
+ const agent = getAgent(network);
23
+ const idsRes = await get_all_mempool_tx_ids(agent);
24
+ const allIds = idsRes.tx_ids ?? [];
25
+ const truncated = allIds.length > limit;
26
+ const tx_ids = allIds.slice(0, limit);
27
+ const out = {
28
+ network,
29
+ count: allIds.length,
30
+ tx_ids,
31
+ truncated,
32
+ limit,
33
+ };
34
+ if (include_items) {
35
+ const itemsRes = await get_all_mempool_items(agent);
36
+ const all = itemsRes.mempool_items ?? {};
37
+ const items = {};
38
+ for (const id of tx_ids) {
39
+ if (id in all)
40
+ items[id] = all[id];
41
+ }
42
+ out.items = items;
43
+ }
44
+ return jsonText(out);
45
+ }
46
+ catch (err) {
47
+ return errorText(err);
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=get-mempool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-mempool.js","sourceRoot":"","sources":["../../../src/tools/mempool/get-mempool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gQAAgQ,EAChQ;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,IAAI,CAAC;aACT,OAAO,CAAC,GAAG,CAAC;aACZ,QAAQ,CAAC,0DAA0D,CAAC;QACvE,aAAa,EAAE,CAAC;aACb,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,mEAAmE,CAAC;QAChF,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEtC,MAAM,GAAG,GAA4B;gBACnC,OAAO;gBACP,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,MAAM;gBACN,SAAS;gBACT,KAAK;aACN,CAAC;YAEF,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC;gBACzC,MAAM,KAAK,GAA4B,EAAE,CAAC;gBAC1C,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;oBACxB,IAAI,EAAE,IAAI,GAAG;wBAAE,KAAK,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,CAAC;YAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,37 @@
1
+ import { get_mempool_item_by_tx_id } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { hex32Schema, networkSchema } from '../../schemas/common.js';
4
+ import { stripHexPrefix } from '../../chia/hex.js';
5
+ import { errorText, jsonText } from '../shared/response.js';
6
+ export function register(server) {
7
+ server.tool('is_in_mempool', 'Check whether a specific transaction id (the spend bundle hash) is currently sitting in the full node mempool. Returns `in_mempool: true` with the mempool item, or `in_mempool: false` if the node has no record of it.', {
8
+ tx_id: hex32Schema.describe('32-byte transaction id (spend bundle hash). Hex, optional 0x prefix.'),
9
+ network: networkSchema,
10
+ }, async ({ tx_id, network }) => {
11
+ const normalized = stripHexPrefix(tx_id).toLowerCase();
12
+ try {
13
+ const agent = getAgent(network);
14
+ try {
15
+ const res = await get_mempool_item_by_tx_id(agent, { tx_id: normalized });
16
+ const item = res.mempool_item;
17
+ if (!item) {
18
+ return jsonText({ network, tx_id: normalized, in_mempool: false });
19
+ }
20
+ return jsonText({ network, tx_id: normalized, in_mempool: true, item });
21
+ }
22
+ catch (rpcErr) {
23
+ // Coinset returns an error response when the tx_id isn't in the mempool.
24
+ // Treat both null and thrown-RPC as "not found".
25
+ const message = rpcErr instanceof Error ? rpcErr.message : String(rpcErr);
26
+ if (/not in the mempool|not.*found|no.*mempool/i.test(message)) {
27
+ return jsonText({ network, tx_id: normalized, in_mempool: false });
28
+ }
29
+ throw rpcErr;
30
+ }
31
+ }
32
+ catch (err) {
33
+ return errorText(err);
34
+ }
35
+ });
36
+ }
37
+ //# sourceMappingURL=is-in-mempool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-in-mempool.js","sourceRoot":"","sources":["../../../src/tools/mempool/is-in-mempool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0NAA0N,EAC1N;QACE,KAAK,EAAE,WAAW,CAAC,QAAQ,CACzB,sEAAsE,CACvE;QACD,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3B,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC1E,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC;gBAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,yEAAyE;gBACzE,iDAAiD;gBACjD,MAAM,OAAO,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1E,IAAI,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/D,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC;gBACD,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod';
2
+ import { decodeOfferString } from '../../chia/offer.js';
3
+ import { errorText, jsonText } from '../shared/response.js';
4
+ export function register(server) {
5
+ server.tool('decode_offer', "Decode a Chia 'offer1...' string locally (no external API). Returns a structured trade summary: what assets are offered, what is requested, and per-asset amounts and IDs. Classifies XCH, CATs (with asset_id), NFTs (with launcher_id), and DIDs.", {
6
+ offer: z
7
+ .string()
8
+ .min(1)
9
+ .describe("A Chia offer string starting with 'offer1'. Bech32m-encoded."),
10
+ }, async ({ offer }) => {
11
+ try {
12
+ const summary = decodeOfferString(offer);
13
+ return jsonText(summary);
14
+ }
15
+ catch (err) {
16
+ return errorText(err);
17
+ }
18
+ });
19
+ }
20
+ //# sourceMappingURL=decode-offer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-offer.js","sourceRoot":"","sources":["../../../src/tools/offers/decode-offer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,cAAc,EACd,qPAAqP,EACrP;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,8DAA8D,CAAC;KAC5E,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod';
2
+ import { summarizeSpendBundleHex } from '../../chia/offer.js';
3
+ import { errorText, jsonText } from '../shared/response.js';
4
+ export function register(server) {
5
+ server.tool('decode_spend_bundle', 'Decode a raw hex-encoded Chia spend bundle (e.g. a mempool item, or any bundle that is not wrapped in an offer string) into the same structured trade-summary shape as decode_offer. Useful for inspecting pending mempool transactions.', {
6
+ spend_bundle: z
7
+ .string()
8
+ .min(1)
9
+ .describe('Hex-encoded spend bundle bytes (with or without 0x prefix).'),
10
+ }, async ({ spend_bundle }) => {
11
+ try {
12
+ const summary = summarizeSpendBundleHex(spend_bundle);
13
+ return jsonText(summary);
14
+ }
15
+ catch (err) {
16
+ return errorText(err);
17
+ }
18
+ });
19
+ }
20
+ //# sourceMappingURL=decode-spend-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-spend-bundle.js","sourceRoot":"","sources":["../../../src/tools/offers/decode-spend-bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,0OAA0O,EAC1O;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,6DAA6D,CAAC;KAC3E,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ import { get_puzzle_and_solution } from 'chia-agent/api/rpc/full_node/index.js';
3
+ import { getAgent } from '../../coinset/agent.js';
4
+ import { classifyPuzzle, parseConditions } from '../../chia/offer.js';
5
+ import { hex32Schema, heightSchema, networkSchema } from '../../schemas/common.js';
6
+ import { stripHexPrefix } from '../../chia/hex.js';
7
+ import { errorText, jsonText } from '../shared/response.js';
8
+ export function register(server) {
9
+ server.tool('decompile_puzzle', 'Classify a Chia CLVM puzzle reveal. Returns its kind (xch, cat, nft, did, singleton, unknown), asset_id for CATs, launcher_id for NFTs/DIDs, and the inner p2 puzzle hash. Either pass `puzzle_reveal` as hex directly, OR pass `coin_id` + `height` to auto-fetch from the full node. Set `include_conditions: true` to also parse the conditions a spend emits (requires `solution` hex, or a spent coin reachable via coin_id + height).', {
10
+ puzzle_reveal: z
11
+ .string()
12
+ .optional()
13
+ .describe('Hex-encoded puzzle reveal. Omit to auto-fetch via coin_id + height.'),
14
+ solution: z
15
+ .string()
16
+ .optional()
17
+ .describe('Hex-encoded solution. Only used when include_conditions is true.'),
18
+ coin_id: hex32Schema
19
+ .optional()
20
+ .describe('32-byte coin id. Use with `height` to auto-fetch the puzzle reveal.'),
21
+ height: heightSchema
22
+ .optional()
23
+ .describe('The spent_block_index of the coin (where it was spent).'),
24
+ include_conditions: z
25
+ .boolean()
26
+ .default(false)
27
+ .describe('If true, run the puzzle with the solution and parse the emitted conditions.'),
28
+ network: networkSchema,
29
+ }, async ({ puzzle_reveal, solution, coin_id, height, include_conditions, network }) => {
30
+ try {
31
+ let revealHex = puzzle_reveal;
32
+ let solutionHex = solution;
33
+ if (!revealHex) {
34
+ if (!coin_id || height === undefined) {
35
+ throw new Error('must supply either `puzzle_reveal` (hex) or both `coin_id` and `height` to auto-fetch');
36
+ }
37
+ const agent = getAgent(network);
38
+ const normalizedCoinId = stripHexPrefix(coin_id).toLowerCase();
39
+ const res = await get_puzzle_and_solution(agent, {
40
+ coin_id: normalizedCoinId,
41
+ height,
42
+ });
43
+ revealHex = res.coin_solution.puzzle_reveal;
44
+ if (!solutionHex)
45
+ solutionHex = res.coin_solution.solution;
46
+ }
47
+ const classification = classifyPuzzle(revealHex);
48
+ const out = { classification };
49
+ if (include_conditions) {
50
+ if (!solutionHex) {
51
+ throw new Error('`include_conditions: true` requires a `solution` argument (or a fetchable coin_id + height that yields one)');
52
+ }
53
+ out.parsed_conditions = parseConditions(revealHex, solutionHex);
54
+ }
55
+ return jsonText(out);
56
+ }
57
+ catch (err) {
58
+ return errorText(err);
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=decompile-puzzle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decompile-puzzle.js","sourceRoot":"","sources":["../../../src/tools/offers/decompile-puzzle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,6aAA6a,EAC7a;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kEAAkE,CAAC;QAC/E,OAAO,EAAE,WAAW;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,MAAM,EAAE,YAAY;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,yDAAyD,CAAC;QACtE,kBAAkB,EAAE,CAAC;aAClB,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,6EAA6E,CAAC;QAC1F,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EAAE;QAClF,IAAI,CAAC;YACH,IAAI,SAAS,GAAG,aAAa,CAAC;YAC9B,IAAI,WAAW,GAAG,QAAQ,CAAC;YAE3B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACrC,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;gBAC3C,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC/D,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE;oBAC/C,OAAO,EAAE,gBAAgB;oBACzB,MAAM;iBACP,CAAC,CAAC;gBACH,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC;gBAC5C,IAAI,CAAC,WAAW;oBAAE,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC7D,CAAC;YAED,MAAM,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,GAAG,GAA4B,EAAE,cAAc,EAAE,CAAC;YAExD,IAAI,kBAAkB,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;gBACJ,CAAC;gBACD,GAAG,CAAC,iBAAiB,GAAG,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAClE,CAAC;YAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chia-explorer",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "MCP server that answers questions about the Chia blockchain via the public coinset.org API",
5
5
  "mcpName": "io.github.Spacetime-Technology/chia-explorer",
6
6
  "type": "module",
@@ -53,6 +53,7 @@
53
53
  "@modelcontextprotocol/sdk": "^1.12.0",
54
54
  "@scure/base": "^1.1.9",
55
55
  "chia-agent": "^14.3.1",
56
+ "chia-wallet-sdk": "^0.33.0",
56
57
  "zod": "^3.24.0"
57
58
  },
58
59
  "devDependencies": {