From ab196794127c43df354a11469637999fdbd6172a Mon Sep 17 00:00:00 2001 From: Quentin Mc Gaw Date: Mon, 10 Feb 2025 15:29:02 +0100 Subject: [PATCH] chore(all): minimal changes for last libevm dependency - Uses tip of main libevm dependency + cherry picked commit: https://github.com/ava-labs/libevm/commit/d3f6a5e75e05bdef9416d68b7836fa54013d4f1c - Precompile legacy gas fix (done in https://github.com/ava-labs/libevm/commit/f906679f6fc71e972c7910951c759a5be75d69fa) - Added `HeaderExtra` not-implemented implementation - Minimal changes shamelessly copied over from #746 --- accounts/abi/bind/bind_test.go | 5 +++++ core/types/header_ext.go | 36 +++++++++++++++++++++++++++++++ core/types/state_account.go | 9 +++++--- go.mod | 2 ++ go.sum | 4 ++-- nativeasset/contract.go | 2 +- params/config_extra.go | 6 +++--- params/hooks_libevm.go | 7 +++--- precompile/contract/interfaces.go | 2 +- precompile/contract/mocks.go | 7 +++--- scripts/eth-allowed-packages.txt | 1 + scripts/tests.e2e.sh | 1 + 12 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 core/types/header_ext.go diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index c1035f6b8a..e9a2467624 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -2179,6 +2179,11 @@ func golangBindings(t *testing.T, overload bool) { if out, err := replacer.CombinedOutput(); err != nil { t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out) } + replacer = exec.Command(gocmd, "mod", "edit", "-x", "-require", "github.com/ava-labs/libevm@v0.0.0", "-replace", "github.com/ava-labs/libevm=github.com/ava-labs/libevm@v0.0.0-20250210135835-d3f6a5e75e05") + replacer.Dir = pkg + if out, err := replacer.CombinedOutput(); err != nil { + t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out) + } tidier := exec.Command(gocmd, "mod", "tidy", "-compat=1.22") tidier.Dir = pkg if out, err := tidier.CombinedOutput(); err != nil { diff --git a/core/types/header_ext.go b/core/types/header_ext.go new file mode 100644 index 0000000000..1096777d6f --- /dev/null +++ b/core/types/header_ext.go @@ -0,0 +1,36 @@ +// (c) 2025, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package types + +import ( + "io" + + ethtypes "github.com/ava-labs/libevm/core/types" + "github.com/ava-labs/libevm/rlp" +) + +// HeaderExtra is a struct that contains extra fields used by Avalanche +// in the block header. +type HeaderExtra struct { +} + +func (h *HeaderExtra) EncodeRLP(eth *ethtypes.Header, writer io.Writer) error { + panic("not implemented") +} + +func (h *HeaderExtra) DecodeRLP(eth *ethtypes.Header, stream *rlp.Stream) error { + panic("not implemented") +} + +func (h *HeaderExtra) MarshalJSON(eth *ethtypes.Header) ([]byte, error) { + panic("not implemented") +} + +func (h *HeaderExtra) UnmarshalJSON(eth *ethtypes.Header, input []byte) error { + panic("not implemented") +} + +func (h *HeaderExtra) PostCopy(dst *ethtypes.Header) { + panic("not implemented") +} diff --git a/core/types/state_account.go b/core/types/state_account.go index 9af3d4ce15..c0e3df824f 100644 --- a/core/types/state_account.go +++ b/core/types/state_account.go @@ -46,8 +46,11 @@ var ( type isMultiCoin bool -var IsMultiCoinPayloads = ethtypes.RegisterExtras[isMultiCoin]() +var ( + extras = ethtypes.RegisterExtras[ethtypes.NOOPHeaderHooks, *ethtypes.NOOPHeaderHooks, isMultiCoin]() + IsMultiCoinPayloads = extras.StateAccount +) -func IsMultiCoin(a ethtypes.ExtraPayloadCarrier) bool { - return bool(IsMultiCoinPayloads.FromPayloadCarrier(a)) +func IsMultiCoin(s ethtypes.StateOrSlimAccount) bool { + return bool(extras.StateAccount.Get(s)) } diff --git a/go.mod b/go.mod index 7b23e789b0..6e917bd14f 100644 --- a/go.mod +++ b/go.mod @@ -135,3 +135,5 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/ava-labs/libevm => github.com/ava-labs/libevm v0.0.0-20250210135835-d3f6a5e75e05 diff --git a/go.sum b/go.sum index 2c5b99975c..6b465ceb3f 100644 --- a/go.sum +++ b/go.sum @@ -58,8 +58,8 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/ava-labs/avalanchego v1.12.1-0.20250107220127-32f58b4fa9c8 h1:qN3MOBHB//Ynhgt5Vys3iVe42Sr0EWSeN18VL3ecXzE= github.com/ava-labs/avalanchego v1.12.1-0.20250107220127-32f58b4fa9c8/go.mod h1:2B7+E5neLvkOr2zursGhebjU26d4AfB7RazPxBs8hHg= -github.com/ava-labs/libevm v1.13.14-0.1.0.rc-2 h1:CVbn0hSsPCl6gCkTCnqwuN4vtJgdVbkCqLXzYAE7qF8= -github.com/ava-labs/libevm v1.13.14-0.1.0.rc-2/go.mod h1:yBctIV/wnxXTF38h95943jvpuk4aj07TrjbpoGor6LQ= +github.com/ava-labs/libevm v0.0.0-20250210135835-d3f6a5e75e05 h1:LzpeCE04Opu8tepYoA1xxdWCYZI7J0etGcBAzABt6j0= +github.com/ava-labs/libevm v0.0.0-20250210135835-d3f6a5e75e05/go.mod h1:M8TCw2g1D5GBB7hu7g1F4aot5bRHGSxnBawNVmHE9Z0= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= diff --git a/nativeasset/contract.go b/nativeasset/contract.go index e08e0d652e..523e55b33c 100644 --- a/nativeasset/contract.go +++ b/nativeasset/contract.go @@ -141,7 +141,7 @@ func (c *NativeAssetCall) Run(accessibleState contract.AccessibleState, caller c stateDB.SubBalanceMultiCoin(caller, assetID, assetAmount) stateDB.AddBalanceMultiCoin(to, assetID, assetAmount) - ret, remainingGas, err = accessibleState.Call(to, callData, remainingGas, new(uint256.Int), vm.WithUNSAFECallerAddressProxying()) + ret, err = accessibleState.Call(to, callData, remainingGas, new(uint256.Int), vm.WithUNSAFECallerAddressProxying()) // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally diff --git a/params/config_extra.go b/params/config_extra.go index a9e5b0bdd9..17cee401e0 100644 --- a/params/config_extra.go +++ b/params/config_extra.go @@ -59,10 +59,10 @@ func SetEthUpgrades(c *ChainConfig) { } func GetExtra(c *ChainConfig) *extras.ChainConfig { - ex := payloads.FromChainConfig(c) + ex := payloads.ChainConfig.Get(c) if ex == nil { ex = &extras.ChainConfig{} - payloads.SetOnChainConfig(c, ex) + payloads.ChainConfig.Set(c, ex) } return ex } @@ -75,7 +75,7 @@ func Copy(c *ChainConfig) ChainConfig { // WithExtra sets the extra payload on `c` and returns the modified argument. func WithExtra(c *ChainConfig, extra *extras.ChainConfig) *ChainConfig { - payloads.SetOnChainConfig(c, extra) + payloads.ChainConfig.Set(c, extra) return c } diff --git a/params/hooks_libevm.go b/params/hooks_libevm.go index b26a7a36b3..759bd189cb 100644 --- a/params/hooks_libevm.go +++ b/params/hooks_libevm.go @@ -16,6 +16,7 @@ import ( "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/core/vm" "github.com/ava-labs/libevm/libevm" + "github.com/ava-labs/libevm/libevm/legacy" "github.com/holiman/uint256" "golang.org/x/exp/maps" ) @@ -23,7 +24,7 @@ import ( type RulesExtra extras.Rules func GetRulesExtra(r Rules) *extras.Rules { - rules := payloads.PointerFromRules(&r) + rules := payloads.Rules.GetPointer(&r) return (*extras.Rules)(rules) } @@ -125,7 +126,7 @@ func makePrecompile(contract contract.StatefulPrecompiledContract) libevm.Precom } return contract.Run(accessableState, env.Addresses().Caller, env.Addresses().Self, input, suppliedGas, env.ReadOnly()) } - return vm.NewStatefulPrecompile(run) + return vm.NewStatefulPrecompile(legacy.PrecompiledStatefulContract(run).Upgrade()) } func (r RulesExtra) PrecompileOverride(addr common.Address) (libevm.PrecompiledContract, bool) { @@ -171,7 +172,7 @@ func (a accessableState) GetSnowContext() *snow.Context { return GetExtra(a.env.ChainConfig()).SnowCtx } -func (a accessableState) Call(addr common.Address, input []byte, gas uint64, value *uint256.Int, opts ...vm.CallOption) (ret []byte, gasRemaining uint64, _ error) { +func (a accessableState) Call(addr common.Address, input []byte, gas uint64, value *uint256.Int, opts ...vm.CallOption) (ret []byte, err error) { return a.env.Call(addr, input, gas, value, opts...) } diff --git a/precompile/contract/interfaces.go b/precompile/contract/interfaces.go index 7de1423a02..a1ae9d5682 100644 --- a/precompile/contract/interfaces.go +++ b/precompile/contract/interfaces.go @@ -61,7 +61,7 @@ type AccessibleState interface { GetBlockContext() BlockContext GetSnowContext() *snow.Context GetChainConfig() precompileconfig.ChainConfig - Call(addr common.Address, input []byte, gas uint64, value *uint256.Int, opts ...vm.CallOption) (ret []byte, gasRemaining uint64, _ error) + Call(addr common.Address, input []byte, gas uint64, value *uint256.Int, opts ...vm.CallOption) (ret []byte, _ error) } // ConfigurationBlockContext defines the interface required to configure a precompile. diff --git a/precompile/contract/mocks.go b/precompile/contract/mocks.go index 6a83011623..6da91cc237 100644 --- a/precompile/contract/mocks.go +++ b/precompile/contract/mocks.go @@ -306,7 +306,7 @@ func (m *MockAccessibleState) EXPECT() *MockAccessibleStateMockRecorder { } // Call mocks base method. -func (m *MockAccessibleState) Call(addr common.Address, input []byte, gas uint64, value *uint256.Int, opts ...vm.CallOption) ([]byte, uint64, error) { +func (m *MockAccessibleState) Call(addr common.Address, input []byte, gas uint64, value *uint256.Int, opts ...vm.CallOption) ([]byte, error) { m.ctrl.T.Helper() varargs := []any{addr, input, gas, value} for _, a := range opts { @@ -314,9 +314,8 @@ func (m *MockAccessibleState) Call(addr common.Address, input []byte, gas uint64 } ret := m.ctrl.Call(m, "Call", varargs...) ret0, _ := ret[0].([]byte) - ret1, _ := ret[1].(uint64) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 + ret1, _ := ret[1].(error) + return ret0, ret1 } // Call indicates an expected call of Call. diff --git a/scripts/eth-allowed-packages.txt b/scripts/eth-allowed-packages.txt index 6f69e52bcd..0f200f77f5 100644 --- a/scripts/eth-allowed-packages.txt +++ b/scripts/eth-allowed-packages.txt @@ -25,6 +25,7 @@ "github.com/ava-labs/libevm/ethdb/pebble" "github.com/ava-labs/libevm/event" "github.com/ava-labs/libevm/libevm" +"github.com/ava-labs/libevm/libevm/legacy" "github.com/ava-labs/libevm/libevm/stateconf" "github.com/ava-labs/libevm/log" "github.com/ava-labs/libevm/params" diff --git a/scripts/tests.e2e.sh b/scripts/tests.e2e.sh index 85f5bd3d48..c54f521360 100755 --- a/scripts/tests.e2e.sh +++ b/scripts/tests.e2e.sh @@ -45,6 +45,7 @@ git checkout -B "test-${AVALANCHE_VERSION}" "${AVALANCHE_VERSION}" echo "updating coreth dependency to point to ${CORETH_PATH}" go mod edit -replace "github.com/ava-labs/coreth=${CORETH_PATH}" +go mod edit -replace "github.com/ava-labs/libevm=github.com/ava-labs/libevm@v0.0.0-20250210135835-d3f6a5e75e05" go mod tidy echo "building avalanchego"