From 549ead9ac5bacfee3edcdc542c41d20c08475ee5 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 09:33:59 +0000 Subject: [PATCH 01/11] feat: add keymanager endpoint to retrieve proposer config --- packages/api/src/keymanager/routes.ts | 33 +++++++++++++++++++ packages/api/test/unit/keymanager/testData.ts | 15 +++++++++ .../cli/src/cmds/validator/keymanager/impl.ts | 4 +++ 3 files changed, 52 insertions(+) diff --git a/packages/api/src/keymanager/routes.ts b/packages/api/src/keymanager/routes.ts index 0db096d14e83..f91beccce804 100644 --- a/packages/api/src/keymanager/routes.ts +++ b/packages/api/src/keymanager/routes.ts @@ -109,6 +109,17 @@ export type SignerDefinition = { export type RemoteSignerDefinition = Pick; +export type ProposerConfig = { + graffiti?: string; + strictFeeRecipientCheck?: boolean; + feeRecipient?: string; + builder?: { + gasLimit?: number; + selection?: string; + boostFactor?: bigint; + }; +}; + /** * JSON serialized representation of a single keystore in EIP-2335: BLS12-381 Keystore format. * ``` @@ -356,6 +367,15 @@ export type Endpoints = { EmptyMeta >; + getProposerConfig: Endpoint< + // ⏎ + "GET", + {pubkey: PubkeyHex}, + {params: {pubkey: string}}, + ProposerConfig, + EmptyMeta + >; + /** * Create a signed voluntary exit message for an active validator, identified by a public key known to the validator * client. This endpoint returns a `SignedVoluntaryExit` object, which can be used to initiate voluntary exit via the @@ -635,6 +655,19 @@ export function getDefinitions(_config: ChainForkConfig): RouteDefinitions ({params: {pubkey}}), + parseReq: ({params: {pubkey}}) => ({pubkey}), + schema: { + params: {pubkey: Schema.StringRequired}, + }, + }, + resp: JsonOnlyResponseCodec, + }, + signVoluntaryExit: { url: "/eth/v1/validator/{pubkey}/voluntary_exit", method: "POST", diff --git a/packages/api/test/unit/keymanager/testData.ts b/packages/api/test/unit/keymanager/testData.ts index bd37798c4685..d9eb4eaa0da1 100644 --- a/packages/api/test/unit/keymanager/testData.ts +++ b/packages/api/test/unit/keymanager/testData.ts @@ -112,4 +112,19 @@ export const testData: GenericServerTestCases = { args: {pubkey: pubkeyRand}, res: undefined, }, + getProposerConfig: { + args: {pubkey: pubkeyRand}, + res: { + data: { + graffiti: "graffiti", + strictFeeRecipientCheck: false, + feeRecipient: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + builder: { + gasLimit: 30000000, + selection: "maxprofit", + boostFactor: BigInt(50), + }, + }, + }, + }, }; diff --git a/packages/cli/src/cmds/validator/keymanager/impl.ts b/packages/cli/src/cmds/validator/keymanager/impl.ts index b4233f3162cd..550640cc1c7e 100644 --- a/packages/cli/src/cmds/validator/keymanager/impl.ts +++ b/packages/cli/src/cmds/validator/keymanager/impl.ts @@ -364,6 +364,10 @@ export class KeymanagerApi implements Api { return {status: 204}; } + async getProposerConfig({pubkey}: {pubkey: PubkeyHex}): ReturnType { + return {data: this.validator.validatorStore.getProposerConfig(pubkey) ?? {}}; + } + async signVoluntaryExit({pubkey, epoch}: {pubkey: PubkeyHex; epoch?: Epoch}): ReturnType { if (!isValidatePubkeyHex(pubkey)) { throw new ApiError(400, `Invalid pubkey ${pubkey}`); From 005ee4c4b216380e9d455654511afbb503f8319b Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 10:00:44 +0000 Subject: [PATCH 02/11] Do not return empty builder config --- packages/cli/src/util/proposerConfig.ts | 13 ++++++++----- packages/validator/src/services/validatorStore.ts | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/util/proposerConfig.ts b/packages/cli/src/util/proposerConfig.ts index 2c12ce8f8524..dabf137dabb9 100644 --- a/packages/cli/src/util/proposerConfig.ts +++ b/packages/cli/src/util/proposerConfig.ts @@ -6,6 +6,7 @@ import {routes} from "@lodestar/api"; import {parseFeeRecipient} from "./feeRecipient.js"; import {readFile} from "./file.js"; +import {isEmptyObject} from "@lodestar/utils"; type ProposerConfig = ValidatorProposerConfig["defaultConfig"]; @@ -88,11 +89,13 @@ function parseProposerConfigSection( overrideConfig?.strictFeeRecipientCheck ?? (strict_fee_recipient_check ? stringtoBool(strict_fee_recipient_check) : undefined), feeRecipient: overrideConfig?.feeRecipient ?? (fee_recipient ? parseFeeRecipient(fee_recipient) : undefined), - builder: { - gasLimit: overrideConfig?.builder?.gasLimit ?? (gas_limit !== undefined ? Number(gas_limit) : undefined), - selection: overrideConfig?.builder?.selection ?? parseBuilderSelection(builderSelection), - boostFactor: overrideConfig?.builder?.boostFactor ?? parseBuilderBoostFactor(boost_factor), - }, + builder: !isEmptyObject(overrideConfig?.builder) + ? { + gasLimit: overrideConfig?.builder?.gasLimit ?? (gas_limit !== undefined ? Number(gas_limit) : undefined), + selection: overrideConfig?.builder?.selection ?? parseBuilderSelection(builderSelection), + boostFactor: overrideConfig?.builder?.boostFactor ?? parseBuilderBoostFactor(boost_factor), + } + : undefined, }; } diff --git a/packages/validator/src/services/validatorStore.ts b/packages/validator/src/services/validatorStore.ts index dfd856b18d13..83653ca35aad 100644 --- a/packages/validator/src/services/validatorStore.ts +++ b/packages/validator/src/services/validatorStore.ts @@ -42,7 +42,7 @@ import { SignedAggregateAndProof, } from "@lodestar/types"; import {routes} from "@lodestar/api"; -import {fromHex, toPubkeyHex, toRootHex} from "@lodestar/utils"; +import {fromHex, isEmptyObject, toPubkeyHex, toRootHex} from "@lodestar/utils"; import {ISlashingProtection} from "../slashingProtection/index.js"; import {PubkeyHex} from "../types.js"; import {externalSignerPostSignature, SignableMessageType, SignableMessage} from "../util/externalSignerClient.js"; @@ -377,7 +377,7 @@ export class ValidatorStore { graffiti !== undefined || strictFeeRecipientCheck !== undefined || feeRecipient !== undefined || - builder?.gasLimit !== undefined + !isEmptyObject(builder) ) { proposerConfig = {graffiti, strictFeeRecipientCheck, feeRecipient, builder}; } From 8169fce64fd63b4b478c110ba7463fd9d8ef01a9 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 10:03:02 +0000 Subject: [PATCH 03/11] Check all builder proposer config values --- packages/cli/src/util/proposerConfig.ts | 2 +- packages/validator/src/services/validatorStore.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/util/proposerConfig.ts b/packages/cli/src/util/proposerConfig.ts index dabf137dabb9..cd0382094622 100644 --- a/packages/cli/src/util/proposerConfig.ts +++ b/packages/cli/src/util/proposerConfig.ts @@ -1,12 +1,12 @@ import fs from "node:fs"; import path from "node:path"; import {ValidatorProposerConfig} from "@lodestar/validator"; +import {isEmptyObject} from "@lodestar/utils"; import {routes} from "@lodestar/api"; import {parseFeeRecipient} from "./feeRecipient.js"; import {readFile} from "./file.js"; -import {isEmptyObject} from "@lodestar/utils"; type ProposerConfig = ValidatorProposerConfig["defaultConfig"]; diff --git a/packages/validator/src/services/validatorStore.ts b/packages/validator/src/services/validatorStore.ts index 83653ca35aad..e59330edd163 100644 --- a/packages/validator/src/services/validatorStore.ts +++ b/packages/validator/src/services/validatorStore.ts @@ -377,7 +377,9 @@ export class ValidatorStore { graffiti !== undefined || strictFeeRecipientCheck !== undefined || feeRecipient !== undefined || - !isEmptyObject(builder) + builder?.gasLimit !== undefined || + builder?.selection !== undefined || + builder?.boostFactor !== undefined ) { proposerConfig = {graffiti, strictFeeRecipientCheck, feeRecipient, builder}; } From 40206ba610c16e5b3d50bac519b9fd2331b6932a Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 10:10:29 +0000 Subject: [PATCH 04/11] Fix settings builder config if undefined --- packages/cli/src/util/proposerConfig.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/cli/src/util/proposerConfig.ts b/packages/cli/src/util/proposerConfig.ts index cd0382094622..06ea3e585536 100644 --- a/packages/cli/src/util/proposerConfig.ts +++ b/packages/cli/src/util/proposerConfig.ts @@ -1,7 +1,6 @@ import fs from "node:fs"; import path from "node:path"; import {ValidatorProposerConfig} from "@lodestar/validator"; -import {isEmptyObject} from "@lodestar/utils"; import {routes} from "@lodestar/api"; import {parseFeeRecipient} from "./feeRecipient.js"; @@ -89,7 +88,7 @@ function parseProposerConfigSection( overrideConfig?.strictFeeRecipientCheck ?? (strict_fee_recipient_check ? stringtoBool(strict_fee_recipient_check) : undefined), feeRecipient: overrideConfig?.feeRecipient ?? (fee_recipient ? parseFeeRecipient(fee_recipient) : undefined), - builder: !isEmptyObject(overrideConfig?.builder) + builder: overrideConfig?.builder ? { gasLimit: overrideConfig?.builder?.gasLimit ?? (gas_limit !== undefined ? Number(gas_limit) : undefined), selection: overrideConfig?.builder?.selection ?? parseBuilderSelection(builderSelection), From e26785c961bf34f3c0a91d7a8ea57936a6bada44 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 10:14:56 +0000 Subject: [PATCH 05/11] Fix builder config parsing --- packages/cli/src/util/proposerConfig.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/util/proposerConfig.ts b/packages/cli/src/util/proposerConfig.ts index 06ea3e585536..4cfa6fa71075 100644 --- a/packages/cli/src/util/proposerConfig.ts +++ b/packages/cli/src/util/proposerConfig.ts @@ -88,13 +88,14 @@ function parseProposerConfigSection( overrideConfig?.strictFeeRecipientCheck ?? (strict_fee_recipient_check ? stringtoBool(strict_fee_recipient_check) : undefined), feeRecipient: overrideConfig?.feeRecipient ?? (fee_recipient ? parseFeeRecipient(fee_recipient) : undefined), - builder: overrideConfig?.builder - ? { - gasLimit: overrideConfig?.builder?.gasLimit ?? (gas_limit !== undefined ? Number(gas_limit) : undefined), - selection: overrideConfig?.builder?.selection ?? parseBuilderSelection(builderSelection), - boostFactor: overrideConfig?.builder?.boostFactor ?? parseBuilderBoostFactor(boost_factor), - } - : undefined, + builder: + overrideConfig?.builder || builder + ? { + gasLimit: overrideConfig?.builder?.gasLimit ?? (gas_limit !== undefined ? Number(gas_limit) : undefined), + selection: overrideConfig?.builder?.selection ?? parseBuilderSelection(builderSelection), + boostFactor: overrideConfig?.builder?.boostFactor ?? parseBuilderBoostFactor(boost_factor), + } + : undefined, }; } From 01fcea702e32e1f97a0aa351b6623d94dc0fbcea Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 10:36:41 +0000 Subject: [PATCH 06/11] Use ssz type to handle json serialization Default parsing can't handle BigInt --- packages/api/src/keymanager/routes.ts | 37 +++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/packages/api/src/keymanager/routes.ts b/packages/api/src/keymanager/routes.ts index f91beccce804..4d04049f9bdd 100644 --- a/packages/api/src/keymanager/routes.ts +++ b/packages/api/src/keymanager/routes.ts @@ -1,7 +1,8 @@ import {ContainerType, ValueOf} from "@chainsafe/ssz"; import {ChainForkConfig} from "@lodestar/config"; import {Epoch, phase0, ssz, stringType} from "@lodestar/types"; -import {Schema, Endpoint, RouteDefinitions} from "../utils/index.js"; +import {RecursivePartial} from "@lodestar/utils"; +import {Schema, Endpoint, RouteDefinitions, ResponseDataCodec} from "../utils/index.js"; import {WireFormat} from "../utils/wireFormat.js"; import { EmptyArgs, @@ -90,11 +91,28 @@ export const BuilderBoostFactorDataType = new ContainerType( }, {jsonCase: "eth2"} ); +export const ProposerConfigType = new ContainerType( + { + graffiti: stringType, + strictFeeRecipientCheck: ssz.Boolean, + feeRecipient: stringType, + builder: new ContainerType( + { + gasLimit: ssz.UintNum64, + selection: stringType, + boostFactor: ssz.UintBn64, + }, + {jsonCase: "eth2"} + ), + }, + {jsonCase: "eth2"} +); export type FeeRecipientData = ValueOf; export type GraffitiData = ValueOf; export type GasLimitData = ValueOf; export type BuilderBoostFactorData = ValueOf; +export type ProposerConfig = RecursivePartial>; export type SignerDefinition = { pubkey: PubkeyHex; @@ -109,17 +127,6 @@ export type SignerDefinition = { export type RemoteSignerDefinition = Pick; -export type ProposerConfig = { - graffiti?: string; - strictFeeRecipientCheck?: boolean; - feeRecipient?: string; - builder?: { - gasLimit?: number; - selection?: string; - boostFactor?: bigint; - }; -}; - /** * JSON serialized representation of a single keystore in EIP-2335: BLS12-381 Keystore format. * ``` @@ -665,7 +672,11 @@ export function getDefinitions(_config: ChainForkConfig): RouteDefinitions, + meta: EmptyMetaCodec, + }, }, signVoluntaryExit: { From 9ae4bd2dd45f1fd19c524dd56df69e81c252f1e9 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 10:39:05 +0000 Subject: [PATCH 07/11] Revert "Use ssz type to handle json serialization" This reverts commit 01fcea702e32e1f97a0aa351b6623d94dc0fbcea. --- packages/api/src/keymanager/routes.ts | 37 ++++++++++----------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/packages/api/src/keymanager/routes.ts b/packages/api/src/keymanager/routes.ts index 4d04049f9bdd..f91beccce804 100644 --- a/packages/api/src/keymanager/routes.ts +++ b/packages/api/src/keymanager/routes.ts @@ -1,8 +1,7 @@ import {ContainerType, ValueOf} from "@chainsafe/ssz"; import {ChainForkConfig} from "@lodestar/config"; import {Epoch, phase0, ssz, stringType} from "@lodestar/types"; -import {RecursivePartial} from "@lodestar/utils"; -import {Schema, Endpoint, RouteDefinitions, ResponseDataCodec} from "../utils/index.js"; +import {Schema, Endpoint, RouteDefinitions} from "../utils/index.js"; import {WireFormat} from "../utils/wireFormat.js"; import { EmptyArgs, @@ -91,28 +90,11 @@ export const BuilderBoostFactorDataType = new ContainerType( }, {jsonCase: "eth2"} ); -export const ProposerConfigType = new ContainerType( - { - graffiti: stringType, - strictFeeRecipientCheck: ssz.Boolean, - feeRecipient: stringType, - builder: new ContainerType( - { - gasLimit: ssz.UintNum64, - selection: stringType, - boostFactor: ssz.UintBn64, - }, - {jsonCase: "eth2"} - ), - }, - {jsonCase: "eth2"} -); export type FeeRecipientData = ValueOf; export type GraffitiData = ValueOf; export type GasLimitData = ValueOf; export type BuilderBoostFactorData = ValueOf; -export type ProposerConfig = RecursivePartial>; export type SignerDefinition = { pubkey: PubkeyHex; @@ -127,6 +109,17 @@ export type SignerDefinition = { export type RemoteSignerDefinition = Pick; +export type ProposerConfig = { + graffiti?: string; + strictFeeRecipientCheck?: boolean; + feeRecipient?: string; + builder?: { + gasLimit?: number; + selection?: string; + boostFactor?: bigint; + }; +}; + /** * JSON serialized representation of a single keystore in EIP-2335: BLS12-381 Keystore format. * ``` @@ -672,11 +665,7 @@ export function getDefinitions(_config: ChainForkConfig): RouteDefinitions, - meta: EmptyMetaCodec, - }, + resp: JsonOnlyResponseCodec, }, signVoluntaryExit: { From bd3f31976581fe865e2f66c3669ec5c6a1ca00a1 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 11:08:23 +0000 Subject: [PATCH 08/11] Fix boost factor json serialization --- packages/api/src/keymanager/index.ts | 1 + packages/api/src/keymanager/routes.ts | 6 +++--- packages/api/test/unit/keymanager/testData.ts | 2 +- .../cli/src/cmds/validator/keymanager/impl.ts | 16 +++++++++++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/api/src/keymanager/index.ts b/packages/api/src/keymanager/index.ts index 1ffcaef897eb..44252acce494 100644 --- a/packages/api/src/keymanager/index.ts +++ b/packages/api/src/keymanager/index.ts @@ -18,6 +18,7 @@ export type { GraffitiData, GasLimitData, BuilderBoostFactorData, + ProposerConfigResponse, } from "./routes.js"; export type {ApiClient}; diff --git a/packages/api/src/keymanager/routes.ts b/packages/api/src/keymanager/routes.ts index f91beccce804..c31ae5a04454 100644 --- a/packages/api/src/keymanager/routes.ts +++ b/packages/api/src/keymanager/routes.ts @@ -109,14 +109,14 @@ export type SignerDefinition = { export type RemoteSignerDefinition = Pick; -export type ProposerConfig = { +export type ProposerConfigResponse = { graffiti?: string; strictFeeRecipientCheck?: boolean; feeRecipient?: string; builder?: { gasLimit?: number; selection?: string; - boostFactor?: bigint; + boostFactor?: string; }; }; @@ -372,7 +372,7 @@ export type Endpoints = { "GET", {pubkey: PubkeyHex}, {params: {pubkey: string}}, - ProposerConfig, + ProposerConfigResponse, EmptyMeta >; diff --git a/packages/api/test/unit/keymanager/testData.ts b/packages/api/test/unit/keymanager/testData.ts index d9eb4eaa0da1..683a7058b8b1 100644 --- a/packages/api/test/unit/keymanager/testData.ts +++ b/packages/api/test/unit/keymanager/testData.ts @@ -122,7 +122,7 @@ export const testData: GenericServerTestCases = { builder: { gasLimit: 30000000, selection: "maxprofit", - boostFactor: BigInt(50), + boostFactor: "50", }, }, }, diff --git a/packages/cli/src/cmds/validator/keymanager/impl.ts b/packages/cli/src/cmds/validator/keymanager/impl.ts index 550640cc1c7e..545f2f74f06e 100644 --- a/packages/cli/src/cmds/validator/keymanager/impl.ts +++ b/packages/cli/src/cmds/validator/keymanager/impl.ts @@ -15,6 +15,7 @@ import { GraffitiData, GasLimitData, BuilderBoostFactorData, + ProposerConfigResponse, } from "@lodestar/api/keymanager"; import {KeymanagerApiMethods as Api} from "@lodestar/api/keymanager/server"; import {Interchange, SignerType, Validator} from "@lodestar/validator"; @@ -365,7 +366,20 @@ export class KeymanagerApi implements Api { } async getProposerConfig({pubkey}: {pubkey: PubkeyHex}): ReturnType { - return {data: this.validator.validatorStore.getProposerConfig(pubkey) ?? {}}; + const config = this.validator.validatorStore.getProposerConfig(pubkey); + + const data: ProposerConfigResponse = { + ...config, + builder: config?.builder + ? { + ...config.builder, + // Default JSON serialization can't handle BigInt + boostFactor: config.builder.boostFactor ? config.builder.boostFactor.toString() : undefined, + } + : undefined, + }; + + return {data}; } async signVoluntaryExit({pubkey, epoch}: {pubkey: PubkeyHex; epoch?: Epoch}): ReturnType { From 7941b236f5409186481ec360821f9a358df2f884 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 11:19:22 +0000 Subject: [PATCH 09/11] Remove unused import --- packages/validator/src/services/validatorStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/validator/src/services/validatorStore.ts b/packages/validator/src/services/validatorStore.ts index e59330edd163..f959b4e74ff5 100644 --- a/packages/validator/src/services/validatorStore.ts +++ b/packages/validator/src/services/validatorStore.ts @@ -42,7 +42,7 @@ import { SignedAggregateAndProof, } from "@lodestar/types"; import {routes} from "@lodestar/api"; -import {fromHex, isEmptyObject, toPubkeyHex, toRootHex} from "@lodestar/utils"; +import {fromHex, toPubkeyHex, toRootHex} from "@lodestar/utils"; import {ISlashingProtection} from "../slashingProtection/index.js"; import {PubkeyHex} from "../types.js"; import {externalSignerPostSignature, SignableMessageType, SignableMessage} from "../util/externalSignerClient.js"; From e76497679e3f450da5d9e8b4c065507d18f11964 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 11:22:32 +0000 Subject: [PATCH 10/11] Update test data --- packages/api/test/unit/keymanager/testData.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/api/test/unit/keymanager/testData.ts b/packages/api/test/unit/keymanager/testData.ts index 683a7058b8b1..6b17611d1e0b 100644 --- a/packages/api/test/unit/keymanager/testData.ts +++ b/packages/api/test/unit/keymanager/testData.ts @@ -116,13 +116,13 @@ export const testData: GenericServerTestCases = { args: {pubkey: pubkeyRand}, res: { data: { - graffiti: "graffiti", + graffiti: graffitiRandUtf8, strictFeeRecipientCheck: false, - feeRecipient: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + feeRecipient: ethaddressRand, builder: { - gasLimit: 30000000, + gasLimit: gasLimitRand, selection: "maxprofit", - boostFactor: "50", + boostFactor: builderBoostFactorRand.toString(), }, }, }, From cf74e32a3ed529153a21e65ea6f78dab099037e6 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Wed, 30 Oct 2024 11:30:15 +0000 Subject: [PATCH 11/11] Update proposer config test --- packages/cli/test/unit/validator/parseProposerConfig.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/cli/test/unit/validator/parseProposerConfig.test.ts b/packages/cli/test/unit/validator/parseProposerConfig.test.ts index 83c8c63ef877..40fa57f7feb5 100644 --- a/packages/cli/test/unit/validator/parseProposerConfig.test.ts +++ b/packages/cli/test/unit/validator/parseProposerConfig.test.ts @@ -26,8 +26,7 @@ const testValue = { builder: { gasLimit: 35000000, selection: routes.validator.BuilderSelection.BuilderAlways, - // biome-ignore lint/correctness/noPrecisionLoss: - boostFactor: BigInt(18446744073709551616), + boostFactor: 18446744073709551616n, }, }, },