diff --git a/go.mod b/go.mod index b9428546..d4d6f43d 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,13 @@ module github.com/ethpandaops/assertoor -go 1.25.0 +go 1.25.7 require ( github.com/attestantio/go-eth2-client v0.28.0 github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 - github.com/ethereum/go-ethereum v1.17.1 + github.com/ethereum/go-ethereum v1.17.3-0.20260421080339-499762852cf2 github.com/ethpandaops/ethwallclock v0.4.0 - github.com/ethpandaops/spamoor v1.1.18-0.20260226103249-8d1c1fdd2de0 + github.com/ethpandaops/spamoor v1.1.18-0.20260427075552-dcdec39f6332 github.com/glebarez/go-sqlite v1.22.0 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/google/uuid v1.6.0 @@ -43,14 +43,13 @@ 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 + github.com/bits-and-blooms/bitset v1.24.4 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/consensys/gnark-crypto v0.19.2 // indirect + github.com/consensys/gnark-crypto v0.20.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect - github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect + github.com/crate-crypto/go-eth-kzg v1.5.0 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -97,6 +96,7 @@ require ( github.com/swaggo/files v1.0.1 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect + github.com/traefik/yaegi v0.16.2-0.20260209085605-fcb76d1ece0c // indirect github.com/wealdtech/go-bytesutil v1.2.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect @@ -111,7 +111,7 @@ require ( golang.org/x/net v0.50.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect - golang.org/x/time v0.14.0 // indirect + golang.org/x/time v0.15.0 // indirect golang.org/x/tools v0.42.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/protobuf v1.36.11 // indirect @@ -122,3 +122,9 @@ 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 + +// qu0b/spamoor carries effectiveCpsb fork-boundary fix +// (qu0b/fix/effective-cpsb-fork-race). Drop once upstreamed. +replace github.com/ethpandaops/spamoor => github.com/qu0b/spamoor v0.0.0-20260427130206-72ac11889a85 diff --git a/go.sum b/go.sum index a954be12..9a9a21d7 100644 --- a/go.sum +++ b/go.sum @@ -7,18 +7,14 @@ 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= -github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= +github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -41,14 +37,14 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/gnark-crypto v0.19.2 h1:qrEAIXq3T4egxqiliFFoNrepkIWVEeIYwt3UL0fvS80= -github.com/consensys/gnark-crypto v0.19.2/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= +github.com/consensys/gnark-crypto v0.20.1 h1:PXDUBvk8AzhvWowHLWBEAfUQcV1/aZgWIqD6eMpXmDg= +github.com/consensys/gnark-crypto v0.20.1/go.mod h1:RBWrSgy+IDbGR69RRV313th3M/aZU1ubk2om+qHuTSc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= -github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= +github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc= +github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -72,12 +68,10 @@ github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn2 github.com/ethereum/c-kzg-4844/v2 v2.1.6/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8= -github.com/ethereum/go-ethereum v1.17.1 h1:IjlQDjgxg2uL+GzPRkygGULPMLzcYWncEI7wbaizvho= -github.com/ethereum/go-ethereum v1.17.1/go.mod h1:7UWOVHL7K3b8RfVRea022btnzLCaanwHtBuH1jUCH/I= +github.com/ethereum/go-ethereum v1.17.3-0.20260421080339-499762852cf2 h1:PPbNu5NqmJ6+uo1y43tp1sBOt0a0S1gop5agy6qchMI= +github.com/ethereum/go-ethereum v1.17.3-0.20260421080339-499762852cf2/go.mod h1:KHcRXfGOUfUmKg51IhQ0IowiqZ6PqZf08CMtk0g5K1o= github.com/ethpandaops/ethwallclock v0.4.0 h1:+sgnhf4pk6hLPukP076VxkiLloE4L0Yk1yat+ZyHh1g= github.com/ethpandaops/ethwallclock v0.4.0/go.mod h1:y0Cu+mhGLlem19vnAV2x0hpFS5KZ7oOi2SWYayv9l24= -github.com/ethpandaops/spamoor v1.1.18-0.20260226103249-8d1c1fdd2de0 h1:avoDj2pij57dxnA5dpei0ND8LKVpMttvPo3E0QF/6UE= -github.com/ethpandaops/spamoor v1.1.18-0.20260226103249-8d1c1fdd2de0/go.mod h1:GW6Xjym8fliGk+Si2/dV+7M0RXIJTwW2w/ZHYXnri0A= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= @@ -280,6 +274,10 @@ 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/qu0b/spamoor v0.0.0-20260427130206-72ac11889a85 h1:RcLGHCjbWlJLNgPTMLOIyWGHbcuJS83ZD6nx0kuOcUA= +github.com/qu0b/spamoor v0.0.0-20260427130206-72ac11889a85/go.mod h1:LBTplm930TuSBdpYvV1ICDR5GfL3MkUpH7/P+HvJEEU= 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= @@ -323,6 +321,8 @@ github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZ github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= +github.com/traefik/yaegi v0.16.2-0.20260209085605-fcb76d1ece0c h1:htRmijmYfl6o44qr+narOX1invzz9J9FnAqCqH7ARio= +github.com/traefik/yaegi v0.16.2-0.20260209085605-fcb76d1ece0c/go.mod h1:4eVhbPb3LnD2VigQjhYbEJ69vDRFdT2HQNrXx8eEwUY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= @@ -346,8 +346,8 @@ go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -403,8 +403,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/pkg/clients/consensus/block_utils.go b/pkg/clients/consensus/block_utils.go index 52a352cc..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 { @@ -23,10 +24,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 +64,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 } diff --git a/pkg/tasks/check_consensus_attestation_stats/task.go b/pkg/tasks/check_consensus_attestation_stats/task.go index 957c9cfd..fb3a704e 100644 --- a/pkg/tasks/check_consensus_attestation_stats/task.go +++ b/pkg/tasks/check_consensus_attestation_stats/task.go @@ -502,7 +502,17 @@ func (t *Task) aggregateEpochVotes(ctx context.Context, epoch uint64) []*epochVo aggregationBitsOffset := uint64(0) for committee := uint64(0); committee < specs.MaxCommitteesPerSlot; committee++ { - if !committeeBits.BitAt(committee) { + // 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</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/bal-devnet-4-eels-tests.yaml b/playbooks/glamsterdam-dev/bal-devnet-4-eels-tests.yaml new file mode 100644 index 00000000..8bf8ca24 --- /dev/null +++ b/playbooks/glamsterdam-dev/bal-devnet-4-eels-tests.yaml @@ -0,0 +1,547 @@ +id: bal-devnet-4-eels-tests +name: "bal-devnet-4: Run EELS execution spec tests (all EIPs, tests-snøbal-devnet-4@v1.0.0)" +timeout: 4h +config: + walletPrivkey: "" + walletSeed: "spectests-bal4" + # Pin to the tests-snøbal-devnet-4@v1.0.0 release tag for determinism + # (commit 28e6130 on devnets/snøbal/4). Reverts cpsb to static 1174. + specTestsBranch: "tests-snøbal-devnet-4@v1.0.0" +tasks: + # install python + deps + - name: run_shell + title: "Install Python and build dependencies" + id: deps + timeout: 10m + config: + shell: bash + command: | + set -e + # apt-get / dpkg can consume stdin during package configure when run via + # assertoor's stdin-pipe shell; that swallows the rest of this script + # silently (script ends before pip install uv). Force non-interactive + # mode and redirect stdin from /dev/null on every apt invocation so + # nothing reads our pipe. + export DEBIAN_FRONTEND=noninteractive + sudo dpkg --add-architecture amd64 < /dev/null + sudo apt-get update < /dev/null + sudo apt-get install -y build-essential python3 python3-pip python3-dev libc6:amd64 autoconf automake libffi-dev libtool pkg-config < /dev/null + 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-bal4-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} + # Capture uv on PATH using the original $HOME (where pip --user installed it) + # BEFORE overriding HOME to isolate uv's cache to EELS_DIR. + export PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + 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-4 EELS tests" + id: tests + config: + continueOnFailure: true + tasks: + - name: generate_child_wallet + id: walletEip7708 + title: "Generate fresh wallet for EIP-7708" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7708" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7708: ETH transfers emit a log (incl. CREATE/CREATE2)" + 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.walletEip7708.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7778 + title: "Generate fresh wallet for EIP-7778" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7778" + configVars: + privateKey: "walletPrivkey" + - 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.walletEip7778.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7843 + title: "Generate fresh wallet for EIP-7843" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7843" + configVars: + privateKey: "walletPrivkey" + - 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.walletEip7843.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + # Skip test_slotnum_value: it asserts SLOTNUM == Environment(slot_number=N), + # but Environment(slot_number=) is a filler-time hint and cannot be honored + # in execute mode against a live chain (SLOTNUM returns the actual current + # beacon slot). Only test_slotnum_gas_cost runs in execute mode. + 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 \ + --deselect tests/amsterdam/eip7843_slotnum/test_slotnum.py::test_slotnum_value \ + --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: generate_child_wallet + id: walletEip7928 + title: "Generate fresh wallet for EIP-7928" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7928" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7928: Block-level access lists (BAL, uint32 index)" + 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.walletEip7928.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7954 + title: "Generate fresh wallet for EIP-7954" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7954" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7954: Increase maximum contract size (24K → 32K)" + 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.walletEip7954.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7976 + title: "Generate fresh wallet for EIP-7976" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7976" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7976: Increase calldata floor cost (NEW for devnet-4)" + id: eip7976 + 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.walletEip7976.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + uv run execute remote ./tests/amsterdam/eip7976_increase_calldata_floor_cost \ + --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}/eip7976.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7976.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7976.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7976.json) + echo "EIP-7976: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: generate_child_wallet + id: walletEip7981 + title: "Generate fresh wallet for EIP-7981" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip7981" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7981: Increase access list cost (NEW for devnet-4)" + id: eip7981 + 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.walletEip7981.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + uv run execute remote ./tests/amsterdam/eip7981_increase_access_list_cost \ + --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}/eip7981.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7981.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7981.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7981.json) + echo "EIP-7981: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: generate_child_wallet + id: walletEip8024 + title: "Generate fresh wallet for EIP-8024" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip8024" + configVars: + privateKey: "walletPrivkey" + - 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.walletEip8024.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip8037 + title: "Generate fresh wallet for EIP-8037" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip8037" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-8037: State creation gas cost increase (dynamic cpsb)" + 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.walletEip8037.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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/bal-devnet-4-eip8024-stack235-only.yaml b/playbooks/glamsterdam-dev/bal-devnet-4-eip8024-stack235-only.yaml new file mode 100644 index 00000000..cadb9060 --- /dev/null +++ b/playbooks/glamsterdam-dev/bal-devnet-4-eip8024-stack235-only.yaml @@ -0,0 +1,127 @@ +id: bal-devnet-4-eip8024-stack235-only +name: "bal-devnet-4: Run EELS EIP-8024 swapn_stack_235 only (debug repro, EEST PR #2760)" +timeout: 1h +config: + walletPrivkey: "" + walletSeed: "spectests-bal4-stack235-fix" + # Pinned to qu0b/execution-specs branch that is tests-bal@v5.7.0 with the + # PR #2760 fix cherry-picked on top (EIP-8037 deploy_contract state-gas). + specTestsRepo: "https://github.com/qu0b/execution-specs.git" + specTestsBranch: "qu0b/tests-bal-v5.7.0-deploy-state-gas-fix" +tasks: + - name: run_shell + title: "Install Python and build dependencies" + id: deps + timeout: 10m + config: + shell: bash + command: | + set -e + export DEBIAN_FRONTEND=noninteractive + sudo dpkg --add-architecture amd64 < /dev/null + sudo apt-get update < /dev/null + sudo apt-get install -y build-essential python3 python3-pip python3-dev libc6:amd64 autoconf automake libffi-dev libtool pkg-config < /dev/null + sudo rm /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true + pip install uv + + - name: run_shell + title: "Clone EELS (execution-specs)" + id: setup + timeout: 10m + config: + shell: bash + shellArgs: [--login] + envVars: + GIT_BRANCH: specTestsBranch + GIT_REPO: specTestsRepo + command: | + set -e + GIT_BRANCH=$(echo $GIT_BRANCH | jq -r) + GIT_REPO=$(echo $GIT_REPO | jq -r) + + EELS_DIR=$(mktemp -d -t eels-bal4-XXXXXXXXXX) + echo "::set-var eelsDir ${EELS_DIR}" + echo "${EELS_DIR}" > $ASSERTOOR_SUMMARY + + git clone ${GIT_REPO} \ + --depth 1 --branch ${GIT_BRANCH} --single-branch ${EELS_DIR} + + cd ${EELS_DIR} + export PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + 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: 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" + + - name: generate_child_wallet + id: walletEip8024 + title: "Generate fresh wallet for EIP-8024" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal4-eip8024-stack235" + configVars: + privateKey: "walletPrivkey" + + - name: run_shell + title: "EIP-8024: swapn_stack_235 only" + id: eip8024_stack235 + 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.walletEip8024.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + uv run execute remote ./tests/amsterdam/eip8024_dupn_swapn_exchange/test_swapn.py \ + -k "test_swapn_basic and swapn_stack_235" \ + --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_stack235.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip8024_stack235.html \ + -v \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip8024_stack235.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip8024_stack235.json) + echo "EIP-8024 swapn_stack_235: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + if [ "${PASSED}" != "${TOTAL}" ]; then + jq '.tests[] | select(.outcome != "passed")' ${ASSERTOOR_RESULT_DIR}/eip8024_stack235.json + exit 1 + fi diff --git a/playbooks/glamsterdam-dev/bal-devnet-5-eels-tests.yaml b/playbooks/glamsterdam-dev/bal-devnet-5-eels-tests.yaml new file mode 100644 index 00000000..d113d846 --- /dev/null +++ b/playbooks/glamsterdam-dev/bal-devnet-5-eels-tests.yaml @@ -0,0 +1,549 @@ +id: bal-devnet-5-eels-tests +name: "bal-devnet-5: Run EELS execution spec tests (all EIPs, tests-snobal-devnet-5@v8037.0.0)" +timeout: 4h +config: + walletPrivkey: "" + walletSeed: "spectests-bal5" + # Pin to the tests-snobal-devnet-5@v8037.0.0 release tag for determinism + # (commit 9c0ed45 on devnets/snobal/5). EIP-8037 changes vs devnet-4: + # CPSB stays static at 1174 (dynamic derivation removed) and state gas is + # now charged at frame boundaries (frame-end accounting) instead of inline. + specTestsBranch: "tests-snobal-devnet-5@v8037.0.0" +tasks: + # install python + deps + - name: run_shell + title: "Install Python and build dependencies" + id: deps + timeout: 10m + config: + shell: bash + command: | + set -e + # apt-get / dpkg can consume stdin during package configure when run via + # assertoor's stdin-pipe shell; that swallows the rest of this script + # silently (script ends before pip install uv). Force non-interactive + # mode and redirect stdin from /dev/null on every apt invocation so + # nothing reads our pipe. + export DEBIAN_FRONTEND=noninteractive + sudo dpkg --add-architecture amd64 < /dev/null + sudo apt-get update < /dev/null + sudo apt-get install -y build-essential python3 python3-pip python3-dev libc6:amd64 autoconf automake libffi-dev libtool pkg-config < /dev/null + 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-bal5-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} + # Capture uv on PATH using the original $HOME (where pip --user installed it) + # BEFORE overriding HOME to isolate uv's cache to EELS_DIR. + export PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + 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-5 EELS tests" + id: tests + config: + continueOnFailure: true + tasks: + - name: generate_child_wallet + id: walletEip7708 + title: "Generate fresh wallet for EIP-7708" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7708" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7708: ETH transfers emit a log (incl. CREATE/CREATE2)" + 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.walletEip7708.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7778 + title: "Generate fresh wallet for EIP-7778" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7778" + configVars: + privateKey: "walletPrivkey" + - 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.walletEip7778.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7843 + title: "Generate fresh wallet for EIP-7843" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7843" + configVars: + privateKey: "walletPrivkey" + - 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.walletEip7843.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + # Skip test_slotnum_value: it asserts SLOTNUM == Environment(slot_number=N), + # but Environment(slot_number=) is a filler-time hint and cannot be honored + # in execute mode against a live chain (SLOTNUM returns the actual current + # beacon slot). Only test_slotnum_gas_cost runs in execute mode. + 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 \ + --deselect tests/amsterdam/eip7843_slotnum/test_slotnum.py::test_slotnum_value \ + --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: generate_child_wallet + id: walletEip7928 + title: "Generate fresh wallet for EIP-7928" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7928" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7928: Block-level access lists (BAL, uint32 index)" + 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.walletEip7928.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7954 + title: "Generate fresh wallet for EIP-7954" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7954" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7954: Increase maximum contract size (24K → 32K)" + 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.walletEip7954.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip7976 + title: "Generate fresh wallet for EIP-7976" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7976" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7976: Increase calldata floor cost (unchanged from devnet-4)" + id: eip7976 + 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.walletEip7976.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + uv run execute remote ./tests/amsterdam/eip7976_increase_calldata_floor_cost \ + --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}/eip7976.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7976.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7976.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7976.json) + echo "EIP-7976: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: generate_child_wallet + id: walletEip7981 + title: "Generate fresh wallet for EIP-7981" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip7981" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-7981: Increase access list cost (unchanged from devnet-4)" + id: eip7981 + 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.walletEip7981.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + uv run execute remote ./tests/amsterdam/eip7981_increase_access_list_cost \ + --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}/eip7981.json \ + --html=${ASSERTOOR_RESULT_DIR}/eip7981.html \ + || true + + TOTAL=$(jq '.tests | length' ${ASSERTOOR_RESULT_DIR}/eip7981.json) + PASSED=$(jq '[.tests[] | select(.outcome == "passed")] | length' ${ASSERTOOR_RESULT_DIR}/eip7981.json) + echo "EIP-7981: ${PASSED}/${TOTAL}" + echo "::set-output passed ${PASSED}" + echo "::set-output total ${TOTAL}" + + - name: generate_child_wallet + id: walletEip8024 + title: "Generate fresh wallet for EIP-8024" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip8024" + configVars: + privateKey: "walletPrivkey" + - 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.walletEip8024.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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: generate_child_wallet + id: walletEip8037 + title: "Generate fresh wallet for EIP-8037" + config: + prefundMinBalance: 1000000000000000000000000 # 1M ETH + walletSeed: "spectests-bal5-eip8037" + configVars: + privateKey: "walletPrivkey" + - name: run_shell + title: "EIP-8037: State creation gas cost (static cpsb=1174, frame-end accounting)" + 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.walletEip8037.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 PATH=$PATH:$HOME/.local/bin + export HOME=${EELS_DIR} + + 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"