@xyo-network/xl1-protocol-sdk 2.1.9 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/neutral/ChainContextHelpers.d.ts +1 -1
- package/dist/neutral/ChainContextHelpers.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts +36 -3
- package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactory.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts.map +1 -1
- package/dist/neutral/amount/index.d.ts +1 -1
- package/dist/neutral/amount/splitOnDecimalToString.d.ts.map +1 -1
- package/dist/neutral/amount/{XL1Amount.d.ts → xl1Amount.d.ts} +1 -1
- package/dist/neutral/amount/{XL1Amount.d.ts.map → xl1Amount.d.ts.map} +1 -1
- package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
- package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts.map +1 -1
- package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
- package/dist/neutral/block/primitives/validateTransactionOpcodes.d.ts.map +1 -1
- package/dist/neutral/capabilities/resolveProviders.d.ts +6 -0
- package/dist/neutral/capabilities/resolveProviders.d.ts.map +1 -1
- package/dist/neutral/config/Actor.d.ts +216 -18
- package/dist/neutral/config/Actor.d.ts.map +1 -1
- package/dist/neutral/config/Actors.d.ts +36 -3
- package/dist/neutral/config/Actors.d.ts.map +1 -1
- package/dist/neutral/config/Base.d.ts +36 -3
- package/dist/neutral/config/Base.d.ts.map +1 -1
- package/dist/neutral/config/Chain.d.ts +1 -1
- package/dist/neutral/config/Config.d.ts +144 -12
- package/dist/neutral/config/Config.d.ts.map +1 -1
- package/dist/neutral/config/HostActor.d.ts +216 -18
- package/dist/neutral/config/HostActor.d.ts.map +1 -1
- package/dist/neutral/config/ProviderBinding.d.ts +18 -0
- package/dist/neutral/config/ProviderBinding.d.ts.map +1 -0
- package/dist/neutral/config/Validation.d.ts +2 -2
- package/dist/neutral/config/adaptLegacyConfig.d.ts +9 -0
- package/dist/neutral/config/adaptLegacyConfig.d.ts.map +1 -0
- package/dist/neutral/config/index.d.ts +3 -0
- package/dist/neutral/config/index.d.ts.map +1 -1
- package/dist/neutral/config/transports/Transport.d.ts +111 -0
- package/dist/neutral/config/transports/Transport.d.ts.map +1 -0
- package/dist/neutral/config/transports/index.d.ts +2 -0
- package/dist/neutral/config/transports/index.d.ts.map +1 -0
- package/dist/neutral/context/Actor.d.ts +216 -18
- package/dist/neutral/context/Actor.d.ts.map +1 -1
- package/dist/neutral/context/HostActor.d.ts +216 -18
- package/dist/neutral/context/HostActor.d.ts.map +1 -1
- package/dist/neutral/createDeclarationPayload.d.ts +1 -1
- package/dist/neutral/createDeclarationPayload.d.ts.map +1 -1
- package/dist/neutral/createTransferPayload.d.ts +1 -1
- package/dist/neutral/createTransferPayload.d.ts.map +1 -1
- package/dist/neutral/getFileConfig.d.ts +72 -6
- package/dist/neutral/getFileConfig.d.ts.map +1 -1
- package/dist/neutral/getFileConfig.mjs +151 -81
- package/dist/neutral/getFileConfig.mjs.map +4 -4
- package/dist/neutral/index.mjs +776 -442
- package/dist/neutral/index.mjs.map +4 -4
- package/dist/neutral/instances/Address.d.ts +1 -1
- package/dist/neutral/instances/Address.d.ts.map +1 -1
- package/dist/neutral/instances/Signature.d.ts +1 -1
- package/dist/neutral/instances/Signature.d.ts.map +1 -1
- package/dist/neutral/model/CreatableProviderContext.zod.d.ts +216 -18
- package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +1 -1
- package/dist/neutral/payloads/AddressPairPayload.d.ts +1 -2
- package/dist/neutral/payloads/AddressPairPayload.d.ts.map +1 -1
- package/dist/neutral/payloads/netBalancesForPayloads.d.ts +2 -2
- package/dist/neutral/payloads/netBalancesForPayloads.d.ts.map +1 -1
- package/dist/neutral/payloads/netSchemasForPayloads.d.ts +2 -2
- package/dist/neutral/payloads/netSchemasForPayloads.d.ts.map +1 -1
- package/dist/neutral/payloads/netTransfersForPayloads.d.ts +1 -2
- package/dist/neutral/payloads/netTransfersForPayloads.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts +1 -1
- package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/step/stepRewardTotal.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts → externalBlockNumberFromXl1BlockNumber.d.ts} +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts.map → externalBlockNumberFromXl1BlockNumber.d.ts.map} +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts → externalBlockRangeFromXl1BlockRange.d.ts} +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts.map → externalBlockRangeFromXl1BlockRange.d.ts.map} +1 -1
- package/dist/neutral/primitives/chain/time/index.d.ts +2 -2
- package/dist/neutral/primitives/datalake/PayloadLocator.d.ts.map +1 -1
- package/dist/neutral/primitives/datalake/addDataLakePayloadsToPayloads.d.ts.map +1 -1
- package/dist/neutral/primitives/payload/mergeTransfers.d.ts +1 -1
- package/dist/neutral/primitives/payload/mergeTransfers.d.ts.map +1 -1
- package/dist/neutral/primitives/readPayloadMapFromStore.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts +1 -1
- package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/activeStakeAtTimeByPosition.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/allStakersForRange.d.ts +1 -1
- package/dist/neutral/primitives/stake/allStakersForRange.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/allStakersForStep.d.ts +1 -1
- package/dist/neutral/primitives/stake/allStakersForStep.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/mergedAddRemoveStakeEventsByStaker.d.ts +1 -1
- package/dist/neutral/primitives/stake/mergedAddRemoveStakeEventsByStaker.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts +1 -1
- package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
- package/dist/neutral/primitives/state/findMostRecentBlock.d.ts.map +1 -1
- package/dist/neutral/primitives/uncle/findUncles.d.ts +2 -2
- package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
- package/dist/neutral/services/AccountTransfersService.d.ts +1 -1
- package/dist/neutral/services/AccountTransfersService.d.ts.map +1 -1
- package/dist/neutral/services/Election.d.ts +1 -2
- package/dist/neutral/services/Election.d.ts.map +1 -1
- package/dist/neutral/services/StakeIntentService/StakeIntentService.d.ts +1 -1
- package/dist/neutral/services/StakeIntentService/StakeIntentService.d.ts.map +1 -1
- package/dist/neutral/simple/StakeTotalsViewer/SimpleStakeTotalsViewer.d.ts +1 -1
- package/dist/neutral/simple/StakeTotalsViewer/SimpleStakeTotalsViewer.d.ts.map +1 -1
- package/dist/neutral/simple/StakeViewer/SimpleStakeViewer.d.ts +1 -1
- package/dist/neutral/simple/StakeViewer/SimpleStakeViewer.d.ts.map +1 -1
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +12 -16
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
- package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
- package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts +1 -1
- package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts +1 -1
- package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/chainContractViewer/SimpleChainContractViewer.d.ts +3 -3
- package/dist/neutral/simple/chainContractViewer/SimpleChainContractViewer.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/AbstractRestDataLake.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/RestDataLakeRunner.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
- package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -1
- package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts +1 -2
- package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts.map +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +2 -0
- package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
- package/dist/neutral/simple/network/SimpleXyoNetwork.d.ts.map +1 -1
- package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts +1 -2
- package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts.map +1 -1
- package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts +1 -1
- package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts.map +1 -1
- package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts +1 -1
- package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts +1 -1
- package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts.map +1 -1
- package/dist/neutral/summary/model/BalancesStepSummary.d.ts +1 -2
- package/dist/neutral/summary/model/BalancesStepSummary.d.ts.map +1 -1
- package/dist/neutral/summary/model/TransfersSummary.d.ts +1 -2
- package/dist/neutral/summary/model/TransfersSummary.d.ts.map +1 -1
- package/dist/neutral/summary/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
- package/dist/neutral/summary/primitives/balances/balancesSummary.d.ts +1 -1
- package/dist/neutral/summary/primitives/balances/balancesSummary.d.ts.map +1 -1
- package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts +1 -1
- package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts.map +1 -1
- package/dist/neutral/test/BuildBlockOptions.d.ts +1 -2
- package/dist/neutral/test/BuildBlockOptions.d.ts.map +1 -1
- package/dist/neutral/test/buildBlock.d.ts.map +1 -1
- package/dist/neutral/test/buildNextBlock.d.ts +1 -2
- package/dist/neutral/test/buildNextBlock.d.ts.map +1 -1
- package/dist/neutral/test/buildRandomChain.d.ts +1 -2
- package/dist/neutral/test/buildRandomChain.d.ts.map +1 -1
- package/dist/neutral/test/buildRandomGenesisBlock.d.ts.map +1 -1
- package/dist/neutral/test/buildRandomTransaction.d.ts +1 -2
- package/dist/neutral/test/buildRandomTransaction.d.ts.map +1 -1
- package/dist/neutral/test/createGenesisBlock.d.ts +1 -2
- package/dist/neutral/test/createGenesisBlock.d.ts.map +1 -1
- package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts +1 -2
- package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts.map +1 -1
- package/dist/neutral/test/getSimpleBlockViewerLocator.d.ts +1 -2
- package/dist/neutral/test/getSimpleBlockViewerLocator.d.ts.map +1 -1
- package/dist/neutral/test/index.mjs +287 -166
- package/dist/neutral/test/index.mjs.map +4 -4
- package/dist/neutral/transaction/buildTransaction.d.ts +1 -2
- package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
- package/dist/neutral/transaction/buildUnsignedTransaction.d.ts +1 -2
- package/dist/neutral/transaction/buildUnsignedTransaction.d.ts.map +1 -1
- package/dist/neutral/transaction/confirmSubmittedTransaction.d.ts.map +1 -1
- package/dist/neutral/transaction/hydrateTransaction.d.ts.map +1 -1
- package/package.json +8 -10
|
@@ -54,15 +54,18 @@ var hydrateBlock = async (context, hash, maxDepth = 1, minDepth = maxDepth) => {
|
|
|
54
54
|
assertEx(block, () => `block ${hash} not found`)
|
|
55
55
|
), () => `hash ${hash} is not a BlockBoundWitness`);
|
|
56
56
|
if (maxDepth === 0) return [bw, []];
|
|
57
|
-
const
|
|
57
|
+
const blockPayloadResults = await chainMap.get(bw.payload_hashes);
|
|
58
|
+
const blkPayloads = blockPayloadResults.map((p) => asAnyPayload(p, true));
|
|
58
59
|
if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`);
|
|
59
60
|
if (maxDepth === 1) return [bw, blkPayloads];
|
|
60
61
|
const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta);
|
|
61
62
|
const transactionsPayloadHashes = transactions.flatMap((tx) => tx.payload_hashes);
|
|
62
|
-
const
|
|
63
|
+
const transactionPayloadResults = await chainMap.get(transactionsPayloadHashes);
|
|
64
|
+
const transactionsPayloads = transactionPayloadResults.map((p) => asAnyPayload(p, true));
|
|
63
65
|
assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`);
|
|
64
66
|
const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap((p) => p._hash));
|
|
65
|
-
const
|
|
67
|
+
const allPayloadResults = await chainMap.get([...allPayloadsHashes]);
|
|
68
|
+
const allPayloads = allPayloadResults.map((p) => asAnyPayload(p, true));
|
|
66
69
|
const allPayloadsFiltered = allPayloads.filter((p) => allPayloadsHashes.has(p._hash));
|
|
67
70
|
if (maxDepth === 2) assertEx(allHashesPresent(
|
|
68
71
|
[...allPayloadsHashes],
|
|
@@ -120,7 +123,7 @@ async function withContextCacheResponse(context, name, key, func, { max = 1e4 }
|
|
|
120
123
|
// src/block/primitives/blockFromBlockNumber.ts
|
|
121
124
|
async function blockFromBlockNumber(context, blockNumber) {
|
|
122
125
|
return await spanAsync("blockFromBlockNumber", async () => {
|
|
123
|
-
const cacheKey =
|
|
126
|
+
const cacheKey = String(blockNumber);
|
|
124
127
|
const { chainMap, head } = context;
|
|
125
128
|
return await withContextCacheResponse(context, "blockFromBlockNumber", cacheKey, async () => {
|
|
126
129
|
const [result] = await chainMap.get([head._hash]);
|
|
@@ -226,35 +229,41 @@ import {
|
|
|
226
229
|
PayloadBuilder
|
|
227
230
|
} from "@xyo-network/sdk-js";
|
|
228
231
|
import { isExecutable } from "@xyo-network/xl1-protocol-lib";
|
|
232
|
+
async function processElevateOperation(opCode, args, txBw, txPayloads) {
|
|
233
|
+
const [hash, ...rest] = args;
|
|
234
|
+
const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads);
|
|
235
|
+
assertEx2(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
|
|
236
|
+
if (isHash(hash)) {
|
|
237
|
+
assertEx2(
|
|
238
|
+
txBw.payload_hashes.includes(hash),
|
|
239
|
+
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
|
|
240
|
+
);
|
|
241
|
+
return assertEx2(
|
|
242
|
+
txPayloadsWithStorageMeta.find((p) => p._hash === hash),
|
|
243
|
+
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
|
|
247
|
+
}
|
|
248
|
+
async function processOperation(opCode, args, txBw, txPayloads) {
|
|
249
|
+
switch (opCode) {
|
|
250
|
+
case "elevate": {
|
|
251
|
+
return await processElevateOperation(opCode, args, txBw, txPayloads);
|
|
252
|
+
}
|
|
253
|
+
default: {
|
|
254
|
+
throw new Error(`Invalid opCode ${opCode}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
229
258
|
async function validateTransactionsOpcodes(txs) {
|
|
230
259
|
const txElevatedPayloads = [];
|
|
231
260
|
for (const [txBw, txPayloads] of txs) {
|
|
232
261
|
if (isExecutable(txBw)) {
|
|
233
262
|
const operations = txBw.script.map((op) => op.split("|"));
|
|
234
263
|
for (const [opCode, ...args] of operations) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads);
|
|
239
|
-
assertEx2(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
|
|
240
|
-
if (isHash(hash)) {
|
|
241
|
-
assertEx2(
|
|
242
|
-
txBw.payload_hashes.includes(hash),
|
|
243
|
-
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
|
|
244
|
-
);
|
|
245
|
-
const txPayload = assertEx2(
|
|
246
|
-
txPayloadsWithStorageMeta.find((p) => p._hash === hash),
|
|
247
|
-
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
|
|
248
|
-
);
|
|
249
|
-
txElevatedPayloads.push(txPayload);
|
|
250
|
-
} else {
|
|
251
|
-
throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
|
|
252
|
-
}
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
default: {
|
|
256
|
-
throw new Error(`Invalid opCode ${opCode}`);
|
|
257
|
-
}
|
|
264
|
+
const txPayload = await processOperation(opCode, args, txBw, txPayloads);
|
|
265
|
+
if (txPayload !== void 0) {
|
|
266
|
+
txElevatedPayloads.push(txPayload);
|
|
258
267
|
}
|
|
259
268
|
}
|
|
260
269
|
}
|
|
@@ -292,12 +301,14 @@ import { toHex } from "@xylabs/sdk-js";
|
|
|
292
301
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
|
|
293
302
|
import { TransferSchema } from "@xyo-network/xl1-protocol-lib";
|
|
294
303
|
function createTransferPayload(from, transfers, context) {
|
|
295
|
-
|
|
304
|
+
const payloadBuilder = new PayloadBuilder2({ schema: TransferSchema });
|
|
305
|
+
const builder = payloadBuilder.fields({
|
|
296
306
|
epoch: Date.now(),
|
|
297
307
|
from,
|
|
298
308
|
transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex(v)])),
|
|
299
309
|
context
|
|
300
|
-
})
|
|
310
|
+
});
|
|
311
|
+
return builder.build();
|
|
301
312
|
}
|
|
302
313
|
|
|
303
314
|
// src/test/BuildBlockOptions.ts
|
|
@@ -352,6 +363,26 @@ var isBuildNextBlockOptions = (value) => {
|
|
|
352
363
|
function calculateCompletedStepReward(step, balance) {
|
|
353
364
|
return AttoXL1(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1]);
|
|
354
365
|
}
|
|
366
|
+
function buildStepHashes(blockNumber, inStepHashes, previousBlockHash, chainStepRewardAddress, stepRewardPoolBalance) {
|
|
367
|
+
const completedStepRewardTransfers = [];
|
|
368
|
+
const step_hashes = [];
|
|
369
|
+
for (const [i, step] of StepSizes3.entries()) {
|
|
370
|
+
if (blockNumber < step) {
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
if (blockNumber % step === 0) {
|
|
374
|
+
if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {
|
|
375
|
+
const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
|
|
376
|
+
const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
|
|
377
|
+
completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }));
|
|
378
|
+
}
|
|
379
|
+
step_hashes.push(assertEx3(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
|
|
380
|
+
} else if (isDefined3(inStepHashes.at(i))) {
|
|
381
|
+
step_hashes.push(inStepHashes[i]);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return { completedStepRewardTransfers, step_hashes };
|
|
385
|
+
}
|
|
355
386
|
async function buildBlock(options) {
|
|
356
387
|
const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber;
|
|
357
388
|
const blockNumber = asXL1BlockNumber2(previousBlockNumber + 1, true);
|
|
@@ -366,7 +397,6 @@ async function buildBlock(options) {
|
|
|
366
397
|
protocol = XL1_PROTOCOL_VERSION,
|
|
367
398
|
signers
|
|
368
399
|
} = options;
|
|
369
|
-
const step_hashes = [];
|
|
370
400
|
for (const [tx] of txs) {
|
|
371
401
|
if (tx.nbf > blockNumber) {
|
|
372
402
|
throw new Error(`Transaction ${await PayloadBuilder3.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`);
|
|
@@ -375,24 +405,13 @@ async function buildBlock(options) {
|
|
|
375
405
|
throw new Error(`Transaction ${await PayloadBuilder3.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`);
|
|
376
406
|
}
|
|
377
407
|
}
|
|
378
|
-
const completedStepRewardTransfers =
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
|
|
386
|
-
const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
|
|
387
|
-
completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }));
|
|
388
|
-
}
|
|
389
|
-
step_hashes.push(assertEx3(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
|
|
390
|
-
} else {
|
|
391
|
-
if (isDefined3(inStepHashes.at(i))) {
|
|
392
|
-
step_hashes.push(inStepHashes[i]);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
408
|
+
const { step_hashes, completedStepRewardTransfers } = buildStepHashes(
|
|
409
|
+
blockNumber,
|
|
410
|
+
inStepHashes,
|
|
411
|
+
previousBlockHash,
|
|
412
|
+
chainStepRewardAddress,
|
|
413
|
+
stepRewardPoolBalance
|
|
414
|
+
);
|
|
396
415
|
const previous = previousBlockHash ?? null;
|
|
397
416
|
const block = blockNumber;
|
|
398
417
|
const txElevatedPayloads = await validateTransactionsOpcodes(txs);
|
|
@@ -402,13 +421,15 @@ async function buildBlock(options) {
|
|
|
402
421
|
...txElevatedPayloads,
|
|
403
422
|
...completedStepRewardTransfers
|
|
404
423
|
];
|
|
405
|
-
const
|
|
424
|
+
const boundWitnessBuilder = new BoundWitnessBuilder();
|
|
425
|
+
const builder = boundWitnessBuilder.fields({
|
|
406
426
|
block,
|
|
407
427
|
chain: chainId,
|
|
408
428
|
previous,
|
|
409
429
|
step_hashes,
|
|
410
430
|
protocol
|
|
411
|
-
}).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder3.addStorageMeta(payloads))
|
|
431
|
+
}).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder3.addStorageMeta(payloads));
|
|
432
|
+
const [bw, txPayloads] = await builder.build();
|
|
412
433
|
assertEx3(isBlockBoundWitness(bw), () => "Build of BlockBoundWitness failed");
|
|
413
434
|
return [await PayloadBuilder3.addStorageMeta(bw), txPayloads.map((p) => asAnyPayload2(p, true))];
|
|
414
435
|
}
|
|
@@ -484,10 +505,7 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
|
|
|
484
505
|
exp
|
|
485
506
|
};
|
|
486
507
|
const elevatedHashes = await PayloadBuilder4.hashes(onChainPayloads);
|
|
487
|
-
const script =
|
|
488
|
-
for (const elevatedHash of elevatedHashes) {
|
|
489
|
-
script.push(`elevate|${elevatedHash}`);
|
|
490
|
-
}
|
|
508
|
+
const script = Array.from(elevatedHashes, (elevatedHash) => `elevate|${elevatedHash}`);
|
|
491
509
|
const fields = {
|
|
492
510
|
...txBoundWitnessFields,
|
|
493
511
|
from: from ?? (Array.isArray(signer) ? assertEx4(signer.at(0)?.address) : signer.address)
|
|
@@ -495,7 +513,9 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
|
|
|
495
513
|
if (script.length > 0) {
|
|
496
514
|
fields.script = script;
|
|
497
515
|
}
|
|
498
|
-
const
|
|
516
|
+
const boundWitnessBuilder = new BoundWitnessBuilder2();
|
|
517
|
+
const builder = boundWitnessBuilder.fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).signers(Array.isArray(signer) ? signer : [signer]);
|
|
518
|
+
const [tx, txPayloads] = await builder.build();
|
|
499
519
|
return [await PayloadBuilder4.addHashMeta(tx), await PayloadBuilder4.addHashMeta(txPayloads.map((p) => asAnyPayload3(p, true)))];
|
|
500
520
|
}
|
|
501
521
|
|
|
@@ -505,7 +525,8 @@ var buildRandomTransaction = async (chain, payloads, account, nbf = asXL1BlockNu
|
|
|
505
525
|
const additionalPayloads = (payloads ?? []).filter((payload) => !isAllowedBlockPayload(payload));
|
|
506
526
|
const sender = account ?? await Account.random();
|
|
507
527
|
if (elevatedPayloads.length === 0) {
|
|
508
|
-
const
|
|
528
|
+
const defaultReceiver = await Account.random();
|
|
529
|
+
const receiver = receiverAddress ?? defaultReceiver.address;
|
|
509
530
|
const transferPayload = createTransferPayload(sender.address, { [receiver]: 1n });
|
|
510
531
|
elevatedPayloads.push(transferPayload);
|
|
511
532
|
}
|
|
@@ -536,12 +557,14 @@ import {
|
|
|
536
557
|
defaultTransactionFees as defaultTransactionFees2
|
|
537
558
|
} from "@xyo-network/xl1-protocol-lib";
|
|
538
559
|
async function createProducerChainStakeIntent(from, exp, nbf = 0) {
|
|
539
|
-
|
|
560
|
+
const payloadBuilder = new PayloadBuilder6({ schema: ChainStakeIntentSchema });
|
|
561
|
+
const builder = payloadBuilder.fields({
|
|
540
562
|
from,
|
|
541
563
|
exp,
|
|
542
564
|
nbf,
|
|
543
565
|
intent: "producer"
|
|
544
|
-
})
|
|
566
|
+
});
|
|
567
|
+
return await PayloadBuilder6.addHashMeta(builder.build());
|
|
545
568
|
}
|
|
546
569
|
|
|
547
570
|
// src/test/createGenesisBlock.ts
|
|
@@ -585,13 +608,20 @@ var buildRandomChain = async (blockProducer, count = 10, previousBlock, chainId,
|
|
|
585
608
|
remaining = remaining - 1;
|
|
586
609
|
lastBlock = block;
|
|
587
610
|
}
|
|
588
|
-
const
|
|
611
|
+
const defaultReceiver = await Account3.random();
|
|
612
|
+
const resolvedReceiverAddresses = receiverAddresses ?? [defaultReceiver.address];
|
|
589
613
|
let saltCounter = 0;
|
|
590
614
|
while (remaining > 0) {
|
|
591
615
|
saltCounter += 1;
|
|
592
|
-
const
|
|
616
|
+
const idPayloadBuilder = new PayloadBuilder8({ schema: IdSchema2 });
|
|
617
|
+
const idBuilder = idPayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
|
|
618
|
+
const payloads = [idBuilder.build()];
|
|
593
619
|
saltCounter += 1;
|
|
594
|
-
const additionalPrivatePayloads = remaining % 2 === 0 ?
|
|
620
|
+
const additionalPrivatePayloads = remaining % 2 === 0 ? (() => {
|
|
621
|
+
const privatePayloadBuilder = new PayloadBuilder8({ schema: asSchema2("network.xyo.private", true) });
|
|
622
|
+
const privateBuilder = privatePayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
|
|
623
|
+
return [privateBuilder.build()];
|
|
624
|
+
})() : [];
|
|
595
625
|
const txs = [];
|
|
596
626
|
for (const receiverAddress of resolvedReceiverAddresses) {
|
|
597
627
|
txs.push(await buildRandomTransaction(
|
|
@@ -661,7 +691,7 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
661
691
|
get resolvedMoniker() {
|
|
662
692
|
const labels = this.labels ?? {};
|
|
663
693
|
const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",");
|
|
664
|
-
return labelString.length === 0 ?
|
|
694
|
+
return labelString.length === 0 ? this.defaultMoniker : `${this.defaultMoniker}|${labelString}`;
|
|
665
695
|
}
|
|
666
696
|
get uniqueId() {
|
|
667
697
|
return this._uniqueId;
|
|
@@ -676,8 +706,7 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
676
706
|
let scopeObject;
|
|
677
707
|
switch (this.scope) {
|
|
678
708
|
case "global": {
|
|
679
|
-
|
|
680
|
-
scopeObject = globalThis.xyoServiceSingletons;
|
|
709
|
+
scopeObject = getOrCreateGlobalSingletons();
|
|
681
710
|
break;
|
|
682
711
|
}
|
|
683
712
|
case "context": {
|
|
@@ -714,6 +743,15 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
714
743
|
}
|
|
715
744
|
}
|
|
716
745
|
};
|
|
746
|
+
function getOrCreateGlobalSingletons() {
|
|
747
|
+
const existing = globalThis.xyoServiceSingletons;
|
|
748
|
+
if (existing !== void 0) {
|
|
749
|
+
return existing;
|
|
750
|
+
}
|
|
751
|
+
const singletons = {};
|
|
752
|
+
Reflect.set(globalThis, "xyoServiceSingletons", singletons);
|
|
753
|
+
return singletons;
|
|
754
|
+
}
|
|
717
755
|
|
|
718
756
|
// src/CreatableProvider/AbstractCreatableProvider.ts
|
|
719
757
|
var AbstractCreatableProvider = class extends AbstractCreatable {
|
|
@@ -883,7 +921,7 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
883
921
|
);
|
|
884
922
|
}
|
|
885
923
|
has(moniker) {
|
|
886
|
-
return
|
|
924
|
+
return Object.hasOwn(this._registry, moniker);
|
|
887
925
|
}
|
|
888
926
|
/**
|
|
889
927
|
* Locates a provider factory that matches the supplied moniker and labels
|
|
@@ -900,10 +938,11 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
900
938
|
merge(locator) {
|
|
901
939
|
const registry = { ...this.registry };
|
|
902
940
|
for (const moniker in locator.registry) {
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
} else {
|
|
941
|
+
const existing = registry[moniker];
|
|
942
|
+
if (existing === void 0) {
|
|
906
943
|
registry[moniker] = locator.registry[moniker];
|
|
944
|
+
} else {
|
|
945
|
+
existing.push(...locator.registry[moniker] ?? []);
|
|
907
946
|
}
|
|
908
947
|
}
|
|
909
948
|
return new _ProviderFactoryLocator(this.context, registry);
|
|
@@ -933,13 +972,13 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
933
972
|
return this;
|
|
934
973
|
}
|
|
935
974
|
registered(moniker) {
|
|
936
|
-
return
|
|
975
|
+
return Object.hasOwn(this.registry, moniker) || (this._parent?.registered(moniker) ?? false);
|
|
937
976
|
}
|
|
938
977
|
async tryGetInstance(moniker, { start = true, labels } = {}) {
|
|
939
978
|
const resolvedParams = { context: this.context };
|
|
940
979
|
const factory = this.tryLocate(moniker, labels);
|
|
941
|
-
if (factory) {
|
|
942
|
-
if (this.context.singletons
|
|
980
|
+
if (factory !== void 0) {
|
|
981
|
+
if (Object.hasOwn(this.context.singletons, factory.uniqueId)) {
|
|
943
982
|
return this.context.singletons[factory.uniqueId];
|
|
944
983
|
}
|
|
945
984
|
this.logger?.debug(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ""} using factory [${factory.uniqueId.description}]`);
|
|
@@ -990,14 +1029,14 @@ import {
|
|
|
990
1029
|
zodIsFactory as zodIsFactory2,
|
|
991
1030
|
zodToFactory as zodToFactory2
|
|
992
1031
|
} from "@xylabs/sdk-js";
|
|
993
|
-
import { globalRegistry as
|
|
1032
|
+
import { globalRegistry as globalRegistry14, z as z19 } from "zod/mini";
|
|
994
1033
|
|
|
995
1034
|
// src/config/Base.ts
|
|
996
|
-
import { z as
|
|
1035
|
+
import { z as z18 } from "zod/mini";
|
|
997
1036
|
|
|
998
1037
|
// src/config/Chain.ts
|
|
999
1038
|
import { HexZod } from "@xylabs/sdk-js";
|
|
1000
|
-
import { XyoAddressZod } from "@xyo-network/
|
|
1039
|
+
import { XyoAddressZod } from "@xyo-network/sdk-js";
|
|
1001
1040
|
import { globalRegistry, z } from "zod/mini";
|
|
1002
1041
|
var ChainConfigZod = z.object({
|
|
1003
1042
|
id: z.optional(HexZod).register(globalRegistry, {
|
|
@@ -1106,8 +1145,24 @@ var LogConfigZod = z7.object({
|
|
|
1106
1145
|
})
|
|
1107
1146
|
});
|
|
1108
1147
|
|
|
1148
|
+
// src/config/ProviderBinding.ts
|
|
1149
|
+
import { globalRegistry as globalRegistry7, z as z8 } from "zod";
|
|
1150
|
+
var ProviderBindingConfigZod = z8.object({
|
|
1151
|
+
implementation: z8.string().optional().register(globalRegistry7, {
|
|
1152
|
+
description: "Installed provider implementation id (descriptor id)",
|
|
1153
|
+
title: "providerBindings.implementation",
|
|
1154
|
+
type: "string"
|
|
1155
|
+
}),
|
|
1156
|
+
transport: z8.string().optional().register(globalRegistry7, {
|
|
1157
|
+
description: "Named transport from the top-level transports map",
|
|
1158
|
+
title: "providerBindings.transport",
|
|
1159
|
+
type: "string"
|
|
1160
|
+
})
|
|
1161
|
+
}).describe("Provider implementation and transport binding");
|
|
1162
|
+
var ProviderBindingsConfigZod = z8.record(z8.string(), ProviderBindingConfigZod).default({});
|
|
1163
|
+
|
|
1109
1164
|
// src/config/Providers.ts
|
|
1110
|
-
import
|
|
1165
|
+
import z10 from "zod";
|
|
1111
1166
|
|
|
1112
1167
|
// src/config/Provider.ts
|
|
1113
1168
|
import {
|
|
@@ -1115,79 +1170,79 @@ import {
|
|
|
1115
1170
|
zodIsFactory,
|
|
1116
1171
|
zodToFactory
|
|
1117
1172
|
} from "@xylabs/sdk-js";
|
|
1118
|
-
import { z as
|
|
1119
|
-
var ProviderConfigZod =
|
|
1120
|
-
moniker:
|
|
1121
|
-
labels:
|
|
1173
|
+
import { z as z9 } from "zod";
|
|
1174
|
+
var ProviderConfigZod = z9.object({
|
|
1175
|
+
moniker: z9.string(),
|
|
1176
|
+
labels: z9.array(z9.string()).optional()
|
|
1122
1177
|
}).describe("Configuration for a Provider");
|
|
1123
1178
|
var isProviderConfig = zodIsFactory(ProviderConfigZod);
|
|
1124
1179
|
var asProviderConfig = zodAsFactory(ProviderConfigZod, "asProviderConfig");
|
|
1125
1180
|
var toProviderConfig = zodToFactory(ProviderConfigZod, "toProviderConfig");
|
|
1126
1181
|
|
|
1127
1182
|
// src/config/Providers.ts
|
|
1128
|
-
var ProvidersConfigZod =
|
|
1183
|
+
var ProvidersConfigZod = z10.array(ProviderConfigZod.loose()).describe("Configuration for providers").default([]);
|
|
1129
1184
|
|
|
1130
1185
|
// src/config/Remote.ts
|
|
1131
|
-
import { globalRegistry as
|
|
1132
|
-
var RpcRemoteConfigBaseZod =
|
|
1133
|
-
protocol:
|
|
1186
|
+
import { globalRegistry as globalRegistry8, z as z11 } from "zod";
|
|
1187
|
+
var RpcRemoteConfigBaseZod = z11.object({
|
|
1188
|
+
protocol: z11.string("http").register(globalRegistry8, {
|
|
1134
1189
|
description: "Protocol for the RPC connection",
|
|
1135
1190
|
type: "string"
|
|
1136
1191
|
})
|
|
1137
1192
|
}).describe("Base configuration for the remote RPC");
|
|
1138
1193
|
var HttpRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
|
|
1139
|
-
protocol:
|
|
1194
|
+
protocol: z11.string("http").register(globalRegistry8, {
|
|
1140
1195
|
description: "Protocol for the RPC connection",
|
|
1141
1196
|
type: "string"
|
|
1142
1197
|
}).default("http"),
|
|
1143
|
-
url:
|
|
1198
|
+
url: z11.string().register(globalRegistry8, {
|
|
1144
1199
|
description: "URL for the Chain RPC API",
|
|
1145
1200
|
type: "string"
|
|
1146
1201
|
})
|
|
1147
1202
|
}).describe("Configuration for the remote RPC using Http");
|
|
1148
1203
|
var PostMessageRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
|
|
1149
|
-
protocol:
|
|
1204
|
+
protocol: z11.string().register(globalRegistry8, {
|
|
1150
1205
|
description: "Protocol for the RPC connection",
|
|
1151
1206
|
type: "string"
|
|
1152
1207
|
}).default("postMessage"),
|
|
1153
|
-
networkId:
|
|
1208
|
+
networkId: z11.string().register(globalRegistry8, {
|
|
1154
1209
|
description: "Network ID to use for the postMessage RPC connection",
|
|
1155
1210
|
type: "string"
|
|
1156
1211
|
}),
|
|
1157
|
-
sessionId:
|
|
1212
|
+
sessionId: z11.string().register(globalRegistry8, {
|
|
1158
1213
|
description: "Session ID to use for the postMessage RPC connection",
|
|
1159
1214
|
type: "string"
|
|
1160
1215
|
})
|
|
1161
1216
|
}).describe("Configuration for the remote RPC using postMessage");
|
|
1162
|
-
var RpcRemoteConfigZod =
|
|
1163
|
-
var RemoteConfigZod =
|
|
1217
|
+
var RpcRemoteConfigZod = z11.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod]).describe("Configuration for a remote RPC connection, either Http or postMessage");
|
|
1218
|
+
var RemoteConfigZod = z11.object({ rpc: RpcRemoteConfigZod.optional() }).describe("Configuration for remote connections, including RPC");
|
|
1164
1219
|
|
|
1165
1220
|
// src/config/storage/driver/Mongo.ts
|
|
1166
1221
|
import { isDefined as isDefined4, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
|
|
1167
|
-
import { globalRegistry as
|
|
1168
|
-
var MongoConfigZod =
|
|
1222
|
+
import { globalRegistry as globalRegistry9, z as z12 } from "zod";
|
|
1223
|
+
var MongoConfigZod = z12.object({
|
|
1169
1224
|
// TODO: Create from other arguments
|
|
1170
|
-
connectionString:
|
|
1225
|
+
connectionString: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1171
1226
|
description: "MongoDB connection string",
|
|
1172
1227
|
title: "storage.mongo.connectionString",
|
|
1173
1228
|
type: "string"
|
|
1174
1229
|
}),
|
|
1175
|
-
database:
|
|
1230
|
+
database: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1176
1231
|
description: "MongoDB database name",
|
|
1177
1232
|
title: "storage.mongo.database",
|
|
1178
1233
|
type: "string"
|
|
1179
1234
|
}),
|
|
1180
|
-
domain:
|
|
1235
|
+
domain: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1181
1236
|
description: "MongoDB domain",
|
|
1182
1237
|
title: "storage.mongo.domain",
|
|
1183
1238
|
type: "string"
|
|
1184
1239
|
}),
|
|
1185
|
-
password:
|
|
1240
|
+
password: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1186
1241
|
description: "MongoDB password",
|
|
1187
1242
|
title: "storage.mongo.password",
|
|
1188
1243
|
type: "string"
|
|
1189
1244
|
}),
|
|
1190
|
-
username:
|
|
1245
|
+
username: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1191
1246
|
description: "MongoDB username",
|
|
1192
1247
|
title: "storage.mongo.username",
|
|
1193
1248
|
type: "string"
|
|
@@ -1196,30 +1251,30 @@ var MongoConfigZod = z11.object({
|
|
|
1196
1251
|
|
|
1197
1252
|
// src/config/storage/driver/S3.ts
|
|
1198
1253
|
import { isDefined as isDefined5 } from "@xylabs/sdk-js";
|
|
1199
|
-
import { z as
|
|
1200
|
-
var S3BucketConfigZod =
|
|
1201
|
-
accessKeyId:
|
|
1202
|
-
accountId:
|
|
1203
|
-
bucket:
|
|
1204
|
-
prefix:
|
|
1205
|
-
readUrl:
|
|
1206
|
-
secretAccessKey:
|
|
1254
|
+
import { z as z13 } from "zod";
|
|
1255
|
+
var S3BucketConfigZod = z13.object({
|
|
1256
|
+
accessKeyId: z13.string().nonempty().optional().describe("S3-compatible access key id for this bucket (overrides the shared default)"),
|
|
1257
|
+
accountId: z13.string().nonempty().optional().describe("Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)"),
|
|
1258
|
+
bucket: z13.string().nonempty().optional().describe("S3-compatible bucket name"),
|
|
1259
|
+
prefix: z13.string().nonempty().optional().describe("Optional key prefix within the bucket"),
|
|
1260
|
+
readUrl: z13.string().nonempty().optional().describe("Public HTTP/CDN base URL for anonymous reads of this bucket"),
|
|
1261
|
+
secretAccessKey: z13.string().nonempty().optional().describe("S3-compatible secret access key for this bucket (overrides the shared default)")
|
|
1207
1262
|
});
|
|
1208
|
-
var S3ConfigZod =
|
|
1209
|
-
accessKeyId:
|
|
1210
|
-
accountId:
|
|
1263
|
+
var S3ConfigZod = z13.object({
|
|
1264
|
+
accessKeyId: z13.string().nonempty().optional().describe("Shared S3-compatible access key id (default for all buckets)"),
|
|
1265
|
+
accountId: z13.string().nonempty().optional().describe("Shared account id (default for all buckets; on Cloudflare R2 it forms the endpoint)"),
|
|
1211
1266
|
chainState: S3BucketConfigZod.optional().describe("Bucket for the mutable chain state (the head pointer)"),
|
|
1212
1267
|
finalized: S3BucketConfigZod.optional().describe("Bucket for the finalized files (blocks, payloads, manifest)"),
|
|
1213
1268
|
index: S3BucketConfigZod.optional().describe("Bucket for the chain index (the step-summary families)"),
|
|
1214
|
-
prefix:
|
|
1215
|
-
secretAccessKey:
|
|
1269
|
+
prefix: z13.string().nonempty().optional().describe("Shared key prefix (default for all buckets)"),
|
|
1270
|
+
secretAccessKey: z13.string().nonempty().optional().describe("Shared S3-compatible secret access key (default for all buckets)")
|
|
1216
1271
|
});
|
|
1217
1272
|
|
|
1218
1273
|
// src/config/storage/Storage.ts
|
|
1219
|
-
import { globalRegistry as
|
|
1220
|
-
var StorageConfigZod =
|
|
1274
|
+
import { globalRegistry as globalRegistry10, z as z14 } from "zod";
|
|
1275
|
+
var StorageConfigZod = z14.object({
|
|
1221
1276
|
mongo: MongoConfigZod.optional().describe("Configuration for the MongoD storage driver"),
|
|
1222
|
-
root:
|
|
1277
|
+
root: z14.string().optional().register(globalRegistry10, {
|
|
1223
1278
|
description: "Root directory for local storage",
|
|
1224
1279
|
title: "storage.root",
|
|
1225
1280
|
type: "string"
|
|
@@ -1228,39 +1283,90 @@ var StorageConfigZod = z13.object({
|
|
|
1228
1283
|
}).describe("Storage configuration options");
|
|
1229
1284
|
|
|
1230
1285
|
// src/config/Telemetry.ts
|
|
1231
|
-
import { globalRegistry as
|
|
1232
|
-
var MetricsScrapeConfigZod =
|
|
1233
|
-
path:
|
|
1286
|
+
import { globalRegistry as globalRegistry11, z as z15 } from "zod";
|
|
1287
|
+
var MetricsScrapeConfigZod = z15.object({
|
|
1288
|
+
path: z15.string().default("/metrics").register(globalRegistry11, {
|
|
1234
1289
|
default: "/metrics",
|
|
1235
1290
|
description: "Path for the metrics scrape endpoint",
|
|
1236
1291
|
title: "telemetry.metrics.scrape.path",
|
|
1237
1292
|
type: "string"
|
|
1238
1293
|
}),
|
|
1239
|
-
port:
|
|
1294
|
+
port: z15.coerce.number().int().positive().optional().register(globalRegistry11, {
|
|
1240
1295
|
description: "Port for the metrics scrape endpoint",
|
|
1241
1296
|
title: "telemetry.metrics.scrape.port",
|
|
1242
1297
|
type: "number"
|
|
1243
1298
|
})
|
|
1244
1299
|
}).describe("Metrics scrape configuration");
|
|
1245
|
-
var MetricsConfigZod =
|
|
1246
|
-
var OpenTelemetryConfigZod =
|
|
1300
|
+
var MetricsConfigZod = z15.object({ scrape: MetricsScrapeConfigZod }).describe("Metrics configuration options");
|
|
1301
|
+
var OpenTelemetryConfigZod = z15.object({
|
|
1247
1302
|
// OpenTelemetry options
|
|
1248
|
-
otlpEndpoint:
|
|
1303
|
+
otlpEndpoint: z15.url().optional().register(globalRegistry11, {
|
|
1249
1304
|
description: "OTLP endpoint for exporting telemetry data",
|
|
1250
1305
|
title: "telemetry.otel.otlpEndpoint",
|
|
1251
1306
|
type: "string"
|
|
1252
1307
|
})
|
|
1253
1308
|
});
|
|
1254
|
-
var TelemetryConfigZod =
|
|
1309
|
+
var TelemetryConfigZod = z15.object({
|
|
1255
1310
|
// Metrics configuration
|
|
1256
1311
|
metrics: MetricsConfigZod.optional().describe("Metrics configuration"),
|
|
1257
1312
|
// OpenTelemetry configuration
|
|
1258
1313
|
otel: OpenTelemetryConfigZod.optional().describe("OpenTelemetry configuration")
|
|
1259
1314
|
}).describe("Telemetry configuration options");
|
|
1260
1315
|
|
|
1316
|
+
// src/config/transports/Transport.ts
|
|
1317
|
+
import { globalRegistry as globalRegistry12, z as z16 } from "zod";
|
|
1318
|
+
var LmdbTransportConfigZod = z16.object({
|
|
1319
|
+
type: z16.literal("lmdb"),
|
|
1320
|
+
root: z16.string().register(globalRegistry12, {
|
|
1321
|
+
description: "Root directory for local LMDB storage",
|
|
1322
|
+
title: "transports.lmdb.root",
|
|
1323
|
+
type: "string"
|
|
1324
|
+
})
|
|
1325
|
+
}).describe("LMDB local storage transport");
|
|
1326
|
+
var MongoTransportConfigZod = z16.object({
|
|
1327
|
+
type: z16.literal("mongo"),
|
|
1328
|
+
connectionString: MongoConfigZod.shape.connectionString,
|
|
1329
|
+
database: MongoConfigZod.shape.database,
|
|
1330
|
+
domain: MongoConfigZod.shape.domain,
|
|
1331
|
+
password: MongoConfigZod.shape.password,
|
|
1332
|
+
username: MongoConfigZod.shape.username
|
|
1333
|
+
}).describe("MongoDB storage transport");
|
|
1334
|
+
var RpcTransportConfigZod = HttpRpcRemoteConfigZod.extend({ type: z16.literal("rpc") }).describe("XL1 JSON-RPC transport");
|
|
1335
|
+
var RestTransportConfigZod = z16.object({
|
|
1336
|
+
type: z16.literal("rest"),
|
|
1337
|
+
baseUrl: z16.string().register(globalRegistry12, {
|
|
1338
|
+
description: "HTTP base URL for REST reads",
|
|
1339
|
+
title: "transports.rest.baseUrl",
|
|
1340
|
+
type: "string"
|
|
1341
|
+
})
|
|
1342
|
+
}).describe("HTTP REST read transport");
|
|
1343
|
+
var S3TransportConfigZod = S3BucketConfigZod.extend({
|
|
1344
|
+
type: z16.literal("s3"),
|
|
1345
|
+
accessKeyId: z16.string().optional(),
|
|
1346
|
+
accountId: z16.string().optional(),
|
|
1347
|
+
secretAccessKey: z16.string().optional()
|
|
1348
|
+
}).describe("S3-compatible object storage transport");
|
|
1349
|
+
var EvmRpcTransportConfigZod = z16.object({
|
|
1350
|
+
type: z16.literal("evm-rpc"),
|
|
1351
|
+
url: z16.string().register(globalRegistry12, {
|
|
1352
|
+
description: "EVM JSON-RPC URL",
|
|
1353
|
+
title: "transports.evm-rpc.url",
|
|
1354
|
+
type: "string"
|
|
1355
|
+
})
|
|
1356
|
+
}).describe("EVM JSON-RPC transport");
|
|
1357
|
+
var TransportConfigZod = z16.discriminatedUnion("type", [
|
|
1358
|
+
LmdbTransportConfigZod,
|
|
1359
|
+
MongoTransportConfigZod,
|
|
1360
|
+
RpcTransportConfigZod,
|
|
1361
|
+
RestTransportConfigZod,
|
|
1362
|
+
S3TransportConfigZod,
|
|
1363
|
+
EvmRpcTransportConfigZod
|
|
1364
|
+
]);
|
|
1365
|
+
var TransportsConfigZod = z16.record(z16.string(), TransportConfigZod).default({});
|
|
1366
|
+
|
|
1261
1367
|
// src/config/Validation.ts
|
|
1262
|
-
import { XyoAddressZod as XyoAddressZod2 } from "@xyo-network/
|
|
1263
|
-
import { globalRegistry as
|
|
1368
|
+
import { XyoAddressZod as XyoAddressZod2 } from "@xyo-network/sdk-js";
|
|
1369
|
+
import { globalRegistry as globalRegistry13, z as z17 } from "zod";
|
|
1264
1370
|
|
|
1265
1371
|
// src/primitives/block/rate/blockRate.ts
|
|
1266
1372
|
import { isDefined as isDefined7, isFalsy } from "@xylabs/sdk-js";
|
|
@@ -1387,7 +1493,9 @@ var DEFAULT_MAX_ATTEMPTS = 10;
|
|
|
1387
1493
|
var calculateTimeRate = async (viewer, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
|
|
1388
1494
|
assertEx12(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
|
|
1389
1495
|
const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null;
|
|
1390
|
-
const
|
|
1496
|
+
const currentBlockResult = await viewer.currentBlock();
|
|
1497
|
+
const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult;
|
|
1498
|
+
const resolvedStartBlock = blockResult[0];
|
|
1391
1499
|
const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
|
|
1392
1500
|
assertEx12(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
|
|
1393
1501
|
const blocksPerMillisecondRate = 1 / (12 * 1e3);
|
|
@@ -1452,7 +1560,7 @@ var findEndBlockRecursive = async (viewer, startBlock, targetTimeMs, estimatedBl
|
|
|
1452
1560
|
// src/primitives/state/findMostRecentBlock.ts
|
|
1453
1561
|
import { isSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol-lib";
|
|
1454
1562
|
var DEFAULT_NEXT_OPTIONS = { limit: 50 };
|
|
1455
|
-
var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations =
|
|
1563
|
+
var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Infinity) => {
|
|
1456
1564
|
let mostRecentBlock;
|
|
1457
1565
|
let cursor;
|
|
1458
1566
|
let batch;
|
|
@@ -1468,9 +1576,8 @@ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTI
|
|
|
1468
1576
|
if (last) {
|
|
1469
1577
|
mostRecentBlock = last;
|
|
1470
1578
|
break;
|
|
1471
|
-
} else {
|
|
1472
|
-
cursor = batch.at(-1)?._sequence;
|
|
1473
1579
|
}
|
|
1580
|
+
cursor = batch.at(-1)?._sequence;
|
|
1474
1581
|
iterations = iterations + 1;
|
|
1475
1582
|
} while (batch.length > 0 && iterations < maxIterations);
|
|
1476
1583
|
return mostRecentBlock;
|
|
@@ -1483,7 +1590,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
|
|
|
1483
1590
|
if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`);
|
|
1484
1591
|
if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`);
|
|
1485
1592
|
if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`);
|
|
1486
|
-
const cacheKey =
|
|
1593
|
+
const cacheKey = String(blockNumber);
|
|
1487
1594
|
return await withContextCacheResponse(context, "hydratedBlockByNumber", cacheKey, async () => {
|
|
1488
1595
|
const block = assertEx13(
|
|
1489
1596
|
await blockFromBlockNumber(context, blockNumber),
|
|
@@ -1499,24 +1606,24 @@ var DEFAULT_MIN_CANDIDATES = 1;
|
|
|
1499
1606
|
var DEFAULT_BACKOFF_MS = 12e4;
|
|
1500
1607
|
|
|
1501
1608
|
// src/config/Validation.ts
|
|
1502
|
-
var ValidationConfigZod =
|
|
1503
|
-
allowedRewardRedeemers:
|
|
1609
|
+
var ValidationConfigZod = z17.object({
|
|
1610
|
+
allowedRewardRedeemers: z17.array(XyoAddressZod2).optional().register(globalRegistry13, {
|
|
1504
1611
|
description: "List of allowed reward redeemer addresses, if undefined anyone can participate",
|
|
1505
1612
|
title: "allowedRewardRedeemers",
|
|
1506
1613
|
type: "array"
|
|
1507
1614
|
}),
|
|
1508
|
-
allowedRewardEscrowAccountSigners:
|
|
1615
|
+
allowedRewardEscrowAccountSigners: z17.array(XyoAddressZod2).optional().register(globalRegistry13, {
|
|
1509
1616
|
description: "List of allowed reward escrow account signer addresses, if undefined anyone can participate",
|
|
1510
1617
|
title: "allowedRewardEscrowAccountSigners",
|
|
1511
1618
|
type: "array"
|
|
1512
1619
|
}),
|
|
1513
|
-
minCandidates:
|
|
1620
|
+
minCandidates: z17.coerce.number().default(DEFAULT_MIN_CANDIDATES).register(globalRegistry13, {
|
|
1514
1621
|
default: DEFAULT_MIN_CANDIDATES,
|
|
1515
1622
|
description: "Minimum number of uncle candidates before selecting the best uncle",
|
|
1516
1623
|
title: "validation.minCandidates",
|
|
1517
1624
|
type: "number"
|
|
1518
1625
|
}),
|
|
1519
|
-
backoffMs:
|
|
1626
|
+
backoffMs: z17.coerce.number().default(DEFAULT_BACKOFF_MS).register(globalRegistry13, {
|
|
1520
1627
|
default: DEFAULT_BACKOFF_MS,
|
|
1521
1628
|
description: "Back-off timeout in ms. If head age exceeds this, minCandidates is ignored",
|
|
1522
1629
|
title: "validation.backoffMs",
|
|
@@ -1525,26 +1632,28 @@ var ValidationConfigZod = z15.object({
|
|
|
1525
1632
|
});
|
|
1526
1633
|
|
|
1527
1634
|
// src/config/Base.ts
|
|
1528
|
-
var BaseConfigZod =
|
|
1529
|
-
chain:
|
|
1530
|
-
dataLake:
|
|
1531
|
-
evm:
|
|
1532
|
-
log:
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1635
|
+
var BaseConfigZod = z18.object({
|
|
1636
|
+
chain: z18._default(ChainConfigZod, ChainConfigZod.parse({})).check(z18.describe("Configuration for the chain")),
|
|
1637
|
+
dataLake: z18.optional(DataLakeConfigZod).check(z18.describe("Configuration for data lakes")),
|
|
1638
|
+
evm: z18._default(EvmConfigZod, EvmConfigZod.parse({})).check(z18.describe("Configuration for EVM-backed services")),
|
|
1639
|
+
log: z18._default(LogConfigZod, LogConfigZod.parse({})).check(z18.describe("Configuration for logging")),
|
|
1640
|
+
providerBindings: z18._default(ProviderBindingsConfigZod, ProviderBindingsConfigZod.parse({})).check(z18.describe("Per-moniker provider implementation and transport bindings")),
|
|
1641
|
+
providers: z18._default(ProvidersConfigZod, ProvidersConfigZod.parse([])).check(z18.describe("Configuration for providers")),
|
|
1642
|
+
remote: z18._default(RemoteConfigZod, RemoteConfigZod.parse({})).check(z18.describe("Configuration for remote services")),
|
|
1643
|
+
transports: z18._default(TransportsConfigZod, TransportsConfigZod.parse({})).check(z18.describe("Named connection profiles (rpc, rest, s3, lmdb, mongo, evm-rpc)")),
|
|
1644
|
+
storage: z18._default(StorageConfigZod, StorageConfigZod.parse({})).check(z18.describe("Configuration for the storage")),
|
|
1645
|
+
telemetry: z18._default(TelemetryConfigZod, TelemetryConfigZod.parse({})).check(z18.describe("Configuration for telemetry")),
|
|
1646
|
+
validation: z18._default(ValidationConfigZod, ValidationConfigZod.parse({})).check(z18.describe("Configuration for validation"))
|
|
1538
1647
|
});
|
|
1539
1648
|
|
|
1540
1649
|
// src/config/Actor.ts
|
|
1541
|
-
var AccountPathZod =
|
|
1650
|
+
var AccountPathZod = z19.string().check(z19.regex(
|
|
1542
1651
|
/^(m(\/\d+'?)+|\d+'?(\/\d+'?)*)$/,
|
|
1543
1652
|
`Invalid BIP-32 derivation path. Use either an absolute path like "m/44'/60'/0'/0/0" or a relative path like "0", "0/1", or "44'/60'/0'/0/0".`
|
|
1544
1653
|
));
|
|
1545
|
-
var ActorConfigZod =
|
|
1546
|
-
name:
|
|
1547
|
-
accountPath:
|
|
1654
|
+
var ActorConfigZod = z19.extend(BaseConfigZod, {
|
|
1655
|
+
name: z19.string(),
|
|
1656
|
+
accountPath: z19.optional(AccountPathZod).register(globalRegistry14, {
|
|
1548
1657
|
description: 'BIP-32 derivation path for the actor wallet. Absolute when it starts with "m/"; otherwise relative to the root wallet base path. Each actor must derive to a distinct path.',
|
|
1549
1658
|
title: "accountPath",
|
|
1550
1659
|
type: "string"
|
|
@@ -1555,22 +1664,22 @@ var asActorConfig = zodAsFactory2(ActorConfigZod, "asActorConfig");
|
|
|
1555
1664
|
var toActorConfig = zodToFactory2(ActorConfigZod, "toActorConfig");
|
|
1556
1665
|
|
|
1557
1666
|
// src/config/Actors.ts
|
|
1558
|
-
import { z as
|
|
1559
|
-
var ActorsConfigZod =
|
|
1560
|
-
|
|
1667
|
+
import { z as z20 } from "zod/mini";
|
|
1668
|
+
var ActorsConfigZod = z20._default(
|
|
1669
|
+
z20.array(z20.looseObject(ActorConfigZod.shape)).check(z20.describe("Actor-specific configurations that override the base configuration when the actor is running")),
|
|
1561
1670
|
[]
|
|
1562
1671
|
);
|
|
1563
1672
|
|
|
1564
1673
|
// src/config/Config.ts
|
|
1565
|
-
import { globalRegistry as
|
|
1566
|
-
var ConfigZod =
|
|
1674
|
+
import { globalRegistry as globalRegistry15, z as z21 } from "zod/mini";
|
|
1675
|
+
var ConfigZod = z21.extend(BaseConfigZod, {
|
|
1567
1676
|
actors: ActorsConfigZod,
|
|
1568
|
-
healthCheckPort:
|
|
1677
|
+
healthCheckPort: z21.optional(z21.coerce.number()).register(globalRegistry15, {
|
|
1569
1678
|
description: "Port for the system-wide health, readiness, and liveness endpoints (/healthz, /livez, /readyz). Set to 0 to disable.",
|
|
1570
1679
|
title: "healthCheckPort",
|
|
1571
1680
|
type: "number"
|
|
1572
1681
|
})
|
|
1573
|
-
}).check(
|
|
1682
|
+
}).check(z21.describe("The complete configuration for the protocol, including global settings and actor-specific overrides"));
|
|
1574
1683
|
|
|
1575
1684
|
// src/summary/primitives/blocks/blocksMaxStep.ts
|
|
1576
1685
|
var blocksMaxStep = 3;
|
|
@@ -1790,7 +1899,7 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1790
1899
|
}
|
|
1791
1900
|
async blocksByStep(stepLevel, stepIndex) {
|
|
1792
1901
|
return await this.spanAsync("blocksByStep", async () => {
|
|
1793
|
-
assertEx15(Number.
|
|
1902
|
+
assertEx15(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
|
|
1794
1903
|
const size = stepSize2(stepLevel);
|
|
1795
1904
|
assertEx15(
|
|
1796
1905
|
stepLevel <= blocksMaxStep,
|
|
@@ -1814,7 +1923,12 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1814
1923
|
}
|
|
1815
1924
|
async chainId(blockNumber = "latest") {
|
|
1816
1925
|
return await this.spanAsync("chainId", async () => {
|
|
1817
|
-
|
|
1926
|
+
if (blockNumber === "latest") {
|
|
1927
|
+
const headBlock = await this.finalizationViewer.headBlock();
|
|
1928
|
+
return headBlock.chain;
|
|
1929
|
+
}
|
|
1930
|
+
const block = assertEx15(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`);
|
|
1931
|
+
return block[0].chain;
|
|
1818
1932
|
}, this.context);
|
|
1819
1933
|
}
|
|
1820
1934
|
async createHandler() {
|
|
@@ -1863,9 +1977,10 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1863
1977
|
};
|
|
1864
1978
|
}
|
|
1865
1979
|
async getChainContextRead() {
|
|
1980
|
+
const headBlock = await this.finalizationViewer.head();
|
|
1866
1981
|
return {
|
|
1867
1982
|
...this.getBlockContextRead(),
|
|
1868
|
-
head:
|
|
1983
|
+
head: headBlock[0]
|
|
1869
1984
|
};
|
|
1870
1985
|
}
|
|
1871
1986
|
async startHandler() {
|
|
@@ -1912,10 +2027,11 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1912
2027
|
}, this.headPollIntervalMs);
|
|
1913
2028
|
}
|
|
1914
2029
|
stopHeadPolling() {
|
|
1915
|
-
if (this._headPollTimer) {
|
|
1916
|
-
|
|
1917
|
-
this._headPollTimer = null;
|
|
2030
|
+
if (!this._headPollTimer) {
|
|
2031
|
+
return;
|
|
1918
2032
|
}
|
|
2033
|
+
clearInterval(this._headPollTimer);
|
|
2034
|
+
this._headPollTimer = null;
|
|
1919
2035
|
}
|
|
1920
2036
|
};
|
|
1921
2037
|
__publicField(SimpleBlockViewer, "defaultMoniker", BlockViewerMoniker);
|
|
@@ -1938,7 +2054,7 @@ var SimpleChainContractViewer = class extends AbstractCreatableProvider {
|
|
|
1938
2054
|
return this.finalizationViewer.chainId();
|
|
1939
2055
|
}
|
|
1940
2056
|
async chainIdAtBlockNumber(blockNumber) {
|
|
1941
|
-
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber",
|
|
2057
|
+
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
|
|
1942
2058
|
let chainId = this.chainId();
|
|
1943
2059
|
let contractViewer = this;
|
|
1944
2060
|
let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
|
|
@@ -2021,7 +2137,8 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
2021
2137
|
}
|
|
2022
2138
|
async createHandler() {
|
|
2023
2139
|
await super.createHandler();
|
|
2024
|
-
|
|
2140
|
+
const mostRecentBlock = await findMostRecentBlock(this.params.finalizedArchivist);
|
|
2141
|
+
this._chainId = assertEx17(this.config.chain.id ?? mostRecentBlock?.chain, () => "chain.id is required if empty archivist");
|
|
2025
2142
|
this._store = { chainMap: this.params.finalizedArchivist };
|
|
2026
2143
|
}
|
|
2027
2144
|
async head() {
|
|
@@ -2036,13 +2153,16 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
2036
2153
|
}, this.context);
|
|
2037
2154
|
}
|
|
2038
2155
|
async headBlock() {
|
|
2039
|
-
|
|
2156
|
+
const headBlock = await this.head();
|
|
2157
|
+
return headBlock[0];
|
|
2040
2158
|
}
|
|
2041
2159
|
async headHash() {
|
|
2042
|
-
|
|
2160
|
+
const headBlock = await this.headBlock();
|
|
2161
|
+
return headBlock._hash;
|
|
2043
2162
|
}
|
|
2044
2163
|
async headNumber() {
|
|
2045
|
-
|
|
2164
|
+
const headBlock = await this.headBlock();
|
|
2165
|
+
return headBlock.block;
|
|
2046
2166
|
}
|
|
2047
2167
|
getBlockContextRead() {
|
|
2048
2168
|
return {
|
|
@@ -2051,9 +2171,10 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
2051
2171
|
};
|
|
2052
2172
|
}
|
|
2053
2173
|
async getChainContextRead() {
|
|
2174
|
+
const headBlock = await this.head();
|
|
2054
2175
|
return {
|
|
2055
2176
|
...this.getBlockContextRead(),
|
|
2056
|
-
head:
|
|
2177
|
+
head: headBlock[0]
|
|
2057
2178
|
};
|
|
2058
2179
|
}
|
|
2059
2180
|
async getCurrentHead() {
|