@xyo-network/chain-services 1.23.0 → 1.23.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/index.mjs +196 -234
- package/dist/neutral/index.mjs.map +7 -1
- package/package.json +11 -11
package/dist/neutral/index.mjs
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
5
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
6
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
7
|
+
if (decorator = decorators[i])
|
|
8
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
9
|
+
if (kind && result) __defProp(target, key, result);
|
|
10
|
+
return result;
|
|
11
|
+
};
|
|
12
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
3
13
|
|
|
4
14
|
// src/BlockReward/EvmBlockRewardViewer.ts
|
|
5
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
AbstractCreatable,
|
|
17
|
+
assertEx,
|
|
18
|
+
creatable,
|
|
19
|
+
toEthAddress
|
|
20
|
+
} from "@xylabs/sdk-js";
|
|
6
21
|
import { IXyoChainRewards__factory } from "@xyo-network/typechain";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
__name(_ts_decorate, "_ts_decorate");
|
|
15
|
-
var EvmBlockRewardViewer = class _EvmBlockRewardViewer extends AbstractCreatable {
|
|
16
|
-
static {
|
|
17
|
-
__name(this, "EvmBlockRewardViewer");
|
|
18
|
-
}
|
|
19
|
-
static defaultMoniker = BlockRewardViewerMoniker;
|
|
20
|
-
static monikers = [
|
|
21
|
-
BlockRewardViewerMoniker
|
|
22
|
-
];
|
|
23
|
-
moniker = _EvmBlockRewardViewer.defaultMoniker;
|
|
22
|
+
import {
|
|
23
|
+
asAttoXL1,
|
|
24
|
+
BlockRewardViewerMoniker
|
|
25
|
+
} from "@xyo-network/xl1-sdk";
|
|
26
|
+
var EvmBlockRewardViewer = class extends AbstractCreatable {
|
|
27
|
+
moniker = EvmBlockRewardViewer.defaultMoniker;
|
|
24
28
|
_contractAddress;
|
|
25
29
|
get chainContractViewer() {
|
|
26
30
|
return assertEx(this.params.chainContractViewer, () => "chainContractViewer is required");
|
|
@@ -41,22 +45,19 @@ var EvmBlockRewardViewer = class _EvmBlockRewardViewer extends AbstractCreatable
|
|
|
41
45
|
this._contractAddress = await this.chainContractViewer.rewardsContract();
|
|
42
46
|
} catch (ex) {
|
|
43
47
|
const error = ex;
|
|
44
|
-
throw new Error(`Failed to get rewards contract address: ${error.message}`, {
|
|
45
|
-
cause: ex
|
|
46
|
-
});
|
|
48
|
+
throw new Error(`Failed to get rewards contract address: ${error.message}`, { cause: ex });
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
};
|
|
50
|
-
EvmBlockRewardViewer
|
|
52
|
+
__publicField(EvmBlockRewardViewer, "defaultMoniker", BlockRewardViewerMoniker);
|
|
53
|
+
__publicField(EvmBlockRewardViewer, "monikers", [BlockRewardViewerMoniker]);
|
|
54
|
+
EvmBlockRewardViewer = __decorateClass([
|
|
51
55
|
creatable()
|
|
52
56
|
], EvmBlockRewardViewer);
|
|
53
57
|
|
|
54
58
|
// src/ChainValidator/XyoValidator.ts
|
|
55
59
|
import { AbstractCreatableProvider, BlockViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
56
60
|
var XyoValidator = class extends AbstractCreatableProvider {
|
|
57
|
-
static {
|
|
58
|
-
__name(this, "XyoValidator");
|
|
59
|
-
}
|
|
60
61
|
moniker = "Validator";
|
|
61
62
|
_blockViewer;
|
|
62
63
|
// get address() {
|
|
@@ -97,24 +98,12 @@ var XyoValidator = class extends AbstractCreatableProvider {
|
|
|
97
98
|
// src/Election/BaseElectionService.ts
|
|
98
99
|
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
99
100
|
import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
|
|
100
|
-
import {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
__name(_ts_decorate2, "_ts_decorate");
|
|
108
|
-
var BaseElectionService = class _BaseElectionService extends AbstractCreatableProvider2 {
|
|
109
|
-
static {
|
|
110
|
-
__name(this, "BaseElectionService");
|
|
111
|
-
}
|
|
112
|
-
static defaultMoniker = "Election";
|
|
113
|
-
static dependencies = [];
|
|
114
|
-
static monikers = [
|
|
115
|
-
"Election"
|
|
116
|
-
];
|
|
117
|
-
moniker = _BaseElectionService.defaultMoniker;
|
|
101
|
+
import {
|
|
102
|
+
AbstractCreatableProvider as AbstractCreatableProvider2,
|
|
103
|
+
creatableProvider
|
|
104
|
+
} from "@xyo-network/xl1-sdk";
|
|
105
|
+
var BaseElectionService = class extends AbstractCreatableProvider2 {
|
|
106
|
+
moniker = BaseElectionService.defaultMoniker;
|
|
118
107
|
get blockViewer() {
|
|
119
108
|
return assertEx2(this.params.blockViewer, () => "No block viewer");
|
|
120
109
|
}
|
|
@@ -139,32 +128,51 @@ var BaseElectionService = class _BaseElectionService extends AbstractCreatablePr
|
|
|
139
128
|
return creatorArray.slice(0, maxSize);
|
|
140
129
|
}
|
|
141
130
|
};
|
|
142
|
-
BaseElectionService
|
|
131
|
+
__publicField(BaseElectionService, "defaultMoniker", "Election");
|
|
132
|
+
__publicField(BaseElectionService, "dependencies", []);
|
|
133
|
+
__publicField(BaseElectionService, "monikers", ["Election"]);
|
|
134
|
+
BaseElectionService = __decorateClass([
|
|
143
135
|
creatableProvider()
|
|
144
136
|
], BaseElectionService);
|
|
145
137
|
|
|
146
138
|
// src/implementation/head/createBootstrapHead.ts
|
|
147
139
|
import { buildNextBlock, createGenesisBlock } from "@xyo-network/chain-protocol";
|
|
148
140
|
import { createDeclarationIntent } from "@xyo-network/xl1-sdk";
|
|
149
|
-
var createBootstrapHead =
|
|
141
|
+
var createBootstrapHead = async (account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress) => {
|
|
150
142
|
const chain = [];
|
|
151
143
|
const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress);
|
|
152
144
|
chain.push(genesisBlock);
|
|
153
|
-
const producerDeclarationPayload = createDeclarationIntent(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
145
|
+
const producerDeclarationPayload = createDeclarationIntent(
|
|
146
|
+
account.address,
|
|
147
|
+
"producer",
|
|
148
|
+
genesisBlock[0].block,
|
|
149
|
+
genesisBlock[0].block + 1e4
|
|
150
|
+
);
|
|
151
|
+
const producerDeclarationBlock = await buildNextBlock(
|
|
152
|
+
genesisBlock[0],
|
|
153
|
+
[],
|
|
154
|
+
[producerDeclarationPayload],
|
|
155
|
+
[account]
|
|
156
|
+
);
|
|
159
157
|
chain.push(producerDeclarationBlock);
|
|
160
158
|
return chain;
|
|
161
|
-
}
|
|
159
|
+
};
|
|
162
160
|
|
|
163
161
|
// src/implementation/processPendingBlocks.ts
|
|
164
162
|
import { assertEx as assertEx3, isDefined } from "@xylabs/sdk-js";
|
|
165
163
|
import { ChainHeadSelector } from "@xyo-network/chain-analyze";
|
|
166
164
|
import { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from "@xyo-network/xl1-sdk";
|
|
167
|
-
async function processPendingBlocks({
|
|
165
|
+
async function processPendingBlocks({
|
|
166
|
+
blockValidationViewer,
|
|
167
|
+
blockViewer,
|
|
168
|
+
context,
|
|
169
|
+
logger,
|
|
170
|
+
mempoolViewer,
|
|
171
|
+
finalizationRunner,
|
|
172
|
+
allowedProducers,
|
|
173
|
+
minCandidates,
|
|
174
|
+
deadLetterQueueRunner
|
|
175
|
+
}) {
|
|
168
176
|
const start = Date.now();
|
|
169
177
|
const currentBlock = await blockViewer.currentBlock();
|
|
170
178
|
const headSelector = new ChainHeadSelector({
|
|
@@ -172,9 +180,7 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
|
|
|
172
180
|
logger,
|
|
173
181
|
mempoolViewer,
|
|
174
182
|
blockViewer,
|
|
175
|
-
windowedFinalizedChain: [
|
|
176
|
-
currentBlock
|
|
177
|
-
],
|
|
183
|
+
windowedFinalizedChain: [currentBlock],
|
|
178
184
|
allowedProducers,
|
|
179
185
|
minCandidates
|
|
180
186
|
});
|
|
@@ -192,12 +198,7 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
|
|
|
192
198
|
const candidateBlocks = bestHeadChain.filter((b) => {
|
|
193
199
|
return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true;
|
|
194
200
|
});
|
|
195
|
-
const validationResults = await Promise.all(candidateBlocks.map((candidateBlock) => blockValidationViewer.validateBlocks([
|
|
196
|
-
candidateBlock
|
|
197
|
-
], {
|
|
198
|
-
value: true,
|
|
199
|
-
state: true
|
|
200
|
-
})));
|
|
201
|
+
const validationResults = await Promise.all(candidateBlocks.map((candidateBlock) => blockValidationViewer.validateBlocks([candidateBlock], { value: true, state: true })));
|
|
201
202
|
const blocksToFinalize = [];
|
|
202
203
|
for (const [i, block] of candidateBlocks.entries()) {
|
|
203
204
|
const result = validationResults[i][0];
|
|
@@ -210,12 +211,7 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
|
|
|
210
211
|
hash: block[0]._hash,
|
|
211
212
|
name: "BlockValidationError",
|
|
212
213
|
message: String(e.message ?? e)
|
|
213
|
-
})) : [
|
|
214
|
-
{
|
|
215
|
-
hash: block[0]._hash,
|
|
216
|
-
name: "BlockValidationError"
|
|
217
|
-
}
|
|
218
|
-
];
|
|
214
|
+
})) : [{ hash: block[0]._hash, name: "BlockValidationError" }];
|
|
219
215
|
await deadLetterQueueRunner.rejectBlock({
|
|
220
216
|
schema: BlockRejectionSchema,
|
|
221
217
|
block,
|
|
@@ -236,27 +232,15 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
|
|
|
236
232
|
logger?.info("No head found to validate", currentBlock?.[0]._hash);
|
|
237
233
|
}
|
|
238
234
|
}
|
|
239
|
-
__name(processPendingBlocks, "processPendingBlocks");
|
|
240
235
|
|
|
241
236
|
// src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts
|
|
242
|
-
import {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
__name(_ts_decorate3, "_ts_decorate");
|
|
250
|
-
var BaseNetworkStakeStepRewardService = class _BaseNetworkStakeStepRewardService extends AbstractCreatableProvider3 {
|
|
251
|
-
static {
|
|
252
|
-
__name(this, "BaseNetworkStakeStepRewardService");
|
|
253
|
-
}
|
|
254
|
-
static defaultMoniker = NetworkStakeStepRewardViewerMoniker;
|
|
255
|
-
static dependencies = [];
|
|
256
|
-
static monikers = [
|
|
257
|
-
NetworkStakeStepRewardViewerMoniker
|
|
258
|
-
];
|
|
259
|
-
moniker = _BaseNetworkStakeStepRewardService.defaultMoniker;
|
|
237
|
+
import {
|
|
238
|
+
AbstractCreatableProvider as AbstractCreatableProvider3,
|
|
239
|
+
creatableProvider as creatableProvider2,
|
|
240
|
+
NetworkStakeStepRewardViewerMoniker
|
|
241
|
+
} from "@xyo-network/xl1-sdk";
|
|
242
|
+
var BaseNetworkStakeStepRewardService = class extends AbstractCreatableProvider3 {
|
|
243
|
+
moniker = BaseNetworkStakeStepRewardService.defaultMoniker;
|
|
260
244
|
networkStakeStepRewardAddressHistory(_address) {
|
|
261
245
|
throw new Error("Method [networkStakeStepRewardAddressHistory] not implemented.");
|
|
262
246
|
}
|
|
@@ -312,28 +296,62 @@ var BaseNetworkStakeStepRewardService = class _BaseNetworkStakeStepRewardService
|
|
|
312
296
|
throw new Error("Method [networkStakeStepRewardsForStepLevel] not implemented.");
|
|
313
297
|
}
|
|
314
298
|
};
|
|
315
|
-
BaseNetworkStakeStepRewardService
|
|
299
|
+
__publicField(BaseNetworkStakeStepRewardService, "defaultMoniker", NetworkStakeStepRewardViewerMoniker);
|
|
300
|
+
__publicField(BaseNetworkStakeStepRewardService, "dependencies", []);
|
|
301
|
+
__publicField(BaseNetworkStakeStepRewardService, "monikers", [NetworkStakeStepRewardViewerMoniker]);
|
|
302
|
+
BaseNetworkStakeStepRewardService = __decorateClass([
|
|
316
303
|
creatableProvider2()
|
|
317
304
|
], BaseNetworkStakeStepRewardService);
|
|
318
305
|
|
|
319
306
|
// src/simple/block/runner/SimpleBlockRunner.ts
|
|
320
|
-
import {
|
|
307
|
+
import {
|
|
308
|
+
assertEx as assertEx5,
|
|
309
|
+
exists,
|
|
310
|
+
hexToBigInt,
|
|
311
|
+
isDefined as isDefined2
|
|
312
|
+
} from "@xylabs/sdk-js";
|
|
321
313
|
import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
|
|
322
314
|
import { buildNextBlock as buildNextBlock2 } from "@xyo-network/chain-protocol";
|
|
323
|
-
import {
|
|
324
|
-
|
|
315
|
+
import {
|
|
316
|
+
MemoryArchivist,
|
|
317
|
+
PayloadBuilder as PayloadBuilder2
|
|
318
|
+
} from "@xyo-network/sdk-js";
|
|
319
|
+
import {
|
|
320
|
+
AbstractCreatableProvider as AbstractCreatableProvider4,
|
|
321
|
+
AccountBalanceViewerMoniker,
|
|
322
|
+
asBlockBoundWitness,
|
|
323
|
+
AttoXL1,
|
|
324
|
+
BlockNumberSchema,
|
|
325
|
+
BlockRejectionSchema as BlockRejectionSchema2,
|
|
326
|
+
BlockRewardViewerMoniker as BlockRewardViewerMoniker2,
|
|
327
|
+
BlockRunnerMoniker,
|
|
328
|
+
BlockValidationViewerMoniker,
|
|
329
|
+
creatableProvider as creatableProvider3,
|
|
330
|
+
createDeclarationIntent as createDeclarationIntent2,
|
|
331
|
+
DeadLetterQueueRunnerMoniker,
|
|
332
|
+
defaultRewardRatio,
|
|
333
|
+
FinalizationViewerMoniker,
|
|
334
|
+
isSignedHydratedBlockWithHashMeta as isSignedHydratedBlockWithHashMeta2,
|
|
335
|
+
MempoolRunnerMoniker,
|
|
336
|
+
MempoolViewerMoniker,
|
|
337
|
+
TimeSyncViewerMoniker,
|
|
338
|
+
TransactionRejectionSchema,
|
|
339
|
+
XYO_STEP_REWARD_ADDRESS
|
|
340
|
+
} from "@xyo-network/xl1-sdk";
|
|
325
341
|
|
|
326
342
|
// src/simple/block/runner/generateTransactionFeeTransfers.ts
|
|
327
343
|
import { hexFromBigInt } from "@xylabs/sdk-js";
|
|
328
344
|
import { assertEx as assertEx4 } from "@xylabs/sdk-js";
|
|
329
345
|
import { PayloadBuilder } from "@xyo-network/sdk-js";
|
|
330
|
-
import {
|
|
346
|
+
import {
|
|
347
|
+
HydratedTransactionWrapper,
|
|
348
|
+
transactionRequiredGas,
|
|
349
|
+
TransferSchema,
|
|
350
|
+
XYO_ZERO_ADDRESS
|
|
351
|
+
} from "@xyo-network/xl1-sdk";
|
|
331
352
|
async function generateTransactionFeeTransfers(address, transactions) {
|
|
332
353
|
const txs = await Promise.all(transactions.map(async (tx) => {
|
|
333
|
-
return HydratedTransactionWrapper.parse([
|
|
334
|
-
await PayloadBuilder.addStorageMeta(tx[0]),
|
|
335
|
-
await PayloadBuilder.addStorageMeta(tx[1])
|
|
336
|
-
]);
|
|
354
|
+
return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])]);
|
|
337
355
|
}));
|
|
338
356
|
const txBaseFeeCosts = {};
|
|
339
357
|
for (const tx of txs) {
|
|
@@ -363,27 +381,24 @@ async function generateTransactionFeeTransfers(address, transactions) {
|
|
|
363
381
|
}
|
|
364
382
|
return payloads;
|
|
365
383
|
}
|
|
366
|
-
__name(generateTransactionFeeTransfers, "generateTransactionFeeTransfers");
|
|
367
384
|
|
|
368
385
|
// src/simple/block/runner/identifyOffendingTransactions.ts
|
|
369
|
-
import {
|
|
386
|
+
import {
|
|
387
|
+
HydratedTransactionWrapper as HydratedTransactionWrapper2,
|
|
388
|
+
netBalancesForPayloads,
|
|
389
|
+
transactionRequiredGas as transactionRequiredGas2
|
|
390
|
+
} from "@xyo-network/xl1-sdk";
|
|
370
391
|
async function scoreTransaction(tx) {
|
|
371
392
|
const wrapper = await HydratedTransactionWrapper2.parse(tx);
|
|
372
393
|
const from = wrapper.boundWitness.from;
|
|
373
394
|
const gasPrice = wrapper.fees.gasPrice;
|
|
374
395
|
const gasCost = transactionRequiredGas2(tx) * gasPrice;
|
|
375
396
|
const baseCost = wrapper.fees.base;
|
|
376
|
-
const netBalances = netBalancesForPayloads({
|
|
377
|
-
singletons: {}
|
|
378
|
-
}, tx[1]);
|
|
397
|
+
const netBalances = netBalancesForPayloads({ singletons: {} }, tx[1]);
|
|
379
398
|
const fromNet = netBalances[from] ?? 0n;
|
|
380
399
|
const transferOut = fromNet < 0n ? -fromNet : 0n;
|
|
381
|
-
return {
|
|
382
|
-
cost: gasCost + baseCost + transferOut,
|
|
383
|
-
gasPrice
|
|
384
|
-
};
|
|
400
|
+
return { cost: gasCost + baseCost + transferOut, gasPrice };
|
|
385
401
|
}
|
|
386
|
-
__name(scoreTransaction, "scoreTransaction");
|
|
387
402
|
async function identifyOffendingTransactions(args) {
|
|
388
403
|
const { errors, candidateTransactions } = args;
|
|
389
404
|
const candidateHashes = new Set(candidateTransactions.map((tx) => tx[0]._hash));
|
|
@@ -394,12 +409,7 @@ async function identifyOffendingTransactions(args) {
|
|
|
394
409
|
if (cause?.hash && candidateHashes.has(cause.hash)) txInvalidHashes.add(cause.hash);
|
|
395
410
|
}
|
|
396
411
|
if (txInvalidHashes.size > 0) {
|
|
397
|
-
return {
|
|
398
|
-
offendingHashes: [
|
|
399
|
-
...txInvalidHashes
|
|
400
|
-
],
|
|
401
|
-
reason: "tx-invalid"
|
|
402
|
-
};
|
|
412
|
+
return { offendingHashes: [...txInvalidHashes], reason: "tx-invalid" };
|
|
403
413
|
}
|
|
404
414
|
const balanceOffenderHashes = /* @__PURE__ */ new Set();
|
|
405
415
|
for (const error of errors) {
|
|
@@ -409,59 +419,24 @@ async function identifyOffendingTransactions(args) {
|
|
|
409
419
|
}
|
|
410
420
|
}
|
|
411
421
|
if (balanceOffenderHashes.size === 0) {
|
|
412
|
-
return {
|
|
413
|
-
offendingHashes: [],
|
|
414
|
-
reason: "unknown"
|
|
415
|
-
};
|
|
422
|
+
return { offendingHashes: [], reason: "unknown" };
|
|
416
423
|
}
|
|
417
424
|
const offenders = candidateTransactions.filter((tx) => balanceOffenderHashes.has(tx[0]._hash));
|
|
418
|
-
const scored = await Promise.all(offenders.map(async (tx) => ({
|
|
419
|
-
tx,
|
|
420
|
-
...await scoreTransaction(tx)
|
|
421
|
-
})));
|
|
425
|
+
const scored = await Promise.all(offenders.map(async (tx) => ({ tx, ...await scoreTransaction(tx) })));
|
|
422
426
|
scored.sort((a, b) => {
|
|
423
427
|
if (a.cost !== b.cost) return a.cost < b.cost ? 1 : -1;
|
|
424
428
|
if (a.gasPrice !== b.gasPrice) return a.gasPrice < b.gasPrice ? -1 : 1;
|
|
425
429
|
return a.tx[0]._hash < b.tx[0]._hash ? -1 : 1;
|
|
426
430
|
});
|
|
427
|
-
return {
|
|
428
|
-
offendingHashes: [
|
|
429
|
-
scored[0].tx[0]._hash
|
|
430
|
-
],
|
|
431
|
-
reason: "block-balance"
|
|
432
|
-
};
|
|
431
|
+
return { offendingHashes: [scored[0].tx[0]._hash], reason: "block-balance" };
|
|
433
432
|
}
|
|
434
|
-
__name(identifyOffendingTransactions, "identifyOffendingTransactions");
|
|
435
433
|
|
|
436
434
|
// src/simple/block/runner/SimpleBlockRunner.ts
|
|
437
|
-
function _ts_decorate4(decorators, target, key, desc) {
|
|
438
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
439
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
440
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
441
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
442
|
-
}
|
|
443
|
-
__name(_ts_decorate4, "_ts_decorate");
|
|
444
435
|
var DEFAULT_BLOCK_SIZE = 10;
|
|
445
436
|
var XYO_PRODUCER_REDECLARATION_DURATION = 100;
|
|
446
437
|
var XYO_PRODUCER_REDECLARATION_WINDOW = 100;
|
|
447
|
-
var SimpleBlockRunner = class
|
|
448
|
-
|
|
449
|
-
__name(this, "SimpleBlockRunner");
|
|
450
|
-
}
|
|
451
|
-
static defaultMoniker = BlockRunnerMoniker;
|
|
452
|
-
static dependencies = [
|
|
453
|
-
AccountBalanceViewerMoniker,
|
|
454
|
-
BlockRewardViewerMoniker2,
|
|
455
|
-
BlockValidationViewerMoniker,
|
|
456
|
-
FinalizationViewerMoniker,
|
|
457
|
-
MempoolRunnerMoniker,
|
|
458
|
-
MempoolViewerMoniker,
|
|
459
|
-
TimeSyncViewerMoniker
|
|
460
|
-
];
|
|
461
|
-
static monikers = [
|
|
462
|
-
BlockRunnerMoniker
|
|
463
|
-
];
|
|
464
|
-
moniker = _SimpleBlockRunner.defaultMoniker;
|
|
438
|
+
var SimpleBlockRunner = class extends AbstractCreatableProvider4 {
|
|
439
|
+
moniker = SimpleBlockRunner.defaultMoniker;
|
|
465
440
|
_blockRewardDiviner;
|
|
466
441
|
_deadLetterQueueRunner;
|
|
467
442
|
// TODO(producer-exclusion-set): uncapped for v1. If memory grows in long-running producers,
|
|
@@ -480,22 +455,22 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
480
455
|
_rewardAddress;
|
|
481
456
|
_timeSyncViewer;
|
|
482
457
|
/**
|
|
483
|
-
|
|
484
|
-
|
|
458
|
+
* The default block size for a block
|
|
459
|
+
*/
|
|
485
460
|
static get DefaultBlockSize() {
|
|
486
461
|
return DEFAULT_BLOCK_SIZE;
|
|
487
462
|
}
|
|
488
463
|
/**
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
464
|
+
* The amount of time for which the producer will redeclare
|
|
465
|
+
* their intent to continue producing blocks
|
|
466
|
+
*/
|
|
492
467
|
static get RedeclarationDuration() {
|
|
493
468
|
return XYO_PRODUCER_REDECLARATION_DURATION;
|
|
494
469
|
}
|
|
495
470
|
/**
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
471
|
+
* The number of blocks within which the producer will redeclare
|
|
472
|
+
* their intent to continue producing blocks
|
|
473
|
+
*/
|
|
499
474
|
static get RedeclarationWindow() {
|
|
500
475
|
return XYO_PRODUCER_REDECLARATION_WINDOW;
|
|
501
476
|
}
|
|
@@ -577,30 +552,24 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
577
552
|
}
|
|
578
553
|
});
|
|
579
554
|
}
|
|
580
|
-
const blockId = new PayloadBuilder2({
|
|
581
|
-
|
|
582
|
-
}).fields({
|
|
583
|
-
block
|
|
584
|
-
}).build();
|
|
585
|
-
const rewards = await this._blockRewardDiviner.divine([
|
|
586
|
-
blockId
|
|
587
|
-
]);
|
|
555
|
+
const blockId = new PayloadBuilder2({ schema: BlockNumberSchema }).fields({ block }).build();
|
|
556
|
+
const rewards = await this._blockRewardDiviner.divine([blockId]);
|
|
588
557
|
return rewards;
|
|
589
558
|
}
|
|
590
559
|
/**
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
560
|
+
* Handles the producer redeclaration logic
|
|
561
|
+
* @param head The current head block
|
|
562
|
+
* @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
|
|
563
|
+
*/
|
|
595
564
|
getProducerRedeclaration(head) {
|
|
596
565
|
if (this.params.disableIntentRedeclaration) return;
|
|
597
566
|
const currentBlock = head.block;
|
|
598
567
|
if (isDefined2(this._lastRedeclarationBlock)) {
|
|
599
|
-
const lastDeclarationExpiry = this._lastRedeclarationBlock +
|
|
568
|
+
const lastDeclarationExpiry = this._lastRedeclarationBlock + SimpleBlockRunner.RedeclarationDuration;
|
|
600
569
|
if (currentBlock < lastDeclarationExpiry) return;
|
|
601
570
|
}
|
|
602
571
|
this._lastRedeclarationBlock = currentBlock;
|
|
603
|
-
return createDeclarationIntent2(this.address, "producer", currentBlock, currentBlock +
|
|
572
|
+
return createDeclarationIntent2(this.address, "producer", currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration);
|
|
604
573
|
}
|
|
605
574
|
async proposeNextValidBlock(head, validateBalances = false, force = false) {
|
|
606
575
|
return await this.spanAsync("proposeNextValidBlock", async () => {
|
|
@@ -608,9 +577,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
608
577
|
const { block: previousBlock } = assertEx5(asBlockBoundWitness(head), () => "Invalid head block");
|
|
609
578
|
const nextBlock = previousBlock + 1;
|
|
610
579
|
const chainId = await this.finalizationViewer.chainId();
|
|
611
|
-
const pendingTransactionsRaw = await this.mempoolViewer.pendingTransactions({
|
|
612
|
-
limit: _SimpleBlockRunner.DefaultBlockSize
|
|
613
|
-
});
|
|
580
|
+
const pendingTransactionsRaw = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize });
|
|
614
581
|
const pendingTransactions = pendingTransactionsRaw.filter((tx) => !this._excludedTransactionHashes.has(tx[0]._hash));
|
|
615
582
|
const nextBlockTransactions = await this.rejectWrongChainTransactions(pendingTransactions, chainId);
|
|
616
583
|
this.logger?.log(`Pending Tx Count ${nextBlockTransactions.length}`);
|
|
@@ -628,9 +595,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
628
595
|
this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
|
|
629
596
|
}
|
|
630
597
|
const [initialFundedTransactions, initialFundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
|
|
631
|
-
const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([
|
|
632
|
-
XYO_STEP_REWARD_ADDRESS
|
|
633
|
-
]))[XYO_STEP_REWARD_ADDRESS];
|
|
598
|
+
const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS];
|
|
634
599
|
const result = await this.runBuildValidateRetryLoop({
|
|
635
600
|
head,
|
|
636
601
|
chainId,
|
|
@@ -641,9 +606,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
641
606
|
initialFundedTransfers
|
|
642
607
|
});
|
|
643
608
|
if (isSignedHydratedBlockWithHashMeta2(result.block)) {
|
|
644
|
-
await this.mempoolRunner.submitBlocks([
|
|
645
|
-
result.block
|
|
646
|
-
]);
|
|
609
|
+
await this.mempoolRunner.submitBlocks([result.block]);
|
|
647
610
|
return result.block;
|
|
648
611
|
}
|
|
649
612
|
if (result.block) await this.rejectExhaustedBlock(result.block, result.errors);
|
|
@@ -661,9 +624,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
661
624
|
if (!transfer) return;
|
|
662
625
|
const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? "00"), 0n);
|
|
663
626
|
if (validateBalances) {
|
|
664
|
-
const balance = (await this.accountBalanceViewer.accountBalances([
|
|
665
|
-
transfer.from
|
|
666
|
-
]))[transfer.from] ?? AttoXL1(0n);
|
|
627
|
+
const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n);
|
|
667
628
|
if (balance >= totalTransferCost) {
|
|
668
629
|
fundedTransfers.push(transfer);
|
|
669
630
|
return tx;
|
|
@@ -673,19 +634,16 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
673
634
|
return tx;
|
|
674
635
|
}
|
|
675
636
|
}))).filter(exists);
|
|
676
|
-
return [
|
|
677
|
-
fundedTransactions,
|
|
678
|
-
fundedTransfers
|
|
679
|
-
];
|
|
637
|
+
return [fundedTransactions, fundedTransfers];
|
|
680
638
|
}
|
|
681
639
|
async generateTimePayload() {
|
|
682
640
|
return await this.timeSyncViewer.currentTimePayload();
|
|
683
641
|
}
|
|
684
642
|
/**
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
643
|
+
* Check if a heartbeat block is required based on network activity.
|
|
644
|
+
* @param head The current head block
|
|
645
|
+
* @returns True if a heartbeat is required, false otherwise
|
|
646
|
+
*/
|
|
689
647
|
heartbeatRequired(head) {
|
|
690
648
|
const epoch = head.$epoch;
|
|
691
649
|
if (isDefined2(epoch) && Date.now() - epoch > this.heartbeatInterval) {
|
|
@@ -729,50 +687,51 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
729
687
|
await (dlq ? Promise.all(mismatched.map((tx) => dlq.rejectTransaction({
|
|
730
688
|
schema: TransactionRejectionSchema,
|
|
731
689
|
transaction: tx,
|
|
732
|
-
errors: [
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
}
|
|
738
|
-
],
|
|
690
|
+
errors: [{
|
|
691
|
+
hash: tx[0]._hash,
|
|
692
|
+
name: "TransactionChainMismatch",
|
|
693
|
+
message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`
|
|
694
|
+
}],
|
|
739
695
|
rejector: "producer"
|
|
740
696
|
}))) : this.rejectedTransactionsArchivist.insert(mismatched.map((tx) => tx[0])));
|
|
741
697
|
}
|
|
742
698
|
return matched;
|
|
743
699
|
}
|
|
744
700
|
async runBuildValidateRetryLoop(args) {
|
|
745
|
-
const {
|
|
701
|
+
const {
|
|
702
|
+
chainId,
|
|
703
|
+
head,
|
|
704
|
+
initialFundedTransactions,
|
|
705
|
+
initialFundedTransfers,
|
|
706
|
+
nonTxPayloads,
|
|
707
|
+
stepRewardPoolBalance,
|
|
708
|
+
timePayload
|
|
709
|
+
} = args;
|
|
746
710
|
const maxAttempts = Math.max(1, initialFundedTransactions.length);
|
|
747
711
|
let candidateTransactions = initialFundedTransactions;
|
|
748
712
|
let candidateTransfers = initialFundedTransfers;
|
|
749
713
|
let lastBlock;
|
|
750
714
|
let lastErrors = [];
|
|
751
715
|
for (let attempt = 0; attempt <= maxAttempts; attempt++) {
|
|
752
|
-
const blockPayloads = [
|
|
753
|
-
...nonTxPayloads,
|
|
754
|
-
...candidateTransfers,
|
|
755
|
-
timePayload
|
|
756
|
-
];
|
|
716
|
+
const blockPayloads = [...nonTxPayloads, ...candidateTransfers, timePayload];
|
|
757
717
|
this.logger?.info(`Building block ${head.block + 1}${attempt > 0 ? ` (retry ${attempt})` : ""}`);
|
|
758
|
-
lastBlock = await buildNextBlock2(
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
718
|
+
lastBlock = await buildNextBlock2(
|
|
719
|
+
head,
|
|
720
|
+
candidateTransactions,
|
|
721
|
+
blockPayloads,
|
|
722
|
+
[this.account],
|
|
723
|
+
XYO_STEP_REWARD_ADDRESS,
|
|
724
|
+
stepRewardPoolBalance,
|
|
725
|
+
void 0,
|
|
726
|
+
chainId
|
|
727
|
+
);
|
|
728
|
+
const validated = await this.blockValidationViewer.validateBlock(lastBlock, { head: head._hash });
|
|
764
729
|
if (isSignedHydratedBlockWithHashMeta2(validated)) {
|
|
765
|
-
return {
|
|
766
|
-
block: validated,
|
|
767
|
-
errors: []
|
|
768
|
-
};
|
|
730
|
+
return { block: validated, errors: [] };
|
|
769
731
|
}
|
|
770
732
|
lastErrors = validated;
|
|
771
733
|
if (attempt === maxAttempts) break;
|
|
772
|
-
const { offendingHashes, reason } = await identifyOffendingTransactions({
|
|
773
|
-
candidateTransactions,
|
|
774
|
-
errors: validated
|
|
775
|
-
});
|
|
734
|
+
const { offendingHashes, reason } = await identifyOffendingTransactions({ candidateTransactions, errors: validated });
|
|
776
735
|
if (offendingHashes.length === 0 || reason === "unknown") break;
|
|
777
736
|
for (const offendingHash of offendingHashes) this._excludedTransactionHashes.add(offendingHash);
|
|
778
737
|
const offendingSet = new Set(offendingHashes);
|
|
@@ -781,26 +740,29 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
781
740
|
candidateTransfers = (await generateTransactionFeeTransfers(this.address, candidateTransactions)).filter((t) => remainingFromAddresses.has(t.from));
|
|
782
741
|
this.logger?.warn(`Block validation failed (attempt ${attempt + 1}); excluded ${offendingHashes.length} tx(s), retrying`);
|
|
783
742
|
}
|
|
784
|
-
return {
|
|
785
|
-
block: lastBlock,
|
|
786
|
-
errors: lastErrors
|
|
787
|
-
};
|
|
743
|
+
return { block: lastBlock, errors: lastErrors };
|
|
788
744
|
}
|
|
789
745
|
};
|
|
790
|
-
SimpleBlockRunner
|
|
746
|
+
__publicField(SimpleBlockRunner, "defaultMoniker", BlockRunnerMoniker);
|
|
747
|
+
__publicField(SimpleBlockRunner, "dependencies", [
|
|
748
|
+
AccountBalanceViewerMoniker,
|
|
749
|
+
BlockRewardViewerMoniker2,
|
|
750
|
+
BlockValidationViewerMoniker,
|
|
751
|
+
FinalizationViewerMoniker,
|
|
752
|
+
MempoolRunnerMoniker,
|
|
753
|
+
MempoolViewerMoniker,
|
|
754
|
+
TimeSyncViewerMoniker
|
|
755
|
+
]);
|
|
756
|
+
__publicField(SimpleBlockRunner, "monikers", [BlockRunnerMoniker]);
|
|
757
|
+
SimpleBlockRunner = __decorateClass([
|
|
791
758
|
creatableProvider3()
|
|
792
759
|
], SimpleBlockRunner);
|
|
793
760
|
|
|
794
761
|
// src/StepStake/BaseStepStakeService.ts
|
|
795
762
|
import { AbstractCreatableProvider as AbstractCreatableProvider5, StepStakeViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
796
763
|
var AbstractStepStakeService = class _AbstractStepStakeService extends AbstractCreatableProvider5 {
|
|
797
|
-
static {
|
|
798
|
-
__name(this, "AbstractStepStakeService");
|
|
799
|
-
}
|
|
800
764
|
static defaultMoniker = StepStakeViewerMoniker;
|
|
801
|
-
static monikers = [
|
|
802
|
-
StepStakeViewerMoniker
|
|
803
|
-
];
|
|
765
|
+
static monikers = [StepStakeViewerMoniker];
|
|
804
766
|
moniker = _AbstractStepStakeService.defaultMoniker;
|
|
805
767
|
stepStake(_step) {
|
|
806
768
|
throw new Error("Method [stepStake] not implemented.");
|
|
@@ -822,4 +784,4 @@ export {
|
|
|
822
784
|
createBootstrapHead,
|
|
823
785
|
processPendingBlocks
|
|
824
786
|
};
|
|
825
|
-
//# sourceMappingURL=index.mjs.map
|
|
787
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/implementation/processPendingBlocks.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/simple/block/runner/identifyOffendingTransactions.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import type { CreatableParams } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable,\n assertEx, creatable, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport type {\n AttoXL1, BlockRewardViewer,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n asAttoXL1,\n BlockRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = IXyoChainRewards__factory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`, { cause: ex })\n }\n }\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer, HydratedBlockStateValidationFunction,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, BlockViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\nimport type { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends AbstractCreatableProvider<TParams> implements Validator {\n moniker = 'Validator'\n private _blockViewer?: BlockViewer\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n","import type { Address, Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport type { WithHashMeta } from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider,\n type BlockBoundWitness,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableProvider()\nexport class BaseElectionService extends AbstractCreatableProvider<BaseElectionServicesParams> implements ElectionService {\n static readonly defaultMoniker = 'Election'\n static readonly dependencies = []\n static readonly monikers = ['Election']\n moniker = BaseElectionService.defaultMoniker\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n }, this.context)\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { buildNextBlock, createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { createDeclarationIntent } from '@xyo-network/xl1-sdk'\n\nexport const createBootstrapHead = async (\n account: AccountInstance,\n chainId: ChainId,\n genesisBlockRewardAmount: AttoXL1,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import type { Address, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { ChainHeadSelector } from '@xyo-network/chain-analyze'\nimport type {\n BaseContext, BlockValidationViewer, BlockViewer, DeadLetterQueueRunner, FinalizationRunner, MempoolViewer,\n} from '@xyo-network/xl1-sdk'\nimport { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\n// type FinalizedBlockAttributes = { producer: Address }\n\ninterface ProcessPendingBlocksParams {\n allowedProducers?: Address[]\n blockValidationViewer: BlockValidationViewer\n blockViewer: BlockViewer\n context: BaseContext\n deadLetterQueueRunner?: DeadLetterQueueRunner\n finalizationRunner: FinalizationRunner\n logger?: Logger\n mempoolViewer: MempoolViewer\n minCandidates?: number\n}\n\n// eslint-disable-next-line complexity\nexport async function processPendingBlocks({\n blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner,\n}: ProcessPendingBlocksParams) {\n const start = Date.now()\n\n const currentBlock = await blockViewer.currentBlock()\n\n const headSelector = new ChainHeadSelector({\n context, logger, mempoolViewer, blockViewer, windowedFinalizedChain: [currentBlock], allowedProducers, minCandidates,\n })\n\n // Use the head selector to find the best head or fallback to the starting head\n const bestHeadChain = await headSelector.findBestHead()\n\n // If we found a head\n if (isDefined(bestHeadChain) && bestHeadChain.length > 0) {\n const oldHeadBlock = currentBlock[0]\n const newHydratedHeadBlock = assertEx(bestHeadChain.at(-1), () => 'Missing best head block [processPendingBlocks]')\n const newHeadBlock = newHydratedHeadBlock[0]\n // let finalizedBlocksAttributes: FinalizedBlockAttributes[] = []\n\n // Synchronize the best head with the outArchivist all the way\n // back to the last finalized block\n\n logger?.debug('Validating new HeadBlock head from (block) ', oldHeadBlock?.block, 'to', newHeadBlock.block)\n logger?.debug('Validating new HeadBlock head from (hash) ', oldHeadBlock?._hash, 'to', newHeadBlock._hash)\n\n if (newHeadBlock._hash === oldHeadBlock?._hash) {\n logger?.debug('No new blocks found', oldHeadBlock?.block, 'to', newHeadBlock.block)\n return\n }\n\n // Store the items to be committed in the correct order\n const candidateBlocks = bestHeadChain.filter((b) => {\n return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true\n })\n\n // Validate candidate blocks before finalizing\n const validationResults = await Promise.all(candidateBlocks.map(candidateBlock => blockValidationViewer.validateBlocks([candidateBlock], { value: true, state: true })))\n const blocksToFinalize: typeof candidateBlocks = []\n for (const [i, block] of candidateBlocks.entries()) {\n const result = validationResults[i][0]\n if (isSignedHydratedBlockWithHashMeta(result)) {\n blocksToFinalize.push(block)\n } else {\n logger?.error('Block validation failed', block[0].block, block[0]._hash, JSON.stringify(result, null, 2))\n if (deadLetterQueueRunner) {\n const errors = Array.isArray(result)\n ? result.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n : [{ hash: block[0]._hash, name: 'BlockValidationError' }]\n await deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors, rejector: 'validator',\n })\n }\n }\n }\n\n logger?.info('Validated new HeadBlock head from (block) in', `${Date.now() - start}ms`, newHeadBlock.block, 'to', oldHeadBlock?.block)\n logger?.info('Validated new HeadBlock head from (hash) in', `${Date.now() - start}ms`, newHeadBlock._hash, 'to', oldHeadBlock?._hash)\n\n if (blocksToFinalize.length > 0) {\n await finalizationRunner.finalizeBlocks(blocksToFinalize)\n }\n\n // Prevent us from rechecking the same head\n await headSelector.finalizeChainFragment(blocksToFinalize)\n\n // this._startingHead = newHydratedHeadBlock\n\n // Return the finalized payloads\n return blocksToFinalize\n } else {\n // If no head was found, return an empty array\n logger?.info('No head found to validate', currentBlock?.[0]._hash)\n }\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1,\n NetworkStakeStepRewardService,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider,\n creatableProvider, NetworkStakeStepRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n ethProvider?: Provider\n}\n\n@creatableProvider()\nexport class BaseNetworkStakeStepRewardService extends\n AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n override moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [AttoXL1, AttoXL1]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n","import type {\n Address, Hash, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, exists, hexToBigInt, isDefined,\n} from '@xylabs/sdk-js'\nimport type { BlockRewardDiviner } from '@xyo-network/chain-modules'\nimport { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport type {\n AccountInstance,\n ArchivistInstance, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AccountBalanceViewer, AllowedBlockPayload, BlockBoundWitness,\n BlockNumberPayload, BlockRewardViewer, BlockRunner, BlockValidationViewer, ChainId, ChainStakeIntent, CreatableProviderParams,\n DeadLetterQueueRunner,\n FinalizationViewer,\n HydratedBlockStateValidationFunction, HydratedBlockValidationError, MempoolRunner, MempoolViewer,\n SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransactionWithHashMeta,\n TimePayload, TimeSyncViewer, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1,\n BlockNumberSchema, BlockRejectionSchema, BlockRewardViewerMoniker, BlockRunnerMoniker,\n BlockValidationViewerMoniker, creatableProvider, createDeclarationIntent, DeadLetterQueueRunnerMoniker, defaultRewardRatio,\n FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker,\n TransactionRejectionSchema, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\nimport { identifyOffendingTransactions } from './identifyOffendingTransactions.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 100\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 100\n\nexport interface SimpleBlockRunnerParams extends CreatableProviderParams {\n account: AccountInstance\n disableIntentRedeclaration?: boolean\n heartbeatInterval?: number\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatableProvider()\nexport class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {\n static readonly defaultMoniker = BlockRunnerMoniker\n static readonly dependencies = [\n AccountBalanceViewerMoniker,\n BlockRewardViewerMoniker,\n BlockValidationViewerMoniker,\n FinalizationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n TimeSyncViewerMoniker,\n ]\n\n static readonly monikers = [BlockRunnerMoniker]\n moniker = SimpleBlockRunner.defaultMoniker\n\n protected _blockRewardDiviner?: BlockRewardDiviner\n protected _deadLetterQueueRunner?: DeadLetterQueueRunner\n // TODO(producer-exclusion-set): uncapped for v1. If memory grows in long-running producers,\n // add FIFO eviction or a TTL keyed off block number.\n protected _excludedTransactionHashes = new Set<Hash>()\n protected _lastRedeclarationBlock?: number\n protected _rejectedTransactionsArchivist?: ArchivistInstance\n\n private _account?: AccountInstance\n private _accountBalanceViewer?: AccountBalanceViewer\n private _address?: Address\n private _blockRewardViewer?: BlockRewardViewer\n private _blockValidationViewer?: BlockValidationViewer\n private _finalizationViewer?: FinalizationViewer\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _rewardAddress?: Address\n private _timeSyncViewer?: TimeSyncViewer\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n protected get account() {\n return this._account!\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get address() {\n return this._address!\n }\n\n protected get blockRewardViewer() {\n return this._blockRewardViewer!\n }\n\n protected get blockValidationViewer() {\n return this._blockValidationViewer!\n }\n\n protected get finalizationViewer() {\n return this._finalizationViewer!\n }\n\n protected get heartbeatInterval() {\n return this.params.heartbeatInterval ?? 3_600_000\n }\n\n protected get mempoolRunner() {\n return this._mempoolRunner!\n }\n\n protected get mempoolViewer() {\n return this._mempoolViewer!\n }\n\n // protected get pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return this._rewardAddress!\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get timeSyncViewer(): TimeSyncViewer {\n return this._timeSyncViewer!\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n override async createHandler() {\n this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? (await MemoryArchivist.create())\n this._account = assertEx(this.params.account, () => 'Account is required')\n this._address = this.account.address\n this._accountBalanceViewer = await this.locateAndCreate<AccountBalanceViewer>(AccountBalanceViewerMoniker)\n this._blockRewardViewer = await this.locateAndCreate<BlockRewardViewer>(BlockRewardViewerMoniker)\n this._blockValidationViewer = await this.locator.getInstance<BlockValidationViewer>(BlockValidationViewerMoniker)\n this._finalizationViewer = await this.locateAndCreate<FinalizationViewer>(FinalizationViewerMoniker)\n this._mempoolRunner = await this.locateAndCreate<MempoolRunner>(MempoolRunnerMoniker)\n this._mempoolViewer = await this.locateAndCreate<MempoolViewer>(MempoolViewerMoniker)\n this._rewardAddress = this.params.rewardAddress\n this._timeSyncViewer = await this.locateAndCreate<TimeSyncViewer>(TimeSyncViewerMoniker)\n this._deadLetterQueueRunner = await this.locator.tryGetInstance<DeadLetterQueueRunner>(DeadLetterQueueRunnerMoniker)\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n // if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n if (this.params.disableIntentRedeclaration) return\n const currentBlock = head.block\n // Only redeclare when the previous declaration has expired\n if (isDefined(this._lastRedeclarationBlock)) {\n const lastDeclarationExpiry = this._lastRedeclarationBlock + SimpleBlockRunner.RedeclarationDuration\n if (currentBlock < lastDeclarationExpiry) return\n }\n this._lastRedeclarationBlock = currentBlock\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n try {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const chainId = await this.finalizationViewer.chainId()\n const pendingTransactionsRaw = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n const pendingTransactions = pendingTransactionsRaw.filter(tx => !this._excludedTransactionHashes.has(tx[0]._hash))\n const nextBlockTransactions = await this.rejectWrongChainTransactions(pendingTransactions, chainId)\n\n this.logger?.log(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const nonTxPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) nonTxPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n nonTxPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload()\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [initialFundedTransactions, initialFundedTransfers]\n = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n\n const result = await this.runBuildValidateRetryLoop({\n head,\n chainId,\n stepRewardPoolBalance,\n nonTxPayloads,\n timePayload,\n initialFundedTransactions,\n initialFundedTransfers,\n })\n if (isSignedHydratedBlockWithHashMeta(result.block)) {\n await this.mempoolRunner.submitBlocks([result.block])\n return result.block\n }\n if (result.block) await this.rejectExhaustedBlock(result.block, result.errors)\n } catch (error) {\n this.logger?.error(`Error proposing next valid block: ${(error as Error).message}`)\n throw error\n }\n }, this.context)\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransactionWithHashMeta[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransactionWithHashMeta[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload() {\n return await this.timeSyncViewer.currentTimePayload()\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch) && Date.now() - epoch > this.heartbeatInterval) {\n return true\n }\n return false\n }\n\n private async rejectExhaustedBlock(\n block: SignedHydratedBlockWithHashMeta,\n errors: HydratedBlockValidationError[],\n ): Promise<void> {\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n if (this._deadLetterQueueRunner) {\n const rejectionErrors = errors.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n await this._deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors: rejectionErrors, rejector: 'producer',\n })\n } else {\n await this.rejectedTransactionsArchivist.insert(block[1])\n }\n }\n\n // Partition pending transactions by chain-ID match; route mismatches to the transaction DLQ.\n private async rejectWrongChainTransactions(\n transactions: SignedHydratedTransactionWithHashMeta[],\n chainId: ChainId,\n ): Promise<SignedHydratedTransactionWithHashMeta[]> {\n const localChain = chainId.toLowerCase()\n const matched: SignedHydratedTransactionWithHashMeta[] = []\n const mismatched: SignedHydratedTransactionWithHashMeta[] = []\n for (const tx of transactions) {\n if (tx[0].chain.toLowerCase() === localChain) {\n matched.push(tx)\n } else {\n mismatched.push(tx)\n }\n }\n if (mismatched.length > 0) {\n this.logger?.warn(`Rejecting ${mismatched.length} transaction(s) targeting non-local chain`)\n const dlq = this._deadLetterQueueRunner\n await (dlq\n ? Promise.all(mismatched.map(tx => dlq.rejectTransaction({\n schema: TransactionRejectionSchema,\n transaction: tx,\n errors: [{\n hash: tx[0]._hash,\n name: 'TransactionChainMismatch',\n message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`,\n }],\n rejector: 'producer',\n })))\n : this.rejectedTransactionsArchivist.insert(mismatched.map(tx => tx[0])))\n }\n return matched\n }\n\n private async runBuildValidateRetryLoop(args: {\n chainId: ChainId\n head: WithHashMeta<BlockBoundWitness>\n initialFundedTransactions: SignedHydratedTransactionWithHashMeta[]\n initialFundedTransfers: Transfer[]\n nonTxPayloads: AllowedBlockPayload[]\n stepRewardPoolBalance: AttoXL1\n timePayload: TimePayload\n }): Promise<{\n block: SignedHydratedBlockWithHashMeta | undefined\n errors: HydratedBlockValidationError[]\n }> {\n const {\n chainId, head, initialFundedTransactions, initialFundedTransfers,\n nonTxPayloads, stepRewardPoolBalance, timePayload,\n } = args\n const maxAttempts = Math.max(1, initialFundedTransactions.length)\n let candidateTransactions = initialFundedTransactions\n let candidateTransfers = initialFundedTransfers\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined\n let lastErrors: HydratedBlockValidationError[] = []\n\n for (let attempt = 0; attempt <= maxAttempts; attempt++) {\n const blockPayloads = [...nonTxPayloads, ...candidateTransfers, timePayload]\n this.logger?.info(`Building block ${head.block + 1}${attempt > 0 ? ` (retry ${attempt})` : ''}`)\n lastBlock = await buildNextBlock(\n head,\n candidateTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n chainId,\n )\n const validated = await this.blockValidationViewer.validateBlock(lastBlock, { head: head._hash })\n if (isSignedHydratedBlockWithHashMeta(validated)) {\n return { block: validated, errors: [] }\n }\n lastErrors = validated\n if (attempt === maxAttempts) break\n const { offendingHashes, reason } = await identifyOffendingTransactions({ candidateTransactions, errors: validated })\n if (offendingHashes.length === 0 || reason === 'unknown') break\n for (const offendingHash of offendingHashes) this._excludedTransactionHashes.add(offendingHash)\n const offendingSet = new Set<Hash>(offendingHashes)\n candidateTransactions = candidateTransactions.filter(tx => !offendingSet.has(tx[0]._hash))\n const remainingFromAddresses = new Set<Address>(candidateTransactions.map(tx => tx[0].from))\n candidateTransfers = (await generateTransactionFeeTransfers(this.address, candidateTransactions))\n .filter(t => remainingFromAddresses.has(t.from))\n this.logger?.warn(`Block validation failed (attempt ${attempt + 1}); excluded ${offendingHashes.length} tx(s), retrying`)\n }\n return { block: lastBlock, errors: lastErrors }\n }\n}\n","import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { HydratedBlockValidationError, SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n netBalancesForPayloads,\n transactionRequiredGas,\n} from '@xyo-network/xl1-sdk'\n\nexport type OffendingTxReason = 'block-balance' | 'tx-invalid' | 'unknown'\n\nexport interface OffendingTxResult {\n offendingHashes: Hash[]\n reason: OffendingTxReason\n}\n\ninterface TxScore {\n cost: bigint\n gasPrice: bigint\n}\n\nasync function scoreTransaction(tx: SignedHydratedTransactionWithHashMeta): Promise<TxScore> {\n const wrapper = await HydratedTransactionWrapper.parse(tx)\n const from = wrapper.boundWitness.from\n const gasPrice = wrapper.fees.gasPrice\n const gasCost = transactionRequiredGas(tx) * gasPrice\n const baseCost = wrapper.fees.base\n const netBalances = netBalancesForPayloads({ singletons: {} }, tx[1])\n const fromNet = netBalances[from] ?? 0n\n const transferOut = fromNet < 0n ? -fromNet : 0n\n return { cost: gasCost + baseCost + transferOut, gasPrice }\n}\n\nexport async function identifyOffendingTransactions(args: {\n candidateTransactions: SignedHydratedTransactionWithHashMeta[]\n errors: HydratedBlockValidationError[]\n}): Promise<OffendingTxResult> {\n const { errors, candidateTransactions } = args\n const candidateHashes = new Set<Hash>(candidateTransactions.map(tx => tx[0]._hash))\n\n const txInvalidHashes = new Set<Hash>()\n for (const error of errors) {\n if (candidateHashes.has(error.hash)) txInvalidHashes.add(error.hash)\n const cause = error.cause as { hash?: Hash } | undefined\n if (cause?.hash && candidateHashes.has(cause.hash)) txInvalidHashes.add(cause.hash)\n }\n if (txInvalidHashes.size > 0) {\n return { offendingHashes: [...txInvalidHashes], reason: 'tx-invalid' }\n }\n\n const balanceOffenderHashes = new Set<Hash>()\n for (const error of errors) {\n const offendingHashes = (error as { offendingTransactionHashes?: Hash[] }).offendingTransactionHashes ?? []\n for (const hash of offendingHashes) {\n if (candidateHashes.has(hash)) balanceOffenderHashes.add(hash)\n }\n }\n if (balanceOffenderHashes.size === 0) {\n return { offendingHashes: [], reason: 'unknown' }\n }\n\n const offenders = candidateTransactions.filter(tx => balanceOffenderHashes.has(tx[0]._hash))\n const scored = await Promise.all(offenders.map(async tx => ({ tx, ...(await scoreTransaction(tx)) })))\n scored.sort((a, b) => {\n if (a.cost !== b.cost) return a.cost < b.cost ? 1 : -1\n if (a.gasPrice !== b.gasPrice) return a.gasPrice < b.gasPrice ? -1 : 1\n return a.tx[0]._hash < b.tx[0]._hash ? -1 : 1\n })\n return { offendingHashes: [scored[0].tx[0]._hash], reason: 'block-balance' }\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type { StepIdentity, StepStakeViewer } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, StepStakeViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\nexport abstract class AbstractStepStakeService extends AbstractCreatableProvider<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n override moniker = AbstractStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],"mappings":";;;;AACA,SACEA,mBACAC,UAAUC,WAAWC,oBAChB;AACP,SAASC,iCAAiC;AAM1C,SACEC,WACAC,gCACK;;;;;;;;AASA,IAAMC,uBAAN,MAAMA,8BAA6BC,kBAAAA;SAAAA;;;EACxC,OAAgBC,iBAAiBC;EACjC,OAAgBC,WAAW;IAACD;;EAC5BE,UAAUL,sBAAqBE;EAErBI;EAEV,IAAcC,sBAAsB;AAClC,WAAOC,SAAS,KAAKC,OAAOF,qBAAqB,MAAM,iCAAA;EACzD;EAEA,IAAcG,kBAAkB;AAC9B,WAAOF,SAAS,KAAKF,kBAAkB,MAAM,6BAAA;EAC/C;EAEA,IAAcK,WAAW;AACvB,WAAOH,SAAS,KAAKC,OAAOE,UAAU,MAAM,sBAAA;EAC9C;EAEA,MAAMC,sBAAsBC,aAA+C;AACzE,UAAMC,WAAWC,0BAA0BC,QAAQC,aAAa,KAAKP,eAAe,GAAG,KAAKC,QAAQ;AACpG,WAAOO,UAAU,MAAMJ,SAASK,gBAAgBN,WAAAA,CAAAA;EAClD;EAEA,MAAeO,gBAAgB;AAC7B,UAAM,MAAMA,cAAAA;AACZ,QAAI;AACF,WAAKd,mBAAmB,MAAM,KAAKC,oBAAoBc,gBAAe;IACxE,SAASC,IAAI;AACX,YAAMC,QAAQD;AACd,YAAM,IAAIE,MAAM,2CAA2CD,MAAME,OAAO,IAAI;QAAEC,OAAOJ;MAAG,CAAA;IAC1F;EACF;AACF;;;;;;AClDA,SAASK,2BAA2BC,0BAA0B;AAgBvD,IAAMC,eAAN,cAAoFC,0BAAAA;EAhB3F,OAgB2FA;;;EACzFC,UAAU;EACFC;;;;;;;EASR,IAAcC,cAAc;AAC1B,WAAO,KAAKD;EACd;;;;;;;;;;;;;EAkBA,MAAeE,gBAAgB;AAC7B,SAAKF,eAAe,MAAM,KAAKG,QAAQC,YAAYC,kBAAAA;EACrD;EAEAC,qBAAqBC,QAAgD;AACnE,WAAO,CAAA;EACT;;EAGA,MAAMC,2BAA2BC,qBAAiF;AAChH,UAAM,CAACC,EAAAA,IAAMD;AAEb,QAAK,MAAM,KAAKR,YAAYU,YAAYD,GAAGE,KAAK,MAAOC,OAAW,QAAO;AAGzE,WAAO,MAAMC,QAAQC,QAAQ,IAAA;EAC/B;AACF;;;ACrEA,SAASC,YAAAA,iBAAgB;AACzB,SAASC,oBAAoBC,uBAAuB;AAEpD,SACEC,6BAAAA,4BAGuBC,yBAElB;;;;;;;;AAWA,IAAMC,sBAAN,MAAMA,6BAA4BC,2BAAAA;SAAAA;;;EACvC,OAAgBC,iBAAiB;EACjC,OAAgBC,eAAe,CAAA;EAC/B,OAAgBC,WAAW;IAAC;;EAC5BC,UAAUL,qBAAoBE;EAC9B,IAAII,cAAc;AAChB,WAAOC,UAAS,KAAKC,OAAOF,aAAa,MAAM,iBAAA;EACjD;EAEA,IAAIG,mBAAmB;AACrB,WAAOF,UAAS,KAAKC,OAAOC,kBAAkB,MAAM,uBAAA;EACtD;EAEA,IAAIC,qBAAqB;AACvB,WAAOH,UAAS,KAAKC,OAAOE,oBAAoB,MAAM,0BAAA;EACxD;EAEA,MAAMC,gCAAgCC,SAA8D;AAClG,WAAO,MAAM,KAAKC,UAAU,mCAAmC,YAAA;AAC7D,YAAMC,YAAYF,QAAQG,QAAQ;AAClC,YAAMC,aAAa,MAAM,KAAKN,mBAAmBO,8BAA8BH,WAAW,UAAA;AAC1F,YAAMI,oBAAoBN,QAAQO;AAClC,aAAO,KAAKC,yBAAyBJ,YAAYE,iBAAAA;IACnD,GAAG,KAAKG,OAAO;EACjB;EAEUD,yBAAyBJ,YAAuBE,mBAAyBI,UAAU,GAAc;AACzG,UAAMC,WAAW,IAAIC,IAAaR,UAAAA;AAClC,UAAMS,OAAOC,mBAAmBR,iBAAAA;AAChC,UAAMS,eAAeC,gBAAgBL,UAAUE,IAAAA;AAC/C,WAAOE,aAAaE,MAAM,GAAGP,OAAAA;EAC/B;AACF;;;;;;ACpDA,SAASQ,gBAAgBC,0BAA0B;AAKnD,SAASC,+BAA+B;AAEjC,IAAMC,sBAAsB,8BACjCC,SACAC,SACAC,0BACAC,8BAAAA;AAEA,QAAMC,QAA2C,CAAA;AAGjD,QAAMC,eAAe,MAAMC,mBAAmBN,SAASC,SAASC,0BAA0BC,yBAAAA;AAC1FC,QAAMG,KAAKF,YAAAA;AAGX,QAAMG,6BAA6BC,wBACjCT,QAAQU,SACR,YACAL,aAAa,CAAA,EAAGM,OAChBN,aAAa,CAAA,EAAGM,QAAQ,GAAA;AAE1B,QAAMC,2BAA2B,MAAMC,eACrCR,aAAa,CAAA,GACb,CAAA,GACA;IAACG;KACD;IAACR;GAAQ;AAEXI,QAAMG,KAAKK,wBAAAA;AACX,SAAOR;AACT,GA3BmC;;;ACPnC,SAASU,YAAAA,WAAUC,iBAAiB;AACpC,SAASC,yBAAyB;AAIlC,SAASC,sBAAsBC,yCAAyC;AAiBxE,eAAsBC,qBAAqB,EACzCC,uBAAuBC,aAAaC,SAASC,QAAQC,eAAeC,oBAAoBC,kBAAkBC,eAAeC,sBAAqB,GACnH;AAC3B,QAAMC,QAAQC,KAAKC,IAAG;AAEtB,QAAMC,eAAe,MAAMX,YAAYW,aAAY;AAEnD,QAAMC,eAAe,IAAIC,kBAAkB;IACzCZ;IAASC;IAAQC;IAAeH;IAAac,wBAAwB;MAACH;;IAAeN;IAAkBC;EACzG,CAAA;AAGA,QAAMS,gBAAgB,MAAMH,aAAaI,aAAY;AAGrD,MAAIC,UAAUF,aAAAA,KAAkBA,cAAcG,SAAS,GAAG;AACxD,UAAMC,eAAeR,aAAa,CAAA;AAClC,UAAMS,uBAAuBC,UAASN,cAAcO,GAAG,EAAC,GAAI,MAAM,gDAAA;AAClE,UAAMC,eAAeH,qBAAqB,CAAA;AAM1ClB,YAAQsB,MAAM,+CAA+CL,cAAcM,OAAO,MAAMF,aAAaE,KAAK;AAC1GvB,YAAQsB,MAAM,8CAA8CL,cAAcO,OAAO,MAAMH,aAAaG,KAAK;AAEzG,QAAIH,aAAaG,UAAUP,cAAcO,OAAO;AAC9CxB,cAAQsB,MAAM,uBAAuBL,cAAcM,OAAO,MAAMF,aAAaE,KAAK;AAClF;IACF;AAGA,UAAME,kBAAkBZ,cAAca,OAAO,CAACC,MAAAA;AAC5C,aAAOZ,UAAUE,YAAAA,IAAgBU,EAAE,CAAA,EAAGJ,QAAQN,aAAaM,QAAQ;IACrE,CAAA;AAGA,UAAMK,oBAAoB,MAAMC,QAAQC,IAAIL,gBAAgBM,IAAIC,CAAAA,mBAAkBnC,sBAAsBoC,eAAe;MAACD;OAAiB;MAAEE,OAAO;MAAMC,OAAO;IAAK,CAAA,CAAA,CAAA;AACpK,UAAMC,mBAA2C,CAAA;AACjD,eAAW,CAACC,GAAGd,KAAAA,KAAUE,gBAAgBa,QAAO,GAAI;AAClD,YAAMC,SAASX,kBAAkBS,CAAAA,EAAG,CAAA;AACpC,UAAIG,kCAAkCD,MAAAA,GAAS;AAC7CH,yBAAiBK,KAAKlB,KAAAA;MACxB,OAAO;AACLvB,gBAAQ0C,MAAM,2BAA2BnB,MAAM,CAAA,EAAGA,OAAOA,MAAM,CAAA,EAAGC,OAAOmB,KAAKC,UAAUL,QAAQ,MAAM,CAAA,CAAA;AACtG,YAAIlC,uBAAuB;AACzB,gBAAMwC,SAASC,MAAMC,QAAQR,MAAAA,IACzBA,OAAOR,IAAIiB,CAAAA,OAAM;YACfC,MAAM1B,MAAM,CAAA,EAAGC;YAAO0B,MAAM;YAAwBC,SAASC,OAAOJ,EAAEG,WAAWH,CAAAA;UACnF,EAAA,IACA;YAAC;cAAEC,MAAM1B,MAAM,CAAA,EAAGC;cAAO0B,MAAM;YAAuB;;AAC1D,gBAAM7C,sBAAsBgD,YAAY;YACtCC,QAAQC;YAAsBhC;YAAOsB;YAAQW,UAAU;UACzD,CAAA;QACF;MACF;IACF;AAEAxD,YAAQyD,KAAK,gDAAgD,GAAGlD,KAAKC,IAAG,IAAKF,KAAAA,MAAWe,aAAaE,OAAO,MAAMN,cAAcM,KAAAA;AAChIvB,YAAQyD,KAAK,+CAA+C,GAAGlD,KAAKC,IAAG,IAAKF,KAAAA,MAAWe,aAAaG,OAAO,MAAMP,cAAcO,KAAAA;AAE/H,QAAIY,iBAAiBpB,SAAS,GAAG;AAC/B,YAAMd,mBAAmBwD,eAAetB,gBAAAA;IAC1C;AAGA,UAAM1B,aAAaiD,sBAAsBvB,gBAAAA;AAKzC,WAAOA;EACT,OAAO;AAELpC,YAAQyD,KAAK,6BAA6BhD,eAAe,CAAA,EAAGe,KAAAA;EAC9D;AACF;AA7EsB5B;;;ACftB,SACEgE,6BAAAA,4BACAC,qBAAAA,oBAAmBC,2CACd;;;;;;;;AAWA,IAAMC,oCAAN,MAAMA,2CACXC,2BAAAA;SAAAA;;;EACA,OAAgBC,iBAAiBC;EACjC,OAAgBC,eAAe,CAAA;EAC/B,OAAgBC,WAAW;IAACF;;EACnBG,UAAUN,mCAAkCE;EAErDK,qCAAqCC,UAAyD;AAC5F,UAAM,IAAIC,MAAM,gEAAA;EAClB;EAEAC,oCAAoCC,UAAwBH,UAAyD;AACnH,UAAM,IAAIC,MAAM,+DAAA;EAClB;EAEAG,mCAAmCD,UAAwBH,UAAiD;AAC1G,UAAM,IAAIC,MAAM,8DAAA;EAClB;EAEAI,uCAAuCL,UAAwC;AAC7E,UAAM,IAAIC,MAAM,kEAAA;EAClB;EAEAK,kCAAkCC,WAAmBC,QAA0D;AAC7G,UAAM,IAAIP,MAAM,6DAAA;EAClB;EAEAQ,8BAA8BN,UAA6C;AACzE,UAAM,IAAIF,MAAM,yDAAA;EAClB;EAEAS,yCAAyCP,UAAwBI,WAAmD;AAClH,UAAM,IAAIN,MAAM,oEAAA;EAClB;EAEAU,kCAAkCR,UAA8D;AAC9F,UAAM,IAAIF,MAAM,6DAAA;EAClB;EAEAW,iCAAiCT,UAA6D;AAC5F,UAAM,IAAIF,MAAM,4DAAA;EAClB;EAEAY,qCAAqCV,UAAwBI,WAAuC;AAClG,UAAM,IAAIN,MAAM,gEAAA;EAClB;EAEAa,4CAA4CX,UAAwBI,WAAwC;AAC1G,UAAM,IAAIN,MAAM,uEAAA;EAClB;EAEAc,iCAAiCZ,UAA6C;AAC5E,UAAM,IAAIF,MAAM,4DAAA;EAClB;EAEAe,kCAAkCb,UAA4C;AAC5E,UAAM,IAAIF,MAAM,6DAAA;EAClB;EAEAgB,yCAAyCjB,UAAwC;AAC/E,UAAM,IAAIC,MAAM,oEAAA;EAClB;EAEAiB,uCAAuCf,UAAwBH,UAAuC;AACpG,UAAM,IAAIC,MAAM,kEAAA;EAClB;EAEAkB,mCAAmCZ,WAAmBC,QAAsF;AAC1I,UAAM,IAAIP,MAAM,8DAAA;EAClB;EAEAmB,gCAAgCZ,QAA+C;AAC7E,UAAM,IAAIP,MAAM,2DAAA;EAClB;EAEAoB,oCAAoCC,YAAoBd,QAA+C;AACrG,UAAM,IAAIP,MAAM,+DAAA;EAClB;AACF;;;;;;ACjGA,SACEsB,YAAAA,WAAUC,QAAQC,aAAaC,aAAAA,kBAC1B;AAEP,SAASC,mCAAmCC,qDAAqD;AACjG,SAASC,kBAAAA,uBAAsB;AAK/B,SACEC,iBACAC,kBAAAA,uBACK;AAWP,SACEC,6BAAAA,4BAA2BC,6BAA6BC,qBAAqBC,SAC7EC,mBAAmBC,wBAAAA,uBAAsBC,4BAAAA,2BAA0BC,oBACnEC,8BAA8BC,qBAAAA,oBAAmBC,2BAAAA,0BAAyBC,8BAA8BC,oBACxGC,2BAA2BC,qCAAAA,oCAAmCC,sBAAsBC,sBAAsBC,uBAC1GC,4BAA4BC,+BACvB;;;ACjCP,SAAuBC,qBAAqB;AAC5C,SAASC,YAAAA,iBAAgB;AACzB,SAASC,sBAAsB;AAM/B,SACEC,4BACAC,wBAAwBC,gBAAgBC,wBACnC;AAEP,eAAsBC,gCAAgCC,SAAkBC,cAAyC;AAC/G,QAAMC,MAAM,MAAMC,QAAQC,IAAIH,aAAaI,IAAI,OAAOC,OAAAA;AACpD,WAAOC,2BAA2BC,MAAM;MAAC,MAAMC,eAAeC,eAAeJ,GAAG,CAAA,CAAE;MAAG,MAAMG,eAAeC,eAAeJ,GAAG,CAAA,CAAE;KAAE;EAClI,CAAA,CAAA;AAGA,QAAMK,iBAA0C,CAAC;AACjD,aAAWL,MAAMJ,KAAK;AACpBS,mBAAeL,GAAGM,aAAaC,IAAI,KAAKF,eAAeL,GAAGM,aAAaC,IAAI,KAAK,MAC5EP,GAAGQ,KAAKC;EACd;AAEA,QAAMC,aAAsC,CAAC;AAC7C,aAAWV,MAAMJ,KAAK;AACpB,UAAMe,cAAcC,uBAAuBZ,GAAGa,IAAI;AAClD,UAAMC,eAAeH,cAAcX,GAAGQ,KAAKO;AAC3CL,eAAWV,GAAGM,aAAaC,IAAI,KAAKF,eAAeL,GAAGM,aAAaC,IAAI,KAAK,MACxEO;EACN;AAGA,QAAME,WAAYC,OAAOC,QAAQb,cAAAA,EAAqCN,IAAI,CAAC,CAACQ,MAAMY,MAAAA,MAAO;AACvF,UAAMC,UAAoB;MACxBC,QAAQC;MACRC,OAAOC,KAAKC,IAAG;MACflB;MACAmB,WAAW;;QAET,CAACC,gBAAAA,GAAmBC,cAAcT,MAAAA;MACpC;IACF;AACA,WAAOC;EACT,CAAA;AAGA,aAAW,CAACb,MAAMY,MAAAA,KAAWF,OAAOC,QAAQR,UAAAA,GAAa;AAEvD,UAAMmB,cAAcC,UAASd,SAASe,KAAKC,CAAAA,MAAKA,EAAEzB,SAASA,IAAAA,GAAO,MAAM,wBAAA;AACxEsB,gBAAYH,UAAUhC,OAAAA,IAAWkC,cAAcT,MAAAA;EACjD;AAEA,SAAOH;AACT;AA1CsBvB;;;ACXtB,SACEwC,8BAAAA,6BACAC,wBACAC,0BAAAA,+BACK;AAcP,eAAeC,iBAAiBC,IAAyC;AACvE,QAAMC,UAAU,MAAMC,4BAA2BC,MAAMH,EAAAA;AACvD,QAAMI,OAAOH,QAAQI,aAAaD;AAClC,QAAME,WAAWL,QAAQM,KAAKD;AAC9B,QAAME,UAAUC,wBAAuBT,EAAAA,IAAMM;AAC7C,QAAMI,WAAWT,QAAQM,KAAKI;AAC9B,QAAMC,cAAcC,uBAAuB;IAAEC,YAAY,CAAC;EAAE,GAAGd,GAAG,CAAA,CAAE;AACpE,QAAMe,UAAUH,YAAYR,IAAAA,KAAS;AACrC,QAAMY,cAAcD,UAAU,KAAK,CAACA,UAAU;AAC9C,SAAO;IAAEE,MAAMT,UAAUE,WAAWM;IAAaV;EAAS;AAC5D;AAVeP;AAYf,eAAsBmB,8BAA8BC,MAGnD;AACC,QAAM,EAAEC,QAAQC,sBAAqB,IAAKF;AAC1C,QAAMG,kBAAkB,IAAIC,IAAUF,sBAAsBG,IAAIxB,CAAAA,OAAMA,GAAG,CAAA,EAAGyB,KAAK,CAAA;AAEjF,QAAMC,kBAAkB,oBAAIH,IAAAA;AAC5B,aAAWI,SAASP,QAAQ;AAC1B,QAAIE,gBAAgBM,IAAID,MAAME,IAAI,EAAGH,iBAAgBI,IAAIH,MAAME,IAAI;AACnE,UAAME,QAAQJ,MAAMI;AACpB,QAAIA,OAAOF,QAAQP,gBAAgBM,IAAIG,MAAMF,IAAI,EAAGH,iBAAgBI,IAAIC,MAAMF,IAAI;EACpF;AACA,MAAIH,gBAAgBM,OAAO,GAAG;AAC5B,WAAO;MAAEC,iBAAiB;WAAIP;;MAAkBQ,QAAQ;IAAa;EACvE;AAEA,QAAMC,wBAAwB,oBAAIZ,IAAAA;AAClC,aAAWI,SAASP,QAAQ;AAC1B,UAAMa,kBAAmBN,MAAkDS,8BAA8B,CAAA;AACzG,eAAWP,QAAQI,iBAAiB;AAClC,UAAIX,gBAAgBM,IAAIC,IAAAA,EAAOM,uBAAsBL,IAAID,IAAAA;IAC3D;EACF;AACA,MAAIM,sBAAsBH,SAAS,GAAG;AACpC,WAAO;MAAEC,iBAAiB,CAAA;MAAIC,QAAQ;IAAU;EAClD;AAEA,QAAMG,YAAYhB,sBAAsBiB,OAAOtC,CAAAA,OAAMmC,sBAAsBP,IAAI5B,GAAG,CAAA,EAAGyB,KAAK,CAAA;AAC1F,QAAMc,SAAS,MAAMC,QAAQC,IAAIJ,UAAUb,IAAI,OAAMxB,QAAO;IAAEA;IAAI,GAAI,MAAMD,iBAAiBC,EAAAA;EAAK,EAAA,CAAA;AAClGuC,SAAOG,KAAK,CAACC,GAAGC,MAAAA;AACd,QAAID,EAAE1B,SAAS2B,EAAE3B,KAAM,QAAO0B,EAAE1B,OAAO2B,EAAE3B,OAAO,IAAI;AACpD,QAAI0B,EAAErC,aAAasC,EAAEtC,SAAU,QAAOqC,EAAErC,WAAWsC,EAAEtC,WAAW,KAAK;AACrE,WAAOqC,EAAE3C,GAAG,CAAA,EAAGyB,QAAQmB,EAAE5C,GAAG,CAAA,EAAGyB,QAAQ,KAAK;EAC9C,CAAA;AACA,SAAO;IAAEQ,iBAAiB;MAACM,OAAO,CAAA,EAAGvC,GAAG,CAAA,EAAGyB;;IAAQS,QAAQ;EAAgB;AAC7E;AApCsBhB;;;;;;;;;;AFSf,IAAM2B,qBAAqB;AAK3B,IAAMC,sCAAsC;AAM5C,IAAMC,oCAAoC;AAY1C,IAAMC,oBAAN,MAAMA,2BAA0BC,2BAAAA;SAAAA;;;EACrC,OAAgBC,iBAAiBC;EACjC,OAAgBC,eAAe;IAC7BC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;;EAGF,OAAgBC,WAAW;IAACT;;EAC5BU,UAAUb,mBAAkBE;EAElBY;EACAC;;;EAGAC,6BAA6B,oBAAIC,IAAAA;EACjCC;EACAC;EAEFC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;;;;EAKR,WAAWC,mBAA2B;AACpC,WAAOjC;EACT;;;;;EAMA,WAAWkC,wBAAgC;AACzC,WAAOjC;EACT;;;;;EAMA,WAAWkC,sBAA8B;AACvC,WAAOjC;EACT;EAEA,IAAckC,UAAU;AACtB,WAAO,KAAKb;EACd;EAEA,IAAcc,uBAAuB;AACnC,WAAO,KAAKb;EACd;EAEA,IAAcc,UAAU;AACtB,WAAO,KAAKb;EACd;EAEA,IAAcc,oBAAoB;AAChC,WAAO,KAAKb;EACd;EAEA,IAAcc,wBAAwB;AACpC,WAAO,KAAKb;EACd;EAEA,IAAcc,qBAAqB;AACjC,WAAO,KAAKb;EACd;EAEA,IAAcc,oBAAoB;AAChC,WAAO,KAAKC,OAAOD,qBAAqB;EAC1C;EAEA,IAAcE,gBAAgB;AAC5B,WAAO,KAAKf;EACd;EAEA,IAAcgB,gBAAgB;AAC5B,WAAO,KAAKf;EACd;;;;EAMA,IAAcgB,gCAAgC;AAC5C,WAAO,KAAKxB;EACd;EAEA,IAAcyB,gBAAyB;AACrC,WAAO,KAAKhB;EACd;;;;EAMA,IAAciB,iBAAiC;AAC7C,WAAO,KAAKhB;EACd;;;;EAMA,MAAeiB,gBAAgB;AAC7B,SAAK3B,iCAAiC,KAAKqB,OAAOG,iCAAkC,MAAMI,gBAAgBC,OAAM;AAChH,SAAK5B,WAAW6B,UAAS,KAAKT,OAAOP,SAAS,MAAM,qBAAA;AACpD,SAAKX,WAAW,KAAKW,QAAQE;AAC7B,SAAKd,wBAAwB,MAAM,KAAK6B,gBAAsC7C,2BAAAA;AAC9E,SAAKkB,qBAAqB,MAAM,KAAK2B,gBAAmC5C,yBAAAA;AACxE,SAAKkB,yBAAyB,MAAM,KAAK2B,QAAQC,YAAmC7C,4BAAAA;AACpF,SAAKkB,sBAAsB,MAAM,KAAKyB,gBAAoC1C,yBAAAA;AAC1E,SAAKkB,iBAAiB,MAAM,KAAKwB,gBAA+BzC,oBAAAA;AAChE,SAAKkB,iBAAiB,MAAM,KAAKuB,gBAA+BxC,oBAAAA;AAChE,SAAKkB,iBAAiB,KAAKY,OAAOI;AAClC,SAAKf,kBAAkB,MAAM,KAAKqB,gBAAgCvC,qBAAAA;AAClE,SAAKI,yBAAyB,MAAM,KAAKoC,QAAQE,eAAsCC,4BAAAA;EACzF;EAEA,MAAMC,KAAKC,MAA6F;AAatG,WAAO,MAAM,KAAKC,sBAAsBD,IAAAA;EAC1C;EAIA,MAAME,iBAAiBF,MAA2CG,OAAuE;AAEvI,UAAMC,SAAS,MAAM,KAAKH,sBAAsBD,IAAAA;AAChD,WAAOG,QAAQV,UAASW,QAAQ,MAAM,8BAAA,IAAkCA;EAC1E;EAEA,MAAgBC,wBAAwBC,OAAoC;AAC1E,QAAI,CAAC,KAAKhD,qBAAqB;AAE7B,WAAKA,sBAAsB,MAAMiD,kCAAkCf,OAAO;QACxEf,SAAS;QACTG,mBAAmB,KAAKA;QACxB4B,QAAQ;UACNpB,eAAe,KAAKA;UACpBqB,uBAAuBC;UACvBC,QAAQC;QACV;MACF,CAAA;IACF;AAEA,UAAMC,UAAU,IAAIC,gBAAmC;MAAEH,QAAQI;IAAkB,CAAA,EAAGC,OAAO;MAAEV;IAAM,CAAA,EAAGW,MAAK;AAC7G,UAAMC,UAAU,MAAM,KAAK5D,oBAAoB6D,OAAO;MAACN;KAAQ;AAC/D,WAAOK;EACT;;;;;;EAOUE,yBAAyBpB,MAAiF;AAClH,QAAI,KAAKhB,OAAOqC,2BAA4B;AAC5C,UAAMC,eAAetB,KAAKM;AAE1B,QAAIiB,WAAU,KAAK7D,uBAAuB,GAAG;AAC3C,YAAM8D,wBAAwB,KAAK9D,0BAA0BlB,mBAAkB+B;AAC/E,UAAI+C,eAAeE,sBAAuB;IAC5C;AACA,SAAK9D,0BAA0B4D;AAC/B,WAAOG,yBAAwB,KAAK9C,SAAS,YAAY2C,cAAcA,eAAe9E,mBAAkB+B,qBAAqB;EAC/H;EAEA,MAAgB0B,sBAAsBD,MAAuC0B,mBAAmB,OAAOvB,QAAQ,OAAO;AACpH,WAAO,MAAM,KAAKwB,UAAU,yBAAyB,YAAA;AACnD,UAAI;AAEF,cAAM,EAAErB,OAAOsB,cAAa,IAAKnC,UAASoC,oBAAoB7B,IAAAA,GAAO,MAAM,oBAAA;AAC3E,cAAM8B,YAAYF,gBAAgB;AAClC,cAAMG,UAAU,MAAM,KAAKjD,mBAAmBiD,QAAO;AACrD,cAAMC,yBAAyB,MAAM,KAAK9C,cAAc+C,oBAAoB;UAAEC,OAAO1F,mBAAkB8B;QAAiB,CAAA;AACxH,cAAM2D,sBAAsBD,uBAAuBG,OAAOC,CAAAA,OAAM,CAAC,KAAK5E,2BAA2B6E,IAAID,GAAG,CAAA,EAAGE,KAAK,CAAA;AAChH,cAAMC,wBAAwB,MAAM,KAAKC,6BAA6BP,qBAAqBF,OAAAA;AAE3F,aAAKU,QAAQC,IAAI,oBAAoBH,sBAAsBI,MAAM,EAAE;AAEnE,cAAMC,gBAAuC,CAAA;AAG7C,cAAMC,+BAA+B,MAAM,KAAKzB,yBAAyBpB,IAAAA;AACzE,YAAI6C,6BAA8BD,eAAcE,KAAKD,4BAAAA;AAGrD,YAAIN,sBAAsBI,WAAW,KAAK,CAAC,KAAKI,kBAAkB/C,IAAAA,KAAS,CAACG,MAAO;AAGnF,cAAM6C,yBAAyB,MAAM,KAAK3C,wBAAwByB,SAAAA;AAClEc,sBAAcE,KAAI,GAAIE,sBAAAA;AAEtB,cAAMC,uBAAuB,MAAMC,gCAAgC,KAAKvE,SAAS4D,qBAAAA;AACjF,cAAMY,YAAYC,KAAKC,IAAG;AAC1B,cAAMC,cAAc,MAAM,KAAKC,oBAAmB;AAClD,cAAMC,eAAeJ,KAAKC,IAAG,IAAKF;AAClC,YAAIK,eAAe,KAAK;AACtB,eAAKf,QAAQgB,KAAK,oCAAoCD,YAAAA,IAAgB;QACxE;AAEA,cAAM,CAACE,2BAA2BC,sBAAAA,IAC9B,MAAM,KAAKC,eAAe5D,MAAMuC,uBAAuBU,sBAAsBvB,gBAAAA;AAEjF,cAAMmC,yBAAyB,MAAM,KAAKnF,qBAAqBoF,gBAAgB;UAACC;SAAwB,GAAGA,uBAAAA;AAE3G,cAAM3D,SAAS,MAAM,KAAK4D,0BAA0B;UAClDhE;UACA+B;UACA8B;UACAjB;UACAU;UACAI;UACAC;QACF,CAAA;AACA,YAAIM,mCAAkC7D,OAAOE,KAAK,GAAG;AACnD,gBAAM,KAAKrB,cAAciF,aAAa;YAAC9D,OAAOE;WAAM;AACpD,iBAAOF,OAAOE;QAChB;AACA,YAAIF,OAAOE,MAAO,OAAM,KAAK6D,qBAAqB/D,OAAOE,OAAOF,OAAOgE,MAAM;MAC/E,SAASC,OAAO;AACd,aAAK5B,QAAQ4B,MAAM,qCAAsCA,MAAgBC,OAAO,EAAE;AAClF,cAAMD;MACR;IACF,GAAG,KAAKE,OAAO;EACjB;;EAGA,MAAcX,eACZ5D,MACAwE,KACAC,WACA/C,mBAAmB,OAC6C;AAChE,UAAMgD,kBAA8B,CAAA;AACpC,UAAMC,sBAAsB,MAAMC,QAAQC,IAAIL,IAAIM,IAAI,OAAO1C,OAAAA;AAC3D,YAAM2C,WAAiCN,UAAUO,KAAKD,CAAAA,cAAYA,UAASE,SAAS7C,GAAG,CAAA,EAAG6C,IAAI;AAC9F,UAAI,CAACF,SAAU;AACf,YAAMG,oBAAoBC,OAAOC,OAAOL,UAAUN,SAAAA,EAAWY,OAAO,CAACC,KAAKC,MAAMD,MAAME,YAAYD,KAAK,IAAA,GAAc,EAAE;AACvH,UAAI7D,kBAAkB;AACpB,cAAM+D,WAAW,MAAM,KAAK/G,qBAAqBoF,gBAAgB;UAACiB,SAASE;SAAK,GAAGF,SAASE,IAAI,KAAKS,QAAQ,EAAE;AAC/G,YAAID,WAAWP,mBAAmB;AAChCR,0BAAgB5B,KAAKiC,QAAAA;AACrB,iBAAO3C;QACT;MACF,OAAO;AACLsC,wBAAgB5B,KAAKiC,QAAAA;AACrB,eAAO3C;MACT;IACF,CAAA,CAAA,GAAKD,OAAOwD,MAAAA;AACZ,WAAO;MAAChB;MAAoBD;;EAC9B;EAEA,MAAcnB,sBAAsB;AAClC,WAAO,MAAM,KAAKlE,eAAeuG,mBAAkB;EACrD;;;;;;EAOQ7C,kBAAkB/C,MAAgD;AACxE,UAAM6F,QAAQ7F,KAAK8F;AACnB,QAAIvE,WAAUsE,KAAAA,KAAUzC,KAAKC,IAAG,IAAKwC,QAAQ,KAAK9G,mBAAmB;AACnE,aAAO;IACT;AACA,WAAO;EACT;EAEA,MAAcoF,qBACZ7D,OACA8D,QACe;AACf,SAAK3B,QAAQgB,KAAK,wCAAwCW,OAAO2B,GAAG,CAAA,GAAIzB,OAAAA,EAAS;AACjF,QAAI,KAAK/G,wBAAwB;AAC/B,YAAMyI,kBAAkB5B,OAAOU,IAAImB,CAAAA,OAAM;QACvCC,MAAM5F,MAAM,CAAA,EAAGgC;QAAO6D,MAAM;QAAwB7B,SAAS8B,OAAOH,EAAE3B,WAAW2B,CAAAA;MACnF,EAAA;AACA,YAAM,KAAK1I,uBAAuB8I,YAAY;QAC5C1F,QAAQ2F;QAAsBhG;QAAO8D,QAAQ4B;QAAiBO,UAAU;MAC1E,CAAA;IACF,OAAO;AACL,YAAM,KAAKpH,8BAA8BqH,OAAOlG,MAAM,CAAA,CAAE;IAC1D;EACF;;EAGA,MAAckC,6BACZiE,cACA1E,SACkD;AAClD,UAAM2E,aAAa3E,QAAQ4E,YAAW;AACtC,UAAMC,UAAmD,CAAA;AACzD,UAAMC,aAAsD,CAAA;AAC5D,eAAWzE,MAAMqE,cAAc;AAC7B,UAAIrE,GAAG,CAAA,EAAG0E,MAAMH,YAAW,MAAOD,YAAY;AAC5CE,gBAAQ9D,KAAKV,EAAAA;MACf,OAAO;AACLyE,mBAAW/D,KAAKV,EAAAA;MAClB;IACF;AACA,QAAIyE,WAAWlE,SAAS,GAAG;AACzB,WAAKF,QAAQgB,KAAK,aAAaoD,WAAWlE,MAAM,2CAA2C;AAC3F,YAAMoE,MAAM,KAAKxJ;AACjB,aAAOwJ,MACHnC,QAAQC,IAAIgC,WAAW/B,IAAI1C,CAAAA,OAAM2E,IAAIC,kBAAkB;QACrDrG,QAAQsG;QACRC,aAAa9E;QACbgC,QAAQ;UAAC;YACP8B,MAAM9D,GAAG,CAAA,EAAGE;YACZ6D,MAAM;YACN7B,SAAS,qBAAqBlC,GAAG,CAAA,EAAG0E,KAAK,+BAA+BJ,UAAAA;UAC1E;;QACAH,UAAU;MACZ,CAAA,CAAA,CAAA,IACA,KAAKpH,8BAA8BqH,OAAOK,WAAW/B,IAAI1C,CAAAA,OAAMA,GAAG,CAAA,CAAE,CAAA;IAC1E;AACA,WAAOwE;EACT;EAEA,MAAc5C,0BAA0BmD,MAWrC;AACD,UAAM,EACJpF,SAAS/B,MAAM0D,2BAA2BC,wBAC1Cf,eAAeiB,uBAAuBP,YAAW,IAC/C6D;AACJ,UAAMC,cAAcC,KAAKC,IAAI,GAAG5D,0BAA0Bf,MAAM;AAChE,QAAI4E,wBAAwB7D;AAC5B,QAAI8D,qBAAqB7D;AACzB,QAAI8D;AACJ,QAAIC,aAA6C,CAAA;AAEjD,aAASC,UAAU,GAAGA,WAAWP,aAAaO,WAAW;AACvD,YAAMC,gBAAgB;WAAIhF;WAAkB4E;QAAoBlE;;AAChE,WAAKb,QAAQoF,KAAK,kBAAkB7H,KAAKM,QAAQ,CAAA,GAAIqH,UAAU,IAAI,WAAWA,OAAAA,MAAa,EAAA,EAAI;AAC/FF,kBAAY,MAAMK,gBAChB9H,MACAuH,uBACAK,eACA;QAAC,KAAKnJ;SACNsF,yBACAF,uBACAkE,QACAhG,OAAAA;AAEF,YAAMiG,YAAY,MAAM,KAAKnJ,sBAAsBoJ,cAAcR,WAAW;QAAEzH,MAAMA,KAAKsC;MAAM,CAAA;AAC/F,UAAI2B,mCAAkC+D,SAAAA,GAAY;AAChD,eAAO;UAAE1H,OAAO0H;UAAW5D,QAAQ,CAAA;QAAG;MACxC;AACAsD,mBAAaM;AACb,UAAIL,YAAYP,YAAa;AAC7B,YAAM,EAAEc,iBAAiBC,OAAM,IAAK,MAAMC,8BAA8B;QAAEb;QAAuBnD,QAAQ4D;MAAU,CAAA;AACnH,UAAIE,gBAAgBvF,WAAW,KAAKwF,WAAW,UAAW;AAC1D,iBAAWE,iBAAiBH,gBAAiB,MAAK1K,2BAA2B8K,IAAID,aAAAA;AACjF,YAAME,eAAe,IAAI9K,IAAUyK,eAAAA;AACnCX,8BAAwBA,sBAAsBpF,OAAOC,CAAAA,OAAM,CAACmG,aAAalG,IAAID,GAAG,CAAA,EAAGE,KAAK,CAAA;AACxF,YAAMkG,yBAAyB,IAAI/K,IAAa8J,sBAAsBzC,IAAI1C,CAAAA,OAAMA,GAAG,CAAA,EAAG6C,IAAI,CAAA;AAC1FuC,4BAAsB,MAAMtE,gCAAgC,KAAKvE,SAAS4I,qBAAAA,GACvEpF,OAAOoD,CAAAA,MAAKiD,uBAAuBnG,IAAIkD,EAAEN,IAAI,CAAA;AAChD,WAAKxC,QAAQgB,KAAK,oCAAoCkE,UAAU,CAAA,eAAgBO,gBAAgBvF,MAAM,kBAAkB;IAC1H;AACA,WAAO;MAAErC,OAAOmH;MAAWrD,QAAQsD;IAAW;EAChD;AACF;;;;;;AG5cA,SAASe,6BAAAA,4BAA2BC,8BAA8B;AAQ3D,IAAeC,2BAAf,MAAeA,kCAAiCC,2BAAAA;EARvD,OAQuDA;;;EACrD,OAAgBC,iBAAiBC;EACjC,OAAgBC,WAAW;IAACD;;EACnBE,UAAUL,0BAAyBE;EAE5CI,UAAUC,OAA0D;AAClE,UAAM,IAAIC,MAAM,qCAAA;EAClB;EAEAC,oBAAoBC,UAAmBH,OAAyC;AAC9E,UAAM,IAAIC,MAAM,+CAAA;EAClB;AACF;","names":["AbstractCreatable","assertEx","creatable","toEthAddress","IXyoChainRewards__factory","asAttoXL1","BlockRewardViewerMoniker","EvmBlockRewardViewer","AbstractCreatable","defaultMoniker","BlockRewardViewerMoniker","monikers","moniker","_contractAddress","chainContractViewer","assertEx","params","contractAddress","provider","allowedRewardForBlock","blockNumber","contract","IXyoChainRewards__factory","connect","toEthAddress","asAttoXL1","calcBlockReward","createHandler","rewardsContract","ex","error","Error","message","cause","AbstractCreatableProvider","BlockViewerMoniker","XyoValidator","AbstractCreatableProvider","moniker","_blockViewer","blockViewer","createHandler","locator","getInstance","BlockViewerMoniker","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","blockByHash","_hash","undefined","Promise","resolve","assertEx","hexToLast4BytesInt","shuffleWithSeed","AbstractCreatableProvider","creatableProvider","BaseElectionService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","blockViewer","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","context","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","buildNextBlock","createGenesisBlock","createDeclarationIntent","createBootstrapHead","account","chainId","genesisBlockRewardAmount","genesisBlockRewardAddress","chain","genesisBlock","createGenesisBlock","push","producerDeclarationPayload","createDeclarationIntent","address","block","producerDeclarationBlock","buildNextBlock","assertEx","isDefined","ChainHeadSelector","BlockRejectionSchema","isSignedHydratedBlockWithHashMeta","processPendingBlocks","blockValidationViewer","blockViewer","context","logger","mempoolViewer","finalizationRunner","allowedProducers","minCandidates","deadLetterQueueRunner","start","Date","now","currentBlock","headSelector","ChainHeadSelector","windowedFinalizedChain","bestHeadChain","findBestHead","isDefined","length","oldHeadBlock","newHydratedHeadBlock","assertEx","at","newHeadBlock","debug","block","_hash","candidateBlocks","filter","b","validationResults","Promise","all","map","candidateBlock","validateBlocks","value","state","blocksToFinalize","i","entries","result","isSignedHydratedBlockWithHashMeta","push","error","JSON","stringify","errors","Array","isArray","e","hash","name","message","String","rejectBlock","schema","BlockRejectionSchema","rejector","info","finalizeBlocks","finalizeChainFragment","AbstractCreatableProvider","creatableProvider","NetworkStakeStepRewardViewerMoniker","BaseNetworkStakeStepRewardService","AbstractCreatableProvider","defaultMoniker","NetworkStakeStepRewardViewerMoniker","dependencies","monikers","moniker","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","assertEx","exists","hexToBigInt","isDefined","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","MemoryArchivist","PayloadBuilder","AbstractCreatableProvider","AccountBalanceViewerMoniker","asBlockBoundWitness","AttoXL1","BlockNumberSchema","BlockRejectionSchema","BlockRewardViewerMoniker","BlockRunnerMoniker","BlockValidationViewerMoniker","creatableProvider","createDeclarationIntent","DeadLetterQueueRunnerMoniker","defaultRewardRatio","FinalizationViewerMoniker","isSignedHydratedBlockWithHashMeta","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","TransactionRejectionSchema","XYO_STEP_REWARD_ADDRESS","hexFromBigInt","assertEx","PayloadBuilder","HydratedTransactionWrapper","transactionRequiredGas","TransferSchema","XYO_ZERO_ADDRESS","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","PayloadBuilder","addStorageMeta","txBaseFeeCosts","boundWitness","from","fees","base","txGasCosts","requiredGas","transactionRequiredGas","data","totalGasCost","gasPrice","payloads","Object","entries","amount","payload","schema","TransferSchema","epoch","Date","now","transfers","XYO_ZERO_ADDRESS","hexFromBigInt","fromPayload","assertEx","find","p","HydratedTransactionWrapper","netBalancesForPayloads","transactionRequiredGas","scoreTransaction","tx","wrapper","HydratedTransactionWrapper","parse","from","boundWitness","gasPrice","fees","gasCost","transactionRequiredGas","baseCost","base","netBalances","netBalancesForPayloads","singletons","fromNet","transferOut","cost","identifyOffendingTransactions","args","errors","candidateTransactions","candidateHashes","Set","map","_hash","txInvalidHashes","error","has","hash","add","cause","size","offendingHashes","reason","balanceOffenderHashes","offendingTransactionHashes","offenders","filter","scored","Promise","all","sort","a","b","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","SimpleBlockRunner","AbstractCreatableProvider","defaultMoniker","BlockRunnerMoniker","dependencies","AccountBalanceViewerMoniker","BlockRewardViewerMoniker","BlockValidationViewerMoniker","FinalizationViewerMoniker","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","monikers","moniker","_blockRewardDiviner","_deadLetterQueueRunner","_excludedTransactionHashes","Set","_lastRedeclarationBlock","_rejectedTransactionsArchivist","_account","_accountBalanceViewer","_address","_blockRewardViewer","_blockValidationViewer","_finalizationViewer","_mempoolRunner","_mempoolViewer","_rewardAddress","_timeSyncViewer","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","account","accountBalanceViewer","address","blockRewardViewer","blockValidationViewer","finalizationViewer","heartbeatInterval","params","mempoolRunner","mempoolViewer","rejectedTransactionsArchivist","rewardAddress","timeSyncViewer","createHandler","MemoryArchivist","create","assertEx","locateAndCreate","locator","getInstance","tryGetInstance","DeadLetterQueueRunnerMoniker","next","head","proposeNextValidBlock","produceNextBlock","force","result","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","config","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","disableIntentRedeclaration","currentBlock","isDefined","lastDeclarationExpiry","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","chainId","pendingTransactionsRaw","pendingTransactions","limit","filter","tx","has","_hash","nextBlockTransactions","rejectWrongChainTransactions","logger","log","length","nonTxPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","Date","now","timePayload","generateTimePayload","timeDuration","warn","initialFundedTransactions","initialFundedTransfers","filterByFunded","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","runBuildValidateRetryLoop","isSignedHydratedBlockWithHashMeta","submitBlocks","rejectExhaustedBlock","errors","error","message","context","txs","transfers","fundedTransfers","fundedTransactions","Promise","all","map","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","exists","currentTimePayload","epoch","$epoch","at","rejectionErrors","e","hash","name","String","rejectBlock","BlockRejectionSchema","rejector","insert","transactions","localChain","toLowerCase","matched","mismatched","chain","dlq","rejectTransaction","TransactionRejectionSchema","transaction","args","maxAttempts","Math","max","candidateTransactions","candidateTransfers","lastBlock","lastErrors","attempt","blockPayloads","info","buildNextBlock","undefined","validated","validateBlock","offendingHashes","reason","identifyOffendingTransactions","offendingHash","add","offendingSet","remainingFromAddresses","AbstractCreatableProvider","StepStakeViewerMoniker","AbstractStepStakeService","AbstractCreatableProvider","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/BlockReward/EvmBlockRewardViewer.ts", "../../src/ChainValidator/XyoValidator.ts", "../../src/Election/BaseElectionService.ts", "../../src/implementation/head/createBootstrapHead.ts", "../../src/implementation/processPendingBlocks.ts", "../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts", "../../src/simple/block/runner/SimpleBlockRunner.ts", "../../src/simple/block/runner/generateTransactionFeeTransfers.ts", "../../src/simple/block/runner/identifyOffendingTransactions.ts", "../../src/StepStake/BaseStepStakeService.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CreatableParams } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable,\n assertEx, creatable, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport type {\n AttoXL1, BlockRewardViewer,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n asAttoXL1,\n BlockRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = IXyoChainRewards__factory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`, { cause: ex })\n }\n }\n}\n", "import type { Promisable } from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer, HydratedBlockStateValidationFunction,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, BlockViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\nimport type { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends AbstractCreatableProvider<TParams> implements Validator {\n moniker = 'Validator'\n private _blockViewer?: BlockViewer\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n", "import type { Address, Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport type { WithHashMeta } from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider,\n type BlockBoundWitness,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableProvider()\nexport class BaseElectionService extends AbstractCreatableProvider<BaseElectionServicesParams> implements ElectionService {\n static readonly defaultMoniker = 'Election'\n static readonly dependencies = []\n static readonly monikers = ['Election']\n moniker = BaseElectionService.defaultMoniker\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n }, this.context)\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n", "import type { Address } from '@xylabs/sdk-js'\nimport { buildNextBlock, createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { createDeclarationIntent } from '@xyo-network/xl1-sdk'\n\nexport const createBootstrapHead = async (\n account: AccountInstance,\n chainId: ChainId,\n genesisBlockRewardAmount: AttoXL1,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n", "import type { Address, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { ChainHeadSelector } from '@xyo-network/chain-analyze'\nimport type {\n BaseContext, BlockValidationViewer, BlockViewer, DeadLetterQueueRunner, FinalizationRunner, MempoolViewer,\n} from '@xyo-network/xl1-sdk'\nimport { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\n// type FinalizedBlockAttributes = { producer: Address }\n\ninterface ProcessPendingBlocksParams {\n allowedProducers?: Address[]\n blockValidationViewer: BlockValidationViewer\n blockViewer: BlockViewer\n context: BaseContext\n deadLetterQueueRunner?: DeadLetterQueueRunner\n finalizationRunner: FinalizationRunner\n logger?: Logger\n mempoolViewer: MempoolViewer\n minCandidates?: number\n}\n\n// eslint-disable-next-line complexity\nexport async function processPendingBlocks({\n blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner,\n}: ProcessPendingBlocksParams) {\n const start = Date.now()\n\n const currentBlock = await blockViewer.currentBlock()\n\n const headSelector = new ChainHeadSelector({\n context, logger, mempoolViewer, blockViewer, windowedFinalizedChain: [currentBlock], allowedProducers, minCandidates,\n })\n\n // Use the head selector to find the best head or fallback to the starting head\n const bestHeadChain = await headSelector.findBestHead()\n\n // If we found a head\n if (isDefined(bestHeadChain) && bestHeadChain.length > 0) {\n const oldHeadBlock = currentBlock[0]\n const newHydratedHeadBlock = assertEx(bestHeadChain.at(-1), () => 'Missing best head block [processPendingBlocks]')\n const newHeadBlock = newHydratedHeadBlock[0]\n // let finalizedBlocksAttributes: FinalizedBlockAttributes[] = []\n\n // Synchronize the best head with the outArchivist all the way\n // back to the last finalized block\n\n logger?.debug('Validating new HeadBlock head from (block) ', oldHeadBlock?.block, 'to', newHeadBlock.block)\n logger?.debug('Validating new HeadBlock head from (hash) ', oldHeadBlock?._hash, 'to', newHeadBlock._hash)\n\n if (newHeadBlock._hash === oldHeadBlock?._hash) {\n logger?.debug('No new blocks found', oldHeadBlock?.block, 'to', newHeadBlock.block)\n return\n }\n\n // Store the items to be committed in the correct order\n const candidateBlocks = bestHeadChain.filter((b) => {\n return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true\n })\n\n // Validate candidate blocks before finalizing\n const validationResults = await Promise.all(candidateBlocks.map(candidateBlock => blockValidationViewer.validateBlocks([candidateBlock], { value: true, state: true })))\n const blocksToFinalize: typeof candidateBlocks = []\n for (const [i, block] of candidateBlocks.entries()) {\n const result = validationResults[i][0]\n if (isSignedHydratedBlockWithHashMeta(result)) {\n blocksToFinalize.push(block)\n } else {\n logger?.error('Block validation failed', block[0].block, block[0]._hash, JSON.stringify(result, null, 2))\n if (deadLetterQueueRunner) {\n const errors = Array.isArray(result)\n ? result.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n : [{ hash: block[0]._hash, name: 'BlockValidationError' }]\n await deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors, rejector: 'validator',\n })\n }\n }\n }\n\n logger?.info('Validated new HeadBlock head from (block) in', `${Date.now() - start}ms`, newHeadBlock.block, 'to', oldHeadBlock?.block)\n logger?.info('Validated new HeadBlock head from (hash) in', `${Date.now() - start}ms`, newHeadBlock._hash, 'to', oldHeadBlock?._hash)\n\n if (blocksToFinalize.length > 0) {\n await finalizationRunner.finalizeBlocks(blocksToFinalize)\n }\n\n // Prevent us from rechecking the same head\n await headSelector.finalizeChainFragment(blocksToFinalize)\n\n // this._startingHead = newHydratedHeadBlock\n\n // Return the finalized payloads\n return blocksToFinalize\n } else {\n // If no head was found, return an empty array\n logger?.info('No head found to validate', currentBlock?.[0]._hash)\n }\n}\n", "import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1,\n NetworkStakeStepRewardService,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider,\n creatableProvider, NetworkStakeStepRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n ethProvider?: Provider\n}\n\n@creatableProvider()\nexport class BaseNetworkStakeStepRewardService extends\n AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n override moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [AttoXL1, AttoXL1]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n", "import type {\n Address, Hash, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, exists, hexToBigInt, isDefined,\n} from '@xylabs/sdk-js'\nimport type { BlockRewardDiviner } from '@xyo-network/chain-modules'\nimport { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport type {\n AccountInstance,\n ArchivistInstance, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AccountBalanceViewer, AllowedBlockPayload, BlockBoundWitness,\n BlockNumberPayload, BlockRewardViewer, BlockRunner, BlockValidationViewer, ChainId, ChainStakeIntent, CreatableProviderParams,\n DeadLetterQueueRunner,\n FinalizationViewer,\n HydratedBlockStateValidationFunction, HydratedBlockValidationError, MempoolRunner, MempoolViewer,\n SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransactionWithHashMeta,\n TimePayload, TimeSyncViewer, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1,\n BlockNumberSchema, BlockRejectionSchema, BlockRewardViewerMoniker, BlockRunnerMoniker,\n BlockValidationViewerMoniker, creatableProvider, createDeclarationIntent, DeadLetterQueueRunnerMoniker, defaultRewardRatio,\n FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker,\n TransactionRejectionSchema, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\nimport { identifyOffendingTransactions } from './identifyOffendingTransactions.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 100\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 100\n\nexport interface SimpleBlockRunnerParams extends CreatableProviderParams {\n account: AccountInstance\n disableIntentRedeclaration?: boolean\n heartbeatInterval?: number\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatableProvider()\nexport class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {\n static readonly defaultMoniker = BlockRunnerMoniker\n static readonly dependencies = [\n AccountBalanceViewerMoniker,\n BlockRewardViewerMoniker,\n BlockValidationViewerMoniker,\n FinalizationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n TimeSyncViewerMoniker,\n ]\n\n static readonly monikers = [BlockRunnerMoniker]\n moniker = SimpleBlockRunner.defaultMoniker\n\n protected _blockRewardDiviner?: BlockRewardDiviner\n protected _deadLetterQueueRunner?: DeadLetterQueueRunner\n // TODO(producer-exclusion-set): uncapped for v1. If memory grows in long-running producers,\n // add FIFO eviction or a TTL keyed off block number.\n protected _excludedTransactionHashes = new Set<Hash>()\n protected _lastRedeclarationBlock?: number\n protected _rejectedTransactionsArchivist?: ArchivistInstance\n\n private _account?: AccountInstance\n private _accountBalanceViewer?: AccountBalanceViewer\n private _address?: Address\n private _blockRewardViewer?: BlockRewardViewer\n private _blockValidationViewer?: BlockValidationViewer\n private _finalizationViewer?: FinalizationViewer\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _rewardAddress?: Address\n private _timeSyncViewer?: TimeSyncViewer\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n protected get account() {\n return this._account!\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get address() {\n return this._address!\n }\n\n protected get blockRewardViewer() {\n return this._blockRewardViewer!\n }\n\n protected get blockValidationViewer() {\n return this._blockValidationViewer!\n }\n\n protected get finalizationViewer() {\n return this._finalizationViewer!\n }\n\n protected get heartbeatInterval() {\n return this.params.heartbeatInterval ?? 3_600_000\n }\n\n protected get mempoolRunner() {\n return this._mempoolRunner!\n }\n\n protected get mempoolViewer() {\n return this._mempoolViewer!\n }\n\n // protected get pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return this._rewardAddress!\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get timeSyncViewer(): TimeSyncViewer {\n return this._timeSyncViewer!\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n override async createHandler() {\n this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? (await MemoryArchivist.create())\n this._account = assertEx(this.params.account, () => 'Account is required')\n this._address = this.account.address\n this._accountBalanceViewer = await this.locateAndCreate<AccountBalanceViewer>(AccountBalanceViewerMoniker)\n this._blockRewardViewer = await this.locateAndCreate<BlockRewardViewer>(BlockRewardViewerMoniker)\n this._blockValidationViewer = await this.locator.getInstance<BlockValidationViewer>(BlockValidationViewerMoniker)\n this._finalizationViewer = await this.locateAndCreate<FinalizationViewer>(FinalizationViewerMoniker)\n this._mempoolRunner = await this.locateAndCreate<MempoolRunner>(MempoolRunnerMoniker)\n this._mempoolViewer = await this.locateAndCreate<MempoolViewer>(MempoolViewerMoniker)\n this._rewardAddress = this.params.rewardAddress\n this._timeSyncViewer = await this.locateAndCreate<TimeSyncViewer>(TimeSyncViewerMoniker)\n this._deadLetterQueueRunner = await this.locator.tryGetInstance<DeadLetterQueueRunner>(DeadLetterQueueRunnerMoniker)\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n // if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n if (this.params.disableIntentRedeclaration) return\n const currentBlock = head.block\n // Only redeclare when the previous declaration has expired\n if (isDefined(this._lastRedeclarationBlock)) {\n const lastDeclarationExpiry = this._lastRedeclarationBlock + SimpleBlockRunner.RedeclarationDuration\n if (currentBlock < lastDeclarationExpiry) return\n }\n this._lastRedeclarationBlock = currentBlock\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n try {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const chainId = await this.finalizationViewer.chainId()\n const pendingTransactionsRaw = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n const pendingTransactions = pendingTransactionsRaw.filter(tx => !this._excludedTransactionHashes.has(tx[0]._hash))\n const nextBlockTransactions = await this.rejectWrongChainTransactions(pendingTransactions, chainId)\n\n this.logger?.log(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const nonTxPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) nonTxPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n nonTxPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload()\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [initialFundedTransactions, initialFundedTransfers]\n = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n\n const result = await this.runBuildValidateRetryLoop({\n head,\n chainId,\n stepRewardPoolBalance,\n nonTxPayloads,\n timePayload,\n initialFundedTransactions,\n initialFundedTransfers,\n })\n if (isSignedHydratedBlockWithHashMeta(result.block)) {\n await this.mempoolRunner.submitBlocks([result.block])\n return result.block\n }\n if (result.block) await this.rejectExhaustedBlock(result.block, result.errors)\n } catch (error) {\n this.logger?.error(`Error proposing next valid block: ${(error as Error).message}`)\n throw error\n }\n }, this.context)\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransactionWithHashMeta[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransactionWithHashMeta[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload() {\n return await this.timeSyncViewer.currentTimePayload()\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch) && Date.now() - epoch > this.heartbeatInterval) {\n return true\n }\n return false\n }\n\n private async rejectExhaustedBlock(\n block: SignedHydratedBlockWithHashMeta,\n errors: HydratedBlockValidationError[],\n ): Promise<void> {\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n if (this._deadLetterQueueRunner) {\n const rejectionErrors = errors.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n await this._deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors: rejectionErrors, rejector: 'producer',\n })\n } else {\n await this.rejectedTransactionsArchivist.insert(block[1])\n }\n }\n\n // Partition pending transactions by chain-ID match; route mismatches to the transaction DLQ.\n private async rejectWrongChainTransactions(\n transactions: SignedHydratedTransactionWithHashMeta[],\n chainId: ChainId,\n ): Promise<SignedHydratedTransactionWithHashMeta[]> {\n const localChain = chainId.toLowerCase()\n const matched: SignedHydratedTransactionWithHashMeta[] = []\n const mismatched: SignedHydratedTransactionWithHashMeta[] = []\n for (const tx of transactions) {\n if (tx[0].chain.toLowerCase() === localChain) {\n matched.push(tx)\n } else {\n mismatched.push(tx)\n }\n }\n if (mismatched.length > 0) {\n this.logger?.warn(`Rejecting ${mismatched.length} transaction(s) targeting non-local chain`)\n const dlq = this._deadLetterQueueRunner\n await (dlq\n ? Promise.all(mismatched.map(tx => dlq.rejectTransaction({\n schema: TransactionRejectionSchema,\n transaction: tx,\n errors: [{\n hash: tx[0]._hash,\n name: 'TransactionChainMismatch',\n message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`,\n }],\n rejector: 'producer',\n })))\n : this.rejectedTransactionsArchivist.insert(mismatched.map(tx => tx[0])))\n }\n return matched\n }\n\n private async runBuildValidateRetryLoop(args: {\n chainId: ChainId\n head: WithHashMeta<BlockBoundWitness>\n initialFundedTransactions: SignedHydratedTransactionWithHashMeta[]\n initialFundedTransfers: Transfer[]\n nonTxPayloads: AllowedBlockPayload[]\n stepRewardPoolBalance: AttoXL1\n timePayload: TimePayload\n }): Promise<{\n block: SignedHydratedBlockWithHashMeta | undefined\n errors: HydratedBlockValidationError[]\n }> {\n const {\n chainId, head, initialFundedTransactions, initialFundedTransfers,\n nonTxPayloads, stepRewardPoolBalance, timePayload,\n } = args\n const maxAttempts = Math.max(1, initialFundedTransactions.length)\n let candidateTransactions = initialFundedTransactions\n let candidateTransfers = initialFundedTransfers\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined\n let lastErrors: HydratedBlockValidationError[] = []\n\n for (let attempt = 0; attempt <= maxAttempts; attempt++) {\n const blockPayloads = [...nonTxPayloads, ...candidateTransfers, timePayload]\n this.logger?.info(`Building block ${head.block + 1}${attempt > 0 ? ` (retry ${attempt})` : ''}`)\n lastBlock = await buildNextBlock(\n head,\n candidateTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n chainId,\n )\n const validated = await this.blockValidationViewer.validateBlock(lastBlock, { head: head._hash })\n if (isSignedHydratedBlockWithHashMeta(validated)) {\n return { block: validated, errors: [] }\n }\n lastErrors = validated\n if (attempt === maxAttempts) break\n const { offendingHashes, reason } = await identifyOffendingTransactions({ candidateTransactions, errors: validated })\n if (offendingHashes.length === 0 || reason === 'unknown') break\n for (const offendingHash of offendingHashes) this._excludedTransactionHashes.add(offendingHash)\n const offendingSet = new Set<Hash>(offendingHashes)\n candidateTransactions = candidateTransactions.filter(tx => !offendingSet.has(tx[0]._hash))\n const remainingFromAddresses = new Set<Address>(candidateTransactions.map(tx => tx[0].from))\n candidateTransfers = (await generateTransactionFeeTransfers(this.address, candidateTransactions))\n .filter(t => remainingFromAddresses.has(t.from))\n this.logger?.warn(`Block validation failed (attempt ${attempt + 1}); excluded ${offendingHashes.length} tx(s), retrying`)\n }\n return { block: lastBlock, errors: lastErrors }\n }\n}\n", "import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport type { HydratedBlockValidationError, SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n netBalancesForPayloads,\n transactionRequiredGas,\n} from '@xyo-network/xl1-sdk'\n\nexport type OffendingTxReason = 'block-balance' | 'tx-invalid' | 'unknown'\n\nexport interface OffendingTxResult {\n offendingHashes: Hash[]\n reason: OffendingTxReason\n}\n\ninterface TxScore {\n cost: bigint\n gasPrice: bigint\n}\n\nasync function scoreTransaction(tx: SignedHydratedTransactionWithHashMeta): Promise<TxScore> {\n const wrapper = await HydratedTransactionWrapper.parse(tx)\n const from = wrapper.boundWitness.from\n const gasPrice = wrapper.fees.gasPrice\n const gasCost = transactionRequiredGas(tx) * gasPrice\n const baseCost = wrapper.fees.base\n const netBalances = netBalancesForPayloads({ singletons: {} }, tx[1])\n const fromNet = netBalances[from] ?? 0n\n const transferOut = fromNet < 0n ? -fromNet : 0n\n return { cost: gasCost + baseCost + transferOut, gasPrice }\n}\n\nexport async function identifyOffendingTransactions(args: {\n candidateTransactions: SignedHydratedTransactionWithHashMeta[]\n errors: HydratedBlockValidationError[]\n}): Promise<OffendingTxResult> {\n const { errors, candidateTransactions } = args\n const candidateHashes = new Set<Hash>(candidateTransactions.map(tx => tx[0]._hash))\n\n const txInvalidHashes = new Set<Hash>()\n for (const error of errors) {\n if (candidateHashes.has(error.hash)) txInvalidHashes.add(error.hash)\n const cause = error.cause as { hash?: Hash } | undefined\n if (cause?.hash && candidateHashes.has(cause.hash)) txInvalidHashes.add(cause.hash)\n }\n if (txInvalidHashes.size > 0) {\n return { offendingHashes: [...txInvalidHashes], reason: 'tx-invalid' }\n }\n\n const balanceOffenderHashes = new Set<Hash>()\n for (const error of errors) {\n const offendingHashes = (error as { offendingTransactionHashes?: Hash[] }).offendingTransactionHashes ?? []\n for (const hash of offendingHashes) {\n if (candidateHashes.has(hash)) balanceOffenderHashes.add(hash)\n }\n }\n if (balanceOffenderHashes.size === 0) {\n return { offendingHashes: [], reason: 'unknown' }\n }\n\n const offenders = candidateTransactions.filter(tx => balanceOffenderHashes.has(tx[0]._hash))\n const scored = await Promise.all(offenders.map(async tx => ({ tx, ...(await scoreTransaction(tx)) })))\n scored.sort((a, b) => {\n if (a.cost !== b.cost) return a.cost < b.cost ? 1 : -1\n if (a.gasPrice !== b.gasPrice) return a.gasPrice < b.gasPrice ? -1 : 1\n return a.tx[0]._hash < b.tx[0]._hash ? -1 : 1\n })\n return { offendingHashes: [scored[0].tx[0]._hash], reason: 'block-balance' }\n}\n", "import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type { StepIdentity, StepStakeViewer } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, StepStakeViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\nexport abstract class AbstractStepStakeService extends AbstractCreatableProvider<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n override moniker = AbstractStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["assertEx", "AbstractCreatableProvider", "AbstractCreatableProvider", "assertEx", "assertEx", "AbstractCreatableProvider", "creatableProvider", "AbstractCreatableProvider", "creatableProvider", "assertEx", "isDefined", "buildNextBlock", "PayloadBuilder", "AbstractCreatableProvider", "BlockRejectionSchema", "BlockRewardViewerMoniker", "creatableProvider", "createDeclarationIntent", "isSignedHydratedBlockWithHashMeta", "assertEx", "HydratedTransactionWrapper", "transactionRequiredGas", "AbstractCreatableProvider", "assertEx", "BlockRewardViewerMoniker", "PayloadBuilder", "isDefined", "createDeclarationIntent", "isSignedHydratedBlockWithHashMeta", "transfer", "BlockRejectionSchema", "buildNextBlock", "creatableProvider", "AbstractCreatableProvider"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-services",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.2",
|
|
4
4
|
"description": "XYO Layer One SDK Services",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"README.md"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@xyo-network/chain-analyze": "~1.23.
|
|
38
|
-
"@xyo-network/chain-modules": "~1.23.
|
|
39
|
-
"@xyo-network/chain-protocol": "~1.23.
|
|
40
|
-
"@xyo-network/chain-utils": "~1.23.
|
|
37
|
+
"@xyo-network/chain-analyze": "~1.23.2",
|
|
38
|
+
"@xyo-network/chain-modules": "~1.23.2",
|
|
39
|
+
"@xyo-network/chain-protocol": "~1.23.2",
|
|
40
|
+
"@xyo-network/chain-utils": "~1.23.2"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@bitauth/libauth": "~3.0.0",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"@xylabs/geo": "^5.1.2",
|
|
53
53
|
"@xylabs/sdk-js": "^5.1.2",
|
|
54
54
|
"@xylabs/threads": "~5.1.2",
|
|
55
|
-
"@xylabs/toolchain": "~
|
|
56
|
-
"@xylabs/tsconfig": "~
|
|
55
|
+
"@xylabs/toolchain": "~8.0.4",
|
|
56
|
+
"@xylabs/tsconfig": "~8.0.4",
|
|
57
57
|
"@xylabs/vitest-extended": "~5.1.2",
|
|
58
58
|
"@xyo-network/account": "~5.6.2",
|
|
59
59
|
"@xyo-network/account-model": "~5.6.3",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"@xyo-network/typechain": "^4.1.3",
|
|
76
76
|
"@xyo-network/wallet": "~5.6.2",
|
|
77
77
|
"@xyo-network/wallet-model": "^5.6.3",
|
|
78
|
-
"@xyo-network/xl1-sdk": "^1.30.
|
|
78
|
+
"@xyo-network/xl1-sdk": "^1.30.2",
|
|
79
79
|
"ajv": "^8.20.0",
|
|
80
80
|
"async-mutex": "^0.5.0",
|
|
81
81
|
"bn.js": "^5.2.3",
|
|
@@ -94,14 +94,14 @@
|
|
|
94
94
|
"shallowequal": "~1.1.0",
|
|
95
95
|
"store2": "~2.14.4",
|
|
96
96
|
"tslib": "^2.8.1",
|
|
97
|
-
"typescript": "~
|
|
97
|
+
"typescript": "~6.0.3",
|
|
98
98
|
"uuid": "~14.0.0",
|
|
99
|
-
"vite": "^8.0.
|
|
99
|
+
"vite": "^8.0.13",
|
|
100
100
|
"vitest": "^4.1.6",
|
|
101
101
|
"wasm-feature-detect": "~1.8.0",
|
|
102
102
|
"webextension-polyfill": "^0.12.0",
|
|
103
103
|
"zod": "~4.4.3",
|
|
104
|
-
"@xyo-network/chain-validation": "~1.23.
|
|
104
|
+
"@xyo-network/chain-validation": "~1.23.2"
|
|
105
105
|
},
|
|
106
106
|
"peerDependencies": {
|
|
107
107
|
"@bitauth/libauth": "~3.0",
|