@xyo-network/chain-services 1.20.17 → 1.20.19
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/BlockReward/EvmBlockRewardViewer.d.ts +4 -3
- package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
- package/dist/neutral/Election/BaseElectionService.d.ts +4 -5
- package/dist/neutral/Election/BaseElectionService.d.ts.map +1 -1
- package/dist/neutral/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +6 -5
- package/dist/neutral/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/neutral/implementation/index.d.ts +1 -0
- package/dist/neutral/implementation/index.d.ts.map +1 -1
- package/dist/neutral/implementation/processPendingBlocks.d.ts +48 -0
- package/dist/neutral/implementation/processPendingBlocks.d.ts.map +1 -0
- package/dist/neutral/index.mjs +111 -14
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts +7 -5
- package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/package.json +10 -13
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { CreatableParams } from '@xylabs/sdk-js';
|
|
2
|
+
import { AbstractCreatable } from '@xylabs/sdk-js';
|
|
3
|
+
import type { AttoXL1, BlockRewardViewer, ChainContractViewer, XL1BlockNumber } from '@xyo-network/xl1-sdk';
|
|
4
|
+
import type { Provider } from 'ethers/providers';
|
|
4
5
|
export interface EvmBlockRewardViewerParams extends CreatableParams {
|
|
5
6
|
chainContractViewer: ChainContractViewer;
|
|
6
7
|
provider: Provider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvmBlockRewardViewer.d.ts","sourceRoot":"","sources":["../../../src/BlockReward/EvmBlockRewardViewer.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"EvmBlockRewardViewer.d.ts","sourceRoot":"","sources":["../../../src/BlockReward/EvmBlockRewardViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EACL,iBAAiB,EAElB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAC1B,mBAAmB,EACnB,cAAc,EACf,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,qBACa,oBAAqB,SAAQ,iBAAiB,CAAC,0BAA0B,CAAE,YAAW,iBAAiB;IAClH,MAAM,CAAC,QAAQ,CAAC,cAAc,sBAA2B;IACzD,MAAM,CAAC,QAAQ,CAAC,QAAQ,wBAA6B;IACrD,OAAO,sBAAsC;IAE7C,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;IAE9C,SAAS,KAAK,mBAAmB,wBAEhC;IAED,SAAS,KAAK,eAAe,WAE5B;IAED,SAAS,KAAK,QAAQ,aAErB;IAEK,qBAAqB,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3D,aAAa;CAS7B"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { Address, Hash } from '@xylabs/sdk-js';
|
|
2
|
-
import { WithHashMeta } from '@xyo-network/sdk-js';
|
|
3
|
-
import { AbstractCreatableProvider, type BlockViewer, type ChainStakeViewer, type ElectionService, type StakeIntentService } from '@xyo-network/xl1-sdk';
|
|
4
|
-
import {
|
|
5
|
-
import { BaseServiceParams } from '../model/index.ts';
|
|
1
|
+
import type { Address, Hash } from '@xylabs/sdk-js';
|
|
2
|
+
import type { WithHashMeta } from '@xyo-network/sdk-js';
|
|
3
|
+
import { AbstractCreatableProvider, type BlockBoundWitness, type BlockViewer, type ChainStakeViewer, type ElectionService, type StakeIntentService } from '@xyo-network/xl1-sdk';
|
|
4
|
+
import type { BaseServiceParams } from '../model/index.ts';
|
|
6
5
|
export interface BaseElectionServicesParams extends BaseServiceParams {
|
|
7
6
|
blockViewer?: BlockViewer;
|
|
8
7
|
chainStakeViewer?: ChainStakeViewer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseElectionService.d.ts","sourceRoot":"","sources":["../../../src/Election/BaseElectionService.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BaseElectionService.d.ts","sourceRoot":"","sources":["../../../src/Election/BaseElectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EACL,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAC9C,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;AAED,qBACa,mBAAoB,SAAQ,yBAAyB,CAAC,0BAA0B,CAAE,YAAW,eAAe;IACvH,MAAM,CAAC,QAAQ,CAAC,cAAc,cAAa;IAC3C,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAK;IACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAe;IACvC,OAAO,SAAqC;IAC5C,IAAI,WAAW,+BAEd;IAED,IAAI,gBAAgB,qBAEnB;IAED,IAAI,kBAAkB,uBAErB;IAEK,+BAA+B,CAAC,OAAO,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IASnG,SAAS,CAAC,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,SAAI,GAAG,OAAO,EAAE;CAM3G"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Address, Promisable } from '@xylabs/sdk-js';
|
|
2
|
-
import { ReadArchivist } from '@xyo-network/sdk-js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import type { Address, Promisable } from '@xylabs/sdk-js';
|
|
2
|
+
import type { ReadArchivist } from '@xyo-network/sdk-js';
|
|
3
|
+
import type { AttoXL1, NetworkStakeStepRewardService, StepIdentity, StepIdentityString } from '@xyo-network/xl1-sdk';
|
|
4
|
+
import { AbstractCreatableProvider } from '@xyo-network/xl1-sdk';
|
|
5
|
+
import type { Provider } from 'ethers';
|
|
6
|
+
import type { BaseServiceParams } from '../model/index.ts';
|
|
6
7
|
export interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {
|
|
7
8
|
chainArchivist: ReadArchivist;
|
|
8
9
|
ethProvider?: Provider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/implementation/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/implementation/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Address, Logger } from '@xylabs/sdk-js';
|
|
2
|
+
import type { BaseContext, BlockValidationViewer, BlockViewer, DeadLetterQueueRunner, FinalizationRunner, MempoolViewer } from '@xyo-network/xl1-sdk';
|
|
3
|
+
interface ProcessPendingBlocksParams {
|
|
4
|
+
allowedProducers?: Address[];
|
|
5
|
+
blockValidationViewer: BlockValidationViewer;
|
|
6
|
+
blockViewer: BlockViewer;
|
|
7
|
+
context: BaseContext;
|
|
8
|
+
deadLetterQueueRunner?: DeadLetterQueueRunner;
|
|
9
|
+
finalizationRunner: FinalizationRunner;
|
|
10
|
+
logger?: Logger;
|
|
11
|
+
mempoolViewer: MempoolViewer;
|
|
12
|
+
minCandidates?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner, }: ProcessPendingBlocksParams): Promise<[{
|
|
15
|
+
schema: "network.xyo.boundwitness" & {
|
|
16
|
+
readonly __schema: true;
|
|
17
|
+
};
|
|
18
|
+
addresses: (Lowercase<string> & {
|
|
19
|
+
readonly __hex: true;
|
|
20
|
+
} & {
|
|
21
|
+
readonly __address: true;
|
|
22
|
+
})[];
|
|
23
|
+
payload_hashes: import("@xylabs/sdk-js").BrandedHash[];
|
|
24
|
+
payload_schemas: import("@xyo-network/payload-model").BrandedSchema<string>[];
|
|
25
|
+
previous_hashes: (import("@xylabs/sdk-js").BrandedHash | null)[];
|
|
26
|
+
$signatures: import("@xylabs/sdk-js").BrandedHex[];
|
|
27
|
+
block: import("@xyo-network/xl1-sdk").XL1BlockNumber;
|
|
28
|
+
chain: import("@xylabs/sdk-js").BrandedHex;
|
|
29
|
+
previous: import("@xylabs/sdk-js").BrandedHash | null;
|
|
30
|
+
$epoch: number;
|
|
31
|
+
_hash: import("@xylabs/sdk-js").BrandedHash;
|
|
32
|
+
_dataHash: import("@xylabs/sdk-js").BrandedHash;
|
|
33
|
+
$destination?: (Lowercase<string> & {
|
|
34
|
+
readonly __hex: true;
|
|
35
|
+
} & {
|
|
36
|
+
readonly __address: true;
|
|
37
|
+
}) | undefined;
|
|
38
|
+
$sourceQuery?: import("@xylabs/sdk-js").BrandedHash | undefined;
|
|
39
|
+
protocol?: number | undefined;
|
|
40
|
+
step_hashes?: import("@xylabs/sdk-js").BrandedHash[] | undefined;
|
|
41
|
+
}, {
|
|
42
|
+
[x: string]: unknown;
|
|
43
|
+
schema: import("@xyo-network/payload-model").BrandedSchema<string>;
|
|
44
|
+
_hash: import("@xylabs/sdk-js").BrandedHash;
|
|
45
|
+
_dataHash: import("@xylabs/sdk-js").BrandedHash;
|
|
46
|
+
}[]][] | undefined>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=processPendingBlocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../src/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAGrD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,aAAa,EAC1G,MAAM,sBAAsB,CAAA;AAK7B,UAAU,0BAA0B;IAClC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAGD,wBAAsB,oBAAoB,CAAC,EACzC,qBAAqB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,GAC/I,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA2E5B"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -41,7 +41,9 @@ var EvmBlockRewardViewer = class _EvmBlockRewardViewer extends AbstractCreatable
|
|
|
41
41
|
this._contractAddress = await this.chainContractViewer.rewardsContract();
|
|
42
42
|
} catch (ex) {
|
|
43
43
|
const error = ex;
|
|
44
|
-
throw new Error(`Failed to get rewards contract address: ${error.message}
|
|
44
|
+
throw new Error(`Failed to get rewards contract address: ${error.message}`, {
|
|
45
|
+
cause: ex
|
|
46
|
+
});
|
|
45
47
|
}
|
|
46
48
|
}
|
|
47
49
|
};
|
|
@@ -158,6 +160,84 @@ var createBootstrapHead = /* @__PURE__ */ __name(async (account, chainId, genesi
|
|
|
158
160
|
return chain;
|
|
159
161
|
}, "createBootstrapHead");
|
|
160
162
|
|
|
163
|
+
// src/implementation/processPendingBlocks.ts
|
|
164
|
+
import { assertEx as assertEx3, isDefined } from "@xylabs/sdk-js";
|
|
165
|
+
import { ChainHeadSelector } from "@xyo-network/chain-analyze";
|
|
166
|
+
import { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from "@xyo-network/xl1-sdk";
|
|
167
|
+
async function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner }) {
|
|
168
|
+
const start = Date.now();
|
|
169
|
+
const currentBlock = await blockViewer.currentBlock();
|
|
170
|
+
const headSelector = new ChainHeadSelector({
|
|
171
|
+
context,
|
|
172
|
+
logger,
|
|
173
|
+
mempoolViewer,
|
|
174
|
+
blockViewer,
|
|
175
|
+
windowedFinalizedChain: [
|
|
176
|
+
currentBlock
|
|
177
|
+
],
|
|
178
|
+
allowedProducers,
|
|
179
|
+
minCandidates
|
|
180
|
+
});
|
|
181
|
+
const bestHeadChain = await headSelector.findBestHead();
|
|
182
|
+
if (isDefined(bestHeadChain) && bestHeadChain.length > 0) {
|
|
183
|
+
const oldHeadBlock = currentBlock[0];
|
|
184
|
+
const newHydratedHeadBlock = assertEx3(bestHeadChain.at(-1), () => "Missing best head block [processPendingBlocks]");
|
|
185
|
+
const newHeadBlock = newHydratedHeadBlock[0];
|
|
186
|
+
logger?.debug("Validating new HeadBlock head from (block) ", oldHeadBlock?.block, "to", newHeadBlock.block);
|
|
187
|
+
logger?.debug("Validating new HeadBlock head from (hash) ", oldHeadBlock?._hash, "to", newHeadBlock._hash);
|
|
188
|
+
if (newHeadBlock._hash === oldHeadBlock?._hash) {
|
|
189
|
+
logger?.debug("No new blocks found", oldHeadBlock?.block, "to", newHeadBlock.block);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const candidateBlocks = bestHeadChain.filter((b) => {
|
|
193
|
+
return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true;
|
|
194
|
+
});
|
|
195
|
+
const validationResults = await Promise.all(candidateBlocks.map((candidateBlock) => blockValidationViewer.validateBlocks([
|
|
196
|
+
candidateBlock
|
|
197
|
+
], {
|
|
198
|
+
value: true,
|
|
199
|
+
state: true
|
|
200
|
+
})));
|
|
201
|
+
const blocksToFinalize = [];
|
|
202
|
+
for (const [i, block] of candidateBlocks.entries()) {
|
|
203
|
+
const result = validationResults[i][0];
|
|
204
|
+
if (isSignedHydratedBlockWithHashMeta(result)) {
|
|
205
|
+
blocksToFinalize.push(block);
|
|
206
|
+
} else {
|
|
207
|
+
logger?.error("Block validation failed", block[0].block, block[0]._hash, JSON.stringify(result, null, 2));
|
|
208
|
+
if (deadLetterQueueRunner) {
|
|
209
|
+
const errors = Array.isArray(result) ? result.map((e) => ({
|
|
210
|
+
hash: block[0]._hash,
|
|
211
|
+
name: "BlockValidationError",
|
|
212
|
+
message: String(e.message ?? e)
|
|
213
|
+
})) : [
|
|
214
|
+
{
|
|
215
|
+
hash: block[0]._hash,
|
|
216
|
+
name: "BlockValidationError"
|
|
217
|
+
}
|
|
218
|
+
];
|
|
219
|
+
await deadLetterQueueRunner.rejectBlock({
|
|
220
|
+
schema: BlockRejectionSchema,
|
|
221
|
+
block,
|
|
222
|
+
errors,
|
|
223
|
+
rejector: "validator"
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
logger?.info("Validated new HeadBlock head from (block) in", `${Date.now() - start}ms`, newHeadBlock.block, "to", oldHeadBlock?.block);
|
|
229
|
+
logger?.info("Validated new HeadBlock head from (hash) in", `${Date.now() - start}ms`, newHeadBlock._hash, "to", oldHeadBlock?._hash);
|
|
230
|
+
if (blocksToFinalize.length > 0) {
|
|
231
|
+
await finalizationRunner.finalizeBlocks(blocksToFinalize);
|
|
232
|
+
}
|
|
233
|
+
await headSelector.finalizeChainFragment(blocksToFinalize);
|
|
234
|
+
return blocksToFinalize;
|
|
235
|
+
} else {
|
|
236
|
+
logger?.info("No head found to validate", currentBlock?.[0]._hash);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
__name(processPendingBlocks, "processPendingBlocks");
|
|
240
|
+
|
|
161
241
|
// src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts
|
|
162
242
|
import { AbstractCreatableProvider as AbstractCreatableProvider3, creatableProvider as creatableProvider2, NetworkStakeStepRewardViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
163
243
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
@@ -237,15 +317,15 @@ BaseNetworkStakeStepRewardService = _ts_decorate3([
|
|
|
237
317
|
], BaseNetworkStakeStepRewardService);
|
|
238
318
|
|
|
239
319
|
// src/simple/block/runner/SimpleBlockRunner.ts
|
|
240
|
-
import { assertEx as
|
|
320
|
+
import { assertEx as assertEx5, exists, hexToBigInt, isDefined as isDefined2 } from "@xylabs/sdk-js";
|
|
241
321
|
import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
|
|
242
322
|
import { buildNextBlock as buildNextBlock2 } from "@xyo-network/chain-protocol";
|
|
243
323
|
import { MemoryArchivist, PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
|
|
244
|
-
import { AbstractCreatableProvider as AbstractCreatableProvider4, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1, BlockNumberSchema, BlockRewardViewerMoniker as BlockRewardViewerMoniker2, BlockRunnerMoniker, BlockValidationViewerMoniker, creatableProvider as creatableProvider3, createDeclarationIntent as createDeclarationIntent2, defaultRewardRatio, FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-sdk";
|
|
324
|
+
import { AbstractCreatableProvider as AbstractCreatableProvider4, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1, BlockNumberSchema, BlockRejectionSchema as BlockRejectionSchema2, BlockRewardViewerMoniker as BlockRewardViewerMoniker2, BlockRunnerMoniker, BlockValidationViewerMoniker, creatableProvider as creatableProvider3, createDeclarationIntent as createDeclarationIntent2, DeadLetterQueueRunnerMoniker, defaultRewardRatio, FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta as isSignedHydratedBlockWithHashMeta2, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-sdk";
|
|
245
325
|
|
|
246
326
|
// src/simple/block/runner/generateTransactionFeeTransfers.ts
|
|
247
327
|
import { hexFromBigInt } from "@xylabs/sdk-js";
|
|
248
|
-
import { assertEx as
|
|
328
|
+
import { assertEx as assertEx4 } from "@xylabs/sdk-js";
|
|
249
329
|
import { PayloadBuilder } from "@xyo-network/sdk-js";
|
|
250
330
|
import { HydratedTransactionWrapper, transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-sdk";
|
|
251
331
|
async function generateTransactionFeeTransfers(address, transactions) {
|
|
@@ -278,7 +358,7 @@ async function generateTransactionFeeTransfers(address, transactions) {
|
|
|
278
358
|
return payload;
|
|
279
359
|
});
|
|
280
360
|
for (const [from, amount] of Object.entries(txGasCosts)) {
|
|
281
|
-
const fromPayload =
|
|
361
|
+
const fromPayload = assertEx4(payloads.find((p) => p.from === from), () => "from payload not found");
|
|
282
362
|
fromPayload.transfers[address] = hexFromBigInt(amount);
|
|
283
363
|
}
|
|
284
364
|
return payloads;
|
|
@@ -315,6 +395,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
315
395
|
];
|
|
316
396
|
moniker = _SimpleBlockRunner.defaultMoniker;
|
|
317
397
|
_blockRewardDiviner;
|
|
398
|
+
_deadLetterQueueRunner;
|
|
318
399
|
_lastRedeclarationBlock;
|
|
319
400
|
_rejectedTransactionsArchivist;
|
|
320
401
|
_account;
|
|
@@ -394,7 +475,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
394
475
|
// }
|
|
395
476
|
async createHandler() {
|
|
396
477
|
this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? await MemoryArchivist.create();
|
|
397
|
-
this._account =
|
|
478
|
+
this._account = assertEx5(this.params.account, () => "Account is required");
|
|
398
479
|
this._address = this.account.address;
|
|
399
480
|
this._accountBalanceViewer = await this.locateAndCreate(AccountBalanceViewerMoniker);
|
|
400
481
|
this._blockRewardViewer = await this.locateAndCreate(BlockRewardViewerMoniker2);
|
|
@@ -404,13 +485,14 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
404
485
|
this._mempoolViewer = await this.locateAndCreate(MempoolViewerMoniker);
|
|
405
486
|
this._rewardAddress = this.params.rewardAddress;
|
|
406
487
|
this._timeSyncViewer = await this.locateAndCreate(TimeSyncViewerMoniker);
|
|
488
|
+
this._deadLetterQueueRunner = await this.locator.tryGetInstance(DeadLetterQueueRunnerMoniker);
|
|
407
489
|
}
|
|
408
490
|
async next(head) {
|
|
409
491
|
return await this.proposeNextValidBlock(head);
|
|
410
492
|
}
|
|
411
493
|
async produceNextBlock(head, force) {
|
|
412
494
|
const result = await this.proposeNextValidBlock(head);
|
|
413
|
-
return force ?
|
|
495
|
+
return force ? assertEx5(result, () => "Failed to produce next block") : result;
|
|
414
496
|
}
|
|
415
497
|
async getBlockRewardTransfers(block) {
|
|
416
498
|
if (!this._blockRewardDiviner) {
|
|
@@ -442,7 +524,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
442
524
|
getProducerRedeclaration(head) {
|
|
443
525
|
if (this.params.disableIntentRedeclaration) return;
|
|
444
526
|
const currentBlock = head.block;
|
|
445
|
-
if (
|
|
527
|
+
if (isDefined2(this._lastRedeclarationBlock)) {
|
|
446
528
|
const lastDeclarationExpiry = this._lastRedeclarationBlock + _SimpleBlockRunner.RedeclarationDuration;
|
|
447
529
|
if (currentBlock < lastDeclarationExpiry) return;
|
|
448
530
|
}
|
|
@@ -452,7 +534,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
452
534
|
async proposeNextValidBlock(head, validateBalances = false, force = false) {
|
|
453
535
|
return await this.spanAsync("proposeNextValidBlock", async () => {
|
|
454
536
|
try {
|
|
455
|
-
const { block: previousBlock } =
|
|
537
|
+
const { block: previousBlock } = assertEx5(asBlockBoundWitness(head), () => "Invalid head block");
|
|
456
538
|
const nextBlock = previousBlock + 1;
|
|
457
539
|
const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({
|
|
458
540
|
limit: _SimpleBlockRunner.DefaultBlockSize
|
|
@@ -488,7 +570,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
488
570
|
head: head._hash
|
|
489
571
|
});
|
|
490
572
|
this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`);
|
|
491
|
-
if (
|
|
573
|
+
if (isSignedHydratedBlockWithHashMeta2(validatedBlock)) {
|
|
492
574
|
await this.mempoolRunner.submitBlocks([
|
|
493
575
|
validatedBlock
|
|
494
576
|
]);
|
|
@@ -496,8 +578,22 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
496
578
|
} else {
|
|
497
579
|
const errors = validatedBlock;
|
|
498
580
|
this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
|
|
499
|
-
|
|
500
|
-
|
|
581
|
+
if (this._deadLetterQueueRunner) {
|
|
582
|
+
const rejectionErrors = errors.map((e) => ({
|
|
583
|
+
hash: block[0]._hash,
|
|
584
|
+
name: "BlockValidationError",
|
|
585
|
+
message: String(e.message ?? e)
|
|
586
|
+
}));
|
|
587
|
+
await this._deadLetterQueueRunner.rejectBlock({
|
|
588
|
+
schema: BlockRejectionSchema2,
|
|
589
|
+
block,
|
|
590
|
+
errors: rejectionErrors,
|
|
591
|
+
rejector: "producer"
|
|
592
|
+
});
|
|
593
|
+
} else {
|
|
594
|
+
const rejectedTransactions = block[1];
|
|
595
|
+
await this.rejectedTransactionsArchivist.insert(rejectedTransactions);
|
|
596
|
+
}
|
|
501
597
|
}
|
|
502
598
|
} catch (error) {
|
|
503
599
|
this.logger?.error(`Error proposing next valid block: ${error.message}`);
|
|
@@ -540,7 +636,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
|
|
|
540
636
|
*/
|
|
541
637
|
heartbeatRequired(head) {
|
|
542
638
|
const epoch = head.$epoch;
|
|
543
|
-
if (
|
|
639
|
+
if (isDefined2(epoch) && Date.now() - epoch > this.heartbeatInterval) {
|
|
544
640
|
return true;
|
|
545
641
|
}
|
|
546
642
|
return false;
|
|
@@ -578,6 +674,7 @@ export {
|
|
|
578
674
|
XYO_PRODUCER_REDECLARATION_DURATION,
|
|
579
675
|
XYO_PRODUCER_REDECLARATION_WINDOW,
|
|
580
676
|
XyoValidator,
|
|
581
|
-
createBootstrapHead
|
|
677
|
+
createBootstrapHead,
|
|
678
|
+
processPendingBlocks
|
|
582
679
|
};
|
|
583
680
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import {\n AbstractCreatable,\n assertEx, creatable, CreatableParams, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport {\n asAttoXL1, AttoXL1, BlockRewardViewer,\n BlockRewardViewerMoniker,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport { 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}`)\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 {\n Address, assertEx, Hash,\n} from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { WithHashMeta } from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\nimport { BlockBoundWitness } from '@xyo-network/xl1-sdk'\n\nimport { 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 { Address, Promisable } from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider,\n AttoXL1,\n creatableProvider,\n NetworkStakeStepRewardService, NetworkStakeStepRewardViewerMoniker,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport { Provider } from 'ethers'\n\nimport { 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 {\n Address, assertEx, exists, Hex, hexToBigInt, isDefined, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport {\n AccountInstance,\n ArchivistInstance, MemoryArchivist,\n PayloadBuilder, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider, AccountBalanceViewer, AccountBalanceViewerMoniker, AllowedBlockPayload, asBlockBoundWitness, AttoXL1, BlockBoundWitness,\n BlockNumberPayload, BlockNumberSchema, BlockRewardViewer, BlockRewardViewerMoniker, BlockRunner, BlockRunnerMoniker, BlockValidationViewer,\n BlockValidationViewerMoniker, ChainStakeIntent, creatableProvider, CreatableProviderParams, createDeclarationIntent, defaultRewardRatio,\n FinalizationViewer,\n FinalizationViewerMoniker,\n HydratedBlockStateValidationFunction, isSignedHydratedBlockWithHashMeta, MempoolRunner, MempoolRunnerMoniker, MempoolViewer, MempoolViewerMoniker,\n SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, TimeSyncViewer, TimeSyncViewerMoniker, Transfer, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.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 _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 }\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 // eslint-disable-next-line max-statements\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 nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n\n this.logger?.info(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.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 blockPayloads.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 [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(\n head,\n fundedNextBlockTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n await this.finalizationViewer.chainId(),\n )\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n const startValidate = Date.now()\n const validatedBlock = await this.blockValidationViewer.validateBlock(block, { head: head._hash })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (isSignedHydratedBlockWithHashMeta(validatedBlock)) {\n await this.mempoolRunner.submitBlocks([validatedBlock])\n return validatedBlock\n } else {\n const errors = validatedBlock\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n const rejectedTransactions = block[1]\n await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n }\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: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], 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","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 { 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":";;;;AAAA,SACEA,mBACAC,UAAUC,WAA4BC,oBACjC;AACP,SAASC,iCAAiC;AAC1C,SACEC,WACAC,gCAGK;;;;;;;;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,EAAE;IAC5E;EACF;AACF;;;;;;AC9CA,SAASC,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;;;ACtEA,SACWC,YAAAA,iBACJ;AACP,SAASC,oBAAoBC,uBAAuB;AAEpD,SACEC,6BAAAA,4BAEuBC,yBAElB;;;;;;;;AAYA,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;;;;;;ACrDA,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;;;ACNnC,SACEU,6BAAAA,4BAEAC,qBAAAA,oBAC+BC,2CAG1B;;;;;;;;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;;;;;;AClGA,SACWsB,YAAAA,WAAUC,QAAaC,aAAaC,iBACxC;AACP,SACsBC,mCAAmCC,qDAClD;AACP,SAASC,kBAAAA,uBAAsB;AAC/B,SAEqBC,iBACnBC,kBAAAA,uBACK;AACP,SACEC,6BAAAA,4BAAiDC,6BAAkDC,qBAAqBC,SACpGC,mBAAsCC,4BAAAA,2BAAuCC,oBACjGC,8BAAgDC,qBAAAA,oBAA4CC,2BAAAA,0BAAyBC,oBAErHC,2BACsCC,mCAAkDC,sBAAqCC,sBAEjDC,uBAAiCC,+BACxG;;;ACrBP,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;;;;;;;;;;ADef,IAAMwC,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;EACAC;EAEFC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;;;;EAKR,WAAWC,mBAA2B;AACpC,WAAO9B;EACT;;;;;EAMA,WAAW+B,wBAAgC;AACzC,WAAO9B;EACT;;;;;EAMA,WAAW+B,sBAA8B;AACvC,WAAO9B;EACT;EAEA,IAAc+B,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,iCAAiC,MAAMI,gBAAgBC,OAAM;AAC/G,SAAK5B,WAAW6B,UAAS,KAAKT,OAAOP,SAAS,MAAM,qBAAA;AACpD,SAAKX,WAAW,KAAKW,QAAQE;AAC7B,SAAKd,wBAAwB,MAAM,KAAK6B,gBAAsC1C,2BAAAA;AAC9E,SAAKe,qBAAqB,MAAM,KAAK2B,gBAAmCzC,yBAAAA;AACxE,SAAKe,yBAAyB,MAAM,KAAK2B,QAAQC,YAAmC1C,4BAAAA;AACpF,SAAKe,sBAAsB,MAAM,KAAKyB,gBAAoCvC,yBAAAA;AAC1E,SAAKe,iBAAiB,MAAM,KAAKwB,gBAA+BtC,oBAAAA;AAChE,SAAKe,iBAAiB,MAAM,KAAKuB,gBAA+BrC,oBAAAA;AAChE,SAAKe,iBAAiB,KAAKY,OAAOI;AAClC,SAAKf,kBAAkB,MAAM,KAAKqB,gBAAgCpC,qBAAAA;EACpE;EAEA,MAAMuC,KAAKC,MAA6F;AAatG,WAAO,MAAM,KAAKC,sBAAsBD,IAAAA;EAC1C;EAIA,MAAME,iBAAiBF,MAA2CG,OAAuE;AAEvI,UAAMC,SAAS,MAAM,KAAKH,sBAAsBD,IAAAA;AAChD,WAAOG,QAAQR,UAASS,QAAQ,MAAM,8BAAA,IAAkCA;EAC1E;EAEA,MAAgBC,wBAAwBC,OAAoC;AAC1E,QAAI,CAAC,KAAK3C,qBAAqB;AAE7B,WAAKA,sBAAsB,MAAM4C,kCAAkCb,OAAO;QACxEf,SAAS;QACTG,mBAAmB,KAAKA;QACxB0B,QAAQ;UACNlB,eAAe,KAAKA;UACpBmB,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,KAAKvD,oBAAoBwD,OAAO;MAACN;KAAQ;AAC/D,WAAOK;EACT;;;;;;EAOUE,yBAAyBpB,MAAiF;AAClH,QAAI,KAAKd,OAAOmC,2BAA4B;AAC5C,UAAMC,eAAetB,KAAKM;AAE1B,QAAIiB,UAAU,KAAK3D,uBAAuB,GAAG;AAC3C,YAAM4D,wBAAwB,KAAK5D,0BAA0Bf,mBAAkB4B;AAC/E,UAAI6C,eAAeE,sBAAuB;IAC5C;AACA,SAAK5D,0BAA0B0D;AAC/B,WAAOG,yBAAwB,KAAK5C,SAAS,YAAYyC,cAAcA,eAAezE,mBAAkB4B,qBAAqB;EAC/H;EAEA,MAAgBwB,sBAAsBD,MAAuC0B,mBAAmB,OAAOvB,QAAQ,OAAO;AAEpH,WAAO,MAAM,KAAKwB,UAAU,yBAAyB,YAAA;AACnD,UAAI;AAEF,cAAM,EAAErB,OAAOsB,cAAa,IAAKjC,UAASkC,oBAAoB7B,IAAAA,GAAO,MAAM,oBAAA;AAC3E,cAAM8B,YAAYF,gBAAgB;AAClC,cAAMG,wBAAwB,MAAM,KAAK3C,cAAc4C,oBAAoB;UAAEC,OAAOpF,mBAAkB2B;QAAiB,CAAA;AAEvH,aAAK0D,QAAQC,KAAK,oBAAoBJ,sBAAsBK,MAAM,EAAE;AAEpE,cAAMC,gBAAuC,CAAA;AAG7C,cAAMC,+BAA+B,MAAM,KAAKlB,yBAAyBpB,IAAAA;AACzE,YAAIsC,6BAA8BD,eAAcE,KAAKD,4BAAAA;AAGrD,YAAIP,sBAAsBK,WAAW,KAAK,CAAC,KAAKI,kBAAkBxC,IAAAA,KAAS,CAACG,MAAO;AAGnF,cAAMsC,yBAAyB,MAAM,KAAKpC,wBAAwByB,SAAAA;AAClEO,sBAAcE,KAAI,GAAIE,sBAAAA;AAEtB,cAAMC,uBAAuB,MAAMC,gCAAgC,KAAK9D,SAASkD,qBAAAA;AACjF,cAAMa,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,6BAA6BC,eAAAA,IAAmB,MAAM,KAAKC,eAAerD,MAAM+B,uBAAuBW,sBAAsBhB,gBAAAA;AAEpIW,sBAAcE,KAAI,GAAIa,iBAAiBL,WAAAA;AAGvC,aAAKb,QAAQC,KAAK,kBAAkBnC,KAAKM,QAAQ,CAAA,EAAG;AACpD,cAAMgD,aAAaT,KAAKC,IAAG;AAC3B,cAAMS,yBAAyB,MAAM,KAAK3E,qBAAqB4E,gBAAgB;UAACC;SAAwB,GAAGA,uBAAAA;AAC3G,cAAMnD,QAAQ,MAAMoD,gBAClB1D,MACAmD,6BACAd,eACA;UAAC,KAAK1D;WACN8E,yBACAF,uBACAI,QACA,MAAM,KAAK3E,mBAAmB4E,QAAO,CAAA;AAGvC,aAAK1B,QAAQC,KACX,eAAe7B,MAAM,CAAA,EAAGA,KAAK,OAAOuC,KAAKC,IAAG,IAAKQ,UAAAA,WAAqBhD,MAAM,CAAA,EAAG8B,MAAM,WAAW;AAGlG,aAAKF,QAAQC,KAAK,oBAAoB7B,MAAM,CAAA,EAAGA,KAAK,SAASA,MAAM,CAAA,EAAG8B,MAAM,WAAW;AACvF,cAAMyB,gBAAgBhB,KAAKC,IAAG;AAC9B,cAAMgB,iBAAiB,MAAM,KAAK/E,sBAAsBgF,cAAczD,OAAO;UAAEN,MAAMA,KAAKgE;QAAM,CAAA;AAChG,aAAK9B,QAAQC,KAAK,mBAAmB7B,MAAM,CAAA,EAAGA,KAAK,OAAOuC,KAAKC,IAAG,IAAKe,aAAAA,WAAwBvD,MAAM,CAAA,EAAG8B,MAAM,WAAW;AAEzH,YAAI6B,kCAAkCH,cAAAA,GAAiB;AACrD,gBAAM,KAAK3E,cAAc+E,aAAa;YAACJ;WAAe;AACtD,iBAAOA;QACT,OAAO;AACL,gBAAMK,SAASL;AACf,eAAK5B,QAAQgB,KAAK,wCAAwCiB,OAAOC,GAAG,CAAA,GAAIC,OAAAA,EAAS;AACjF,gBAAMC,uBAAuBhE,MAAM,CAAA;AACnC,gBAAM,KAAKjB,8BAA8BkF,OAAOD,oBAAAA;QAClD;MACF,SAASE,OAAO;AACd,aAAKtC,QAAQsC,MAAM,qCAAsCA,MAAgBH,OAAO,EAAE;AAClF,cAAMG;MACR;IACF,GAAG,KAAKC,OAAO;EACjB;;EAGA,MAAcpB,eACZrD,MACA0E,KACAC,WACAjD,mBAAmB,OACiC;AACpD,UAAM0B,kBAA8B,CAAA;AACpC,UAAMwB,sBAAsB,MAAMC,QAAQC,IAAIJ,IAAIK,IAAI,OAAOC,OAAAA;AAC3D,YAAMC,WAAiCN,UAAUO,KAAKD,CAAAA,cAAYA,UAASE,SAASH,GAAG,CAAA,EAAGG,IAAI;AAC9F,UAAI,CAACF,SAAU;AACf,YAAMG,oBAAoBC,OAAOC,OAAOL,UAAUN,SAAAA,EAAWY,OAAO,CAACC,KAAKC,MAAMD,MAAME,YAAYD,KAAK,IAAA,GAAc,EAAE;AACvH,UAAI/D,kBAAkB;AACpB,cAAMiE,WAAW,MAAM,KAAK/G,qBAAqB4E,gBAAgB;UAACyB,SAASE;SAAK,GAAGF,SAASE,IAAI,KAAKS,QAAQ,EAAE;AAC/G,YAAID,WAAWP,mBAAmB;AAChChC,0BAAgBb,KAAK0C,QAAAA;AACrB,iBAAOD;QACT;MACF,OAAO;AACL5B,wBAAgBb,KAAK0C,QAAAA;AACrB,eAAOD;MACT;IACF,CAAA,CAAA,GAAKa,OAAOC,MAAAA;AACZ,WAAO;MAAClB;MAAoBxB;;EAC9B;EAEA,MAAcJ,sBAAsB;AAClC,WAAO,MAAM,KAAKzD,eAAewG,mBAAkB;EACrD;;;;;;EAOQvD,kBAAkBxC,MAAgD;AACxE,UAAMgG,QAAQhG,KAAKiG;AACnB,QAAI1E,UAAUyE,KAAAA,KAAUnD,KAAKC,IAAG,IAAKkD,QAAQ,KAAK/G,mBAAmB;AACnE,aAAO;IACT;AACA,WAAO;EACT;AACF;;;;;;AEjWA,SAASiH,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","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","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","BlockRewardViewerMoniker","BlockRunnerMoniker","BlockValidationViewerMoniker","creatableProvider","createDeclarationIntent","defaultRewardRatio","FinalizationViewerMoniker","isSignedHydratedBlockWithHashMeta","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","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","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","_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","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","nextBlockTransactions","pendingTransactions","limit","logger","info","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","Date","now","timePayload","generateTimePayload","timeDuration","warn","fundedNextBlockTransactions","fundedTransfers","filterByFunded","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","undefined","chainId","startValidate","validatedBlock","validateBlock","_hash","isSignedHydratedBlockWithHashMeta","submitBlocks","errors","at","message","rejectedTransactions","insert","error","context","txs","transfers","fundedTransactions","Promise","all","map","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","currentTimePayload","epoch","$epoch","AbstractCreatableProvider","StepStakeViewerMoniker","AbstractStepStakeService","AbstractCreatableProvider","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}
|
|
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/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, 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, ChainStakeIntent, CreatableProviderParams,\n DeadLetterQueueRunner,\n FinalizationViewer,\n HydratedBlockStateValidationFunction, MempoolRunner, MempoolViewer,\n SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, 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, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.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 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 // eslint-disable-next-line max-statements\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 nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n\n this.logger?.info(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.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 blockPayloads.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 [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(\n head,\n fundedNextBlockTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n await this.finalizationViewer.chainId(),\n )\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n const startValidate = Date.now()\n const validatedBlock = await this.blockValidationViewer.validateBlock(block, { head: head._hash })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (isSignedHydratedBlockWithHashMeta(validatedBlock)) {\n await this.mempoolRunner.submitBlocks([validatedBlock])\n return validatedBlock\n } else {\n const errors = validatedBlock\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 const rejectedTransactions = block[1]\n await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n }\n }\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: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], 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","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 { 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":"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","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","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","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","_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","nextBlockTransactions","pendingTransactions","limit","logger","info","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","Date","now","timePayload","generateTimePayload","timeDuration","warn","fundedNextBlockTransactions","fundedTransfers","filterByFunded","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","undefined","chainId","startValidate","validatedBlock","validateBlock","_hash","isSignedHydratedBlockWithHashMeta","submitBlocks","errors","at","message","rejectionErrors","map","e","hash","name","String","rejectBlock","BlockRejectionSchema","rejector","rejectedTransactions","insert","error","context","txs","transfers","fundedTransactions","Promise","all","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","currentTimePayload","epoch","$epoch","AbstractCreatableProvider","StepStakeViewerMoniker","AbstractStepStakeService","AbstractCreatableProvider","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Address, Promisable } from '@xylabs/sdk-js';
|
|
2
|
-
import { BlockRewardDiviner } from '@xyo-network/chain-modules';
|
|
3
|
-
import { AccountInstance, ArchivistInstance, WithHashMeta } from '@xyo-network/sdk-js';
|
|
4
|
-
import {
|
|
1
|
+
import type { Address, Promisable } from '@xylabs/sdk-js';
|
|
2
|
+
import type { BlockRewardDiviner } from '@xyo-network/chain-modules';
|
|
3
|
+
import type { AccountInstance, ArchivistInstance, WithHashMeta } from '@xyo-network/sdk-js';
|
|
4
|
+
import type { AccountBalanceViewer, BlockBoundWitness, BlockRewardViewer, BlockRunner, BlockValidationViewer, ChainStakeIntent, CreatableProviderParams, DeadLetterQueueRunner, FinalizationViewer, HydratedBlockStateValidationFunction, MempoolRunner, MempoolViewer, SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta, TimeSyncViewer, Transfer } from '@xyo-network/xl1-sdk';
|
|
5
|
+
import { AbstractCreatableProvider } from '@xyo-network/xl1-sdk';
|
|
5
6
|
/**
|
|
6
7
|
* The default block size for a block
|
|
7
8
|
*/
|
|
@@ -25,10 +26,11 @@ export interface SimpleBlockRunnerParams extends CreatableProviderParams {
|
|
|
25
26
|
}
|
|
26
27
|
export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {
|
|
27
28
|
static readonly defaultMoniker: "BlockRunner";
|
|
28
|
-
static readonly dependencies: ("BlockRewardViewer" | "
|
|
29
|
+
static readonly dependencies: ("BlockRewardViewer" | "BlockValidationViewer" | "AccountBalanceViewer" | "FinalizationViewer" | "MempoolRunner" | "MempoolViewer" | "TimeSyncViewer")[];
|
|
29
30
|
static readonly monikers: "BlockRunner"[];
|
|
30
31
|
moniker: "BlockRunner";
|
|
31
32
|
protected _blockRewardDiviner?: BlockRewardDiviner;
|
|
33
|
+
protected _deadLetterQueueRunner?: DeadLetterQueueRunner;
|
|
32
34
|
protected _lastRedeclarationBlock?: number;
|
|
33
35
|
protected _rejectedTransactionsArchivist?: ArchivistInstance;
|
|
34
36
|
private _account?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../src/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../src/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAAO,UAAU,EACzB,MAAM,gBAAgB,CAAA;AAIvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAGpE,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAAE,YAAY,EAChC,MAAM,qBAAqB,CAAA;AAK5B,OAAO,KAAK,EACV,oBAAoB,EAAuB,iBAAiB,EACxC,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,uBAAuB,EACpH,qBAAqB,EACrB,kBAAkB,EAClB,oCAAoC,EAAE,aAAa,EAAE,aAAa,EAClE,mCAAmC,EACnC,+BAA+B,EAA6B,cAAc,EAAE,QAAQ,EACrF,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,yBAAyB,EAI1B,MAAM,sBAAsB,CAAA;AAI7B;;GAEG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,mCAAmC,MAAM,CAAA;AAEtD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,OAAO,EAAE,eAAe,CAAA;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,6BAA6B,CAAC,EAAE,iBAAiB,CAAA;IACjD,aAAa,EAAE,OAAO,CAAA;IACtB,0BAA0B,CAAC,EAAE,oCAAoC,CAAA;CAClE;AAED,qBACa,iBAAkB,SAAQ,yBAAyB,CAAC,uBAAuB,CAAE,YAAW,WAAW;IAC9G,MAAM,CAAC,QAAQ,CAAC,cAAc,gBAAqB;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAY,2JAQ3B;IAED,MAAM,CAAC,QAAQ,CAAC,QAAQ,kBAAuB;IAC/C,OAAO,gBAAmC;IAE1C,SAAS,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,CAAA;IAClD,SAAS,CAAC,sBAAsB,CAAC,EAAE,qBAAqB,CAAA;IACxD,SAAS,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAC1C,SAAS,CAAC,8BAA8B,CAAC,EAAE,iBAAiB,CAAA;IAE5D,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAClC,OAAO,CAAC,qBAAqB,CAAC,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAC,CAAmB;IAC9C,OAAO,CAAC,sBAAsB,CAAC,CAAuB;IACtD,OAAO,CAAC,mBAAmB,CAAC,CAAoB;IAChD,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,eAAe,CAAC,CAAgB;IAExC;;OAEG;IACH,MAAM,KAAK,gBAAgB,IAAI,MAAM,CAEpC;IAED;;;OAGG;IACH,MAAM,KAAK,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;OAGG;IACH,MAAM,KAAK,mBAAmB,IAAI,MAAM,CAEvC;IAED,SAAS,KAAK,OAAO,oBAEpB;IAED,SAAS,KAAK,oBAAoB,yBAEjC;IAED,SAAS,KAAK,OAAO;;;;MAEpB;IAED,SAAS,KAAK,iBAAiB,sBAE9B;IAED,SAAS,KAAK,qBAAqB,0BAElC;IAED,SAAS,KAAK,kBAAkB,uBAE/B;IAED,SAAS,KAAK,iBAAiB,WAE9B;IAED,SAAS,KAAK,aAAa,kBAE1B;IAED,SAAS,KAAK,aAAa,kBAE1B;IAMD,SAAS,KAAK,6BAA6B,kQAE1C;IAED,SAAS,KAAK,aAAa,IAAI,OAAO,CAErC;IAMD,SAAS,KAAK,cAAc,IAAI,cAAc,CAE7C;IAMc,aAAa;IAetB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,+BAA+B,GAAG,SAAS,CAAC;IAgBjG,gBAAgB,CAAC,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,+BAA+B,CAAC;IAClH,gBAAgB,CAAC,IAAI,EAAE,mCAAmC,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,+BAA+B,GAAG,SAAS,CAAC;cAOtH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmB3E;;;;OAIG;IACH,SAAS,CAAC,wBAAwB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAAG,UAAU,CAAC,gBAAgB,GAAG,SAAS,CAAC;cAYnG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,UAAQ,EAAE,KAAK,UAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAsFtG,cAAc;YAyBd,mBAAmB;IAIjC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAO1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-services",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.19",
|
|
4
4
|
"description": "XYO Layer One SDK Services",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -26,8 +26,6 @@
|
|
|
26
26
|
},
|
|
27
27
|
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
|
-
"module": "./dist/neutral/index.mjs",
|
|
30
|
-
"types": "./dist/neutral/index.d.ts",
|
|
31
29
|
"files": [
|
|
32
30
|
"dist",
|
|
33
31
|
"!**/*.bench.*",
|
|
@@ -38,19 +36,19 @@
|
|
|
38
36
|
"dependencies": {
|
|
39
37
|
"@xyo-network/sdk-js": "~5.3.30",
|
|
40
38
|
"@xyo-network/typechain": "~4.1.3",
|
|
41
|
-
"@xyo-network/xl1-sdk": "~1.26.
|
|
39
|
+
"@xyo-network/xl1-sdk": "~1.26.31",
|
|
42
40
|
"ethers": "^6.16.0",
|
|
43
|
-
"@xyo-network/chain-
|
|
44
|
-
"@xyo-network/chain-protocol": "~1.20.
|
|
45
|
-
"@xyo-network/chain-
|
|
41
|
+
"@xyo-network/chain-analyze": "~1.20.19",
|
|
42
|
+
"@xyo-network/chain-protocol": "~1.20.19",
|
|
43
|
+
"@xyo-network/chain-modules": "~1.20.19",
|
|
44
|
+
"@xyo-network/chain-utils": "~1.20.19"
|
|
46
45
|
},
|
|
47
46
|
"devDependencies": {
|
|
48
47
|
"@opentelemetry/api": "^1.9.1",
|
|
49
|
-
"@types/node": "~25.
|
|
48
|
+
"@types/node": "~25.6.0",
|
|
50
49
|
"@xylabs/sdk-js": "~5.0.95",
|
|
51
|
-
"@xylabs/
|
|
52
|
-
"@xylabs/
|
|
53
|
-
"@xylabs/tsconfig": "~7.9.6",
|
|
50
|
+
"@xylabs/toolchain": "~7.10.7",
|
|
51
|
+
"@xylabs/tsconfig": "~7.10.7",
|
|
54
52
|
"@xylabs/vitest-extended": "~5.0.95",
|
|
55
53
|
"@xylabs/vitest-matchers": "~5.0.95",
|
|
56
54
|
"@xyo-network/account": "~5.3.30",
|
|
@@ -105,14 +103,13 @@
|
|
|
105
103
|
"ajv": "^8",
|
|
106
104
|
"axios": "^1.15.0",
|
|
107
105
|
"esbuild": ">=0.18",
|
|
108
|
-
"mongodb": "^7.1.1",
|
|
109
106
|
"pako": "~2.1.0",
|
|
110
107
|
"tslib": "~2.8.1",
|
|
111
108
|
"typescript": "~5.9.3",
|
|
112
109
|
"vite": "^8.0.8",
|
|
113
110
|
"vitest": "^4.1.4",
|
|
114
111
|
"zod": "^4.3.6",
|
|
115
|
-
"@xyo-network/chain-validation": "~1.20.
|
|
112
|
+
"@xyo-network/chain-validation": "~1.20.19"
|
|
116
113
|
},
|
|
117
114
|
"peerDependencies": {
|
|
118
115
|
"@xylabs/sdk-js": "~5.0.93",
|