@aibtc/mcp-server 1.36.0 → 1.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/services/defi.service.d.ts.map +1 -1
  2. package/dist/services/defi.service.js +4 -17
  3. package/dist/services/defi.service.js.map +1 -1
  4. package/dist/services/wallet-manager.d.ts.map +1 -1
  5. package/dist/services/wallet-manager.js +7 -0
  6. package/dist/services/wallet-manager.js.map +1 -1
  7. package/dist/tools/contract.tools.d.ts.map +1 -1
  8. package/dist/tools/contract.tools.js +3 -2
  9. package/dist/tools/contract.tools.js.map +1 -1
  10. package/dist/tools/index.d.ts.map +1 -1
  11. package/dist/tools/index.js +15 -0
  12. package/dist/tools/index.js.map +1 -1
  13. package/dist/tools/jingswap.tools.d.ts +3 -0
  14. package/dist/tools/jingswap.tools.d.ts.map +1 -0
  15. package/dist/tools/jingswap.tools.js +471 -0
  16. package/dist/tools/jingswap.tools.js.map +1 -0
  17. package/dist/tools/nostr.tools.d.ts +3 -0
  18. package/dist/tools/nostr.tools.d.ts.map +1 -0
  19. package/dist/tools/nostr.tools.js +409 -0
  20. package/dist/tools/nostr.tools.js.map +1 -0
  21. package/dist/tools/ordinals-p2p.tools.d.ts +21 -0
  22. package/dist/tools/ordinals-p2p.tools.d.ts.map +1 -0
  23. package/dist/tools/ordinals-p2p.tools.js +621 -0
  24. package/dist/tools/ordinals-p2p.tools.js.map +1 -0
  25. package/dist/tools/relay-diagnostic.tools.d.ts.map +1 -1
  26. package/dist/tools/relay-diagnostic.tools.js +27 -4
  27. package/dist/tools/relay-diagnostic.tools.js.map +1 -1
  28. package/dist/tools/skill-mappings.d.ts.map +1 -1
  29. package/dist/tools/skill-mappings.js +13 -1
  30. package/dist/tools/skill-mappings.js.map +1 -1
  31. package/dist/tools/stacks-market.tools.d.ts +22 -0
  32. package/dist/tools/stacks-market.tools.d.ts.map +1 -0
  33. package/dist/tools/stacks-market.tools.js +630 -0
  34. package/dist/tools/stacks-market.tools.js.map +1 -0
  35. package/dist/tools/taproot-multisig.tools.d.ts +17 -0
  36. package/dist/tools/taproot-multisig.tools.d.ts.map +1 -0
  37. package/dist/tools/taproot-multisig.tools.js +236 -0
  38. package/dist/tools/taproot-multisig.tools.js.map +1 -0
  39. package/dist/tools/transfer.tools.js +1 -1
  40. package/dist/tools/transfer.tools.js.map +1 -1
  41. package/dist/transactions/builder.d.ts +35 -1
  42. package/dist/transactions/builder.d.ts.map +1 -1
  43. package/dist/transactions/builder.js +153 -4
  44. package/dist/transactions/builder.js.map +1 -1
  45. package/dist/utils/fee.d.ts +15 -0
  46. package/dist/utils/fee.d.ts.map +1 -1
  47. package/dist/utils/fee.js +36 -4
  48. package/dist/utils/fee.js.map +1 -1
  49. package/package.json +4 -1
  50. package/skill/SKILL.md +1 -1
@@ -0,0 +1,621 @@
1
+ /**
2
+ * Ordinals P2P Trading Tools
3
+ *
4
+ * MCP tools for peer-to-peer ordinals trading via the public trade ledger at ledger.drx4.xyz.
5
+ * Supports listing trades, creating offers, countering, transferring, cancelling, and
6
+ * recording PSBT atomic swaps. All write operations are authenticated with BIP-137 signatures.
7
+ *
8
+ * Tools:
9
+ * - ordinals_p2p_list_trades: Browse trade ledger with optional filters
10
+ * - ordinals_p2p_get_trade: Fetch full details for a single trade
11
+ * - ordinals_p2p_my_trades: List trades for the active wallet's BTC address
12
+ * - ordinals_p2p_agents: List active agents on the ledger
13
+ * - ordinals_p2p_create_offer: Post a new inscription offer (BIP-137 signed)
14
+ * - ordinals_p2p_counter: Counter an existing offer (BIP-137 signed)
15
+ * - ordinals_p2p_transfer: Record a completed transfer (BIP-137 signed)
16
+ * - ordinals_p2p_cancel: Cancel an open offer or counter (BIP-137 signed)
17
+ * - ordinals_p2p_psbt_swap: Record a completed PSBT atomic swap (BIP-137 signed)
18
+ */
19
+ import { z } from "zod";
20
+ import { secp256k1 } from "@noble/curves/secp256k1.js";
21
+ import { sha256 } from "@noble/hashes/sha256";
22
+ import { hexToBytes } from "@noble/hashes/utils";
23
+ import { NETWORK } from "../config/networks.js";
24
+ import { getWalletManager } from "../services/wallet-manager.js";
25
+ import { createJsonResponse, createErrorResponse } from "../utils/index.js";
26
+ // ---------------------------------------------------------------------------
27
+ // Config
28
+ // ---------------------------------------------------------------------------
29
+ const LEDGER_BASE = NETWORK === "testnet"
30
+ ? "https://ledger-test.drx4.xyz"
31
+ : "https://ledger.drx4.xyz";
32
+ const BITCOIN_MSG_PREFIX = "\x18Bitcoin Signed Message:\n";
33
+ // BIP-137 header bytes by address type
34
+ const BIP137_HEADER_BASE = {
35
+ P2PKH_COMPRESSED: 31,
36
+ P2SH_P2WPKH: 35,
37
+ P2WPKH: 39,
38
+ };
39
+ // ---------------------------------------------------------------------------
40
+ // BIP-137 signing helpers
41
+ // ---------------------------------------------------------------------------
42
+ function encodeVarInt(n) {
43
+ if (n < 0xfd)
44
+ return new Uint8Array([n]);
45
+ if (n <= 0xffff) {
46
+ const b = new Uint8Array(3);
47
+ b[0] = 0xfd;
48
+ b[1] = n & 0xff;
49
+ b[2] = (n >> 8) & 0xff;
50
+ return b;
51
+ }
52
+ throw new Error(`VarInt too large: ${n}`);
53
+ }
54
+ function formatBitcoinMessage(message) {
55
+ const prefixBytes = new TextEncoder().encode(BITCOIN_MSG_PREFIX);
56
+ const messageBytes = new TextEncoder().encode(message);
57
+ const lengthBytes = encodeVarInt(messageBytes.length);
58
+ const result = new Uint8Array(prefixBytes.length + lengthBytes.length + messageBytes.length);
59
+ result.set(prefixBytes, 0);
60
+ result.set(lengthBytes, prefixBytes.length);
61
+ result.set(messageBytes, prefixBytes.length + lengthBytes.length);
62
+ return result;
63
+ }
64
+ function doubleSha256(data) {
65
+ return sha256(sha256(data));
66
+ }
67
+ function ensureBytes(key) {
68
+ if (typeof key === "string")
69
+ return hexToBytes(key);
70
+ return key;
71
+ }
72
+ /**
73
+ * Sign a message with BIP-137 and return a base64-encoded signature.
74
+ * The header byte encodes both the address type and the recovery ID.
75
+ *
76
+ * Uses `format: "recovered"` which returns a flat 65-byte Uint8Array:
77
+ * [recoveryId (1 byte), r (32 bytes), s (32 bytes)]
78
+ */
79
+ function signBip137(message, privateKey, btcAddress) {
80
+ const formatted = formatBitcoinMessage(message);
81
+ const msgHash = doubleSha256(formatted);
82
+ // format: "recovered" returns Uint8Array [recoveryId, r(32), s(32)]
83
+ const sigWithRecovery = secp256k1.sign(msgHash, privateKey, {
84
+ prehash: false,
85
+ lowS: true,
86
+ format: "recovered",
87
+ });
88
+ const recoveryId = sigWithRecovery[0];
89
+ const rBytes = sigWithRecovery.slice(1, 33);
90
+ const sBytes = sigWithRecovery.slice(33, 65);
91
+ const prefix = btcAddress[0];
92
+ let headerBase;
93
+ if (prefix === "1" || prefix === "m" || prefix === "n") {
94
+ headerBase = BIP137_HEADER_BASE.P2PKH_COMPRESSED;
95
+ }
96
+ else if (prefix === "3" || prefix === "2") {
97
+ headerBase = BIP137_HEADER_BASE.P2SH_P2WPKH;
98
+ }
99
+ else {
100
+ // bc1q (P2WPKH) or bc1p (P2TR) — both use the P2WPKH header per BIP-137 convention
101
+ headerBase = BIP137_HEADER_BASE.P2WPKH;
102
+ }
103
+ const bip137Sig = new Uint8Array(65);
104
+ bip137Sig[0] = headerBase + recoveryId;
105
+ bip137Sig.set(rBytes, 1);
106
+ bip137Sig.set(sBytes, 33);
107
+ return Buffer.from(bip137Sig).toString("base64");
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Ledger API helpers
111
+ // ---------------------------------------------------------------------------
112
+ async function ledgerGet(path) {
113
+ const res = await fetch(`${LEDGER_BASE}${path}`);
114
+ if (!res.ok) {
115
+ const body = await res.text();
116
+ throw new Error(`Ledger API ${res.status}: ${body}`);
117
+ }
118
+ return res.json();
119
+ }
120
+ async function ledgerPost(path, body) {
121
+ const res = await fetch(`${LEDGER_BASE}${path}`, {
122
+ method: "POST",
123
+ headers: { "Content-Type": "application/json" },
124
+ body: JSON.stringify(body),
125
+ });
126
+ const data = await res.json();
127
+ if (!res.ok) {
128
+ throw new Error(`Ledger API ${res.status}: ${data.error ?? JSON.stringify(data)}`);
129
+ }
130
+ return data;
131
+ }
132
+ function getSignedAccount() {
133
+ const walletManager = getWalletManager();
134
+ const account = walletManager.getActiveAccount();
135
+ if (!account)
136
+ throw new Error("Wallet is not unlocked. Use wallet_unlock first.");
137
+ if (!account.btcAddress || !account.btcPrivateKey) {
138
+ throw new Error("Bitcoin keys not available. Unlock your wallet first.");
139
+ }
140
+ return {
141
+ btcAddress: account.btcAddress,
142
+ address: account.address,
143
+ btcPrivateKey: ensureBytes(account.btcPrivateKey),
144
+ };
145
+ }
146
+ /**
147
+ * Build the authentication fields required for all ledger write operations.
148
+ * Message format: "ordinals-ledger | <type> | <btcAddress> | <inscriptionId> | <timestamp>"
149
+ */
150
+ function buildAuthFields(type, inscriptionId, account) {
151
+ const timestamp = new Date().toISOString().replace(/\.\d{3}Z$/, ".000Z");
152
+ const message = `ordinals-ledger | ${type} | ${account.btcAddress} | ${inscriptionId} | ${timestamp}`;
153
+ const signature = signBip137(message, account.btcPrivateKey, account.btcAddress);
154
+ return {
155
+ from_agent: account.btcAddress,
156
+ from_stx_address: account.address,
157
+ signature,
158
+ timestamp,
159
+ };
160
+ }
161
+ // ---------------------------------------------------------------------------
162
+ // Tool registration
163
+ // ---------------------------------------------------------------------------
164
+ export function registerOrdinalsP2PTools(server) {
165
+ // ==========================================================================
166
+ // ordinals_p2p_list_trades — public read
167
+ // ==========================================================================
168
+ server.registerTool("ordinals_p2p_list_trades", {
169
+ description: `Browse the public ordinals P2P trade ledger at ledger.drx4.xyz.
170
+
171
+ Returns a paginated list of trades with optional filters. Useful for discovering
172
+ open offers, reviewing recent activity, or searching for a specific inscription.
173
+
174
+ No wallet required.`,
175
+ inputSchema: {
176
+ status: z
177
+ .enum(["open", "completed", "cancelled", "countered"])
178
+ .optional()
179
+ .describe("Filter by trade status"),
180
+ agent: z
181
+ .string()
182
+ .optional()
183
+ .describe("Filter by agent BTC address"),
184
+ inscription_id: z
185
+ .string()
186
+ .optional()
187
+ .describe("Filter by inscription ID (txid + 'i' + index, e.g. abc123i0)"),
188
+ type: z
189
+ .enum(["offer", "counter", "transfer", "cancel", "psbt_swap"])
190
+ .optional()
191
+ .describe("Filter by trade type"),
192
+ limit: z
193
+ .number()
194
+ .int()
195
+ .positive()
196
+ .optional()
197
+ .default(50)
198
+ .describe("Results per page (default 50)"),
199
+ offset: z
200
+ .number()
201
+ .int()
202
+ .nonnegative()
203
+ .optional()
204
+ .default(0)
205
+ .describe("Pagination offset (default 0)"),
206
+ },
207
+ }, async ({ status, agent, inscription_id, type, limit, offset }) => {
208
+ try {
209
+ const params = new URLSearchParams();
210
+ if (status)
211
+ params.set("status", status);
212
+ if (agent)
213
+ params.set("agent", agent);
214
+ if (inscription_id)
215
+ params.set("inscription", inscription_id);
216
+ if (type)
217
+ params.set("type", type);
218
+ params.set("limit", String(limit ?? 50));
219
+ params.set("offset", String(offset ?? 0));
220
+ const data = await ledgerGet(`/api/trades?${params}`);
221
+ return createJsonResponse(data);
222
+ }
223
+ catch (error) {
224
+ return createErrorResponse(error);
225
+ }
226
+ });
227
+ // ==========================================================================
228
+ // ordinals_p2p_get_trade — public read
229
+ // ==========================================================================
230
+ server.registerTool("ordinals_p2p_get_trade", {
231
+ description: `Fetch full details for a single trade from the ordinals P2P ledger.
232
+
233
+ Returns the trade record including all counters, transfer history, and current status.
234
+
235
+ No wallet required.`,
236
+ inputSchema: {
237
+ trade_id: z
238
+ .number()
239
+ .int()
240
+ .positive()
241
+ .describe("Numeric trade ID"),
242
+ },
243
+ }, async ({ trade_id }) => {
244
+ try {
245
+ const data = await ledgerGet(`/api/trades/${trade_id}`);
246
+ return createJsonResponse(data);
247
+ }
248
+ catch (error) {
249
+ return createErrorResponse(error);
250
+ }
251
+ });
252
+ // ==========================================================================
253
+ // ordinals_p2p_my_trades — requires wallet (to get BTC address)
254
+ // ==========================================================================
255
+ server.registerTool("ordinals_p2p_my_trades", {
256
+ description: `List all trades involving the active wallet's BTC address.
257
+
258
+ Queries the ledger for trades where the active wallet is either the buyer or seller.
259
+ Requires an unlocked wallet so the BTC address can be resolved automatically.
260
+
261
+ You can optionally filter by status.`,
262
+ inputSchema: {
263
+ status: z
264
+ .enum(["open", "completed", "cancelled", "countered"])
265
+ .optional()
266
+ .describe("Filter by trade status"),
267
+ limit: z
268
+ .number()
269
+ .int()
270
+ .positive()
271
+ .optional()
272
+ .default(50)
273
+ .describe("Results per page (default 50)"),
274
+ offset: z
275
+ .number()
276
+ .int()
277
+ .nonnegative()
278
+ .optional()
279
+ .default(0)
280
+ .describe("Pagination offset (default 0)"),
281
+ },
282
+ }, async ({ status, limit, offset }) => {
283
+ try {
284
+ const walletManager = getWalletManager();
285
+ const account = walletManager.getActiveAccount();
286
+ if (!account)
287
+ throw new Error("Wallet is not unlocked. Use wallet_unlock first.");
288
+ if (!account.btcAddress)
289
+ throw new Error("Bitcoin address not available.");
290
+ const btcAddress = account.btcAddress;
291
+ const params = new URLSearchParams();
292
+ params.set("agent", btcAddress);
293
+ if (status)
294
+ params.set("status", status);
295
+ params.set("limit", String(limit ?? 50));
296
+ params.set("offset", String(offset ?? 0));
297
+ const data = await ledgerGet(`/api/trades?${params}`);
298
+ return createJsonResponse({
299
+ btcAddress,
300
+ ...data,
301
+ });
302
+ }
303
+ catch (error) {
304
+ return createErrorResponse(error);
305
+ }
306
+ });
307
+ // ==========================================================================
308
+ // ordinals_p2p_agents — public read
309
+ // ==========================================================================
310
+ server.registerTool("ordinals_p2p_agents", {
311
+ description: `List active agents registered on the ordinals P2P trade ledger.
312
+
313
+ Returns agents that have participated in trades, along with their trade counts
314
+ and last activity. Useful for discovering counterparties.
315
+
316
+ No wallet required.`,
317
+ inputSchema: {
318
+ limit: z
319
+ .number()
320
+ .int()
321
+ .positive()
322
+ .optional()
323
+ .default(50)
324
+ .describe("Results per page (default 50)"),
325
+ },
326
+ }, async ({ limit }) => {
327
+ try {
328
+ const data = await ledgerGet(`/api/agents?limit=${limit ?? 50}`);
329
+ return createJsonResponse(data);
330
+ }
331
+ catch (error) {
332
+ return createErrorResponse(error);
333
+ }
334
+ });
335
+ // ==========================================================================
336
+ // ordinals_p2p_create_offer — requires wallet (BIP-137 signed)
337
+ // ==========================================================================
338
+ server.registerTool("ordinals_p2p_create_offer", {
339
+ description: `List an inscription for sale on the P2P trade ledger.
340
+
341
+ Creates a new offer entry authenticated with a BIP-137 signature from the active
342
+ wallet's BTC address. The inscription must be in the wallet or otherwise owned
343
+ by the signing address for the trade to be verifiable by counterparties.
344
+
345
+ Requires an unlocked wallet with Bitcoin keys.`,
346
+ inputSchema: {
347
+ inscription_id: z
348
+ .string()
349
+ .describe("Inscription ID in txid+index format, e.g. abc123...i0"),
350
+ asking_price_sats: z
351
+ .number()
352
+ .int()
353
+ .positive()
354
+ .optional()
355
+ .describe("Asking price in satoshis (omit for open price negotiation)"),
356
+ to_agent: z
357
+ .string()
358
+ .optional()
359
+ .describe("Target buyer BTC address (omit for public listing)"),
360
+ metadata: z
361
+ .string()
362
+ .optional()
363
+ .describe("Optional freeform metadata (e.g. description, terms)"),
364
+ },
365
+ }, async ({ inscription_id, asking_price_sats, to_agent, metadata }) => {
366
+ try {
367
+ if (inscription_id && !/^[0-9a-f]{64}i\d+$/.test(inscription_id)) {
368
+ throw new Error("inscription_id must be in format: <64-char-hex-txid>i<index> e.g. abc123...i0");
369
+ }
370
+ const account = getSignedAccount();
371
+ const auth = buildAuthFields("offer", inscription_id, account);
372
+ const body = {
373
+ type: "offer",
374
+ ...auth,
375
+ inscription_id,
376
+ };
377
+ if (asking_price_sats !== undefined)
378
+ body.amount_sats = asking_price_sats;
379
+ if (to_agent)
380
+ body.to_agent = to_agent;
381
+ if (metadata)
382
+ body.metadata = metadata;
383
+ const data = await ledgerPost("/api/trades", body);
384
+ return createJsonResponse({ success: true, ...data });
385
+ }
386
+ catch (error) {
387
+ return createErrorResponse(error);
388
+ }
389
+ });
390
+ // ==========================================================================
391
+ // ordinals_p2p_counter — requires wallet (BIP-137 signed)
392
+ // ==========================================================================
393
+ server.registerTool("ordinals_p2p_counter", {
394
+ description: `Counter an existing offer with a new proposed price.
395
+
396
+ Submits a counter-offer linked to a parent trade. The active wallet signs the
397
+ counter with BIP-137 to prove identity. Either party in a trade may counter.
398
+
399
+ Requires an unlocked wallet with Bitcoin keys.`,
400
+ inputSchema: {
401
+ parent_trade_id: z
402
+ .number()
403
+ .int()
404
+ .positive()
405
+ .describe("ID of the trade being countered"),
406
+ inscription_id: z
407
+ .string()
408
+ .describe("Inscription ID (must match the parent trade)"),
409
+ amount_sats: z
410
+ .number()
411
+ .int()
412
+ .positive()
413
+ .describe("Counter-offer price in satoshis"),
414
+ metadata: z
415
+ .string()
416
+ .optional()
417
+ .describe("Optional freeform metadata"),
418
+ },
419
+ }, async ({ parent_trade_id, inscription_id, amount_sats, metadata }) => {
420
+ try {
421
+ if (inscription_id && !/^[0-9a-f]{64}i\d+$/.test(inscription_id)) {
422
+ throw new Error("inscription_id must be in format: <64-char-hex-txid>i<index> e.g. abc123...i0");
423
+ }
424
+ const account = getSignedAccount();
425
+ const auth = buildAuthFields("counter", inscription_id, account);
426
+ const body = {
427
+ type: "counter",
428
+ ...auth,
429
+ inscription_id,
430
+ parent_trade_id,
431
+ amount_sats,
432
+ };
433
+ if (metadata)
434
+ body.metadata = metadata;
435
+ const data = await ledgerPost("/api/trades", body);
436
+ return createJsonResponse({ success: true, ...data });
437
+ }
438
+ catch (error) {
439
+ return createErrorResponse(error);
440
+ }
441
+ });
442
+ // ==========================================================================
443
+ // ordinals_p2p_transfer — requires wallet (BIP-137 signed)
444
+ // ==========================================================================
445
+ server.registerTool("ordinals_p2p_transfer", {
446
+ description: `Record a completed inscription transfer on the trade ledger.
447
+
448
+ Marks a trade as closed by recording the on-chain (or off-chain sBTC) transfer.
449
+ The active wallet signs the record with BIP-137 to prove the transfer was
450
+ authorized by the sending party.
451
+
452
+ Requires an unlocked wallet with Bitcoin keys.`,
453
+ inputSchema: {
454
+ inscription_id: z
455
+ .string()
456
+ .describe("Inscription ID being transferred"),
457
+ to_agent: z
458
+ .string()
459
+ .describe("Recipient BTC address"),
460
+ tx_hash: z
461
+ .string()
462
+ .optional()
463
+ .describe("On-chain transaction hash (optional for sBTC/off-chain transfers)"),
464
+ parent_trade_id: z
465
+ .number()
466
+ .int()
467
+ .positive()
468
+ .optional()
469
+ .describe("Parent trade ID being fulfilled (if closing an open offer)"),
470
+ amount_sats: z
471
+ .number()
472
+ .int()
473
+ .positive()
474
+ .optional()
475
+ .describe("Transfer amount in satoshis"),
476
+ metadata: z
477
+ .string()
478
+ .optional()
479
+ .describe("Optional freeform metadata"),
480
+ },
481
+ }, async ({ inscription_id, to_agent, tx_hash, parent_trade_id, amount_sats, metadata }) => {
482
+ try {
483
+ if (!/^[0-9a-f]{64}i\d+$/.test(inscription_id)) {
484
+ throw new Error("inscription_id must be in format: <64-char-hex-txid>i<index> e.g. abc123...i0");
485
+ }
486
+ const account = getSignedAccount();
487
+ const auth = buildAuthFields("transfer", inscription_id, account);
488
+ const body = {
489
+ type: "transfer",
490
+ ...auth,
491
+ inscription_id,
492
+ to_agent,
493
+ };
494
+ if (tx_hash)
495
+ body.tx_hash = tx_hash;
496
+ if (parent_trade_id !== undefined)
497
+ body.parent_trade_id = parent_trade_id;
498
+ if (amount_sats !== undefined)
499
+ body.amount_sats = amount_sats;
500
+ if (metadata)
501
+ body.metadata = metadata;
502
+ const data = await ledgerPost("/api/trades", body);
503
+ return createJsonResponse({ success: true, ...data });
504
+ }
505
+ catch (error) {
506
+ return createErrorResponse(error);
507
+ }
508
+ });
509
+ // ==========================================================================
510
+ // ordinals_p2p_cancel — requires wallet (BIP-137 signed)
511
+ // ==========================================================================
512
+ server.registerTool("ordinals_p2p_cancel", {
513
+ description: `Cancel an open offer or counter on the trade ledger.
514
+
515
+ Only the parties involved in a trade may cancel it. The active wallet signs
516
+ the cancellation with BIP-137 to prove authorization.
517
+
518
+ Requires an unlocked wallet with Bitcoin keys.`,
519
+ inputSchema: {
520
+ parent_trade_id: z
521
+ .number()
522
+ .int()
523
+ .positive()
524
+ .describe("Trade ID to cancel"),
525
+ inscription_id: z
526
+ .string()
527
+ .describe("Inscription ID (must match the trade being cancelled)"),
528
+ metadata: z
529
+ .string()
530
+ .optional()
531
+ .describe("Optional reason or metadata"),
532
+ },
533
+ }, async ({ parent_trade_id, inscription_id, metadata }) => {
534
+ try {
535
+ if (!/^[0-9a-f]{64}i\d+$/.test(inscription_id)) {
536
+ throw new Error("inscription_id must be in format: <64-char-hex-txid>i<index> e.g. abc123...i0");
537
+ }
538
+ const account = getSignedAccount();
539
+ const auth = buildAuthFields("cancel", inscription_id, account);
540
+ const body = {
541
+ type: "cancel",
542
+ ...auth,
543
+ inscription_id,
544
+ parent_trade_id,
545
+ };
546
+ if (metadata)
547
+ body.metadata = metadata;
548
+ const data = await ledgerPost("/api/trades", body);
549
+ return createJsonResponse({ success: true, ...data });
550
+ }
551
+ catch (error) {
552
+ return createErrorResponse(error);
553
+ }
554
+ });
555
+ // ==========================================================================
556
+ // ordinals_p2p_psbt_swap — requires wallet (BIP-137 signed)
557
+ // ==========================================================================
558
+ server.registerTool("ordinals_p2p_psbt_swap", {
559
+ description: `Record a completed PSBT atomic swap on the trade ledger.
560
+
561
+ After both parties have signed a PSBT and the transaction is broadcast, use this
562
+ tool to record the completed swap. The active wallet signs the record with BIP-137.
563
+
564
+ To construct and sign the PSBT itself, use psbt_create_ordinal_buy, psbt_sign,
565
+ and psbt_broadcast first, then call this tool with the resulting txid.
566
+
567
+ Requires an unlocked wallet with Bitcoin keys.`,
568
+ inputSchema: {
569
+ inscription_id: z
570
+ .string()
571
+ .describe("Inscription ID swapped"),
572
+ to_agent: z
573
+ .string()
574
+ .describe("Counterparty BTC address (new owner of the inscription)"),
575
+ amount_sats: z
576
+ .number()
577
+ .int()
578
+ .positive()
579
+ .describe("Swap amount in satoshis"),
580
+ tx_hash: z
581
+ .string()
582
+ .describe("Broadcast atomic swap transaction hash"),
583
+ parent_trade_id: z
584
+ .number()
585
+ .int()
586
+ .positive()
587
+ .optional()
588
+ .describe("Parent trade ID being fulfilled (if closing an existing offer)"),
589
+ metadata: z
590
+ .string()
591
+ .optional()
592
+ .describe("Optional freeform metadata"),
593
+ },
594
+ }, async ({ inscription_id, to_agent, amount_sats, tx_hash, parent_trade_id, metadata }) => {
595
+ try {
596
+ if (!/^[0-9a-f]{64}i\d+$/.test(inscription_id)) {
597
+ throw new Error("inscription_id must be in format: <64-char-hex-txid>i<index> e.g. abc123...i0");
598
+ }
599
+ const account = getSignedAccount();
600
+ const auth = buildAuthFields("psbt_swap", inscription_id, account);
601
+ const body = {
602
+ type: "psbt_swap",
603
+ ...auth,
604
+ inscription_id,
605
+ to_agent,
606
+ amount_sats,
607
+ tx_hash,
608
+ };
609
+ if (parent_trade_id !== undefined)
610
+ body.parent_trade_id = parent_trade_id;
611
+ if (metadata)
612
+ body.metadata = metadata;
613
+ const data = await ledgerPost("/api/trades", body);
614
+ return createJsonResponse({ success: true, ...data });
615
+ }
616
+ catch (error) {
617
+ return createErrorResponse(error);
618
+ }
619
+ });
620
+ }
621
+ //# sourceMappingURL=ordinals-p2p.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordinals-p2p.tools.js","sourceRoot":"","sources":["../../src/tools/ordinals-p2p.tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relay-diagnostic.tools.d.ts","sourceRoot":"","sources":["../../src/tools/relay-diagnostic.tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuGpE"}
1
+ {"version":3,"file":"relay-diagnostic.tools.d.ts","sourceRoot":"","sources":["../../src/tools/relay-diagnostic.tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8HpE"}