@xyo-network/xl1-protocol-sdk 2.2.0 → 2.2.2
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/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/config/adaptLegacyConfig.d.ts.map +1 -1
- package/dist/neutral/createDeclarationPayload.d.ts.map +1 -1
- package/dist/neutral/createTransferPayload.d.ts.map +1 -1
- package/dist/neutral/getFileConfig.d.ts.map +1 -1
- package/dist/neutral/getFileConfig.mjs +2 -1
- package/dist/neutral/getFileConfig.mjs.map +2 -2
- package/dist/neutral/index.mjs +398 -278
- package/dist/neutral/index.mjs.map +4 -4
- package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +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/readPayloadMapFromStore.d.ts.map +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/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.map +1 -1
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +3 -6
- 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.map +1 -1
- package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.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.map +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/timeSync2/SimpleTimeSyncViewer.d.ts.map +1 -1
- package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts.map +1 -1
- package/dist/neutral/summary/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
- package/dist/neutral/test/buildBlock.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts.map +1 -1
- package/dist/neutral/test/index.mjs +140 -88
- package/dist/neutral/test/index.mjs.map +3 -3
- package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
- 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 -8
package/dist/neutral/index.mjs
CHANGED
|
@@ -27,11 +27,13 @@ var splitOnDecimalToString = (value, places = 18, maxDecimal = places, maxCharac
|
|
|
27
27
|
const wholeCharacters = whole.toString(10).length;
|
|
28
28
|
const calcMaxDecimalCharacters = maxCharacters === -1 ? places : wholeCharacters > maxCharacters ? 0 : maxCharacters - wholeCharacters;
|
|
29
29
|
const maxDecimalCharacters = Math.min(maxDecimal, calcMaxDecimalCharacters);
|
|
30
|
-
const
|
|
30
|
+
const wholeFormatter = new Intl.NumberFormat(locale, {
|
|
31
31
|
maximumFractionDigits: 0,
|
|
32
32
|
useGrouping: true
|
|
33
|
-
})
|
|
34
|
-
const
|
|
33
|
+
});
|
|
34
|
+
const formattedWhole = wholeFormatter.format(whole);
|
|
35
|
+
const decimalFormatter = new Intl.NumberFormat(locale);
|
|
36
|
+
const decimalSeparator = decimalFormatter.formatToParts(1.1).find((part) => part.type === "decimal")?.value ?? ".";
|
|
35
37
|
let paddedDecimal = decimal.toString().padStart(places, "0").slice(0, maxDecimalCharacters);
|
|
36
38
|
while (paddedDecimal.length > minDecimals && paddedDecimal.endsWith("0")) {
|
|
37
39
|
paddedDecimal = paddedDecimal.slice(0, -1);
|
|
@@ -54,7 +56,7 @@ var ShiftedBigInt = class _ShiftedBigInt {
|
|
|
54
56
|
this.value = typeof value === "bigint" ? value : value.value;
|
|
55
57
|
this.config = {
|
|
56
58
|
..._ShiftedBigInt.defaultConfig,
|
|
57
|
-
...typeof value
|
|
59
|
+
...typeof value !== "bigint" && value.config,
|
|
58
60
|
...config
|
|
59
61
|
};
|
|
60
62
|
}
|
|
@@ -98,7 +100,7 @@ var ShiftedBigInt = class _ShiftedBigInt {
|
|
|
98
100
|
}
|
|
99
101
|
};
|
|
100
102
|
|
|
101
|
-
// src/amount/
|
|
103
|
+
// src/amount/xl1Amount.ts
|
|
102
104
|
import { assertEx } from "@xylabs/sdk-js";
|
|
103
105
|
import {
|
|
104
106
|
AttoXL1,
|
|
@@ -170,7 +172,7 @@ var XL1Amount = class _XL1Amount {
|
|
|
170
172
|
}
|
|
171
173
|
toString(places = Number(XL1Places.atto), config = {}) {
|
|
172
174
|
assertEx(allowedPlaces.includes(BigInt(places)), () => `Invalid conversion places (${places} not in ${allowedPlaces.join(", ")})`);
|
|
173
|
-
|
|
175
|
+
const shifted = new ShiftedBigInt(
|
|
174
176
|
this.value,
|
|
175
177
|
{
|
|
176
178
|
places,
|
|
@@ -180,7 +182,8 @@ var XL1Amount = class _XL1Amount {
|
|
|
180
182
|
maxCharacters: places,
|
|
181
183
|
...config
|
|
182
184
|
}
|
|
183
|
-
)
|
|
185
|
+
);
|
|
186
|
+
return shifted.toShortString();
|
|
184
187
|
}
|
|
185
188
|
};
|
|
186
189
|
|
|
@@ -214,10 +217,11 @@ import { isUndefined } from "@xylabs/sdk-js";
|
|
|
214
217
|
import { isAnyPayload, PayloadBuilder } from "@xyo-network/sdk-js";
|
|
215
218
|
async function addDataLakePayloadsToPayloads(hashes, payloads, dataLakeViewer) {
|
|
216
219
|
if (isUndefined(dataLakeViewer)) return [payloads, []];
|
|
217
|
-
const missingPayloadHashes = hashes.filter((hash) =>
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
);
|
|
220
|
+
const missingPayloadHashes = hashes.filter((hash) => payloads.every((p) => p._hash !== hash));
|
|
221
|
+
const dataLakeResults = await dataLakeViewer.get(missingPayloadHashes);
|
|
222
|
+
const filteredDataLakePayloads = dataLakeResults.filter(isAnyPayload);
|
|
223
|
+
const payloadsWithHashMeta = await PayloadBuilder.addHashMeta(filteredDataLakePayloads);
|
|
224
|
+
const payloadsFromDataLake = await PayloadBuilder.addHashMeta(payloadsWithHashMeta);
|
|
221
225
|
return [[...payloads, ...payloadsFromDataLake], payloadsFromDataLake.map((p) => p._hash)];
|
|
222
226
|
}
|
|
223
227
|
|
|
@@ -280,10 +284,7 @@ var PayloadLocator = class {
|
|
|
280
284
|
const buckets = hashes.map(() => []);
|
|
281
285
|
for (const dl of this.datalakes) {
|
|
282
286
|
const fetched = await Promise.all(hashes.map(async (h) => await this.fetchOne(dl, h)));
|
|
283
|
-
|
|
284
|
-
if (isUndefined2(p)) continue;
|
|
285
|
-
buckets[i].push({ payload: p, source: dl.name });
|
|
286
|
-
}
|
|
287
|
+
collectFetchedIntoBuckets(fetched, dl, buckets);
|
|
287
288
|
}
|
|
288
289
|
for (const [i, h] of hashes.entries()) result.set(h, buckets[i]);
|
|
289
290
|
return result;
|
|
@@ -297,16 +298,27 @@ var PayloadLocator = class {
|
|
|
297
298
|
const needHashes = [];
|
|
298
299
|
for (const h of hashes) if (remaining.has(h)) needHashes.push(h);
|
|
299
300
|
const fetched = await Promise.all(needHashes.map(async (h) => await this.fetchOne(dl, h)));
|
|
300
|
-
|
|
301
|
-
const p = fetched[i];
|
|
302
|
-
if (isUndefined2(p)) continue;
|
|
303
|
-
result.set(h, { payload: p, source: dl.name });
|
|
304
|
-
remaining.delete(h);
|
|
305
|
-
}
|
|
301
|
+
collectFirstFetched(needHashes, fetched, dl, result, remaining);
|
|
306
302
|
}
|
|
307
303
|
return result;
|
|
308
304
|
}
|
|
309
305
|
};
|
|
306
|
+
function collectFetchedIntoBuckets(fetched, dl, buckets) {
|
|
307
|
+
for (const [i, p] of fetched.entries()) {
|
|
308
|
+
if (!isUndefined2(p)) {
|
|
309
|
+
buckets[i].push({ payload: p, source: dl.name });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function collectFirstFetched(needHashes, fetched, dl, result, remaining) {
|
|
314
|
+
for (const [i, h] of needHashes.entries()) {
|
|
315
|
+
const p = fetched[i];
|
|
316
|
+
if (!isUndefined2(p)) {
|
|
317
|
+
result.set(h, { payload: p, source: dl.name });
|
|
318
|
+
remaining.delete(h);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
310
322
|
|
|
311
323
|
// src/block/hydrate/BoundWitnessHydrator.ts
|
|
312
324
|
var DEFAULT_CACHE_MAX = 5e3;
|
|
@@ -629,15 +641,18 @@ var hydrateBlock = async (context, hash, maxDepth = 1, minDepth = maxDepth) => {
|
|
|
629
641
|
assertEx5(block, () => `block ${hash} not found`)
|
|
630
642
|
), () => `hash ${hash} is not a BlockBoundWitness`);
|
|
631
643
|
if (maxDepth === 0) return [bw, []];
|
|
632
|
-
const
|
|
644
|
+
const blockPayloadResults = await chainMap.get(bw.payload_hashes);
|
|
645
|
+
const blkPayloads = blockPayloadResults.map((p) => asAnyPayload(p, true));
|
|
633
646
|
if (minDepth === 1) assertEx5(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`);
|
|
634
647
|
if (maxDepth === 1) return [bw, blkPayloads];
|
|
635
648
|
const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta);
|
|
636
649
|
const transactionsPayloadHashes = transactions.flatMap((tx) => tx.payload_hashes);
|
|
637
|
-
const
|
|
650
|
+
const transactionPayloadResults = await chainMap.get(transactionsPayloadHashes);
|
|
651
|
+
const transactionsPayloads = transactionPayloadResults.map((p) => asAnyPayload(p, true));
|
|
638
652
|
assertEx5(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`);
|
|
639
653
|
const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap((p) => p._hash));
|
|
640
|
-
const
|
|
654
|
+
const allPayloadResults = await chainMap.get([...allPayloadsHashes]);
|
|
655
|
+
const allPayloads = allPayloadResults.map((p) => asAnyPayload(p, true));
|
|
641
656
|
const allPayloadsFiltered = allPayloads.filter((p) => allPayloadsHashes.has(p._hash));
|
|
642
657
|
if (maxDepth === 2) assertEx5(allHashesPresent(
|
|
643
658
|
[...allPayloadsHashes],
|
|
@@ -657,7 +672,8 @@ import { assertEx as assertEx6 } from "@xylabs/sdk-js";
|
|
|
657
672
|
import { isBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta as isTransactionBoundWitnessWithStorageMeta2 } from "@xyo-network/xl1-protocol-lib";
|
|
658
673
|
var tryHydrateBlock = async (archivist, hash, maxDepth = 1) => {
|
|
659
674
|
assertEx6(maxDepth >= 0, () => "maxDepth must be greater than or equal to 0");
|
|
660
|
-
const
|
|
675
|
+
const archivistResults = await archivist.get([hash]);
|
|
676
|
+
const bw = archivistResults.find(isBlockBoundWitnessWithStorageMeta);
|
|
661
677
|
if (!bw) return void 0;
|
|
662
678
|
if (maxDepth === 0) return [bw, []];
|
|
663
679
|
const blkPayloads = await archivist.get(bw.payload_hashes);
|
|
@@ -720,7 +736,7 @@ async function withContextCacheResponse(context, name, key, func, { max = 1e4 }
|
|
|
720
736
|
// src/block/primitives/blockFromBlockNumber.ts
|
|
721
737
|
async function blockFromBlockNumber(context, blockNumber) {
|
|
722
738
|
return await spanAsync("blockFromBlockNumber", async () => {
|
|
723
|
-
const cacheKey =
|
|
739
|
+
const cacheKey = String(blockNumber);
|
|
724
740
|
const { chainMap, head } = context;
|
|
725
741
|
return await withContextCacheResponse(context, "blockFromBlockNumber", cacheKey, async () => {
|
|
726
742
|
const [result] = await chainMap.get([head._hash]);
|
|
@@ -818,7 +834,8 @@ function deepCalculateFramesFromRange(range, startingStep = StepSizes2.length -
|
|
|
818
834
|
|
|
819
835
|
// src/block/primitives/hashFromBlockNumber.ts
|
|
820
836
|
async function hashFromBlockNumber(context, blockNumber) {
|
|
821
|
-
|
|
837
|
+
const block = await blockFromBlockNumber(context, blockNumber);
|
|
838
|
+
return block._hash;
|
|
822
839
|
}
|
|
823
840
|
|
|
824
841
|
// src/block/primitives/model.ts
|
|
@@ -847,35 +864,41 @@ import {
|
|
|
847
864
|
PayloadBuilder as PayloadBuilder3
|
|
848
865
|
} from "@xyo-network/sdk-js";
|
|
849
866
|
import { isExecutable } from "@xyo-network/xl1-protocol-lib";
|
|
867
|
+
async function processElevateOperation(opCode, args, txBw, txPayloads) {
|
|
868
|
+
const [hash, ...rest] = args;
|
|
869
|
+
const txPayloadsWithStorageMeta = await PayloadBuilder3.addStorageMeta(txPayloads);
|
|
870
|
+
assertEx7(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
|
|
871
|
+
if (isHash(hash)) {
|
|
872
|
+
assertEx7(
|
|
873
|
+
txBw.payload_hashes.includes(hash),
|
|
874
|
+
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
|
|
875
|
+
);
|
|
876
|
+
return assertEx7(
|
|
877
|
+
txPayloadsWithStorageMeta.find((p) => p._hash === hash),
|
|
878
|
+
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
|
|
882
|
+
}
|
|
883
|
+
async function processOperation(opCode, args, txBw, txPayloads) {
|
|
884
|
+
switch (opCode) {
|
|
885
|
+
case "elevate": {
|
|
886
|
+
return await processElevateOperation(opCode, args, txBw, txPayloads);
|
|
887
|
+
}
|
|
888
|
+
default: {
|
|
889
|
+
throw new Error(`Invalid opCode ${opCode}`);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
}
|
|
850
893
|
async function validateTransactionsOpcodes(txs) {
|
|
851
894
|
const txElevatedPayloads = [];
|
|
852
895
|
for (const [txBw, txPayloads] of txs) {
|
|
853
896
|
if (isExecutable(txBw)) {
|
|
854
897
|
const operations = txBw.script.map((op) => op.split("|"));
|
|
855
898
|
for (const [opCode, ...args] of operations) {
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
const txPayloadsWithStorageMeta = await PayloadBuilder3.addStorageMeta(txPayloads);
|
|
860
|
-
assertEx7(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
|
|
861
|
-
if (isHash(hash)) {
|
|
862
|
-
assertEx7(
|
|
863
|
-
txBw.payload_hashes.includes(hash),
|
|
864
|
-
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
|
|
865
|
-
);
|
|
866
|
-
const txPayload = assertEx7(
|
|
867
|
-
txPayloadsWithStorageMeta.find((p) => p._hash === hash),
|
|
868
|
-
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
|
|
869
|
-
);
|
|
870
|
-
txElevatedPayloads.push(txPayload);
|
|
871
|
-
} else {
|
|
872
|
-
throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
|
|
873
|
-
}
|
|
874
|
-
break;
|
|
875
|
-
}
|
|
876
|
-
default: {
|
|
877
|
-
throw new Error(`Invalid opCode ${opCode}`);
|
|
878
|
-
}
|
|
899
|
+
const txPayload = await processOperation(opCode, args, txBw, txPayloads);
|
|
900
|
+
if (txPayload !== void 0) {
|
|
901
|
+
txElevatedPayloads.push(txPayload);
|
|
879
902
|
}
|
|
880
903
|
}
|
|
881
904
|
}
|
|
@@ -893,7 +916,7 @@ function backingsSatisfied(required, available) {
|
|
|
893
916
|
}
|
|
894
917
|
function unmetBackings(required, available) {
|
|
895
918
|
return required.filter((need) => {
|
|
896
|
-
return
|
|
919
|
+
return available.every((a) => !(a.backing === need.backing && (a.mode === "write" || need.mode === "read")));
|
|
897
920
|
});
|
|
898
921
|
}
|
|
899
922
|
|
|
@@ -914,7 +937,7 @@ var CapabilityRegistry = class {
|
|
|
914
937
|
}
|
|
915
938
|
toJson() {
|
|
916
939
|
const result = {};
|
|
917
|
-
for (const [id, cap] of this._entries
|
|
940
|
+
for (const [id, cap] of this._entries) {
|
|
918
941
|
const { id: _, ...rest } = cap;
|
|
919
942
|
result[id] = rest;
|
|
920
943
|
}
|
|
@@ -1024,7 +1047,7 @@ function resolveProviders(needs, candidates, ctx, options = {}) {
|
|
|
1024
1047
|
const rejected = [...backingRejected, ...preconditionRejected];
|
|
1025
1048
|
const byCapability = groupByCapability(surviving, wanted);
|
|
1026
1049
|
const { bindings, selectedById } = pickWinners(wanted, byCapability, rejected, candidates, options);
|
|
1027
|
-
const selected = topoSort(
|
|
1050
|
+
const selected = topoSort(selectedById.values().toArray(), ctx);
|
|
1028
1051
|
return {
|
|
1029
1052
|
bindings,
|
|
1030
1053
|
rejected,
|
|
@@ -1083,15 +1106,20 @@ function filterByPreconditions(candidates, ctx) {
|
|
|
1083
1106
|
}
|
|
1084
1107
|
return { surviving, rejected };
|
|
1085
1108
|
}
|
|
1109
|
+
function addDescriptorCapabilities(byCapability, descriptor, wanted) {
|
|
1110
|
+
for (const moniker of descriptor.satisfies) {
|
|
1111
|
+
if (!wanted.has(moniker)) {
|
|
1112
|
+
continue;
|
|
1113
|
+
}
|
|
1114
|
+
const list = byCapability.get(moniker) ?? [];
|
|
1115
|
+
list.push(descriptor);
|
|
1116
|
+
byCapability.set(moniker, list);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1086
1119
|
function groupByCapability(surviving, wanted) {
|
|
1087
1120
|
const byCapability = /* @__PURE__ */ new Map();
|
|
1088
1121
|
for (const descriptor of surviving) {
|
|
1089
|
-
|
|
1090
|
-
if (!wanted.has(moniker)) continue;
|
|
1091
|
-
const list = byCapability.get(moniker) ?? [];
|
|
1092
|
-
list.push(descriptor);
|
|
1093
|
-
byCapability.set(moniker, list);
|
|
1094
|
-
}
|
|
1122
|
+
addDescriptorCapabilities(byCapability, descriptor, wanted);
|
|
1095
1123
|
}
|
|
1096
1124
|
return byCapability;
|
|
1097
1125
|
}
|
|
@@ -1101,7 +1129,7 @@ function pickWinners(wanted, byCapability, rejected, allCandidates, options) {
|
|
|
1101
1129
|
for (const moniker of wanted) {
|
|
1102
1130
|
let group = byCapability.get(moniker);
|
|
1103
1131
|
const pinned = options.implementations?.[moniker];
|
|
1104
|
-
if (pinned) {
|
|
1132
|
+
if (pinned !== void 0 && pinned !== "") {
|
|
1105
1133
|
const pinnedGroup = group?.filter((descriptor) => descriptor.id === pinned);
|
|
1106
1134
|
if (!pinnedGroup || pinnedGroup.length === 0) {
|
|
1107
1135
|
throw new MissingCapabilityError(moniker, [`requested implementation '${pinned}' not available`]);
|
|
@@ -1683,7 +1711,9 @@ var DEFAULT_MAX_ATTEMPTS = 10;
|
|
|
1683
1711
|
var calculateTimeRate = async (viewer, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
|
|
1684
1712
|
assertEx10(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
|
|
1685
1713
|
const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null;
|
|
1686
|
-
const
|
|
1714
|
+
const currentBlockResult = await viewer.currentBlock();
|
|
1715
|
+
const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult;
|
|
1716
|
+
const resolvedStartBlock = blockResult[0];
|
|
1687
1717
|
const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
|
|
1688
1718
|
assertEx10(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
|
|
1689
1719
|
const blocksPerMillisecondRate = 1 / (12 * 1e3);
|
|
@@ -1847,7 +1877,9 @@ async function chainStepRewardAddress(context, blockViewer, { block, step }) {
|
|
|
1847
1877
|
const [transferIndex, transferCount] = stepTransferIndex(block, step);
|
|
1848
1878
|
const [blockBw, payloads] = hydratedBlock;
|
|
1849
1879
|
const transfersFromPool = payloads.filter(isTransfer).map((p) => asTransfer(p)).filter(exists).filter((t) => t.from === XYO_STEP_REWARD_ADDRESS);
|
|
1850
|
-
const
|
|
1880
|
+
const mergedTransfers = mergeTransfers(transfersFromPool);
|
|
1881
|
+
const rewardEntry = Object.entries(mergedTransfers).find(([address]) => address === XYO_STEP_REWARD_ADDRESS);
|
|
1882
|
+
const fromEntries = Object.entries(rewardEntry?.[1] ?? {});
|
|
1851
1883
|
const sortedTransferAmounts = fromEntries.toSorted(([, a], [, b]) => a > b ? -1 : a < b ? 1 : 0);
|
|
1852
1884
|
assertEx14(
|
|
1853
1885
|
sortedTransferAmounts.length === transferCount,
|
|
@@ -1959,8 +1991,10 @@ async function stepRewardTotal(context, blockViewer, { block, step }, multiplier
|
|
|
1959
1991
|
payloads.find((p) => isTransfer5(p) && p.from === XYO_STEP_REWARD_ADDRESS2),
|
|
1960
1992
|
() => `No step transfer found for step ${step} at block ${block} (${blockBw._hash})`
|
|
1961
1993
|
);
|
|
1994
|
+
const netTransfers = netTransfersForPayloads(context, [stepTransfer]);
|
|
1995
|
+
const rewardEntry = Object.entries(netTransfers).find(([address]) => address === XYO_STEP_REWARD_ADDRESS2);
|
|
1962
1996
|
const rewards = assertEx15(
|
|
1963
|
-
|
|
1997
|
+
rewardEntry?.[1],
|
|
1964
1998
|
() => `No rewards found for step reward address ${XYO_STEP_REWARD_ADDRESS2} at block ${block} (${blockBw._hash})`
|
|
1965
1999
|
);
|
|
1966
2000
|
const sortedTransfers = Object.entries(rewards).toSorted(([, a], [, b]) => a > b ? -1 : a < b ? 1 : 0);
|
|
@@ -2001,7 +2035,7 @@ async function stepsRewardTotal(context, blockViewer, steps, multipliers) {
|
|
|
2001
2035
|
return asAttoXL12(totalRewards);
|
|
2002
2036
|
}
|
|
2003
2037
|
|
|
2004
|
-
// src/primitives/chain/time/
|
|
2038
|
+
// src/primitives/chain/time/externalBlockNumberFromXl1BlockNumber.ts
|
|
2005
2039
|
import { assertEx as assertEx16, isArray } from "@xylabs/sdk-js";
|
|
2006
2040
|
import {
|
|
2007
2041
|
asBlockNumber,
|
|
@@ -2022,7 +2056,7 @@ async function externalBlockNumberFromXL1BlockNumber(context, blockViewer, xl1Bl
|
|
|
2022
2056
|
});
|
|
2023
2057
|
}
|
|
2024
2058
|
|
|
2025
|
-
// src/primitives/chain/time/
|
|
2059
|
+
// src/primitives/chain/time/externalBlockRangeFromXl1BlockRange.ts
|
|
2026
2060
|
async function externalBlockRangeFromXL1BlockRange(context, blockViewer, xl1BlockRange, externalTimeName = "ethereum") {
|
|
2027
2061
|
const start = await externalBlockNumberFromXL1BlockNumber(context, blockViewer, xl1BlockRange[0], externalTimeName);
|
|
2028
2062
|
const end = await externalBlockNumberFromXL1BlockNumber(context, blockViewer, xl1BlockRange[1], externalTimeName);
|
|
@@ -2078,13 +2112,15 @@ function readPayloadMapFromStore(store) {
|
|
|
2078
2112
|
if (isReadArchivist(store)) {
|
|
2079
2113
|
return {
|
|
2080
2114
|
get: async (hash) => {
|
|
2081
|
-
|
|
2115
|
+
const results = await store.get([hash]);
|
|
2116
|
+
return results[0];
|
|
2082
2117
|
},
|
|
2083
2118
|
getMany: async (hashes) => {
|
|
2084
2119
|
return await store.get(hashes);
|
|
2085
2120
|
},
|
|
2086
2121
|
has: async (hash) => {
|
|
2087
|
-
|
|
2122
|
+
const results = await store.get([hash]);
|
|
2123
|
+
return isDefined12(results[0]);
|
|
2088
2124
|
}
|
|
2089
2125
|
};
|
|
2090
2126
|
}
|
|
@@ -2094,13 +2130,15 @@ function payloadMapFromStore(store) {
|
|
|
2094
2130
|
if (isReadWriteArchivist(store)) {
|
|
2095
2131
|
return {
|
|
2096
2132
|
get: async (hash) => {
|
|
2097
|
-
|
|
2133
|
+
const results = await store.get([hash]);
|
|
2134
|
+
return results[0];
|
|
2098
2135
|
},
|
|
2099
2136
|
getMany: async (hashes) => {
|
|
2100
2137
|
return await store.get(hashes);
|
|
2101
2138
|
},
|
|
2102
2139
|
has: async (hash) => {
|
|
2103
|
-
|
|
2140
|
+
const results = await store.get([hash]);
|
|
2141
|
+
return isDefined12(results[0]);
|
|
2104
2142
|
},
|
|
2105
2143
|
clear: async () => {
|
|
2106
2144
|
return await store.clear();
|
|
@@ -2160,7 +2198,8 @@ async function mergedAddRemoveStakeEventsByStaker(chainEvents, range, staked, st
|
|
|
2160
2198
|
|
|
2161
2199
|
// src/primitives/stake/activeStakeAtTimeByAddress.ts
|
|
2162
2200
|
async function activeStakeAtTimeByAddress(chain, staked, time, staker) {
|
|
2163
|
-
const
|
|
2201
|
+
const mergedEvents = await mergedAddRemoveStakeEventsByStaker(chain, [0, time], staked, staker);
|
|
2202
|
+
const stakeEvents = mergedEvents.toSorted((a, b) => a.time - b.time);
|
|
2164
2203
|
let result = 0n;
|
|
2165
2204
|
for (const event of stakeEvents) {
|
|
2166
2205
|
if (event.time > time) break;
|
|
@@ -2190,7 +2229,8 @@ async function mergedAddRemoveStakeEventsByPosition(chainEvents, range, position
|
|
|
2190
2229
|
|
|
2191
2230
|
// src/primitives/stake/activeStakeAtTimeByPosition.ts
|
|
2192
2231
|
async function activeStakeAtTimeByPosition(chainStakeEvents, externalTime, position) {
|
|
2193
|
-
const
|
|
2232
|
+
const mergedEvents = await mergedAddRemoveStakeEventsByPosition(chainStakeEvents, [0, externalTime], position);
|
|
2233
|
+
const stakeEvents = mergedEvents.toSorted((a, b) => a.time - b.time);
|
|
2194
2234
|
let result = 0n;
|
|
2195
2235
|
for (const event of stakeEvents) {
|
|
2196
2236
|
if (event.time > externalTime) break;
|
|
@@ -2245,16 +2285,17 @@ async function weightedStakeForRangeByPosition(context, blockViewer, stakeEvents
|
|
|
2245
2285
|
return await withContextCacheResponse(context, "weightedStakeForRangeByPosition", cacheKey, async () => {
|
|
2246
2286
|
let weightedStakeSum = 0n;
|
|
2247
2287
|
if (isDefined14(positionId)) {
|
|
2248
|
-
const
|
|
2288
|
+
const mergedEventsResult = await mergedAddRemoveStakeEventsByPosition(
|
|
2249
2289
|
stakeEventsViewer,
|
|
2250
2290
|
[0, externalRange[1]],
|
|
2251
2291
|
positionId
|
|
2252
|
-
)
|
|
2253
|
-
|
|
2254
|
-
let currentStake = 0n;
|
|
2292
|
+
);
|
|
2293
|
+
const mergedEvents = mergedEventsResult.toSorted((a, b) => a.time - b.time);
|
|
2255
2294
|
if (isDefined14(staked) && mergedEvents.at(0)?.args.staked !== staked) {
|
|
2256
2295
|
return 0n;
|
|
2257
2296
|
}
|
|
2297
|
+
let currentTime = externalRange[0];
|
|
2298
|
+
let currentStake = 0n;
|
|
2258
2299
|
for (const event of mergedEvents) {
|
|
2259
2300
|
if (event.time > currentTime) {
|
|
2260
2301
|
weightedStakeSum += currentStake * BigInt(event.time - currentTime);
|
|
@@ -2299,7 +2340,7 @@ async function networkStakeStepRewardPositionWeight(context, blockViewer, stakeE
|
|
|
2299
2340
|
// src/primitives/state/findMostRecentBlock.ts
|
|
2300
2341
|
import { isSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol-lib";
|
|
2301
2342
|
var DEFAULT_NEXT_OPTIONS = { limit: 50 };
|
|
2302
|
-
var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations =
|
|
2343
|
+
var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Infinity) => {
|
|
2303
2344
|
let mostRecentBlock;
|
|
2304
2345
|
let cursor;
|
|
2305
2346
|
let batch;
|
|
@@ -2315,9 +2356,8 @@ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTI
|
|
|
2315
2356
|
if (last) {
|
|
2316
2357
|
mostRecentBlock = last;
|
|
2317
2358
|
break;
|
|
2318
|
-
} else {
|
|
2319
|
-
cursor = batch.at(-1)?._sequence;
|
|
2320
2359
|
}
|
|
2360
|
+
cursor = batch.at(-1)?._sequence;
|
|
2321
2361
|
iterations = iterations + 1;
|
|
2322
2362
|
} while (batch.length > 0 && iterations < maxIterations);
|
|
2323
2363
|
return mostRecentBlock;
|
|
@@ -2330,7 +2370,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
|
|
|
2330
2370
|
if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`);
|
|
2331
2371
|
if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`);
|
|
2332
2372
|
if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`);
|
|
2333
|
-
const cacheKey =
|
|
2373
|
+
const cacheKey = String(blockNumber);
|
|
2334
2374
|
return await withContextCacheResponse(context, "hydratedBlockByNumber", cacheKey, async () => {
|
|
2335
2375
|
const block = assertEx17(
|
|
2336
2376
|
await blockFromBlockNumber(context, blockNumber),
|
|
@@ -2343,7 +2383,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
|
|
|
2343
2383
|
|
|
2344
2384
|
// src/primitives/uncle/getProducerKey.ts
|
|
2345
2385
|
function getProducerKey(block) {
|
|
2346
|
-
return block[0].addresses.toSorted().join(",");
|
|
2386
|
+
return block[0].addresses.toSorted((a, b) => a.localeCompare(b)).join(",");
|
|
2347
2387
|
}
|
|
2348
2388
|
|
|
2349
2389
|
// src/primitives/uncle/scoreUncle.ts
|
|
@@ -2352,7 +2392,7 @@ function scoreUncle(finalizedWindowedChain, blocks) {
|
|
|
2352
2392
|
if (blocks.length === 0) return 0;
|
|
2353
2393
|
let score = blocks.length;
|
|
2354
2394
|
const head = finalizedWindowedChain.at(-1);
|
|
2355
|
-
if (head && blocks[0]) {
|
|
2395
|
+
if (head !== void 0 && blocks[0] !== void 0) {
|
|
2356
2396
|
const headProducer = getProducerKey(head);
|
|
2357
2397
|
const candidateProducer = getProducerKey(blocks[0]);
|
|
2358
2398
|
if (headProducer !== candidateProducer) {
|
|
@@ -2387,6 +2427,19 @@ import {
|
|
|
2387
2427
|
exists as exists2
|
|
2388
2428
|
} from "@xylabs/sdk-js";
|
|
2389
2429
|
import { isTransactionBoundWitness as isTransactionBoundWitness2 } from "@xyo-network/xl1-protocol-lib";
|
|
2430
|
+
function extendUncleChain(block, map) {
|
|
2431
|
+
const uncle = [block];
|
|
2432
|
+
let previous = block[0].previous ? map.get(block[0].previous) : void 0;
|
|
2433
|
+
while (previous) {
|
|
2434
|
+
if (previous[0].block === uncle[0][0].block - 1) {
|
|
2435
|
+
uncle.unshift(previous);
|
|
2436
|
+
previous = previous[0].previous ? map.get(previous[0].previous) : void 0;
|
|
2437
|
+
} else {
|
|
2438
|
+
return [];
|
|
2439
|
+
}
|
|
2440
|
+
}
|
|
2441
|
+
return uncle;
|
|
2442
|
+
}
|
|
2390
2443
|
function blocksToChains(blocks) {
|
|
2391
2444
|
const chains = [];
|
|
2392
2445
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -2394,17 +2447,7 @@ function blocksToChains(blocks) {
|
|
|
2394
2447
|
map.set(block[0]._hash, block);
|
|
2395
2448
|
}
|
|
2396
2449
|
for (const block of blocks) {
|
|
2397
|
-
|
|
2398
|
-
let previous = block[0].previous ? map.get(block[0].previous) : void 0;
|
|
2399
|
-
while (previous) {
|
|
2400
|
-
if (previous[0].block === uncle[0][0].block - 1) {
|
|
2401
|
-
uncle.unshift(previous);
|
|
2402
|
-
previous = previous[0].previous ? map.get(previous[0].previous) : void 0;
|
|
2403
|
-
} else {
|
|
2404
|
-
uncle = [];
|
|
2405
|
-
break;
|
|
2406
|
-
}
|
|
2407
|
-
}
|
|
2450
|
+
const uncle = extendUncleChain(block, map);
|
|
2408
2451
|
if (uncle.length > 0) {
|
|
2409
2452
|
chains.push(uncle);
|
|
2410
2453
|
}
|
|
@@ -2590,23 +2633,26 @@ function synthesizeS3Transports(s3) {
|
|
|
2590
2633
|
}
|
|
2591
2634
|
return transports;
|
|
2592
2635
|
}
|
|
2636
|
+
function hasTransport(transports, key) {
|
|
2637
|
+
return Object.hasOwn(transports, key) && transports[key] !== void 0;
|
|
2638
|
+
}
|
|
2593
2639
|
function synthesizeProviderBindings(transports) {
|
|
2594
2640
|
const bindings = {};
|
|
2595
|
-
if (transports
|
|
2641
|
+
if (hasTransport(transports, DEFAULT_RPC_TRANSPORT)) {
|
|
2596
2642
|
bindings.BlockViewer = { transport: DEFAULT_RPC_TRANSPORT };
|
|
2597
2643
|
bindings.MempoolViewer = { transport: DEFAULT_RPC_TRANSPORT };
|
|
2598
2644
|
bindings.FinalizationViewer = { transport: DEFAULT_RPC_TRANSPORT };
|
|
2599
2645
|
bindings.TransactionViewer = { transport: DEFAULT_RPC_TRANSPORT };
|
|
2600
2646
|
bindings.AccountBalanceViewer = { transport: DEFAULT_RPC_TRANSPORT };
|
|
2601
2647
|
}
|
|
2602
|
-
if (transports
|
|
2648
|
+
if (hasTransport(transports, S3_FINALIZED_TRANSPORT)) {
|
|
2603
2649
|
bindings.BlockPublishRunner = { transport: S3_FINALIZED_TRANSPORT };
|
|
2604
2650
|
}
|
|
2605
|
-
if (transports
|
|
2651
|
+
if (hasTransport(transports, S3_CHAIN_STATE_TRANSPORT)) {
|
|
2606
2652
|
bindings.ChainStateViewer = { transport: S3_CHAIN_STATE_TRANSPORT };
|
|
2607
2653
|
bindings.ChainStatePublishRunner = { transport: S3_CHAIN_STATE_TRANSPORT };
|
|
2608
2654
|
}
|
|
2609
|
-
if (transports
|
|
2655
|
+
if (hasTransport(transports, S3_INDEX_TRANSPORT)) {
|
|
2610
2656
|
bindings.IndexPublishRunner = { transport: S3_INDEX_TRANSPORT };
|
|
2611
2657
|
}
|
|
2612
2658
|
return bindings;
|
|
@@ -2722,8 +2768,8 @@ import {
|
|
|
2722
2768
|
} from "@xylabs/sdk-js";
|
|
2723
2769
|
import { CachingContextZod } from "@xyo-network/xl1-protocol-lib";
|
|
2724
2770
|
import { z as z25 } from "zod/mini";
|
|
2725
|
-
var RuntimeStatusMonitorZod = z25.custom((val) => val && typeof val === "object");
|
|
2726
|
-
var ProviderFactoryLocatorZod = z25.lazy(() => z25.custom((val) => val && typeof val === "object" && "context" in val && "registry" in val));
|
|
2771
|
+
var RuntimeStatusMonitorZod = z25.custom((val) => val !== null && val !== void 0 && typeof val === "object");
|
|
2772
|
+
var ProviderFactoryLocatorZod = z25.lazy(() => z25.custom((val) => val !== null && val !== void 0 && typeof val === "object" && "context" in val && "registry" in val));
|
|
2727
2773
|
var BaseConfigContextZod = z25.extend(CachingContextZod, {
|
|
2728
2774
|
config: z25.looseObject(BaseConfigZod.shape),
|
|
2729
2775
|
locator: z25.optional(ProviderFactoryLocatorZod)
|
|
@@ -2771,7 +2817,9 @@ var hydratedBlockToPayloadBundle = (transaction) => {
|
|
|
2771
2817
|
};
|
|
2772
2818
|
var bundle = (root, transaction) => {
|
|
2773
2819
|
const payloads = flattenHydratedBlock(transaction).flatMap((p) => PayloadBuilder6.omitStorageMeta(p));
|
|
2774
|
-
|
|
2820
|
+
const payloadBuilder = new PayloadBuilder6({ schema: PayloadBundleSchema });
|
|
2821
|
+
const builder = payloadBuilder.fields({ payloads, root });
|
|
2822
|
+
return builder.build();
|
|
2775
2823
|
};
|
|
2776
2824
|
|
|
2777
2825
|
// src/model/PayloadBundle/hydratedTransactionToPayloadBundle.ts
|
|
@@ -2802,10 +2850,7 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
|
|
|
2802
2850
|
exp
|
|
2803
2851
|
};
|
|
2804
2852
|
const elevatedHashes = await PayloadBuilder7.hashes(onChainPayloads);
|
|
2805
|
-
const script =
|
|
2806
|
-
for (const elevatedHash of elevatedHashes) {
|
|
2807
|
-
script.push(`elevate|${elevatedHash}`);
|
|
2808
|
-
}
|
|
2853
|
+
const script = Array.from(elevatedHashes, (elevatedHash) => `elevate|${elevatedHash}`);
|
|
2809
2854
|
const fields = {
|
|
2810
2855
|
...txBoundWitnessFields,
|
|
2811
2856
|
from: from ?? (Array.isArray(signer) ? assertEx19(signer.at(0)?.address) : signer.address)
|
|
@@ -2813,7 +2858,9 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
|
|
|
2813
2858
|
if (script.length > 0) {
|
|
2814
2859
|
fields.script = script;
|
|
2815
2860
|
}
|
|
2816
|
-
const
|
|
2861
|
+
const boundWitnessBuilder = new BoundWitnessBuilder();
|
|
2862
|
+
const builder = boundWitnessBuilder.fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).signers(Array.isArray(signer) ? signer : [signer]);
|
|
2863
|
+
const [tx, txPayloads] = await builder.build();
|
|
2817
2864
|
return [await PayloadBuilder7.addHashMeta(tx), await PayloadBuilder7.addHashMeta(txPayloads.map((p) => asAnyPayload2(p, true)))];
|
|
2818
2865
|
}
|
|
2819
2866
|
|
|
@@ -2834,10 +2881,7 @@ async function buildUnsignedTransaction(chain, onChainPayloads, offChainPayloads
|
|
|
2834
2881
|
exp
|
|
2835
2882
|
};
|
|
2836
2883
|
const elevatedHashes = await PayloadBuilder8.hashes(onChainPayloads);
|
|
2837
|
-
const script =
|
|
2838
|
-
for (const elevatedHash of elevatedHashes) {
|
|
2839
|
-
script.push(`elevate|${elevatedHash}`);
|
|
2840
|
-
}
|
|
2884
|
+
const script = Array.from(elevatedHashes, (elevatedHash) => `elevate|${elevatedHash}`);
|
|
2841
2885
|
const fields = {
|
|
2842
2886
|
...txBoundWitnessFields,
|
|
2843
2887
|
from
|
|
@@ -2845,7 +2889,9 @@ async function buildUnsignedTransaction(chain, onChainPayloads, offChainPayloads
|
|
|
2845
2889
|
if (script.length > 0) {
|
|
2846
2890
|
fields.script = script;
|
|
2847
2891
|
}
|
|
2848
|
-
const
|
|
2892
|
+
const boundWitnessBuilder = new BoundWitnessBuilder2();
|
|
2893
|
+
const builder = boundWitnessBuilder.fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]);
|
|
2894
|
+
const [tx, txPayloads] = await builder.build(false);
|
|
2849
2895
|
return [tx, txPayloads];
|
|
2850
2896
|
}
|
|
2851
2897
|
|
|
@@ -2877,19 +2923,17 @@ var confirmSubmittedTransaction = async (viewer, txHash, options) => {
|
|
|
2877
2923
|
if (isDefined16(tx)) {
|
|
2878
2924
|
options?.logger?.debug("Transaction confirmed", txHash);
|
|
2879
2925
|
return tx;
|
|
2880
|
-
} else {
|
|
2881
|
-
if (isNumber(exp)) {
|
|
2882
|
-
await assertNotExpired(viewer, txHash, exp, options);
|
|
2883
|
-
}
|
|
2884
|
-
attempts++;
|
|
2885
|
-
if (attempts > maxAttempts) {
|
|
2886
|
-
options?.logger?.error(`\u26A0\uFE0F Transaction not confirmed after ${maxAttempts} attempts`);
|
|
2887
|
-
throw new Error(`Transaction ${txHash} not confirmed after ${maxAttempts} attempts`);
|
|
2888
|
-
} else {
|
|
2889
|
-
options?.logger?.debug(`Transaction not confirmed yet, attempt ${attempts}. Retrying...`, txHash);
|
|
2890
|
-
await delay(attemptDelay);
|
|
2891
|
-
}
|
|
2892
2926
|
}
|
|
2927
|
+
if (isNumber(exp)) {
|
|
2928
|
+
await assertNotExpired(viewer, txHash, exp, options);
|
|
2929
|
+
}
|
|
2930
|
+
attempts++;
|
|
2931
|
+
if (attempts > maxAttempts) {
|
|
2932
|
+
options?.logger?.error(`\u26A0\uFE0F Transaction not confirmed after ${maxAttempts} attempts`);
|
|
2933
|
+
throw new Error(`Transaction ${txHash} not confirmed after ${maxAttempts} attempts`);
|
|
2934
|
+
}
|
|
2935
|
+
options?.logger?.debug(`Transaction not confirmed yet, attempt ${attempts}. Retrying...`, txHash);
|
|
2936
|
+
await delay(attemptDelay);
|
|
2893
2937
|
}
|
|
2894
2938
|
};
|
|
2895
2939
|
|
|
@@ -2908,9 +2952,7 @@ import {
|
|
|
2908
2952
|
var tryHydrateTransaction = async ({ chainMap }, hash) => {
|
|
2909
2953
|
return await tryHydrateTypedBoundWitness(
|
|
2910
2954
|
{
|
|
2911
|
-
get(hashes)
|
|
2912
|
-
return chainMap.get(hashes);
|
|
2913
|
-
},
|
|
2955
|
+
get: (hashes) => chainMap.get(hashes),
|
|
2914
2956
|
next() {
|
|
2915
2957
|
throw new Error("Not implemented");
|
|
2916
2958
|
}
|
|
@@ -2922,9 +2964,7 @@ var tryHydrateTransaction = async ({ chainMap }, hash) => {
|
|
|
2922
2964
|
var hydrateTransaction = async ({ chainMap }, hash) => {
|
|
2923
2965
|
return await hydrateTypedBoundWitness(
|
|
2924
2966
|
{
|
|
2925
|
-
get(hashes)
|
|
2926
|
-
return chainMap.get(hashes);
|
|
2927
|
-
},
|
|
2967
|
+
get: (hashes) => chainMap.get(hashes),
|
|
2928
2968
|
next() {
|
|
2929
2969
|
throw new Error("Not implemented");
|
|
2930
2970
|
}
|
|
@@ -3185,7 +3225,9 @@ var hydratedTransactionToPayloadBundle = (transaction) => {
|
|
|
3185
3225
|
};
|
|
3186
3226
|
var bundle2 = (root, transaction) => {
|
|
3187
3227
|
const payloads = flattenHydratedTransaction(transaction);
|
|
3188
|
-
|
|
3228
|
+
const payloadBuilder = new PayloadBuilder12({ schema: PayloadBundleSchema2 });
|
|
3229
|
+
const builder = payloadBuilder.fields({ payloads, root });
|
|
3230
|
+
return builder.build();
|
|
3189
3231
|
};
|
|
3190
3232
|
|
|
3191
3233
|
// src/context/Actor.ts
|
|
@@ -3231,7 +3273,7 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
3231
3273
|
get resolvedMoniker() {
|
|
3232
3274
|
const labels = this.labels ?? {};
|
|
3233
3275
|
const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",");
|
|
3234
|
-
return labelString.length === 0 ?
|
|
3276
|
+
return labelString.length === 0 ? this.defaultMoniker : `${this.defaultMoniker}|${labelString}`;
|
|
3235
3277
|
}
|
|
3236
3278
|
get uniqueId() {
|
|
3237
3279
|
return this._uniqueId;
|
|
@@ -3246,8 +3288,7 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
3246
3288
|
let scopeObject;
|
|
3247
3289
|
switch (this.scope) {
|
|
3248
3290
|
case "global": {
|
|
3249
|
-
|
|
3250
|
-
scopeObject = globalThis.xyoServiceSingletons;
|
|
3291
|
+
scopeObject = getOrCreateGlobalSingletons();
|
|
3251
3292
|
break;
|
|
3252
3293
|
}
|
|
3253
3294
|
case "context": {
|
|
@@ -3284,6 +3325,15 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
3284
3325
|
}
|
|
3285
3326
|
}
|
|
3286
3327
|
};
|
|
3328
|
+
function getOrCreateGlobalSingletons() {
|
|
3329
|
+
const existing = globalThis.xyoServiceSingletons;
|
|
3330
|
+
if (existing !== void 0) {
|
|
3331
|
+
return existing;
|
|
3332
|
+
}
|
|
3333
|
+
const singletons = {};
|
|
3334
|
+
Reflect.set(globalThis, "xyoServiceSingletons", singletons);
|
|
3335
|
+
return singletons;
|
|
3336
|
+
}
|
|
3287
3337
|
|
|
3288
3338
|
// src/CreatableProvider/AbstractCreatableProvider.ts
|
|
3289
3339
|
var AbstractCreatableProvider = class extends AbstractCreatable {
|
|
@@ -3469,7 +3519,7 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
3469
3519
|
);
|
|
3470
3520
|
}
|
|
3471
3521
|
has(moniker) {
|
|
3472
|
-
return
|
|
3522
|
+
return Object.hasOwn(this._registry, moniker);
|
|
3473
3523
|
}
|
|
3474
3524
|
/**
|
|
3475
3525
|
* Locates a provider factory that matches the supplied moniker and labels
|
|
@@ -3486,10 +3536,11 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
3486
3536
|
merge(locator) {
|
|
3487
3537
|
const registry = { ...this.registry };
|
|
3488
3538
|
for (const moniker in locator.registry) {
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
} else {
|
|
3539
|
+
const existing = registry[moniker];
|
|
3540
|
+
if (existing === void 0) {
|
|
3492
3541
|
registry[moniker] = locator.registry[moniker];
|
|
3542
|
+
} else {
|
|
3543
|
+
existing.push(...locator.registry[moniker] ?? []);
|
|
3493
3544
|
}
|
|
3494
3545
|
}
|
|
3495
3546
|
return new _ProviderFactoryLocator(this.context, registry);
|
|
@@ -3519,13 +3570,13 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
3519
3570
|
return this;
|
|
3520
3571
|
}
|
|
3521
3572
|
registered(moniker) {
|
|
3522
|
-
return
|
|
3573
|
+
return Object.hasOwn(this.registry, moniker) || (this._parent?.registered(moniker) ?? false);
|
|
3523
3574
|
}
|
|
3524
3575
|
async tryGetInstance(moniker, { start = true, labels } = {}) {
|
|
3525
3576
|
const resolvedParams = { context: this.context };
|
|
3526
3577
|
const factory = this.tryLocate(moniker, labels);
|
|
3527
|
-
if (factory) {
|
|
3528
|
-
if (this.context.singletons
|
|
3578
|
+
if (factory !== void 0) {
|
|
3579
|
+
if (Object.hasOwn(this.context.singletons, factory.uniqueId)) {
|
|
3529
3580
|
return this.context.singletons[factory.uniqueId];
|
|
3530
3581
|
}
|
|
3531
3582
|
this.logger?.debug(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ""} using factory [${factory.uniqueId.description}]`);
|
|
@@ -3593,13 +3644,14 @@ import {
|
|
|
3593
3644
|
} from "@xyo-network/xl1-protocol-lib";
|
|
3594
3645
|
var createDeclarationIntent = (address, intent, nbf, exp) => {
|
|
3595
3646
|
const expiration = isDefined17(exp) ? exp : nbf + 1e4;
|
|
3596
|
-
const
|
|
3647
|
+
const payloadBuilder = new PayloadBuilder13({ schema: ChainStakeIntentSchema });
|
|
3648
|
+
const builder = payloadBuilder.fields({
|
|
3597
3649
|
from: address,
|
|
3598
3650
|
intent,
|
|
3599
3651
|
nbf,
|
|
3600
3652
|
exp: expiration
|
|
3601
|
-
})
|
|
3602
|
-
return
|
|
3653
|
+
});
|
|
3654
|
+
return builder.build();
|
|
3603
3655
|
};
|
|
3604
3656
|
|
|
3605
3657
|
// src/createTransferPayload.ts
|
|
@@ -3607,12 +3659,14 @@ import { toHex as toHex3 } from "@xylabs/sdk-js";
|
|
|
3607
3659
|
import { PayloadBuilder as PayloadBuilder14 } from "@xyo-network/sdk-js";
|
|
3608
3660
|
import { TransferSchema } from "@xyo-network/xl1-protocol-lib";
|
|
3609
3661
|
function createTransferPayload(from, transfers, context) {
|
|
3610
|
-
|
|
3662
|
+
const payloadBuilder = new PayloadBuilder14({ schema: TransferSchema });
|
|
3663
|
+
const builder = payloadBuilder.fields({
|
|
3611
3664
|
epoch: Date.now(),
|
|
3612
3665
|
from,
|
|
3613
3666
|
transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex3(v)])),
|
|
3614
3667
|
context
|
|
3615
|
-
})
|
|
3668
|
+
});
|
|
3669
|
+
return builder.build();
|
|
3616
3670
|
}
|
|
3617
3671
|
|
|
3618
3672
|
// src/eip-712/Payloads/EIP712Data.ts
|
|
@@ -3746,11 +3800,11 @@ var isPositiveBigInt = (value) => {
|
|
|
3746
3800
|
var parseSignedBigInt = (value) => {
|
|
3747
3801
|
if (isNegativeBigInt(value)) {
|
|
3748
3802
|
return -hexToBigInt5(value.negative);
|
|
3749
|
-
}
|
|
3803
|
+
}
|
|
3804
|
+
if (isPositiveBigInt(value)) {
|
|
3750
3805
|
return hexToBigInt5(value.positive);
|
|
3751
|
-
} else {
|
|
3752
|
-
throw new Error("Invalid balance type");
|
|
3753
3806
|
}
|
|
3807
|
+
throw new Error("Invalid balance type");
|
|
3754
3808
|
};
|
|
3755
3809
|
var toSignedBigInt = (value) => {
|
|
3756
3810
|
return value < 0n ? { negative: toHex4(-value) } : { positive: toHex4(value) };
|
|
@@ -3867,39 +3921,38 @@ async function balancesStepSummaryFromRange(context, semaphores, blockViewer, su
|
|
|
3867
3921
|
const summaryResult = await summaryMap.get(`${frameHead._hash}|${frameSize}`);
|
|
3868
3922
|
if (isAnyPayload3(summaryResult)) {
|
|
3869
3923
|
return summaryResult;
|
|
3870
|
-
}
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
}
|
|
3887
|
-
}
|
|
3888
|
-
const balances = {};
|
|
3889
|
-
for (const [address, balance] of Object.entries(bigIntBalances)) {
|
|
3890
|
-
balances[address] = toSignedBigInt(balance);
|
|
3924
|
+
}
|
|
3925
|
+
await semaphores[step].acquire();
|
|
3926
|
+
try {
|
|
3927
|
+
const subRanges = deepCalculateFramesFromRange(range, step - 1);
|
|
3928
|
+
const promises = subRanges.map((subRange) => balancesStepSummaryFromRange(
|
|
3929
|
+
context,
|
|
3930
|
+
semaphores,
|
|
3931
|
+
blockViewer,
|
|
3932
|
+
summaryMap,
|
|
3933
|
+
subRange
|
|
3934
|
+
));
|
|
3935
|
+
const subResults = await Promise.all(promises);
|
|
3936
|
+
const bigIntBalances = {};
|
|
3937
|
+
for (const subResult of subResults) {
|
|
3938
|
+
for (const [address, balance] of Object.entries(subResult.balances)) {
|
|
3939
|
+
bigIntBalances[address] = (bigIntBalances[address] ?? 0n) + parseSignedBigInt(balance);
|
|
3891
3940
|
}
|
|
3892
|
-
const result = {
|
|
3893
|
-
schema: BalancesStepSummarySchema,
|
|
3894
|
-
hash: frameHead._hash,
|
|
3895
|
-
stepSize: frameSize,
|
|
3896
|
-
balances
|
|
3897
|
-
};
|
|
3898
|
-
await summaryMap.set(key, result);
|
|
3899
|
-
return result;
|
|
3900
|
-
} finally {
|
|
3901
|
-
semaphores[step].release();
|
|
3902
3941
|
}
|
|
3942
|
+
const balances = {};
|
|
3943
|
+
for (const [address, balance] of Object.entries(bigIntBalances)) {
|
|
3944
|
+
balances[address] = toSignedBigInt(balance);
|
|
3945
|
+
}
|
|
3946
|
+
const result = {
|
|
3947
|
+
schema: BalancesStepSummarySchema,
|
|
3948
|
+
hash: frameHead._hash,
|
|
3949
|
+
stepSize: frameSize,
|
|
3950
|
+
balances
|
|
3951
|
+
};
|
|
3952
|
+
await summaryMap.set(key, result);
|
|
3953
|
+
return result;
|
|
3954
|
+
} finally {
|
|
3955
|
+
semaphores[step].release();
|
|
3903
3956
|
}
|
|
3904
3957
|
}, { ...context, timeBudgetLimit: 500 });
|
|
3905
3958
|
}, { ...context, timeBudgetLimit: 500 });
|
|
@@ -4254,14 +4307,16 @@ var SimpleAccountBalanceViewer = class extends AbstractCreatableProvider {
|
|
|
4254
4307
|
return balances[address] ?? AttoXL13(0n);
|
|
4255
4308
|
}
|
|
4256
4309
|
async accountBalanceHistories(addresses, config = {}) {
|
|
4257
|
-
|
|
4310
|
+
const [histories] = await this.qualifiedAccountBalanceHistories(addresses, config);
|
|
4311
|
+
return histories;
|
|
4258
4312
|
}
|
|
4259
4313
|
async accountBalanceHistory(address, config) {
|
|
4260
4314
|
return await this.spanAsync("accountBalanceHistory", async () => {
|
|
4261
4315
|
const range = isChainQualifiedRangeConfig4(config) ? config.range : void 0;
|
|
4262
4316
|
const startingRange = asXL1BlockRange10(range ?? [0, await this.blockViewer.currentBlockNumber()], true);
|
|
4263
4317
|
const blockNumbers = await this.distillTransferHistory(address, startingRange);
|
|
4264
|
-
const
|
|
4318
|
+
const blockResults = await Promise.all(blockNumbers.map(async (bn) => await this.blockViewer.blockByNumber(bn)));
|
|
4319
|
+
const blocks = blockResults.filter(exists3);
|
|
4265
4320
|
const result = [];
|
|
4266
4321
|
for (const block of blocks) {
|
|
4267
4322
|
const transferIndexes = block[0].payload_schemas.map((schema, index) => schema === TransferSchema2 ? index : void 0).filter(exists3);
|
|
@@ -4393,7 +4448,8 @@ var SimpleAccountBalanceViewer = class extends AbstractCreatableProvider {
|
|
|
4393
4448
|
const [head] = assertEx33(isDefined18(headHash) ? await this.blockViewer.blockByHash(headHash) : await this.blockViewer.currentBlock(), () => "Could not resolve head block");
|
|
4394
4449
|
const startingRange = asXL1BlockRange10(range ?? [0, head.block], true);
|
|
4395
4450
|
const blockNumbers = await this.distillTransferHistory(address, startingRange);
|
|
4396
|
-
const
|
|
4451
|
+
const blockResults = await Promise.all(blockNumbers.map(async (bn) => await this.blockViewer.blockByNumber(bn)));
|
|
4452
|
+
const blocks = blockResults.filter(exists3);
|
|
4397
4453
|
const result = [];
|
|
4398
4454
|
for (const block of blocks) {
|
|
4399
4455
|
const transferIndexes = block[0].payload_schemas.map((schema, index) => schema === TransferSchema2 ? index : void 0).filter(exists3);
|
|
@@ -4585,7 +4641,7 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
4585
4641
|
}
|
|
4586
4642
|
async blocksByStep(stepLevel, stepIndex) {
|
|
4587
4643
|
return await this.spanAsync("blocksByStep", async () => {
|
|
4588
|
-
assertEx34(Number.
|
|
4644
|
+
assertEx34(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
|
|
4589
4645
|
const size = stepSize2(stepLevel);
|
|
4590
4646
|
assertEx34(
|
|
4591
4647
|
stepLevel <= blocksMaxStep,
|
|
@@ -4609,7 +4665,12 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
4609
4665
|
}
|
|
4610
4666
|
async chainId(blockNumber = "latest") {
|
|
4611
4667
|
return await this.spanAsync("chainId", async () => {
|
|
4612
|
-
|
|
4668
|
+
if (blockNumber === "latest") {
|
|
4669
|
+
const headBlock = await this.finalizationViewer.headBlock();
|
|
4670
|
+
return headBlock.chain;
|
|
4671
|
+
}
|
|
4672
|
+
const block = assertEx34(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`);
|
|
4673
|
+
return block[0].chain;
|
|
4613
4674
|
}, this.context);
|
|
4614
4675
|
}
|
|
4615
4676
|
async createHandler() {
|
|
@@ -4658,9 +4719,10 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
4658
4719
|
};
|
|
4659
4720
|
}
|
|
4660
4721
|
async getChainContextRead() {
|
|
4722
|
+
const headBlock = await this.finalizationViewer.head();
|
|
4661
4723
|
return {
|
|
4662
4724
|
...this.getBlockContextRead(),
|
|
4663
|
-
head:
|
|
4725
|
+
head: headBlock[0]
|
|
4664
4726
|
};
|
|
4665
4727
|
}
|
|
4666
4728
|
async startHandler() {
|
|
@@ -4707,10 +4769,11 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
4707
4769
|
}, this.headPollIntervalMs);
|
|
4708
4770
|
}
|
|
4709
4771
|
stopHeadPolling() {
|
|
4710
|
-
if (this._headPollTimer) {
|
|
4711
|
-
|
|
4712
|
-
this._headPollTimer = null;
|
|
4772
|
+
if (!this._headPollTimer) {
|
|
4773
|
+
return;
|
|
4713
4774
|
}
|
|
4775
|
+
clearInterval(this._headPollTimer);
|
|
4776
|
+
this._headPollTimer = null;
|
|
4714
4777
|
}
|
|
4715
4778
|
};
|
|
4716
4779
|
__publicField(SimpleBlockViewer, "defaultMoniker", BlockViewerMoniker2);
|
|
@@ -4791,13 +4854,18 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
|
|
|
4791
4854
|
head: void 0
|
|
4792
4855
|
};
|
|
4793
4856
|
const blocksWithMeta = await Promise.all(blocks.map((b) => Promise.all([PayloadBuilder18.addHashMeta(b[0]), PayloadBuilder18.addHashMeta(b[1])])));
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4857
|
+
let head;
|
|
4858
|
+
if (isChainQualifiedHeadConfig5(config)) {
|
|
4859
|
+
const headBlockResult = await this.blockViewer.blockByHash(config.head);
|
|
4860
|
+
head = headBlockResult == null ? assertEx35(
|
|
4861
|
+
void 0,
|
|
4862
|
+
() => `Specified a head that is not in the chain [${config.head}]`
|
|
4863
|
+
) : headBlockResult[0];
|
|
4864
|
+
}
|
|
4865
|
+
const currentBlock = await this.blockViewer.currentBlock();
|
|
4866
|
+
const headBlock = head ?? currentBlock[0];
|
|
4867
|
+
const validateProtocol = value === true ? this.doValidateProtocol.bind(this) : void 0;
|
|
4868
|
+
const validateState = state === true ? this.doValidateState.bind(this) : void 0;
|
|
4801
4869
|
const chainIdAtBlockNumber = (blockNumber) => this.chainContractViewer.chainIdAtBlockNumber(blockNumber);
|
|
4802
4870
|
const qualification = { head: headBlock._hash, range: asXL1BlockRange12([0, headBlock.block], true) };
|
|
4803
4871
|
const [protocolResults, stateResults] = await Promise.all([
|
|
@@ -4820,13 +4888,16 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
|
|
|
4820
4888
|
throw new Error("Method not implemented.");
|
|
4821
4889
|
}
|
|
4822
4890
|
async validateBlock(block, config) {
|
|
4823
|
-
|
|
4891
|
+
const results = await this.validateBlocks([block], config);
|
|
4892
|
+
return results[0];
|
|
4824
4893
|
}
|
|
4825
4894
|
async validateBlocks(blocks, config) {
|
|
4826
|
-
|
|
4895
|
+
const results = await this.qualifiedValidateBlocks(blocks, config);
|
|
4896
|
+
return results[0];
|
|
4827
4897
|
}
|
|
4828
4898
|
async validateUncle(blocks, config) {
|
|
4829
|
-
|
|
4899
|
+
const results = await this.qualifiedValidateUncle(blocks, config);
|
|
4900
|
+
return results[0];
|
|
4830
4901
|
}
|
|
4831
4902
|
async doValidateProtocol(blocks, chainIdAtBlockNumber) {
|
|
4832
4903
|
return await Promise.all(blocks.map(async (block) => {
|
|
@@ -4884,7 +4955,7 @@ var SimpleChainContractViewer = class extends AbstractCreatableProvider {
|
|
|
4884
4955
|
return this.finalizationViewer.chainId();
|
|
4885
4956
|
}
|
|
4886
4957
|
async chainIdAtBlockNumber(blockNumber) {
|
|
4887
|
-
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber",
|
|
4958
|
+
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
|
|
4888
4959
|
let chainId = this.chainId();
|
|
4889
4960
|
let contractViewer = this;
|
|
4890
4961
|
let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
|
|
@@ -4967,14 +5038,16 @@ var AbstractRestDataLake = class extends AbstractCreatableProvider {
|
|
|
4967
5038
|
return this.params.endpoint;
|
|
4968
5039
|
}
|
|
4969
5040
|
async get(hashes) {
|
|
4970
|
-
|
|
5041
|
+
const results = await Promise.all(hashes.map((hash) => this.getOne(hash)));
|
|
5042
|
+
return results.filter(exists5);
|
|
4971
5043
|
}
|
|
4972
5044
|
next(_options) {
|
|
4973
5045
|
throw new Error("Method not implemented.");
|
|
4974
5046
|
}
|
|
4975
5047
|
async getOne(hash) {
|
|
4976
5048
|
try {
|
|
4977
|
-
|
|
5049
|
+
const response = await this.client.get(`${this.params.endpoint}/get/${hash}`);
|
|
5050
|
+
return asAnyPayload4(response.data);
|
|
4978
5051
|
} catch (ex) {
|
|
4979
5052
|
if (ex instanceof FetchClientError && (ex.response.status === 400 || ex.response.status === 404)) {
|
|
4980
5053
|
return void 0;
|
|
@@ -4992,7 +5065,7 @@ var AbstractRestDataLake = class extends AbstractCreatableProvider {
|
|
|
4992
5065
|
if (this.allowedSchemas && !this.allowedSchemas.includes(schema)) {
|
|
4993
5066
|
return false;
|
|
4994
5067
|
}
|
|
4995
|
-
if (this.disallowedSchemas?.includes(schema)) {
|
|
5068
|
+
if (this.disallowedSchemas?.includes(schema) === true) {
|
|
4996
5069
|
return false;
|
|
4997
5070
|
}
|
|
4998
5071
|
return true;
|
|
@@ -5019,9 +5092,8 @@ var RestDataLakeRunner = class extends AbstractRestDataLake {
|
|
|
5019
5092
|
if (allowedItems.length > 0) {
|
|
5020
5093
|
const result = await this.client.post(`${this.params.endpoint}/insert`, allowedItems);
|
|
5021
5094
|
return z32.array(PayloadZodLoose).parse(result.data);
|
|
5022
|
-
} else {
|
|
5023
|
-
return [];
|
|
5024
5095
|
}
|
|
5096
|
+
return [];
|
|
5025
5097
|
}
|
|
5026
5098
|
};
|
|
5027
5099
|
__publicField(RestDataLakeRunner, "defaultMoniker", DataLakeRunnerMoniker);
|
|
@@ -5077,7 +5149,7 @@ var AbstractSimpleDataLake = class extends AbstractCreatableProvider {
|
|
|
5077
5149
|
if (this.allowedSchemas && !this.allowedSchemas.includes(schema)) {
|
|
5078
5150
|
return false;
|
|
5079
5151
|
}
|
|
5080
|
-
if (this.disallowedSchemas?.includes(schema)) {
|
|
5152
|
+
if (this.disallowedSchemas?.includes(schema) === true) {
|
|
5081
5153
|
return false;
|
|
5082
5154
|
}
|
|
5083
5155
|
return true;
|
|
@@ -5091,10 +5163,12 @@ var SimpleDataLakeRunner = class extends AbstractSimpleDataLake {
|
|
|
5091
5163
|
await this.map.clear();
|
|
5092
5164
|
}
|
|
5093
5165
|
async delete(hashes) {
|
|
5094
|
-
|
|
5166
|
+
const deleteResults = await Promise.all(hashes.map(async (hash) => {
|
|
5095
5167
|
const payload = await this.map.get(hash);
|
|
5096
|
-
|
|
5097
|
-
|
|
5168
|
+
const deleted = await this.map.delete(hash);
|
|
5169
|
+
return deleted ? payload : void 0;
|
|
5170
|
+
}));
|
|
5171
|
+
return deleteResults.filter(exists7);
|
|
5098
5172
|
}
|
|
5099
5173
|
async insert(items) {
|
|
5100
5174
|
const payloads = items.filter(isAnyPayload10).filter((i) => this.isAllowed(i));
|
|
@@ -5137,7 +5211,8 @@ var SimpleFinalizationRunner = class extends AbstractCreatableProvider {
|
|
|
5137
5211
|
this._store = { chainMap: this.params.finalizedArchivist };
|
|
5138
5212
|
}
|
|
5139
5213
|
async finalizeBlock(block) {
|
|
5140
|
-
|
|
5214
|
+
const results = await this.finalizeBlocks([block]);
|
|
5215
|
+
return results[0];
|
|
5141
5216
|
}
|
|
5142
5217
|
async finalizeBlocks(blocks) {
|
|
5143
5218
|
const sortedBlocks = blocks.toSorted((a, b) => a[0].block - b[0].block);
|
|
@@ -5191,7 +5266,8 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
5191
5266
|
}
|
|
5192
5267
|
async createHandler() {
|
|
5193
5268
|
await super.createHandler();
|
|
5194
|
-
|
|
5269
|
+
const mostRecentBlock = await findMostRecentBlock(this.params.finalizedArchivist);
|
|
5270
|
+
this._chainId = assertEx38(this.config.chain.id ?? mostRecentBlock?.chain, () => "chain.id is required if empty archivist");
|
|
5195
5271
|
this._store = { chainMap: this.params.finalizedArchivist };
|
|
5196
5272
|
}
|
|
5197
5273
|
async head() {
|
|
@@ -5206,13 +5282,16 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
5206
5282
|
}, this.context);
|
|
5207
5283
|
}
|
|
5208
5284
|
async headBlock() {
|
|
5209
|
-
|
|
5285
|
+
const headBlock = await this.head();
|
|
5286
|
+
return headBlock[0];
|
|
5210
5287
|
}
|
|
5211
5288
|
async headHash() {
|
|
5212
|
-
|
|
5289
|
+
const headBlock = await this.headBlock();
|
|
5290
|
+
return headBlock._hash;
|
|
5213
5291
|
}
|
|
5214
5292
|
async headNumber() {
|
|
5215
|
-
|
|
5293
|
+
const headBlock = await this.headBlock();
|
|
5294
|
+
return headBlock.block;
|
|
5216
5295
|
}
|
|
5217
5296
|
getBlockContextRead() {
|
|
5218
5297
|
return {
|
|
@@ -5221,9 +5300,10 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
5221
5300
|
};
|
|
5222
5301
|
}
|
|
5223
5302
|
async getChainContextRead() {
|
|
5303
|
+
const headBlock = await this.head();
|
|
5224
5304
|
return {
|
|
5225
5305
|
...this.getBlockContextRead(),
|
|
5226
|
-
head:
|
|
5306
|
+
head: headBlock[0]
|
|
5227
5307
|
};
|
|
5228
5308
|
}
|
|
5229
5309
|
async getCurrentHead() {
|
|
@@ -5345,11 +5425,13 @@ var SimpleXyoGatewayRunner = class _SimpleXyoGatewayRunner extends AbstractCreat
|
|
|
5345
5425
|
BigIntToJsonZod.parse(amount)
|
|
5346
5426
|
])
|
|
5347
5427
|
);
|
|
5348
|
-
const
|
|
5428
|
+
const payloadBuilder = new PayloadBuilder20({ schema: TransferSchema3 });
|
|
5429
|
+
const transferBuilder = payloadBuilder.fields({
|
|
5349
5430
|
from,
|
|
5350
5431
|
transfers: hexTransfers,
|
|
5351
5432
|
epoch: Date.now()
|
|
5352
|
-
})
|
|
5433
|
+
});
|
|
5434
|
+
const transfer = transferBuilder.build();
|
|
5353
5435
|
const [hash] = await this.addPayloadsToChain([transfer], [], options);
|
|
5354
5436
|
return hash;
|
|
5355
5437
|
}
|
|
@@ -5470,10 +5552,11 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
|
|
|
5470
5552
|
const valid = blocks.map((b) => !!b);
|
|
5471
5553
|
const remainingBlockMap = [];
|
|
5472
5554
|
const remainingBlocks = blocks.map((b, i) => {
|
|
5473
|
-
if (b) {
|
|
5474
|
-
|
|
5475
|
-
return b;
|
|
5555
|
+
if (!b) {
|
|
5556
|
+
return;
|
|
5476
5557
|
}
|
|
5558
|
+
remainingBlockMap.push(i);
|
|
5559
|
+
return b;
|
|
5477
5560
|
}).filter(exists8);
|
|
5478
5561
|
assertEx40(
|
|
5479
5562
|
remainingBlockMap.length === remainingBlocks.length,
|
|
@@ -5492,7 +5575,7 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
|
|
|
5492
5575
|
valid[remainingBlockMap[i]] = validated;
|
|
5493
5576
|
}
|
|
5494
5577
|
const pruneHashes = bundles.map((p, i) => {
|
|
5495
|
-
if (
|
|
5578
|
+
if (valid.at(i) !== true) {
|
|
5496
5579
|
return p._hash;
|
|
5497
5580
|
}
|
|
5498
5581
|
}).filter(exists8);
|
|
@@ -5532,10 +5615,11 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
|
|
|
5532
5615
|
const valid = transactions.map((t) => !!t);
|
|
5533
5616
|
const remainingTransactionMap = [];
|
|
5534
5617
|
const remainingTransactions = transactions.map((t, i) => {
|
|
5535
|
-
if (t) {
|
|
5536
|
-
|
|
5537
|
-
return t;
|
|
5618
|
+
if (!t) {
|
|
5619
|
+
return;
|
|
5538
5620
|
}
|
|
5621
|
+
remainingTransactionMap.push(i);
|
|
5622
|
+
return t;
|
|
5539
5623
|
}).filter(exists8);
|
|
5540
5624
|
assertEx40(
|
|
5541
5625
|
remainingTransactionMap.length === remainingTransactions.length,
|
|
@@ -5555,7 +5639,7 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
|
|
|
5555
5639
|
valid[remainingTransactionMap[i]] = validated;
|
|
5556
5640
|
}
|
|
5557
5641
|
const pruneHashes = bundles.map((p, i) => {
|
|
5558
|
-
if (
|
|
5642
|
+
if (valid.at(i) !== true) {
|
|
5559
5643
|
return p._hash;
|
|
5560
5644
|
}
|
|
5561
5645
|
}).filter(exists8);
|
|
@@ -5860,7 +5944,8 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
|
|
|
5860
5944
|
cursor
|
|
5861
5945
|
});
|
|
5862
5946
|
const filteredBundles = bundles.filter(isPayloadBundle2).filter(isHashMeta2);
|
|
5863
|
-
|
|
5947
|
+
const hydratedBlocks = await Promise.all(filteredBundles.map(async (bundle3) => await bundledPayloadToHydratedBlock(bundle3)));
|
|
5948
|
+
return hydratedBlocks.filter(exists9);
|
|
5864
5949
|
}
|
|
5865
5950
|
async pendingTransactions({
|
|
5866
5951
|
cursor: providedCursor,
|
|
@@ -5881,12 +5966,7 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
|
|
|
5881
5966
|
});
|
|
5882
5967
|
this.logger?.debug(`Fetched pending transactions: ${bundles.length} bundles`);
|
|
5883
5968
|
const filteredBundles = bundles.filter(isPayloadBundle2).filter(isHashMeta2);
|
|
5884
|
-
const hydratedWithBundle =
|
|
5885
|
-
filteredBundles.map(async (bundle3) => {
|
|
5886
|
-
const tx = await bundledPayloadToHydratedTransaction(bundle3);
|
|
5887
|
-
return isDefined20(tx) ? { bundle: bundle3, tx } : void 0;
|
|
5888
|
-
})
|
|
5889
|
-
)).filter(exists9);
|
|
5969
|
+
const hydratedWithBundle = await this.hydratePendingBundles(filteredBundles);
|
|
5890
5970
|
const currentBlock = await this.windowedBlockViewer.currentBlock();
|
|
5891
5971
|
const currentBlockNumber = currentBlock[0].block;
|
|
5892
5972
|
const evaluated = await Promise.all(
|
|
@@ -5907,9 +5987,7 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
|
|
|
5907
5987
|
})
|
|
5908
5988
|
);
|
|
5909
5989
|
this.gcHandoutStats(currentBlockNumber);
|
|
5910
|
-
const inclusionCandidates =
|
|
5911
|
-
if (await this.isInclusionCandidate(tx, currentBlock, false)) return { bundle: bundle3, tx };
|
|
5912
|
-
}))).filter(exists9);
|
|
5990
|
+
const inclusionCandidates = await this.filterInclusionCandidates(validTransactions, currentBlock);
|
|
5913
5991
|
const selectionRatio = this.params.mempoolSelectionRatio ?? DEFAULT_MEMPOOL_SELECTION_RATIO;
|
|
5914
5992
|
const nonDemoted = inclusionCandidates.filter(({ bundle: bundle3 }) => !this.isDemoted(bundle3._hash));
|
|
5915
5993
|
const demoted = inclusionCandidates.filter(({ bundle: bundle3 }) => this.isDemoted(bundle3._hash));
|
|
@@ -5933,12 +6011,27 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
|
|
|
5933
6011
|
async deleteBundledTransaction(bundle3) {
|
|
5934
6012
|
await this.pendingTransactionsArchivist.delete([bundle3._hash]);
|
|
5935
6013
|
}
|
|
6014
|
+
async filterInclusionCandidates(validTransactions, currentBlock) {
|
|
6015
|
+
const inclusionResults = await Promise.all(validTransactions.map(async ({ bundle: bundle3, tx }) => {
|
|
6016
|
+
if (await this.isInclusionCandidate(tx, currentBlock, false)) return { bundle: bundle3, tx };
|
|
6017
|
+
}));
|
|
6018
|
+
return inclusionResults.filter(exists9);
|
|
6019
|
+
}
|
|
5936
6020
|
gcHandoutStats(currentBlockNumber) {
|
|
5937
6021
|
const ttl = this.handoutStatsTtlBlocks;
|
|
5938
6022
|
for (const [hash, stats] of this._handoutStats) {
|
|
5939
6023
|
if (currentBlockNumber - stats.firstHandoutAt > ttl) this._handoutStats.delete(hash);
|
|
5940
6024
|
}
|
|
5941
6025
|
}
|
|
6026
|
+
async hydratePendingBundles(filteredBundles) {
|
|
6027
|
+
const hydratedResults = await Promise.all(
|
|
6028
|
+
filteredBundles.map(async (bundle3) => {
|
|
6029
|
+
const tx = await bundledPayloadToHydratedTransaction(bundle3);
|
|
6030
|
+
return isDefined20(tx) ? { bundle: bundle3, tx } : void 0;
|
|
6031
|
+
})
|
|
6032
|
+
);
|
|
6033
|
+
return hydratedResults.filter(exists9);
|
|
6034
|
+
}
|
|
5942
6035
|
/**
|
|
5943
6036
|
* Evaluates a transaction to determine if it should be purged from the mempool.
|
|
5944
6037
|
* @param tx The transaction to evaluate
|
|
@@ -5996,7 +6089,7 @@ SimpleMempoolViewer = __decorateClass([
|
|
|
5996
6089
|
function deduplicateWithBundleBySigner(items) {
|
|
5997
6090
|
const seen = /* @__PURE__ */ new Set();
|
|
5998
6091
|
return items.filter(({ tx }) => {
|
|
5999
|
-
const key = tx[0].addresses.toSorted().join(",");
|
|
6092
|
+
const key = tx[0].addresses.toSorted((a, b) => a.localeCompare(b)).join(",");
|
|
6000
6093
|
if (seen.has(key)) return false;
|
|
6001
6094
|
seen.add(key);
|
|
6002
6095
|
return true;
|
|
@@ -6062,13 +6155,12 @@ var SimpleXyoNetwork = class {
|
|
|
6062
6155
|
const response = await fetchJsonGet(url);
|
|
6063
6156
|
if (isNetworkStatus(response.data)) {
|
|
6064
6157
|
return response.data;
|
|
6065
|
-
} else {
|
|
6066
|
-
if (response.status === 200) {
|
|
6067
|
-
this.logger?.error("Unknown network status response", response.data);
|
|
6068
|
-
return unknownStatus;
|
|
6069
|
-
}
|
|
6070
|
-
return errorStatus;
|
|
6071
6158
|
}
|
|
6159
|
+
if (response.status === 200) {
|
|
6160
|
+
this.logger?.error("Unknown network status response", response.data);
|
|
6161
|
+
return unknownStatus;
|
|
6162
|
+
}
|
|
6163
|
+
return errorStatus;
|
|
6072
6164
|
} catch (error) {
|
|
6073
6165
|
this.logger?.error("Error fetching network status", error);
|
|
6074
6166
|
return errorStatus;
|
|
@@ -6649,7 +6741,8 @@ var SimpleTimeSyncViewer = class extends AbstractCreatableProvider {
|
|
|
6649
6741
|
async currentTime(domain) {
|
|
6650
6742
|
switch (domain) {
|
|
6651
6743
|
case "xl1": {
|
|
6652
|
-
|
|
6744
|
+
const currentBlock = await this.blockViewer.currentBlock();
|
|
6745
|
+
return ["xl1", currentBlock?.[0].block ?? -1];
|
|
6653
6746
|
}
|
|
6654
6747
|
case "epoch": {
|
|
6655
6748
|
return ["epoch", Date.now()];
|
|
@@ -6761,13 +6854,18 @@ var SimpleTransactionValidationViewer = class extends AbstractCreatableProvider
|
|
|
6761
6854
|
head: void 0
|
|
6762
6855
|
};
|
|
6763
6856
|
const transactionsWithMeta = await Promise.all(transactions.map((b) => Promise.all([PayloadBuilder24.addHashMeta(b[0]), PayloadBuilder24.addHashMeta(b[1])])));
|
|
6764
|
-
|
|
6765
|
-
|
|
6766
|
-
|
|
6767
|
-
|
|
6768
|
-
|
|
6769
|
-
|
|
6770
|
-
|
|
6857
|
+
let head;
|
|
6858
|
+
if (isChainQualifiedHeadConfig6(config)) {
|
|
6859
|
+
const headBlockResult = await this.blockViewer.blockByHash(config.head);
|
|
6860
|
+
head = headBlockResult == null ? assertEx46(
|
|
6861
|
+
void 0,
|
|
6862
|
+
() => `Specified a head that is not in the chain [${config.head}]`
|
|
6863
|
+
) : headBlockResult[0];
|
|
6864
|
+
}
|
|
6865
|
+
const currentBlock = await this.blockViewer.currentBlock();
|
|
6866
|
+
const headBlock = head ?? currentBlock[0];
|
|
6867
|
+
const validateProtocol = value === true ? this.doValidateProtocol.bind(this) : void 0;
|
|
6868
|
+
const validateState = state === true ? this.doValidateState.bind(this) : void 0;
|
|
6771
6869
|
const chainId = headBlock.chain;
|
|
6772
6870
|
const qualification = { head: headBlock._hash, range: asXL1BlockRange13([0, headBlock.block], true) };
|
|
6773
6871
|
const [protocolResults, stateResults] = await Promise.all([
|
|
@@ -6790,10 +6888,12 @@ var SimpleTransactionValidationViewer = class extends AbstractCreatableProvider
|
|
|
6790
6888
|
throw new Error("Method not implemented.");
|
|
6791
6889
|
}
|
|
6792
6890
|
async validateTransaction(block, config) {
|
|
6793
|
-
|
|
6891
|
+
const results = await this.validateTransactions([block], config);
|
|
6892
|
+
return results[0];
|
|
6794
6893
|
}
|
|
6795
6894
|
async validateTransactions(transactions, config) {
|
|
6796
|
-
|
|
6895
|
+
const results = await this.qualifiedValidateTransactions(transactions, config);
|
|
6896
|
+
return results[0];
|
|
6797
6897
|
}
|
|
6798
6898
|
async doValidateProtocol(transactions, chainId) {
|
|
6799
6899
|
return await Promise.all(transactions.map(async (tx) => {
|
|
@@ -7091,8 +7191,8 @@ var LoggerStatusReporter = class {
|
|
|
7091
7191
|
}
|
|
7092
7192
|
report(name, status, progress) {
|
|
7093
7193
|
this.statusMap[name] = status;
|
|
7094
|
-
const starting = Object.
|
|
7095
|
-
const started = Object.
|
|
7194
|
+
const starting = Object.values(this.statusMap).map((value) => value === "starting" ? 1 : 0).reduce((a, b) => a + b, 0);
|
|
7195
|
+
const started = Object.values(this.statusMap).map((value) => value === "started" ? 1 : 0).reduce((a, b) => a + b, 0);
|
|
7096
7196
|
this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, { progress });
|
|
7097
7197
|
}
|
|
7098
7198
|
};
|
|
@@ -7253,6 +7353,26 @@ var isBuildNextBlockOptions = (value) => {
|
|
|
7253
7353
|
function calculateCompletedStepReward(step, balance) {
|
|
7254
7354
|
return AttoXL14(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1]);
|
|
7255
7355
|
}
|
|
7356
|
+
function buildStepHashes(blockNumber, inStepHashes, previousBlockHash, chainStepRewardAddress2, stepRewardPoolBalance) {
|
|
7357
|
+
const completedStepRewardTransfers = [];
|
|
7358
|
+
const step_hashes = [];
|
|
7359
|
+
for (const [i, step] of StepSizes14.entries()) {
|
|
7360
|
+
if (blockNumber < step) {
|
|
7361
|
+
break;
|
|
7362
|
+
}
|
|
7363
|
+
if (blockNumber % step === 0) {
|
|
7364
|
+
if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress2 !== XYO_ZERO_ADDRESS2) {
|
|
7365
|
+
const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
|
|
7366
|
+
const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
|
|
7367
|
+
completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress2, { [completedStepRewardHolderAddress]: completedStepReward }));
|
|
7368
|
+
}
|
|
7369
|
+
step_hashes.push(assertEx49(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
|
|
7370
|
+
} else if (isDefined23(inStepHashes.at(i))) {
|
|
7371
|
+
step_hashes.push(inStepHashes[i]);
|
|
7372
|
+
}
|
|
7373
|
+
}
|
|
7374
|
+
return { completedStepRewardTransfers, step_hashes };
|
|
7375
|
+
}
|
|
7256
7376
|
async function buildBlock(options) {
|
|
7257
7377
|
const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber;
|
|
7258
7378
|
const blockNumber = asXL1BlockNumber13(previousBlockNumber + 1, true);
|
|
@@ -7267,7 +7387,6 @@ async function buildBlock(options) {
|
|
|
7267
7387
|
protocol = XL1_PROTOCOL_VERSION,
|
|
7268
7388
|
signers
|
|
7269
7389
|
} = options;
|
|
7270
|
-
const step_hashes = [];
|
|
7271
7390
|
for (const [tx] of txs) {
|
|
7272
7391
|
if (tx.nbf > blockNumber) {
|
|
7273
7392
|
throw new Error(`Transaction ${await PayloadBuilder25.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`);
|
|
@@ -7276,24 +7395,13 @@ async function buildBlock(options) {
|
|
|
7276
7395
|
throw new Error(`Transaction ${await PayloadBuilder25.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`);
|
|
7277
7396
|
}
|
|
7278
7397
|
}
|
|
7279
|
-
const completedStepRewardTransfers =
|
|
7280
|
-
|
|
7281
|
-
|
|
7282
|
-
|
|
7283
|
-
|
|
7284
|
-
|
|
7285
|
-
|
|
7286
|
-
const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
|
|
7287
|
-
const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
|
|
7288
|
-
completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress2, { [completedStepRewardHolderAddress]: completedStepReward }));
|
|
7289
|
-
}
|
|
7290
|
-
step_hashes.push(assertEx49(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
|
|
7291
|
-
} else {
|
|
7292
|
-
if (isDefined23(inStepHashes.at(i))) {
|
|
7293
|
-
step_hashes.push(inStepHashes[i]);
|
|
7294
|
-
}
|
|
7295
|
-
}
|
|
7296
|
-
}
|
|
7398
|
+
const { step_hashes, completedStepRewardTransfers } = buildStepHashes(
|
|
7399
|
+
blockNumber,
|
|
7400
|
+
inStepHashes,
|
|
7401
|
+
previousBlockHash,
|
|
7402
|
+
chainStepRewardAddress2,
|
|
7403
|
+
stepRewardPoolBalance
|
|
7404
|
+
);
|
|
7297
7405
|
const previous = previousBlockHash ?? null;
|
|
7298
7406
|
const block = blockNumber;
|
|
7299
7407
|
const txElevatedPayloads = await validateTransactionsOpcodes(txs);
|
|
@@ -7303,13 +7411,15 @@ async function buildBlock(options) {
|
|
|
7303
7411
|
...txElevatedPayloads,
|
|
7304
7412
|
...completedStepRewardTransfers
|
|
7305
7413
|
];
|
|
7306
|
-
const
|
|
7414
|
+
const boundWitnessBuilder = new BoundWitnessBuilder3();
|
|
7415
|
+
const builder = boundWitnessBuilder.fields({
|
|
7307
7416
|
block,
|
|
7308
7417
|
chain: chainId,
|
|
7309
7418
|
previous,
|
|
7310
7419
|
step_hashes,
|
|
7311
7420
|
protocol
|
|
7312
|
-
}).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder25.addStorageMeta(payloads))
|
|
7421
|
+
}).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder25.addStorageMeta(payloads));
|
|
7422
|
+
const [bw, txPayloads] = await builder.build();
|
|
7313
7423
|
assertEx49(isBlockBoundWitness(bw), () => "Build of BlockBoundWitness failed");
|
|
7314
7424
|
return [await PayloadBuilder25.addStorageMeta(bw), txPayloads.map((p) => asAnyPayload5(p, true))];
|
|
7315
7425
|
}
|
|
@@ -7365,7 +7475,8 @@ var buildRandomTransaction = async (chain, payloads, account, nbf = asXL1BlockNu
|
|
|
7365
7475
|
const additionalPayloads = (payloads ?? []).filter((payload) => !isAllowedBlockPayload3(payload));
|
|
7366
7476
|
const sender = account ?? await Account2.random();
|
|
7367
7477
|
if (elevatedPayloads.length === 0) {
|
|
7368
|
-
const
|
|
7478
|
+
const defaultReceiver = await Account2.random();
|
|
7479
|
+
const receiver = receiverAddress ?? defaultReceiver.address;
|
|
7369
7480
|
const transferPayload = createTransferPayload(sender.address, { [receiver]: 1n });
|
|
7370
7481
|
elevatedPayloads.push(transferPayload);
|
|
7371
7482
|
}
|
|
@@ -7396,12 +7507,14 @@ import {
|
|
|
7396
7507
|
defaultTransactionFees as defaultTransactionFees4
|
|
7397
7508
|
} from "@xyo-network/xl1-protocol-lib";
|
|
7398
7509
|
async function createProducerChainStakeIntent(from, exp, nbf = 0) {
|
|
7399
|
-
|
|
7510
|
+
const payloadBuilder = new PayloadBuilder27({ schema: ChainStakeIntentSchema2 });
|
|
7511
|
+
const builder = payloadBuilder.fields({
|
|
7400
7512
|
from,
|
|
7401
7513
|
exp,
|
|
7402
7514
|
nbf,
|
|
7403
7515
|
intent: "producer"
|
|
7404
|
-
})
|
|
7516
|
+
});
|
|
7517
|
+
return await PayloadBuilder27.addHashMeta(builder.build());
|
|
7405
7518
|
}
|
|
7406
7519
|
|
|
7407
7520
|
// src/test/createGenesisBlock.ts
|
|
@@ -7445,13 +7558,20 @@ var buildRandomChain = async (blockProducer, count = 10, previousBlock, chainId,
|
|
|
7445
7558
|
remaining = remaining - 1;
|
|
7446
7559
|
lastBlock = block;
|
|
7447
7560
|
}
|
|
7448
|
-
const
|
|
7561
|
+
const defaultReceiver = await Account4.random();
|
|
7562
|
+
const resolvedReceiverAddresses = receiverAddresses ?? [defaultReceiver.address];
|
|
7449
7563
|
let saltCounter = 0;
|
|
7450
7564
|
while (remaining > 0) {
|
|
7451
7565
|
saltCounter += 1;
|
|
7452
|
-
const
|
|
7566
|
+
const idPayloadBuilder = new PayloadBuilder29({ schema: IdSchema2 });
|
|
7567
|
+
const idBuilder = idPayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
|
|
7568
|
+
const payloads = [idBuilder.build()];
|
|
7453
7569
|
saltCounter += 1;
|
|
7454
|
-
const additionalPrivatePayloads = remaining % 2 === 0 ?
|
|
7570
|
+
const additionalPrivatePayloads = remaining % 2 === 0 ? (() => {
|
|
7571
|
+
const privatePayloadBuilder = new PayloadBuilder29({ schema: asSchema9("network.xyo.private", true) });
|
|
7572
|
+
const privateBuilder = privatePayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
|
|
7573
|
+
return [privateBuilder.build()];
|
|
7574
|
+
})() : [];
|
|
7455
7575
|
const txs = [];
|
|
7456
7576
|
for (const receiverAddress of resolvedReceiverAddresses) {
|
|
7457
7577
|
txs.push(await buildRandomTransaction(
|