@xian-tech/client 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +7 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +86 -38
- package/dist/client.js.map +1 -1
- package/dist/ed25519.d.ts +1 -1
- package/dist/ed25519.d.ts.map +1 -1
- package/dist/ed25519.js +2 -2
- package/dist/ed25519.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/relayer.d.ts +34 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +476 -0
- package/dist/relayer.js.map +1 -0
- package/dist/shielded.d.ts +3 -0
- package/dist/shielded.d.ts.map +1 -0
- package/dist/shielded.js +19 -0
- package/dist/shielded.js.map +1 -0
- package/dist/types.d.ts +171 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/watch.d.ts +1 -1
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +1 -1
- package/dist/watch.js.map +1 -1
- package/package.json +9 -3
package/dist/relayer.js
ADDED
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { parseXianNumber } from "./encoding.js";
|
|
2
|
+
import { TransportError, XianClientError } from "./errors.js";
|
|
3
|
+
const ALL_RELAY_KINDS = [
|
|
4
|
+
"shielded_note_relay_transfer",
|
|
5
|
+
"shielded_command"
|
|
6
|
+
];
|
|
7
|
+
function stripTrailingSlash(value) {
|
|
8
|
+
return value.replace(/\/+$/, "");
|
|
9
|
+
}
|
|
10
|
+
function jsonBody(value) {
|
|
11
|
+
return JSON.stringify(value, (_key, entry) => typeof entry === "bigint" ? entry.toString() : entry);
|
|
12
|
+
}
|
|
13
|
+
function asRecord(value) {
|
|
14
|
+
if (typeof value !== "object" || value === null) {
|
|
15
|
+
throw new TransportError("expected object response");
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function asArrayOfStrings(value) {
|
|
20
|
+
if (!Array.isArray(value)) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
return value.filter((item) => typeof item === "string");
|
|
24
|
+
}
|
|
25
|
+
function normalizeMaybeString(value) {
|
|
26
|
+
if (value == null) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return typeof value === "string" ? value : String(value);
|
|
30
|
+
}
|
|
31
|
+
function normalizeMaybeInteger(value) {
|
|
32
|
+
if (typeof value === "number" && Number.isInteger(value)) {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
if (typeof value === "string" && /^-?\d+$/.test(value)) {
|
|
36
|
+
return Number(value);
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function normalizeMaybeXianNumber(value) {
|
|
41
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === "string" && /^-?\d+$/.test(value)) {
|
|
45
|
+
return parseXianNumber(value);
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function normalizeRelayKind(value) {
|
|
50
|
+
return value === "shielded_command" ||
|
|
51
|
+
value === "shielded_note_relay_transfer"
|
|
52
|
+
? value
|
|
53
|
+
: null;
|
|
54
|
+
}
|
|
55
|
+
function normalizeAuthScheme(value) {
|
|
56
|
+
return value === "bearer" ? "bearer" : "none";
|
|
57
|
+
}
|
|
58
|
+
function normalizeBool(value, fallback) {
|
|
59
|
+
return typeof value === "boolean" ? value : fallback;
|
|
60
|
+
}
|
|
61
|
+
function normalizePriority(value) {
|
|
62
|
+
const parsed = normalizeMaybeInteger(value);
|
|
63
|
+
return parsed !== null && parsed >= 0 ? parsed : 100;
|
|
64
|
+
}
|
|
65
|
+
function uniqueRelayKinds(values) {
|
|
66
|
+
if (!Array.isArray(values) || values.length === 0) {
|
|
67
|
+
return [...ALL_RELAY_KINDS];
|
|
68
|
+
}
|
|
69
|
+
const unique = new Set();
|
|
70
|
+
for (const value of values) {
|
|
71
|
+
const normalized = normalizeRelayKind(value);
|
|
72
|
+
if (normalized !== null) {
|
|
73
|
+
unique.add(normalized);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return unique.size > 0 ? [...unique] : [...ALL_RELAY_KINDS];
|
|
77
|
+
}
|
|
78
|
+
function copyRelayerEntry(entry) {
|
|
79
|
+
return {
|
|
80
|
+
...entry,
|
|
81
|
+
submissionKinds: [...entry.submissionKinds]
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function normalizeShieldedRelayerCatalogEntry(entry, index = 0) {
|
|
85
|
+
const relayerUrl = stripTrailingSlash(typeof entry.relayerUrl === "string"
|
|
86
|
+
? entry.relayerUrl
|
|
87
|
+
: typeof entry.baseUrl === "string"
|
|
88
|
+
? entry.baseUrl
|
|
89
|
+
: "");
|
|
90
|
+
if (!relayerUrl) {
|
|
91
|
+
throw new XianClientError("shielded relayer entry must define relayerUrl or baseUrl");
|
|
92
|
+
}
|
|
93
|
+
const id = normalizeMaybeString(entry.id)?.trim() || `relayer-${index + 1}`;
|
|
94
|
+
const authToken = normalizeMaybeString(entry.authToken)?.trim() || undefined;
|
|
95
|
+
return {
|
|
96
|
+
id,
|
|
97
|
+
relayerUrl,
|
|
98
|
+
authToken,
|
|
99
|
+
authScheme: normalizeAuthScheme(entry.authScheme),
|
|
100
|
+
publicInfo: normalizeBool(entry.publicInfo, true),
|
|
101
|
+
publicQuote: normalizeBool(entry.publicQuote, false),
|
|
102
|
+
publicJobLookup: normalizeBool(entry.publicJobLookup, false),
|
|
103
|
+
priority: normalizePriority(entry.priority),
|
|
104
|
+
submissionKinds: uniqueRelayKinds(entry.submissionKinds)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function sortShieldedRelayerCatalog(entries) {
|
|
108
|
+
const normalized = entries.map((entry, index) => normalizeShieldedRelayerCatalogEntry(entry, index));
|
|
109
|
+
normalized.sort((left, right) => {
|
|
110
|
+
if (left.priority !== right.priority) {
|
|
111
|
+
return left.priority - right.priority;
|
|
112
|
+
}
|
|
113
|
+
if (left.id !== right.id) {
|
|
114
|
+
return left.id.localeCompare(right.id);
|
|
115
|
+
}
|
|
116
|
+
return left.relayerUrl.localeCompare(right.relayerUrl);
|
|
117
|
+
});
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
for (const entry of normalized) {
|
|
120
|
+
if (seen.has(entry.id)) {
|
|
121
|
+
throw new XianClientError(`duplicate shielded relayer id: ${entry.id}`);
|
|
122
|
+
}
|
|
123
|
+
seen.add(entry.id);
|
|
124
|
+
}
|
|
125
|
+
return normalized;
|
|
126
|
+
}
|
|
127
|
+
function buildAggregateTransportError(action, failures) {
|
|
128
|
+
const detail = failures
|
|
129
|
+
.map(({ relayer, error }) => {
|
|
130
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
return `${relayer.id}: ${message}`;
|
|
132
|
+
})
|
|
133
|
+
.join("; ");
|
|
134
|
+
return new TransportError(`${action} failed for all candidate relayers: ${detail}`);
|
|
135
|
+
}
|
|
136
|
+
function relayerSupportsKind(relayer, kind) {
|
|
137
|
+
return relayer.submissionKinds.includes(kind);
|
|
138
|
+
}
|
|
139
|
+
function normalizeSignedTransaction(value) {
|
|
140
|
+
if (typeof value !== "object" || value === null) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
const raw = value;
|
|
144
|
+
const payload = typeof raw.payload === "object" && raw.payload !== null
|
|
145
|
+
? raw.payload
|
|
146
|
+
: null;
|
|
147
|
+
const metadata = typeof raw.metadata === "object" && raw.metadata !== null
|
|
148
|
+
? raw.metadata
|
|
149
|
+
: null;
|
|
150
|
+
if (payload == null || metadata == null) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
return { payload, metadata };
|
|
154
|
+
}
|
|
155
|
+
function normalizeReceipt(value) {
|
|
156
|
+
if (typeof value !== "object" || value === null) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const raw = value;
|
|
160
|
+
const txHash = normalizeMaybeString(raw.tx_hash ?? raw.txHash) ?? undefined;
|
|
161
|
+
return {
|
|
162
|
+
success: Boolean(raw.success),
|
|
163
|
+
txHash,
|
|
164
|
+
message: raw.message,
|
|
165
|
+
response: asRecord(raw.raw ?? raw.response ?? raw),
|
|
166
|
+
transaction: normalizeSignedTransaction(raw.transaction),
|
|
167
|
+
execution: raw.execution
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function normalizeSubmission(value) {
|
|
171
|
+
if (typeof value !== "object" || value === null) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const raw = value;
|
|
175
|
+
const modeValue = normalizeMaybeString(raw.mode);
|
|
176
|
+
const mode = modeValue === "async" || modeValue === "commit" || modeValue === "checktx"
|
|
177
|
+
? modeValue
|
|
178
|
+
: "checktx";
|
|
179
|
+
const nonce = normalizeMaybeXianNumber(raw.nonce) ?? 0;
|
|
180
|
+
const chiSupplied = normalizeMaybeXianNumber(raw.chi_supplied ?? raw.chiSupplied) ?? 0;
|
|
181
|
+
const chiEstimated = normalizeMaybeInteger(raw.chi_estimated ?? raw.chiEstimated) ?? undefined;
|
|
182
|
+
return {
|
|
183
|
+
submitted: Boolean(raw.submitted),
|
|
184
|
+
accepted: typeof raw.accepted === "boolean" || raw.accepted == null
|
|
185
|
+
? raw.accepted
|
|
186
|
+
: null,
|
|
187
|
+
finalized: Boolean(raw.finalized),
|
|
188
|
+
txHash: normalizeMaybeString(raw.tx_hash ?? raw.txHash) ?? undefined,
|
|
189
|
+
message: raw.message,
|
|
190
|
+
mode,
|
|
191
|
+
nonce,
|
|
192
|
+
chiSupplied,
|
|
193
|
+
chiEstimated,
|
|
194
|
+
response: asRecord(raw.response ?? raw),
|
|
195
|
+
receipt: normalizeReceipt(raw.receipt) ?? undefined
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
export class XianShieldedRelayerClient {
|
|
199
|
+
relayerUrl;
|
|
200
|
+
authToken;
|
|
201
|
+
fetchFn;
|
|
202
|
+
constructor(options) {
|
|
203
|
+
this.relayerUrl = stripTrailingSlash(options.relayerUrl);
|
|
204
|
+
this.authToken = options.authToken?.trim() || undefined;
|
|
205
|
+
this.fetchFn = options.fetchFn ?? globalThis.fetch.bind(globalThis);
|
|
206
|
+
}
|
|
207
|
+
async requestJson(method, path, body) {
|
|
208
|
+
const headers = {
|
|
209
|
+
accept: "application/json"
|
|
210
|
+
};
|
|
211
|
+
let payload;
|
|
212
|
+
if (body !== undefined) {
|
|
213
|
+
headers["content-type"] = "application/json";
|
|
214
|
+
payload = jsonBody(body);
|
|
215
|
+
}
|
|
216
|
+
if (this.authToken) {
|
|
217
|
+
headers.authorization = `Bearer ${this.authToken}`;
|
|
218
|
+
}
|
|
219
|
+
let response;
|
|
220
|
+
try {
|
|
221
|
+
response = await this.fetchFn(`${this.relayerUrl}${path}`, {
|
|
222
|
+
method,
|
|
223
|
+
headers,
|
|
224
|
+
body: payload
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw new TransportError(`request failed for ${this.relayerUrl}${path}`, { cause: error });
|
|
229
|
+
}
|
|
230
|
+
let decoded;
|
|
231
|
+
try {
|
|
232
|
+
decoded = await response.json();
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
throw new TransportError(`invalid JSON response from ${this.relayerUrl}${path}`, { cause: error });
|
|
236
|
+
}
|
|
237
|
+
const record = asRecord(decoded);
|
|
238
|
+
if (!response.ok) {
|
|
239
|
+
const message = normalizeMaybeString(record.error) ?? `relayer request failed with status ${response.status}`;
|
|
240
|
+
throw new TransportError(message);
|
|
241
|
+
}
|
|
242
|
+
return record;
|
|
243
|
+
}
|
|
244
|
+
async getInfo() {
|
|
245
|
+
const raw = await this.requestJson("GET", "/v1/info");
|
|
246
|
+
const policy = asRecord(raw.policy ?? {});
|
|
247
|
+
return {
|
|
248
|
+
service: normalizeMaybeString(raw.service) ?? "xian-shielded-relayer",
|
|
249
|
+
protocolVersion: normalizeMaybeString(raw.protocol_version) ?? "v1",
|
|
250
|
+
available: Boolean(raw.available),
|
|
251
|
+
chainId: normalizeMaybeString(raw.chain_id),
|
|
252
|
+
relayerAccount: normalizeMaybeString(raw.relayer_account),
|
|
253
|
+
submissionMode: raw.submission_mode === "async" ||
|
|
254
|
+
raw.submission_mode === "commit" ||
|
|
255
|
+
raw.submission_mode === "checktx"
|
|
256
|
+
? raw.submission_mode
|
|
257
|
+
: "checktx",
|
|
258
|
+
waitForTx: Boolean(raw.wait_for_tx),
|
|
259
|
+
capabilities: typeof raw.capabilities === "object" && raw.capabilities !== null
|
|
260
|
+
? Object.fromEntries(Object.entries(raw.capabilities).map(([key, value]) => [key, Boolean(value)]))
|
|
261
|
+
: {},
|
|
262
|
+
policy: {
|
|
263
|
+
quoteTtlSeconds: normalizeMaybeInteger(policy.quote_ttl_seconds) ?? 0,
|
|
264
|
+
defaultExpirySeconds: normalizeMaybeInteger(policy.default_expiry_seconds) ?? 0,
|
|
265
|
+
maxExpirySeconds: normalizeMaybeInteger(policy.max_expiry_seconds) ?? 0,
|
|
266
|
+
minNoteRelayerFee: normalizeMaybeXianNumber(policy.min_note_relayer_fee) ?? 0,
|
|
267
|
+
minCommandRelayerFee: normalizeMaybeXianNumber(policy.min_command_relayer_fee) ?? 0,
|
|
268
|
+
allowedNoteContracts: asArrayOfStrings(policy.allowed_note_contracts),
|
|
269
|
+
allowedCommandContracts: asArrayOfStrings(policy.allowed_command_contracts),
|
|
270
|
+
allowedCommandTargets: asArrayOfStrings(policy.allowed_command_targets)
|
|
271
|
+
},
|
|
272
|
+
raw
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
async getQuote(request) {
|
|
276
|
+
const raw = await this.requestJson("POST", "/v1/quote", {
|
|
277
|
+
kind: request.kind,
|
|
278
|
+
contract: request.contract,
|
|
279
|
+
target_contract: request.targetContract,
|
|
280
|
+
requested_relayer_fee: request.requestedRelayerFee,
|
|
281
|
+
requested_expires_in_seconds: request.requestedExpiresInSeconds
|
|
282
|
+
});
|
|
283
|
+
return {
|
|
284
|
+
kind: raw.kind === "shielded_command"
|
|
285
|
+
? "shielded_command"
|
|
286
|
+
: "shielded_note_relay_transfer",
|
|
287
|
+
contract: normalizeMaybeString(raw.contract) ?? "",
|
|
288
|
+
targetContract: normalizeMaybeString(raw.target_contract),
|
|
289
|
+
chainId: normalizeMaybeString(raw.chain_id),
|
|
290
|
+
relayerAccount: normalizeMaybeString(raw.relayer_account),
|
|
291
|
+
relayerFee: normalizeMaybeXianNumber(raw.relayer_fee) ?? 0,
|
|
292
|
+
expiresAt: normalizeMaybeString(raw.expires_at),
|
|
293
|
+
issuedAt: normalizeMaybeString(raw.issued_at),
|
|
294
|
+
policyVersion: normalizeMaybeString(raw.policy_version),
|
|
295
|
+
raw
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
async submitShieldedNoteRelayTransfer(request) {
|
|
299
|
+
const raw = await this.requestJson("POST", "/v1/jobs/shielded-note-transfer", {
|
|
300
|
+
contract: request.contract,
|
|
301
|
+
old_root: request.oldRoot,
|
|
302
|
+
input_nullifiers: request.inputNullifiers,
|
|
303
|
+
output_commitments: request.outputCommitments,
|
|
304
|
+
proof_hex: request.proofHex,
|
|
305
|
+
relayer_fee: request.relayerFee,
|
|
306
|
+
expires_at: request.expiresAt ?? null,
|
|
307
|
+
output_payloads: request.outputPayloads ?? [],
|
|
308
|
+
client_request_id: request.clientRequestId
|
|
309
|
+
});
|
|
310
|
+
return this.normalizeJob(raw);
|
|
311
|
+
}
|
|
312
|
+
async submitShieldedCommand(request) {
|
|
313
|
+
const raw = await this.requestJson("POST", "/v1/jobs/shielded-command", {
|
|
314
|
+
contract: request.contract,
|
|
315
|
+
target_contract: request.targetContract,
|
|
316
|
+
old_root: request.oldRoot,
|
|
317
|
+
input_nullifiers: request.inputNullifiers,
|
|
318
|
+
output_commitments: request.outputCommitments,
|
|
319
|
+
proof_hex: request.proofHex,
|
|
320
|
+
relayer_fee: request.relayerFee,
|
|
321
|
+
public_amount: request.publicAmount ?? 0,
|
|
322
|
+
payload: request.payload ?? null,
|
|
323
|
+
expires_at: request.expiresAt ?? null,
|
|
324
|
+
output_payloads: request.outputPayloads ?? [],
|
|
325
|
+
client_request_id: request.clientRequestId
|
|
326
|
+
});
|
|
327
|
+
return this.normalizeJob(raw);
|
|
328
|
+
}
|
|
329
|
+
async getJob(jobId) {
|
|
330
|
+
const raw = await this.requestJson("GET", `/v1/jobs/${encodeURIComponent(jobId)}`);
|
|
331
|
+
return this.normalizeJob(raw);
|
|
332
|
+
}
|
|
333
|
+
normalizeJob(raw) {
|
|
334
|
+
return {
|
|
335
|
+
jobId: normalizeMaybeString(raw.job_id) ?? "",
|
|
336
|
+
kind: raw.kind === "shielded_command"
|
|
337
|
+
? "shielded_command"
|
|
338
|
+
: "shielded_note_relay_transfer",
|
|
339
|
+
status: normalizeMaybeString(raw.status) ?? "unknown",
|
|
340
|
+
chainId: normalizeMaybeString(raw.chain_id),
|
|
341
|
+
relayerAccount: normalizeMaybeString(raw.relayer_account),
|
|
342
|
+
contract: normalizeMaybeString(raw.contract),
|
|
343
|
+
functionName: normalizeMaybeString(raw.function_name),
|
|
344
|
+
txHash: normalizeMaybeString(raw.tx_hash),
|
|
345
|
+
submittedAt: normalizeMaybeString(raw.submitted_at),
|
|
346
|
+
updatedAt: normalizeMaybeString(raw.updated_at),
|
|
347
|
+
error: normalizeMaybeString(raw.error),
|
|
348
|
+
submission: normalizeSubmission(raw.submission),
|
|
349
|
+
raw
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
export class XianShieldedRelayerPoolClient {
|
|
354
|
+
relayers;
|
|
355
|
+
clients;
|
|
356
|
+
constructor(options) {
|
|
357
|
+
this.relayers = sortShieldedRelayerCatalog(options.relayers);
|
|
358
|
+
if (this.relayers.length === 0) {
|
|
359
|
+
throw new XianClientError("shielded relayer pool requires at least one configured relayer");
|
|
360
|
+
}
|
|
361
|
+
this.clients = new Map(this.relayers.map((relayer) => [
|
|
362
|
+
relayer.id,
|
|
363
|
+
new XianShieldedRelayerClient({
|
|
364
|
+
relayerUrl: relayer.relayerUrl,
|
|
365
|
+
authToken: relayer.authToken,
|
|
366
|
+
fetchFn: options.fetchFn
|
|
367
|
+
})
|
|
368
|
+
]));
|
|
369
|
+
}
|
|
370
|
+
listRelayers(kind) {
|
|
371
|
+
const relayers = kind == null
|
|
372
|
+
? this.relayers
|
|
373
|
+
: this.relayers.filter((relayer) => relayerSupportsKind(relayer, kind));
|
|
374
|
+
return relayers.map(copyRelayerEntry);
|
|
375
|
+
}
|
|
376
|
+
getClient(relayerId) {
|
|
377
|
+
const client = this.clients.get(relayerId);
|
|
378
|
+
if (client == null) {
|
|
379
|
+
throw new XianClientError(`unknown shielded relayer id: ${relayerId}`);
|
|
380
|
+
}
|
|
381
|
+
return client;
|
|
382
|
+
}
|
|
383
|
+
async getInfo(options = {}) {
|
|
384
|
+
const candidates = this.selectCandidates(undefined, options);
|
|
385
|
+
return this.resolveWithFailover("getInfo", candidates, async (relayer) => ({
|
|
386
|
+
relayer,
|
|
387
|
+
info: await this.getClient(relayer.id).getInfo()
|
|
388
|
+
}));
|
|
389
|
+
}
|
|
390
|
+
async getQuote(request, options = {}) {
|
|
391
|
+
const candidates = this.selectCandidates(request.kind, options);
|
|
392
|
+
return this.resolveWithFailover("getQuote", candidates, async (relayer) => ({
|
|
393
|
+
relayer,
|
|
394
|
+
quote: await this.getClient(relayer.id).getQuote(request)
|
|
395
|
+
}));
|
|
396
|
+
}
|
|
397
|
+
async submitShieldedNoteRelayTransfer(request, options = {}) {
|
|
398
|
+
const relayer = this.resolveSubmissionRelayer("submitShieldedNoteRelayTransfer", "shielded_note_relay_transfer", options);
|
|
399
|
+
return {
|
|
400
|
+
relayer,
|
|
401
|
+
job: await this.getClient(relayer.id).submitShieldedNoteRelayTransfer(request)
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
async submitShieldedCommand(request, options = {}) {
|
|
405
|
+
const relayer = this.resolveSubmissionRelayer("submitShieldedCommand", "shielded_command", options);
|
|
406
|
+
return {
|
|
407
|
+
relayer,
|
|
408
|
+
job: await this.getClient(relayer.id).submitShieldedCommand(request)
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
async getJob(jobId, options = {}) {
|
|
412
|
+
const relayer = this.resolveJobRelayer("getJob", options);
|
|
413
|
+
return {
|
|
414
|
+
relayer,
|
|
415
|
+
job: await this.getClient(relayer.id).getJob(jobId)
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
selectCandidates(kind, options = {}) {
|
|
419
|
+
if (options.relayerId != null) {
|
|
420
|
+
const relayer = this.lookupRelayer(options.relayerId);
|
|
421
|
+
if (kind != null && !relayerSupportsKind(relayer, kind)) {
|
|
422
|
+
throw new XianClientError(`shielded relayer ${relayer.id} does not support ${kind}`);
|
|
423
|
+
}
|
|
424
|
+
return [relayer];
|
|
425
|
+
}
|
|
426
|
+
const relayers = kind == null
|
|
427
|
+
? this.relayers
|
|
428
|
+
: this.relayers.filter((relayer) => relayerSupportsKind(relayer, kind));
|
|
429
|
+
if (relayers.length === 0) {
|
|
430
|
+
throw new XianClientError(kind == null
|
|
431
|
+
? "no shielded relayers are configured"
|
|
432
|
+
: `no shielded relayers are configured for ${kind}`);
|
|
433
|
+
}
|
|
434
|
+
return relayers;
|
|
435
|
+
}
|
|
436
|
+
resolveSubmissionRelayer(action, kind, options) {
|
|
437
|
+
const candidates = this.selectCandidates(kind, options);
|
|
438
|
+
if (options.relayerId != null || candidates.length === 1) {
|
|
439
|
+
const [relayer] = candidates;
|
|
440
|
+
if (relayer != null) {
|
|
441
|
+
return relayer;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
throw new XianClientError(`${action} requires relayerId when multiple shielded relayers are configured`);
|
|
445
|
+
}
|
|
446
|
+
resolveJobRelayer(action, options) {
|
|
447
|
+
const candidates = this.selectCandidates(undefined, options);
|
|
448
|
+
if (options.relayerId != null || candidates.length === 1) {
|
|
449
|
+
const [relayer] = candidates;
|
|
450
|
+
if (relayer != null) {
|
|
451
|
+
return relayer;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
throw new XianClientError(`${action} requires relayerId when multiple shielded relayers are configured`);
|
|
455
|
+
}
|
|
456
|
+
lookupRelayer(relayerId) {
|
|
457
|
+
const relayer = this.relayers.find((entry) => entry.id === relayerId);
|
|
458
|
+
if (relayer == null) {
|
|
459
|
+
throw new XianClientError(`unknown shielded relayer id: ${relayerId}`);
|
|
460
|
+
}
|
|
461
|
+
return relayer;
|
|
462
|
+
}
|
|
463
|
+
async resolveWithFailover(action, candidates, fn) {
|
|
464
|
+
const failures = [];
|
|
465
|
+
for (const relayer of candidates) {
|
|
466
|
+
try {
|
|
467
|
+
return await fn(relayer);
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
failures.push({ relayer, error });
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
throw buildAggregateTransportError(action, failures);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=relayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayer.js","sourceRoot":"","sources":["../src/relayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shielded.d.ts","sourceRoot":"","sources":["../src/shielded.ts"],"names":[],"mappings":"AAeA,wBAAgB,oCAAoC,CAClD,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,qCAAqC,CACnD,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAIR"}
|
package/dist/shielded.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { sha3_256 } from "@noble/hashes/sha3";
|
|
2
|
+
import { bytesToHex, hexToBytes, utf8ToBytes } from "./encoding.js";
|
|
3
|
+
import { publicKeyFromPrivateKey } from "./ed25519.js";
|
|
4
|
+
const SYNC_HINT_PREFIX = utf8ToBytes("xian-zk-note-sync-v1");
|
|
5
|
+
const SYNC_HINT_BYTES = 12;
|
|
6
|
+
function concatBytes(left, right) {
|
|
7
|
+
const out = new Uint8Array(left.length + right.length);
|
|
8
|
+
out.set(left, 0);
|
|
9
|
+
out.set(right, left.length);
|
|
10
|
+
return out;
|
|
11
|
+
}
|
|
12
|
+
export function shieldedSyncHintFromViewingPublicKey(viewingPublicKey) {
|
|
13
|
+
const digest = sha3_256(concatBytes(SYNC_HINT_PREFIX, hexToBytes(viewingPublicKey)));
|
|
14
|
+
return `0x${bytesToHex(digest.slice(0, SYNC_HINT_BYTES))}`;
|
|
15
|
+
}
|
|
16
|
+
export function shieldedSyncHintFromViewingPrivateKey(viewingPrivateKey) {
|
|
17
|
+
return shieldedSyncHintFromViewingPublicKey(publicKeyFromPrivateKey(viewingPrivateKey));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=shielded.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shielded.js","sourceRoot":"","sources":["../src/shielded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,gBAAgB,GAAG,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,SAAS,WAAW,CAAC,IAAgB,EAAE,KAAiB;IACtD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,gBAAwB;IAExB,MAAM,MAAM,GAAG,QAAQ,CACrB,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAC5D,CAAC;IACF,OAAO,KAAK,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,iBAAyB;IAEzB,OAAO,oCAAoC,CACzC,uBAAuB,CAAC,iBAAiB,CAAC,CAC3C,CAAC;AACJ,CAAC"}
|