diff --git a/bin/convert/types.ts b/bin/convert/types.ts index 8dd4b3dea..2cc568adc 100644 --- a/bin/convert/types.ts +++ b/bin/convert/types.ts @@ -56,7 +56,7 @@ export const SUPPORTED_TYPES: readonly SupportedType[] = [ name: "header", encode: Header.Codec, decode: Header.Codec, - json: (spec: ChainSpec) => headerFromJson(spec), + json: (_spec: ChainSpec) => headerFromJson, process: { options: ["as-hash"], run(spec, data, option, blake2b) { @@ -132,7 +132,7 @@ export const SUPPORTED_TYPES: readonly SupportedType[] = [ name: "stf-genesis", encode: StateTransitionGenesis.Codec, decode: StateTransitionGenesis.Codec, - json: (spec: ChainSpec) => StateTransitionGenesis.fromJson(spec), + json: (_spec: ChainSpec) => StateTransitionGenesis.fromJson, process: { options: ["as-state", "as-jip4", "as-fuzz-message"], run(spec: ChainSpec, data: unknown, option: string, blake2b) { diff --git a/bin/test-runner/jam-conformance-071.ts b/bin/test-runner/jam-conformance-071.ts index 7b78dfdfb..786af12cd 100644 --- a/bin/test-runner/jam-conformance-071.ts +++ b/bin/test-runner/jam-conformance-071.ts @@ -12,13 +12,6 @@ main(runners, "test-vectors/jam-conformance/fuzz-reports/0.7.1/traces", { // no timeslot in pre-state - valid behavior "1763371531/00000042.json", "1763489287/00000872.json", - // WorkItemsCount === 0 - valid behavior - "1763371098/00000006.json", - "1763372314/00000094.json", - // Invalid ticket attempt - valid behavior - "1763371155/00000055.json", - "1763488328/00000051.json", - "1763487981/00000051.json", ], }) .then((r) => logger.log`${r}`) diff --git a/bin/test-runner/jam-conformance-072.ts b/bin/test-runner/jam-conformance-072.ts index 9b0583733..bb700f854 100644 --- a/bin/test-runner/jam-conformance-072.ts +++ b/bin/test-runner/jam-conformance-072.ts @@ -10,30 +10,6 @@ main(runners, "test-vectors/jam-conformance/fuzz-reports/0.7.2/traces", { // Block should be rejected? "1766565819_2010/00000225.json", - - // Rejecting for WorkItemsCount: valid behavior - "1766244251_2939/00001634.json", - "1766243861_2056/00000022.json", - "1766243861_5589/00000207.json", - "1766479507_3250/00000001.json", - "1766565819_9888/00001868.json", - "1767871405_3616/00000386.json", - "1767872928_6833/00003568.json", - "1767872928_7682/00000035.json", - "1767895984_2203/00012889.json", - "1767895984_2519/00008157.json", - "1767895984_3511/00000469.json", - "1767895984_4076/00010619.json", - "1767896003_1048/00005219.json", - "1767896003_2541/00013907.json", - // Rejecting for invalid ticket attempt: valid behavior - "1766244251_1816/00000377.json", - "1766244122_5414/00000482.json", - "1766243315_2277/00000123.json", - "1766565819_7584/00000277.json", - "1767872928_1994/00000399.json", - "1767889897_4774/00002350.json", - "1767889897_7743/00000301.json", ], }) .then((r) => logger.log`${r}`) diff --git a/bin/test-runner/w3f/runners.ts b/bin/test-runner/w3f/runners.ts index 2cb318a6e..0a9a47e42 100644 --- a/bin/test-runner/w3f/runners.ts +++ b/bin/test-runner/w3f/runners.ts @@ -67,8 +67,8 @@ export const runners = [ runner("pvm", runPvmTest).fromJson(PvmTest.fromJson), runner("gas-cost-tests", runPvmGasCostTest).fromJson(PvmGasCostTest.fromJson), runner("reports", runReportsTest, tinyFull).fromJson(ReportsTest.fromJson), - runner("safrole", runSafroleTest, tiny).fromJson(SafroleTest.fromJson(tinyChainSpec)), - runner("safrole", runSafroleTest, full).fromJson(SafroleTest.fromJson(fullChainSpec)), + runner("safrole", runSafroleTest, tiny).fromJson(SafroleTest.fromJson), + runner("safrole", runSafroleTest, full).fromJson(SafroleTest.fromJson), runner("shuffle", runShufflingTests).fromJson(shufflingTestsFromJson), runner("statistics/tiny", runStatisticsTestTiny, tiny).fromJson(StatisticsTestTiny.fromJson), runner("statistics/full", runStatisticsTestFull, full).fromJson(StatisticsTestFull.fromJson), @@ -92,14 +92,12 @@ function codecRunners(flavor: "tiny" | "full") { runner(`codec/${flavor}/guarantees_extrinsic`, runGuaranteesExtrinsicTest, [spec]).fromJson( guaranteesExtrinsicFromJson, ), - runner(`codec/${flavor}/header`, runHeaderTest, [spec]).fromJson(headerFromJson(spec)), + runner(`codec/${flavor}/header`, runHeaderTest, [spec]).fromJson(headerFromJson), runner(`codec/${flavor}/preimages_extrinsic`, runPreimagesExtrinsicTest, [spec]).fromJson( preimagesExtrinsicFromJson, ), runner(`codec/${flavor}/refine_context`, runRefineContextTest, [spec]).fromJson(refineContextFromJson), - runner(`codec/${flavor}/tickets_extrinsic`, runTicketsExtrinsicTest, [spec]).fromJson( - ticketsExtrinsicFromJson(spec), - ), + runner(`codec/${flavor}/tickets_extrinsic`, runTicketsExtrinsicTest, [spec]).fromJson(ticketsExtrinsicFromJson), runner(`codec/${flavor}/work_item`, runWorkItemTest, [spec]).fromJson(workItemFromJson), runner(`codec/${flavor}/work_package`, runWorkPackageTest, [spec]).fromJson(workPackageFromJson), runner(`codec/${flavor}/work_report`, runWorkReportTest, [spec]).fromJson(workReportFromJson), diff --git a/bin/test-runner/w3f/safrole.ts b/bin/test-runner/w3f/safrole.ts index d7878322e..33897067b 100644 --- a/bin/test-runner/w3f/safrole.ts +++ b/bin/test-runner/w3f/safrole.ts @@ -61,20 +61,18 @@ export enum TestErrorCode { } class JsonState { - static fromJson(spec: ChainSpec): FromJson { - return { - tau: "number", - eta: json.array(fromJson.bytes32()), - lambda: json.array(validatorDataFromJson), - kappa: json.array(validatorDataFromJson), - gamma_k: json.array(validatorDataFromJson), - iota: json.array(validatorDataFromJson), - gamma_a: json.array(ticketFromJson(spec)), - gamma_s: TicketsOrKeys.fromJson(spec), - gamma_z: json.fromString((v) => Bytes.parseBytes(v, BANDERSNATCH_RING_ROOT_BYTES).asOpaque()), - post_offenders: json.array(fromJson.bytes32()), - }; - } + static fromJson: FromJson = { + tau: "number", + eta: json.array(fromJson.bytes32()), + lambda: json.array(validatorDataFromJson), + kappa: json.array(validatorDataFromJson), + gamma_k: json.array(validatorDataFromJson), + iota: json.array(validatorDataFromJson), + gamma_a: json.array(ticketFromJson), + gamma_s: TicketsOrKeys.fromJson(), + gamma_z: json.fromString((v) => Bytes.parseBytes(v, BANDERSNATCH_RING_ROOT_BYTES).asOpaque()), + post_offenders: json.array(fromJson.bytes32()), + }; // timeslot tau!: TimeSlot; // entropy @@ -124,23 +122,19 @@ export class EpochMark { } export class OkOutput { - static fromJson(spec: ChainSpec): FromJson { - return { - epoch_mark: json.optional(EpochMark.fromJson), - tickets_mark: json.optional(json.array(ticketFromJson(spec))), - }; - } + static fromJson: FromJson = { + epoch_mark: json.optional(EpochMark.fromJson), + tickets_mark: json.optional(json.array(ticketFromJson)), + }; epoch_mark?: EpochMark | null; tickets_mark?: Ticket[] | null; } export class Output { - static fromJson(spec: ChainSpec): FromJson { - return { - ok: json.optional(OkOutput.fromJson(spec)), - err: json.optional("string"), - }; - } + static fromJson: FromJson = { + ok: json.optional(OkOutput.fromJson), + err: json.optional("string"), + }; ok?: OkOutput; err?: TestErrorCode; @@ -202,14 +196,12 @@ class TestInput { } export class SafroleTest { - static fromJson(spec: ChainSpec): FromJson { - return { - input: TestInput.fromJson, - pre_state: JsonState.fromJson(spec), - output: Output.fromJson(spec), - post_state: JsonState.fromJson(spec), - }; - } + static fromJson: FromJson = { + input: TestInput.fromJson, + pre_state: JsonState.fromJson, + output: Output.fromJson, + post_state: JsonState.fromJson, + }; input!: TestInput; pre_state!: JsonState; diff --git a/package-lock.json b/package-lock.json index c1aea339e..18ae8ed29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5667,9 +5667,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, diff --git a/packages/jam/block-json/block.ts b/packages/jam/block-json/block.ts index 1f026cdfe..524ce0374 100644 --- a/packages/jam/block-json/block.ts +++ b/packages/jam/block-json/block.ts @@ -7,7 +7,7 @@ import { headerFromJson } from "./header.js"; export const blockFromJson = (spec: ChainSpec) => json.object( { - header: headerFromJson(spec), + header: headerFromJson, extrinsic: getExtrinsicFromJson(spec), }, ({ header, extrinsic }) => Block.create({ header, extrinsic }), diff --git a/packages/jam/block-json/common.ts b/packages/jam/block-json/common.ts index 1f64e3e0d..61ab55315 100644 --- a/packages/jam/block-json/common.ts +++ b/packages/jam/block-json/common.ts @@ -1,6 +1,5 @@ import { type TicketAttempt, tryAsTicketAttempt } from "@typeberry/block/tickets.js"; import { Bytes, BytesBlob } from "@typeberry/bytes"; -import type { ChainSpec } from "@typeberry/config"; import type { Ed25519Signature } from "@typeberry/crypto"; import { type FromJson, json } from "@typeberry/json-parser"; @@ -22,10 +21,9 @@ export namespace fromJson { export const ed25519Signature = json.fromString((v) => Bytes.parseBytes(v, 64).asOpaque()); - export const ticketAttempt = (spec: ChainSpec) => - json.fromNumber((v) => { - return tryAsTicketAttempt(v, spec); - }) as FromJson; + export const ticketAttempt = json.fromNumber((v) => { + return tryAsTicketAttempt(v); + }) as FromJson; export const uint8Array = json.fromAny((v) => { if (Array.isArray(v)) { diff --git a/packages/jam/block-json/extrinsic.ts b/packages/jam/block-json/extrinsic.ts index 9d8180b51..3157cdf29 100644 --- a/packages/jam/block-json/extrinsic.ts +++ b/packages/jam/block-json/extrinsic.ts @@ -11,7 +11,7 @@ import { ticketsExtrinsicFromJson } from "./tickets-extrinsic.js"; export const getExtrinsicFromJson = (ctx: ChainSpec) => json.object( { - tickets: ticketsExtrinsicFromJson(ctx), + tickets: ticketsExtrinsicFromJson, preimages: preimagesExtrinsicFromJson, guarantees: guaranteesExtrinsicFromJson, assurances: getAssurancesExtrinsicFromJson(ctx), diff --git a/packages/jam/block-json/header.ts b/packages/jam/block-json/header.ts index 78ff2d2f1..7b87ee342 100644 --- a/packages/jam/block-json/header.ts +++ b/packages/jam/block-json/header.ts @@ -13,7 +13,6 @@ import { } from "@typeberry/block"; import { Ticket } from "@typeberry/block/tickets.js"; import { Bytes } from "@typeberry/bytes"; -import type { ChainSpec } from "@typeberry/config"; import type { BandersnatchKey, Ed25519Key } from "@typeberry/crypto"; import type { BandersnatchVrfSignature } from "@typeberry/crypto/bandersnatch.js"; import { json } from "@typeberry/json-parser"; @@ -58,57 +57,55 @@ type JsonHeader = { seal: BandersnatchVrfSignature; }; -export const headerFromJson = (spec: ChainSpec) => { - const ticket = json.object( - { - id: fromJson.bytes32(), - attempt: fromJson.ticketAttempt(spec), - }, - (x) => Ticket.create({ id: x.id, attempt: x.attempt }), - ); +const ticket = json.object( + { + id: fromJson.bytes32(), + attempt: fromJson.ticketAttempt, + }, + (x) => Ticket.create({ id: x.id, attempt: x.attempt }), +); - return json.object( - { - parent: fromJson.bytes32(), - parent_state_root: fromJson.bytes32(), - extrinsic_hash: fromJson.bytes32(), - slot: "number", - epoch_mark: json.optional(epochMark), - tickets_mark: json.optional(json.array(ticket)), - offenders_mark: json.array(fromJson.bytes32()), - author_index: "number", - entropy_source: bandersnatchVrfSignature, - seal: bandersnatchVrfSignature, - }, - ({ - parent, - parent_state_root, - extrinsic_hash, - slot, - epoch_mark, - tickets_mark, - offenders_mark, - author_index, - entropy_source, +export const headerFromJson = json.object( + { + parent: fromJson.bytes32(), + parent_state_root: fromJson.bytes32(), + extrinsic_hash: fromJson.bytes32(), + slot: "number", + epoch_mark: json.optional(epochMark), + tickets_mark: json.optional(json.array(ticket)), + offenders_mark: json.array(fromJson.bytes32()), + author_index: "number", + entropy_source: bandersnatchVrfSignature, + seal: bandersnatchVrfSignature, + }, + ({ + parent, + parent_state_root, + extrinsic_hash, + slot, + epoch_mark, + tickets_mark, + offenders_mark, + author_index, + entropy_source, + seal, + }) => { + const epochMarker = epoch_mark ?? null; + const ticketsMarker = + tickets_mark === undefined || tickets_mark === null + ? null + : TicketsMarker.create({ tickets: asOpaqueType(tickets_mark) }); + return Header.create({ + parentHeaderHash: parent, + priorStateRoot: parent_state_root, + extrinsicHash: extrinsic_hash, + timeSlotIndex: slot, + epochMarker, + ticketsMarker, + offendersMarker: offenders_mark, + bandersnatchBlockAuthorIndex: author_index, + entropySource: entropy_source, seal, - }) => { - const epochMarker = epoch_mark ?? null; - const ticketsMarker = - tickets_mark === undefined || tickets_mark === null - ? null - : TicketsMarker.create({ tickets: asOpaqueType(tickets_mark) }); - return Header.create({ - parentHeaderHash: parent, - priorStateRoot: parent_state_root, - extrinsicHash: extrinsic_hash, - timeSlotIndex: slot, - epochMarker, - ticketsMarker, - offendersMarker: offenders_mark, - bandersnatchBlockAuthorIndex: author_index, - entropySource: entropy_source, - seal, - }); - }, - ); -}; + }); + }, +); diff --git a/packages/jam/block-json/tickets-extrinsic.ts b/packages/jam/block-json/tickets-extrinsic.ts index 58fc4838b..ffbdd9985 100644 --- a/packages/jam/block-json/tickets-extrinsic.ts +++ b/packages/jam/block-json/tickets-extrinsic.ts @@ -1,18 +1,15 @@ import { SignedTicket } from "@typeberry/block/tickets.js"; import { Bytes } from "@typeberry/bytes"; -import type { ChainSpec } from "@typeberry/config"; import { BANDERSNATCH_PROOF_BYTES } from "@typeberry/crypto/bandersnatch.js"; import { json } from "@typeberry/json-parser"; import { fromJson } from "./common.js"; -export const ticketsExtrinsicFromJson = (spec: ChainSpec) => { - const ticketEnvelopeFromJson = json.object( - { - attempt: fromJson.ticketAttempt(spec), - signature: json.fromString((v) => Bytes.parseBytes(v, BANDERSNATCH_PROOF_BYTES).asOpaque()), - }, - (x) => SignedTicket.create({ attempt: x.attempt, signature: x.signature }), - ); +const ticketEnvelopeFromJson = json.object( + { + attempt: fromJson.ticketAttempt, + signature: json.fromString((v) => Bytes.parseBytes(v, BANDERSNATCH_PROOF_BYTES).asOpaque()), + }, + (x) => SignedTicket.create({ attempt: x.attempt, signature: x.signature }), +); - return json.array(ticketEnvelopeFromJson); -}; +export const ticketsExtrinsicFromJson = json.array(ticketEnvelopeFromJson); diff --git a/packages/jam/block-json/work-result.ts b/packages/jam/block-json/work-result.ts index 3c80c0059..aa04ead88 100644 --- a/packages/jam/block-json/work-result.ts +++ b/packages/jam/block-json/work-result.ts @@ -58,7 +58,7 @@ type JsonWorkExecResult = { const workRefineLoadFromJson = json.object( { - gas_used: json.fromNumber((x) => tryAsServiceGas(x)), + gas_used: json.fromBigInt((x) => tryAsServiceGas(x)), imports: "number", extrinsic_count: "number", extrinsic_size: "number", @@ -66,7 +66,7 @@ const workRefineLoadFromJson = json.object( }, ({ gas_used, imports, extrinsic_count, extrinsic_size, exports }) => WorkRefineLoad.create({ - gasUsed: tryAsServiceGas(gas_used), + gasUsed: gas_used, importedSegments: tryAsU32(imports), extrinsicCount: tryAsU32(extrinsic_count), extrinsicSize: tryAsU32(extrinsic_size), diff --git a/packages/jam/block/tickets.ts b/packages/jam/block/tickets.ts index 3ea537bf4..dba83be97 100644 --- a/packages/jam/block/tickets.ts +++ b/packages/jam/block/tickets.ts @@ -1,7 +1,6 @@ import type { Bytes } from "@typeberry/bytes"; import { type CodecRecord, codec } from "@typeberry/codec"; import type { KnownSizeArray } from "@typeberry/collections"; -import type { ChainSpec } from "@typeberry/config"; import { BANDERSNATCH_PROOF_BYTES, type BandersnatchProof } from "@typeberry/crypto/bandersnatch.js"; import { HASH_SIZE } from "@typeberry/hash"; import { tryAsU8, tryAsU32, type U8 } from "@typeberry/numbers"; @@ -14,23 +13,15 @@ import { codecKnownSizeArray, codecWithContext } from "./codec-utils.js"; * Constrained by `N = 2`: * https://graypaper.fluffylabs.dev/#/579bd12/417200417400 */ -export type TicketAttempt = Opaque; -export function tryAsTicketAttempt(x: number, chainSpec: ChainSpec): TicketAttempt { - if (x >= chainSpec.ticketsPerValidator) { - throw new Error(`Ticket attempt ${x} is out of bounds [0, ${chainSpec.ticketsPerValidator})`); - } +export type TicketAttempt = Opaque; +export function tryAsTicketAttempt(x: number): TicketAttempt { return asOpaqueType(tryAsU8(x)); } -const ticketAttemptCodec = codecWithContext((context) => { - return codec.varU32.convert( - (x) => { - tryAsTicketAttempt(x, context); - return tryAsU32(x); - }, - (x) => tryAsTicketAttempt(x, context), - ); -}); +const ticketAttemptCodec = codec.varU32.convert( + (x) => tryAsU32(x), + (x) => tryAsTicketAttempt(x), +); /* Bandersnatch-signed ticket contest entry. */ export class SignedTicket extends WithDebug { diff --git a/packages/jam/block/work-package.ts b/packages/jam/block/work-package.ts index 6fee24567..1423e5946 100644 --- a/packages/jam/block/work-package.ts +++ b/packages/jam/block/work-package.ts @@ -3,7 +3,7 @@ import { type CodecRecord, codec, type DescribedBy } from "@typeberry/codec"; import { FixedSizeArray } from "@typeberry/collections"; import { HASH_SIZE } from "@typeberry/hash"; import { tryAsU8, type U8 } from "@typeberry/numbers"; -import { check, WithDebug } from "@typeberry/utils"; +import { WithDebug } from "@typeberry/utils"; import type { ServiceId } from "./common.js"; import type { CodeHash } from "./hash.js"; import { RefineContext } from "./refine-context.js"; @@ -13,12 +13,8 @@ import { WorkItem } from "./work-item.js"; /** Constrained by I=16 https://graypaper.fluffylabs.dev/#/68eaa1f/417a00417a00?v=0.6.4 */ export type WorkItemsCount = U8; -/** Convert the value to `WorkItemsCount` bounds. */ +/** Convert the value to `WorkItemsCount`. Validation is done at runtime by `isWorkItemsCount`. */ export function tryAsWorkItemsCount(len: number): WorkItemsCount { - check` - ${isWorkItemsCount(len)} - WorkItemsCount: Expected '${MIN_NUMBER_OF_WORK_ITEMS} <= count <= ${MAX_NUMBER_OF_WORK_ITEMS}' got ${len} - `; return tryAsU8(len); } diff --git a/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.test.ts b/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.test.ts index 9a867da0c..9c35be276 100644 --- a/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.test.ts +++ b/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.test.ts @@ -15,7 +15,7 @@ import { testClientServer } from "./test-utils.js"; const TEST_EPOCH = tryAsEpoch(1); const TEST_TICKET = SignedTicket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), }); diff --git a/packages/jam/jamnp-s/tasks/ticket-distribution.test.ts b/packages/jam/jamnp-s/tasks/ticket-distribution.test.ts index 1eb670304..703e6e015 100644 --- a/packages/jam/jamnp-s/tasks/ticket-distribution.test.ts +++ b/packages/jam/jamnp-s/tasks/ticket-distribution.test.ts @@ -24,7 +24,7 @@ function createTestTicket(attempt: number, signatureByte = 0): SignedTicket { signatureBytes.raw[0] = attempt; signatureBytes.raw[1] = signatureByte; return SignedTicket.create({ - attempt: tryAsTicketAttempt(attempt, tinyChainSpec), + attempt: tryAsTicketAttempt(attempt), signature: signatureBytes.asOpaque(), }); } diff --git a/packages/jam/safrole/bandersnatch-vrf.test.ts b/packages/jam/safrole/bandersnatch-vrf.test.ts index 4f5a38cea..5618fdfda 100644 --- a/packages/jam/safrole/bandersnatch-vrf.test.ts +++ b/packages/jam/safrole/bandersnatch-vrf.test.ts @@ -5,7 +5,6 @@ import { tryAsValidatorIndex } from "@typeberry/block"; import { type SignedTicket, tryAsTicketAttempt } from "@typeberry/block/tickets.js"; import { Bytes, BytesBlob } from "@typeberry/bytes"; import { asKnownSize } from "@typeberry/collections"; -import { tinyChainSpec } from "@typeberry/config"; import { BANDERSNATCH_KEY_BYTES, SEED_SIZE } from "@typeberry/crypto"; import { BANDERSNATCH_PROOF_BYTES, @@ -22,7 +21,7 @@ import { BandernsatchWasm } from "./bandersnatch-wasm.js"; const bandersnatchWasm = BandernsatchWasm.new(); -const attempt = (v: number) => tryAsTicketAttempt(v, tinyChainSpec); +const attempt = (v: number) => tryAsTicketAttempt(v); describe("Bandersnatch verification", () => { describe("getRingCommitment", () => { @@ -311,8 +310,7 @@ describe("Bandersnatch verification", () => { proverIndex, secrets[proverIndex], entropy, - tryAsTicketAttempt(2, tinyChainSpec), - tinyChainSpec, + 2, ); assert.ok(genResult.isOk); diff --git a/packages/jam/safrole/bandersnatch-vrf.ts b/packages/jam/safrole/bandersnatch-vrf.ts index c662d4b76..6668463d0 100644 --- a/packages/jam/safrole/bandersnatch-vrf.ts +++ b/packages/jam/safrole/bandersnatch-vrf.ts @@ -1,7 +1,6 @@ import type { EntropyHash } from "@typeberry/block"; import { SignedTicket, tryAsTicketAttempt } from "@typeberry/block/tickets.js"; import { Bytes, BytesBlob } from "@typeberry/bytes"; -import type { ChainSpec } from "@typeberry/config"; import type { BandersnatchKey, BandersnatchSecretSeed } from "@typeberry/crypto"; import { BANDERSNATCH_PROOF_BYTES, @@ -213,7 +212,6 @@ async function generateTickets( key: BandersnatchSecretSeed, entropy: EntropyHash, ticketsPerValidator: number, - chainSpec: ChainSpec, ): Promise> { // Build VRF inputs: JAM_TICKET_SEAL || entropy || attempt_byte for each attempt const vrfInputParts: Uint8Array[] = []; @@ -249,7 +247,7 @@ async function generateTickets( tickets.push( SignedTicket.create({ - attempt: tryAsTicketAttempt(attempt, chainSpec), + attempt: tryAsTicketAttempt(attempt), signature, }), ); diff --git a/packages/jam/safrole/safrole.test.ts b/packages/jam/safrole/safrole.test.ts index 5d39dd8bc..dccd4dfca 100644 --- a/packages/jam/safrole/safrole.test.ts +++ b/packages/jam/safrole/safrole.test.ts @@ -160,19 +160,12 @@ describe("Safrole", () => { const timeslot = tryAsTimeSlot(2); const entropy: EntropyHash = Bytes.zero(HASH_SIZE).asOpaque(); - let extrinsic: TicketsExtrinsic; - try { - extrinsic = asKnownSize([ - { - attempt: tryAsTicketAttempt(tinyChainSpec.ticketsPerValidator + 2, tinyChainSpec), - signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), - }, - ]); - } catch { - // Expected: invalid ticket attempt throws during creation - // Skip this test as the validation now happens earlier - return; - } + const extrinsic: TicketsExtrinsic = asKnownSize([ + { + attempt: tryAsTicketAttempt(tinyChainSpec.ticketsPerValidator + 2), + signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), + }, + ]); const input = { slot: timeslot, @@ -220,7 +213,7 @@ describe("Safrole", () => { const entropy: EntropyHash = Bytes.zero(HASH_SIZE).asOpaque(); const extrinsic: TicketsExtrinsic = asKnownSize([ { - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), }, ]); @@ -274,11 +267,11 @@ describe("Safrole", () => { const entropy: EntropyHash = Bytes.zero(HASH_SIZE).asOpaque(); const extrinsic: TicketsExtrinsic = asKnownSize([ { - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), }, { - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), }, ]); @@ -332,11 +325,11 @@ describe("Safrole", () => { const entropy: EntropyHash = Bytes.zero(HASH_SIZE).asOpaque(); const extrinsic: TicketsExtrinsic = asKnownSize([ { - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.fill(BANDERSNATCH_PROOF_BYTES, 1).asOpaque(), }, { - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), }, ]); @@ -378,51 +371,51 @@ describe("Safrole", () => { nextValidatorData: validators, ticketsAccumulator: asKnownSize([ Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 1), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 2), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 3), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 4), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 5), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 6), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 7), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 8), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 9), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 10), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 11), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 12), }), ]), @@ -437,51 +430,51 @@ describe("Safrole", () => { const tickets = asKnownSize([ Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 1), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 12), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 2), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 11), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 3), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 10), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 4), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 9), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 5), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 8), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 6), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 7), }), ]); @@ -503,51 +496,51 @@ describe("Safrole", () => { TicketsMarker.create({ tickets: asKnownSize([ Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 1), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 12), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 2), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 11), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 3), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 10), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 4), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 9), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 5), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 8), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 6), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 7), }), ]), @@ -581,7 +574,7 @@ describe("Safrole", () => { const entropy: EntropyHash = Bytes.zero(HASH_SIZE).asOpaque(); const extrinsic: TicketsExtrinsic = asKnownSize([ { - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), signature: Bytes.zero(BANDERSNATCH_PROOF_BYTES).asOpaque(), }, ]); @@ -724,51 +717,51 @@ describe("Safrole", () => { nextValidatorData: validators, ticketsAccumulator: asKnownSize([ Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 1), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 2), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 3), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 4), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 5), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 6), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 7), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 8), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 9), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 10), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 11), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 12), }), ]), @@ -825,51 +818,51 @@ describe("Safrole", () => { const tickets = tryAsPerEpochBlock( [ Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 1), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 2), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 3), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 4), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 5), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 6), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 7), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 8), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 9), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 10), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 11), }), Ticket.create({ - attempt: tryAsTicketAttempt(0, tinyChainSpec), + attempt: tryAsTicketAttempt(0), id: Bytes.fill(HASH_SIZE, 12), }), ], diff --git a/packages/jam/state-json/dump.ts b/packages/jam/state-json/dump.ts index 90e2202b2..2cba652e9 100644 --- a/packages/jam/state-json/dump.ts +++ b/packages/jam/state-json/dump.ts @@ -68,8 +68,8 @@ export const fullStateDumpFromJson = (spec: ChainSpec) => beta: json.nullable(recentBlocksHistoryFromJson), gamma: { gamma_k: json.array(validatorDataFromJson), - gamma_a: json.array(ticketFromJson(spec)), - gamma_s: TicketsOrKeys.fromJson(spec), + gamma_a: json.array(ticketFromJson), + gamma_s: TicketsOrKeys.fromJson(), gamma_z: json.fromString((v) => Bytes.parseBytes(v, BANDERSNATCH_RING_ROOT_BYTES).asOpaque()), }, psi: disputesRecordsFromJson, diff --git a/packages/jam/state-json/safrole.ts b/packages/jam/state-json/safrole.ts index a7fc70003..776da8975 100644 --- a/packages/jam/state-json/safrole.ts +++ b/packages/jam/state-json/safrole.ts @@ -6,20 +6,19 @@ import type { BandersnatchKey } from "@typeberry/crypto"; import { type FromJson, json } from "@typeberry/json-parser"; import { type SafroleSealingKeys, SafroleSealingKeysData } from "@typeberry/state"; -export const ticketFromJson = (spec: ChainSpec): FromJson => - json.object( - { - id: fromJson.bytes32(), - attempt: fromJson.ticketAttempt(spec), - }, - Ticket.create, - ); +export const ticketFromJson: FromJson = json.object( + { + id: fromJson.bytes32(), + attempt: fromJson.ticketAttempt, + }, + Ticket.create, +); export class TicketsOrKeys { - static fromJson(spec: ChainSpec): FromJson { + static fromJson(): FromJson { return { keys: json.optional(json.array(fromJson.bytes32())), - tickets: json.optional(json.array(ticketFromJson(spec))), + tickets: json.optional(json.array(ticketFromJson)), }; } diff --git a/packages/jam/state-vectors/index.ts b/packages/jam/state-vectors/index.ts index b5c981f78..fc462a87e 100644 --- a/packages/jam/state-vectors/index.ts +++ b/packages/jam/state-vectors/index.ts @@ -2,7 +2,7 @@ import { Block, type BlockView, Header, type StateRootHash } from "@typeberry/bl import { blockViewFromJson, fromJson, headerFromJson } from "@typeberry/block-json"; import type { BytesBlob } from "@typeberry/bytes"; import { codec } from "@typeberry/codec"; -import { type ChainSpec, tinyChainSpec } from "@typeberry/config"; +import { tinyChainSpec } from "@typeberry/config"; import { HASH_SIZE, TRUNCATED_HASH_SIZE, type TruncatedHash } from "@typeberry/hash"; import { type FromJson, json } from "@typeberry/json-parser"; @@ -36,12 +36,10 @@ export class TestState { } export class StateTransitionGenesis { - static fromJson(spec: ChainSpec = tinyChainSpec): FromJson { - return { - header: headerFromJson(spec), - state: TestState.fromJson, - }; - } + static fromJson: FromJson = { + header: headerFromJson, + state: TestState.fromJson, + }; static Codec = codec.object({ header: Header.Codec, diff --git a/packages/jam/state/test.utils.ts b/packages/jam/state/test.utils.ts index 02f9b9890..a5dd831c0 100644 --- a/packages/jam/state/test.utils.ts +++ b/packages/jam/state/test.utils.ts @@ -360,7 +360,7 @@ export const testState = (): InMemoryState => { const emptyHash = () => b32("0x0000000000000000000000000000000000000000000000000000000000000000"); const testAuth = () => b32("0x0b27478648cd19b4f812f897a26976ecf312eac28508b4368d0c63ea949c7cb0"); -const attempt = (x: number) => tryAsTicketAttempt(x, spec); +const attempt = (x: number) => tryAsTicketAttempt(x); const b32 = (s: string) => Bytes.parseBytes(s, HASH_SIZE).asOpaque(); const repeat = (len: number, factory: () => T) => Array.from({ length: len }, factory); diff --git a/packages/jam/transition/hasher.test.ts b/packages/jam/transition/hasher.test.ts index 31ea93282..c7fc730a7 100644 --- a/packages/jam/transition/hasher.test.ts +++ b/packages/jam/transition/hasher.test.ts @@ -53,7 +53,7 @@ describe("TransitionHasher", () => { function prepareTickets() { return rawTickets.map(({ attempt, signature }) => SignedTicket.create({ - attempt: tryAsTicketAttempt(attempt, tinyChainSpec), + attempt: tryAsTicketAttempt(attempt), signature: Bytes.parseBytes(signature, BANDERSNATCH_PROOF_BYTES).asOpaque(), }), ); diff --git a/packages/workers/block-authorship/main.ts b/packages/workers/block-authorship/main.ts index 5708e62e4..d29624bdc 100644 --- a/packages/workers/block-authorship/main.ts +++ b/packages/workers/block-authorship/main.ts @@ -238,7 +238,6 @@ export async function main(config: Config, comms: GeneratorInternal, networkingC validatorKeys, ticketEntropy, chainSpec.ticketsPerValidator, - chainSpec, ); if (ticketsResult.isError) { diff --git a/packages/workers/block-authorship/ticket-generator.test.ts b/packages/workers/block-authorship/ticket-generator.test.ts index 9f9031693..e2fa2aa55 100644 --- a/packages/workers/block-authorship/ticket-generator.test.ts +++ b/packages/workers/block-authorship/ticket-generator.test.ts @@ -2,7 +2,6 @@ import assert from "node:assert"; import { afterEach, beforeEach, describe, it, mock } from "node:test"; import { type SignedTicket, tryAsTicketAttempt } from "@typeberry/block/tickets.js"; import { Bytes } from "@typeberry/bytes"; -import { tinyChainSpec } from "@typeberry/config"; import { BANDERSNATCH_KEY_BYTES, initWasm, SEED_SIZE } from "@typeberry/crypto"; import { HASH_SIZE } from "@typeberry/hash"; import bandersnatchVrf from "@typeberry/safrole/bandersnatch-vrf.js"; @@ -42,7 +41,7 @@ describe("Ticket Generator", () => { const tickets: SignedTicket[] = []; for (let attempt = 0; attempt < ticketsPerValidator; attempt++) { tickets.push({ - attempt: tryAsTicketAttempt(attempt, tinyChainSpec), + attempt: tryAsTicketAttempt(attempt), signature: Bytes.zero(784).asOpaque(), } as SignedTicket); } @@ -67,7 +66,6 @@ describe("Ticket Generator", () => { validatorKeys, MOCK_ENTROPY, ticketsPerValidator, - tinyChainSpec, ); assert.ok(result.isOk); @@ -85,29 +83,21 @@ describe("Ticket Generator", () => { validatorKeys, MOCK_ENTROPY, ticketsPerValidator, - tinyChainSpec, ); assert.ok(result.isOk); const tickets = result.ok; - assert.strictEqual(tickets[0].attempt, tryAsTicketAttempt(0, tinyChainSpec)); - assert.strictEqual(tickets[1].attempt, tryAsTicketAttempt(1, tinyChainSpec)); - assert.strictEqual(tickets[2].attempt, tryAsTicketAttempt(0, tinyChainSpec)); - assert.strictEqual(tickets[3].attempt, tryAsTicketAttempt(1, tinyChainSpec)); + assert.strictEqual(tickets[0].attempt, tryAsTicketAttempt(0)); + assert.strictEqual(tickets[1].attempt, tryAsTicketAttempt(1)); + assert.strictEqual(tickets[2].attempt, tryAsTicketAttempt(0)); + assert.strictEqual(tickets[3].attempt, tryAsTicketAttempt(1)); }); it("should return empty array for no validator keys", async () => { const ringKeys = createMockRingKeys(3); const ticketsPerValidator = 2; - const result = await generateTickets( - MOCK_BANDERSNATCH, - ringKeys, - [], - MOCK_ENTROPY, - ticketsPerValidator, - tinyChainSpec, - ); + const result = await generateTickets(MOCK_BANDERSNATCH, ringKeys, [], MOCK_ENTROPY, ticketsPerValidator); assert.ok(result.isOk); assert.strictEqual(result.ok.length, 0); @@ -131,7 +121,6 @@ describe("Ticket Generator", () => { validatorKeys, MOCK_ENTROPY, ticketsPerValidator, - tinyChainSpec, ); assert.ok(result.isOk); @@ -159,7 +148,6 @@ describe("Ticket Generator", () => { invalidValidatorKeys, MOCK_ENTROPY, ticketsPerValidator, - tinyChainSpec, ); assert.ok(result.isError); diff --git a/packages/workers/block-authorship/ticket-generator.ts b/packages/workers/block-authorship/ticket-generator.ts index 871ef51f7..bbee0f5a7 100644 --- a/packages/workers/block-authorship/ticket-generator.ts +++ b/packages/workers/block-authorship/ticket-generator.ts @@ -1,6 +1,5 @@ import type { EntropyHash } from "@typeberry/block"; import type { SignedTicket } from "@typeberry/block/tickets.js"; -import type { ChainSpec } from "@typeberry/config"; import type { BandersnatchKey, BandersnatchSecretSeed } from "@typeberry/crypto"; import { Logger } from "@typeberry/logger"; import bandersnatchVrf from "@typeberry/safrole/bandersnatch-vrf.js"; @@ -31,7 +30,6 @@ export async function generateTickets( validatorKeys: ValidatorKey[], entropy: EntropyHash, ticketsPerValidator: number, - chainSpec: ChainSpec, ): Promise> { const allTickets: SignedTicket[] = []; @@ -49,7 +47,6 @@ export async function generateTickets( validatorKey.secret, entropy, ticketsPerValidator, - chainSpec, ); if (ticketResult.isOk) {