@xyo-network/xl1-cli-lib 1.14.1 → 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 (74) hide show
  1. package/dist/node/index.mjs +255 -51
  2. package/dist/node/index.mjs.map +1 -1
  3. package/dist/node/orchestration/actor/implementation/BalanceActor.d.ts +1 -1
  4. package/dist/node/orchestration/actor/implementation/BalanceActor.d.ts.map +1 -1
  5. package/dist/node/orchestration/actor/implementation/ProducerActor.d.ts +1 -1
  6. package/dist/node/orchestration/actor/implementation/ProducerActor.d.ts.map +1 -1
  7. package/dist/node/orchestration/actor/implementation/ValidatorActor.d.ts +1 -1
  8. package/dist/node/orchestration/actor/implementation/ValidatorActor.d.ts.map +1 -1
  9. package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts +1 -1
  10. package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts.map +1 -1
  11. package/dist/node/orchestration/initServices.d.ts.map +1 -1
  12. package/dist/node/orchestration/services/implementation/head/createBootstrapHead.d.ts +4 -0
  13. package/dist/node/orchestration/services/implementation/head/createBootstrapHead.d.ts.map +1 -0
  14. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +18 -0
  15. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +1 -0
  16. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +14 -0
  17. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -0
  18. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.d.ts +4 -0
  19. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +1 -0
  20. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/index.d.ts +4 -0
  21. package/dist/node/orchestration/services/implementation/head/createForkedHead/config/index.d.ts.map +1 -0
  22. package/dist/node/orchestration/services/implementation/head/createForkedHead/createForkedHead.d.ts +5 -0
  23. package/dist/node/orchestration/services/implementation/head/createForkedHead/createForkedHead.d.ts.map +1 -0
  24. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +10 -0
  25. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +1 -0
  26. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.d.ts +10 -0
  27. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +1 -0
  28. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +10 -0
  29. package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +1 -0
  30. package/dist/node/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +12 -0
  31. package/dist/node/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +1 -0
  32. package/dist/node/orchestration/services/implementation/head/createForkedHead/index.d.ts +2 -0
  33. package/dist/node/orchestration/services/implementation/head/createForkedHead/index.d.ts.map +1 -0
  34. package/dist/node/orchestration/services/implementation/head/getForkFromBlock.d.ts +12 -0
  35. package/dist/node/orchestration/services/implementation/head/getForkFromBlock.d.ts.map +1 -0
  36. package/dist/node/orchestration/services/implementation/{head.d.ts → head/head.d.ts} +2 -1
  37. package/dist/node/orchestration/services/implementation/head/head.d.ts.map +1 -0
  38. package/dist/node/orchestration/services/implementation/head/index.d.ts +2 -0
  39. package/dist/node/orchestration/services/implementation/head/index.d.ts.map +1 -0
  40. package/dist/node/orchestration/services/implementation/head/submitNewChain.d.ts +10 -0
  41. package/dist/node/orchestration/services/implementation/head/submitNewChain.d.ts.map +1 -0
  42. package/dist/node/orchestration/services/implementation/index.d.ts +1 -1
  43. package/dist/node/orchestration/services/implementation/index.d.ts.map +1 -1
  44. package/dist/node/xl1.mjs +253 -49
  45. package/dist/node/xl1.mjs.map +1 -1
  46. package/package.json +13 -13
  47. package/src/orchestration/actor/implementation/BalanceActor.ts +2 -2
  48. package/src/orchestration/actor/implementation/ChainHeadUpdateActor.ts +2 -2
  49. package/src/orchestration/actor/implementation/ProducerActor.ts +4 -4
  50. package/src/orchestration/actor/implementation/ValidatorActor.ts +4 -4
  51. package/src/orchestration/actor/model/Actor.ts +2 -2
  52. package/src/orchestration/archivists/ChainFinalized/local.ts +1 -1
  53. package/src/orchestration/archivists/StakeIntentState/local.ts +1 -1
  54. package/src/orchestration/archivists/lib/localPersistentArchivist.ts +8 -1
  55. package/src/orchestration/initServices.ts +11 -7
  56. package/src/orchestration/services/implementation/head/createBootstrapHead.ts +8 -0
  57. package/src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +27 -0
  58. package/src/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +18 -0
  59. package/src/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.ts +10 -0
  60. package/src/orchestration/services/implementation/head/createForkedHead/config/index.ts +3 -0
  61. package/src/orchestration/services/implementation/head/createForkedHead/createForkedHead.ts +31 -0
  62. package/src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +38 -0
  63. package/src/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.ts +50 -0
  64. package/src/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.ts +43 -0
  65. package/src/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +42 -0
  66. package/src/orchestration/services/implementation/head/createForkedHead/index.ts +1 -0
  67. package/src/orchestration/services/implementation/head/getForkFromBlock.ts +42 -0
  68. package/src/orchestration/services/implementation/head/head.ts +52 -0
  69. package/src/orchestration/services/implementation/head/index.ts +1 -0
  70. package/src/orchestration/services/implementation/head/submitNewChain.ts +27 -0
  71. package/src/orchestration/services/implementation/index.ts +1 -1
  72. package/src/spec/BootstrapChain.spec.ts +2 -2
  73. package/dist/node/orchestration/services/implementation/head.d.ts.map +0 -1
  74. package/src/orchestration/services/implementation/head.ts +0 -44
@@ -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.
@@ -166,7 +166,7 @@ var BalanceActor = class _BalanceActor extends Actor {
166
166
  super("BalanceActor", "Balance", params);
167
167
  }
168
168
  get balanceService() {
169
- return assertEx(this.params.balanceService, () => "balanceService not set");
169
+ return assertEx(this.params.balance, () => "balanceService not set");
170
170
  }
171
171
  get chainIterator() {
172
172
  return assertEx(this.params.chainIterator, () => "chainIterator not set");
@@ -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
  };
@@ -266,7 +266,7 @@ var ProducerActor = class _ProducerActor extends Actor {
266
266
  return assertEx3(this.params.account, () => "account not set");
267
267
  }
268
268
  get balanceService() {
269
- return assertEx3(this.params.balanceService, () => "balanceService not set");
269
+ return assertEx3(this.params.balance, () => "balanceService not set");
270
270
  }
271
271
  get chainIterator() {
272
272
  return assertEx3(this.params.chainIterator, () => "chainIterator not set");
@@ -284,7 +284,7 @@ var ProducerActor = class _ProducerActor extends Actor {
284
284
  return assertEx3(this.params.producer, () => "producer not set");
285
285
  }
286
286
  get stakeIntentService() {
287
- return assertEx3(this.params.stakeIntentService, () => "stakeIntentService not set");
287
+ return assertEx3(this.params.stakeIntent, () => "stakeIntentService not set");
288
288
  }
289
289
  static create(params) {
290
290
  return new _ProducerActor(params);
@@ -413,7 +413,7 @@ var ValidatorActor = class _ValidatorActor extends Actor {
413
413
  return assertEx4(this.params.account, () => "account not set");
414
414
  }
415
415
  get balanceService() {
416
- return assertEx4(this.params.balanceService, () => "balanceService not set");
416
+ return assertEx4(this.params.balance, () => "balanceService not set");
417
417
  }
418
418
  get chainIterator() {
419
419
  return assertEx4(this.params.chainIterator, () => "chainIterator not set");
@@ -428,7 +428,7 @@ var ValidatorActor = class _ValidatorActor extends Actor {
428
428
  return assertEx4(this.params.pendingBundledTransactionsArchivistWrite, () => "pendingBundledTransactionsArchivistWrite not set");
429
429
  }
430
430
  get stakeIntentService() {
431
- return assertEx4(this.params.stakeIntentService, () => "stakeIntentService not set");
431
+ return assertEx4(this.params.stakeIntent, () => "stakeIntentService not set");
432
432
  }
433
433
  // protected get validator() {
434
434
  // return assertEx(this.params.validator, () => 'validator not set')
@@ -527,10 +527,10 @@ 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 isDefined10 } from "@xylabs/typeof";
533
- import { balanceSummaryRepositoryFromMap, initTelemetry, startupSpanAsync as startupSpanAsync7, validateHydratedBlockState } from "@xyo-network/chain-sdk";
532
+ import { isDefined as isDefined12 } from "@xylabs/typeof";
533
+ import { balanceSummaryRepositoryFromMap, BaseTimeSyncService, initTelemetry, startupSpanAsync as startupSpanAsync7, validateHydratedBlockState } from "@xyo-network/chain-sdk";
534
534
 
535
535
  // src/orchestration/archivists/ChainFinalized/archivist.ts
536
536
  import { initArchivistSync, startupSpanAsync } from "@xyo-network/chain-sdk";
@@ -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,227 @@ 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";
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
1094
1099
  import { ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/hex";
1095
- import { createGenesisBlock, findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/chain-sdk";
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);
1103
+ }, "createBootstrapHead");
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) => {
1220
+ const { _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes, protocol } = forkBlock;
1221
+ const chainId = chainService.chainId;
1222
+ const forkBlockReward = getForkBlockReward();
1223
+ const options = {
1224
+ blockPayloads: [],
1225
+ chainId,
1226
+ previousBlockHash,
1227
+ previousBlockNumber,
1228
+ previousStepHashes,
1229
+ signers: [
1230
+ account
1231
+ ],
1232
+ txs: [],
1233
+ protocol,
1234
+ reward: forkBlockReward,
1235
+ rewardAddress: account.address
1236
+ };
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;
1252
+ }, "createForkedHead");
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) {
1260
+ const forkedAtBigInt = await chainService.forkedAtHash();
1261
+ const forkedAtHex = hexFromBigInt(forkedAtBigInt);
1262
+ const forkedAtHash = asHash(forkedAtHex);
1263
+ if (isDefined10(forkedAtHash)) {
1264
+ const [forkedAtBlock] = await chainArchivist.get([
1265
+ forkedAtHash
1266
+ ]);
1267
+ const forkedChainId = await chainService.forkedChainId();
1268
+ const forkedAtBlockNumber = Number(await chainService.forkedAtBlockNumber());
1269
+ if (isBlockBoundWitnessWithHashStorageMeta(forkedAtBlock) && forkedAtBlock.chain === forkedChainId && forkedAtBlock.block === forkedAtBlockNumber) {
1270
+ return forkedAtBlock;
1271
+ }
1272
+ }
1273
+ }
1274
+ }, "getForkFromBlock");
1275
+
1276
+ // src/orchestration/services/implementation/head/submitNewChain.ts
1277
+ import { delay } from "@xylabs/delay";
1096
1278
  import { flattenHydratedBlock as flattenHydratedBlock2 } from "@xyo-network/xl1-protocol-sdk";
1097
- var headSingleton;
1098
- var createBootstrapHead = /* @__PURE__ */ __name(async (chainSubmissionsArchivistWrite, chainArchivist, account) => {
1099
- const block = await createGenesisBlock(account, ZERO_ADDRESS2, 10000000n, account.address);
1100
- const [bw] = block;
1101
- await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock2(block));
1102
- while (true) {
1103
- const result = await chainArchivist.get([
1104
- bw._hash
1105
- ]);
1106
- if (result.length > 0) break;
1107
- await delay(1e3);
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
+ }
1108
1290
  }
1109
- return bw;
1110
- }, "createBootstrapHead");
1291
+ }, "submitNewChain");
1292
+
1293
+ // src/orchestration/services/implementation/head/head.ts
1294
+ var headSingleton;
1111
1295
  var initHead = /* @__PURE__ */ __name(async (params) => {
1112
- const { account, chainArchivist, chainSubmissionsArchivistWrite } = params;
1296
+ const { account, chainArchivist, chainSubmissionsArchivistWrite, chainService } = params;
1113
1297
  if (headSingleton) return headSingleton;
1114
1298
  let head = await findMostRecentBlock2(chainArchivist);
1115
- if (!head) head = await createBootstrapHead(chainSubmissionsArchivistWrite, chainArchivist, account);
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
+ }
1116
1314
  headSingleton = head;
1117
1315
  return headSingleton;
1118
1316
  }, "initHead");
@@ -1157,7 +1355,7 @@ var initBlockProducer = /* @__PURE__ */ __name(async (params) => {
1157
1355
  }, "initBlockProducer");
1158
1356
 
1159
1357
  // src/orchestration/services/implementation/reward.ts
1160
- import { assertEx as assertEx16 } from "@xylabs/assert";
1358
+ import { assertEx as assertEx17 } from "@xylabs/assert";
1161
1359
  import { EvmBlockRewardService, MemoryBlockRewardService } from "@xyo-network/chain-sdk";
1162
1360
  var rewardServiceSingleton;
1163
1361
  var initBlockRewardService = /* @__PURE__ */ __name((params) => {
@@ -1179,8 +1377,8 @@ var canUseEvmBlockRewardService = /* @__PURE__ */ __name((params) => canUseEvmPr
1179
1377
  var initEvmBlockRewardService = /* @__PURE__ */ __name(async (params) => {
1180
1378
  if (rewardServiceSingleton) return rewardServiceSingleton;
1181
1379
  const { account: paramsAccount } = params;
1182
- const account = assertEx16(paramsAccount, () => "Error: Account is required");
1183
- const provider2 = assertEx16(await initEvmProvider(params));
1380
+ const account = assertEx17(paramsAccount, () => "Error: Account is required");
1381
+ const provider2 = assertEx17(await initEvmProvider(params));
1184
1382
  const evmBlockRewardServiceParams = {
1185
1383
  ...params,
1186
1384
  provider: provider2,
@@ -1290,7 +1488,7 @@ var RuntimeStatusMonitor = class extends LoggerStatusReporter {
1290
1488
 
1291
1489
  // src/orchestration/initServices.ts
1292
1490
  var isStartable = /* @__PURE__ */ __name((value) => {
1293
- return isDefined10(value.start) && typeof value.start === "function";
1491
+ return isDefined12(value.start) && typeof value.start === "function";
1294
1492
  }, "isStartable");
1295
1493
  var initServices = /* @__PURE__ */ __name(async (context) => {
1296
1494
  const { config: config3, logger } = context;
@@ -1354,7 +1552,8 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
1354
1552
  ...initParams,
1355
1553
  account,
1356
1554
  chainArchivist,
1357
- chainSubmissionsArchivistWrite
1555
+ chainSubmissionsArchivistWrite,
1556
+ chainService
1358
1557
  }));
1359
1558
  const [pendingTransactionsService, rewardService, chainIterator, balanceService] = await Promise.all([
1360
1559
  startupSpanAsync7("PendingTransactions", () => initPendingTransactions({
@@ -1411,7 +1610,11 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
1411
1610
  validateHydratedBlockState,
1412
1611
  ...initParams
1413
1612
  };
1414
- const rewardAddress = isDefined10(config3.producer.rewardAddress) ? assertEx17(asAddress2(config3.producer.rewardAddress), () => "Invalid block reward address provided") : account.address;
1613
+ const time = await BaseTimeSyncService.create({
1614
+ chainArchivist,
1615
+ chainIterator
1616
+ });
1617
+ const rewardAddress = isDefined12(config3.producer.rewardAddress) ? assertEx18(asAddress2(config3.producer.rewardAddress), () => "Invalid block reward address provided") : account.address;
1415
1618
  const producerParams = {
1416
1619
  ...validatorParams,
1417
1620
  name: "Producer",
@@ -1421,24 +1624,25 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
1421
1624
  pendingTransactionsService,
1422
1625
  rejectedTransactionsArchivist,
1423
1626
  rewardAddress,
1627
+ time,
1424
1628
  ...initParams
1425
1629
  };
1426
1630
  const producer = await startupSpanAsync7("Producer", () => initBlockProducer(producerParams));
1427
1631
  const result = {
1428
1632
  account,
1429
- balanceService,
1633
+ balance: balanceService,
1430
1634
  chainArchivist,
1431
1635
  chainContractViewer,
1432
1636
  chainIterator,
1433
1637
  chainStaker,
1434
1638
  chainStakeViewer,
1435
1639
  chainSubmissionsArchivistWrite,
1436
- electionService,
1640
+ election: electionService,
1437
1641
  pendingBundledTransactionsArchivistWrite,
1438
- pendingTransactionsService,
1642
+ pendingTransactions: pendingTransactionsService,
1439
1643
  producer,
1440
- rewardService,
1441
- stakeIntentService
1644
+ reward: rewardService,
1645
+ stakeIntent: stakeIntentService
1442
1646
  };
1443
1647
  logger?.log("All services created. Starting...");
1444
1648
  const startableServices = [
@@ -1451,7 +1655,7 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
1451
1655
 
1452
1656
  // src/runCLI.ts
1453
1657
  import { deepMerge } from "@xylabs/object";
1454
- import { isDefined as isDefined13 } from "@xylabs/typeof";
1658
+ import { isDefined as isDefined15 } from "@xylabs/typeof";
1455
1659
  import { ConfigZod } from "@xyo-network/xl1-protocol-sdk";
1456
1660
  import yargs from "yargs";
1457
1661
  import { hideBin } from "yargs/helpers";
@@ -1511,16 +1715,16 @@ var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\
1511
1715
  // src/initLogger.ts
1512
1716
  import { Base as Base2 } from "@xylabs/base";
1513
1717
  import { ConsoleLogger, LogLevel, SilentLogger } from "@xylabs/logger";
1514
- import { isDefined as isDefined11 } from "@xylabs/typeof";
1718
+ import { isDefined as isDefined13 } from "@xylabs/typeof";
1515
1719
  var initLogger = /* @__PURE__ */ __name((config3) => {
1516
1720
  let logger;
1517
1721
  if (config3.silent) {
1518
1722
  logger = new SilentLogger();
1519
1723
  } else {
1520
1724
  let level;
1521
- if (isDefined11(config3.logLevel)) {
1725
+ if (isDefined13(config3.logLevel)) {
1522
1726
  const parsed = LogLevel[config3.logLevel.toLowerCase()];
1523
- if (isDefined11(parsed)) level = parsed;
1727
+ if (isDefined13(parsed)) level = parsed;
1524
1728
  }
1525
1729
  logger = new ConsoleLogger(level);
1526
1730
  }
@@ -1546,7 +1750,7 @@ var optionsFromGlobalZodRegistry = /* @__PURE__ */ __name(() => {
1546
1750
  }, "optionsFromGlobalZodRegistry");
1547
1751
 
1548
1752
  // src/tryParseConfig.ts
1549
- import { isDefined as isDefined12, isNull } from "@xylabs/typeof";
1753
+ import { isDefined as isDefined14, isNull } from "@xylabs/typeof";
1550
1754
  import { cosmiconfigSync } from "cosmiconfig";
1551
1755
  var configName = "xyo";
1552
1756
  var configSection = "xl1";
@@ -1555,7 +1759,7 @@ var tryParseConfig = /* @__PURE__ */ __name(() => {
1555
1759
  const result = explorer.search();
1556
1760
  if (!isNull(result)) {
1557
1761
  const section = result?.config?.[configSection];
1558
- if (isDefined12(section) && typeof section === "object") {
1762
+ if (isDefined14(section) && typeof section === "object") {
1559
1763
  return section;
1560
1764
  }
1561
1765
  }
@@ -1585,7 +1789,7 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
1585
1789
 
1586
1790
  // src/runCLI.ts
1587
1791
  var config;
1588
- var version = isDefined13("1.14.0") ? "1.14.0" : "unknown";
1792
+ var version = isDefined15("1.14.2") ? "1.14.2" : "unknown";
1589
1793
  var getContextFromConfig = /* @__PURE__ */ __name((config3) => {
1590
1794
  const logger = initLogger(config3);
1591
1795
  const orchestrator = new Orchestrator(logger);