Skip to content

Commit 55b655b

Browse files
ARR4NCopilotStephenButtolph
authored
feat: emulate package for temporary libevm registration (#4430)
Signed-off-by: Arran Schlosberg <519948+ARR4N@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Stephen Buttolph <stephen@avalabs.org>
1 parent ccd637e commit 55b655b

File tree

4 files changed

+169
-32
lines changed

4 files changed

+169
-32
lines changed

go.mod

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ require (
2121
github.com/DataDog/zstd v1.5.2
2222
github.com/StephenButtolph/canoto v0.17.2
2323
github.com/antithesishq/antithesis-sdk-go v0.3.8
24-
github.com/ava-labs/coreth v0.15.4-rc.4
24+
github.com/ava-labs/coreth v0.15.5-0.20251022172030-6c57d8ace537
2525
github.com/ava-labs/ledger-avalanche-go v1.1.0
26-
github.com/ava-labs/libevm v1.13.15-0.20251002164226-35926db4d661
26+
github.com/ava-labs/libevm v1.13.15-0.20251016142715-1bccf4f2ddb2
27+
github.com/ava-labs/subnet-evm v0.8.0-fuji-rc.0.0.20251028200304-b91527f73c61
2728
github.com/btcsuite/btcd/btcutil v1.1.3
2829
github.com/cespare/xxhash/v2 v2.3.0
2930
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593
@@ -68,14 +69,14 @@ require (
6869
go.uber.org/goleak v1.3.0
6970
go.uber.org/mock v0.5.0
7071
go.uber.org/zap v1.27.0
71-
golang.org/x/crypto v0.42.0
72+
golang.org/x/crypto v0.43.0
7273
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e
73-
golang.org/x/mod v0.28.0
74-
golang.org/x/net v0.44.0
74+
golang.org/x/mod v0.29.0
75+
golang.org/x/net v0.46.0
7576
golang.org/x/sync v0.17.0
76-
golang.org/x/term v0.35.0
77+
golang.org/x/term v0.36.0
7778
golang.org/x/time v0.12.0
78-
golang.org/x/tools v0.37.0
79+
golang.org/x/tools v0.38.0
7980
gonum.org/v1/gonum v0.16.0
8081
google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c
8182
google.golang.org/grpc v1.75.0
@@ -93,7 +94,7 @@ require (
9394
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect
9495
github.com/Microsoft/go-winio v0.6.1 // indirect
9596
github.com/VictoriaMetrics/fastcache v1.12.1 // indirect
96-
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.12 // indirect
97+
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.13 // indirect
9798
github.com/ava-labs/simplex v0.0.0-20250919142550-9cdfff10fd19
9899
github.com/beorn7/perks v1.0.1 // indirect
99100
github.com/bits-and-blooms/bitset v1.20.0 // indirect
@@ -193,8 +194,8 @@ require (
193194
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
194195
go.uber.org/multierr v1.11.0 // indirect
195196
golang.org/x/oauth2 v0.30.0 // indirect
196-
golang.org/x/sys v0.36.0 // indirect
197-
golang.org/x/text v0.29.0 // indirect
197+
golang.org/x/sys v0.37.0 // indirect
198+
golang.org/x/text v0.30.0 // indirect
198199
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
199200
gopkg.in/inf.v0 v0.9.1 // indirect
200201
gopkg.in/yaml.v2 v2.4.0 // indirect

go.sum

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,18 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV
7575
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
7676
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
7777
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
78-
github.com/ava-labs/coreth v0.15.4-rc.4 h1:ze7/IwDptWG1u2d32uUZz9Ix9ycVUtlB8JufuSKSSS4=
79-
github.com/ava-labs/coreth v0.15.4-rc.4/go.mod h1:yVwuMyPkZ48xzZ0y2OdIwaoUqvSsgPYoodyX9BZJ2uo=
80-
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.12 h1:aMcrLbpJ/dyu2kZDf/Di/4JIWsUcYPyTDKymiHpejt0=
81-
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.12/go.mod h1:cq89ua3iiZ5wPBALTEQS5eG8DIZcs7ov6OiL4YR1BVY=
78+
github.com/ava-labs/coreth v0.15.5-0.20251022172030-6c57d8ace537 h1:M173eUWGlvAbf9Q0M+WwYaNdUp6X1uZ5s/u9O9hZM+g=
79+
github.com/ava-labs/coreth v0.15.5-0.20251022172030-6c57d8ace537/go.mod h1:4+gR+5AJjqsw1Pw3O3tpwJG6DRmFBzGGZtFv8iRML2k=
80+
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.13 h1:obPwnVCkF5+B2f8WbTepHj0ZgiW21vKUgFCtATuAYNY=
81+
github.com/ava-labs/firewood-go-ethhash/ffi v0.0.13/go.mod h1:gsGr1ICjokI9CyPaaRHMqDoDCaT1VguC/IyOTx6rJ14=
8282
github.com/ava-labs/ledger-avalanche-go v1.1.0 h1:OkscKtb/gX20HBt8RyAtwXLrQnCEls5SzWGieE7NoNM=
8383
github.com/ava-labs/ledger-avalanche-go v1.1.0/go.mod h1:mAlG9ptnPjvNoLGLHXnM3slGY8ewvBJtJNVTEjG8KvI=
84-
github.com/ava-labs/libevm v1.13.15-0.20251002164226-35926db4d661 h1:lt4yQE1HMvxWrdD5RFj+h9kWUsZK2rmNohvkeQsbG9M=
85-
github.com/ava-labs/libevm v1.13.15-0.20251002164226-35926db4d661/go.mod h1:ivRC/KojP8sai7j8WnpXIReQpcRklL2bIzoysnjpARQ=
84+
github.com/ava-labs/libevm v1.13.15-0.20251016142715-1bccf4f2ddb2 h1:hQ15IJxY7WOKqeJqCXawsiXh0NZTzmoQOemkWHz7rr4=
85+
github.com/ava-labs/libevm v1.13.15-0.20251016142715-1bccf4f2ddb2/go.mod h1:DqSotSn4Dx/UJV+d3svfW8raR+cH7+Ohl9BpsQ5HlGU=
8686
github.com/ava-labs/simplex v0.0.0-20250919142550-9cdfff10fd19 h1:S6oFasZsplNmw8B2S8cMJQMa62nT5ZKGzZRdCpd+5qQ=
8787
github.com/ava-labs/simplex v0.0.0-20250919142550-9cdfff10fd19/go.mod h1:GVzumIo3zR23/qGRN2AdnVkIPHcKMq/D89EGWZfMGQ0=
88+
github.com/ava-labs/subnet-evm v0.8.0-fuji-rc.0.0.20251028200304-b91527f73c61 h1:9wIpv0Sw/LsGSFqvszIpWFacHXrj2ezMrUG/WLCYKaw=
89+
github.com/ava-labs/subnet-evm v0.8.0-fuji-rc.0.0.20251028200304-b91527f73c61/go.mod h1:XtwTC47oU3sUFRdSIFKlG9IYoWW30UyFCT9tpnMv4lY=
8890
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
8991
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
9092
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -284,8 +286,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
284286
github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM=
285287
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
286288
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
287-
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
288-
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
289+
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
290+
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
289291
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
290292
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
291293
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -796,8 +798,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
796798
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
797799
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
798800
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
799-
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
800-
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
801+
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
802+
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
801803
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
802804
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
803805
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -838,8 +840,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
838840
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
839841
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
840842
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
841-
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
842-
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
843+
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
844+
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
843845
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
844846
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
845847
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -890,8 +892,8 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug
890892
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
891893
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
892894
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
893-
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
894-
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
895+
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
896+
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
895897
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
896898
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
897899
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -991,14 +993,14 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
991993
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
992994
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
993995
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
994-
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
995-
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
996+
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
997+
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
996998
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
997999
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
9981000
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
9991001
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
1000-
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
1001-
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
1002+
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
1003+
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
10021004
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
10031005
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
10041006
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1011,8 +1013,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
10111013
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
10121014
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
10131015
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
1014-
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
1015-
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
1016+
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
1017+
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
10161018
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
10171019
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
10181020
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1078,8 +1080,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
10781080
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
10791081
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
10801082
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
1081-
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
1082-
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
1083+
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
1084+
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
10831085
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
10841086
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
10851087
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

vms/evm/emulate/emulate.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
4+
// Package emulate provides temporary emulation of coreth (C-Chain) and
5+
// subnet-evm (EVM L1) behaviours. All functions are safe for concurrent use
6+
// with each other, but all hold the same mutex so their execution SHOULD be
7+
// short-lived.
8+
package emulate
9+
10+
import (
11+
cchain "github.com/ava-labs/coreth/plugin/evm"
12+
subnet "github.com/ava-labs/subnet-evm/plugin/evm"
13+
)
14+
15+
// CChain executes `fn` as if running in a `coreth` node.
16+
func CChain(fn func() error) error {
17+
return cchain.WithTempRegisteredLibEVMExtras(fn)
18+
}
19+
20+
// SubnetEVM executes `fn` as if running in a `subnet-evm` node.
21+
func SubnetEVM(fn func() error) error {
22+
return subnet.WithTempRegisteredLibEVMExtras(fn)
23+
}
24+
25+
// CChainVal executes `fn` as if running in a `coreth` node.
26+
func CChainVal[T any](fn func() (T, error)) (T, error) {
27+
return val(CChain, fn)
28+
}
29+
30+
// SubnetEVMVal executes `fn` as if running in a `subnet-evm` node.
31+
func SubnetEVMVal[T any](fn func() (T, error)) (T, error) {
32+
return val(SubnetEVM, fn)
33+
}
34+
35+
func val[T any](
36+
wrap func(func() error) error,
37+
fn func() (T, error),
38+
) (T, error) {
39+
var v T
40+
err := wrap(func() error {
41+
var err error
42+
v, err = fn()
43+
return err
44+
})
45+
return v, err
46+
}

vms/evm/emulate/emulate_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
4+
package emulate
5+
6+
import (
7+
"errors"
8+
"sync/atomic"
9+
"testing"
10+
11+
"github.com/ava-labs/libevm/core/types"
12+
"github.com/stretchr/testify/require"
13+
14+
cchain "github.com/ava-labs/coreth/plugin/evm/customtypes"
15+
subnet "github.com/ava-labs/subnet-evm/plugin/evm/customtypes"
16+
)
17+
18+
// setAndGetMillis is an arbitrary function that can be run if and only if
19+
// emulating either `coreth` or `subnet-evm`. If the respective emulation isn't
20+
// active then it will cause `libevm` to panic. In addition to the panicking
21+
// behaviour, it asserts that it is the only active emulation.
22+
func setAndGetMillis[T *cchain.HeaderExtra | *subnet.HeaderExtra](
23+
t *testing.T,
24+
active *atomic.Int64,
25+
withExtra func(*types.Header, T) *types.Header,
26+
extra T,
27+
blockMillis func(*types.Block) *uint64,
28+
retErr error,
29+
) func() (*uint64, error) {
30+
return func() (*uint64, error) {
31+
require.True(t, active.CompareAndSwap(0, 1))
32+
defer func() {
33+
require.True(t, active.CompareAndSwap(1, 0))
34+
}()
35+
36+
b := types.NewBlockWithHeader(withExtra(
37+
&types.Header{},
38+
extra,
39+
))
40+
return blockMillis(b), retErr
41+
}
42+
}
43+
44+
func TestEmulation(t *testing.T) {
45+
const milli = uint64(1234)
46+
newUint64 := func(u uint64) *uint64 { return &u }
47+
sentinel := errors.New("uh oh")
48+
49+
var active atomic.Int64
50+
onCChain := setAndGetMillis(
51+
t, &active,
52+
cchain.WithHeaderExtra,
53+
&cchain.HeaderExtra{TimeMilliseconds: newUint64(milli)},
54+
cchain.BlockTimeMilliseconds,
55+
sentinel,
56+
)
57+
onSubnetEVM := setAndGetMillis(
58+
t, &active,
59+
subnet.WithHeaderExtra,
60+
&subnet.HeaderExtra{TimeMilliseconds: newUint64(milli)},
61+
subnet.BlockTimeMilliseconds,
62+
sentinel,
63+
)
64+
65+
start := make(chan struct{})
66+
67+
t.Run("coreth", func(t *testing.T) {
68+
t.Parallel()
69+
<-start
70+
for range 1000 {
71+
got, err := CChainVal(onCChain)
72+
require.ErrorIs(t, err, sentinel)
73+
require.Equal(t, milli, *got)
74+
}
75+
})
76+
77+
t.Run("subnet-evm", func(t *testing.T) {
78+
t.Parallel()
79+
<-start
80+
for range 1000 {
81+
got, err := SubnetEVMVal(onSubnetEVM)
82+
require.ErrorIs(t, err, sentinel)
83+
require.Equal(t, milli, *got)
84+
}
85+
})
86+
87+
close(start)
88+
}

0 commit comments

Comments
 (0)