@xyo-network/xl1-cli-lib 1.14.2 → 1.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/node/index.mjs +216 -65
  2. package/dist/node/index.mjs.map +1 -1
  3. package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts +1 -1
  4. package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts.map +1 -1
  5. package/dist/node/orchestration/services/implementation/head/createBootstrapHead.d.ts +4 -0
  6. package/dist/node/orchestration/services/implementation/head/createBootstrapHead.d.ts.map +1 -0
  7. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +18 -0
  8. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +1 -0
  9. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +14 -0
  10. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -0
  11. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.d.ts +4 -0
  12. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +1 -0
  13. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/index.d.ts +4 -0
  14. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/index.d.ts.map +1 -0
  15. package/dist/node/orchestration/services/implementation/head/createForkedHead/createForkedHead.d.ts +5 -0
  16. package/dist/node/orchestration/services/implementation/head/createForkedHead/createForkedHead.d.ts.map +1 -0
  17. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +10 -0
  18. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +1 -0
  19. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.d.ts +10 -0
  20. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +1 -0
  21. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +10 -0
  22. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +1 -0
  23. package/dist/node/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +12 -0
  24. package/dist/node/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +1 -0
  25. package/dist/node/orchestration/services/implementation/head/createForkedHead/index.d.ts +2 -0
  26. package/dist/node/orchestration/services/implementation/head/createForkedHead/index.d.ts.map +1 -0
  27. package/dist/node/orchestration/services/implementation/head/getForkFromBlock.d.ts +12 -0
  28. package/dist/node/orchestration/services/implementation/head/getForkFromBlock.d.ts.map +1 -0
  29. package/dist/node/orchestration/services/implementation/head/head.d.ts.map +1 -0
  30. package/dist/node/orchestration/services/implementation/head/index.d.ts +2 -0
  31. package/dist/node/orchestration/services/implementation/head/index.d.ts.map +1 -0
  32. package/dist/node/orchestration/services/implementation/head/submitNewChain.d.ts +10 -0
  33. package/dist/node/orchestration/services/implementation/head/submitNewChain.d.ts.map +1 -0
  34. package/dist/node/orchestration/services/implementation/index.d.ts +1 -1
  35. package/dist/node/orchestration/services/implementation/index.d.ts.map +1 -1
  36. package/dist/node/xl1.mjs +216 -65
  37. package/dist/node/xl1.mjs.map +1 -1
  38. package/package.json +12 -12
  39. package/src/orchestration/actor/implementation/ChainHeadUpdateActor.ts +2 -2
  40. package/src/orchestration/actor/model/Actor.ts +2 -2
  41. package/src/orchestration/archivists/ChainFinalized/local.ts +1 -1
  42. package/src/orchestration/archivists/StakeIntentState/local.ts +1 -1
  43. package/src/orchestration/archivists/lib/localPersistentArchivist.ts +8 -1
  44. package/src/orchestration/services/implementation/head/createBootstrapHead.ts +8 -0
  45. package/src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +27 -0
  46. package/src/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +18 -0
  47. package/src/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.ts +10 -0
  48. package/src/orchestration/services/implementation/head/createForkedHead/config/index.ts +3 -0
  49. package/src/orchestration/services/implementation/head/createForkedHead/createForkedHead.ts +31 -0
  50. package/src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +38 -0
  51. package/src/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.ts +50 -0
  52. package/src/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.ts +43 -0
  53. package/src/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +42 -0
  54. package/src/orchestration/services/implementation/head/createForkedHead/index.ts +1 -0
  55. package/src/orchestration/services/implementation/head/getForkFromBlock.ts +42 -0
  56. package/src/orchestration/services/implementation/head/head.ts +52 -0
  57. package/src/orchestration/services/implementation/head/index.ts +1 -0
  58. package/src/orchestration/services/implementation/head/submitNewChain.ts +27 -0
  59. package/src/orchestration/services/implementation/index.ts +1 -1
  60. package/dist/node/orchestration/services/implementation/head.d.ts.map +0 -1
  61. package/src/orchestration/services/implementation/head.ts +0 -111
  62. /package/dist/node/orchestration/services/implementation/{head.d.ts → head/head.d.ts} +0 -0
@@ -9,7 +9,7 @@ import { Mutex } from "async-mutex";
9
9
  // src/orchestration/actor/model/Actor.ts
10
10
  import { Base } from "@xylabs/base";
11
11
  import { IdLogger } from "@xylabs/logger";
12
- import { span, spanAsync } from "@xylabs/telemetry";
12
+ import { span, spanRootAsync } from "@xylabs/telemetry";
13
13
  var Actor = class extends Base {
14
14
  static {
15
15
  __name(this, "Actor");
@@ -68,7 +68,7 @@ var Actor = class extends Base {
68
68
  return span(`${this.name}:${name}`, fn, this.tracer);
69
69
  }
70
70
  async spanAsync(name, fn) {
71
- return await spanAsync(`${this.name}:${name}`, fn, this.tracer);
71
+ return await spanRootAsync(`${this.name}:${name}`, fn, this.tracer);
72
72
  }
73
73
  /**
74
74
  * Called by the Orchestrator when the actor is activated.
@@ -236,9 +236,9 @@ var ChainHeadUpdateActor = class _ChainHeadUpdateActor extends Actor {
236
236
  const candidateBlockNumberDisplay = `0x${toHex(candidateBlockNumber)}`;
237
237
  const currentBlockNumber = currentHead?.block ?? -1;
238
238
  if (candidateBlockNumber > currentBlockNumber) {
239
- this.logger?.log("Found more recent head:", candidateBlockNumberDisplay);
239
+ this.logger?.log("Found more recent head:", candidateBlockNumber, candidateBlockNumberDisplay);
240
240
  await this.chainIterator.updateHead(candidateBlock);
241
- this.logger?.log("Updated head:", candidateBlockNumberDisplay);
241
+ this.logger?.log("Updated head:", candidateBlockNumber, candidateBlockNumberDisplay);
242
242
  }
243
243
  }
244
244
  };
@@ -527,9 +527,9 @@ var initHealthEndpoints = /* @__PURE__ */ __name((params) => {
527
527
  }, "initHealthEndpoints");
528
528
 
529
529
  // src/orchestration/initServices.ts
530
- import { assertEx as assertEx17 } from "@xylabs/assert";
530
+ import { assertEx as assertEx18 } from "@xylabs/assert";
531
531
  import { asAddress as asAddress2 } from "@xylabs/hex";
532
- import { isDefined as isDefined11 } from "@xylabs/typeof";
532
+ import { isDefined as isDefined12 } from "@xylabs/typeof";
533
533
  import { balanceSummaryRepositoryFromMap, BaseTimeSyncService, initTelemetry, startupSpanAsync as startupSpanAsync7, validateHydratedBlockState } from "@xyo-network/chain-sdk";
534
534
 
535
535
  // src/orchestration/archivists/ChainFinalized/archivist.ts
@@ -552,13 +552,14 @@ var getStoreDirectory = /* @__PURE__ */ __name((name, storageRoot, kind) => {
552
552
 
553
553
  // src/orchestration/archivists/lib/localPersistentArchivist.ts
554
554
  var DEFAULT_STORAGE_ROOT = Path2.join(process.cwd(), ".store");
555
- var getLocalPersistentArchivist = /* @__PURE__ */ __name((dbName, storeName, storageRoot, kind = "lmdb") => {
555
+ var getLocalPersistentArchivist = /* @__PURE__ */ __name((name, dbName, storeName, storageRoot, kind = "lmdb") => {
556
556
  switch (kind) {
557
557
  case "lmdb": {
558
558
  const root = storageRoot ?? DEFAULT_STORAGE_ROOT;
559
559
  return LmdbArchivist.create({
560
560
  account: "random",
561
561
  config: {
562
+ name,
562
563
  clearStoreOnStart: false,
563
564
  dbName,
564
565
  location: getStoreDirectory(dbName, root, "lmdb"),
@@ -577,7 +578,7 @@ var initLocalChainFinalizedArchivist = /* @__PURE__ */ __name(async ({ config: c
577
578
  return await mutex.runExclusive(async () => {
578
579
  if (singleton) return singleton;
579
580
  const { root } = config3.storage;
580
- singleton = await getLocalPersistentArchivist("chain", "finalized", root);
581
+ singleton = await getLocalPersistentArchivist("local-finalized-chain", "chain", "finalized", root);
581
582
  return singleton;
582
583
  });
583
584
  }, "initLocalChainFinalizedArchivist");
@@ -782,7 +783,7 @@ var initLocalStakeIntentStateArchivist = /* @__PURE__ */ __name(async ({ config:
782
783
  return await mutex11.runExclusive(async () => {
783
784
  if (singleton11) return singleton11;
784
785
  const { root } = config3.storage;
785
- singleton11 = await getLocalPersistentArchivist("stakeIntent", "state", root);
786
+ singleton11 = await getLocalPersistentArchivist("local-stake-intent-state", "stakeIntent", "state", root);
786
787
  return assertEx9(singleton11, () => new Error("Failed to initialize stake intent state archivist"));
787
788
  });
788
789
  }, "initLocalStakeIntentStateArchivist");
@@ -1089,30 +1090,136 @@ var init = /* @__PURE__ */ __name((params) => {
1089
1090
  return chainStakeServiceSingleton2;
1090
1091
  }, "init");
1091
1092
 
1092
- // src/orchestration/services/implementation/head.ts
1093
- import { delay } from "@xylabs/delay";
1094
- import { asHash, hexFromBigInt, ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/hex";
1095
- import { isDefined as isDefined10 } from "@xylabs/typeof";
1096
- import { buildBlock, createGenesisBlock, findMostRecentBlock as findMostRecentBlock2, isBlockBoundWitnessWithHashStorageMeta } from "@xyo-network/chain-sdk";
1097
- import { flattenHydratedBlock as flattenHydratedBlock2 } from "@xyo-network/xl1-protocol-sdk";
1098
- var headSingleton;
1099
- var createBootstrapHead = /* @__PURE__ */ __name(async (chainSubmissionsArchivistWrite, chainArchivist, account) => {
1100
- const block = await createGenesisBlock(account, ZERO_ADDRESS2, 10000000n, account.address);
1101
- const [bw] = block;
1102
- await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock2(block));
1103
- while (true) {
1104
- const result = await chainArchivist.get([
1105
- bw._hash
1106
- ]);
1107
- if (result.length > 0) break;
1108
- await delay(1e3);
1109
- }
1110
- return bw;
1093
+ // src/orchestration/services/implementation/head/head.ts
1094
+ import { assertEx as assertEx16 } from "@xylabs/assert";
1095
+ import { isDefined as isDefined11 } from "@xylabs/typeof";
1096
+ import { findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/chain-sdk";
1097
+
1098
+ // src/orchestration/services/implementation/head/createBootstrapHead.ts
1099
+ import { ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/hex";
1100
+ import { createGenesisBlock } from "@xyo-network/chain-sdk";
1101
+ var createBootstrapHead = /* @__PURE__ */ __name(async (account) => {
1102
+ return await createGenesisBlock(account, ZERO_ADDRESS2, 10000000n, account.address);
1111
1103
  }, "createBootstrapHead");
1112
- var createForkedHead = /* @__PURE__ */ __name(async (chainSubmissionsArchivistWrite, chainArchivist, account, forkBlock, chainId) => {
1104
+
1105
+ // src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts
1106
+ import { BridgeDestinationObservationSchema, buildNextBlock } from "@xyo-network/chain-sdk";
1107
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
1108
+
1109
+ // src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts
1110
+ import { toHex as toHex5 } from "@xylabs/hex";
1111
+
1112
+ // src/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.ts
1113
+ import { toHex as toHex4 } from "@xylabs/hex";
1114
+ import { AttoXL1ConvertFactor } from "@xyo-network/xl1-protocol";
1115
+ var getForkBlockReward = /* @__PURE__ */ __name(() => {
1116
+ return 18000000000n * AttoXL1ConvertFactor.xl1;
1117
+ }, "getForkBlockReward");
1118
+ var getForkBlockRewardHex = /* @__PURE__ */ __name(() => {
1119
+ return toHex4(getForkBlockReward());
1120
+ }, "getForkBlockRewardHex");
1121
+
1122
+ // src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts
1123
+ var ethChainId = toHex5("0x1");
1124
+ var bridgeableTokenContract = toHex5("0x7789e11BB83b398A8Cca8E8D582B33F91499D6f5");
1125
+ var bridgeDestAddress = toHex5("0xe53218d47913b5f9E58bb74F0a0eD790bbF21972");
1126
+ var destConfirmation = toHex5("0x772ee028f9ad291ec692912c1a33ecd4409e71383fe06f6ebf39f7cdbb779069");
1127
+ var getBridgeDestChainId = /* @__PURE__ */ __name(() => ethChainId, "getBridgeDestChainId");
1128
+ var getBridgeDestToken = /* @__PURE__ */ __name(() => bridgeableTokenContract, "getBridgeDestToken");
1129
+ var getBridgeDestAddress = /* @__PURE__ */ __name(() => bridgeDestAddress, "getBridgeDestAddress");
1130
+ var getBridgeDestAmount = /* @__PURE__ */ __name(() => getForkBlockRewardHex(), "getBridgeDestAmount");
1131
+ var getBridgeDestConfirmation = /* @__PURE__ */ __name(() => destConfirmation, "getBridgeDestConfirmation");
1132
+ var getBridgeDestinationDetails = /* @__PURE__ */ __name(() => {
1133
+ return {
1134
+ dest: getBridgeDestChainId(),
1135
+ destToken: getBridgeDestToken(),
1136
+ destAddress: getBridgeDestAddress(),
1137
+ destAmount: getBridgeDestAmount()
1138
+ };
1139
+ }, "getBridgeDestinationDetails");
1140
+
1141
+ // src/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts
1142
+ var getBridgeSrcChainId = /* @__PURE__ */ __name((chainService) => chainService.chainId, "getBridgeSrcChainId");
1143
+ var getBridgeSrcAddress = /* @__PURE__ */ __name((account) => account.address, "getBridgeSrcAddress");
1144
+ var getBridgeSrcToken = /* @__PURE__ */ __name((chainService) => chainService.chainId, "getBridgeSrcToken");
1145
+ var getBridgeSrcAmount = /* @__PURE__ */ __name(() => getForkBlockRewardHex(), "getBridgeSrcAmount");
1146
+ var getBridgeSourceDetails = /* @__PURE__ */ __name((account, chainService) => {
1147
+ return {
1148
+ src: getBridgeSrcChainId(chainService),
1149
+ srcAddress: getBridgeSrcAddress(account),
1150
+ srcToken: getBridgeSrcToken(chainService),
1151
+ srcAmount: getBridgeSrcAmount()
1152
+ };
1153
+ }, "getBridgeSourceDetails");
1154
+
1155
+ // src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts
1156
+ var getBridgeDestinationObservation = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
1157
+ const bridgeDestinationObservationFields = {
1158
+ ...getBridgeSourceDetails(account, chainService),
1159
+ ...getBridgeDestinationDetails(),
1160
+ destConfirmation: getBridgeDestConfirmation()
1161
+ };
1162
+ const bridgeDestinationObservation = new PayloadBuilder4({
1163
+ schema: BridgeDestinationObservationSchema
1164
+ }).fields(bridgeDestinationObservationFields).build();
1165
+ return await buildNextBlock(previousBlock[0], [], [
1166
+ bridgeDestinationObservation
1167
+ ], [
1168
+ account
1169
+ ]);
1170
+ }, "getBridgeDestinationObservation");
1171
+
1172
+ // src/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.ts
1173
+ import { BridgeIntentSchema, buildNextBlock as buildNextBlock2, createTransferPayload, XYO_BRIDGE_ADDRESS } from "@xyo-network/chain-sdk";
1174
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
1175
+ var getBridgeIntent = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
1176
+ const transferPayload = createTransferPayload(account.address, {
1177
+ [XYO_BRIDGE_ADDRESS]: getForkBlockReward()
1178
+ });
1179
+ const nonce = `${Date.now()}`;
1180
+ const bridgeIntentFields = {
1181
+ ...getBridgeSourceDetails(account, chainService),
1182
+ ...getBridgeDestinationDetails(),
1183
+ nonce
1184
+ };
1185
+ const bridgeIntent = new PayloadBuilder5({
1186
+ schema: BridgeIntentSchema
1187
+ }).fields(bridgeIntentFields).build();
1188
+ return await buildNextBlock2(previousBlock[0], [], [
1189
+ bridgeIntent,
1190
+ transferPayload
1191
+ ], [
1192
+ account
1193
+ ]);
1194
+ }, "getBridgeIntent");
1195
+
1196
+ // src/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.ts
1197
+ import { BridgeSourceObservationSchema, buildNextBlock as buildNextBlock3 } from "@xyo-network/chain-sdk";
1198
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1199
+ var getBridgeSourceObservation = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
1200
+ const srcTxHash = previousBlock[0]._hash;
1201
+ const bridgeSourceObservationFields = {
1202
+ ...getBridgeSourceDetails(account, chainService),
1203
+ ...getBridgeDestinationDetails(),
1204
+ // Observation
1205
+ srcConfirmation: srcTxHash
1206
+ };
1207
+ const bridgeSourceObservation = new PayloadBuilder6({
1208
+ schema: BridgeSourceObservationSchema
1209
+ }).fields(bridgeSourceObservationFields).build();
1210
+ return await buildNextBlock3(previousBlock[0], [], [
1211
+ bridgeSourceObservation
1212
+ ], [
1213
+ account
1214
+ ]);
1215
+ }, "getBridgeSourceObservation");
1216
+
1217
+ // src/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.ts
1218
+ import { buildBlock } from "@xyo-network/chain-sdk";
1219
+ var getFirstBlockForNewChain = /* @__PURE__ */ __name(async (forkBlock, account, chainService) => {
1113
1220
  const { _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes, protocol } = forkBlock;
1114
- const forkBlockReward = 0n;
1115
- const forkBlockRewardAddress = account.address;
1221
+ const chainId = chainService.chainId;
1222
+ const forkBlockReward = getForkBlockReward();
1116
1223
  const options = {
1117
1224
  blockPayloads: [],
1118
1225
  chainId,
@@ -1125,41 +1232,85 @@ var createForkedHead = /* @__PURE__ */ __name(async (chainSubmissionsArchivistWr
1125
1232
  txs: [],
1126
1233
  protocol,
1127
1234
  reward: forkBlockReward,
1128
- rewardAddress: forkBlockRewardAddress
1235
+ rewardAddress: account.address
1129
1236
  };
1130
- const block = await buildBlock(options);
1131
- const [bw] = block;
1132
- await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock2(block));
1133
- while (true) {
1134
- const result = await chainArchivist.get([
1135
- bw._hash
1136
- ]);
1137
- if (result.length > 0) break;
1138
- await delay(1e3);
1139
- }
1140
- return bw;
1237
+ return await buildBlock(options);
1238
+ }, "getFirstBlockForNewChain");
1239
+
1240
+ // src/orchestration/services/implementation/head/createForkedHead/createForkedHead.ts
1241
+ var createForkedHead = /* @__PURE__ */ __name(async (forkFromBlock, account, chainService) => {
1242
+ const chain = [];
1243
+ const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService);
1244
+ chain.push(firstBlockForNewChain);
1245
+ const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService);
1246
+ chain.push(bridgeIntent);
1247
+ const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService);
1248
+ chain.push(bridgeSourceObservation);
1249
+ const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService);
1250
+ chain.push(bridgeDestinationObservation);
1251
+ return chain;
1141
1252
  }, "createForkedHead");
1142
- var initHead = /* @__PURE__ */ __name(async (params) => {
1143
- const { account, chainArchivist, chainSubmissionsArchivistWrite, chainService } = params;
1144
- if (headSingleton) return headSingleton;
1145
- let head = await findMostRecentBlock2(chainArchivist);
1146
- if (!head) {
1147
- head = await createBootstrapHead(chainSubmissionsArchivistWrite, chainArchivist, account);
1148
- } else if (head.chain !== chainService.chainId) {
1253
+
1254
+ // src/orchestration/services/implementation/head/getForkFromBlock.ts
1255
+ import { asHash, hexFromBigInt } from "@xylabs/hex";
1256
+ import { isDefined as isDefined10 } from "@xylabs/typeof";
1257
+ import { isBlockBoundWitnessWithHashStorageMeta } from "@xyo-network/chain-sdk";
1258
+ var getForkFromBlock = /* @__PURE__ */ __name(async (head, chainService, chainArchivist) => {
1259
+ if (head.chain !== chainService.chainId) {
1149
1260
  const forkedAtBigInt = await chainService.forkedAtHash();
1150
1261
  const forkedAtHex = hexFromBigInt(forkedAtBigInt);
1151
1262
  const forkedAtHash = asHash(forkedAtHex);
1152
1263
  if (isDefined10(forkedAtHash)) {
1153
- const [forkBlock] = await chainArchivist.get([
1264
+ const [forkedAtBlock] = await chainArchivist.get([
1154
1265
  forkedAtHash
1155
1266
  ]);
1156
1267
  const forkedChainId = await chainService.forkedChainId();
1157
1268
  const forkedAtBlockNumber = Number(await chainService.forkedAtBlockNumber());
1158
- if (isBlockBoundWitnessWithHashStorageMeta(forkBlock) && forkBlock.chain === forkedChainId && forkBlock.block === forkedAtBlockNumber) {
1159
- head = await createForkedHead(chainSubmissionsArchivistWrite, chainArchivist, account, forkBlock, chainService.chainId);
1269
+ if (isBlockBoundWitnessWithHashStorageMeta(forkedAtBlock) && forkedAtBlock.chain === forkedChainId && forkedAtBlock.block === forkedAtBlockNumber) {
1270
+ return forkedAtBlock;
1160
1271
  }
1161
1272
  }
1162
1273
  }
1274
+ }, "getForkFromBlock");
1275
+
1276
+ // src/orchestration/services/implementation/head/submitNewChain.ts
1277
+ import { delay } from "@xylabs/delay";
1278
+ import { flattenHydratedBlock as flattenHydratedBlock2 } from "@xyo-network/xl1-protocol-sdk";
1279
+ var submitNewChain = /* @__PURE__ */ __name(async (chain, chainArchivist, chainSubmissionsArchivistWrite) => {
1280
+ for (const block of chain) {
1281
+ const [bw] = block;
1282
+ await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock2(block));
1283
+ while (true) {
1284
+ const result = await chainArchivist.get([
1285
+ bw._hash
1286
+ ]);
1287
+ if (result.length > 0) break;
1288
+ await delay(1e3);
1289
+ }
1290
+ }
1291
+ }, "submitNewChain");
1292
+
1293
+ // src/orchestration/services/implementation/head/head.ts
1294
+ var headSingleton;
1295
+ var initHead = /* @__PURE__ */ __name(async (params) => {
1296
+ const { account, chainArchivist, chainSubmissionsArchivistWrite, chainService } = params;
1297
+ if (headSingleton) return headSingleton;
1298
+ let head = await findMostRecentBlock2(chainArchivist);
1299
+ if (head) {
1300
+ const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist);
1301
+ if (isDefined11(forkFromBlock)) {
1302
+ const chain = await createForkedHead(forkFromBlock, account, chainService);
1303
+ await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite);
1304
+ const newBlock = assertEx16(chain.at(-1), () => new Error("Failed to get new head after forking"));
1305
+ head = newBlock[0];
1306
+ }
1307
+ } else {
1308
+ const genesisBlock = await createBootstrapHead(account);
1309
+ await submitNewChain([
1310
+ genesisBlock
1311
+ ], chainArchivist, chainSubmissionsArchivistWrite);
1312
+ head = genesisBlock[0];
1313
+ }
1163
1314
  headSingleton = head;
1164
1315
  return headSingleton;
1165
1316
  }, "initHead");
@@ -1204,7 +1355,7 @@ var initBlockProducer = /* @__PURE__ */ __name(async (params) => {
1204
1355
  }, "initBlockProducer");
1205
1356
 
1206
1357
  // src/orchestration/services/implementation/reward.ts
1207
- import { assertEx as assertEx16 } from "@xylabs/assert";
1358
+ import { assertEx as assertEx17 } from "@xylabs/assert";
1208
1359
  import { EvmBlockRewardService, MemoryBlockRewardService } from "@xyo-network/chain-sdk";
1209
1360
  var rewardServiceSingleton;
1210
1361
  var initBlockRewardService = /* @__PURE__ */ __name((params) => {
@@ -1226,8 +1377,8 @@ var canUseEvmBlockRewardService = /* @__PURE__ */ __name((params) => canUseEvmPr
1226
1377
  var initEvmBlockRewardService = /* @__PURE__ */ __name(async (params) => {
1227
1378
  if (rewardServiceSingleton) return rewardServiceSingleton;
1228
1379
  const { account: paramsAccount } = params;
1229
- const account = assertEx16(paramsAccount, () => "Error: Account is required");
1230
- const provider2 = assertEx16(await initEvmProvider(params));
1380
+ const account = assertEx17(paramsAccount, () => "Error: Account is required");
1381
+ const provider2 = assertEx17(await initEvmProvider(params));
1231
1382
  const evmBlockRewardServiceParams = {
1232
1383
  ...params,
1233
1384
  provider: provider2,
@@ -1337,7 +1488,7 @@ var RuntimeStatusMonitor = class extends LoggerStatusReporter {
1337
1488
 
1338
1489
  // src/orchestration/initServices.ts
1339
1490
  var isStartable = /* @__PURE__ */ __name((value) => {
1340
- return isDefined11(value.start) && typeof value.start === "function";
1491
+ return isDefined12(value.start) && typeof value.start === "function";
1341
1492
  }, "isStartable");
1342
1493
  var initServices = /* @__PURE__ */ __name(async (context) => {
1343
1494
  const { config: config3, logger } = context;
@@ -1463,7 +1614,7 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
1463
1614
  chainArchivist,
1464
1615
  chainIterator
1465
1616
  });
1466
- const rewardAddress = isDefined11(config3.producer.rewardAddress) ? assertEx17(asAddress2(config3.producer.rewardAddress), () => "Invalid block reward address provided") : account.address;
1617
+ const rewardAddress = isDefined12(config3.producer.rewardAddress) ? assertEx18(asAddress2(config3.producer.rewardAddress), () => "Invalid block reward address provided") : account.address;
1467
1618
  const producerParams = {
1468
1619
  ...validatorParams,
1469
1620
  name: "Producer",
@@ -1504,7 +1655,7 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
1504
1655
 
1505
1656
  // src/runCLI.ts
1506
1657
  import { deepMerge } from "@xylabs/object";
1507
- import { isDefined as isDefined14 } from "@xylabs/typeof";
1658
+ import { isDefined as isDefined15 } from "@xylabs/typeof";
1508
1659
  import { ConfigZod } from "@xyo-network/xl1-protocol-sdk";
1509
1660
  import yargs from "yargs";
1510
1661
  import { hideBin } from "yargs/helpers";
@@ -1564,16 +1715,16 @@ var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\
1564
1715
  // src/initLogger.ts
1565
1716
  import { Base as Base2 } from "@xylabs/base";
1566
1717
  import { ConsoleLogger, LogLevel, SilentLogger } from "@xylabs/logger";
1567
- import { isDefined as isDefined12 } from "@xylabs/typeof";
1718
+ import { isDefined as isDefined13 } from "@xylabs/typeof";
1568
1719
  var initLogger = /* @__PURE__ */ __name((config3) => {
1569
1720
  let logger;
1570
1721
  if (config3.silent) {
1571
1722
  logger = new SilentLogger();
1572
1723
  } else {
1573
1724
  let level;
1574
- if (isDefined12(config3.logLevel)) {
1725
+ if (isDefined13(config3.logLevel)) {
1575
1726
  const parsed = LogLevel[config3.logLevel.toLowerCase()];
1576
- if (isDefined12(parsed)) level = parsed;
1727
+ if (isDefined13(parsed)) level = parsed;
1577
1728
  }
1578
1729
  logger = new ConsoleLogger(level);
1579
1730
  }
@@ -1599,7 +1750,7 @@ var optionsFromGlobalZodRegistry = /* @__PURE__ */ __name(() => {
1599
1750
  }, "optionsFromGlobalZodRegistry");
1600
1751
 
1601
1752
  // src/tryParseConfig.ts
1602
- import { isDefined as isDefined13, isNull } from "@xylabs/typeof";
1753
+ import { isDefined as isDefined14, isNull } from "@xylabs/typeof";
1603
1754
  import { cosmiconfigSync } from "cosmiconfig";
1604
1755
  var configName = "xyo";
1605
1756
  var configSection = "xl1";
@@ -1608,7 +1759,7 @@ var tryParseConfig = /* @__PURE__ */ __name(() => {
1608
1759
  const result = explorer.search();
1609
1760
  if (!isNull(result)) {
1610
1761
  const section = result?.config?.[configSection];
1611
- if (isDefined13(section) && typeof section === "object") {
1762
+ if (isDefined14(section) && typeof section === "object") {
1612
1763
  return section;
1613
1764
  }
1614
1765
  }
@@ -1638,7 +1789,7 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
1638
1789
 
1639
1790
  // src/runCLI.ts
1640
1791
  var config;
1641
- var version = isDefined14("1.14.1") ? "1.14.1" : "unknown";
1792
+ var version = isDefined15("1.14.2") ? "1.14.2" : "unknown";
1642
1793
  var getContextFromConfig = /* @__PURE__ */ __name((config3) => {
1643
1794
  const logger = initLogger(config3);
1644
1795
  const orchestrator = new Orchestrator(logger);