From 5b301643730a0d0721c93b67e46651098713788e Mon Sep 17 00:00:00 2001 From: qu0b Date: Tue, 31 Mar 2026 16:38:51 +0000 Subject: [PATCH 1/6] Add Gloas (bal-devnet-3) support via qu0b/go-eth2-client - Replace go-eth2-client with qu0b fork (eip7928 branch) for non-ePBS Gloas SSZ types - Add Gloas/Fulu/Electra cases to block_utils.go - Supports EIP-7928 (BAL), EIP-7843 (SlotNumber), EIP-7954, EIP-8037 --- go.mod | 3 ++- go.sum | 6 ++---- pkg/clients/consensus/block_utils.go | 26 +++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b9428546..a98f7cee 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,6 @@ require ( require ( github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506 // indirect github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.20.0 // indirect @@ -122,3 +121,5 @@ require ( modernc.org/memory v1.11.0 // indirect modernc.org/sqlite v1.46.1 // indirect ) + +replace github.com/attestantio/go-eth2-client => github.com/qu0b/go-eth2-client v0.0.0-20260211134817-89b1d064a7e5 diff --git a/go.sum b/go.sum index a954be12..4f0cadba 100644 --- a/go.sum +++ b/go.sum @@ -7,14 +7,10 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506 h1:d/SJkN8/9Ca+1YmuDiUJxAiV4w/a9S8NcsG7GMQSrVI= -github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506/go.mod h1:6TZI4FU6zT8x6ZfWa1J8YQ2NgW0wLV/W3fHRca8ISBo= github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU= github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0= github.com/VictoriaMetrics/fastcache v1.13.0/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0LNjo6B+4aj2Wmng3TjU= -github.com/attestantio/go-eth2-client v0.28.0 h1:2zIIIMPvSD+g6h3TgVXsoda/Yw3e+wjo1e8CZEanORU= -github.com/attestantio/go-eth2-client v0.28.0/go.mod h1:PO9sHFCq+1RiG+Eh3eOR2GYvYV64Qzg7idM3kLgCs5k= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= @@ -280,6 +276,8 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 h1:lC8ki github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15/go.mod h1:8svFBIKKu31YriBG/pNizo9N0Jr9i5PQ+dFkxWg3x5k= github.com/prysmaticlabs/gohashtree v0.0.4-beta h1:H/EbCuXPeTV3lpKeXGPpEV9gsUpkqOOVnWapUyeWro4= github.com/prysmaticlabs/gohashtree v0.0.4-beta/go.mod h1:BFdtALS+Ffhg3lGQIHv9HDWuHS8cTvHZzrHWxwOtGOs= +github.com/qu0b/go-eth2-client v0.0.0-20260211134817-89b1d064a7e5 h1:KhHr85BKhGb+5q8npUuMTxwcUGvtzk9P3ZnBwd++Tbo= +github.com/qu0b/go-eth2-client v0.0.0-20260211134817-89b1d064a7e5/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY= github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= diff --git a/pkg/clients/consensus/block_utils.go b/pkg/clients/consensus/block_utils.go index 52a352cc..9df2b31f 100644 --- a/pkg/clients/consensus/block_utils.go +++ b/pkg/clients/consensus/block_utils.go @@ -23,10 +23,28 @@ func GetExecutionExtraData(v *spec.VersionedSignedBeaconBlock) ([]byte, error) { return v.Capella.Message.Body.ExecutionPayload.ExtraData, nil case spec.DataVersionDeneb: if v.Deneb == nil || v.Deneb.Message == nil || v.Deneb.Message.Body == nil || v.Deneb.Message.Body.ExecutionPayload == nil { - return nil, errors.New("no denb block") + return nil, errors.New("no deneb block") } return v.Deneb.Message.Body.ExecutionPayload.ExtraData, nil + case spec.DataVersionElectra: + if v.Electra == nil || v.Electra.Message == nil || v.Electra.Message.Body == nil || v.Electra.Message.Body.ExecutionPayload == nil { + return nil, errors.New("no electra block") + } + + return v.Electra.Message.Body.ExecutionPayload.ExtraData, nil + case spec.DataVersionFulu: + if v.Fulu == nil || v.Fulu.Message == nil || v.Fulu.Message.Body == nil || v.Fulu.Message.Body.ExecutionPayload == nil { + return nil, errors.New("no fulu block") + } + + return v.Fulu.Message.Body.ExecutionPayload.ExtraData, nil + case spec.DataVersionGloas: + if v.Gloas == nil || v.Gloas.Message == nil || v.Gloas.Message.Body == nil || v.Gloas.Message.Body.ExecutionPayload == nil { + return nil, errors.New("no gloas block") + } + + return v.Gloas.Message.Body.ExecutionPayload.ExtraData, nil default: return nil, errors.New("unknown version") } @@ -45,6 +63,12 @@ func GetBlockBody(v *spec.VersionedSignedBeaconBlock) any { return v.Capella case spec.DataVersionDeneb: return v.Deneb + case spec.DataVersionElectra: + return v.Electra + case spec.DataVersionFulu: + return v.Fulu + case spec.DataVersionGloas: + return v.Gloas default: return nil } From 046ab547516b99902c18e67980fa3bf0187d5a5e Mon Sep 17 00:00:00 2001 From: qu0b Date: Tue, 31 Mar 2026 16:39:20 +0000 Subject: [PATCH 2/6] trigger CI From 9aa932c22c0cedc4ea50a0174279f789ec702caa Mon Sep 17 00:00:00 2001 From: qu0b Date: Tue, 31 Mar 2026 16:45:11 +0000 Subject: [PATCH 3/6] fix: add nolint for cyclomatic complexity in block_utils --- pkg/clients/consensus/block_utils.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/clients/consensus/block_utils.go b/pkg/clients/consensus/block_utils.go index 9df2b31f..5956981e 100644 --- a/pkg/clients/consensus/block_utils.go +++ b/pkg/clients/consensus/block_utils.go @@ -6,6 +6,7 @@ import ( "github.com/attestantio/go-eth2-client/spec" ) +//nolint:gocyclo // switch over all fork versions func GetExecutionExtraData(v *spec.VersionedSignedBeaconBlock) ([]byte, error) { //nolint:exhaustive // ignore switch v.Version { From 63fce5c9114a624c968606de85957ffe481a967c Mon Sep 17 00:00:00 2001 From: qu0b Date: Tue, 31 Mar 2026 17:06:11 +0000 Subject: [PATCH 4/6] debug: add attestation vote counting logging --- .../check_consensus_attestation_stats/task.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/tasks/check_consensus_attestation_stats/task.go b/pkg/tasks/check_consensus_attestation_stats/task.go index 957c9cfd..92a6df73 100644 --- a/pkg/tasks/check_consensus_attestation_stats/task.go +++ b/pkg/tasks/check_consensus_attestation_stats/task.go @@ -469,21 +469,27 @@ func (t *Task) aggregateEpochVotes(ctx context.Context, epoch uint64) []*epochVo attestationsVersioned, err := blockBody.Attestations() if err != nil { + t.logger.Warnf("aggregateEpochVotes slot %v: Attestations() error: %v", slot, err) continue } + t.logger.Infof("aggregateEpochVotes slot %v: %v attestations, version %v, maxCommittees %v", slot, len(attestationsVersioned), blockBody.Version, specs.MaxCommitteesPerSlot) + for attIdx, att := range attestationsVersioned { attData, err1 := att.Data() if err1 != nil { + t.logger.Warnf("aggregateEpochVotes slot %v att %v: Data() error: %v", slot, attIdx, err1) continue } if uint64(attData.Slot)/specs.SlotsPerEpoch != epoch { + t.logger.Infof("aggregateEpochVotes slot %v att %v: skip epoch mismatch (att epoch %v, want %v)", slot, attIdx, uint64(attData.Slot)/specs.SlotsPerEpoch, epoch) continue } attAggregationBits, err := att.AggregationBits() if err != nil { + t.logger.Warnf("aggregateEpochVotes slot %v att %v: AggregationBits() error: %v", slot, attIdx, err) continue } @@ -495,10 +501,12 @@ func (t *Task) aggregateEpochVotes(ctx context.Context, epoch uint64) []*epochVo // there can now be attestations from all committees aggregated into a single attestation aggregate committeeBits, err := att.CommitteeBits() if err != nil { - t.logger.Debugf("aggregateEpochVotes slot %v failed, can't get committeeBits for attestation %v: %v", slot, attIdx, err) + t.logger.Warnf("aggregateEpochVotes slot %v att %v: CommitteeBits() error: %v", slot, attIdx, err) continue } + t.logger.Infof("aggregateEpochVotes slot %v att %v: electra+ path, committeeBits=%x, aggBitsLen=%v, attSlot=%v", slot, attIdx, []byte(committeeBits), attAggregationBits.Len(), attData.Slot) + aggregationBitsOffset := uint64(0) for committee := uint64(0); committee < specs.MaxCommitteesPerSlot; committee++ { @@ -506,6 +514,13 @@ func (t *Task) aggregateEpochVotes(ctx context.Context, epoch uint64) []*epochVo continue } + attKey := fmt.Sprintf("%v-%v", uint64(attData.Slot), committee) + dutyCount := 0 + if votes.attesterDuties != nil && votes.attesterDuties.duties[attKey] != nil { + dutyCount = len(votes.attesterDuties.duties[attKey]) + } + t.logger.Infof("aggregateEpochVotes slot %v att %v committee %v: key=%v, duties=%v", slot, attIdx, committee, attKey, dutyCount) + voteAmt, voteCnt, committeeSize := t.aggregateAttestationVotes(votes, uint64(attData.Slot), committee, attAggregationBits, 0) voteAmount += voteAmt voteCount += voteCnt From 73f24e63ea4cdeddf6dc53dd61b27bb872f6c2e4 Mon Sep 17 00:00:00 2001 From: qu0b Date: Tue, 31 Mar 2026 17:21:04 +0000 Subject: [PATCH 5/6] fix: Bitvector64 BitAt fails with minimal preset committeeBits go-bitfield's Bitvector64.BitAt() requires exactly 8 bytes but with minimal preset (MAX_COMMITTEES_PER_SLOT=4), committeeBits is only 1 byte in SSZ. This caused all committee bit checks to return false, resulting in 0% attestation vote counts. Work around by checking the raw bytes directly instead of using BitAt(). --- .../check_consensus_attestation_stats/task.go | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/pkg/tasks/check_consensus_attestation_stats/task.go b/pkg/tasks/check_consensus_attestation_stats/task.go index 92a6df73..fb3a704e 100644 --- a/pkg/tasks/check_consensus_attestation_stats/task.go +++ b/pkg/tasks/check_consensus_attestation_stats/task.go @@ -469,27 +469,21 @@ func (t *Task) aggregateEpochVotes(ctx context.Context, epoch uint64) []*epochVo attestationsVersioned, err := blockBody.Attestations() if err != nil { - t.logger.Warnf("aggregateEpochVotes slot %v: Attestations() error: %v", slot, err) continue } - t.logger.Infof("aggregateEpochVotes slot %v: %v attestations, version %v, maxCommittees %v", slot, len(attestationsVersioned), blockBody.Version, specs.MaxCommitteesPerSlot) - for attIdx, att := range attestationsVersioned { attData, err1 := att.Data() if err1 != nil { - t.logger.Warnf("aggregateEpochVotes slot %v att %v: Data() error: %v", slot, attIdx, err1) continue } if uint64(attData.Slot)/specs.SlotsPerEpoch != epoch { - t.logger.Infof("aggregateEpochVotes slot %v att %v: skip epoch mismatch (att epoch %v, want %v)", slot, attIdx, uint64(attData.Slot)/specs.SlotsPerEpoch, epoch) continue } attAggregationBits, err := att.AggregationBits() if err != nil { - t.logger.Warnf("aggregateEpochVotes slot %v att %v: AggregationBits() error: %v", slot, attIdx, err) continue } @@ -501,25 +495,26 @@ func (t *Task) aggregateEpochVotes(ctx context.Context, epoch uint64) []*epochVo // there can now be attestations from all committees aggregated into a single attestation aggregate committeeBits, err := att.CommitteeBits() if err != nil { - t.logger.Warnf("aggregateEpochVotes slot %v att %v: CommitteeBits() error: %v", slot, attIdx, err) + t.logger.Debugf("aggregateEpochVotes slot %v failed, can't get committeeBits for attestation %v: %v", slot, attIdx, err) continue } - t.logger.Infof("aggregateEpochVotes slot %v att %v: electra+ path, committeeBits=%x, aggBitsLen=%v, attSlot=%v", slot, attIdx, []byte(committeeBits), attAggregationBits.Len(), attData.Slot) - aggregationBitsOffset := uint64(0) for committee := uint64(0); committee < specs.MaxCommitteesPerSlot; committee++ { - if !committeeBits.BitAt(committee) { - continue + // Workaround for go-bitfield Bitvector64 requiring exactly 8 bytes. + // With minimal preset, committeeBits may be shorter. Check raw bytes directly. + byteIdx := committee / 8 + bitIdx := committee % 8 + + hasBit := false + if int(byteIdx) < len(committeeBits) { + hasBit = committeeBits[byteIdx]&(1< Date: Tue, 31 Mar 2026 20:04:01 +0000 Subject: [PATCH 6/6] Add bal-devnet-3 EELS playbook with all EIPs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-contained playbook that: - Installs Python/uv at runtime - Clones EELS (execution-specs) devnets/bal/3 branch - Runs execute remote against live RPC for all 7 bal-devnet-3 EIPs - Uses --sender-fund-refund-gas-limit=200000 for EIP-8037 state gas - Produces per-EIP JSON/HTML reports Also fixes typo in existing playbook (execution-spec → execution-specs). --- .../bal-devnet-3-eels-tests.yaml | 380 ++++++++++++++++++ .../execution-sec-tests-sequential.yaml | 2 +- 2 files changed, 381 insertions(+), 1 deletion(-) create mode 100644 playbooks/glamsterdam-dev/bal-devnet-3-eels-tests.yaml diff --git a/playbooks/glamsterdam-dev/bal-devnet-3-eels-tests.yaml b/playbooks/glamsterdam-dev/bal-devnet-3-eels-tests.yaml new file mode 100644 index 00000000..eba4ad1e --- /dev/null +++ b/playbooks/glamsterdam-dev/bal-devnet-3-eels-tests.yaml @@ -0,0 +1,380 @@ +id: bal-devnet-3-eels-tests +name: "bal-devnet-3: Run EELS execution spec tests (all EIPs)" +timeout: 4h +config: + walletPrivkey: "" + walletSeed: "spectests-bal3" + specTestsBranch: "devnets/bal/3" +tasks: + # install python + deps + - name: run_shell + title: "Install Python and build dependencies" + id: deps + timeout: 10m + config: + shell: bash + command: | + set -e + sudo dpkg --add-architecture amd64 + sudo apt-get update + sudo apt-get install -y build-essential python3 python3-pip python3-dev libc6:amd64 autoconf automake libffi-dev libtool pkg-config + sudo rm /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true + pip install uv + + # clone EELS repo + - name: run_shell + title: "Clone EELS (execution-specs)" + id: setup + timeout: 10m + config: + shell: bash + shellArgs: [--login] + envVars: + GIT_BRANCH: specTestsBranch + command: | + set -e + GIT_BRANCH=$(echo $GIT_BRANCH | jq -r) + + EELS_DIR=$(mktemp -d -t eels-bal3-XXXXXXXXXX) + echo "::set-var eelsDir ${EELS_DIR}" + echo "${EELS_DIR}" > $ASSERTOOR_SUMMARY + + git clone https://github.com/ethereum/execution-specs.git \ + --depth 1 --branch ${GIT_BRANCH} --single-branch ${EELS_DIR} + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + uv sync --all-extras + + echo "EELS environment ready at ${EELS_DIR}" + + - name: check_clients_are_healthy + title: "Check if at least one client is ready" + id: clientCheck + timeout: 5m + config: + minClientCount: 1 + + - name: generate_child_wallet + id: specTestsWallet + title: "Generate funded wallet for tests" + config: + prefundMinBalance: 1000000000000000000000000 # 1000000 ETH + configVars: + privateKey: "walletPrivkey" + walletSeed: "walletSeed" + + # wait for gloas activation + - name: get_consensus_specs + id: consensusSpecs + title: "Get consensus chain specs" + - name: check_consensus_slot_range + title: "Wait for Gloas activation" + timeout: 1h + configVars: + minEpochNumber: "tasks.consensusSpecs.outputs.specs.GLOAS_FORK_EPOCH" + + # run tests per EIP sequentially + - name: run_tasks + title: "Run bal-devnet-3 EELS tests" + id: tests + config: + continueOnFailure: true + tasks: + - name: run_shell + title: "EIP-7708: ETH transfers emit a log" + id: eip7708 + timeout: 30m + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip7708_eth_transfer_logs \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip7708.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7708.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7708.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7708.json) + echo "EIP-7708: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: run_shell + title: "EIP-7778: Block gas accounting without refunds" + id: eip7778 + timeout: 30m + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip7778_block_gas_accounting_without_refunds \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip7778.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7778.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7778.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7778.json) + echo "EIP-7778: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: run_shell + title: "EIP-7843: SLOTNUM opcode" + id: eip7843 + timeout: 30m + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip7843_slotnum \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip7843.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7843.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7843.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7843.json) + echo "EIP-7843: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: run_shell + title: "EIP-7928: Block-level access lists (BAL)" + id: eip7928 + timeout: 2h + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip7928_block_level_access_lists \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + -n 16 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip7928.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7928.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7928.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7928.json) + echo "EIP-7928: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: run_shell + title: "EIP-7954: Increase maximum contract size" + id: eip7954 + timeout: 30m + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip7954_increase_max_contract_size \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip7954.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7954.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7954.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7954.json) + echo "EIP-7954: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: run_shell + title: "EIP-8024: Backward compatible SWAPN, DUPN, EXCHANGE" + id: eip8024 + timeout: 30m + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip8024_dupn_swapn_exchange \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip8024.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip8024.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip8024.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip8024.json) + echo "EIP-8024: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: run_shell + title: "EIP-8037: State creation gas cost increase" + id: eip8037 + timeout: 2h + config: + shell: bash + shellArgs: [--login] + envVars: + EELS_DIR: eelsDir + CHAIN_ID: tasks.consensusSpecs.outputs.specs.DEPOSIT_CHAIN_ID + RPC_ENDPOINT: tasks.clientCheck.outputs.goodClients[0].elRpcUrl + PRIVATE_KEY: tasks.specTestsWallet.outputs.childWallet.privkey + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + CHAIN_ID=$(echo $CHAIN_ID | jq -r) + RPC_ENDPOINT=$(echo $RPC_ENDPOINT | jq -r) + PRIVATE_KEY=$(echo $PRIVATE_KEY | jq -r) + + cd ${EELS_DIR} + export HOME=${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + + uv run execute remote ./tests/amsterdam/eip8037_state_creation_gas_cost_increase \ + --fork=Amsterdam \ + --chain-id=${CHAIN_ID} \ + --rpc-endpoint=${RPC_ENDPOINT} \ + --rpc-seed-key=${PRIVATE_KEY} \ + --seed-account-sweep-amount="100 ether" \ + --sender-fund-refund-gas-limit=200000 \ + -n 16 \ + --json-report --json-report-file=${ASSERTOOR_RESULT_DIR}/eip8037.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip8037.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip8037.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip8037.json) + echo "EIP-8037: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + +cleanupTasks: + - name: run_shell + title: "Cleanup EELS temp dir" + config: + shell: bash + envVars: + EELS_DIR: eelsDir + command: | + set -e + EELS_DIR=$(echo $EELS_DIR | jq -r) + if [ ! -z "$EELS_DIR" ] && [ -d "$EELS_DIR" ]; then + rm -rf $EELS_DIR + echo "Cleaned up ${EELS_DIR}" + fi diff --git a/playbooks/glamsterdam-dev/execution-sec-tests-sequential.yaml b/playbooks/glamsterdam-dev/execution-sec-tests-sequential.yaml index 89f14d0c..ac5ebcfb 100644 --- a/playbooks/glamsterdam-dev/execution-sec-tests-sequential.yaml +++ b/playbooks/glamsterdam-dev/execution-sec-tests-sequential.yaml @@ -36,7 +36,7 @@ tasks: config: testFile: /tests/execution-spec-tests-execute.yaml testConfig: - gitRepo: https://github.com/ethereum/execution-spec.git + gitRepo: https://github.com/ethereum/execution-specs.git runTests: false testConfigVars: specTestsPath: "tasks.tempdir.outputs.path"