@typeberry/jam 0.1.1 → 0.1.2-3178190

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/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  import './sourcemap-register.cjs';import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module";
2
3
  import * as __WEBPACK_EXTERNAL_MODULE_lmdb__ from "lmdb";
3
4
  /******/ var __webpack_modules__ = ({
@@ -28243,6 +28244,7 @@ var GpVersion;
28243
28244
  GpVersion["V0_6_7"] = "0.6.7";
28244
28245
  GpVersion["V0_7_0"] = "0.7.0";
28245
28246
  GpVersion["V0_7_1"] = "0.7.1-preview";
28247
+ GpVersion["V0_7_2"] = "0.7.2-preview";
28246
28248
  })(GpVersion || (GpVersion = {}));
28247
28249
  var TestSuite;
28248
28250
  (function (TestSuite) {
@@ -28250,7 +28252,7 @@ var TestSuite;
28250
28252
  TestSuite["JAMDUNA"] = "jamduna";
28251
28253
  })(TestSuite || (TestSuite = {}));
28252
28254
  const DEFAULT_SUITE = TestSuite.W3F_DAVXY;
28253
- const ALL_VERSIONS_IN_ORDER = [GpVersion.V0_6_7, GpVersion.V0_7_0, GpVersion.V0_7_1];
28255
+ const ALL_VERSIONS_IN_ORDER = [GpVersion.V0_6_7, GpVersion.V0_7_0, GpVersion.V0_7_1, GpVersion.V0_7_2];
28254
28256
  const env = typeof process === "undefined" ? {} : process.env;
28255
28257
  const DEFAULT_VERSION = GpVersion.V0_7_0;
28256
28258
  let CURRENT_VERSION = parseCurrentVersion(env.GP_VERSION) ?? DEFAULT_VERSION;
@@ -28259,20 +28261,26 @@ function parseCurrentVersion(env) {
28259
28261
  if (env === undefined) {
28260
28262
  return undefined;
28261
28263
  }
28262
- const version = env;
28263
- if (!Object.values(GpVersion).includes(version)) {
28264
- throw new Error(`Configured environment variable GP_VERSION is unknown: '${env}'. Use one of: ${ALL_VERSIONS_IN_ORDER}`);
28264
+ switch (env) {
28265
+ case GpVersion.V0_6_7:
28266
+ case GpVersion.V0_7_0:
28267
+ case GpVersion.V0_7_1:
28268
+ case GpVersion.V0_7_2:
28269
+ return env;
28270
+ default:
28271
+ throw new Error(`Configured environment variable GP_VERSION is unknown: '${env}'. Use one of: ${ALL_VERSIONS_IN_ORDER}`);
28265
28272
  }
28266
- return version;
28267
28273
  }
28268
28274
  function parseCurrentSuite(env) {
28269
28275
  if (env === undefined)
28270
28276
  return undefined;
28271
- const val = env;
28272
- if (!Object.values(TestSuite).includes(val)) {
28273
- throw new Error(`Configured environment variable TEST_SUITE is unknown: '${env}'. Use one of: ${Object.values(TestSuite)}`);
28277
+ switch (env) {
28278
+ case TestSuite.W3F_DAVXY:
28279
+ case TestSuite.JAMDUNA:
28280
+ return env;
28281
+ default:
28282
+ throw new Error(`Configured environment variable TEST_SUITE is unknown: '${env}'. Use one of: ${Object.values(TestSuite)}`);
28274
28283
  }
28275
- return val;
28276
28284
  }
28277
28285
  class Compatibility {
28278
28286
  static override(version) {
@@ -28434,6 +28442,34 @@ class WithDebug {
28434
28442
  }
28435
28443
  }
28436
28444
 
28445
+ ;// CONCATENATED MODULE: ./packages/core/utils/dev.ts
28446
+ const dev_env = typeof process === "undefined" ? {} : process.env;
28447
+ /**
28448
+ * The function will produce relative path resolver that is adjusted
28449
+ * for package location within the workspace.
28450
+ *
28451
+ * Example:
28452
+ * $ npm start -w @typeberry/jam
28453
+ *
28454
+ * The above command will run `./bin/jam/index.js`, however we would
28455
+ * still want relative paths to be resolved according to top-level workspace
28456
+ * directory.
28457
+ *
28458
+ * So the caller, passes the absolute workspace path as argument and get's
28459
+ * a function that can properly resolve relative paths.
28460
+ *
28461
+ * NOTE: the translation happens only for development build! When
28462
+ * we build a single library from our project, we no longer mangle the paths.
28463
+ */
28464
+ const workspacePathFix = dev_env.NODE_ENV === "development"
28465
+ ? (workspacePath) => (p) => {
28466
+ if (p.startsWith("/")) {
28467
+ return p;
28468
+ }
28469
+ return `${workspacePath}/${p}`;
28470
+ }
28471
+ : () => (p) => p;
28472
+
28437
28473
  ;// CONCATENATED MODULE: ./packages/core/utils/opaque.ts
28438
28474
  /**
28439
28475
  * @fileoverview `Opaque<Type, Token>` constructs a unique type which is a subset of Type with a
@@ -28777,6 +28813,7 @@ function isResult(x) {
28777
28813
 
28778
28814
 
28779
28815
 
28816
+
28780
28817
  ;// CONCATENATED MODULE: ./packages/core/bytes/bitvec.ts
28781
28818
 
28782
28819
  /**
@@ -35148,6 +35185,23 @@ function parseLevel(lvl) {
35148
35185
  ;// CONCATENATED MODULE: ./packages/core/logger/console.ts
35149
35186
  // biome-ignore-all lint/suspicious/noConsole: logger
35150
35187
 
35188
+ function print(level, levelAndName, strings, data) {
35189
+ if (level < levelAndName[0]) {
35190
+ return;
35191
+ }
35192
+ const lvlText = Level[level].padEnd(5);
35193
+ const val = strings.map((v, idx) => `${v}${idx < data.length ? data[idx] : ""}`);
35194
+ const msg = `${lvlText} [${levelAndName[1]}] ${val.join("")}`;
35195
+ if (level === Level.WARN) {
35196
+ console.warn(msg);
35197
+ }
35198
+ else if (level === Level.ERROR) {
35199
+ console.error(msg);
35200
+ }
35201
+ else {
35202
+ console.info(msg);
35203
+ }
35204
+ }
35151
35205
  /** An optimized logger that ignores `TRACE`, `DEBUG` and `LOG` messages.
35152
35206
  *
35153
35207
  * Use the `create` method to instantiate the right instance of a more specialized logger.
@@ -35178,109 +35232,91 @@ class ConsoleTransport {
35178
35232
  constructor(options) {
35179
35233
  this.options = options;
35180
35234
  }
35181
- insane(_moduleName, _val) {
35235
+ insane(_levelAndName, _strings, _data) {
35182
35236
  /* no-op */
35183
35237
  }
35184
- trace(_moduleName, _val) {
35238
+ trace(_levelAndName, _strings, _data) {
35185
35239
  /* no-op */
35186
35240
  }
35187
- log(_moduleName, _val) {
35241
+ log(_levelAndName, _strings, _data) {
35188
35242
  /* no-op */
35189
35243
  }
35190
- info(_moduleName, _val) {
35244
+ info(_levelAndName, _strings, _data) {
35191
35245
  /* no-op */
35192
35246
  }
35193
- warn(moduleName, val) {
35194
- this.push(Level.WARN, moduleName, val);
35247
+ warn(levelAndName, strings, data) {
35248
+ print(Level.WARN, levelAndName, strings, data);
35195
35249
  }
35196
- error(moduleName, val) {
35197
- this.push(Level.ERROR, moduleName, val);
35198
- }
35199
- push(level, moduleName, val) {
35200
- const shortModule = moduleName.replace(this.options.workingDir, "");
35201
- const configuredLevel = findLevel(this.options, moduleName);
35202
- const lvlText = Level[level].padEnd(5);
35203
- if (level < configuredLevel) {
35204
- return;
35205
- }
35206
- const msg = `${lvlText} [${shortModule}] ${val}`;
35207
- if (level === Level.WARN) {
35208
- console.warn(msg);
35209
- }
35210
- else if (level === Level.ERROR) {
35211
- console.error(msg);
35212
- }
35213
- else {
35214
- console.info(msg);
35215
- }
35250
+ error(levelAndName, strings, data) {
35251
+ print(Level.ERROR, levelAndName, strings, data);
35216
35252
  }
35217
35253
  }
35218
35254
  /**
35219
35255
  * Insane version of console logger - supports insane level.
35220
35256
  */
35221
35257
  class InsaneConsoleLogger extends ConsoleTransport {
35222
- insane(moduleName, val) {
35223
- this.push(Level.INSANE, moduleName, val);
35258
+ insane(levelAndName, strings, data) {
35259
+ print(Level.INSANE, levelAndName, strings, data);
35224
35260
  }
35225
- trace(moduleName, val) {
35226
- this.push(Level.TRACE, moduleName, val);
35261
+ trace(levelAndName, strings, data) {
35262
+ print(Level.TRACE, levelAndName, strings, data);
35227
35263
  }
35228
- log(moduleName, val) {
35229
- this.push(Level.LOG, moduleName, val);
35264
+ log(levelAndName, strings, data) {
35265
+ print(Level.LOG, levelAndName, strings, data);
35230
35266
  }
35231
- info(moduleName, val) {
35232
- this.push(Level.INFO, moduleName, val);
35267
+ info(levelAndName, strings, data) {
35268
+ print(Level.INFO, levelAndName, strings, data);
35233
35269
  }
35234
35270
  }
35235
35271
  /**
35236
35272
  * A basic version of console logger - printing everything.
35237
35273
  */
35238
35274
  class TraceConsoleTransport extends ConsoleTransport {
35239
- insane(_moduleName, _val) {
35275
+ insane(_levelAndName, _strings, _data) {
35240
35276
  /* no-op */
35241
35277
  }
35242
- trace(moduleName, val) {
35243
- this.push(Level.TRACE, moduleName, val);
35278
+ trace(levelAndName, strings, data) {
35279
+ print(Level.TRACE, levelAndName, strings, data);
35244
35280
  }
35245
- log(moduleName, val) {
35246
- this.push(Level.LOG, moduleName, val);
35281
+ log(levelAndName, strings, data) {
35282
+ print(Level.LOG, levelAndName, strings, data);
35247
35283
  }
35248
- info(moduleName, val) {
35249
- this.push(Level.INFO, moduleName, val);
35284
+ info(levelAndName, strings, data) {
35285
+ print(Level.INFO, levelAndName, strings, data);
35250
35286
  }
35251
35287
  }
35252
35288
  /**
35253
35289
  * An optimized version of the logger - completely ignores `TRACE` level calls.
35254
35290
  */
35255
35291
  class LogConsoleTransport extends ConsoleTransport {
35256
- insane(_moduleName, _val) {
35292
+ insane(_levelAndName, _strings, _data) {
35257
35293
  /* no-op */
35258
35294
  }
35259
- trace(_moduleName, _val) {
35295
+ trace(_levelAndName, _strings, _data) {
35260
35296
  /* no-op */
35261
35297
  }
35262
- log(moduleName, val) {
35263
- this.push(Level.LOG, moduleName, val);
35298
+ log(levelAndName, strings, data) {
35299
+ print(Level.LOG, levelAndName, strings, data);
35264
35300
  }
35265
- info(moduleName, val) {
35266
- this.push(Level.INFO, moduleName, val);
35301
+ info(levelAndName, strings, data) {
35302
+ print(Level.INFO, levelAndName, strings, data);
35267
35303
  }
35268
35304
  }
35269
35305
  /**
35270
35306
  * An optimized version of the logger - completely ignores `TRACE` & `DEBUG` level calls.
35271
35307
  */
35272
35308
  class InfoConsoleTransport extends ConsoleTransport {
35273
- insane(_moduleName, _val) {
35309
+ insane(_levelAndName, _strings, _data) {
35274
35310
  /* no-op */
35275
35311
  }
35276
- trace(_moduleName, _val) {
35312
+ trace(_levelAndName, _strings, _data) {
35277
35313
  /* no-op */
35278
35314
  }
35279
- log(_moduleName, _val) {
35315
+ log(_levelAndName, _strings, _data) {
35280
35316
  /* no-op */
35281
35317
  }
35282
- info(moduleName, val) {
35283
- this.push(Level.INFO, moduleName, val);
35318
+ info(levelAndName, strings, data) {
35319
+ print(Level.INFO, levelAndName, strings, data);
35284
35320
  }
35285
35321
  }
35286
35322
 
@@ -35317,11 +35353,6 @@ class Logger {
35317
35353
  const module = moduleName ?? fName;
35318
35354
  return new Logger(module.padStart(8, " "), GLOBAL_CONFIG);
35319
35355
  }
35320
- /**
35321
- * Return currently configured level for given module. */
35322
- static getLevel(moduleName) {
35323
- return findLevel(GLOBAL_CONFIG.options, moduleName);
35324
- }
35325
35356
  /**
35326
35357
  * Global configuration of all loggers.
35327
35358
  *
@@ -35352,33 +35383,46 @@ class Logger {
35352
35383
  const options = parseLoggerOptions(input, defaultLevel, workingDir);
35353
35384
  Logger.configureAllFromOptions(options);
35354
35385
  }
35386
+ cachedLevelAndName;
35355
35387
  constructor(moduleName, config) {
35356
35388
  this.moduleName = moduleName;
35357
35389
  this.config = config;
35358
35390
  }
35391
+ /** Return currently configured level for given module. */
35392
+ getLevel() {
35393
+ return this.getLevelAndName()[0];
35394
+ }
35395
+ getLevelAndName() {
35396
+ if (this.cachedLevelAndName === undefined) {
35397
+ const level = findLevel(this.config.options, this.moduleName);
35398
+ const shortName = this.moduleName.replace(this.config.options.workingDir, "");
35399
+ this.cachedLevelAndName = [level, shortName];
35400
+ }
35401
+ return this.cachedLevelAndName;
35402
+ }
35359
35403
  /** Log a message with `INSANE` level. */
35360
- insane(val) {
35361
- this.config.transport.insane(this.moduleName, val);
35404
+ insane(strings, ...data) {
35405
+ this.config.transport.insane(this.getLevelAndName(), strings, data);
35362
35406
  }
35363
35407
  /** Log a message with `TRACE` level. */
35364
- trace(val) {
35365
- this.config.transport.trace(this.moduleName, val);
35408
+ trace(strings, ...data) {
35409
+ this.config.transport.trace(this.getLevelAndName(), strings, data);
35366
35410
  }
35367
35411
  /** Log a message with `DEBUG`/`LOG` level. */
35368
- log(val) {
35369
- this.config.transport.log(this.moduleName, val);
35412
+ log(strings, ...data) {
35413
+ this.config.transport.log(this.getLevelAndName(), strings, data);
35370
35414
  }
35371
35415
  /** Log a message with `INFO` level. */
35372
- info(val) {
35373
- this.config.transport.info(this.moduleName, val);
35416
+ info(strings, ...data) {
35417
+ this.config.transport.info(this.getLevelAndName(), strings, data);
35374
35418
  }
35375
35419
  /** Log a message with `WARN` level. */
35376
- warn(val) {
35377
- this.config.transport.warn(this.moduleName, val);
35420
+ warn(strings, ...data) {
35421
+ this.config.transport.warn(this.getLevelAndName(), strings, data);
35378
35422
  }
35379
35423
  /** Log a message with `ERROR` level. */
35380
- error(val) {
35381
- this.config.transport.error(this.moduleName, val);
35424
+ error(strings, ...data) {
35425
+ this.config.transport.error(this.getLevelAndName(), strings, data);
35382
35426
  }
35383
35427
  }
35384
35428
 
@@ -35468,15 +35512,15 @@ class NodeConfiguration {
35468
35512
  }
35469
35513
  function loadConfig(configPath) {
35470
35514
  if (configPath === DEFAULT_CONFIG) {
35471
- logger.log("🔧 Loading DEFAULT config");
35515
+ logger.log `🔧 Loading DEFAULT config`;
35472
35516
  return parseFromJson(configs.default, NodeConfiguration.fromJson);
35473
35517
  }
35474
35518
  if (configPath === DEV_CONFIG) {
35475
- logger.log("🔧 Loading DEV config");
35519
+ logger.log `🔧 Loading DEV config`;
35476
35520
  return parseFromJson(configs.dev, NodeConfiguration.fromJson);
35477
35521
  }
35478
35522
  try {
35479
- logger.log(`🔧 Loading config from ${configPath}`);
35523
+ logger.log `🔧 Loading config from ${configPath}`;
35480
35524
  const configFile = external_node_fs_default().readFileSync(configPath, "utf8");
35481
35525
  const parsed = JSON.parse(configFile);
35482
35526
  return parseFromJson(parsed, NodeConfiguration.fromJson);
@@ -39182,7 +39226,7 @@ class LmdbStates {
39182
39226
  await Promise.all([valuesWrite, statesWrite]);
39183
39227
  }
39184
39228
  catch (e) {
39185
- states_logger.error(`${e}`);
39229
+ states_logger.error `${e}`;
39186
39230
  return result_Result.error(StateUpdateError.Commit);
39187
39231
  }
39188
39232
  return result_Result.ok(result_OK);
@@ -39251,7 +39295,7 @@ function openDatabase(nodeName, genesisHeader, databaseBasePath, { readOnly = fa
39251
39295
  const genesisHeaderHash = hashBytes(genesisHeader).asOpaque();
39252
39296
  const genesisHeaderHashNibbles = genesisHeaderHash.toString().substring(2, 10);
39253
39297
  const dbPath = `${databaseBasePath}/${nodeNameHash}/${genesisHeaderHashNibbles}`;
39254
- common_logger.info(`🛢️ Opening database at ${dbPath}`);
39298
+ common_logger.info `🛢️ Opening database at ${dbPath}`;
39255
39299
  try {
39256
39300
  return {
39257
39301
  dbPath,
@@ -39273,21 +39317,21 @@ async function initializeDatabase(spec, genesisHeaderHash, rootDb, config, ances
39273
39317
  const states = new LmdbStates(spec, rootDb);
39274
39318
  const header = blocks.getBestHeaderHash();
39275
39319
  const state = blocks.getPostStateRoot(header);
39276
- common_logger.log(`🛢️ Best header hash: ${header}`);
39277
- common_logger.log(`🛢️ Best state root: ${state}`);
39320
+ common_logger.log `🛢️ Best header hash: ${header}`;
39321
+ common_logger.log `🛢️ Best state root: ${state}`;
39278
39322
  // DB seems already initialized, just go with what we have.
39279
39323
  const isDbInitialized = state !== null && !state.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE)) && !header.isEqualTo(bytes_Bytes.zero(hash_HASH_SIZE));
39280
39324
  if (isDbInitialized) {
39281
39325
  await rootDb.db.close();
39282
39326
  return;
39283
39327
  }
39284
- common_logger.log("🛢️ Database looks fresh. Initializing.");
39328
+ common_logger.log `🛢️ Database looks fresh. Initializing.`;
39285
39329
  // looks like a fresh db, initialize the state.
39286
39330
  const genesisHeader = decoder_Decoder.decodeObject(Header.Codec, config.genesisHeader, spec);
39287
39331
  const genesisExtrinsic = emptyBlock().extrinsic;
39288
39332
  const genesisBlock = Block.create({ header: genesisHeader, extrinsic: genesisExtrinsic });
39289
39333
  const blockView = blockAsView(genesisBlock, spec);
39290
- common_logger.log(`🧬 Writing genesis block #${genesisHeader.timeSlotIndex}: ${genesisHeaderHash}`);
39334
+ common_logger.log `🧬 Writing genesis block #${genesisHeader.timeSlotIndex}: ${genesisHeaderHash}`;
39291
39335
  const { genesisStateSerialized, genesisStateRootHash } = loadGenesisState(spec, config.genesisState);
39292
39336
  // write to db
39293
39337
  await blocks.insertBlock(new WithHash(genesisHeaderHash, blockView));
@@ -39305,7 +39349,7 @@ function loadGenesisState(spec, data) {
39305
39349
  const stateEntries = state_entries_StateEntries.fromEntriesUnsafe(data.entries());
39306
39350
  const state = serialized_state_SerializedState.fromStateEntries(spec, stateEntries);
39307
39351
  const genesisStateRootHash = stateEntries.getRootHash();
39308
- common_logger.info(`🧬 Genesis state root: ${genesisStateRootHash}`);
39352
+ common_logger.info `🧬 Genesis state root: ${genesisStateRootHash}`;
39309
39353
  return {
39310
39354
  genesisState: state,
39311
39355
  genesisStateSerialized: stateEntries,
@@ -39444,7 +39488,7 @@ class TypedPort {
39444
39488
  this.dispatchPortMessage(msg);
39445
39489
  }
39446
39490
  catch (e) {
39447
- port_logger.error(`[${this.constructor.name}] Failed to dispatch a message: ${e}: ${JSON.stringify(msg)}`);
39491
+ port_logger.error `[${this.constructor.name}] Failed to dispatch a message: ${e}: ${msg}`;
39448
39492
  throw e;
39449
39493
  }
39450
39494
  });
@@ -39518,7 +39562,7 @@ class TypedPort {
39518
39562
  this.port.postMessage(msg, transferList);
39519
39563
  }
39520
39564
  catch (e) {
39521
- port_logger.error(`[${this.constructor.name}] Failed to post a message: ${e}: ${JSON.stringify(msg)}`);
39565
+ port_logger.error `[${this.constructor.name}] Failed to post a message: ${e}: ${msg}`;
39522
39566
  throw e;
39523
39567
  }
39524
39568
  }
@@ -39549,7 +39593,7 @@ class TypedPort {
39549
39593
  cleanup(reason) {
39550
39594
  // resolve all pending requests with an error.
39551
39595
  const responseListeners = this.responseListeners.eventNames();
39552
- for (const ev in responseListeners) {
39596
+ for (const ev of responseListeners) {
39553
39597
  this.responseListeners.emit(ev, new Error(`port is ${reason}`));
39554
39598
  }
39555
39599
  }
@@ -39598,7 +39642,7 @@ class MessageChannelStateMachine {
39598
39642
  this.dispatchSignal(name, data);
39599
39643
  }
39600
39644
  catch (e) {
39601
- channel_logger.error(`[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`);
39645
+ channel_logger.error `[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`;
39602
39646
  throw e;
39603
39647
  }
39604
39648
  });
@@ -39607,7 +39651,7 @@ class MessageChannelStateMachine {
39607
39651
  await this.dispatchRequest(name, data, msg);
39608
39652
  }
39609
39653
  catch (e) {
39610
- channel_logger.error(`[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`);
39654
+ channel_logger.error `[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`;
39611
39655
  throw e;
39612
39656
  }
39613
39657
  });
@@ -39693,7 +39737,7 @@ class MessageChannelStateMachine {
39693
39737
  this.machine.transition(res.transitionTo.state, res.transitionTo.data);
39694
39738
  }
39695
39739
  if (didStateChangeInMeantime) {
39696
- channel_logger.warn(`Ignoring obsolete response for an old request: "${name}"`);
39740
+ channel_logger.warn `Ignoring obsolete response for an old request: "${name}"`;
39697
39741
  return;
39698
39742
  }
39699
39743
  return this.port.respond(prevState.stateName, msg, res.response);
@@ -39709,7 +39753,7 @@ class MessageChannelStateMachine {
39709
39753
  }
39710
39754
  }
39711
39755
  transitionTo() {
39712
- channel_logger.trace(`[${this.machine.name}] transitioned to ${this.currentState()}`);
39756
+ channel_logger.trace `[${this.machine.name}] transitioned to ${this.currentState()}`;
39713
39757
  return this;
39714
39758
  }
39715
39759
  /**
@@ -39729,7 +39773,7 @@ class MessageChannelStateMachine {
39729
39773
  await promise;
39730
39774
  }
39731
39775
  catch (e) {
39732
- channel_logger.error(JSON.stringify(e));
39776
+ channel_logger.error `${e}`;
39733
39777
  }
39734
39778
  return new MessageChannelStateMachine(machine, port);
39735
39779
  }
@@ -39932,7 +39976,7 @@ class State {
39932
39976
  * actions.
39933
39977
  */
39934
39978
  onActivation(data) {
39935
- state_logger.trace(`[${this.constructor.name}] Changing state to: ${this}`);
39979
+ state_logger.trace `[${this.constructor.name}] Changing state to: ${this}`;
39936
39980
  this.data = data;
39937
39981
  }
39938
39982
  /**
@@ -40030,7 +40074,7 @@ async function spawnWorkerGeneric(bootstrapPath, logger, mainReadyName, mainRead
40030
40074
  const worker = new external_node_worker_threads_namespaceObject.Worker(bootstrapPath);
40031
40075
  const machine = stateMachineMain(`main->${mainReadyName}`, mainReadyName, mainReadyState);
40032
40076
  const channel = await MessageChannelStateMachine.createAndTransferChannel(machine, worker);
40033
- logger.trace(`[${machine.name}] Worker spawned ${channel.currentState()}`);
40077
+ logger.trace `[${machine.name}] Worker spawned ${channel.currentState()}`;
40034
40078
  return channel;
40035
40079
  }
40036
40080
 
@@ -40143,7 +40187,7 @@ class MainReady extends State {
40143
40187
  if (res instanceof Uint8Array) {
40144
40188
  return bytes_Bytes.fromBlob(res, hash_HASH_SIZE).asOpaque();
40145
40189
  }
40146
- state_machine_logger.error(`Invalid response for getBestStateRootHash. Expected Uint8Array, got: ${res}`);
40190
+ state_machine_logger.error `Invalid response for getBestStateRootHash. Expected Uint8Array, got: ${res}`;
40147
40191
  return bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
40148
40192
  }
40149
40193
  finish(channel) {
@@ -40191,7 +40235,7 @@ class ImporterReady extends State {
40191
40235
  }
40192
40236
  async getStateEntries(hash) {
40193
40237
  if (this.importer === null) {
40194
- state_machine_logger.error(`${this.constructor.name} importer not initialized yet!`);
40238
+ state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
40195
40239
  await new Promise((resolve) => {
40196
40240
  this.onImporter.once(resolve);
40197
40241
  });
@@ -40205,7 +40249,7 @@ class ImporterReady extends State {
40205
40249
  response: encoded.raw,
40206
40250
  };
40207
40251
  }
40208
- state_machine_logger.error(`${this.constructor.name} got invalid request type: ${JSON.stringify(hash)}.`);
40252
+ state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(hash)}.`;
40209
40253
  return {
40210
40254
  response: null,
40211
40255
  };
@@ -40225,7 +40269,7 @@ class ImporterReady extends State {
40225
40269
  }
40226
40270
  async importBlock(block) {
40227
40271
  if (this.importer === null) {
40228
- state_machine_logger.error(`${this.constructor.name} importer not initialized yet!`);
40272
+ state_machine_logger.error `${this.constructor.name} importer not initialized yet!`;
40229
40273
  await new Promise((resolve) => {
40230
40274
  this.onImporter.once(resolve);
40231
40275
  });
@@ -40245,8 +40289,8 @@ class ImporterReady extends State {
40245
40289
  }
40246
40290
  }
40247
40291
  catch (e) {
40248
- state_machine_logger.error(`Failed to import block: ${e}`);
40249
- state_machine_logger.error(`${e instanceof Error ? e.stack : ""}`);
40292
+ state_machine_logger.error `Failed to import block: ${e}`;
40293
+ state_machine_logger.error `${e instanceof Error ? e.stack : ""}`;
40250
40294
  response = result_Result.error(`${e}`);
40251
40295
  }
40252
40296
  const encoded = encoder_Encoder.encodeObject(importBlockResultCodec, response);
@@ -40254,7 +40298,7 @@ class ImporterReady extends State {
40254
40298
  response: encoded.raw,
40255
40299
  };
40256
40300
  }
40257
- state_machine_logger.error(`${this.constructor.name} got invalid request type: ${JSON.stringify(block)}.`);
40301
+ state_machine_logger.error `${this.constructor.name} got invalid request type: ${JSON.stringify(block)}.`;
40258
40302
  return {
40259
40303
  response: null,
40260
40304
  };
@@ -40266,7 +40310,7 @@ class ImporterReady extends State {
40266
40310
  this.onBlock.emit(blockView);
40267
40311
  }
40268
40312
  else {
40269
- state_machine_logger.error(`${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`);
40313
+ state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
40270
40314
  }
40271
40315
  }
40272
40316
  async endWork() {
@@ -40365,7 +40409,7 @@ class state_machine_MainReady extends State {
40365
40409
  this.onNewBlocks.emit(blocks);
40366
40410
  }
40367
40411
  else {
40368
- jam_network_state_machine_logger.error(`${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`);
40412
+ jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
40369
40413
  }
40370
40414
  }
40371
40415
  announceHeader(port, header) {
@@ -40403,7 +40447,7 @@ class NetworkReady extends State {
40403
40447
  this.onNewHeader.emit(decoded);
40404
40448
  }
40405
40449
  else {
40406
- jam_network_state_machine_logger.error(`${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`);
40450
+ jam_network_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`;
40407
40451
  }
40408
40452
  }
40409
40453
  sendBlocks(port, blocks) {
@@ -41983,6 +42027,17 @@ class PageRange {
41983
42027
  }
41984
42028
  return new PageRange(start, length);
41985
42029
  }
42030
+ /** Returns true if the page range is wrapped (`start` >= `end`) and is not empty */
42031
+ isWrapped() {
42032
+ return this.start >= this.end && !this.isEmpty();
42033
+ }
42034
+ /** Checks if given page number is within the range */
42035
+ isInRange(page) {
42036
+ if (this.isWrapped()) {
42037
+ return page >= this.start || page < this.end;
42038
+ }
42039
+ return page >= this.start && page < this.end;
42040
+ }
41986
42041
  /** Checks if a range is empty (`length === 0`) */
41987
42042
  isEmpty() {
41988
42043
  return this.length === 0;
@@ -42111,12 +42166,14 @@ class WriteablePage extends MemoryPage {
42111
42166
 
42112
42167
 
42113
42168
 
42169
+
42170
+
42114
42171
  var AccessType;
42115
42172
  (function (AccessType) {
42116
42173
  AccessType[AccessType["READ"] = 0] = "READ";
42117
42174
  AccessType[AccessType["WRITE"] = 1] = "WRITE";
42118
42175
  })(AccessType || (AccessType = {}));
42119
- // const logger = Logger.new(import.meta.filename, "pvm:mem");
42176
+ const memory_logger = Logger.new(import.meta.filename, "pvm:mem");
42120
42177
  class Memory {
42121
42178
  sbrkIndex;
42122
42179
  virtualSbrkIndex;
@@ -42147,7 +42204,7 @@ class Memory {
42147
42204
  if (bytes.length === 0) {
42148
42205
  return result_Result.ok(result_OK);
42149
42206
  }
42150
- // logger.insane(`MEM[${address}] <- ${BytesBlob.blobFrom(bytes)}`);
42207
+ memory_logger.insane `MEM[${address}] <- ${bytes_BytesBlob.blobFrom(bytes)}`;
42151
42208
  const pagesResult = this.getPages(address, bytes.length, AccessType.WRITE);
42152
42209
  if (pagesResult.isError) {
42153
42210
  return result_Result.error(pagesResult.error);
@@ -42214,7 +42271,7 @@ class Memory {
42214
42271
  currentPosition += bytesToRead;
42215
42272
  bytesLeft -= bytesToRead;
42216
42273
  }
42217
- // logger.insane(`MEM[${startAddress}] => ${BytesBlob.blobFrom(result)}`);
42274
+ memory_logger.insane `MEM[${startAddress}] => ${bytes_BytesBlob.blobFrom(result)}`;
42218
42275
  return result_Result.ok(result_OK);
42219
42276
  }
42220
42277
  sbrk(length) {
@@ -42360,10 +42417,11 @@ class MemoryBuilder {
42360
42417
  startHeapIndex (${startHeapIndex}) has to be less than or equal to endHeapIndex (${endHeapIndex})
42361
42418
  `;
42362
42419
  this.ensureNotFinalized();
42363
- const range = MemoryRange.fromStartAndLength(startHeapIndex, endHeapIndex - startHeapIndex);
42364
- const pages = PageRange.fromMemoryRange(range);
42365
- for (const pageNumber of pages) {
42366
- if (this.initialMemory.has(pageNumber)) {
42420
+ const heapRange = MemoryRange.fromStartAndLength(startHeapIndex, endHeapIndex - startHeapIndex);
42421
+ const heapPagesRange = PageRange.fromMemoryRange(heapRange);
42422
+ const initializedPageNumbers = Array.from(this.initialMemory.keys());
42423
+ for (const pageNumber of initializedPageNumbers) {
42424
+ if (heapPagesRange.isInRange(pageNumber)) {
42367
42425
  throw new IncorrectSbrkIndex();
42368
42426
  }
42369
42427
  }
@@ -44144,7 +44202,7 @@ class ProgramDecoder {
44144
44202
  return result_Result.ok(new ProgramDecoder(program));
44145
44203
  }
44146
44204
  catch (e) {
44147
- program_decoder_logger.error(`Invalid program: ${e}`);
44205
+ program_decoder_logger.error `Invalid program: ${e}`;
44148
44206
  return result_Result.error(ProgramDecoderError.InvalidProgramError);
44149
44207
  }
44150
44208
  }
@@ -44310,7 +44368,7 @@ class Interpreter {
44310
44368
  const argsType = instructionArgumentTypeMap[currentInstruction] ?? ArgumentType.NO_ARGUMENTS;
44311
44369
  const argsResult = this.argsDecodingResults[argsType];
44312
44370
  this.argsDecoder.fillArgs(this.pc, argsResult);
44313
- interpreter_logger.insane(`[PC: ${this.pc}] ${Instruction[currentInstruction]}`);
44371
+ interpreter_logger.insane `[PC: ${this.pc}] ${Instruction[currentInstruction]}`;
44314
44372
  if (!isValidInstruction) {
44315
44373
  this.instructionResult.status = pvm_interpreter_result_Result.PANIC;
44316
44374
  }
@@ -44382,7 +44440,7 @@ class Interpreter {
44382
44440
  this.status = status_Status.HOST;
44383
44441
  break;
44384
44442
  }
44385
- interpreter_logger.insane(`[PC: ${this.pc}] Status: ${pvm_interpreter_result_Result[this.instructionResult.status]}`);
44443
+ interpreter_logger.insane `[PC: ${this.pc}] Status: ${pvm_interpreter_result_Result[this.instructionResult.status]}`;
44386
44444
  return this.status;
44387
44445
  }
44388
44446
  this.pc = this.instructionResult.nextPc;
@@ -44629,7 +44687,7 @@ class host_calls_manager_HostCallsManager {
44629
44687
  return `r${idx}=${value} (0x${value.toString(16)})`;
44630
44688
  })
44631
44689
  .join(", ");
44632
- host_calls_manager_logger.insane(`[${currentServiceId}] ${context} ${name}${requested}. Gas: ${gas}. Regs: ${registerValues}.`);
44690
+ host_calls_manager_logger.insane `[${currentServiceId}] ${context} ${name}${requested}. Gas: ${gas}. Regs: ${registerValues}.`;
44633
44691
  }
44634
44692
  }
44635
44693
  class NoopMissing {
@@ -45237,7 +45295,7 @@ class block_generator_state_machine_MainReady extends State {
45237
45295
  this.onBlock.emit(block);
45238
45296
  }
45239
45297
  else {
45240
- block_generator_state_machine_logger.error(`${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`);
45298
+ block_generator_state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
45241
45299
  }
45242
45300
  }
45243
45301
  finish(channel) {
@@ -45292,12 +45350,12 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
45292
45350
  channel
45293
45351
  .then((channel) => main(channel))
45294
45352
  .catch((e) => {
45295
- block_generator_logger.error(e);
45353
+ block_generator_logger.error `${e}`;
45296
45354
  if (e.stack !== undefined) {
45297
- block_generator_logger.error(e.stack);
45355
+ block_generator_logger.error `${e.stack}`;
45298
45356
  }
45299
45357
  if (e.cause !== undefined) {
45300
- block_generator_logger.error(e.cause);
45358
+ block_generator_logger.error `${e.cause}`;
45301
45359
  }
45302
45360
  });
45303
45361
  }
@@ -45305,7 +45363,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
45305
45363
  * The `BlockGenerator` should periodically create new blocks and send them as signals to the main thread.
45306
45364
  */
45307
45365
  async function main(channel) {
45308
- block_generator_logger.info(`🎁 Block Generator running ${channel.currentState()}`);
45366
+ block_generator_logger.info `🎁 Block Generator running ${channel.currentState()}`;
45309
45367
  // Await the configuration object
45310
45368
  const ready = await channel.waitForState("ready(generator)");
45311
45369
  const config = ready.currentState().getConfig();
@@ -45320,11 +45378,11 @@ async function main(channel) {
45320
45378
  await (0,promises_namespaceObject.setTimeout)(config.chainSpec.slotDuration * 1000);
45321
45379
  counter += 1;
45322
45380
  const newBlock = await generator.nextEncodedBlock();
45323
- block_generator_logger.trace(`Sending block ${counter}`);
45381
+ block_generator_logger.trace `Sending block ${counter}`;
45324
45382
  worker.sendBlock(port, newBlock);
45325
45383
  }
45326
45384
  });
45327
- block_generator_logger.info("Block Generator finished. Closing channel.");
45385
+ block_generator_logger.info `Block Generator finished. Closing channel.`;
45328
45386
  // Close the comms to gracefully close the app.
45329
45387
  finished.currentState().close(channel);
45330
45388
  }
@@ -45439,11 +45497,11 @@ class PeersManagement {
45439
45497
  _onPeerDisconnected = [];
45440
45498
  peers = new Map();
45441
45499
  peerConnected(peer) {
45442
- peers_logger.info(`💡 Peer ${displayId(peer)} connected.`);
45500
+ peers_logger.info `💡 Peer ${displayId(peer)} connected.`;
45443
45501
  const oldPeerData = this.peers.get(peer.id);
45444
45502
  if (oldPeerData !== undefined) {
45445
45503
  // TODO [ToDr] replacing old connection?
45446
- peers_logger.warn("Replacing older connection.");
45504
+ peers_logger.warn `Replacing older connection.`;
45447
45505
  }
45448
45506
  this.peers.set(peer.id, peer);
45449
45507
  for (const callback of this._onPeerConnected) {
@@ -45451,7 +45509,7 @@ class PeersManagement {
45451
45509
  }
45452
45510
  }
45453
45511
  peerDisconnected(peer) {
45454
- peers_logger.info(`⚡︎Peer ${displayId(peer)} disconnected.`);
45512
+ peers_logger.info `⚡︎Peer ${displayId(peer)} disconnected.`;
45455
45513
  this.peers.delete(peer.id);
45456
45514
  for (const callback of this._onPeerDisconnected) {
45457
45515
  callback(peer);
@@ -54243,23 +54301,23 @@ var VerifyCertError;
54243
54301
  VerifyCertError[VerifyCertError["IncorrectSignature"] = 4] = "IncorrectSignature";
54244
54302
  })(VerifyCertError || (VerifyCertError = {}));
54245
54303
  async function verifyCertificate(certs) {
54246
- certificate_logger.log("Incoming peer. Verifying certificate");
54304
+ certificate_logger.log `Incoming peer. Verifying certificate`;
54247
54305
  // Must present exactly one cert
54248
54306
  if (certs.length !== 1) {
54249
- certificate_logger.log("Rejecting peer with no certificates.");
54307
+ certificate_logger.log `Rejecting peer: expected exactly one certificate, got: ${certs.length}`;
54250
54308
  return result_Result.error(VerifyCertError.NoCertificate);
54251
54309
  }
54252
54310
  // Parse with Node's X509Certificate (accepts PEM or DER)
54253
54311
  const xc = new (external_node_crypto_default()).X509Certificate(certs[0]);
54254
54312
  // Must be Ed25519 key
54255
54313
  if (xc.publicKey.asymmetricKeyType !== CURVE_NAME.toLowerCase()) {
54256
- certificate_logger.log(`Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`);
54314
+ certificate_logger.log `Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`;
54257
54315
  return result_Result.error(VerifyCertError.NotEd25519);
54258
54316
  }
54259
54317
  // Extract raw public key via JWK export
54260
54318
  const jwk = xc.publicKey.export({ format: "jwk" });
54261
54319
  if (jwk.kty !== KEY_TYPE || jwk.crv !== CURVE_NAME) {
54262
- certificate_logger.log(`Public key type mismatch: ${jwk.kty}, ${jwk.crv}`);
54320
+ certificate_logger.log `Public key type mismatch: ${jwk.kty}, ${jwk.crv}`;
54263
54321
  return result_Result.error(VerifyCertError.PublicKeyTypeMismatch);
54264
54322
  }
54265
54323
  // SAN must be exactly 'e'+base32(rawPub)
@@ -54267,7 +54325,7 @@ async function verifyCertificate(certs) {
54267
54325
  const sanField = xc.subjectAltName ?? "";
54268
54326
  const m = sanField.match(/DNS:([^,]+)/);
54269
54327
  if (m === null || m[1] !== expectedSan) {
54270
- certificate_logger.log(`AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`);
54328
+ certificate_logger.log `AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`;
54271
54329
  return result_Result.error(VerifyCertError.AltNameMismatch);
54272
54330
  }
54273
54331
  const key = Buffer.from(jwk.x ?? "", "base64url");
@@ -54534,19 +54592,19 @@ class QuicNetwork {
54534
54592
  }
54535
54593
  this.started = true;
54536
54594
  await this.socket.start({ host: this.listen.host, port: this.listen.port });
54537
- quic_network_logger.info(`🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`);
54595
+ quic_network_logger.info `🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`;
54538
54596
  await this.server.start();
54539
- quic_network_logger.log("🛜 QUIC server listening");
54597
+ quic_network_logger.log `🛜 QUIC server listening`;
54540
54598
  }
54541
54599
  async stop() {
54542
54600
  if (!this.started) {
54543
54601
  throw new Error("Network not started yet!");
54544
54602
  }
54545
- quic_network_logger.info("Stopping the networking.");
54603
+ quic_network_logger.info `Stopping the networking.`;
54546
54604
  await this.server.stop();
54547
54605
  await this.socket.stop();
54548
54606
  this.started = false;
54549
- quic_network_logger.info("Networking stopped.");
54607
+ quic_network_logger.info `Networking stopped.`;
54550
54608
  }
54551
54609
  get peers() {
54552
54610
  return this._peers;
@@ -54567,7 +54625,7 @@ clazz, callback) {
54567
54625
  await callback(ev);
54568
54626
  }
54569
54627
  catch (e) {
54570
- quic_utils_logger.error(`Unhandled exception in ${clazz.name} event handler: ${e}`);
54628
+ quic_utils_logger.error `Unhandled exception in ${clazz.name} event handler: ${e}`;
54571
54629
  }
54572
54630
  });
54573
54631
  }
@@ -54626,7 +54684,7 @@ class QuicPeer {
54626
54684
  streamEvents = new (external_node_events_default())();
54627
54685
  constructor(conn, peerInfo) {
54628
54686
  this.conn = conn;
54629
- quic_peer_logger.log(`👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`);
54687
+ quic_peer_logger.log `👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`;
54630
54688
  this.connectionId = conn.connectionIdShared.toString();
54631
54689
  this.address = {
54632
54690
  host: conn.remoteHost,
@@ -54636,11 +54694,11 @@ class QuicPeer {
54636
54694
  this.key = peerInfo.key;
54637
54695
  addEventListener(conn, EventQUICConnectionStream, (ev) => {
54638
54696
  const stream = ev.detail;
54639
- quic_peer_logger.log(`🚰 [${this.id}] new stream: [${stream.streamId}]`);
54697
+ quic_peer_logger.log `🚰 [${this.id}] new stream: [${stream.streamId}]`;
54640
54698
  this.streamEvents.emit("stream", new QuicStream(stream));
54641
54699
  });
54642
54700
  addEventListener(conn, EventQUICConnectionError, (err) => {
54643
- quic_peer_logger.error(`❌ [${this.id}] connection failed: ${err.detail}`);
54701
+ quic_peer_logger.error `❌ [${this.id}] connection failed: ${err.detail}`;
54644
54702
  });
54645
54703
  }
54646
54704
  addOnIncomingStream(streamCallback) {
@@ -54648,11 +54706,11 @@ class QuicPeer {
54648
54706
  }
54649
54707
  openStream() {
54650
54708
  const stream = this.conn.newStream("bidi");
54651
- quic_peer_logger.log(`🚰 [${this.id}] opening stream: [${stream.streamId}]`);
54709
+ quic_peer_logger.log `🚰 [${this.id}] opening stream: [${stream.streamId}]`;
54652
54710
  return new QuicStream(stream);
54653
54711
  }
54654
54712
  async disconnect() {
54655
- quic_peer_logger.log(`👋 [${this.id}] disconnecting`);
54713
+ quic_peer_logger.log `👋 [${this.id}] disconnecting`;
54656
54714
  await this.conn.stop({ isApp: true });
54657
54715
  }
54658
54716
  }
@@ -54673,7 +54731,7 @@ const setup_logger = Logger.new(import.meta.filename, "net");
54673
54731
  class Quic {
54674
54732
  /** Setup QUIC socket and start listening for connections. */
54675
54733
  static async setup({ host, port, protocols, key }) {
54676
- const quicLoggerLvl = Logger.getLevel("net") > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
54734
+ const quicLoggerLvl = setup_logger.getLevel() > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
54677
54735
  const quicLogger = new dist_Logger("quic", quicLoggerLvl, [
54678
54736
  new handlers_StreamHandler(format `${level}:${keys}:${msg}`),
54679
54737
  ]);
@@ -54696,7 +54754,7 @@ class Quic {
54696
54754
  verifyPeer: true,
54697
54755
  verifyCallback: lastConnectedPeer.verifyCallback,
54698
54756
  };
54699
- setup_logger.info(`🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`);
54757
+ setup_logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
54700
54758
  // Shared injected UDP socket
54701
54759
  const socket = new dist_QUICSocket({
54702
54760
  logger: quicLogger.getChild("socket"),
@@ -54711,8 +54769,8 @@ class Quic {
54711
54769
  // peer management
54712
54770
  const peers = new PeersManagement();
54713
54771
  // basic error handling
54714
- addEventListener(server, EventQUICServerError, (error) => setup_logger.error(`🛜 Server error: ${error}`));
54715
- addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error(`🛜 Server stopped: ${ev}`));
54772
+ addEventListener(server, EventQUICServerError, (error) => setup_logger.error `🛜 Server error: ${error}`);
54773
+ addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error `🛜 Server stopped: ${ev}`);
54716
54774
  // handling incoming session
54717
54775
  addEventListener(server, EventQUICServerConnection, async (ev) => {
54718
54776
  const conn = ev.detail;
@@ -54721,16 +54779,16 @@ class Quic {
54721
54779
  return;
54722
54780
  }
54723
54781
  if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
54724
- setup_logger.log(`🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`);
54782
+ setup_logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
54725
54783
  await conn.stop();
54726
54784
  return;
54727
54785
  }
54728
54786
  if (peers.isConnected(lastConnectedPeer.info.id)) {
54729
- setup_logger.log(`🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`);
54787
+ setup_logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
54730
54788
  await conn.stop();
54731
54789
  return;
54732
54790
  }
54733
- setup_logger.log(`🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`);
54791
+ setup_logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
54734
54792
  newPeer(conn, lastConnectedPeer.info);
54735
54793
  lastConnectedPeer.info = null;
54736
54794
  await conn.start();
@@ -54753,10 +54811,10 @@ class Quic {
54753
54811
  });
54754
54812
  const client = await clientLater;
54755
54813
  addEventListener(client, EventQUICClientClose, () => {
54756
- setup_logger.log("⚰️ Client connection closed.");
54814
+ setup_logger.log `⚰️ Client connection closed.`;
54757
54815
  });
54758
54816
  addEventListener(client, EventQUICClientError, (error) => {
54759
- setup_logger.error(`🔴 Client error: ${error.detail}`);
54817
+ setup_logger.error `🔴 Client error: ${error.detail}`;
54760
54818
  });
54761
54819
  if (peerDetails.info === null) {
54762
54820
  throw new Error("Client connected, but there is no peer details!");
@@ -54764,7 +54822,7 @@ class Quic {
54764
54822
  if (options.verifyName !== undefined && options.verifyName !== peerDetails.info.id) {
54765
54823
  throw new Error(`Client connected, but the id didn't match. Expected: ${options.verifyName}, got: ${peerDetails.info.id}`);
54766
54824
  }
54767
- setup_logger.log(`🤝 Client handshake with: ${peer.host}:${peer.port}`);
54825
+ setup_logger.log `🤝 Client handshake with: ${peer.host}:${peer.port}`;
54768
54826
  return newPeer(client.connection, peerDetails.info);
54769
54827
  }
54770
54828
  function newPeer(conn, peerInfo) {
@@ -54884,10 +54942,10 @@ class Connections {
54884
54942
  for (;;) {
54885
54943
  // increase the reconnection counter
54886
54944
  meta.currentRetry += 1;
54887
- if (meta.currentRetry >= meta.maxRetries) {
54945
+ if (meta.currentRetry > meta.maxRetries) {
54888
54946
  // reached max retries for a peer, remove it from tracking.
54889
54947
  this.peerInfo.delete(id);
54890
- jamnp_s_peers_logger.log(`[${id}] max retries reached. Removing peer.`);
54948
+ jamnp_s_peers_logger.log `[${id}] max retries reached. Removing peer.`;
54891
54949
  return;
54892
54950
  }
54893
54951
  // else attempt to connect to a node a bit later.
@@ -54906,7 +54964,7 @@ class Connections {
54906
54964
  }
54907
54965
  // attempt to connect to the peer
54908
54966
  try {
54909
- jamnp_s_peers_logger.trace(`[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`);
54967
+ jamnp_s_peers_logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
54910
54968
  await this.network.dial(meta.address, { signal, verifyName: meta.peerId });
54911
54969
  return;
54912
54970
  }
@@ -54915,7 +54973,7 @@ class Connections {
54915
54973
  return;
54916
54974
  }
54917
54975
  // failing to connect, will retry.
54918
- jamnp_s_peers_logger.trace(`[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`);
54976
+ jamnp_s_peers_logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
54919
54977
  }
54920
54978
  }
54921
54979
  }
@@ -55028,7 +55086,7 @@ class StreamManager {
55028
55086
  // We expect a one-byte identifier first.
55029
55087
  const data = await reader.read();
55030
55088
  bytes = bytes_BytesBlob.blobFrom(data.value !== undefined ? data.value : new Uint8Array());
55031
- stream_manager_logger.trace(`🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`);
55089
+ stream_manager_logger.trace `🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`;
55032
55090
  }
55033
55091
  finally {
55034
55092
  reader.releaseLock();
@@ -55042,7 +55100,7 @@ class StreamManager {
55042
55100
  if (handler === undefined) {
55043
55101
  throw new Error(`Unsupported stream kind: ${kind}`);
55044
55102
  }
55045
- stream_manager_logger.log(`🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`);
55103
+ stream_manager_logger.log `🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`;
55046
55104
  this.registerStream(peer, handler, stream, bytes_BytesBlob.blobFrom(bytes.raw.subarray(1)));
55047
55105
  }
55048
55106
  registerStream(peer, handler, stream, initialData) {
@@ -55052,7 +55110,7 @@ class StreamManager {
55052
55110
  this.streams.delete(streamId);
55053
55111
  this.backgroundTasks.delete(streamId);
55054
55112
  if (kind === StreamErrorKind.Exception) {
55055
- stream_manager_logger.error(`🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`);
55113
+ stream_manager_logger.error `🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`;
55056
55114
  }
55057
55115
  if (kind !== StreamErrorKind.LocalClose) {
55058
55116
  // whenever we have an error, we are going to inform the handler
@@ -55086,10 +55144,10 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
55086
55144
  let isDone = false;
55087
55145
  const callback = handleMessageFragmentation((data) => {
55088
55146
  const bytes = bytes_BytesBlob.blobFrom(new Uint8Array(data));
55089
- stream_manager_logger.trace(`🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`);
55147
+ stream_manager_logger.trace `🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`;
55090
55148
  handler.onStreamMessage(quicStream, bytes);
55091
55149
  }, () => {
55092
- stream_manager_logger.error(`🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`);
55150
+ stream_manager_logger.error `🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`;
55093
55151
  peer.disconnect();
55094
55152
  });
55095
55153
  for (;;) {
@@ -55098,7 +55156,7 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
55098
55156
  // be a promise, so that we can make back pressure here.
55099
55157
  callback(bytes.raw);
55100
55158
  if (isDone) {
55101
- stream_manager_logger.log(`🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`);
55159
+ stream_manager_logger.log `🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`;
55102
55160
  return;
55103
55161
  }
55104
55162
  // await for more data
@@ -55141,7 +55199,7 @@ class QuicStreamSender {
55141
55199
  return;
55142
55200
  }
55143
55201
  const { data, addPrefix } = chunk;
55144
- stream_manager_logger.trace(`🚰 <-- [${this.streamId}] write: ${data}`);
55202
+ stream_manager_logger.trace `🚰 <-- [${this.streamId}] write: ${data}`;
55145
55203
  if (addPrefix) {
55146
55204
  await writer.write(encodeMessageLength(data.raw));
55147
55205
  }
@@ -55158,7 +55216,7 @@ class QuicStreamSender {
55158
55216
  }
55159
55217
  close() {
55160
55218
  handleAsyncErrors(async () => {
55161
- stream_manager_logger.trace(`🚰 <-- [${this.streamId}] closing`);
55219
+ stream_manager_logger.trace `🚰 <-- [${this.streamId}] closing`;
55162
55220
  if (this.currentWriterPromise !== null) {
55163
55221
  await this.currentWriterPromise;
55164
55222
  }
@@ -55244,7 +55302,7 @@ class ServerHandler {
55244
55302
  }
55245
55303
  onStreamMessage(sender, message) {
55246
55304
  const request = decoder_Decoder.decodeObject(BlockRequest.Codec, message);
55247
- ce_128_block_request_logger.log(`[${sender.streamId}] Client has requested: ${request}`);
55305
+ ce_128_block_request_logger.log `[${sender.streamId}] Client has requested: ${request}`;
55248
55306
  const blocks = this.getBlockSequence(sender.streamId, request.headerHash, request.direction, request.maxBlocks);
55249
55307
  sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceFixLen(Block.Codec.View, blocks.length), blocks, this.chainSpec));
55250
55308
  sender.close();
@@ -55264,7 +55322,7 @@ class ClientHandler {
55264
55322
  throw new Error("Received an unexpected message from the server.");
55265
55323
  }
55266
55324
  const blocks = decoder_Decoder.decodeSequence(Block.Codec.View, message, this.chainSpec);
55267
- ce_128_block_request_logger.log(`[${sender.streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`);
55325
+ ce_128_block_request_logger.log `[${sender.streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`;
55268
55326
  this.promiseResolvers.get(sender.streamId)?.(blocks);
55269
55327
  this.promiseResolvers.delete(sender.streamId);
55270
55328
  }
@@ -55435,13 +55493,13 @@ class ce_129_state_request_Handler {
55435
55493
  }
55436
55494
  onStreamMessage(sender, message) {
55437
55495
  if (this.isServer) {
55438
- ce_129_state_request_logger.info(`[${sender.streamId}][server]: Received request.`);
55496
+ ce_129_state_request_logger.info `[${sender.streamId}][server]: Received request.`;
55439
55497
  if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined)
55440
55498
  return;
55441
55499
  const request = decoder_Decoder.decodeObject(StateRequest.Codec, message);
55442
55500
  const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
55443
55501
  const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
55444
- ce_129_state_request_logger.info(`[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`);
55502
+ ce_129_state_request_logger.info `[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
55445
55503
  sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
55446
55504
  sender.bufferAndSend(encoder_Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
55447
55505
  sender.close();
@@ -55449,11 +55507,11 @@ class ce_129_state_request_Handler {
55449
55507
  }
55450
55508
  if (!this.boundaryNodes.has(sender.streamId)) {
55451
55509
  this.boundaryNodes.set(sender.streamId, decoder_Decoder.decodeObject(descriptors_codec.sequenceVarLen(trieNodeCodec), message));
55452
- ce_129_state_request_logger.info(`[${sender.streamId}][client]: Received boundary nodes.`);
55510
+ ce_129_state_request_logger.info `[${sender.streamId}][client]: Received boundary nodes.`;
55453
55511
  return;
55454
55512
  }
55455
55513
  this.onResponse.get(sender.streamId)?.(decoder_Decoder.decodeObject(StateResponse.Codec, message));
55456
- ce_129_state_request_logger.info(`[${sender.streamId}][client]: Received state values.`);
55514
+ ce_129_state_request_logger.info `[${sender.streamId}][client]: Received state values.`;
55457
55515
  }
55458
55516
  onClose(streamId) {
55459
55517
  this.boundaryNodes.delete(streamId);
@@ -55510,7 +55568,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ServerHandler {
55510
55568
  }
55511
55569
  onStreamMessage(sender, message) {
55512
55570
  const ticketDistribution = Decoder.decodeObject(TicketDistributionRequest.Codec, message);
55513
- ce_131_ce_132_safrole_ticket_distribution_logger.log(`[${sender.streamId}][ce-${this.kind}] Received ticket for epoch ${ticketDistribution.epochIndex}`);
55571
+ ce_131_ce_132_safrole_ticket_distribution_logger.log `[${sender.streamId}][ce-${this.kind}] Received ticket for epoch ${ticketDistribution.epochIndex}`;
55514
55572
  this.onTicketReceived(ticketDistribution.epochIndex, ticketDistribution.ticket);
55515
55573
  sender.close();
55516
55574
  }
@@ -55522,7 +55580,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ClientHandler {
55522
55580
  this.kind = kind;
55523
55581
  }
55524
55582
  onStreamMessage(sender) {
55525
- ce_131_ce_132_safrole_ticket_distribution_logger.warn(`[${sender.streamId}][ce-${this.kind}] Unexpected message received. Closing.`);
55583
+ ce_131_ce_132_safrole_ticket_distribution_logger.warn `[${sender.streamId}][ce-${this.kind}] Unexpected message received. Closing.`;
55526
55584
  sender.close();
55527
55585
  }
55528
55586
  onClose() { }
@@ -55595,15 +55653,15 @@ class ce_133_work_package_submission_ServerHandler {
55595
55653
  class ce_133_work_package_submission_ClientHandler {
55596
55654
  kind = ce_133_work_package_submission_STREAM_KIND;
55597
55655
  onStreamMessage(sender) {
55598
- ce_133_work_package_submission_logger.warn(`[${sender.streamId}] Got unexpected message on CE-133 stream. Closing.`);
55656
+ ce_133_work_package_submission_logger.warn `[${sender.streamId}] Got unexpected message on CE-133 stream. Closing.`;
55599
55657
  sender.close();
55600
55658
  }
55601
55659
  onClose() { }
55602
55660
  sendWorkPackage(sender, coreIndex, workPackage, extrinsic) {
55603
55661
  const corePack = CoreWorkPackage.create({ coreIndex, workPackage });
55604
- ce_133_work_package_submission_logger.trace(`[${sender.streamId}] Sending work package: ${corePack}`);
55662
+ ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending work package: ${corePack}`;
55605
55663
  sender.bufferAndSend(Encoder.encodeObject(CoreWorkPackage.Codec, corePack));
55606
- ce_133_work_package_submission_logger.trace(`[${sender.streamId}] Sending extrinsics: ${workPackage.items}`);
55664
+ ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending extrinsics: ${workPackage.items}`;
55607
55665
  sender.bufferAndSend(Encoder.encodeObject(workItemExtrinsicsCodec(workPackage.items), extrinsic));
55608
55666
  // now close the connection
55609
55667
  sender.close();
@@ -55679,7 +55737,7 @@ class ce_134_work_package_sharing_ServerHandler {
55679
55737
  ce_134_work_package_sharing_ServerHandler.sendWorkReport(sender, workReportHash, signature);
55680
55738
  })
55681
55739
  .catch((error) => {
55682
- ce_134_work_package_sharing_logger.error(`[${streamId}] Error processing work package: ${error}`);
55740
+ ce_134_work_package_sharing_logger.error `[${streamId}] Error processing work package: ${error}`;
55683
55741
  this.onClose(streamId);
55684
55742
  });
55685
55743
  }
@@ -55696,7 +55754,7 @@ class ce_134_work_package_sharing_ClientHandler {
55696
55754
  throw new Error("Unexpected message received.");
55697
55755
  }
55698
55756
  const response = Decoder.decodeObject(WorkPackageSharingResponse.Codec, message);
55699
- ce_134_work_package_sharing_logger.info(`[${sender.streamId}] Received work report hash and signature.`);
55757
+ ce_134_work_package_sharing_logger.info `[${sender.streamId}] Received work report hash and signature.`;
55700
55758
  pendingRequest.resolve({ workReportHash: response.workReportHash, signature: response.signature });
55701
55759
  sender.close();
55702
55760
  }
@@ -55709,9 +55767,9 @@ class ce_134_work_package_sharing_ClientHandler {
55709
55767
  }
55710
55768
  async sendWorkPackage(sender, coreIndex, segmentsRootMappings, workPackageBundle) {
55711
55769
  const request = WorkPackageSharingRequest.create({ coreIndex, segmentsRootMappings });
55712
- ce_134_work_package_sharing_logger.trace(`[${sender.streamId}] Sending core index and segments-root mappings.`);
55770
+ ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending core index and segments-root mappings.`;
55713
55771
  sender.bufferAndSend(Encoder.encodeObject(WorkPackageSharingRequest.Codec, request));
55714
- ce_134_work_package_sharing_logger.trace(`[${sender.streamId}] Sending work package bundle.`);
55772
+ ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending work package bundle.`;
55715
55773
  sender.bufferAndSend(Encoder.encodeObject(WorkPackageBundleCodec, workPackageBundle));
55716
55774
  return new Promise((resolve, reject) => {
55717
55775
  this.pendingRequests.set(sender.streamId, { resolve, reject });
@@ -55771,7 +55829,7 @@ class ce_135_work_report_distribution_ServerHandler {
55771
55829
  }
55772
55830
  onStreamMessage(sender, message) {
55773
55831
  const guaranteedWorkReport = Decoder.decodeObject(GuaranteedWorkReport.Codec, message, this.chainSpec);
55774
- ce_135_work_report_distribution_logger.log(`[${sender.streamId}] Received guaranteed work report.`);
55832
+ ce_135_work_report_distribution_logger.log `[${sender.streamId}] Received guaranteed work report.`;
55775
55833
  this.onWorkReport(guaranteedWorkReport);
55776
55834
  sender.close();
55777
55835
  }
@@ -55784,12 +55842,12 @@ class ce_135_work_report_distribution_ClientHandler {
55784
55842
  this.chainSpec = chainSpec;
55785
55843
  }
55786
55844
  onStreamMessage(sender) {
55787
- ce_135_work_report_distribution_logger.warn(`[${sender.streamId}] Got unexpected message on CE-135 stream. Closing.`);
55845
+ ce_135_work_report_distribution_logger.warn `[${sender.streamId}] Got unexpected message on CE-135 stream. Closing.`;
55788
55846
  sender.close();
55789
55847
  }
55790
55848
  onClose() { }
55791
55849
  sendWorkReport(sender, workReport) {
55792
- ce_135_work_report_distribution_logger.trace(`[${sender.streamId}] Sending guaranteed work report.`);
55850
+ ce_135_work_report_distribution_logger.trace `[${sender.streamId}] Sending guaranteed work report.`;
55793
55851
  sender.bufferAndSend(Encoder.encodeObject(GuaranteedWorkReport.Codec, workReport, this.chainSpec));
55794
55852
  sender.close();
55795
55853
  }
@@ -55895,7 +55953,7 @@ class up_0_block_announcement_Handler {
55895
55953
  this.handshakes.set(streamId, handshake);
55896
55954
  // we didn't initiate this handshake, so let's respond
55897
55955
  if (!this.pendingHandshakes.delete(streamId)) {
55898
- up_0_block_announcement_logger.log(`[${streamId}] <-- responding with a handshake.`);
55956
+ up_0_block_announcement_logger.log `[${streamId}] <-- responding with a handshake.`;
55899
55957
  sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, this.getHandshake()));
55900
55958
  }
55901
55959
  this.onHandshake(streamId, handshake);
@@ -55903,7 +55961,7 @@ class up_0_block_announcement_Handler {
55903
55961
  }
55904
55962
  // it's just an announcement
55905
55963
  const annoucement = decoder_Decoder.decodeObject(Announcement.Codec, message, this.spec);
55906
- up_0_block_announcement_logger.log(`[${streamId}] --> got blocks announcement: ${annoucement.final}`);
55964
+ up_0_block_announcement_logger.log `[${streamId}] --> got blocks announcement: ${annoucement.final}`;
55907
55965
  this.onAnnouncement(streamId, annoucement);
55908
55966
  }
55909
55967
  onClose(streamId) {
@@ -55916,7 +55974,7 @@ class up_0_block_announcement_Handler {
55916
55974
  return;
55917
55975
  }
55918
55976
  const handshake = this.getHandshake();
55919
- up_0_block_announcement_logger.trace(`[${streamId}] <-- sending handshake`);
55977
+ up_0_block_announcement_logger.trace `[${streamId}] <-- sending handshake`;
55920
55978
  this.pendingHandshakes.set(sender.streamId, true);
55921
55979
  sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, handshake));
55922
55980
  }
@@ -55924,11 +55982,11 @@ class up_0_block_announcement_Handler {
55924
55982
  const { streamId } = sender;
55925
55983
  // only send announcement if we've handshaken
55926
55984
  if (this.handshakes.has(streamId)) {
55927
- up_0_block_announcement_logger.trace(`[${streamId}] <-- sending block announcement: ${annoucement.final}`);
55985
+ up_0_block_announcement_logger.trace `[${streamId}] <-- sending block announcement: ${annoucement.final}`;
55928
55986
  sender.bufferAndSend(encoder_Encoder.encodeObject(Announcement.Codec, annoucement, this.spec));
55929
55987
  }
55930
55988
  else {
55931
- up_0_block_announcement_logger.warn(`[${streamId}] <-- no handshake yet, skipping announcement.`);
55989
+ up_0_block_announcement_logger.warn `[${streamId}] <-- no handshake yet, skipping announcement.`;
55932
55990
  }
55933
55991
  }
55934
55992
  }
@@ -56045,7 +56103,7 @@ class SyncTask {
56045
56103
  onUp0Annoucement(peer, announcement) {
56046
56104
  const { hash, slot } = announcement.final;
56047
56105
  const bestHeader = hashHeader(announcement.header, this.spec);
56048
- sync_logger.info(`[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`);
56106
+ sync_logger.info `[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`;
56049
56107
  // NOTE [ToDr] Instead of having `Connections` store aux data perhaps
56050
56108
  // we should maintain that directly? However that would require
56051
56109
  // listening to peers connected/disconnected to perfrom some cleanups
@@ -56120,7 +56178,7 @@ class SyncTask {
56120
56178
  const peers = this.connections.getConnectedPeers();
56121
56179
  for (const peerInfo of peers) {
56122
56180
  this.streamManager.withStreamOfKind(peerInfo.peerId, up_0_block_announcement_STREAM_KIND, (handler, sender) => {
56123
- sync_logger.log(`[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`);
56181
+ sync_logger.log `[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`;
56124
56182
  handler.sendAnnouncement(sender, annoucement);
56125
56183
  return result_OK;
56126
56184
  });
@@ -56134,13 +56192,13 @@ class SyncTask {
56134
56192
  }
56135
56193
  if (res.error === BlockSequenceError.BlockOnFork) {
56136
56194
  // seems that peer is requesting syncing a fork from us, let's bail.
56137
- sync_logger.warn(`[${peer.id}] <-- Invalid block sequence request: ${startHash} is on a fork.`);
56195
+ sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} is on a fork.`;
56138
56196
  return [];
56139
56197
  }
56140
56198
  if (res.error === BlockSequenceError.NoStartBlock) {
56141
56199
  // we don't know about that block at all, so let's just bail.
56142
56200
  // we should probably penalize the peer for sending BS?
56143
- sync_logger.warn(`[${peer.id}] <-- Invalid block sequence request: ${startHash} missing header or extrinsic.`);
56201
+ sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} missing header or extrinsic.`;
56144
56202
  return [];
56145
56203
  }
56146
56204
  debug_assertNever(res.error);
@@ -56160,10 +56218,10 @@ class SyncTask {
56160
56218
  // figure out where others are at
56161
56219
  const othersBest = this.othersBest;
56162
56220
  const blocksToSync = othersBest.slot - ourBestSlot;
56163
- sync_logger.trace(`Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`);
56221
+ sync_logger.trace `Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`;
56164
56222
  if (blocksToSync < 1) {
56165
56223
  this.connections.getPeerCount();
56166
- sync_logger.trace(`No new blocks. ${peerCount} peers.`);
56224
+ sync_logger.trace `No new blocks. ${peerCount} peers.`;
56167
56225
  return {
56168
56226
  kind: SyncResult.NoNewBlocks,
56169
56227
  ours: ourBestSlot,
@@ -56171,7 +56229,7 @@ class SyncTask {
56171
56229
  };
56172
56230
  }
56173
56231
  const requested = [];
56174
- sync_logger.log(`Sync ${blocksToSync} blocks from ${peerCount} peers.`);
56232
+ sync_logger.log `Sync ${blocksToSync} blocks from ${peerCount} peers.`;
56175
56233
  // NOTE [ToDr] We might be requesting the same blocks from many peers
56176
56234
  // which isn't very optimal, but for now: 🤷
56177
56235
  //
@@ -56197,12 +56255,12 @@ class SyncTask {
56197
56255
  // request as much blocks from that peer as possible.
56198
56256
  this.streamManager.withNewStream(peerInfo.peerRef, STREAM_KIND, (handler, sender) => {
56199
56257
  handleAsyncErrors(async () => {
56200
- sync_logger.log(`Fetching blocks from ${peerInfo.peerId}.`);
56258
+ sync_logger.log `[${peerInfo.peerId}] <-- Fetching ${bestSlot - ourBestSlot} blocks (${bestHash})`;
56201
56259
  const blocks = await handler.requestBlockSequence(sender, bestHash, Direction.DescIncl, numbers_tryAsU32(bestSlot - ourBestSlot));
56202
56260
  blocks.reverse();
56203
56261
  this.onNewBlocks(blocks, peerInfo.peerId);
56204
56262
  }, (e) => {
56205
- sync_logger.warn(`[${peerInfo.peerId}] --> requesting blocks to import: ${e}`);
56263
+ sync_logger.warn `[${peerInfo.peerId}] <-- requesting blocks to import: ${e}`;
56206
56264
  });
56207
56265
  return result_OK;
56208
56266
  });
@@ -56276,7 +56334,7 @@ function setupPeerListeners(syncTask, network, streamManager) {
56276
56334
  // whenever the peer wants to open a stream with us, let's handle that.
56277
56335
  peer.addOnIncomingStream((stream) => {
56278
56336
  handleAsyncErrors(() => streamManager.onIncomingStream(peer, stream), (e) => {
56279
- network_logger.error(`[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`);
56337
+ network_logger.error `[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`;
56280
56338
  peer.disconnect();
56281
56339
  });
56282
56340
  return result_OK;
@@ -56526,10 +56584,10 @@ class FuzzTarget {
56526
56584
  async onSocketMessage(msg) {
56527
56585
  // attempt to decode the messsage
56528
56586
  const message = decoder_Decoder.decodeObject(messageCodec, msg, this.spec);
56529
- handler_logger.log(`[${message.type}] incoming message`);
56587
+ handler_logger.log `[${message.type}] incoming message`;
56530
56588
  await processAndRespond(this.spec, message, this.msgHandler, this.sender).catch((e) => {
56531
- handler_logger.error(`Error while processing fuzz v0 message: ${e}`);
56532
- handler_logger.error(e);
56589
+ handler_logger.error `Error while processing fuzz v0 message: ${e}`;
56590
+ handler_logger.error `${e}`;
56533
56591
  this.sender.close();
56534
56592
  });
56535
56593
  return;
@@ -56570,17 +56628,17 @@ class FuzzTarget {
56570
56628
  break;
56571
56629
  }
56572
56630
  case MessageType.State: {
56573
- handler_logger.log(`--> Received unexpected 'State' message from the fuzzer. Closing.`);
56631
+ handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
56574
56632
  sender.close();
56575
56633
  return;
56576
56634
  }
56577
56635
  case MessageType.StateRoot: {
56578
- handler_logger.log(`--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`);
56636
+ handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
56579
56637
  sender.close();
56580
56638
  return;
56581
56639
  }
56582
56640
  default: {
56583
- handler_logger.log(`--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`);
56641
+ handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
56584
56642
  sender.close();
56585
56643
  try {
56586
56644
  debug_assertNever(message);
@@ -56591,17 +56649,17 @@ class FuzzTarget {
56591
56649
  }
56592
56650
  }
56593
56651
  if (response !== null) {
56594
- handler_logger.trace(`<-- responding with: ${response.type}`);
56652
+ handler_logger.trace `<-- responding with: ${response.type}`;
56595
56653
  const encoded = encoder_Encoder.encodeObject(messageCodec, response, spec);
56596
56654
  sender.send(encoded);
56597
56655
  }
56598
56656
  else {
56599
- handler_logger.warn(`<-- no response generated for: ${message.type}`);
56657
+ handler_logger.warn `<-- no response generated for: ${message.type}`;
56600
56658
  }
56601
56659
  }
56602
56660
  }
56603
56661
  onClose({ error }) {
56604
- handler_logger.log(`Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`);
56662
+ handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
56605
56663
  }
56606
56664
  }
56607
56665
 
@@ -56855,14 +56913,14 @@ class handler_FuzzTarget {
56855
56913
  // attempt to decode the messsage
56856
56914
  try {
56857
56915
  const message = decoder_Decoder.decodeObject(types_messageCodec, msg, this.spec);
56858
- v1_handler_logger.log(`[${message.type}] incoming message`);
56916
+ v1_handler_logger.log `[${message.type}] incoming message`;
56859
56917
  await this.processAndRespond(message);
56860
56918
  }
56861
56919
  catch (e) {
56862
- v1_handler_logger.error(`Error while processing fuzz v1 message: ${e}`);
56863
- v1_handler_logger.error(`${e}`);
56920
+ v1_handler_logger.error `Error while processing fuzz v1 message: ${e}`;
56921
+ v1_handler_logger.error `${e}`;
56864
56922
  if (e instanceof Error) {
56865
- v1_handler_logger.error(e.stack ?? "");
56923
+ v1_handler_logger.error `${e.stack ?? ""}`;
56866
56924
  }
56867
56925
  this.sender.close();
56868
56926
  }
@@ -56873,7 +56931,7 @@ class handler_FuzzTarget {
56873
56931
  case types_MessageType.PeerInfo: {
56874
56932
  // only support V1
56875
56933
  if (message.value.fuzzVersion !== 1) {
56876
- v1_handler_logger.warn(`Unsupported fuzzer protocol version: ${message.value.fuzzVersion}. Closing`);
56934
+ v1_handler_logger.warn `Unsupported fuzzer protocol version: ${message.value.fuzzVersion}. Closing`;
56877
56935
  this.sender.close();
56878
56936
  return;
56879
56937
  }
@@ -56881,9 +56939,9 @@ class handler_FuzzTarget {
56881
56939
  const ourPeerInfo = await this.msgHandler.getPeerInfo(message.value);
56882
56940
  // Calculate session features (intersection of both peer features)
56883
56941
  this.sessionFeatures = message.value.features & ourPeerInfo.features;
56884
- v1_handler_logger.info(`Handshake completed. Shared features: 0b${this.sessionFeatures.toString(2)}`);
56885
- v1_handler_logger.log(`Feature ancestry: ${(this.sessionFeatures & Features.Ancestry) !== 0}`);
56886
- v1_handler_logger.log(`Feature fork: ${(this.sessionFeatures & Features.Fork) !== 0}`);
56942
+ v1_handler_logger.info `Handshake completed. Shared features: 0b${this.sessionFeatures.toString(2)}`;
56943
+ v1_handler_logger.log `Feature ancestry: ${(this.sessionFeatures & Features.Ancestry) !== 0}`;
56944
+ v1_handler_logger.log `Feature fork: ${(this.sessionFeatures & Features.Fork) !== 0}`;
56887
56945
  response = {
56888
56946
  type: types_MessageType.PeerInfo,
56889
56947
  value: ourPeerInfo,
@@ -56923,22 +56981,22 @@ class handler_FuzzTarget {
56923
56981
  break;
56924
56982
  }
56925
56983
  case types_MessageType.StateRoot: {
56926
- v1_handler_logger.log(`--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`);
56984
+ v1_handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
56927
56985
  this.sender.close();
56928
56986
  return;
56929
56987
  }
56930
56988
  case types_MessageType.State: {
56931
- v1_handler_logger.log(`--> Received unexpected 'State' message from the fuzzer. Closing.`);
56989
+ v1_handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
56932
56990
  this.sender.close();
56933
56991
  return;
56934
56992
  }
56935
56993
  case types_MessageType.Error: {
56936
- v1_handler_logger.log(`--> Received unexpected 'Error' message from the fuzzer. Closing.`);
56994
+ v1_handler_logger.log `--> Received unexpected 'Error' message from the fuzzer. Closing.`;
56937
56995
  this.sender.close();
56938
56996
  return;
56939
56997
  }
56940
56998
  default: {
56941
- v1_handler_logger.log(`--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`);
56999
+ v1_handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
56942
57000
  this.sender.close();
56943
57001
  try {
56944
57002
  debug_assertNever(message);
@@ -56949,16 +57007,16 @@ class handler_FuzzTarget {
56949
57007
  }
56950
57008
  }
56951
57009
  if (response !== null) {
56952
- v1_handler_logger.trace(`<-- responding with: ${response.type}`);
57010
+ v1_handler_logger.trace `<-- responding with: ${response.type}`;
56953
57011
  const encoded = encoder_Encoder.encodeObject(types_messageCodec, response, this.spec);
56954
57012
  this.sender.send(encoded);
56955
57013
  }
56956
57014
  else {
56957
- v1_handler_logger.warn(`<-- no response generated for: ${message.type}`);
57015
+ v1_handler_logger.warn `<-- no response generated for: ${message.type}`;
56958
57016
  }
56959
57017
  }
56960
57018
  onClose({ error }) {
56961
- v1_handler_logger.log(`Closing the v1 handler. Reason: ${error !== undefined ? error.message : "close"}.`);
57019
+ v1_handler_logger.log `Closing the v1 handler. Reason: ${error !== undefined ? error.message : "close"}.`;
56962
57020
  }
56963
57021
  /** Check if a specific feature is enabled in the session */
56964
57022
  hasFeature(feature) {
@@ -57004,7 +57062,7 @@ function startIpcServer(name, newMessageHandler) {
57004
57062
  const logger = Logger.new(import.meta.filename, "ext-ipc");
57005
57063
  // Create the IPC server
57006
57064
  const server = (0,external_node_net_namespaceObject.createServer)((socket) => {
57007
- logger.log("Client connected");
57065
+ logger.log `Client connected`;
57008
57066
  const messageHandler = newMessageHandler(new IpcSender(socket));
57009
57067
  // Handle incoming data from the client
57010
57068
  socket.on("data", handleMessageFragmentation(async (data) => {
@@ -57016,23 +57074,23 @@ function startIpcServer(name, newMessageHandler) {
57016
57074
  await messageHandler.onSocketMessage(data);
57017
57075
  }
57018
57076
  catch (e) {
57019
- logger.error(`Received invalid data on socket: ${e}. Closing connection.`);
57077
+ logger.error `Received invalid data on socket: ${e}. Closing connection.`;
57020
57078
  socket.end();
57021
57079
  }
57022
57080
  finally {
57023
57081
  socket.resume();
57024
57082
  }
57025
57083
  }, () => {
57026
- logger.error("Received too much data on socket. Closing connection.");
57084
+ logger.error `Received too much data on socket. Closing connection.`;
57027
57085
  socket.end();
57028
57086
  }));
57029
57087
  // Handle client disconnection
57030
57088
  socket.on("end", () => {
57031
- logger.log("Client disconnected");
57089
+ logger.log `Client disconnected`;
57032
57090
  messageHandler.onClose({});
57033
57091
  });
57034
57092
  socket.on("error", (error) => {
57035
- logger.error(`Socket error: ${error}`);
57093
+ logger.error `Socket error: ${error}`;
57036
57094
  messageHandler.onClose({ error });
57037
57095
  socket.end();
57038
57096
  });
@@ -57047,14 +57105,14 @@ function startIpcServer(name, newMessageHandler) {
57047
57105
  path: socketPath,
57048
57106
  signal: controller.signal,
57049
57107
  }, () => {
57050
- logger.log(`IPC server is listening at ${socketPath}`);
57108
+ logger.log `IPC server is listening at ${socketPath}`;
57051
57109
  });
57052
57110
  // Handle server errors
57053
57111
  server.on("error", (err) => {
57054
57112
  throw err;
57055
57113
  });
57056
57114
  return () => {
57057
- logger.info("Closing IPC server.");
57115
+ logger.info `Closing IPC server.`;
57058
57116
  // stop accepting new connections
57059
57117
  server.close();
57060
57118
  // abort the server
@@ -57199,7 +57257,7 @@ class JamnpIpcHandler {
57199
57257
  // decode the message as `StreamEnvelope`
57200
57258
  const envelope = decoder_Decoder.decodeObject(StreamEnvelope.Codec, msg);
57201
57259
  const streamId = envelope.streamId;
57202
- jamnp_handler_logger.log(`[${streamId}] incoming message: ${envelope.type} ${envelope.data}`);
57260
+ jamnp_handler_logger.log `[${streamId}] incoming message: ${envelope.type} ${envelope.data}`;
57203
57261
  // check if this is a already known stream id
57204
57262
  const streamHandler = this.streams.get(streamId);
57205
57263
  const streamSender = new EnvelopeSender(streamId, this.sender);
@@ -57207,13 +57265,13 @@ class JamnpIpcHandler {
57207
57265
  if (streamHandler === undefined) {
57208
57266
  // closing or message of unknown stream - ignore.
57209
57267
  if (envelope.type !== StreamEnvelopeType.Open) {
57210
- jamnp_handler_logger.warn(`[${streamId}] (unknown) got invalid type ${envelope.type}.`);
57268
+ jamnp_handler_logger.warn `[${streamId}] (unknown) got invalid type ${envelope.type}.`;
57211
57269
  return;
57212
57270
  }
57213
57271
  const newStream = decoder_Decoder.decodeObject(NewStream.Codec, envelope.data);
57214
57272
  const handler = this.streamHandlers.get(newStream.streamByte);
57215
57273
  if (handler !== undefined) {
57216
- jamnp_handler_logger.log(`[${streamId}] new stream for ${handler.kind}`);
57274
+ jamnp_handler_logger.log `[${streamId}] new stream for ${handler.kind}`;
57217
57275
  // insert the stream
57218
57276
  this.streams.set(streamId, handler);
57219
57277
  // Just send back the same stream byte.
@@ -57234,7 +57292,7 @@ class JamnpIpcHandler {
57234
57292
  if (envelope.type !== StreamEnvelopeType.Msg) {
57235
57293
  // display a warning but only if the stream was not pending for confirmation.
57236
57294
  if (!this.pendingStreams.delete(streamId)) {
57237
- jamnp_handler_logger.warn(`[${streamId}] got invalid type ${envelope.type}.`);
57295
+ jamnp_handler_logger.warn `[${streamId}] got invalid type ${envelope.type}.`;
57238
57296
  }
57239
57297
  return;
57240
57298
  }
@@ -57243,7 +57301,7 @@ class JamnpIpcHandler {
57243
57301
  }
57244
57302
  /** Notify about termination of the underlying socket. */
57245
57303
  onClose({ error }) {
57246
- jamnp_handler_logger.log(`Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`);
57304
+ jamnp_handler_logger.log `Closing the handler. Reason: ${error !== undefined ? error.message : "close"}.`;
57247
57305
  // Socket closed - we should probably clear everything.
57248
57306
  for (const [streamId, handler] of this.streams.entries()) {
57249
57307
  handler.onClose(streamId, error === undefined);
@@ -57260,7 +57318,7 @@ class JamnpIpcHandler {
57260
57318
  }
57261
57319
  /** Wait for the handler to be finished either via close or error. */
57262
57320
  waitForEnd() {
57263
- jamnp_handler_logger.log("Waiting for the handler to be closed.");
57321
+ jamnp_handler_logger.log `Waiting for the handler to be closed.`;
57264
57322
  return this.onEnd.listen;
57265
57323
  }
57266
57324
  }
@@ -57389,7 +57447,7 @@ class FuzzHandler {
57389
57447
  async getSerializedState(value) {
57390
57448
  const state = await this.api.getPostSerializedState(value);
57391
57449
  if (state === null) {
57392
- ipc_logger.warn(`Fuzzer requested non-existing state for: ${value}`);
57450
+ ipc_logger.warn `Fuzzer requested non-existing state for: ${value}`;
57393
57451
  return [];
57394
57452
  }
57395
57453
  return Array.from(state).map(([key, value]) => {
@@ -57415,7 +57473,7 @@ class FuzzHandler {
57415
57473
  if (res.isOk) {
57416
57474
  return res;
57417
57475
  }
57418
- ipc_logger.log(`Rejecting block with error: ${res.error}. ${res.details}`);
57476
+ ipc_logger.log `Rejecting block with error: ${res.error}. ${res.details}`;
57419
57477
  return result_Result.error(ErrorMessage.create({ message: res.error }));
57420
57478
  }
57421
57479
  async importBlockV0(value) {
@@ -57423,11 +57481,11 @@ class FuzzHandler {
57423
57481
  if (res.isOk) {
57424
57482
  return res.ok;
57425
57483
  }
57426
- ipc_logger.warn(`Fuzzer sent incorrect block with error ${res.error}. ${res.details}`);
57484
+ ipc_logger.warn `Fuzzer sent incorrect block with error ${res.error}. ${res.details}`;
57427
57485
  return this.api.getBestStateRootHash();
57428
57486
  }
57429
57487
  async getPeerInfo(value) {
57430
- ipc_logger.info(`Fuzzer ${value} connected.`);
57488
+ ipc_logger.info `Fuzzer ${value} connected.`;
57431
57489
  return types_PeerInfo.create({
57432
57490
  name: this.api.nodeName,
57433
57491
  appVersion: this.api.nodeVersion,
@@ -57438,7 +57496,7 @@ class FuzzHandler {
57438
57496
  });
57439
57497
  }
57440
57498
  async getPeerInfoV0(value) {
57441
- ipc_logger.info(`Fuzzer ${value} connected.`);
57499
+ ipc_logger.info `Fuzzer ${value} connected.`;
57442
57500
  return PeerInfo.create({
57443
57501
  name: this.api.nodeName,
57444
57502
  appVersion: this.api.nodeVersion,
@@ -57471,7 +57529,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
57471
57529
  Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
57472
57530
  const machine = networkStateMachine();
57473
57531
  const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
57474
- channel.then((channel) => jam_network_main(channel)).catch((e) => jam_network_logger.error(e));
57532
+ channel.then((channel) => jam_network_main(channel)).catch((e) => jam_network_logger.error `${e}`);
57475
57533
  }
57476
57534
  /**
57477
57535
  * JAM networking worker.
@@ -57482,7 +57540,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
57482
57540
  */
57483
57541
  async function jam_network_main(channel) {
57484
57542
  await initAll();
57485
- jam_network_logger.trace(`🛜 Network starting ${channel.currentState()}`);
57543
+ jam_network_logger.trace `🛜 Network starting ${channel.currentState()}`;
57486
57544
  // Await the configuration object
57487
57545
  // TODO [ToDr] The whole state machine needs to die.
57488
57546
  const ready = channel.currentState().stateName !== "ready(network)"
@@ -57493,7 +57551,7 @@ async function jam_network_main(channel) {
57493
57551
  const key = await ed25519_privateKey(config.key);
57494
57552
  const lmdb = new LmdbRoot(config.genericConfig.dbPath);
57495
57553
  const blocks = new LmdbBlocks(config.genericConfig.chainSpec, lmdb);
57496
- jam_network_logger.info(`🛜 Listening at ${config.host}:${config.port}`);
57554
+ jam_network_logger.info `🛜 Listening at ${config.host}:${config.port}`;
57497
57555
  const network = await setup({
57498
57556
  host: config.host,
57499
57557
  port: config.port,
@@ -57506,7 +57564,7 @@ async function jam_network_main(channel) {
57506
57564
  ready.waitForState("finished").then(() => network.network.stop());
57507
57565
  await network.network.start();
57508
57566
  });
57509
- jam_network_logger.info("🛜 Network worker finished. Closing channel.");
57567
+ jam_network_logger.info `🛜 Network worker finished. Closing channel.`;
57510
57568
  // Close the comms to gracefuly close the app.
57511
57569
  finished.currentState().close(channel);
57512
57570
  }
@@ -57534,7 +57592,7 @@ async function startNetwork(config) {
57534
57592
  }
57535
57593
 
57536
57594
  ;// CONCATENATED MODULE: ./packages/jam/node/package.json
57537
- const package_namespaceObject = {"rE":"0.1.1"};
57595
+ const package_namespaceObject = {"rE":"0.1.2"};
57538
57596
  ;// CONCATENATED MODULE: ./packages/jam/node/main.ts
57539
57597
 
57540
57598
 
@@ -57552,8 +57610,8 @@ async function main_main(config, withRelPath) {
57552
57610
  throw new Error("The main binary cannot be running as a Worker!");
57553
57611
  }
57554
57612
  await initAll();
57555
- common_logger.info(`🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`);
57556
- common_logger.info(`🎸 Starting node: ${config.nodeName}.`);
57613
+ common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
57614
+ common_logger.info `🎸 Starting node: ${config.nodeName}.`;
57557
57615
  const chainSpec = getChainSpec(config.node.flavor);
57558
57616
  const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
57559
57617
  // Initialize the database with genesis state and block if there isn't one.
@@ -57596,30 +57654,30 @@ async function main_main(config, withRelPath) {
57596
57654
  return importer.finish(port);
57597
57655
  });
57598
57656
  await importerFinished.currentState().waitForWorkerToFinish();
57599
- common_logger.log("[main] ☠️ Closing the extensions");
57657
+ common_logger.log `[main] ☠️ Closing the extensions`;
57600
57658
  closeExtensions();
57601
- common_logger.log("[main] ☠️ Closing the authorship module");
57659
+ common_logger.log `[main] ☠️ Closing the authorship module`;
57602
57660
  closeAuthorship();
57603
- common_logger.log("[main] ☠️ Closing the networking module");
57661
+ common_logger.log `[main] ☠️ Closing the networking module`;
57604
57662
  closeNetwork();
57605
- common_logger.log("[main] 🛢️ Closing the database");
57663
+ common_logger.log `[main] 🛢️ Closing the database`;
57606
57664
  await rootDb.close();
57607
- common_logger.info("[main] ✅ Done.");
57665
+ common_logger.info `[main] ✅ Done.`;
57608
57666
  },
57609
57667
  };
57610
57668
  return api;
57611
57669
  }
57612
57670
  const initAuthorship = async (importerReady, isAuthoring, config) => {
57613
57671
  if (!isAuthoring) {
57614
- common_logger.log("✍️ Authorship off: disabled");
57672
+ common_logger.log `✍️ Authorship off: disabled`;
57615
57673
  return () => Promise.resolve();
57616
57674
  }
57617
- common_logger.info("✍️ Starting block generator.");
57675
+ common_logger.info `✍️ Starting block generator.`;
57618
57676
  const { generator, finish } = await startBlockGenerator(config);
57619
57677
  // relay blocks from generator to importer
57620
57678
  importerReady.doUntil("finished", async (importer, port) => {
57621
57679
  generator.currentState().onBlock.on((b) => {
57622
- common_logger.log(`✍️ Produced block. Size: [${b.length}]`);
57680
+ common_logger.log `✍️ Produced block. Size: [${b.length}]`;
57623
57681
  importer.sendBlock(port, b);
57624
57682
  });
57625
57683
  });
@@ -57627,7 +57685,7 @@ const initAuthorship = async (importerReady, isAuthoring, config) => {
57627
57685
  };
57628
57686
  const initNetwork = async (importerReady, workerConfig, genesisHeaderHash, networkConfig, bestHeader) => {
57629
57687
  if (networkConfig === null) {
57630
- common_logger.log("🛜 Networking off: no config");
57688
+ common_logger.log `🛜 Networking off: no config`;
57631
57689
  return () => Promise.resolve();
57632
57690
  }
57633
57691
  const { key, host, port, bootnodes } = networkConfig;
@@ -58833,16 +58891,12 @@ class PartiallyUpdatedState {
58833
58891
  *
58834
58892
  * NOTE the info may be updated compared to what is in the state.
58835
58893
  *
58836
- * Takes into account newly created services as well.
58894
+ * Takes into account ejected and newly created services as well.
58837
58895
  */
58838
58896
  getServiceInfo(destination) {
58839
58897
  if (destination === null) {
58840
58898
  return null;
58841
58899
  }
58842
- const isEjected = this.stateUpdate.services.servicesRemoved.some((x) => x === destination);
58843
- if (isEjected) {
58844
- return null;
58845
- }
58846
58900
  const maybeNewService = this.stateUpdate.services.servicesUpdates.find((update) => update.serviceId === destination);
58847
58901
  if (maybeNewService !== undefined) {
58848
58902
  return maybeNewService.action.account;
@@ -59577,7 +59631,7 @@ class AccumulateExternalities {
59577
59631
  /** https://graypaper.fluffylabs.dev/#/7e6ff6a/362802362d02?v=0.6.7 */
59578
59632
  const validatorsManager = this.updatedState.getPrivilegedServices().validatorsManager;
59579
59633
  if (validatorsManager !== this.currentServiceId) {
59580
- accumulate_externalities_logger.trace(`Current service id (${this.currentServiceId}) is not a validators manager. (expected: ${validatorsManager}) and cannot update validators data. Ignoring`);
59634
+ accumulate_externalities_logger.trace `Current service id (${this.currentServiceId}) is not a validators manager. (expected: ${validatorsManager}) and cannot update validators data. Ignoring`;
59581
59635
  return result_Result.error(UnprivilegedError);
59582
59636
  }
59583
59637
  this.updatedState.stateUpdate.validatorsData = validatorsData;
@@ -59592,11 +59646,11 @@ class AccumulateExternalities {
59592
59646
  // NOTE `coreIndex` is already verified in the HC, so this is infallible.
59593
59647
  const currentAuthManager = this.updatedState.getPrivilegedServices().authManager[coreIndex];
59594
59648
  if (currentAuthManager !== this.currentServiceId) {
59595
- accumulate_externalities_logger.trace(`Current service id (${this.currentServiceId}) is not an auth manager of core ${coreIndex} (expected: ${currentAuthManager}) and cannot update authorization queue. Ignoring`);
59649
+ accumulate_externalities_logger.trace `Current service id (${this.currentServiceId}) is not an auth manager of core ${coreIndex} (expected: ${currentAuthManager}) and cannot update authorization queue. Ignoring`;
59596
59650
  return result_Result.error(UpdatePrivilegesError.UnprivilegedService);
59597
59651
  }
59598
59652
  if (authManager === null && Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)) {
59599
- accumulate_externalities_logger.trace("The new auth manager is not a valid service id. Ignoring");
59653
+ accumulate_externalities_logger.trace `The new auth manager is not a valid service id. Ignoring`;
59600
59654
  return result_Result.error(UpdatePrivilegesError.InvalidServiceId);
59601
59655
  }
59602
59656
  this.updatedState.stateUpdate.authorizationQueues.set(coreIndex, authQueue);
@@ -60477,7 +60531,7 @@ class Assign {
60477
60531
  const memoryReadResult = memory.loadInto(res, authorizationQueueStart);
60478
60532
  // error while reading the memory.
60479
60533
  if (memoryReadResult.isError) {
60480
- logger_logger.trace("ASSIGN() <- PANIC");
60534
+ logger_logger.trace `ASSIGN() <- PANIC`;
60481
60535
  return PvmExecution.Panic;
60482
60536
  }
60483
60537
  if (maybeCoreIndex >= this.chainSpec.coresCount) {
@@ -60492,18 +60546,18 @@ class Assign {
60492
60546
  const result = this.partialState.updateAuthorizationQueue(coreIndex, fixedSizeAuthQueue, authManager);
60493
60547
  if (result.isOk) {
60494
60548
  regs.set(IN_OUT_REG, HostCallResult.OK);
60495
- logger_logger.trace(`ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- OK`);
60549
+ logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- OK`;
60496
60550
  return;
60497
60551
  }
60498
60552
  const e = result.error;
60499
60553
  if (e === UpdatePrivilegesError.UnprivilegedService) {
60500
60554
  regs.set(IN_OUT_REG, HostCallResult.HUH);
60501
- logger_logger.trace(`ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`);
60555
+ logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
60502
60556
  return;
60503
60557
  }
60504
60558
  if (e === UpdatePrivilegesError.InvalidServiceId) {
60505
60559
  regs.set(IN_OUT_REG, HostCallResult.WHO);
60506
- logger_logger.trace(`ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`);
60560
+ logger_logger.trace `ASSIGN(${coreIndex}, ${fixedSizeAuthQueue}) <- HUH`;
60507
60561
  return;
60508
60562
  }
60509
60563
  debug_assertNever(e);
@@ -60569,7 +60623,7 @@ class Bless {
60569
60623
  decoder.resetTo(0);
60570
60624
  const memoryReadResult = memory.loadInto(result, memIndex);
60571
60625
  if (memoryReadResult.isError) {
60572
- logger_logger.trace(`BLESS(${manager}, ${validator}) <- PANIC`);
60626
+ logger_logger.trace `BLESS(${manager}, ${validator}) <- PANIC`;
60573
60627
  return PvmExecution.Panic;
60574
60628
  }
60575
60629
  const { serviceId, gas } = decoder.object(serviceIdAndGasCodec);
@@ -60582,24 +60636,24 @@ class Bless {
60582
60636
  const authorizersDecoder = decoder_Decoder.fromBlob(res);
60583
60637
  const memoryReadResult = memory.loadInto(res, authorization);
60584
60638
  if (memoryReadResult.isError) {
60585
- logger_logger.trace(`BLESS(${manager}, ${validator}, ${autoAccumulateEntries}) <- PANIC`);
60639
+ logger_logger.trace `BLESS(${manager}, ${validator}, ${autoAccumulateEntries}) <- PANIC`;
60586
60640
  return PvmExecution.Panic;
60587
60641
  }
60588
60642
  const authorizers = tryAsPerCore(authorizersDecoder.sequenceFixLen(descriptors_codec.u32.asOpaque(), this.chainSpec.coresCount), this.chainSpec);
60589
60643
  const updateResult = this.partialState.updatePrivilegedServices(manager, authorizers, validator, autoAccumulateEntries);
60590
60644
  if (updateResult.isOk) {
60591
- logger_logger.trace(`BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- OK`);
60645
+ logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- OK`;
60592
60646
  regs.set(bless_IN_OUT_REG, HostCallResult.OK);
60593
60647
  return;
60594
60648
  }
60595
60649
  const e = updateResult.error;
60596
60650
  if (e === UpdatePrivilegesError.UnprivilegedService) {
60597
- logger_logger.trace(`BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- HUH`);
60651
+ logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- HUH`;
60598
60652
  regs.set(bless_IN_OUT_REG, HostCallResult.HUH);
60599
60653
  return;
60600
60654
  }
60601
60655
  if (e === UpdatePrivilegesError.InvalidServiceId) {
60602
- logger_logger.trace(`BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- WHO`);
60656
+ logger_logger.trace `BLESS(${manager}, ${authorizers}, ${validator}, ${autoAccumulateEntries}) <- WHO`;
60603
60657
  regs.set(bless_IN_OUT_REG, HostCallResult.WHO);
60604
60658
  return;
60605
60659
  }
@@ -60629,7 +60683,7 @@ class GasHostCall {
60629
60683
  }
60630
60684
  execute(gas, regs) {
60631
60685
  const gasValue = gas.get();
60632
- logger_logger.trace(`GAS <- ${gasValue}`);
60686
+ logger_logger.trace `GAS <- ${gasValue}`;
60633
60687
  regs.set(7, numbers_tryAsU64(gasValue));
60634
60688
  return Promise.resolve(undefined);
60635
60689
  }
@@ -60661,7 +60715,7 @@ class Checkpoint {
60661
60715
  async execute(gas, regs) {
60662
60716
  await this.gasHostCall.execute(gas, regs);
60663
60717
  this.partialState.checkpoint();
60664
- logger_logger.trace("CHECKPOINT()");
60718
+ logger_logger.trace `CHECKPOINT()`;
60665
60719
  return;
60666
60720
  }
60667
60721
  }
@@ -60700,18 +60754,18 @@ class Designate {
60700
60754
  const memoryReadResult = memory.loadInto(res, validatorsStart);
60701
60755
  // error while reading the memory.
60702
60756
  if (memoryReadResult.isError) {
60703
- logger_logger.trace("DESIGNATE() <- PANIC");
60757
+ logger_logger.trace `DESIGNATE() <- PANIC`;
60704
60758
  return PvmExecution.Panic;
60705
60759
  }
60706
60760
  const decoder = decoder_Decoder.fromBlob(res);
60707
60761
  const validatorsData = decoder.sequenceFixLen(ValidatorData.Codec, this.chainSpec.validatorsCount);
60708
60762
  const result = this.partialState.updateValidatorsData(tryAsPerValidator(validatorsData, this.chainSpec));
60709
60763
  if (result.isError) {
60710
- logger_logger.trace(`DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- HUH`);
60764
+ logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- HUH`;
60711
60765
  regs.set(designate_IN_OUT_REG, HostCallResult.HUH);
60712
60766
  }
60713
60767
  else {
60714
- logger_logger.trace(`DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- OK`);
60768
+ logger_logger.trace `DESIGNATE([${validatorsData[0]}, ${validatorsData[1]}, ...]) <- OK`;
60715
60769
  regs.set(designate_IN_OUT_REG, HostCallResult.OK);
60716
60770
  }
60717
60771
  }
@@ -60752,17 +60806,17 @@ class Eject {
60752
60806
  const previousCodeHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
60753
60807
  const memoryReadResult = memory.loadInto(previousCodeHash.raw, preimageHashStart);
60754
60808
  if (memoryReadResult.isError) {
60755
- logger_logger.trace(`EJECT(${serviceId}) <- PANIC`);
60809
+ logger_logger.trace `EJECT(${serviceId}) <- PANIC`;
60756
60810
  return PvmExecution.Panic;
60757
60811
  }
60758
60812
  // cannot eject self
60759
60813
  if (serviceId === this.currentServiceId) {
60760
60814
  regs.set(eject_IN_OUT_REG, HostCallResult.WHO);
60761
- logger_logger.trace(`EJECT(${serviceId}, ${previousCodeHash}) <- WHO`);
60815
+ logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- WHO`;
60762
60816
  return;
60763
60817
  }
60764
60818
  const result = this.partialState.eject(serviceId, previousCodeHash);
60765
- logger_logger.trace(`EJECT(${serviceId}, ${previousCodeHash}) <- ${resultToString(result)}`);
60819
+ logger_logger.trace `EJECT(${serviceId}, ${previousCodeHash}) <- ${resultToString(result)}`;
60766
60820
  // All good!
60767
60821
  if (result.isOk) {
60768
60822
  regs.set(eject_IN_OUT_REG, HostCallResult.OK);
@@ -60814,11 +60868,11 @@ class Forget {
60814
60868
  const memoryReadResult = memory.loadInto(hash.raw, hashStart);
60815
60869
  // error while reading the memory.
60816
60870
  if (memoryReadResult.isError) {
60817
- logger_logger.trace(`FORGET(${hash}, ${length}) <- PANIC`);
60871
+ logger_logger.trace `FORGET(${hash}, ${length}) <- PANIC`;
60818
60872
  return PvmExecution.Panic;
60819
60873
  }
60820
60874
  const result = this.partialState.forgetPreimage(hash.asOpaque(), length);
60821
- logger_logger.trace(`FORGET(${hash}, ${length}) <- ${resultToString(result)}`);
60875
+ logger_logger.trace `FORGET(${hash}, ${length}) <- ${resultToString(result)}`;
60822
60876
  if (result.isOk) {
60823
60877
  regs.set(forget_IN_OUT_REG, HostCallResult.OK);
60824
60878
  }
@@ -60871,11 +60925,11 @@ class New {
60871
60925
  const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
60872
60926
  // error while reading the memory.
60873
60927
  if (memoryReadResult.isError) {
60874
- logger_logger.trace(`NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- PANIC`);
60928
+ logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- PANIC`;
60875
60929
  return PvmExecution.Panic;
60876
60930
  }
60877
60931
  const assignedId = this.partialState.newService(codeHash.asOpaque(), codeLength, gas, allowance, gratisStorage);
60878
- logger_logger.trace(`NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- ${resultToString(assignedId)}`);
60932
+ logger_logger.trace `NEW(${codeHash}, ${codeLength}, ${gas}, ${allowance}, ${gratisStorage}) <- ${resultToString(assignedId)}`;
60879
60933
  if (assignedId.isOk) {
60880
60934
  regs.set(new_IN_OUT_REG, numbers_tryAsU64(assignedId.ok));
60881
60935
  return;
@@ -60930,11 +60984,11 @@ class Provide {
60930
60984
  const preimage = bytes_BytesBlob.blobFrom(new Uint8Array(length));
60931
60985
  const memoryReadResult = memory.loadInto(preimage.raw, preimageStart);
60932
60986
  if (memoryReadResult.isError) {
60933
- logger_logger.trace(`PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- PANIC`);
60987
+ logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- PANIC`;
60934
60988
  return PvmExecution.Panic;
60935
60989
  }
60936
60990
  const result = this.partialState.providePreimage(serviceId, preimage);
60937
- logger_logger.trace(`PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- ${resultToString(result)}`);
60991
+ logger_logger.trace `PROVIDE(${serviceId}, ${preimage.toStringTruncated()}) <- ${resultToString(result)}`;
60938
60992
  if (result.isOk) {
60939
60993
  regs.set(provide_IN_OUT_REG, HostCallResult.OK);
60940
60994
  return;
@@ -60988,11 +61042,11 @@ class Query {
60988
61042
  const memoryReadResult = memory.loadInto(hash.raw, hashStart);
60989
61043
  // error while reading the memory.
60990
61044
  if (memoryReadResult.isError) {
60991
- logger_logger.trace(`QUERY(${hash}, ${length}) <- PANIC`);
61045
+ logger_logger.trace `QUERY(${hash}, ${length}) <- PANIC`;
60992
61046
  return PvmExecution.Panic;
60993
61047
  }
60994
61048
  const result = this.partialState.checkPreimageStatus(hash.asOpaque(), length);
60995
- logger_logger.trace(`QUERY(${hash}, ${length}) <- ${result}`);
61049
+ logger_logger.trace `QUERY(${hash}, ${length}) <- ${result}`;
60996
61050
  const zero = numbers_tryAsU64(0n);
60997
61051
  if (result === null) {
60998
61052
  regs.set(IN_OUT_REG_1, HostCallResult.NONE);
@@ -61053,11 +61107,11 @@ class Solicit {
61053
61107
  const hash = bytes_Bytes.zero(hash_HASH_SIZE);
61054
61108
  const memoryReadResult = memory.loadInto(hash.raw, hashStart);
61055
61109
  if (memoryReadResult.isError) {
61056
- logger_logger.trace(`SOLICIT(${hash}, ${length}) <- PANIC`);
61110
+ logger_logger.trace `SOLICIT(${hash}, ${length}) <- PANIC`;
61057
61111
  return PvmExecution.Panic;
61058
61112
  }
61059
61113
  const result = this.partialState.requestPreimage(hash.asOpaque(), length);
61060
- logger_logger.trace(`SOLICIT(${hash}, ${length}) <- ${resultToString(result)}`);
61114
+ logger_logger.trace `SOLICIT(${hash}, ${length}) <- ${resultToString(result)}`;
61061
61115
  if (result.isOk) {
61062
61116
  regs.set(solicit_IN_OUT_REG, HostCallResult.OK);
61063
61117
  return;
@@ -61129,11 +61183,11 @@ class Transfer {
61129
61183
  const memoryReadResult = memory.loadInto(memo.raw, memoStart);
61130
61184
  // page fault while reading the memory.
61131
61185
  if (memoryReadResult.isError) {
61132
- logger_logger.trace(`TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- PANIC`);
61186
+ logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- PANIC`;
61133
61187
  return PvmExecution.Panic;
61134
61188
  }
61135
61189
  const transferResult = this.partialState.transfer(destination, amount, onTransferGas, memo);
61136
- logger_logger.trace(`TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- ${resultToString(transferResult)}`);
61190
+ logger_logger.trace `TRANSFER(${destination}, ${amount}, ${onTransferGas}, ${memo}) <- ${resultToString(transferResult)}`;
61137
61191
  // All good!
61138
61192
  if (transferResult.isOk) {
61139
61193
  regs.set(transfer_IN_OUT_REG, HostCallResult.OK);
@@ -61192,11 +61246,11 @@ class Upgrade {
61192
61246
  const codeHash = bytes_Bytes.zero(hash_HASH_SIZE);
61193
61247
  const memoryReadResult = memory.loadInto(codeHash.raw, codeHashStart);
61194
61248
  if (memoryReadResult.isError) {
61195
- logger_logger.trace(`UPGRADE(${codeHash}, ${gas}, ${allowance}) <- PANIC`);
61249
+ logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance}) <- PANIC`;
61196
61250
  return PvmExecution.Panic;
61197
61251
  }
61198
61252
  this.partialState.upgradeService(codeHash.asOpaque(), gas, allowance);
61199
- logger_logger.trace(`UPGRADE(${codeHash}, ${gas}, ${allowance})`);
61253
+ logger_logger.trace `UPGRADE(${codeHash}, ${gas}, ${allowance})`;
61200
61254
  regs.set(upgrade_IN_OUT_REG, HostCallResult.OK);
61201
61255
  }
61202
61256
  }
@@ -61230,11 +61284,11 @@ class Yield {
61230
61284
  const hash = bytes_Bytes.zero(hash_HASH_SIZE);
61231
61285
  const memoryReadResult = memory.loadInto(hash.raw, hashStart);
61232
61286
  if (memoryReadResult.isError) {
61233
- logger_logger.trace("YIELD() <- PANIC");
61287
+ logger_logger.trace `YIELD() <- PANIC`;
61234
61288
  return PvmExecution.Panic;
61235
61289
  }
61236
61290
  this.partialState.yield(hash);
61237
- logger_logger.trace(`YIELD(${hash})`);
61291
+ logger_logger.trace `YIELD(${hash})`;
61238
61292
  regs.set(yield_IN_OUT_REG, HostCallResult.OK);
61239
61293
  }
61240
61294
  }
@@ -61276,10 +61330,10 @@ class Fetch {
61276
61330
  const chunk = value === null ? new Uint8Array() : value.raw.subarray(Number(offset), Number(offset + length));
61277
61331
  const storeResult = memory.storeFrom(output, chunk);
61278
61332
  if (storeResult.isError) {
61279
- logger_logger.trace(`FETCH(${kind}) <- PANIC`);
61333
+ logger_logger.trace `FETCH(${kind}) <- PANIC`;
61280
61334
  return PvmExecution.Panic;
61281
61335
  }
61282
- logger_logger.trace(`FETCH(${kind}) <- ${value?.toStringTruncated()}`);
61336
+ logger_logger.trace `FETCH(${kind}) <- ${value?.toStringTruncated()}`;
61283
61337
  // write result
61284
61338
  regs.set(fetch_IN_OUT_REG, value === null ? HostCallResult.NONE : valueLength);
61285
61339
  }
@@ -61387,8 +61441,8 @@ var FetchKind;
61387
61441
 
61388
61442
 
61389
61443
  const info_IN_OUT_REG = 7;
61390
- const OFFSET_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) ? 9 : 11;
61391
- const LEN_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) ? 10 : 12;
61444
+ const OFFSET_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) || Compatibility.isGreaterOrEqual(GpVersion.V0_7_2) ? 9 : 11;
61445
+ const LEN_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) || Compatibility.isGreaterOrEqual(GpVersion.V0_7_2) ? 10 : 12;
61392
61446
  /**
61393
61447
  * Return info about some account.
61394
61448
  *
@@ -61405,7 +61459,7 @@ const LEN_REG = Compatibility.isSuite(TestSuite.W3F_DAVXY) ? 10 : 12;
61405
61459
  * a = last accumulation timeslot
61406
61460
  * p = parent service
61407
61461
  *
61408
- * https://graypaper.fluffylabs.dev/#/38c4e62/338302338302?v=0.7.0
61462
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/333b00333b00?v=0.7.2
61409
61463
  */
61410
61464
  class Info {
61411
61465
  currentServiceId;
@@ -61435,13 +61489,15 @@ class Info {
61435
61489
  const offset = minU64(regs.get(OFFSET_REG), valueLength);
61436
61490
  // l
61437
61491
  const length = minU64(regs.get(LEN_REG), numbers_tryAsU64(valueLength - offset));
61492
+ // NOTE: casting to `Number` is safe in both places, since we are always bounded
61493
+ // by the actual `encodedInfo.length`, which is equal `96`.
61438
61494
  const chunk = encodedInfo.raw.subarray(Number(offset), Number(offset + length));
61439
61495
  const writeResult = memory.storeFrom(outputStart, chunk);
61440
61496
  if (writeResult.isError) {
61441
- logger_logger.trace(`INFO(${serviceId}) <- PANIC`);
61497
+ logger_logger.trace `INFO(${serviceId}) <- PANIC`;
61442
61498
  return PvmExecution.Panic;
61443
61499
  }
61444
- logger_logger.trace(`INFO(${serviceId}) <- ${bytes_BytesBlob.blobFrom(chunk)}`);
61500
+ logger_logger.trace `INFO(${serviceId}) <- ${bytes_BytesBlob.blobFrom(chunk)}`;
61445
61501
  if (accountInfo === null) {
61446
61502
  regs.set(info_IN_OUT_REG, HostCallResult.NONE);
61447
61503
  return;
@@ -61454,7 +61510,7 @@ class Info {
61454
61510
  *
61455
61511
  * Used exclusively by `info` host call.
61456
61512
  *
61457
- * https://graypaper.fluffylabs.dev/#/7e6ff6a/337602337602?v=0.6.7
61513
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/33920033b500?v=0.7.2
61458
61514
  */
61459
61515
  const codecServiceAccountInfoWithThresholdBalance = descriptors_codec.object({
61460
61516
  codeHash: descriptors_codec.bytes(hash_HASH_SIZE),
@@ -61502,7 +61558,7 @@ class LogHostCall {
61502
61558
  memory.loadInto(target, targetStart);
61503
61559
  }
61504
61560
  memory.loadInto(message, msgStart);
61505
- logger_logger.trace(`SERVICE [${this.currentServiceId}] [${lvl}] ${decoder.decode(target)} ${decoder.decode(message)}`);
61561
+ logger_logger.trace `SERVICE [${this.currentServiceId}] [${lvl}] ${decoder.decode(target)} ${decoder.decode(message)}`;
61506
61562
  return Promise.resolve(undefined);
61507
61563
  }
61508
61564
  }
@@ -61542,12 +61598,12 @@ class Lookup {
61542
61598
  const preImageHash = bytes_Bytes.zero(hash_HASH_SIZE);
61543
61599
  const memoryReadResult = memory.loadInto(preImageHash.raw, hashAddress);
61544
61600
  if (memoryReadResult.isError) {
61545
- logger_logger.trace(`LOOKUP(${serviceId}, ${preImageHash}) <- PANIC`);
61601
+ logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- PANIC`;
61546
61602
  return PvmExecution.Panic;
61547
61603
  }
61548
61604
  // v
61549
61605
  const preImage = this.account.lookup(serviceId, preImageHash);
61550
- logger_logger.trace(`LOOKUP(${serviceId}, ${preImageHash}) <- ${preImage?.toStringTruncated()}...`);
61606
+ logger_logger.trace `LOOKUP(${serviceId}, ${preImageHash}) <- ${preImage?.toStringTruncated()}...`;
61551
61607
  const preImageLength = preImage === null ? numbers_tryAsU64(0) : numbers_tryAsU64(preImage.raw.length);
61552
61608
  const preimageBlobOffset = regs.get(10);
61553
61609
  const lengthToWrite = regs.get(11);
@@ -61609,7 +61665,7 @@ class Read {
61609
61665
  const rawKey = bytes_BytesBlob.blobFrom(new Uint8Array(storageKeyLengthClamped));
61610
61666
  const memoryReadResult = memory.loadInto(rawKey.raw, storageKeyStartAddress);
61611
61667
  if (memoryReadResult.isError) {
61612
- logger_logger.trace(`READ(${serviceId}, ${rawKey}) <- PANIC`);
61668
+ logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
61613
61669
  return PvmExecution.Panic;
61614
61670
  }
61615
61671
  // v
@@ -61627,15 +61683,15 @@ class Read {
61627
61683
  const chunk = value === null ? new Uint8Array(0) : value.raw.subarray(Number(offset), Number(offset + blobLength));
61628
61684
  const memoryWriteResult = memory.storeFrom(destinationAddress, chunk);
61629
61685
  if (memoryWriteResult.isError) {
61630
- logger_logger.trace(`READ(${serviceId}, ${rawKey}) <- PANIC`);
61686
+ logger_logger.trace `READ(${serviceId}, ${rawKey}) <- PANIC`;
61631
61687
  return PvmExecution.Panic;
61632
61688
  }
61633
61689
  if (value === null) {
61634
- logger_logger.trace(`READ(${serviceId}, ${rawKey}) <- NONE`);
61690
+ logger_logger.trace `READ(${serviceId}, ${rawKey}) <- NONE`;
61635
61691
  regs.set(read_IN_OUT_REG, HostCallResult.NONE);
61636
61692
  return;
61637
61693
  }
61638
- logger_logger.trace(`READ(${serviceId}, ${rawKey}) <- ${bytes_BytesBlob.blobFrom(chunk).toStringTruncated()}`);
61694
+ logger_logger.trace `READ(${serviceId}, ${rawKey}) <- ${bytes_BytesBlob.blobFrom(chunk).toStringTruncated()}`;
61639
61695
  regs.set(read_IN_OUT_REG, valueLength);
61640
61696
  }
61641
61697
  }
@@ -61678,7 +61734,7 @@ class Write {
61678
61734
  const rawStorageKey = new Uint8Array(storageKeyLengthClamped);
61679
61735
  const keyLoadingResult = memory.loadInto(rawStorageKey, storageKeyStartAddress);
61680
61736
  if (keyLoadingResult.isError) {
61681
- logger_logger.trace("WRITE() <- PANIC");
61737
+ logger_logger.trace `WRITE() <- PANIC`;
61682
61738
  return PvmExecution.Panic;
61683
61739
  }
61684
61740
  // k
@@ -61688,14 +61744,14 @@ class Write {
61688
61744
  const valueLoadingResult = memory.loadInto(value, valueStart);
61689
61745
  // Note [MaSo] this is ok to return bcs if valueLength is 0, then this panic won't happen
61690
61746
  if (valueLoadingResult.isError) {
61691
- logger_logger.trace(`WRITE(${storageKey})}) <- PANIC`);
61747
+ logger_logger.trace `WRITE(${storageKey}) <- PANIC`;
61692
61748
  return PvmExecution.Panic;
61693
61749
  }
61694
61750
  /** https://graypaper.fluffylabs.dev/#/9a08063/33af0133b201?v=0.6.6 */
61695
61751
  const maybeValue = valueLength === 0n ? null : bytes_BytesBlob.blobFrom(value);
61696
61752
  // a
61697
61753
  const result = this.account.write(storageKey, maybeValue);
61698
- logger_logger.trace(`WRITE(${storageKey}, ${maybeValue?.toStringTruncated()}) <- ${resultToString(result)}`);
61754
+ logger_logger.trace `WRITE(${storageKey}, ${maybeValue?.toStringTruncated()}) <- ${resultToString(result)}`;
61699
61755
  if (result.isError) {
61700
61756
  regs.set(write_IN_OUT_REG, HostCallResult.FULL);
61701
61757
  return;
@@ -61887,18 +61943,18 @@ class Accumulate {
61887
61943
  async pvmAccumulateInvocation(slot, serviceId, operands, gas, entropy, inputStateUpdate) {
61888
61944
  const service = this.state.getService(serviceId);
61889
61945
  if (service === null) {
61890
- accumulate_logger.log(`Service with id ${serviceId} not found.`);
61946
+ accumulate_logger.log `Service with id ${serviceId} not found.`;
61891
61947
  return result_Result.error(PvmInvocationError.NoService);
61892
61948
  }
61893
61949
  const codeHash = service.getInfo().codeHash;
61894
61950
  // TODO [ToDr] Should we check that the preimage is still available?
61895
61951
  const code = service.getPreimage(codeHash.asOpaque());
61896
61952
  if (code === null) {
61897
- accumulate_logger.log(`Code with hash ${codeHash} not found for service ${serviceId}.`);
61953
+ accumulate_logger.log `Code with hash ${codeHash} not found for service ${serviceId}.`;
61898
61954
  return result_Result.error(PvmInvocationError.NoPreimage);
61899
61955
  }
61900
61956
  if (code.length > W_C) {
61901
- accumulate_logger.log(`Code with hash ${codeHash} is too long for service ${serviceId}.`);
61957
+ accumulate_logger.log `Code with hash ${codeHash} is too long for service ${serviceId}.`;
61902
61958
  return result_Result.error(PvmInvocationError.PreimageTooLong);
61903
61959
  }
61904
61960
  const nextServiceId = generateNextServiceId({ serviceId, entropy, timeslot: slot }, this.chainSpec);
@@ -61920,10 +61976,10 @@ class Accumulate {
61920
61976
  if (result.hasStatus()) {
61921
61977
  const status = result.status;
61922
61978
  if (status === status_Status.OOG || status === status_Status.PANIC) {
61923
- accumulate_logger.trace(`[${serviceId}] accumulate finished with ${status_Status[status]} reverting to checkpoint.`);
61979
+ accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]} reverting to checkpoint.`;
61924
61980
  return result_Result.ok({ stateUpdate: checkpoint, consumedGas: common_tryAsServiceGas(result.consumedGas) });
61925
61981
  }
61926
- accumulate_logger.trace(`[${serviceId}] accumulate finished with ${status_Status[status]}`);
61982
+ accumulate_logger.trace `[${serviceId}] accumulate finished with ${status_Status[status]}`;
61927
61983
  }
61928
61984
  /**
61929
61985
  * PVM invocation returned a hash so we override whatever `yield` host call
@@ -61948,14 +62004,14 @@ class Accumulate {
61948
62004
  * https://graypaper.fluffylabs.dev/#/7e6ff6a/18d70118d701?v=0.6.7
61949
62005
  */
61950
62006
  async accumulateSingleService(serviceId, operands, gasCost, slot, entropy, inputStateUpdate) {
61951
- accumulate_logger.log(`Accumulating service ${serviceId}, items: ${operands.length} at slot: ${slot}.`);
62007
+ accumulate_logger.log `Accumulating service ${serviceId}, items: ${operands.length} at slot: ${slot}.`;
61952
62008
  const result = await this.pvmAccumulateInvocation(slot, serviceId, operands, gasCost, entropy, inputStateUpdate);
61953
62009
  if (result.isError) {
61954
62010
  // https://graypaper.fluffylabs.dev/#/7e6ff6a/2fb6012fb601?v=0.6.7
61955
- accumulate_logger.log(`Accumulation failed for ${serviceId}.`);
62011
+ accumulate_logger.log `Accumulation failed for ${serviceId}.`;
61956
62012
  return { stateUpdate: null, consumedGas: 0n };
61957
62013
  }
61958
- accumulate_logger.log(`Accumulation successful for ${serviceId}. Consumed: ${result.ok.consumedGas}`);
62014
+ accumulate_logger.log `Accumulation successful for ${serviceId}. Consumed: ${result.ok.consumedGas}`;
61959
62015
  return result.ok;
61960
62016
  }
61961
62017
  /**
@@ -62004,6 +62060,7 @@ class Accumulate {
62004
62060
  const serviceIds = accumulateData.getServiceIds();
62005
62061
  let gasCost = common_tryAsServiceGas(0);
62006
62062
  let currentState = inputStateUpdate;
62063
+ const currentManager = (inputStateUpdate.privilegedServices ?? this.state.privilegedServices).manager;
62007
62064
  for (const serviceId of serviceIds) {
62008
62065
  const checkpoint = AccumulationStateUpdate.copyFrom(currentState);
62009
62066
  const { consumedGas, stateUpdate } = await this.accumulateSingleService(serviceId, accumulateData.getOperands(serviceId), accumulateData.getGasCost(serviceId), slot, entropy, currentState);
@@ -62013,6 +62070,21 @@ class Accumulate {
62013
62070
  serviceStatistics.gasUsed = common_tryAsServiceGas(serviceStatistics.gasUsed + consumedGas);
62014
62071
  statistics.set(serviceId, serviceStatistics);
62015
62072
  currentState = stateUpdate === null ? checkpoint : stateUpdate;
62073
+ if (Compatibility.is(GpVersion.V0_7_0) && serviceId === currentManager) {
62074
+ const newV = currentState.privilegedServices?.validatorsManager;
62075
+ if (currentState.privilegedServices !== null && newV !== undefined && serviceIds.includes(newV)) {
62076
+ accumulate_logger.info `Entering completely incorrect code that probably reverts validatorsManager change. This is valid in 0.7.0 only and incorrect in 0.7.1+`;
62077
+ // Since serviceIds already contains newV, this service gets accumulated twice.
62078
+ // To avoid double-counting, we skip stats and gas cost tracking here.
62079
+ // We need this accumulation to get the correct `validatorsManager`
62080
+ const { stateUpdate } = await this.accumulateSingleService(newV, accumulateData.getOperands(newV), accumulateData.getGasCost(newV), slot, entropy, checkpoint);
62081
+ const correctV = stateUpdate?.privilegedServices?.validatorsManager ?? this.state.privilegedServices.validatorsManager;
62082
+ currentState.privilegedServices = PrivilegedServices.create({
62083
+ ...currentState.privilegedServices,
62084
+ validatorsManager: correctV,
62085
+ });
62086
+ }
62087
+ }
62016
62088
  }
62017
62089
  return {
62018
62090
  state: currentState,
@@ -62157,11 +62229,14 @@ class DeferredTransfers {
62157
62229
  async transition({ pendingTransfers, timeslot, servicesUpdate: inputServicesUpdate, entropy, }) {
62158
62230
  // https://graypaper.fluffylabs.dev/#/7e6ff6a/187a03187a03?v=0.6.7
62159
62231
  const transferStatistics = new Map();
62160
- const services = uniquePreserveOrder(pendingTransfers.flatMap((x) => [x.source, x.destination]));
62232
+ const services = uniquePreserveOrder(pendingTransfers.map((x) => x.destination));
62161
62233
  let currentStateUpdate = AccumulationStateUpdate.new(inputServicesUpdate);
62162
62234
  for (const serviceId of services) {
62163
62235
  const partiallyUpdatedState = new PartiallyUpdatedState(this.state, currentStateUpdate);
62164
- const transfers = pendingTransfers.filter((pendingTransfer) => pendingTransfer.destination === serviceId);
62236
+ // https://graypaper.fluffylabs.dev/#/38c4e62/18750318ae03?v=0.7.0
62237
+ const transfers = pendingTransfers
62238
+ .filter((pendingTransfer) => pendingTransfer.destination === serviceId)
62239
+ .toSorted((a, b) => a.source - b.source);
62165
62240
  const info = partiallyUpdatedState.getServiceInfo(serviceId);
62166
62241
  if (info === null) {
62167
62242
  return result_Result.error(DeferredTransfersErrorCode.ServiceInfoNotExist);
@@ -62181,13 +62256,13 @@ class DeferredTransfers {
62181
62256
  const isCodeCorrect = code !== null && code.length <= W_C;
62182
62257
  if (!hasTransfers || !isCodeCorrect) {
62183
62258
  if (code === null) {
62184
- deferred_transfers_logger.trace(`Skipping ON_TRANSFER execution for service ${serviceId} because code is null`);
62259
+ deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is null`;
62185
62260
  }
62186
62261
  else if (!hasTransfers) {
62187
- deferred_transfers_logger.trace(`Skipping ON_TRANSFER execution for service ${serviceId} because there are no transfers`);
62262
+ deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because there are no transfers`;
62188
62263
  }
62189
62264
  else {
62190
- deferred_transfers_logger.trace(`Skipping ON_TRANSFER execution for service ${serviceId} because code is too long`);
62265
+ deferred_transfers_logger.trace `Skipping ON_TRANSFER execution for service ${serviceId} because code is too long`;
62191
62266
  }
62192
62267
  }
62193
62268
  else {
@@ -62815,7 +62890,7 @@ function verifyRefineContexts(minLookupSlot, contexts, recentBlocksPartialUpdate
62815
62890
  headerChain.isAncestor(context.lookupAnchorSlot, context.lookupAnchor, context.anchor);
62816
62891
  if (!isInChain) {
62817
62892
  if (process.env.SKIP_LOOKUP_ANCHOR_CHECK !== undefined) {
62818
- verify_contextual_logger.warn(`Lookup anchor check for ${context.lookupAnchor} would fail, but override is active.`);
62893
+ verify_contextual_logger.warn `Lookup anchor check for ${context.lookupAnchor} would fail, but override is active.`;
62819
62894
  }
62820
62895
  else {
62821
62896
  return result_Result.error(ReportsError.SegmentRootLookupInvalid, `Lookup anchor is not found in chain. Hash: ${context.lookupAnchor} (slot: ${context.lookupAnchorSlot})`);
@@ -63702,7 +63777,7 @@ class OnChain {
63702
63777
  reports: availableReports,
63703
63778
  entropy: entropy[0],
63704
63779
  });
63705
- chain_stf_logger.log(timerAccumulate());
63780
+ chain_stf_logger.log `${timerAccumulate()}`;
63706
63781
  if (accumulateResult.isError) {
63707
63782
  return stfError(StfErrorKind.Accumulate, accumulateResult);
63708
63783
  }
@@ -63833,7 +63908,7 @@ class Importer {
63833
63908
  this.stf = new OnChain(spec, state, blocks, hasher);
63834
63909
  this.state = state;
63835
63910
  this.currentHash = currentBestHeaderHash;
63836
- logger.info(`😎 Best time slot: ${state.timeslot} (header hash: ${currentBestHeaderHash})`);
63911
+ logger.info `😎 Best time slot: ${state.timeslot} (header hash: ${currentBestHeaderHash})`;
63837
63912
  }
63838
63913
  async importBlock(block, omitSealVerification) {
63839
63914
  const timer = measure("importBlock");
@@ -63841,20 +63916,20 @@ class Importer {
63841
63916
  const maybeBestHeader = await this.importBlockInternal(block, omitSealVerification);
63842
63917
  if (maybeBestHeader.isOk) {
63843
63918
  const bestHeader = maybeBestHeader.ok;
63844
- this.logger.info(`🧊 Best block: #${timeSlot} (${bestHeader.hash})`);
63845
- this.logger.log(timer());
63919
+ this.logger.info `🧊 Best block: #${timeSlot} (${bestHeader.hash})`;
63920
+ this.logger.log `${timer()}`;
63846
63921
  return maybeBestHeader;
63847
63922
  }
63848
- this.logger.log(`❌ Rejected block #${timeSlot}: ${resultToString(maybeBestHeader)}`);
63849
- this.logger.log(timer());
63923
+ this.logger.log `❌ Rejected block #${timeSlot}: ${resultToString(maybeBestHeader)}`;
63924
+ this.logger.log `${timer()}`;
63850
63925
  return maybeBestHeader;
63851
63926
  }
63852
63927
  async importBlockInternal(block, omitSealVerification = false) {
63853
63928
  const logger = this.logger;
63854
- logger.log("🧱 Attempting to import a new block");
63929
+ logger.log `🧱 Attempting to import a new block`;
63855
63930
  const timerVerify = measure("import:verify");
63856
63931
  const hash = await this.verifier.verifyBlock(block);
63857
- logger.log(timerVerify());
63932
+ logger.log `${timerVerify()}`;
63858
63933
  if (hash.isError) {
63859
63934
  return importerError(ImporterErrorKind.Verifier, hash);
63860
63935
  }
@@ -63874,10 +63949,10 @@ class Importer {
63874
63949
  }
63875
63950
  const timeSlot = block.header.view().timeSlotIndex.materialize();
63876
63951
  const headerHash = hash.ok;
63877
- logger.log(`🧱 Verified block: Got hash ${headerHash} for block at slot ${timeSlot}.`);
63952
+ logger.log `🧱 Verified block: Got hash ${headerHash} for block at slot ${timeSlot}.`;
63878
63953
  const timerStf = measure("import:stf");
63879
63954
  const res = await this.stf.transition(block, headerHash, omitSealVerification);
63880
- logger.log(timerStf());
63955
+ logger.log `${timerStf()}`;
63881
63956
  if (res.isError) {
63882
63957
  return importerError(ImporterErrorKind.Stf, res);
63883
63958
  }
@@ -63886,7 +63961,7 @@ class Importer {
63886
63961
  const timerState = measure("import:state");
63887
63962
  const updateResult = await this.states.updateAndSetState(headerHash, this.state, update);
63888
63963
  if (updateResult.isError) {
63889
- logger.error(`🧱 Unable to update state: ${resultToString(updateResult)}`);
63964
+ logger.error `🧱 Unable to update state: ${resultToString(updateResult)}`;
63890
63965
  return importerError(ImporterErrorKind.Update, updateResult);
63891
63966
  }
63892
63967
  const newState = this.states.getState(headerHash);
@@ -63897,17 +63972,17 @@ class Importer {
63897
63972
  // the state of a parent block to support forks and create a fresh STF.
63898
63973
  this.state.updateBackend(newState.backend);
63899
63974
  this.currentHash = headerHash;
63900
- logger.log(timerState());
63975
+ logger.log `${timerState()}`;
63901
63976
  // insert new state and the block to DB.
63902
63977
  const timerDb = measure("import:db");
63903
63978
  const writeBlocks = this.blocks.insertBlock(new WithHash(headerHash, block));
63904
63979
  // Computation of the state root may happen asynchronously,
63905
63980
  // but we still need to wait for it before next block can be imported
63906
63981
  const stateRoot = await this.states.getStateRoot(newState);
63907
- logger.log(`🧱 Storing post-state-root for ${headerHash}: ${stateRoot}.`);
63982
+ logger.log `🧱 Storing post-state-root for ${headerHash}: ${stateRoot}.`;
63908
63983
  const writeStateRoot = this.blocks.setPostStateRoot(headerHash, stateRoot);
63909
63984
  await Promise.all([writeBlocks, writeStateRoot]);
63910
- logger.log(timerDb());
63985
+ logger.log `${timerDb()}`;
63911
63986
  // finally update the best block
63912
63987
  await this.blocks.setBestHeaderHash(headerHash);
63913
63988
  return result_Result.ok(new WithHash(headerHash, block.header.view()));
@@ -63955,7 +64030,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
63955
64030
  Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
63956
64031
  const machine = importerStateMachine();
63957
64032
  const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
63958
- channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error(e));
64033
+ channel.then((channel) => importer_main(channel)).catch((e) => importer_logger.error `${e}`);
63959
64034
  }
63960
64035
  const keccakHasher = KeccakHasher.create();
63961
64036
  async function createImporter(config) {
@@ -63977,7 +64052,7 @@ async function createImporter(config) {
63977
64052
  */
63978
64053
  async function importer_main(channel) {
63979
64054
  const wasmPromise = initAll();
63980
- importer_logger.info(`📥 Importer starting ${channel.currentState()}`);
64055
+ importer_logger.info `📥 Importer starting ${channel.currentState()}`;
63981
64056
  // Await the configuration object
63982
64057
  const ready = await channel.waitForState("ready(importer)");
63983
64058
  let closeDb = async () => { };
@@ -63989,7 +64064,7 @@ async function importer_main(channel) {
63989
64064
  };
63990
64065
  // TODO [ToDr] this is shit, since we have circular dependency.
63991
64066
  worker.setImporter(importer);
63992
- importer_logger.info("📥 Importer waiting for blocks.");
64067
+ importer_logger.info `📥 Importer waiting for blocks.`;
63993
64068
  worker.onBlock.on(async (block) => {
63994
64069
  const res = await importer.importBlock(block, config.omitSealVerification);
63995
64070
  if (res.isOk) {
@@ -63998,7 +64073,7 @@ async function importer_main(channel) {
63998
64073
  });
63999
64074
  await wasmPromise;
64000
64075
  });
64001
- importer_logger.info("📥 Importer finished. Closing channel.");
64076
+ importer_logger.info `📥 Importer finished. Closing channel.`;
64002
64077
  // close the database
64003
64078
  await closeDb();
64004
64079
  // Close the comms to gracefuly close the app.
@@ -64019,8 +64094,8 @@ async function importer_main(channel) {
64019
64094
  const zeroHash = bytes_Bytes.zero(hash_HASH_SIZE).asOpaque();
64020
64095
  async function mainImporter(config, withRelPath) {
64021
64096
  await initAll();
64022
- common_logger.info(`🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`);
64023
- common_logger.info(`🎸 Starting importer: ${config.nodeName}.`);
64097
+ common_logger.info `🫐 Typeberry ${package_namespaceObject.rE}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
64098
+ common_logger.info `🎸 Starting importer: ${config.nodeName}.`;
64024
64099
  const chainSpec = getChainSpec(config.node.flavor);
64025
64100
  const { rootDb, dbPath, genesisHeaderHash } = openDatabase(config.nodeName, config.node.chainSpec.genesisHeader, withRelPath(config.node.databaseBasePath));
64026
64101
  // Initialize the database with genesis state and block if there isn't one.
@@ -64047,9 +64122,9 @@ async function mainImporter(config, withRelPath) {
64047
64122
  return importer.getBestStateRootHash() ?? zeroHash;
64048
64123
  },
64049
64124
  async close() {
64050
- common_logger.log("[main] 🛢️ Closing the database");
64125
+ common_logger.log `[main] 🛢️ Closing the database`;
64051
64126
  await lmdb.close();
64052
- common_logger.info("[main] ✅ Done.");
64127
+ common_logger.info `[main] ✅ Done.`;
64053
64128
  },
64054
64129
  };
64055
64130
  return api;
@@ -64076,7 +64151,7 @@ function getFuzzDetails() {
64076
64151
  };
64077
64152
  }
64078
64153
  async function mainFuzz(fuzzConfig, withRelPath) {
64079
- main_fuzz_logger.info(`💨 Fuzzer V${fuzzConfig.version} starting up.`);
64154
+ main_fuzz_logger.info `💨 Fuzzer V${fuzzConfig.version} starting up.`;
64080
64155
  const { jamNodeConfig: config } = fuzzConfig;
64081
64156
  let runningNode = null;
64082
64157
  const fuzzSeed = BigInt(Date.now());
@@ -64146,20 +64221,20 @@ async function mainFuzz(fuzzConfig, withRelPath) {
64146
64221
 
64147
64222
  const importBlocks = async (node, blocksToImport) => {
64148
64223
  const logger = Logger.new(import.meta.filename, "jam");
64149
- logger.info(`📖 Reading ${blocksToImport.length} blocks`);
64224
+ logger.info `📖 Reading ${blocksToImport.length} blocks`;
64150
64225
  const reader = startBlocksReader({
64151
64226
  files: blocksToImport,
64152
64227
  chainSpec: node.chainSpec,
64153
64228
  });
64154
64229
  for (const block of reader) {
64155
- logger.log(`📖 Importing block: #${block.header.view().timeSlotIndex.materialize()}`);
64230
+ logger.log `📖 Importing block: #${block.header.view().timeSlotIndex.materialize()}`;
64156
64231
  const res = await node.importBlock(block);
64157
64232
  if (res.isError) {
64158
- logger.error(`📖 ${resultToString(res)}`);
64233
+ logger.error `📖 ${resultToString(res)}`;
64159
64234
  }
64160
64235
  }
64161
64236
  // close the importer.
64162
- logger.info("All blocks scheduled to be imported.");
64237
+ logger.info `All blocks scheduled to be imported.`;
64163
64238
  return await node.close();
64164
64239
  };
64165
64240
  function* startBlocksReader(options) {
@@ -64196,7 +64271,7 @@ function readJsonBlock(file, chainSpec) {
64196
64271
  var minimist = __nccwpck_require__(8595);
64197
64272
  var minimist_default = /*#__PURE__*/__nccwpck_require__.n(minimist);
64198
64273
  ;// CONCATENATED MODULE: ./bin/jam/package.json
64199
- const jam_package_namespaceObject = {"rE":"0.1.1"};
64274
+ const jam_package_namespaceObject = {"rE":"0.1.2"};
64200
64275
  ;// CONCATENATED MODULE: ./bin/jam/args.ts
64201
64276
 
64202
64277
 
@@ -64356,6 +64431,7 @@ function parseFuzzVersion(v) {
64356
64431
 
64357
64432
 
64358
64433
 
64434
+
64359
64435
  const prepareConfigFile = (args) => {
64360
64436
  const nodeConfig = loadConfig(args.args.configPath);
64361
64437
  const nodeName = args.command === Command.Dev ? `${args.args.nodeName}-${args.args.index}` : args.args.nodeName;
@@ -64382,14 +64458,8 @@ const prepareConfigFile = (args) => {
64382
64458
  };
64383
64459
  if (import.meta.url === (0,external_node_url_namespaceObject.pathToFileURL)(process.argv[1]).href) {
64384
64460
  Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
64385
- const relPath = `${import.meta.dirname}/../..`;
64386
- const withRelPath = (p) => {
64387
- if (p.startsWith("/")) {
64388
- return p;
64389
- }
64390
- return `${relPath}/${p}`;
64391
- };
64392
64461
  let args;
64462
+ const withRelPath = workspacePathFix(`${import.meta.dirname}/../..`);
64393
64463
  try {
64394
64464
  const parsed = parseArgs(process.argv.slice(2), withRelPath);
64395
64465
  if (parsed === null) {