@odatano/nightgate-mcp 0.9.0 → 0.10.1

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/dist/swap.js CHANGED
@@ -7,23 +7,22 @@
7
7
  import { createHash } from 'node:crypto';
8
8
  import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
9
9
  import { dirname } from 'node:path';
10
+ import { txExport } from './tx-module.js';
10
11
  let modulePromise;
11
12
  async function loadSwapModule() {
12
13
  modulePromise ??= (async () => {
13
- let tx;
14
14
  try {
15
- tx = await import('@odatano/nightgate-tx/txbuilder');
15
+ const [createSwapWallet, readSwapTerms, decodeOffer] = await Promise.all([
16
+ txExport('createSwapWallet', 'swaps', '0.8.0'),
17
+ txExport('readSwapTerms', 'swaps', '0.8.0'),
18
+ txExport('decodeOffer', 'swaps', '0.8.0'),
19
+ ]);
20
+ return { createSwapWallet, readSwapTerms, decodeOffer };
16
21
  }
17
22
  catch (err) {
18
23
  modulePromise = undefined;
19
- throw new Error('swaps need @odatano/nightgate-tx >= 0.8.0 next to the MCP server (npm install @odatano/nightgate-tx): ' +
20
- (err instanceof Error ? err.message : String(err)));
21
- }
22
- if (typeof tx.createSwapWallet !== 'function' || typeof tx.decodeOffer !== 'function') {
23
- modulePromise = undefined;
24
- throw new Error('swaps need @odatano/nightgate-tx >= 0.8.0; the installed version has no swap wallet (npm install @odatano/nightgate-tx@latest)');
24
+ throw err;
25
25
  }
26
- return { createSwapWallet: tx.createSwapWallet, readSwapTerms: tx.readSwapTerms, decodeOffer: tx.decodeOffer };
27
26
  })();
28
27
  return modulePromise;
29
28
  }
@@ -45,10 +44,17 @@ export async function readOffer(offer) {
45
44
  const decoded = await decodeOffer(offer);
46
45
  return { ...termsOut(readSwapTerms(decoded.tx)), bound: decoded.bound, serializedBytes: decoded.bytes.length };
47
46
  }
47
+ /** Do two offer texts (file or base64, either form) carry the same transaction? */
48
+ export async function sameOffer(a, b) {
49
+ const { decodeOffer } = await loadSwapModule();
50
+ const [x, y] = await Promise.all([decodeOffer(a), decodeOffer(b)]);
51
+ return x.bytes.length === y.bytes.length && x.bytes.every((byte, i) => byte === y.bytes[i]);
52
+ }
48
53
  let open;
49
54
  /** Halves built here whose swap has not landed, by id. */
50
55
  const pending = new Map();
51
- const halfId = (halfB64) => createHash('sha256').update(Buffer.from(halfB64, 'base64')).digest('hex').slice(0, 32);
56
+ const halfIdOf = (bytes) => createHash('sha256').update(bytes).digest('hex').slice(0, 32);
57
+ const halfId = (halfB64) => halfIdOf(Buffer.from(halfB64, 'base64'));
52
58
  async function readState(path) {
53
59
  if (!path)
54
60
  return undefined;
@@ -161,7 +167,10 @@ export async function swapWalletInfo(config) {
161
167
  for (const [tokenType, t] of byType) {
162
168
  tokens.push({ tokenType, balance: t.balance.toString(), coins: t.coins, spendable: String(await wallet.spendable(tokenType)) });
163
169
  }
164
- const pendingHalves = [...pending.entries()].map(([id, p]) => ({ id, role: p.role, ...(p.jobId ? { jobId: p.jobId } : {}), ...p.terms }));
170
+ const pendingHalves = [...pending.entries()].map(([id, p]) => ({
171
+ id, role: p.role, ...(p.jobId ? { jobId: p.jobId } : {}),
172
+ ...(p.offerId ? { offerId: p.offerId, boardStatus: p.boardStatus ?? 'open' } : {}), ...p.terms,
173
+ }));
165
174
  return { ...base, synced: true, tokens, pendingHalves };
166
175
  }
167
176
  /** One half of a swap from this wallet; bound with its offer file unless `bind` is false. */
@@ -223,6 +232,40 @@ export function settleHalfJob(jobId, status) {
223
232
  if (half.jobId === jobId)
224
233
  pending.delete(id);
225
234
  }
235
+ /** Ties a maker half built here to the board entry it was posted as; any other offer is ignored. */
236
+ export async function trackPostedHalf(offer, offerId) {
237
+ if (typeof offerId !== 'string' || ![...pending.values()].some((p) => p.role === 'maker'))
238
+ return;
239
+ const { decodeOffer } = await loadSwapModule();
240
+ const half = pending.get(halfIdOf((await decodeOffer(offer)).bytes));
241
+ if (half?.role === 'maker')
242
+ half.offerId = offerId;
243
+ }
244
+ /** Board entries of the maker halves held here. */
245
+ export function postedOfferIds() {
246
+ return [...pending.values()].flatMap((p) => (p.offerId ? [p.offerId] : []));
247
+ }
248
+ /**
249
+ * Board rows (one, an array or an OData collection) settle the halves posted as them:
250
+ * a filled offer spent the half's coins, so it leaves; an expired or retired one stays revertable.
251
+ */
252
+ export function settleBoardRows(result) {
253
+ const value = result?.value;
254
+ const rows = Array.isArray(result) ? result : Array.isArray(value) ? value : [result];
255
+ for (const row of rows) {
256
+ const { offerId, status } = (row ?? {});
257
+ if (typeof offerId !== 'string' || typeof status !== 'string')
258
+ continue;
259
+ for (const [id, half] of pending) {
260
+ if (half.offerId !== offerId)
261
+ continue;
262
+ if (status === 'filled')
263
+ pending.delete(id);
264
+ else
265
+ half.boardStatus = status;
266
+ }
267
+ }
268
+ }
226
269
  /** Test seam / shutdown. */
227
270
  export async function closeSwapWallet() {
228
271
  const current = open;
package/dist/swap.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"swap.js","sourceRoot":"","sources":["../src/swap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../src/swap.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -1,13 +1,15 @@
1
1
  import { z } from 'zod';
2
- import { int64, NightgateApiError } from './client.js';
3
- import { BUILDABLE_CALLS, BUILDABLE_ARTIFACTS, buildSponsorable, attesterIdentity } from './builder.js';
4
- import { buildOffer, readOffer, revertHalf, settleHalfJob, swapWalletInfo, takenHalves, takeOffer, trackHalfJob } from './swap.js';
2
+ import { int64, raw, NightgateApiError } from './client.js';
3
+ import { BUILDABLE_CALLS, BUILDABLE_ARTIFACTS, buildSponsorable, attesterIdentity, seedIdentity } from './builder.js';
4
+ import { buildOffer, postedOfferIds, readOffer, revertHalf, sameOffer, settleBoardRows, settleHalfJob, swapWalletInfo, takenHalves, takeOffer, trackHalfJob, trackPostedHalf, } from './swap.js';
5
+ import { txExport } from './tx-module.js';
6
+ import { buildMint } from './factory.js';
5
7
  const HEX64 = /^[0-9a-fA-F]{64}$/;
6
8
  const hex64 = (what) => z.string().regex(HEX64, `${what} must be 64 hex characters`);
7
- /** Scaled non-negative integer, as string (preferred, exact) or JS number. */
9
+ /** Scaled non-negative integer, as string (preferred, exact) or JS number; a number stays below 2^53 so String() renders it exactly. */
8
10
  const scaledInt = (what) => z.union([
9
11
  z.string().regex(/^\d+$/, `${what} must be a non-negative integer (decimal string)`),
10
- z.number().int().nonnegative(),
12
+ z.number().int().nonnegative().safe(),
11
13
  ]);
12
14
  const merkleSiblings = z.array(hex64('sibling')).length(4)
13
15
  .describe('Depth-4 Merkle inclusion path: exactly 4 sibling digests (64 hex each)');
@@ -25,7 +27,7 @@ const swapLeg = (what) => z.object({
25
27
  tokenType: hex64(`${what}.tokenType`).describe('Raw token type (64 hex), what derive_token_type returns'),
26
28
  amount: z.union([
27
29
  z.string().regex(/^[1-9]\d*$/, `${what}.amount must be a positive integer (decimal string)`),
28
- z.number().int().positive(),
30
+ z.number().int().positive().safe(),
29
31
  ]).describe('Amount in atoms; a decimal string is exact'),
30
32
  });
31
33
  const legOut = (leg) => ({ tokenType: leg.tokenType.toLowerCase(), amount: String(leg.amount) });
@@ -35,6 +37,10 @@ const swapHalf = (what) => z.string().min(16)
35
37
  const SWAP_HINT = 'A swap settles two shielded tokens between two wallets without a contract: each side builds one half ' +
36
38
  '(it spends the coin it gives and creates the coin it wants), the two mirrored halves merge into one transaction, ' +
37
39
  'and a sponsor pays the fee.';
40
+ const OFFER_STATUS = z.enum(['open', 'filled', 'retired', 'expired', 'all']);
41
+ const BOARD_ROW_HINT = 'Each row: offerId, the offer half (feed it to read_swap_offer or take_swap_offer), gives/wants ' +
42
+ 'type and amount, tags, expiresAt, postedAt, status, filledTxHash, closedAt, changedAt. Never the poster or the ' +
43
+ "half's nullifiers.";
38
44
  /**
39
45
  * Per-slot salt of a proof field. Content-tree leaves are SALTED, so every
40
46
  * single-field proof needs the slot's salt from prepare_document_proof
@@ -892,13 +898,17 @@ export function registerTools(server, client, config) {
892
898
  description: 'The shielded wallet this MCP server swaps from (seed from NIGHTGATE_SEED_HEX): address, ' +
893
899
  'public keys, and per token type the balance, the number of free coins and `spendable`, ' +
894
900
  'the most ONE swap half can give (what its largest coins hold, up to maxInputs coins). ' +
895
- 'Also lists the halves built here that are not handed over yet. The wallet syncs its ' +
901
+ 'Also lists the halves built here that are not handed over yet; one posted with ' +
902
+ 'post_swap_offer carries offerId and boardStatus and leaves the list once its offer filled. The wallet syncs its ' +
896
903
  'shielded coins only; a first sync from genesis takes about 5 minutes, during which the ' +
897
904
  'answer is { synced: false, syncingSeconds }: call again. Spends nothing.',
898
905
  inputSchema: {},
899
906
  }, run(async () => {
900
907
  if (!config)
901
908
  throw new Error('swaps are not configured for this server instance');
909
+ for (const offerId of postedOfferIds()) {
910
+ settleBoardRows(await client.callFunction('getSwapOffer', { offerId: raw(offerId) }).catch(() => undefined));
911
+ }
902
912
  return swapWalletInfo(config);
903
913
  }));
904
914
  server.registerTool('read_swap_offer', {
@@ -939,10 +949,12 @@ export function registerTools(server, client, config) {
939
949
  'With sponsorSessionId the two halves go to the sponsor at once and the answer is the ' +
940
950
  'job ({ jobId, status, sessionId, id, terms }): poll get_job_status with the returned ' +
941
951
  'sessionId. Without it the answer carries both halves for sponsor_swap. ALWAYS pass ' +
942
- '`expect` with the terms you agreed to: an offer is text from someone else. A sponsor ' +
943
- 'that refuses the swap leaves the proven half held under `halfId`: send it again with ' +
944
- 'sponsor_swap({ halfId, sponsorSessionId }) or release its coins with revert_swap_offer. ' +
945
- 'If the offer was taken by somebody else first, the job fails: revert_swap_offer.',
952
+ '`expect` with the terms you agreed to: an offer is text from someone else. With offerId ' +
953
+ 'the board entry is read first and the call refuses, before proving, when it is not open ' +
954
+ 'or carries another offer than `offer`. A sponsor that refuses the swap leaves the proven ' +
955
+ 'half held under `halfId`: send it again with sponsor_swap({ halfId, offerId?, ' +
956
+ 'sponsorSessionId }) or release its coins with revert_swap_offer. If the offer was taken ' +
957
+ 'by somebody else first, the job fails: revert_swap_offer.',
946
958
  inputSchema: {
947
959
  offer: swapHalf('The offer to take'),
948
960
  expect: z.object({ gives: swapLeg('expect.gives'), wants: swapLeg('expect.wants') }).optional()
@@ -950,10 +962,20 @@ export function registerTools(server, client, config) {
950
962
  sponsorSessionId: z.string().uuid().optional()
951
963
  .describe('Sponsor session or the platform sponsor POOL id ' + `${PLATFORM_POOL_SENTINEL}` + '; when given the swap is submitted at once'),
952
964
  idempotencyKey: z.string().optional().describe('Dedupes retries of the same submission'),
965
+ offerId: z.string().uuid().optional()
966
+ .describe('The board entry the offer came from (list_swap_offers), so the fill is recorded against it'),
953
967
  },
954
968
  }, run(async (args) => {
955
969
  if (!config)
956
970
  throw new Error('swaps are not configured for this server instance');
971
+ if (args.offerId) {
972
+ const row = await client.callFunction('getSwapOffer', { offerId: raw(args.offerId) });
973
+ if (row.status !== 'open')
974
+ throw new Error(`board offer ${args.offerId} is ${String(row.status)}, not open`);
975
+ if (typeof row.offer !== 'string' || !(await sameOffer(args.offer, row.offer))) {
976
+ throw new Error(`board offer ${args.offerId} carries another offer than the one passed: take the board's text, or drop offerId`);
977
+ }
978
+ }
957
979
  const taken = await takeOffer(config, {
958
980
  offer: args.offer,
959
981
  ...(args.expect ? { expect: { gives: legOut(args.expect.gives), wants: legOut(args.expect.wants) } } : {}),
@@ -963,7 +985,7 @@ export function registerTools(server, client, config) {
963
985
  let job;
964
986
  try {
965
987
  job = await client.callAction('sponsorSwap', {
966
- makerHalfB64: taken.makerHalfB64,
988
+ ...(args.offerId ? { offerId: args.offerId } : { makerHalfB64: taken.makerHalfB64 }),
967
989
  takerHalfB64: taken.takerHalfB64,
968
990
  sponsorSessionId: args.sponsorSessionId,
969
991
  idempotencyKey: args.idempotencyKey,
@@ -1001,7 +1023,8 @@ export function registerTools(server, client, config) {
1001
1023
  'needs sponsorSwap in its allowedActions. Job result { txHash, swap: { gives, wants } }. ' +
1002
1024
  'An offer fills once: if it was taken first by somebody else the job fails. Pass both ' +
1003
1025
  'halves, or `halfId` alone for an offer this server took (take_swap_offer keeps both ' +
1004
- 'halves). Poll get_job_status with the sessionId RETURNED by this call. ' + POLL_HINT,
1026
+ 'halves); with `offerId` the maker half comes from the board, next to takerHalf or the ' +
1027
+ 'halfId of the taken offer. Poll get_job_status with the sessionId RETURNED by this call. ' + POLL_HINT,
1005
1028
  inputSchema: {
1006
1029
  makerHalf: swapHalf("The maker's half (the offer)").optional(),
1007
1030
  takerHalf: swapHalf("The taker's half").optional(),
@@ -1012,15 +1035,28 @@ export function registerTools(server, client, config) {
1012
1035
  .describe('Dedupes retries of the SAME two halves'),
1013
1036
  halfId: z.string().regex(/^[0-9a-f]{32}$/, 'halfId must be the 32 hex characters a swap tool returned').optional()
1014
1037
  .describe('Id of the half this server built for the swap: alone it names a taken offer, next to both halves it ties the job to the half'),
1038
+ offerId: z.string().uuid().optional()
1039
+ .describe('An offer on the server\'s board (list_swap_offers): the server takes the maker half from there; pass takerHalf or the halfId of the taken offer with it'),
1015
1040
  },
1016
1041
  }, run(async (args) => {
1017
- if (!!args.makerHalf !== !!args.takerHalf)
1018
- throw new Error('sponsor_swap needs makerHalf AND takerHalf, or halfId alone');
1019
- if (!args.makerHalf && !args.halfId)
1020
- throw new Error('sponsor_swap needs makerHalf and takerHalf, or the halfId of an offer this server took');
1021
- const halves = args.makerHalf && args.takerHalf
1022
- ? { makerHalfB64: args.makerHalf, takerHalfB64: args.takerHalf }
1023
- : takenHalves(args.halfId);
1042
+ let halves;
1043
+ if (args.offerId) {
1044
+ if (args.makerHalf)
1045
+ throw new Error('sponsor_swap with offerId takes the maker half from the board: no makerHalf');
1046
+ const takerHalf = args.takerHalf ?? (args.halfId ? takenHalves(args.halfId).takerHalfB64 : undefined);
1047
+ if (!takerHalf)
1048
+ throw new Error('sponsor_swap with offerId needs takerHalf, or the halfId of an offer this server took');
1049
+ halves = { offerId: args.offerId, takerHalfB64: takerHalf };
1050
+ }
1051
+ else {
1052
+ if (!!args.makerHalf !== !!args.takerHalf)
1053
+ throw new Error('sponsor_swap needs makerHalf AND takerHalf, or halfId alone');
1054
+ if (!args.makerHalf && !args.halfId)
1055
+ throw new Error('sponsor_swap needs makerHalf and takerHalf, or the halfId of an offer this server took');
1056
+ halves = args.makerHalf && args.takerHalf
1057
+ ? { makerHalfB64: args.makerHalf, takerHalfB64: args.takerHalf }
1058
+ : takenHalves(args.halfId);
1059
+ }
1024
1060
  const job = await client.callAction('sponsorSwap', {
1025
1061
  ...halves,
1026
1062
  sponsorSessionId: args.sponsorSessionId,
@@ -1030,6 +1066,135 @@ export function registerTools(server, client, config) {
1030
1066
  trackHalfJob(args.halfId, job?.jobId);
1031
1067
  return job;
1032
1068
  }));
1069
+ server.registerTool('post_swap_offer', {
1070
+ description: 'Post a maker half on the server\'s offer board, so takers find it with list_swap_offers ' +
1071
+ 'instead of receiving the offer file out of band. The server checks it like a half it ' +
1072
+ 'would sponsor (one token type given, one wanted, both on its list, never NIGHT) and ' +
1073
+ 'records its terms; the half itself stays signed by the maker. The offer closes when a ' +
1074
+ 'swap that spends one of its inputs lands, on expiry, or by retire_swap_offer. Needs ' +
1075
+ 'postSwapOffer in an agent grant\'s allowedActions. Returns { offerId, status, terms }.',
1076
+ inputSchema: {
1077
+ offer: swapHalf('The maker half, as offer file text or base64'),
1078
+ expiresAt: z.string().datetime().optional().describe('ISO timestamp; at most 90 days ahead'),
1079
+ tags: z.array(z.string().min(1).max(40)).max(8).optional().describe('Up to 8 tags for list_swap_offers'),
1080
+ },
1081
+ }, run(async (args) => {
1082
+ const posted = await client.callAction('postSwapOffer', {
1083
+ offer: args.offer,
1084
+ expiresAt: args.expiresAt,
1085
+ tags: args.tags ? JSON.stringify(args.tags) : undefined,
1086
+ });
1087
+ await trackPostedHalf(args.offer, posted?.offerId).catch(() => { });
1088
+ return posted;
1089
+ }));
1090
+ server.registerTool('list_swap_offers', {
1091
+ description: 'Offers on the server\'s board. Without status: the open ones, newest first. status filled | ' +
1092
+ 'retired | expired | all reads the closed ones instead, ordered by last change; since keeps ' +
1093
+ 'offers changed after that instant, so status all + since polled repeatedly is the board\'s ' +
1094
+ 'change feed. Filters are exact 64-hex token types and one tag. ' + BOARD_ROW_HINT +
1095
+ ' Every token may read the board.',
1096
+ inputSchema: {
1097
+ givesType: hex64('givesType').optional().describe('Only offers that give this token type'),
1098
+ wantsType: hex64('wantsType').optional().describe('Only offers that want this token type'),
1099
+ tag: z.string().min(1).max(40).optional().describe('Only offers carrying this tag'),
1100
+ limit: z.number().int().min(1).max(200).optional().describe('Default 50'),
1101
+ status: OFFER_STATUS.optional().describe('Default open'),
1102
+ since: z.string().datetime().optional().describe('ISO timestamp; only offers changed after it'),
1103
+ },
1104
+ }, run(async (args) => settled(await listOffers(client, { ...args, mine: null }))));
1105
+ server.registerTool('my_swap_offers', {
1106
+ description: 'The offers this caller posted on the board (a token: its grant\'s), open and closed, ' +
1107
+ 'ordered by last change: what is still open, what filled (filledTxHash), what expired or ' +
1108
+ 'was retired. status narrows to one state, since to offers changed after an instant. ' +
1109
+ BOARD_ROW_HINT,
1110
+ inputSchema: {
1111
+ status: OFFER_STATUS.optional().describe('Default all'),
1112
+ since: z.string().datetime().optional().describe('ISO timestamp; only offers changed after it'),
1113
+ limit: z.number().int().min(1).max(200).optional().describe('Default 50'),
1114
+ },
1115
+ }, run(async (args) => settled(await listOffers(client, { status: args.status ?? 'all', since: args.since, limit: args.limit, mine: true }))));
1116
+ server.registerTool('get_swap_offer', {
1117
+ description: 'One board offer by id, open or closed, in the board\'s shape: status, filledTxHash once a ' +
1118
+ 'swap spent it, closedAt, changedAt. The way to follow an offer after post_swap_offer or ' +
1119
+ 'after taking one. Unknown id: 404. ' + BOARD_ROW_HINT,
1120
+ inputSchema: {
1121
+ offerId: z.string().uuid().describe('The board entry'),
1122
+ },
1123
+ }, run(async (args) => settled(await client.callFunction('getSwapOffer', { offerId: raw(args.offerId) }))));
1124
+ server.registerTool('get_board_status', {
1125
+ description: 'Counts of the server\'s offer board and its sponsors, no credentials needed: openOffers, ' +
1126
+ 'offersFilledToday and swapsToday (UTC day), sponsorsConfigured and sponsorsReady (at tip ' +
1127
+ 'with a spendable dust note; 0 means a sponsor_swap would wait or fail now), asOf. ' +
1128
+ 'Computed at most every 10 s.',
1129
+ inputSchema: {},
1130
+ }, run(async () => client.callIndexerFunction('getBoardStatus')));
1131
+ server.registerTool('retire_swap_offer', {
1132
+ description: 'Take an offer off the board. Only its poster may; the coins behind the half stay ' +
1133
+ 'reserved until revert_swap_offer releases the half built here. Returns { offerId, status }.',
1134
+ inputSchema: {
1135
+ offerId: z.string().uuid().describe('The board entry'),
1136
+ },
1137
+ }, run(async (args) => client.callAction('retireSwapOffer', { offerId: args.offerId })));
1138
+ server.registerTool('grant_disclosure_to_holders', {
1139
+ description: 'Disclose a document to everyone who holds a token: whoever registered a claim key on ' +
1140
+ 'the holder-registry contract for tokenType by passing a coin through it can read the ' +
1141
+ 'text with claim_disclosure, and the server never learns who. content must hash to ' +
1142
+ 'payloadHash (blake2b-256 or sha256 of the UTF-8 text); it is stored encrypted. A repeat ' +
1143
+ 'call for the same payload, token type and registry updates the grant (content kept ' +
1144
+ 'when omitted). Returns { holderGrantId, hasContent, expiresAt, status }.',
1145
+ inputSchema: {
1146
+ payloadHash: hex64('payloadHash').describe('Hash of the document (64 hex)'),
1147
+ tokenType: hex64('tokenType').describe('The raw shielded token type whose holders may read (64 hex)'),
1148
+ registryAddress: hex64('registryAddress').describe('The holder-registry deployment holders registered on'),
1149
+ content: z.string().max(1_048_576).optional().describe('The document text; must hash to payloadHash'),
1150
+ contentType: z.string().max(100).optional().describe("Default 'text/plain'"),
1151
+ expiresAt: z.string().datetime().optional().describe('ISO timestamp, at most one year ahead'),
1152
+ },
1153
+ }, run(async (args) => client.callAction('grantDisclosureToHolders', {
1154
+ payloadHash: args.payloadHash.toLowerCase(),
1155
+ tokenType: args.tokenType.toLowerCase(),
1156
+ registryAddress: args.registryAddress.toLowerCase(),
1157
+ content: args.content,
1158
+ contentType: args.contentType,
1159
+ expiresAt: args.expiresAt,
1160
+ })));
1161
+ server.registerTool('revoke_holder_disclosure', {
1162
+ description: 'Revoke a disclosure to token holders. Only its grantor may. Returns { holderGrantId, status }.',
1163
+ inputSchema: {
1164
+ holderGrantId: z.string().uuid().describe('From grant_disclosure_to_holders'),
1165
+ },
1166
+ }, run(async (args) => client.callAction('revokeHolderDisclosure', { holderGrantId: args.holderGrantId })));
1167
+ server.registerTool('claim_disclosure', {
1168
+ description: 'Read a document disclosed to the holders of a token. claimSecret is the 32-byte secret ' +
1169
+ 'behind the claim key registered on the holder-registry contract (holder_claim_key); the ' +
1170
+ 'server reads the registry live and answers { entitled, content, contentType, ' +
1171
+ 'contentHashKind, expiresAt } or { entitled: false, reason }. Needs a live indexer on ' +
1172
+ 'the server.',
1173
+ inputSchema: {
1174
+ payloadHash: hex64('payloadHash').describe('Hash of the document (64 hex)'),
1175
+ tokenType: hex64('tokenType').describe('The raw shielded token type (64 hex)'),
1176
+ claimSecret: hex64('claimSecret').describe('The secret behind the registered claim key (64 hex)'),
1177
+ },
1178
+ }, run(async (args) => client.callAction('claimDisclosure', {
1179
+ payloadHash: args.payloadHash.toLowerCase(),
1180
+ tokenType: args.tokenType.toLowerCase(),
1181
+ claimSecret: args.claimSecret.toLowerCase(),
1182
+ })));
1183
+ server.registerTool('holder_claim_key', {
1184
+ description: 'The claim key a token holder registers on the holder-registry contract, derived from a ' +
1185
+ '32-byte secret (compute-only). Without a secret a fresh random one is generated: keep ' +
1186
+ 'it, claim_disclosure needs it. Register the key with registerHolder(coin, claimKey) on ' +
1187
+ 'the registry (one coin of the token type passes through the contract and comes back), ' +
1188
+ 'e.g. through build_sponsorable_transaction on a builder that knows the registry.',
1189
+ inputSchema: {
1190
+ claimSecret: hex64('claimSecret').optional().describe('Existing secret (64 hex); omit to generate one'),
1191
+ },
1192
+ }, run(async (args) => {
1193
+ const holderClaimKey = await txExport('holderClaimKey', 'holder_claim_key', '0.10.0');
1194
+ const { randomBytes } = await import('node:crypto');
1195
+ const claimSecret = (args.claimSecret ?? randomBytes(32).toString('hex')).toLowerCase();
1196
+ return { claimSecret, claimKey: holderClaimKey(claimSecret) };
1197
+ }));
1033
1198
  server.registerTool('derive_token_type', {
1034
1199
  description: 'Derive the raw token type a minting contract produces (compute-only, no wallet, no ' +
1035
1200
  'chain access). A custom token is addressed by rawTokenType(domainSeparator, ' +
@@ -1045,6 +1210,74 @@ export function registerTools(server, client, config) {
1045
1210
  contractAddress: args.contractAddress,
1046
1211
  domainSeparator: args.domainSeparator,
1047
1212
  })));
1213
+ server.registerTool('mint_token', {
1214
+ description: 'Mint a shielded token with a name of your own on a token-factory deployment. Two ways. ' +
1215
+ 'LOCAL (default, no sessionId): this process is the issuer, its issuer secret derives from ' +
1216
+ 'NIGHTGATE_SEED_HEX, the mint is built, proven and signed here and the fee-unpaid ' +
1217
+ 'transaction goes to the sponsor (sponsorSessionId, default the platform pool) like ' +
1218
+ 'sponsor_unbound_transaction; the seed never leaves this process. The factory has to be ' +
1219
+ 'on the sponsor\'s contract list and mint on its circuit list. SERVER (sessionId given): the ' +
1220
+ 'server session is the issuer and mints through mintFactoryToken; needs that action in ' +
1221
+ 'the grant. Either way the same name from another issuer is another token, and the ' +
1222
+ 'response names the token before the job runs ({ tokenType, domain, issuerKey }); a ' +
1223
+ 'landed mint makes the type known to the sponsor (swaps, offer board). The recipient ' +
1224
+ 'defaults to this wallet (get_attester_identity); another wallet takes both of its keys. ' +
1225
+ 'Job result { txHash, ... }. Poll get_job_status with the sessionId RETURNED by this call. ' + POLL_HINT,
1226
+ inputSchema: {
1227
+ contractAddress: hex64('contractAddress').describe('A token-factory deployment'),
1228
+ name: z.string().min(1).refine((s) => Buffer.byteLength(s, 'utf8') <= 32, 'name must be at most 32 UTF-8 bytes')
1229
+ .describe('Token name, at most 32 UTF-8 bytes; with the issuer it names the token type'),
1230
+ amount: z.union([
1231
+ z.string().regex(/^[1-9]\d*$/, 'amount must be a positive integer (decimal string)'),
1232
+ z.number().int().positive().safe(),
1233
+ ]).describe('Atoms to mint; a decimal string is exact'),
1234
+ recipientCoinPublicKey: hex64('recipientCoinPublicKey').optional()
1235
+ .describe('Zswap coin public key of the receiving wallet (64 hex); default this wallet\'s own'),
1236
+ recipientEncryptionPublicKey: hex64('recipientEncryptionPublicKey').optional()
1237
+ .describe('The receiving wallet\'s encryption public key (64 hex); required with a recipient other than this wallet, local way'),
1238
+ sponsorSessionId: z.string().uuid().optional()
1239
+ .describe(`Local way: the session that pays the dust and submits; default the platform sponsor POOL id ${PLATFORM_POOL_SENTINEL}. Server way: an optional second session that pays`),
1240
+ sessionId: z.string().uuid().optional()
1241
+ .describe('Server way only: the wallet session that mints; it is the issuer'),
1242
+ idempotencyKey: z.string().optional().describe('Dedupes retries'),
1243
+ },
1244
+ }, run(async (args) => {
1245
+ if (args.sessionId) {
1246
+ let recipient = args.recipientCoinPublicKey;
1247
+ if (!recipient) {
1248
+ if (!config?.seedHex)
1249
+ throw new Error('mint_token needs recipientCoinPublicKey: no NIGHTGATE_SEED_HEX for a default');
1250
+ recipient = (await seedIdentity(config)).coinPublicKey;
1251
+ if (!recipient)
1252
+ throw new Error('mint_token needs recipientCoinPublicKey: the seed exposes no shielded keys');
1253
+ }
1254
+ return client.callAction('mintFactoryToken', {
1255
+ contractAddress: args.contractAddress.toLowerCase(),
1256
+ name: args.name,
1257
+ amount: String(args.amount),
1258
+ recipientCoinPublicKey: recipient.toLowerCase(),
1259
+ sessionId: args.sessionId,
1260
+ idempotencyKey: args.idempotencyKey,
1261
+ sponsorSessionId: args.sponsorSessionId,
1262
+ });
1263
+ }
1264
+ if (!config)
1265
+ throw new Error('local minting is not configured for this server instance');
1266
+ const built = await buildMint(config, {
1267
+ contractAddress: args.contractAddress,
1268
+ name: args.name,
1269
+ amount: String(args.amount),
1270
+ recipientCoinPublicKey: args.recipientCoinPublicKey,
1271
+ recipientEncryptionPublicKey: args.recipientEncryptionPublicKey,
1272
+ });
1273
+ const job = await client.callAction('sponsorUnboundTransaction', {
1274
+ unboundTxB64: built.unboundTxB64,
1275
+ sponsorSessionId: args.sponsorSessionId ?? PLATFORM_POOL_SENTINEL,
1276
+ idempotencyKey: args.idempotencyKey,
1277
+ });
1278
+ const { unboundTxB64: _tx, ...rest } = built;
1279
+ return { ...job, ...rest, channel: 'local' };
1280
+ }));
1048
1281
  server.registerTool('get_job_status', {
1049
1282
  description: 'Poll the status of an async NIGHTGATE job (all submit actions return a jobId). ' +
1050
1283
  'status: pending | running | external_execution | submitted | reconciliation_required | ' +
@@ -1056,7 +1289,7 @@ export function registerTools(server, client, config) {
1056
1289
  'identifier is in the error message, the server keeps resolving it via the indexer. ' +
1057
1290
  'Batches: once confirmed, chainSegments ([{ segment, calls, applied }]) says which calls ' +
1058
1291
  'applied; resend only the ones with applied false. Swaps: the result carries swap ' +
1059
- '{ gives, wants }, what was exchanged from the maker\'s side.',
1292
+ '{ gives, wants }, what was exchanged from the maker\'s side. Mints: tokenType.',
1060
1293
  inputSchema: {
1061
1294
  jobId: z.string().uuid().describe('Job id returned by a submit action'),
1062
1295
  sessionId: z.string().uuid()
@@ -1071,6 +1304,23 @@ export function registerTools(server, client, config) {
1071
1304
  return job;
1072
1305
  }));
1073
1306
  }
1307
+ /** listSwapOffers wants all seven parameters, null for the unused ones. */
1308
+ /** Board rows pass through unchanged after settling the maker halves posted as them. */
1309
+ function settled(rows) {
1310
+ settleBoardRows(rows);
1311
+ return rows;
1312
+ }
1313
+ function listOffers(client, args) {
1314
+ return client.callFunction('listSwapOffers', {
1315
+ givesType: args.givesType?.toLowerCase() ?? null,
1316
+ wantsType: args.wantsType?.toLowerCase() ?? null,
1317
+ tag: args.tag ?? null,
1318
+ limit: args.limit ?? null,
1319
+ status: args.status ?? null,
1320
+ since: args.since ?? null,
1321
+ mine: args.mine,
1322
+ });
1323
+ }
1074
1324
  /**
1075
1325
  * Uniform handler wrapper: JSON success payloads, API errors reported as
1076
1326
  * tool errors (isError) with status + OData code so the agent can react