ysk-server-core 1.1.17 → 1.1.19

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 (59) hide show
  1. package/dist/hosting/validators/adapters/avax.d.ts +1 -0
  2. package/dist/hosting/validators/adapters/avax.d.ts.map +1 -1
  3. package/dist/hosting/validators/adapters/avax.js +22 -8
  4. package/dist/hosting/validators/adapters/avax.js.map +1 -1
  5. package/dist/hosting/validators/adapters/eth-clients.d.ts +2 -0
  6. package/dist/hosting/validators/adapters/eth-clients.d.ts.map +1 -1
  7. package/dist/hosting/validators/adapters/eth-clients.js +43 -11
  8. package/dist/hosting/validators/adapters/eth-clients.js.map +1 -1
  9. package/dist/hosting/validators/adapters/eth.d.ts.map +1 -1
  10. package/dist/hosting/validators/adapters/eth.js +5 -2
  11. package/dist/hosting/validators/adapters/eth.js.map +1 -1
  12. package/dist/hosting/validators/adapters/near.d.ts.map +1 -1
  13. package/dist/hosting/validators/adapters/near.js +11 -2
  14. package/dist/hosting/validators/adapters/near.js.map +1 -1
  15. package/dist/hosting/validators/adapters/p2p-public-ip.d.ts +6 -0
  16. package/dist/hosting/validators/adapters/p2p-public-ip.d.ts.map +1 -0
  17. package/dist/hosting/validators/adapters/p2p-public-ip.js +11 -0
  18. package/dist/hosting/validators/adapters/p2p-public-ip.js.map +1 -0
  19. package/dist/hosting/validators/adapters/phase2.d.ts +10 -0
  20. package/dist/hosting/validators/adapters/phase2.d.ts.map +1 -1
  21. package/dist/hosting/validators/adapters/phase2.js +126 -7
  22. package/dist/hosting/validators/adapters/phase2.js.map +1 -1
  23. package/dist/hosting/validators/compose-runner.d.ts +4 -0
  24. package/dist/hosting/validators/compose-runner.d.ts.map +1 -1
  25. package/dist/hosting/validators/compose-runner.js +32 -0
  26. package/dist/hosting/validators/compose-runner.js.map +1 -1
  27. package/dist/hosting/validators/disk.d.ts +2 -0
  28. package/dist/hosting/validators/disk.d.ts.map +1 -1
  29. package/dist/hosting/validators/disk.js +23 -0
  30. package/dist/hosting/validators/disk.js.map +1 -1
  31. package/dist/hosting/validators/extras.d.ts +33 -1
  32. package/dist/hosting/validators/extras.d.ts.map +1 -1
  33. package/dist/hosting/validators/extras.js +163 -2
  34. package/dist/hosting/validators/extras.js.map +1 -1
  35. package/dist/hosting/validators/manager.d.ts +10 -0
  36. package/dist/hosting/validators/manager.d.ts.map +1 -1
  37. package/dist/hosting/validators/manager.js +137 -8
  38. package/dist/hosting/validators/manager.js.map +1 -1
  39. package/dist/hosting/validators/ports.js +4 -4
  40. package/dist/hosting/validators/ports.js.map +1 -1
  41. package/dist/hosting/validators/registry.d.ts +7 -1
  42. package/dist/hosting/validators/registry.d.ts.map +1 -1
  43. package/dist/hosting/validators/registry.js +14 -3
  44. package/dist/hosting/validators/registry.js.map +1 -1
  45. package/dist/hosting/validators/releases.d.ts +56 -0
  46. package/dist/hosting/validators/releases.d.ts.map +1 -1
  47. package/dist/hosting/validators/releases.js +230 -21
  48. package/dist/hosting/validators/releases.js.map +1 -1
  49. package/dist/hosting/validators/runtime-status.js +2 -2
  50. package/dist/hosting/validators/runtime-status.js.map +1 -1
  51. package/dist/hosting/validators/software-catalog.d.ts +10 -1
  52. package/dist/hosting/validators/software-catalog.d.ts.map +1 -1
  53. package/dist/hosting/validators/software-catalog.js +84 -3
  54. package/dist/hosting/validators/software-catalog.js.map +1 -1
  55. package/dist/hosting/validators/upgrade.d.ts +18 -0
  56. package/dist/hosting/validators/upgrade.d.ts.map +1 -1
  57. package/dist/hosting/validators/upgrade.js +25 -4
  58. package/dist/hosting/validators/upgrade.js.map +1 -1
  59. package/package.json +2 -2
@@ -5,6 +5,7 @@
5
5
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
6
6
  import { join } from 'node:path';
7
7
  import { parseVersionParts, tagIsNewer } from './versions.js';
8
+ import { findValidatorClient } from './registry.js';
8
9
  export const CLIENT_RELEASES = {
9
10
  reth: {
10
11
  github: 'paradigmxyz/reth',
@@ -55,11 +56,11 @@ export const CLIENT_RELEASES = {
55
56
  github: 'cosmos/gaia',
56
57
  changelog: 'https://github.com/cosmos/gaia/releases',
57
58
  },
58
- sui: {
59
+ 'sui-node': {
59
60
  github: 'MystenLabs/sui',
60
61
  changelog: 'https://github.com/MystenLabs/sui/releases',
61
62
  },
62
- aptos: {
63
+ 'aptos-node': {
63
64
  github: 'aptos-labs/aptos-core',
64
65
  changelog: 'https://github.com/aptos-labs/aptos-core/releases',
65
66
  },
@@ -67,10 +68,19 @@ export const CLIENT_RELEASES = {
67
68
  github: 'anza-xyz/agave',
68
69
  changelog: 'https://github.com/anza-xyz/agave/releases',
69
70
  },
71
+ polkadot: {
72
+ github: 'paritytech/polkadot-sdk',
73
+ changelog: 'https://github.com/paritytech/polkadot-sdk/releases',
74
+ },
70
75
  };
76
+ const OFFICIAL_CACHE_TTL_MS = 15 * 60_000;
77
+ const OFFICIAL_LIST_CAP = 12;
71
78
  function cachePath(dataDir) {
72
79
  return join(dataDir, 'validators', 'remote-tags.json');
73
80
  }
81
+ function releasesCachePath(dataDir) {
82
+ return join(dataDir, 'validators', 'remote-releases.json');
83
+ }
74
84
  export function loadRemoteClientTags(dataDir) {
75
85
  const p = cachePath(dataDir);
76
86
  if (!existsSync(p))
@@ -87,6 +97,214 @@ export function saveRemoteClientTags(dataDir, cache) {
87
97
  mkdirSync(join(dataDir, 'validators'), { recursive: true });
88
98
  writeFileSync(cachePath(dataDir), `${JSON.stringify(cache, null, 2)}\n`);
89
99
  }
100
+ export function loadRemoteReleases(dataDir) {
101
+ const p = releasesCachePath(dataDir);
102
+ if (!existsSync(p))
103
+ return { at: '', clients: {} };
104
+ try {
105
+ const raw = JSON.parse(readFileSync(p, 'utf8'));
106
+ const clients = raw.clients && typeof raw.clients === 'object' ? raw.clients : {};
107
+ return { at: String(raw.at ?? ''), clients };
108
+ }
109
+ catch {
110
+ return { at: '', clients: {} };
111
+ }
112
+ }
113
+ export function saveRemoteReleases(dataDir, cache) {
114
+ mkdirSync(join(dataDir, 'validators'), { recursive: true });
115
+ writeFileSync(releasesCachePath(dataDir), `${JSON.stringify(cache, null, 2)}\n`);
116
+ }
117
+ export function dockerRegistryHost(image) {
118
+ const first = String(image ?? '').trim().split('/')[0] ?? '';
119
+ if (first.includes('.') || first.includes(':'))
120
+ return first;
121
+ return 'docker.io';
122
+ }
123
+ /** Map an official GitHub tag onto the Docker tag we can pull. Null = do not offer. */
124
+ export function dockerTagFromGit(clientId, gitTag, network) {
125
+ const meta = CLIENT_RELEASES[clientId];
126
+ if (!meta)
127
+ return null;
128
+ const raw = String(gitTag ?? '').trim();
129
+ if (!raw || raw === 'latest' || /nightly/i.test(raw))
130
+ return null;
131
+ if (clientId === 'sui-node') {
132
+ if (/^testnet-v\d/.test(raw)) {
133
+ if (network && network !== 'testnet')
134
+ return null;
135
+ return raw;
136
+ }
137
+ if (/^mainnet-v\d/.test(raw)) {
138
+ if (network && network !== 'mainnet')
139
+ return null;
140
+ return raw;
141
+ }
142
+ const core = normalizeGithubTag(raw);
143
+ if (!core)
144
+ return null;
145
+ const v = core.startsWith('v') ? core : `v${core}`;
146
+ if (network === 'mainnet')
147
+ return `mainnet-${v}`;
148
+ if (network === 'testnet')
149
+ return `testnet-${v}`;
150
+ return null;
151
+ }
152
+ if (clientId === 'aptos-node') {
153
+ if (/^aptos-node-v\d/.test(raw))
154
+ return raw;
155
+ const core = normalizeGithubTag(raw);
156
+ if (!core)
157
+ return null;
158
+ const v = core.startsWith('v') ? core : `v${core}`;
159
+ return `aptos-node-${v}`;
160
+ }
161
+ if (clientId === 'polkadot') {
162
+ return normalizeGithubTag(raw);
163
+ }
164
+ return normalizeGithubTag(raw, meta.tagPrefix);
165
+ }
166
+ export function mergeOfficialVersions(input) {
167
+ const byTag = new Map();
168
+ const pin = String(input.pin ?? '').trim();
169
+ if (pin) {
170
+ byTag.set(pin, {
171
+ gitTag: pin,
172
+ dockerTag: pin,
173
+ prerelease: /rc|alpha|beta|preview/i.test(pin),
174
+ htmlUrl: input.pinHtmlUrl ?? '',
175
+ });
176
+ }
177
+ for (const extra of input.extraTags ?? []) {
178
+ const t = String(extra ?? '').trim();
179
+ if (!t || byTag.has(t))
180
+ continue;
181
+ byTag.set(t, {
182
+ gitTag: t,
183
+ dockerTag: t,
184
+ prerelease: /rc|alpha|beta|preview/i.test(t),
185
+ htmlUrl: '',
186
+ });
187
+ }
188
+ let fetched = 0;
189
+ for (const item of input.fetched) {
190
+ if (!item.dockerTag || byTag.has(item.dockerTag))
191
+ continue;
192
+ if (fetched >= OFFICIAL_LIST_CAP)
193
+ break;
194
+ byTag.set(item.dockerTag, item);
195
+ fetched += 1;
196
+ }
197
+ return [...byTag.values()];
198
+ }
199
+ export async function fetchGithubReleaseList(repo, fetchFn = fetch) {
200
+ const url = `https://api.github.com/repos/${repo}/releases?per_page=30`;
201
+ const res = await fetchFn(url, {
202
+ headers: {
203
+ Accept: 'application/vnd.github+json',
204
+ 'User-Agent': 'ysk-server-validators',
205
+ },
206
+ });
207
+ if (!res.ok)
208
+ return [];
209
+ const body = (await res.json());
210
+ return Array.isArray(body) ? body : [];
211
+ }
212
+ function parseFetchedVersions(clientId, rows, network) {
213
+ const out = [];
214
+ const seen = new Set();
215
+ for (const row of rows) {
216
+ if (row.draft)
217
+ continue;
218
+ const gitTag = String(row.tag_name ?? '').trim();
219
+ const dockerTag = dockerTagFromGit(clientId, gitTag, network);
220
+ if (!dockerTag || seen.has(dockerTag))
221
+ continue;
222
+ seen.add(dockerTag);
223
+ out.push({
224
+ gitTag,
225
+ dockerTag,
226
+ prerelease: row.prerelease === true,
227
+ htmlUrl: String(row.html_url ?? ''),
228
+ });
229
+ }
230
+ return out;
231
+ }
232
+ export async function refreshOfficialReleases(input) {
233
+ const prev = loadRemoteReleases(input.dataDir);
234
+ const age = prev.at ? Date.now() - Date.parse(prev.at) : Number.POSITIVE_INFINITY;
235
+ const ids = input.clientIds?.length ? input.clientIds : Object.keys(CLIENT_RELEASES);
236
+ if (!input.force && Number.isFinite(age) && age >= 0 && age < OFFICIAL_CACHE_TTL_MS) {
237
+ return prev;
238
+ }
239
+ const fetchFn = input.fetchFn ?? fetch;
240
+ const clients = { ...prev.clients };
241
+ const notesAt = new Date().toISOString();
242
+ for (const id of ids) {
243
+ const meta = CLIENT_RELEASES[id];
244
+ if (!meta)
245
+ continue;
246
+ try {
247
+ const rows = await fetchGithubReleaseList(meta.github, fetchFn);
248
+ const items = parseFetchedVersions(id, rows);
249
+ clients[id] = { at: notesAt, items };
250
+ }
251
+ catch (e) {
252
+ const prevClient = clients[id];
253
+ clients[id] = {
254
+ at: prevClient?.at ?? notesAt,
255
+ items: prevClient?.items ?? [],
256
+ error: e instanceof Error ? e.message : 'fetch failed',
257
+ };
258
+ }
259
+ }
260
+ const cache = { at: notesAt, clients };
261
+ saveRemoteReleases(input.dataDir, cache);
262
+ const tags = {};
263
+ const tagNotes = [];
264
+ for (const [id, row] of Object.entries(clients)) {
265
+ const newest = row.items[0]?.dockerTag;
266
+ if (newest)
267
+ tags[id] = newest;
268
+ else if (row.error)
269
+ tagNotes.push(`${id}: ${row.error}`);
270
+ }
271
+ saveRemoteClientTags(input.dataDir, { at: notesAt, tags, notes: tagNotes });
272
+ return cache;
273
+ }
274
+ export function listOfficialClientVersions(input) {
275
+ const clientId = String(input.clientId ?? '').trim();
276
+ const cat = findValidatorClient(clientId);
277
+ const meta = CLIENT_RELEASES[clientId];
278
+ const pin = cat?.tag ?? '';
279
+ const image = cat?.image ?? '';
280
+ const cache = loadRemoteReleases(input.dataDir);
281
+ const row = cache.clients[clientId];
282
+ let fetched = row?.items ?? [];
283
+ if (input.network) {
284
+ fetched = fetched.filter((item) => dockerTagFromGit(clientId, item.gitTag, input.network));
285
+ }
286
+ const versions = mergeOfficialVersions({
287
+ pin,
288
+ extraTags: input.extraTags,
289
+ fetched,
290
+ pinHtmlUrl: meta ? `https://github.com/${meta.github}/releases/tag/${pin}` : '',
291
+ });
292
+ return {
293
+ clientId,
294
+ image,
295
+ pin,
296
+ github: meta?.github ?? null,
297
+ changelogUrl: meta?.changelog ?? null,
298
+ registryHost: dockerRegistryHost(image),
299
+ at: row?.at ?? (cache.at || null),
300
+ error: row?.error ?? null,
301
+ versions,
302
+ };
303
+ }
304
+ export function allowedDockerTagsForClient(input) {
305
+ const listed = listOfficialClientVersions(input);
306
+ return new Set(listed.versions.map((v) => v.dockerTag));
307
+ }
90
308
  export function normalizeGithubTag(raw, prefix) {
91
309
  const t = String(raw ?? '').trim();
92
310
  if (!t)
@@ -123,25 +341,16 @@ export async function fetchGithubReleaseTag(repo, fetchFn = fetch) {
123
341
  return String(body.tag_name ?? '').trim() || null;
124
342
  }
125
343
  export async function refreshRemoteClientTags(input) {
126
- const fetchFn = input.fetchFn ?? fetch;
127
- const tags = {};
128
- const notes = [];
129
- for (const [id, meta] of Object.entries(CLIENT_RELEASES)) {
130
- try {
131
- const raw = await fetchGithubReleaseTag(meta.github, fetchFn);
132
- const norm = raw ? normalizeGithubTag(raw, meta.tagPrefix) : null;
133
- if (norm)
134
- tags[id] = norm;
135
- else
136
- notes.push(`${id}: no tag`);
137
- }
138
- catch (e) {
139
- notes.push(`${id}: ${e instanceof Error ? e.message : 'fetch failed'}`);
140
- }
141
- }
142
- const cache = { at: new Date().toISOString(), tags, notes };
143
- saveRemoteClientTags(input.dataDir, cache);
144
- return cache;
344
+ const official = await refreshOfficialReleases({
345
+ dataDir: input.dataDir,
346
+ fetchFn: input.fetchFn,
347
+ force: true,
348
+ });
349
+ const tags = loadRemoteClientTags(input.dataDir);
350
+ const notes = Object.entries(official.clients)
351
+ .filter(([, row]) => row.error)
352
+ .map(([id, row]) => `${id}: ${row.error}`);
353
+ return { at: official.at, tags, notes };
145
354
  }
146
355
  export function changelogForClient(clientId) {
147
356
  return CLIENT_RELEASES[clientId]?.changelog;
@@ -1 +1 @@
1
- {"version":3,"file":"releases.js","sourceRoot":"","sources":["../../../src/hosting/validators/releases.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"releases.js","sourceRoot":"","sources":["../../../src/hosting/validators/releases.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const FATAL_CONTAINER_RE = /permission denied|unexpected token|executable file not found|pull access denied|no such file|cannot allocate|fatal|error: command line|address already in use|failed to bind|not found/i;
1
+ const FATAL_CONTAINER_RE = /permission denied|unexpected token|executable file not found|pull access denied|no such file|cannot allocate|fatal|error: command line|address already in use|failed to bind|not found|dns error|no address associated with hostname|temporary failure in name resolution|initgenesis|nil pointer|invalid memory address|invalidssz|checkpoint state|failed to start beacon node|failed to connect to bootstrap|not connected to a minimum of 1 peer|not connected to enough stake/i;
2
2
  const OOM_RE = /\bkilled\b|out of memory|\booms?k?ill|cannot allocate memory|exit \(137\)/i;
3
3
  const NOFILE_RE = /too many open files|ensure_max_open_files_limit|RLIMIT_NOFILE/i;
4
4
  /** First compose-log line that explains why a node is not healthy. */
@@ -26,7 +26,7 @@ export function isTransientValidatorProbeError(err) {
26
26
  const s = String(err || '').trim();
27
27
  if (!s)
28
28
  return false;
29
- return /rpc unreachable|unhealthy|econnrefused|econnreset|fetch failed|failed to fetch|networkerror|bad rpc|bad status|metrics unreachable|not ready|connection refused|socket hang up|timed? ?out|aborted|eai_again|unexpected end of json|unexpected token.*json|not valid json|unauthorized|forbidden|\b401\b|\b403\b|rpc auth|empty (rpc )?body/i.test(s);
29
+ return /rpc unreachable|unhealthy|econnrefused|econnreset|fetch failed|failed to fetch|networkerror|bad rpc|bad status|metrics unreachable|not ready|connection refused|socket hang up|timed? ?out|aborted|eai_again|unexpected end of json|unexpected token.*json|not valid json|unauthorized|forbidden|\b401\b|\b403\b|rpc auth|empty (rpc )?body|0 peers|not connected to a minimum of 1 peer|failed to connect to bootstrap/i.test(s);
30
30
  }
31
31
  export function deriveValidatorRuntimeStatus(input) {
32
32
  if (input.restarting)
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-status.js","sourceRoot":"","sources":["../../../src/hosting/validators/runtime-status.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GACtB,yLAAyL,CAAC;AAE5L,MAAM,MAAM,GAAG,4EAA4E,CAAC;AAC5F,MAAM,SAAS,GAAG,gEAAgE,CAAC;AAEnF,sEAAsE;AACtE,MAAM,UAAU,0BAA0B,CAAC,KAAe;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAA8B;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA8B;IAClE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAA8B;IAC3E,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,8UAA8U,CAAC,IAAI,CACxV,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAO5C;IACC,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,8BAA8B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAChF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"runtime-status.js","sourceRoot":"","sources":["../../../src/hosting/validators/runtime-status.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GACtB,qdAAqd,CAAC;AAExd,MAAM,MAAM,GAAG,4EAA4E,CAAC;AAC5F,MAAM,SAAS,GAAG,gEAAgE,CAAC;AAEnF,sEAAsE;AACtE,MAAM,UAAU,0BAA0B,CAAC,KAAe;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAA8B;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA8B;IAClE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAA8B;IAC3E,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,0ZAA0Z,CAAC,IAAI,CACpa,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAO5C;IACC,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,8BAA8B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAChF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Pinned validator client images — catalog + local presence.
3
- * Pull is allowlisted to registry pins only (not a general Docker Hub).
3
+ * Pull is allowlisted to registry pins plus cached official tags.
4
4
  */
5
5
  import { type ValidatorSoftwareImageDto, type ValidatorSoftwareReportDto } from 'ysk-server-shared';
6
6
  import type { HostExecutor } from '../../host/executor.js';
@@ -13,6 +13,15 @@ export declare function parseValidatorImageRef(raw: string): {
13
13
  export declare function pinnedValidatorImageRefs(): Set<string>;
14
14
  export declare function isPinnedValidatorImage(ref: string): boolean;
15
15
  export declare function listPinnedValidatorImages(): ValidatorSoftwareImageDto[];
16
+ /** Pin ∪ cached official Docker tags for the same image repository. */
17
+ export declare function isAllowedValidatorImage(ref: string, dataDir?: string): boolean;
18
+ export declare function isAllowedClientTag(input: {
19
+ clientId: string;
20
+ tag: string;
21
+ dataDir: string;
22
+ extraTags?: string[];
23
+ network?: string;
24
+ }): boolean;
16
25
  export declare function collectValidatorSoftware(input: {
17
26
  host: HostExecutor;
18
27
  dataDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"software-catalog.d.ts","sourceRoot":"","sources":["../../../src/hosting/validators/software-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIlE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQzF;AAED,wBAAgB,wBAAwB,IAAI,GAAG,CAAC,MAAM,CAAC,CAStD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED,wBAAgB,yBAAyB,IAAI,yBAAyB,EAAE,CAiBvE;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAiDtC;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,kDAuBnD"}
1
+ {"version":3,"file":"software-catalog.d.ts","sourceRoot":"","sources":["../../../src/hosting/validators/software-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAWlE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQzF;AAED,wBAAgB,wBAAwB,IAAI,GAAG,CAAC,MAAM,CAAC,CAStD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAI3D;AAgBD,wBAAgB,yBAAyB,IAAI,yBAAyB,EAAE,CAkBvE;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAa9E;AAWD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAaV;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAuEtC;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,kDAuBnD"}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Pinned validator client images — catalog + local presence.
3
- * Pull is allowlisted to registry pins only (not a general Docker Hub).
3
+ * Pull is allowlisted to registry pins plus cached official tags.
4
4
  */
5
5
  import { tl, } from 'ysk-server-shared';
6
6
  import { listDockerImages, probeDockerEngine } from '../docker/manager.js';
7
7
  import { dockerPull } from '../docker/manager.js';
8
- import { listValidatorChains, suiNodeImagePins } from './registry.js';
8
+ import { findValidatorClient, listValidatorChains, suiNodeImagePins } from './registry.js';
9
+ import { allowedDockerTagsForClient, CLIENT_RELEASES, dockerRegistryHost, listOfficialClientVersions, loadRemoteReleases, } from './releases.js';
9
10
  import { listValidatorInstances } from './store.js';
10
11
  export function validatorImageRef(image, tag) {
11
12
  return `${String(image).trim()}:${String(tag).trim()}`;
@@ -38,6 +39,19 @@ export function isPinnedValidatorImage(ref) {
38
39
  return false;
39
40
  return pinnedValidatorImageRefs().has(validatorImageRef(parsed.image, parsed.tag));
40
41
  }
42
+ function emptySource(clientId, image) {
43
+ const meta = CLIENT_RELEASES[clientId];
44
+ return {
45
+ registryHost: dockerRegistryHost(image),
46
+ sourceGithub: meta?.github ?? null,
47
+ changelogUrl: meta?.changelog ?? null,
48
+ officialTag: null,
49
+ officialDockerTag: null,
50
+ officialAt: null,
51
+ officialError: null,
52
+ staleInstances: [],
53
+ };
54
+ }
41
55
  export function listPinnedValidatorImages() {
42
56
  return listValidatorChains().flatMap((chain) => chain.clients.map((client) => {
43
57
  const ref = validatorImageRef(client.image, client.tag);
@@ -51,9 +65,56 @@ export function listPinnedValidatorImages() {
51
65
  present: null,
52
66
  size: null,
53
67
  usedBy: [],
68
+ ...emptySource(client.id, client.image),
54
69
  };
55
70
  }));
56
71
  }
72
+ /** Pin ∪ cached official Docker tags for the same image repository. */
73
+ export function isAllowedValidatorImage(ref, dataDir) {
74
+ const parsed = parseValidatorImageRef(ref);
75
+ if (!parsed)
76
+ return false;
77
+ if (parsed.tag === 'latest' || /nightly/i.test(parsed.tag))
78
+ return false;
79
+ if (isPinnedValidatorImage(ref))
80
+ return true;
81
+ if (!dataDir)
82
+ return false;
83
+ const catalog = findValidatorClientByImage(parsed.image);
84
+ if (!catalog)
85
+ return false;
86
+ const allowed = allowedDockerTagsForClient({
87
+ clientId: catalog.clientId,
88
+ dataDir,
89
+ });
90
+ return allowed.has(parsed.tag);
91
+ }
92
+ function findValidatorClientByImage(image) {
93
+ const img = String(image ?? '').trim();
94
+ for (const chain of listValidatorChains()) {
95
+ const c = chain.clients.find((x) => x.image === img);
96
+ if (c)
97
+ return { clientId: c.id };
98
+ }
99
+ return null;
100
+ }
101
+ export function isAllowedClientTag(input) {
102
+ const tag = String(input.tag ?? '').trim();
103
+ if (!tag || tag === 'latest' || /nightly/i.test(tag))
104
+ return false;
105
+ const cat = findValidatorClient(input.clientId);
106
+ if (!cat)
107
+ return false;
108
+ if (tag === cat.tag)
109
+ return true;
110
+ const listed = listOfficialClientVersions({
111
+ clientId: input.clientId,
112
+ dataDir: input.dataDir,
113
+ network: input.network,
114
+ extraTags: input.extraTags,
115
+ });
116
+ return listed.versions.some((v) => v.dockerTag === tag);
117
+ }
57
118
  export async function collectValidatorSoftware(input) {
58
119
  const probe = await probeDockerEngine(input.host);
59
120
  const pins = listPinnedValidatorImages();
@@ -81,13 +142,32 @@ export async function collectValidatorSoftware(input) {
81
142
  }
82
143
  }
83
144
  const dockerKnown = probe.installed && probe.daemonActive;
145
+ const official = loadRemoteReleases(input.dataDir);
84
146
  const images = pins.map((pin) => {
85
147
  const hit = local.get(pin.ref);
148
+ const listed = listOfficialClientVersions({
149
+ clientId: pin.clientId,
150
+ dataDir: input.dataDir,
151
+ });
152
+ const newest = official.clients[pin.clientId]?.items[0];
153
+ const staleInstances = instances
154
+ .flatMap((inst) => Object.values(inst.clients ?? {})
155
+ .filter((c) => c.id === pin.clientId && c.tag !== pin.tag)
156
+ .map((c) => ({ id: inst.id, tag: c.tag })))
157
+ .filter((row, i, all) => all.findIndex((x) => x.id === row.id && x.tag === row.tag) === i);
86
158
  return {
87
159
  ...pin,
88
160
  present: dockerKnown ? Boolean(hit) : null,
89
161
  size: hit?.size ?? null,
90
162
  usedBy: usedBy.get(pin.ref) ?? [],
163
+ registryHost: listed.registryHost,
164
+ sourceGithub: listed.github,
165
+ changelogUrl: listed.changelogUrl,
166
+ officialTag: newest?.gitTag ?? null,
167
+ officialDockerTag: newest?.dockerTag ?? null,
168
+ officialAt: listed.at,
169
+ officialError: listed.error,
170
+ staleInstances,
91
171
  };
92
172
  });
93
173
  return {
@@ -97,6 +177,7 @@ export async function collectValidatorSoftware(input) {
97
177
  dockerVersion: probe.version,
98
178
  composeVersion: probe.composeVersion,
99
179
  images,
180
+ officialAt: official.at || null,
100
181
  executeEnabled: input.host.executeEnabled(),
101
182
  isRoot: input.host.isRoot(),
102
183
  };
@@ -105,7 +186,7 @@ export async function pullPinnedValidatorImage(input) {
105
186
  const raw = input.tag
106
187
  ? validatorImageRef(input.image, input.tag)
107
188
  : String(input.image ?? '').trim();
108
- if (!isPinnedValidatorImage(raw)) {
189
+ if (!isAllowedValidatorImage(raw, input.dataDir) && !isPinnedValidatorImage(raw)) {
109
190
  return {
110
191
  ok: false,
111
192
  blocked: true,
@@ -1 +1 @@
1
- {"version":3,"file":"software-catalog.js","sourceRoot":"","sources":["../../../src/hosting/validators/software-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"software-catalog.js","sourceRoot":"","sources":["../../../src/hosting/validators/software-catalog.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,24 @@ export declare function scanValidatorUpgrades(dataDir: string, remoteTags?: Reco
11
11
  export declare function saveUpgradeScan(dataDir: string, offers: StoredUpgradeOffer[]): void;
12
12
  export declare function loadUpgradeScan(dataDir: string): StoredUpgradeOffer[];
13
13
  export declare function shouldAutoApply(policy: ValidatorUpgradePolicy, offer: ValidatorUpgradeOffer, networkKind: 'testnet' | 'mainnet'): boolean;
14
+ export declare function applyValidatorClientTag(input: {
15
+ dataDir: string;
16
+ host: HostExecutor;
17
+ spec: ValidatorInstanceDto;
18
+ clientId: string;
19
+ nextTag: string;
20
+ execute: boolean;
21
+ health?: (spec: ValidatorInstanceDto) => Promise<boolean>;
22
+ healthTimeoutMs?: number;
23
+ sleep?: (ms: number) => Promise<void>;
24
+ onLog?: OpsLogFn;
25
+ signal?: AbortSignal;
26
+ }): Promise<{
27
+ ok: boolean;
28
+ rolledBack: boolean;
29
+ notes: string[];
30
+ spec: ValidatorInstanceDto;
31
+ }>;
14
32
  export declare function applyValidatorUpgrade(input: {
15
33
  dataDir: string;
16
34
  host: HostExecutor;
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/hosting/validators/upgrade.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAWtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAQhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7E,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,oBAAoB,EAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,qBAAqB,GAAG,IAAI,CAuB9B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,kBAAkB,EAAE,CAQtB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAMnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CASrE;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,qBAAqB,EAC5B,WAAW,EAAE,SAAS,GAAG,SAAS,GACjC,OAAO,CAKT;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC,CAkGD;AA2DD,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyBhC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,GAAG,SAAS,CAEhF"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/hosting/validators/upgrade.ts"],"names":[],"mappings":"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"}
@@ -70,10 +70,21 @@ export function shouldAutoApply(policy, offer, networkKind) {
70
70
  return !offer.breaking;
71
71
  return false;
72
72
  }
73
- export async function applyValidatorUpgrade(input) {
74
- const offer = detectUpgradeForInstance(input.spec, loadRemoteClientTags(input.dataDir));
75
- if (!offer)
76
- return { ok: true, rolledBack: false, notes: ['no upgrade'], spec: input.spec };
73
+ export async function applyValidatorClientTag(input) {
74
+ const have = Object.values(input.spec.clients).find((c) => c.id === input.clientId);
75
+ if (!have) {
76
+ return { ok: false, rolledBack: false, notes: ['client not on instance'], spec: input.spec };
77
+ }
78
+ if (have.tag === input.nextTag) {
79
+ return { ok: true, rolledBack: false, notes: ['already on tag'], spec: input.spec };
80
+ }
81
+ const offer = {
82
+ clientId: input.clientId,
83
+ currentTag: have.tag,
84
+ nextTag: input.nextTag,
85
+ breaking: tagIsBreaking(have.tag, input.nextTag),
86
+ changelogUrl: changelogForClient(input.clientId),
87
+ };
77
88
  const prev = input.spec;
78
89
  const nextClients = { ...input.spec.clients };
79
90
  for (const [k, c] of Object.entries(nextClients)) {
@@ -215,6 +226,16 @@ async function rollbackUpgrade(input) {
215
226
  spec: restored,
216
227
  };
217
228
  }
229
+ export async function applyValidatorUpgrade(input) {
230
+ const offer = detectUpgradeForInstance(input.spec, loadRemoteClientTags(input.dataDir));
231
+ if (!offer)
232
+ return { ok: true, rolledBack: false, notes: ['no upgrade'], spec: input.spec };
233
+ return applyValidatorClientTag({
234
+ ...input,
235
+ clientId: offer.clientId,
236
+ nextTag: offer.nextTag,
237
+ });
238
+ }
218
239
  export async function runValidatorUpgradeScan(input) {
219
240
  try {
220
241
  await refreshRemoteClientTags({ dataDir: input.dataDir });