diff --git a/core/types/header_ext.go b/core/types/header_ext.go new file mode 100644 index 0000000000..e680ee7798 --- /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) EncodeJSON(eth *ethtypes.Header) ([]byte, error) { + panic("not implemented") +} + +func (h *HeaderExtra) DecodeJSON(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..0c3cb7ab8d 100644 --- a/core/types/state_account.go +++ b/core/types/state_account.go @@ -46,8 +46,15 @@ var ( type isMultiCoin bool -var IsMultiCoinPayloads = ethtypes.RegisterExtras[isMultiCoin]() +var ( + extras = ethtypes.RegisterExtras[ + ethtypes.NOOPHeaderHooks, *ethtypes.NOOPHeaderHooks, + ethtypes.NOOPBlockBodyHooks, *ethtypes.NOOPBlockBodyHooks, + 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..e498b18a3e 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,13 @@ module github.com/ava-labs/coreth -go 1.22.8 +go 1.23 + +toolchain go1.23.6 require ( github.com/VictoriaMetrics/fastcache v1.12.1 github.com/ava-labs/avalanchego v1.12.1-0.20250107220127-32f58b4fa9c8 - github.com/ava-labs/libevm v1.13.14-0.1.0.rc-2 + github.com/ava-labs/libevm v1.13.14-0.2.0.rc.3 github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 github.com/davecgh/go-spew v1.1.1 github.com/deckarep/golang-set/v2 v2.1.0 diff --git a/go.sum b/go.sum index 2c5b99975c..ee1a057217 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 v1.13.14-0.2.0.rc.3 h1:1CWGo2icnX9dRqGQl7CFywYGIZWxe+ucy0w8NAsVTWE= +github.com/ava-labs/libevm v1.13.14-0.2.0.rc.3/go.mod h1:+Iol+sVQ1KyoBsHf3veyrBmHCXr3xXRWq6ZXkgVfNLU= 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"