diff --git a/ssv/spectest/generate/tests.json.gz b/ssv/spectest/generate/tests.json.gz index 3ca85baf1..d503664f6 100644 Binary files a/ssv/spectest/generate/tests.json.gz and b/ssv/spectest/generate/tests.json.gz differ diff --git a/ssv/spectest/tests/runner/consensus/invalid_signature.go b/ssv/spectest/tests/runner/consensus/invalid_signature.go index 5dccae03e..4d4878022 100644 --- a/ssv/spectest/tests/runner/consensus/invalid_signature.go +++ b/ssv/spectest/tests/runner/consensus/invalid_signature.go @@ -158,7 +158,7 @@ func InvalidSignature() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_diff_length.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_diff_length.go index ee8279fb4..9ee4f38b0 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_diff_length.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_diff_length.go @@ -148,7 +148,7 @@ func SignersAndSignaturesWithDifferentLength() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_empty_signature.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_empty_signature.go index c4b309a42..db084cbd3 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_empty_signature.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_empty_signature.go @@ -148,7 +148,7 @@ func EmptySignature() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_nil_ssvmessage.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_nil_ssvmessage.go index dc98e0be8..7225d8408 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_nil_ssvmessage.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_nil_ssvmessage.go @@ -148,7 +148,7 @@ func NilSSVMessage() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signatures.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signatures.go index 4dcbf6a09..e042115a3 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signatures.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signatures.go @@ -148,7 +148,7 @@ func NoSignatures() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signers.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signers.go index 2d3c571b4..0e8d0dca0 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signers.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_no_signers.go @@ -148,7 +148,7 @@ func NoSigners() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_non_unique_signer.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_non_unique_signer.go index 296d50c04..21af16601 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_non_unique_signer.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_non_unique_signer.go @@ -149,7 +149,7 @@ func NonUniqueSigners() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/signedssvmsg_zero_signer.go b/ssv/spectest/tests/runner/consensus/signedssvmsg_zero_signer.go index 56cd7d71b..36a180268 100644 --- a/ssv/spectest/tests/runner/consensus/signedssvmsg_zero_signer.go +++ b/ssv/spectest/tests/runner/consensus/signedssvmsg_zero_signer.go @@ -148,7 +148,7 @@ func ZeroSigner() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/consensus/valid_message.go b/ssv/spectest/tests/runner/consensus/valid_message.go index acc025e89..b2b3bca54 100644 --- a/ssv/spectest/tests/runner/consensus/valid_message.go +++ b/ssv/spectest/tests/runner/consensus/valid_message.go @@ -134,7 +134,7 @@ func ValidMessage() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: "no consensus phase for validator registration", }, diff --git a/ssv/spectest/tests/runner/full_happy_flow.go b/ssv/spectest/tests/runner/full_happy_flow.go index 9f874d407..8ca8e1937 100644 --- a/ssv/spectest/tests/runner/full_happy_flow.go +++ b/ssv/spectest/tests/runner/full_happy_flow.go @@ -147,7 +147,7 @@ func FullHappyFlow() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, }, { diff --git a/ssv/spectest/tests/runner/postconsensus/invalid_msg_slot.go b/ssv/spectest/tests/runner/postconsensus/invalid_msg_slot.go index 094c9d117..fd56a2e60 100644 --- a/ssv/spectest/tests/runner/postconsensus/invalid_msg_slot.go +++ b/ssv/spectest/tests/runner/postconsensus/invalid_msg_slot.go @@ -161,7 +161,7 @@ func InvalidMessageSlot() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: "no post consensus phase for validator registration", }, diff --git a/ssv/spectest/tests/runner/postconsensus/valid_msg.go b/ssv/spectest/tests/runner/postconsensus/valid_msg.go index 26358c06e..d3ace1ae6 100644 --- a/ssv/spectest/tests/runner/postconsensus/valid_msg.go +++ b/ssv/spectest/tests/runner/postconsensus/valid_msg.go @@ -196,7 +196,7 @@ func ValidMessage() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: "no post consensus phase for validator registration", }, diff --git a/ssv/spectest/tests/runner/preconsensus/invalid_quorum_then_valid_quorum.go b/ssv/spectest/tests/runner/preconsensus/invalid_quorum_then_valid_quorum.go index 4cf7bce68..db3c189bc 100644 --- a/ssv/spectest/tests/runner/preconsensus/invalid_quorum_then_valid_quorum.go +++ b/ssv/spectest/tests/runner/preconsensus/invalid_quorum_then_valid_quorum.go @@ -70,7 +70,7 @@ func InvalidQuorumThenValidQuorum() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: expectedError, }, diff --git a/ssv/spectest/tests/runner/preconsensus/invalid_then_quorum.go b/ssv/spectest/tests/runner/preconsensus/invalid_then_quorum.go index 6dded3dd5..63649d7b6 100644 --- a/ssv/spectest/tests/runner/preconsensus/invalid_then_quorum.go +++ b/ssv/spectest/tests/runner/preconsensus/invalid_then_quorum.go @@ -67,7 +67,7 @@ func InvalidThenQuorum() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, }, { diff --git a/ssv/spectest/tests/runner/preconsensus/post_quorum.go b/ssv/spectest/tests/runner/preconsensus/post_quorum.go index c12d5dac5..4e4af2cc8 100644 --- a/ssv/spectest/tests/runner/preconsensus/post_quorum.go +++ b/ssv/spectest/tests/runner/preconsensus/post_quorum.go @@ -65,7 +65,7 @@ func PostQuorum() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, ExpectedError: "failed processing validator registration message: invalid pre-consensus message: no running duty", }, diff --git a/ssv/spectest/tests/runner/preconsensus/quorum.go b/ssv/spectest/tests/runner/preconsensus/quorum.go index e4db6adb2..b53787ab4 100644 --- a/ssv/spectest/tests/runner/preconsensus/quorum.go +++ b/ssv/spectest/tests/runner/preconsensus/quorum.go @@ -61,7 +61,7 @@ func Quorum() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, }, { diff --git a/ssv/spectest/tests/runner/preconsensus/quorum_10_operators.go b/ssv/spectest/tests/runner/preconsensus/quorum_10_operators.go index bfee9c76d..faa50332f 100644 --- a/ssv/spectest/tests/runner/preconsensus/quorum_10_operators.go +++ b/ssv/spectest/tests/runner/preconsensus/quorum_10_operators.go @@ -104,7 +104,7 @@ func Quorum10Operators() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, }, { diff --git a/ssv/spectest/tests/runner/preconsensus/quorum_13_operators.go b/ssv/spectest/tests/runner/preconsensus/quorum_13_operators.go index 5edef6073..5a0ed4edf 100644 --- a/ssv/spectest/tests/runner/preconsensus/quorum_13_operators.go +++ b/ssv/spectest/tests/runner/preconsensus/quorum_13_operators.go @@ -114,7 +114,7 @@ func Quorum13Operators() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, }, { diff --git a/ssv/spectest/tests/runner/preconsensus/quorum_7_operators.go b/ssv/spectest/tests/runner/preconsensus/quorum_7_operators.go index beaa5f43a..0f9f36bc1 100644 --- a/ssv/spectest/tests/runner/preconsensus/quorum_7_operators.go +++ b/ssv/spectest/tests/runner/preconsensus/quorum_7_operators.go @@ -68,7 +68,7 @@ func Quorum7Operators() tests.SpecTest { testingutils.PreConsensusValidatorRegistrationMsg(ks.Shares[1], 1), // broadcasts when starting a new duty }, BeaconBroadcastedRoots: []string{ - testingutils.GetSSZRootNoError(testingutils.TestingValidatorRegistration), + testingutils.GetSSZRootNoError(testingutils.TestingSignedValidatorRegistration(ks)), }, }, { diff --git a/ssv/types.go b/ssv/types.go index dc9f78908..db735cb24 100644 --- a/ssv/types.go +++ b/ssv/types.go @@ -4,7 +4,6 @@ import ( "github.com/attestantio/go-eth2-client/api" "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/altair" - "github.com/attestantio/go-eth2-client/spec/bellatrix" "github.com/attestantio/go-eth2-client/spec/phase0" ssz "github.com/ferranbt/fastssz" @@ -76,7 +75,7 @@ type SyncCommitteeContributionCalls interface { // ValidatorRegistrationCalls interface has all validator registration duty specific calls type ValidatorRegistrationCalls interface { // SubmitValidatorRegistration submits a validator registration - SubmitValidatorRegistration(pubkey []byte, feeRecipient bellatrix.ExecutionAddress, sig phase0.BLSSignature) error + SubmitValidatorRegistration(registration *api.VersionedSignedValidatorRegistration) error } // VoluntaryExitCalls interface has all validator voluntary exit duty specific calls diff --git a/ssv/validator_registration.go b/ssv/validator_registration.go index cdda7c848..92df516fa 100644 --- a/ssv/validator_registration.go +++ b/ssv/validator_registration.go @@ -1,7 +1,9 @@ package ssv import ( + "github.com/attestantio/go-eth2-client/api" v1 "github.com/attestantio/go-eth2-client/api/v1" + "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/phase0" ssz "github.com/ferranbt/fastssz" "github.com/pkg/errors" @@ -18,6 +20,8 @@ type ValidatorRegistrationRunner struct { signer types.BeaconSigner operatorSigner *types.OperatorSigner valCheck qbft.ProposedValueCheckF + + gasLimit uint64 } func NewValidatorRegistrationRunner( @@ -27,6 +31,7 @@ func NewValidatorRegistrationRunner( network Network, signer types.BeaconSigner, operatorSigner *types.OperatorSigner, + gasLimit uint64, ) (Runner, error) { if len(share) != 1 { @@ -44,6 +49,7 @@ func NewValidatorRegistrationRunner( network: network, signer: signer, operatorSigner: operatorSigner, + gasLimit: gasLimit, }, nil } @@ -80,14 +86,20 @@ func (r *ValidatorRegistrationRunner) ProcessPreConsensus(signedMsg *types.Parti specSig := phase0.BLSSignature{} copy(specSig[:], fullSig) - // Get share - share := r.GetShare() - if share == nil { - return errors.New("no share to get validator public key") + registration, err := r.calculateValidatorRegistration(r.BaseRunner.State.StartingDuty.DutySlot()) + if err != nil { + return errors.Wrap(err, "could not calculate validator registration") + } + + signed := &api.VersionedSignedValidatorRegistration{ + Version: spec.BuilderVersionV1, + V1: &v1.SignedValidatorRegistration{ + Message: registration, + Signature: specSig, + }, } - if err := r.beacon.SubmitValidatorRegistration(share.ValidatorPubKey[:], - share.FeeRecipientAddress, specSig); err != nil { + if err := r.beacon.SubmitValidatorRegistration(signed); err != nil { return errors.Wrap(err, "could not submit validator registration") } @@ -107,7 +119,7 @@ func (r *ValidatorRegistrationRunner) expectedPreConsensusRootsAndDomain() ([]ss if r.BaseRunner.State == nil || r.BaseRunner.State.StartingDuty == nil { return nil, types.DomainError, errors.New("no running duty to compute preconsensus roots and domain") } - vr, err := r.calculateValidatorRegistration(r.BaseRunner.State.StartingDuty) + vr, err := r.calculateValidatorRegistration(r.BaseRunner.State.StartingDuty.DutySlot()) if err != nil { return nil, types.DomainError, errors.Wrap(err, "could not calculate validator registration") } @@ -120,7 +132,7 @@ func (r *ValidatorRegistrationRunner) expectedPostConsensusRootsAndDomain() ([]s } func (r *ValidatorRegistrationRunner) executeDuty(duty types.Duty) error { - vr, err := r.calculateValidatorRegistration(duty) + vr, err := r.calculateValidatorRegistration(duty.DutySlot()) if err != nil { return errors.Wrap(err, "could not calculate validator registration") } @@ -167,7 +179,7 @@ func (r *ValidatorRegistrationRunner) executeDuty(duty types.Duty) error { return nil } -func (r *ValidatorRegistrationRunner) calculateValidatorRegistration(duty types.Duty) (*v1.ValidatorRegistration, error) { +func (r *ValidatorRegistrationRunner) calculateValidatorRegistration(slot phase0.Slot) (*v1.ValidatorRegistration, error) { share := r.GetShare() if share == nil { @@ -177,11 +189,11 @@ func (r *ValidatorRegistrationRunner) calculateValidatorRegistration(duty types. pk := phase0.BLSPubKey{} copy(pk[:], share.ValidatorPubKey[:]) - epoch := r.BaseRunner.BeaconNetwork.EstimatedEpochAtSlot(duty.DutySlot()) + epoch := r.BaseRunner.BeaconNetwork.EstimatedEpochAtSlot(slot) return &v1.ValidatorRegistration{ FeeRecipient: share.FeeRecipientAddress, - GasLimit: types.DefaultGasLimit, + GasLimit: r.gasLimit, Timestamp: r.BaseRunner.BeaconNetwork.EpochStartTime(epoch), Pubkey: pk, }, nil diff --git a/types/testingutils/beacon_node.go b/types/testingutils/beacon_node.go index f80bfbe4a..6f6c9f036 100644 --- a/types/testingutils/beacon_node.go +++ b/types/testingutils/beacon_node.go @@ -386,6 +386,33 @@ func TestingValidatorRegistrationBySlot(slot phase0.Slot) *v1.ValidatorRegistrat } } +var TestingSignedValidatorRegistration = func(ks *TestKeySet) *v1.SignedValidatorRegistration { + vr := TestingValidatorRegistration + sig := signBeaconObject(vr, types.DomainApplicationBuilder, ks) + return &v1.SignedValidatorRegistration{ + Message: vr, + Signature: sig, + } +} + +var TestingSignedValidatorRegistrationWrong = func(ks *TestKeySet) *v1.SignedValidatorRegistration { + vr := TestingValidatorRegistrationWrong + sig := signBeaconObject(vr, types.DomainApplicationBuilder, ks) + return &v1.SignedValidatorRegistration{ + Message: vr, + Signature: sig, + } +} + +var TestingSignedValidatorRegistrationBySlot = func(ks *TestKeySet, slot phase0.Slot) *v1.SignedValidatorRegistration { + vr := TestingValidatorRegistrationBySlot(slot) + sig := signBeaconObject(vr, types.DomainApplicationBuilder, ks) + return &v1.SignedValidatorRegistration{ + Message: vr, + Signature: sig, + } +} + var TestingVoluntaryExit = &phase0.VoluntaryExit{ Epoch: 0, ValidatorIndex: TestingValidatorIndex, @@ -708,18 +735,8 @@ func (bn *TestingBeaconNode) SubmitAttestations(attestations []*phase0.Attestati return nil } -func (bn *TestingBeaconNode) SubmitValidatorRegistration(pubkey []byte, feeRecipient bellatrix.ExecutionAddress, sig phase0.BLSSignature) error { - pk := phase0.BLSPubKey{} - copy(pk[:], pubkey) - - vr := v1.ValidatorRegistration{ - FeeRecipient: feeRecipient, - GasLimit: TestingValidatorRegistration.GasLimit, - Timestamp: TestingValidatorRegistration.Timestamp, - Pubkey: pk, - } - - r, _ := vr.HashTreeRoot() +func (bn *TestingBeaconNode) SubmitValidatorRegistration(registration *api.VersionedSignedValidatorRegistration) error { + r, _ := registration.V1.HashTreeRoot() bn.BroadcastedRoots = append(bn.BroadcastedRoots, r) return nil } diff --git a/types/testingutils/runner.go b/types/testingutils/runner.go index 40f5bf93c..1ce78538d 100644 --- a/types/testingutils/runner.go +++ b/types/testingutils/runner.go @@ -201,6 +201,7 @@ var ConstructBaseRunnerWithShareMap = func(role types.RunnerRole, shareMap map[p net, km, opSigner, + types.DefaultGasLimit, ) case types.RoleVoluntaryExit: runner, err = ssv.NewVoluntaryExitRunner( @@ -357,6 +358,7 @@ var ConstructBaseRunner = func(role types.RunnerRole, keySet *TestKeySet) (ssv.R net, km, opSigner, + types.DefaultGasLimit, ) case types.RoleVoluntaryExit: runner, err = ssv.NewVoluntaryExitRunner(