@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/CHANGELOG.md +42 -0
- package/README.md +23 -7
- package/dist/builder.d.ts +8 -0
- package/dist/builder.js +24 -0
- package/dist/builder.js.map +1 -1
- package/dist/client.d.ts +11 -2
- package/dist/client.js +23 -17
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/factory.d.ts +23 -0
- package/dist/factory.js +106 -0
- package/dist/factory.js.map +1 -0
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/swap.d.ts +11 -0
- package/dist/swap.js +54 -11
- package/dist/swap.js.map +1 -1
- package/dist/tools.js +271 -21
- package/dist/tools.js.map +1 -1
- package/dist/tx-module.d.ts +3 -0
- package/dist/tx-module.js +24 -0
- package/dist/tx-module.js.map +1 -0
- package/package.json +8 -3
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
|
-
|
|
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
|
|
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
|
|
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]) => ({
|
|
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
|
|
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.
|
|
943
|
-
'
|
|
944
|
-
'
|
|
945
|
-
'
|
|
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)
|
|
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
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
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
|