diff --git a/go.mod b/go.mod index 0c86fa30..abe66aa8 100644 --- a/go.mod +++ b/go.mod @@ -7,10 +7,10 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/gin-gonic/gin v1.9.1 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.14 + github.com/multiversx/mx-chain-core-go v1.2.17 github.com/multiversx/mx-chain-crypto-go v1.2.8 github.com/multiversx/mx-chain-logger-go v1.0.13 - github.com/multiversx/mx-chain-vm-common-go v1.5.5 + github.com/multiversx/mx-chain-vm-common-go v1.5.6 github.com/multiversx/mx-components-big-int v1.0.0 github.com/pelletier/go-toml v1.9.3 github.com/stretchr/testify v1.8.3 diff --git a/go.sum b/go.sum index 910df395..b77094dd 100644 --- a/go.sum +++ b/go.sum @@ -67,14 +67,14 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiversx/mx-chain-core-go v1.2.14 h1:TAfJ3aUcT54JCWtmfsSvzsVEQKfLZ0Di0bZG6XoXc1w= -github.com/multiversx/mx-chain-core-go v1.2.14/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= +github.com/multiversx/mx-chain-core-go v1.2.17 h1:/7YEuowxnpOtZLAJbuibNWE/8rDcG+WMhNVvrnljPg0= +github.com/multiversx/mx-chain-core-go v1.2.17/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= github.com/multiversx/mx-chain-crypto-go v1.2.8 h1:wOgVlUaO5X4L8iEbFjcQcL8SZvv6WZ7LqH73BiRPhxU= github.com/multiversx/mx-chain-crypto-go v1.2.8/go.mod h1:fkaWKp1rbQN9wPKya5jeoRyC+c/SyN/NfggreyeBw+8= github.com/multiversx/mx-chain-logger-go v1.0.13 h1:eru/TETo0MkO4ZTnXsQDKf4PBRpAXmqjT02klNT/JnY= github.com/multiversx/mx-chain-logger-go v1.0.13/go.mod h1:MZJhTAtZTJxT+yK2EHc4ZW3YOHUc1UdjCD0iahRNBZk= -github.com/multiversx/mx-chain-vm-common-go v1.5.5 h1:NoG73lvcHSeUcoFlYybG8ceGuJ6KptD3QJjUNEnGDVk= -github.com/multiversx/mx-chain-vm-common-go v1.5.5/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= +github.com/multiversx/mx-chain-vm-common-go v1.5.6 h1:hAWCIkFc5vcweBzpataVsJf0PCPc7tfQBGW/q8nzQ8A= +github.com/multiversx/mx-chain-vm-common-go v1.5.6/go.mod h1:S8bbBlbOVKgl8YBnlmmHakYiSXjKPcSd6WW+Nku/Xys= github.com/multiversx/mx-components-big-int v1.0.0 h1:Wkr8lSzK2nDqixOrrBa47VNuqdhV1m/aJhaP1EMaiS8= github.com/multiversx/mx-components-big-int v1.0.0/go.mod h1:maIEMgHlNE2u78JaDD0oLzri+ShgU4okHfzP3LWGdQM= github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= diff --git a/mock/context/vmHostMock.go b/mock/context/vmHostMock.go index 59db5b93..f54e852d 100644 --- a/mock/context/vmHostMock.go +++ b/mock/context/vmHostMock.go @@ -24,7 +24,7 @@ type VMHostMock struct { OutputContext vmhost.OutputContext MeteringContext vmhost.MeteringContext StorageContext vmhost.StorageContext - EnableEpochsHandlerField vmcommon.EnableEpochsHandler + EnableEpochsHandlerField vmhost.EnableEpochsHandler ManagedTypesContext vmhost.ManagedTypesContext SCAPIMethods *wasmer.Imports @@ -72,7 +72,7 @@ func (host *VMHostMock) Storage() vmhost.StorageContext { } // EnableEpochsHandler mocked method -func (host *VMHostMock) EnableEpochsHandler() vmcommon.EnableEpochsHandler { +func (host *VMHostMock) EnableEpochsHandler() vmhost.EnableEpochsHandler { return host.EnableEpochsHandlerField } diff --git a/mock/context/vmHostStub.go b/mock/context/vmHostStub.go index 30df6efc..a27d3fec 100644 --- a/mock/context/vmHostStub.go +++ b/mock/context/vmHostStub.go @@ -26,7 +26,7 @@ type VMHostStub struct { OutputCalled func() vmhost.OutputContext MeteringCalled func() vmhost.MeteringContext StorageCalled func() vmhost.StorageContext - EnableEpochsHandlerCalled func() vmcommon.EnableEpochsHandler + EnableEpochsHandlerCalled func() vmhost.EnableEpochsHandler ExecuteESDTTransferCalled func(destination []byte, sender []byte, transfers []*vmcommon.ESDTTransfer, callType vm.CallType) (*vmcommon.VMOutput, uint64, error) CreateNewContractCalled func(input *vmcommon.ContractCreateInput) ([]byte, error) ExecuteOnSameContextCalled func(input *vmcommon.ContractCallInput) (*vmhost.AsyncContextInfo, error) @@ -166,7 +166,7 @@ func (vhs *VMHostStub) Storage() vmhost.StorageContext { } // EnableEpochsHandler mocked method -func (vhs *VMHostStub) EnableEpochsHandler() vmcommon.EnableEpochsHandler { +func (vhs *VMHostStub) EnableEpochsHandler() vmhost.EnableEpochsHandler { if vhs.EnableEpochsHandlerCalled != nil { return vhs.EnableEpochsHandlerCalled() } diff --git a/mock/world/builtinFunctionsWrapper.go b/mock/world/builtinFunctionsWrapper.go index 5fd474a4..b4c6d906 100644 --- a/mock/world/builtinFunctionsWrapper.go +++ b/mock/world/builtinFunctionsWrapper.go @@ -3,12 +3,13 @@ package worldmock import ( "bytes" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/marshal" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/builtInFunctions" + "github.com/multiversx/mx-chain-vm-common-go/mock" "github.com/multiversx/mx-chain-vm-v1_4-go/config" - "github.com/multiversx/mx-chain-vm-v1_4-go/vmhost/mock" ) // WorldMarshalizer is the global marshalizer to be used by the components of @@ -43,31 +44,19 @@ func NewBuiltinFunctionsWrapper( ShardCoordinator: world, MaxNumOfAddressesForTransferRole: 100, EnableEpochsHandler: &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, - IsMultiESDTTransferFixOnCallBackFlagEnabledField: true, - IsFixOOGReturnCodeFlagEnabledField: true, - IsRemoveNonUpdatedStorageFlagEnabledField: true, - IsCreateNFTThroughExecByCallerFlagEnabledField: true, - IsManagedCryptoAPIsFlagEnabledField: true, - IsFailExecutionOnEveryAPIErrorFlagEnabledField: true, - IsRefactorContextFlagEnabledField: true, - IsCheckCorrectTokenIDForTransferRoleFlagEnabledField: true, - IsDisableExecByCallerFlagEnabledField: true, - IsESDTTransferRoleFlagEnabledField: true, - IsGlobalMintBurnFlagEnabledField: true, - IsTransferToMetaFlagEnabledField: true, - IsCheckFrozenCollectionFlagEnabledField: true, - IsFixAsyncCallbackCheckFlagEnabledField: true, - IsESDTNFTImprovementV1FlagEnabledField: true, - IsSaveToSystemAccountFlagEnabledField: true, - IsValueLengthCheckFlagEnabledField: true, - IsSCDeployFlagEnabledField: true, - IsRepairCallbackFlagEnabledField: true, - IsAheadOfTimeGasUsageFlagEnabledField: true, - IsCheckFunctionArgumentFlagEnabledField: true, - IsCheckExecuteOnReadOnlyFlagEnabledField: true, - IsFixOldTokenLiquidityEnabledField: true, - IsChangeUsernameEnabledField: false, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == builtInFunctions.CheckCorrectTokenIDForTransferRoleFlag || + flag == builtInFunctions.ESDTTransferRoleFlag || + flag == builtInFunctions.GlobalMintBurnFlag || + flag == builtInFunctions.TransferToMetaFlag || + flag == builtInFunctions.CheckFrozenCollectionFlag || + flag == builtInFunctions.FixAsyncCallbackCheckFlag || + flag == builtInFunctions.ESDTNFTImprovementV1Flag || + flag == builtInFunctions.SaveToSystemAccountFlag || + flag == builtInFunctions.ValueLengthCheckFlag || + flag == builtInFunctions.CheckFunctionArgumentFlag || + flag == builtInFunctions.FixOldTokenLiquidityFlag + }, }, } diff --git a/scenarioexec/exec.go b/scenarioexec/exec.go index e5ad9fd3..95107873 100644 --- a/scenarioexec/exec.go +++ b/scenarioexec/exec.go @@ -80,29 +80,18 @@ func (ae *VMTestExecutor) InitVM(scenGasSchedule mj.GasSchedule) error { ESDTTransferParser: esdtTransferParser, EpochNotifier: &mock.EpochNotifierStub{}, EnableEpochsHandler: &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, - IsMultiESDTTransferFixOnCallBackFlagEnabledField: true, - IsFixOOGReturnCodeFlagEnabledField: true, - IsRemoveNonUpdatedStorageFlagEnabledField: true, - IsCreateNFTThroughExecByCallerFlagEnabledField: true, - IsManagedCryptoAPIsFlagEnabledField: true, - IsFailExecutionOnEveryAPIErrorFlagEnabledField: true, - IsRefactorContextFlagEnabledField: true, - IsCheckCorrectTokenIDForTransferRoleFlagEnabledField: true, - IsDisableExecByCallerFlagEnabledField: true, - IsESDTTransferRoleFlagEnabledField: true, - IsGlobalMintBurnFlagEnabledField: true, - IsTransferToMetaFlagEnabledField: true, - IsCheckFrozenCollectionFlagEnabledField: true, - IsFixAsyncCallbackCheckFlagEnabledField: true, - IsESDTNFTImprovementV1FlagEnabledField: true, - IsSaveToSystemAccountFlagEnabledField: true, - IsValueLengthCheckFlagEnabledField: true, - IsSCDeployFlagEnabledField: true, - IsRepairCallbackFlagEnabledField: true, - IsAheadOfTimeGasUsageFlagEnabledField: true, - IsCheckFunctionArgumentFlagEnabledField: true, - IsCheckExecuteOnReadOnlyFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag || + flag == vmhost.MultiESDTTransferFixOnCallBackFlag || + flag == vmhost.FixOOGReturnCodeFlag || + flag == vmhost.RemoveNonUpdatedStorageFlag || + flag == vmhost.CreateNFTThroughExecByCallerFlag || + flag == vmhost.ManagedCryptoAPIsFlag || + flag == vmhost.FailExecutionOnEveryAPIErrorFlag || + flag == vmhost.RefactorContextFlag || + flag == vmhost.DisableExecByCallerFlag || + flag == vmhost.CheckExecuteOnReadOnlyFlag + }, }, WasmerSIGSEGVPassthrough: false, Hasher: worldhook.DefaultHasher, diff --git a/testcommon/testInitializer_inputs.go b/testcommon/testInitializer_inputs.go index 55f40d9d..3ef6e993 100644 --- a/testcommon/testInitializer_inputs.go +++ b/testcommon/testInitializer_inputs.go @@ -10,6 +10,7 @@ import ( "strings" "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/vm" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/builtInFunctions" @@ -322,18 +323,16 @@ func DefaultTestVMWithWorldMockWithGasSchedule(tb testing.TB, customGasSchedule ESDTTransferParser: esdtTransferParser, EpochNotifier: &mock.EpochNotifierStub{}, EnableEpochsHandler: &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, - IsMultiESDTTransferFixOnCallBackFlagEnabledField: true, - IsFixOOGReturnCodeFlagEnabledField: true, - IsRemoveNonUpdatedStorageFlagEnabledField: true, - IsCreateNFTThroughExecByCallerFlagEnabledField: true, - IsManagedCryptoAPIsFlagEnabledField: true, - IsFailExecutionOnEveryAPIErrorFlagEnabledField: true, - IsESDTTransferRoleFlagEnabledField: true, - IsSendAlwaysFlagEnabledField: true, - IsGlobalMintBurnFlagEnabledField: true, - IsCheckFunctionArgumentFlagEnabledField: true, - IsCheckExecuteOnReadOnlyFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag || + flag == vmhost.MultiESDTTransferFixOnCallBackFlag || + flag == vmhost.FixOOGReturnCodeFlag || + flag == vmhost.RemoveNonUpdatedStorageFlag || + flag == vmhost.CreateNFTThroughExecByCallerFlag || + flag == vmhost.ManagedCryptoAPIsFlag || + flag == vmhost.FailExecutionOnEveryAPIErrorFlag || + flag == vmhost.CheckExecuteOnReadOnlyFlag + }, }, WasmerSIGSEGVPassthrough: false, Hasher: worldmock.DefaultHasher, @@ -372,21 +371,18 @@ func DefaultTestVMWithGasSchedule( ESDTTransferParser: esdtTransferParser, EpochNotifier: &mock.EpochNotifierStub{}, EnableEpochsHandler: &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, - IsMultiESDTTransferFixOnCallBackFlagEnabledField: true, - IsFixOOGReturnCodeFlagEnabledField: true, - IsRemoveNonUpdatedStorageFlagEnabledField: true, - IsCreateNFTThroughExecByCallerFlagEnabledField: true, - IsManagedCryptoAPIsFlagEnabledField: true, - IsFailExecutionOnEveryAPIErrorFlagEnabledField: true, - IsRefactorContextFlagEnabledField: true, - IsCheckCorrectTokenIDForTransferRoleFlagEnabledField: true, - IsDisableExecByCallerFlagEnabledField: true, - IsESDTTransferRoleFlagEnabledField: true, - IsSendAlwaysFlagEnabledField: true, - IsGlobalMintBurnFlagEnabledField: true, - IsCheckFunctionArgumentFlagEnabledField: true, - IsCheckExecuteOnReadOnlyFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag || + flag == vmhost.MultiESDTTransferFixOnCallBackFlag || + flag == vmhost.FixOOGReturnCodeFlag || + flag == vmhost.RemoveNonUpdatedStorageFlag || + flag == vmhost.CreateNFTThroughExecByCallerFlag || + flag == vmhost.ManagedCryptoAPIsFlag || + flag == vmhost.FailExecutionOnEveryAPIErrorFlag || + flag == vmhost.RefactorContextFlag || + flag == vmhost.DisableExecByCallerFlag || + flag == vmhost.CheckExecuteOnReadOnlyFlag + }, }, WasmerSIGSEGVPassthrough: wasmerSIGSEGVPassthrough, Hasher: worldmock.DefaultHasher, diff --git a/vmhost/common.go b/vmhost/common.go index bb9441dc..2ca34c9b 100644 --- a/vmhost/common.go +++ b/vmhost/common.go @@ -131,7 +131,7 @@ type VMHostParameters struct { ProtectedKeyPrefix []byte WasmerSIGSEGVPassthrough bool EpochNotifier vmcommon.EpochNotifier - EnableEpochsHandler vmcommon.EnableEpochsHandler + EnableEpochsHandler EnableEpochsHandler Hasher HashComputer TimeOutForSCExecutionInMilliseconds uint32 } diff --git a/vmhost/contexts/runtime.go b/vmhost/contexts/runtime.go index c55e2452..66c14ab3 100644 --- a/vmhost/contexts/runtime.go +++ b/vmhost/contexts/runtime.go @@ -303,7 +303,7 @@ func (context *runtimeContext) GetSCCode() ([]byte, error) { // GetSCCodeSize returns the size of the current SC code. func (context *runtimeContext) GetSCCodeSize() uint64 { - if context.host.EnableEpochsHandler().IsRuntimeCodeSizeFixEnabled() { + if context.host.EnableEpochsHandler().IsFlagEnabled(vmhost.RuntimeCodeSizeFixFlag) { return context.iTracker.GetCodeSize() } return context.codeSize @@ -646,7 +646,7 @@ func (context *runtimeContext) VerifyContractCode() error { } enableEpochsHandler := context.host.EnableEpochsHandler() - if !enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() { + if !enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) { err = context.checkBackwardCompatibility() if err != nil { logRuntime.Trace("verify contract code", "error", err) @@ -654,15 +654,13 @@ func (context *runtimeContext) VerifyContractCode() error { } } - if !enableEpochsHandler.IsManagedCryptoAPIsFlagEnabled() { + if !enableEpochsHandler.IsFlagEnabled(vmhost.ManagedCryptoAPIsFlag) { err = context.checkIfContainsNewManagedCryptoAPI() if err != nil { logRuntime.Trace("verify contract code", "error", err) return err } - } - if enableEpochsHandler.IsManagedCryptoAPIsFlagEnabled() { err = context.validator.verifyProtectedFunctions(context.iTracker.Instance()) if err != nil { logRuntime.Trace("verify contract code", "error", err) @@ -1138,7 +1136,7 @@ func (context *runtimeContext) MemStore(offset int32, data []byte) error { epochsHandler := context.host.EnableEpochsHandler() if isNewPageNecessary { - if epochsHandler.IsRuntimeMemStoreLimitEnabled() { + if epochsHandler.IsFlagEnabled(vmhost.RuntimeMemStoreLimitFlag) { return vmhost.ErrBadUpperBounds } diff --git a/vmhost/contexts/runtime_test.go b/vmhost/contexts/runtime_test.go index 581c0574..419f9a9c 100644 --- a/vmhost/contexts/runtime_test.go +++ b/vmhost/contexts/runtime_test.go @@ -120,7 +120,9 @@ func TestNewRuntimeContext(t *testing.T) { func TestRuntimeContext_InitState(t *testing.T) { host := InitializeVMAndWasmer() - host.EpochsStub().IsRuntimeCodeSizeFixEnabledField = true + host.EpochsStub().IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return flag == vmhost.RuntimeCodeSizeFixFlag + } runtimeContext := makeDefaultRuntimeContext(t, host) defer runtimeContext.ClearWarmInstanceCache() @@ -153,11 +155,15 @@ func TestRuntimeContext_CodeSizeFix(t *testing.T) { runtimeContext.codeSize = 1024 runtimeContext.iTracker.codeSize = 1024 - epochs.IsRuntimeCodeSizeFixEnabledField = false + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } runtimeContext.InitState() require.Equal(t, uint64(1024), runtimeContext.GetSCCodeSize()) - epochs.IsRuntimeCodeSizeFixEnabledField = true + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return flag == vmhost.RuntimeCodeSizeFixFlag + } runtimeContext.InitState() require.Equal(t, uint64(0), runtimeContext.GetSCCodeSize()) } @@ -187,7 +193,9 @@ func TestRuntimeContext_NewWasmerInstance(t *testing.T) { contractCode := vmhost.GetSCCode(path) t.Run("fix code size disabled", func(t *testing.T) { - epochs.IsRuntimeCodeSizeFixEnabledField = false + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } runtimeContext := makeDefaultRuntimeContext(t, host) runtimeContext.SetMaxInstanceCount(1) defer runtimeContext.ClearWarmInstanceCache() @@ -197,7 +205,9 @@ func TestRuntimeContext_NewWasmerInstance(t *testing.T) { require.Equal(t, uint64(0), runtimeContext.GetSCCodeSize()) }) t.Run("fix code size enabled", func(t *testing.T) { - epochs.IsRuntimeCodeSizeFixEnabledField = true + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return flag == vmhost.RuntimeCodeSizeFixFlag + } runtimeContext := makeDefaultRuntimeContext(t, host) runtimeContext.SetMaxInstanceCount(1) defer runtimeContext.ClearWarmInstanceCache() @@ -314,7 +324,9 @@ func TestRuntimeContext_PushPopInstance(t *testing.T) { } t.Run("fix code size disabled", func(t *testing.T) { - epochs.IsRuntimeCodeSizeFixEnabledField = false + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } runtimeContext := prepare() defer runtimeContext.ClearWarmInstanceCache() require.Equal(t, uint64(0), runtimeContext.GetSCCodeSize()) @@ -337,7 +349,9 @@ func TestRuntimeContext_PushPopInstance(t *testing.T) { require.Equal(t, 1, len(runtimeContext.iTracker.instanceStack)) }) t.Run("fix code size enabled", func(t *testing.T) { - epochs.IsRuntimeCodeSizeFixEnabledField = true + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return flag == vmhost.RuntimeCodeSizeFixFlag + } runtimeContext := prepare() defer runtimeContext.ClearWarmInstanceCache() require.Equal(t, oldCodeSize, runtimeContext.GetSCCodeSize()) @@ -699,7 +713,9 @@ func TestRuntimeContext_MemStoreCases(t *testing.T) { func TestRuntimeContext_MemStoreForbiddenGrowth(t *testing.T) { host := InitializeVMAndWasmer() - host.EpochsStub().IsRuntimeMemStoreLimitEnabledField = true + host.EpochsStub().IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return flag == vmhost.RuntimeMemStoreLimitFlag + } runtimeContext := makeDefaultRuntimeContext(t, host) defer runtimeContext.ClearWarmInstanceCache() diff --git a/vmhost/contexts/storage.go b/vmhost/contexts/storage.go index d7c4b4c3..774ae569 100644 --- a/vmhost/contexts/storage.go +++ b/vmhost/contexts/storage.go @@ -113,7 +113,7 @@ func (context *storageContext) GetStorage(key []byte) ([]byte, bool, error) { func (context *storageContext) useGasForValueIfNeeded(value []byte, usedCache bool) { metering := context.host.Metering() enableEpochsHandler := context.host.EnableEpochsHandler() - gasFlagSet := enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() + gasFlagSet := enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) if !usedCache || !gasFlagSet { costPerByte := metering.GasSchedule().BaseOperationCost.DataCopyPerByte gasToUse := math.MulUint64(costPerByte, uint64(len(value))) @@ -128,7 +128,7 @@ func (context *storageContext) useExtraGasForKeyIfNeeded(key []byte, usedCache b return } enableEpochsHandler := context.host.EnableEpochsHandler() - gasFlagSet := enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() + gasFlagSet := enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) if !gasFlagSet || !usedCache { gasToUse := math.MulUint64(metering.GasSchedule().BaseOperationCost.DataCopyPerByte, uint64(extraBytes)) metering.UseGas(gasToUse) @@ -170,7 +170,7 @@ func (context *storageContext) getStorageFromAddressUnmetered(address []byte, ke var err error enableEpochsHandler := context.host.EnableEpochsHandler() - if context.isProtocolProtectedKey(key) && enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() { + if context.isProtocolProtectedKey(key) && enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) { value, err = context.readFromBlockchain(address, key) return value, false, err } @@ -363,7 +363,7 @@ func (context *storageContext) computeGasForUnchangedValue(length int, usedCache metering := context.host.Metering() useGas := uint64(0) enableEpochsHandler := context.host.EnableEpochsHandler() - if !usedCache || !enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() { + if !usedCache || !enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) { useGas = math.MulUint64(metering.GasSchedule().BaseOperationCost.DataCopyPerByte, uint64(length)) } return useGas @@ -398,7 +398,7 @@ func (context *storageContext) computeGasForKey(key []byte, usedCache bool) uint extraKeyLenGas := uint64(0) enableEpochsHandler := context.host.EnableEpochsHandler() if extraBytes > 0 && - (!usedCache || !enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled()) { + (!usedCache || !enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag)) { extraKeyLenGas = math.MulUint64(metering.GasSchedule().BaseOperationCost.DataCopyPerByte, uint64(extraBytes)) } return extraKeyLenGas @@ -408,7 +408,7 @@ func (context *storageContext) computeGasForKey(key []byte, usedCache bool) uint func (context *storageContext) UseGasForStorageLoad(tracedFunctionName string, loadCost uint64, usedCache bool) { metering := context.host.Metering() enableEpochsHandler := context.host.EnableEpochsHandler() - if enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() && usedCache { + if enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) && usedCache { loadCost = metering.GasSchedule().BaseOpsAPICost.CachedStorageLoad } @@ -418,7 +418,7 @@ func (context *storageContext) UseGasForStorageLoad(tracedFunctionName string, l // IsUseDifferentGasCostFlagSet - getter for flag func (context *storageContext) IsUseDifferentGasCostFlagSet() bool { enableEpochsHandler := context.host.EnableEpochsHandler() - return enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() + return enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) } // IsInterfaceNil returns true if there is no value under the interface diff --git a/vmhost/contexts/storage_test.go b/vmhost/contexts/storage_test.go index 08ce6350..ba295af4 100644 --- a/vmhost/contexts/storage_test.go +++ b/vmhost/contexts/storage_test.go @@ -6,6 +6,7 @@ import ( "math/big" "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-v1_4-go/config" @@ -54,7 +55,9 @@ func TestNewStorageContext(t *testing.T) { t.Parallel() enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ EnableEpochsHandlerField: enableEpochsHandler, @@ -102,7 +105,9 @@ func TestStorageContext_SetAddress(t *testing.T) { mockMetering.SetGasSchedule(config.MakeGasMapForTests()) mockMetering.BlockGasLimitMock = uint64(15000) enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ @@ -159,7 +164,9 @@ func TestStorageContext_GetStorageUpdates(t *testing.T) { } enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ @@ -191,7 +198,9 @@ func TestStorageContext_SetStorage(t *testing.T) { mockMetering.BlockGasLimitMock = uint64(15000) enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ @@ -332,7 +341,9 @@ func TestStorageContext_SetStorage_GasUsage(t *testing.T) { mockMetering.BlockGasLimitMock = uint64(15000) enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ OutputContext: mockOutput, @@ -396,7 +407,9 @@ func TestStorageContext_StorageProtection(t *testing.T) { mockMetering.BlockGasLimitMock = uint64(15000) enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ @@ -436,7 +449,9 @@ func TestStorageContext_GetStorageFromAddress(t *testing.T) { scAddress := []byte("account") enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } t.Run("blockchain hook errors", func(t *testing.T) { @@ -559,7 +574,9 @@ func TestStorageContext_StoreGasPerKey(t *testing.T) { func TestStorageContext_PopSetActiveStateIfStackIsEmptyShouldNotPanic(t *testing.T) { t.Parallel() enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ @@ -575,7 +592,9 @@ func TestStorageContext_PopSetActiveStateIfStackIsEmptyShouldNotPanic(t *testing func TestStorageContext_PopDiscardIfStackIsEmptyShouldNotPanic(t *testing.T) { t.Parallel() enableEpochsHandler := &mock.EnableEpochsHandlerStub{ - IsStorageAPICostOptimizationFlagEnabledField: true, + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return flag == vmhost.StorageAPICostOptimizationFlag + }, } host := &contextmock.VMHostMock{ diff --git a/vmhost/flags.go b/vmhost/flags.go new file mode 100644 index 00000000..5dc89999 --- /dev/null +++ b/vmhost/flags.go @@ -0,0 +1,31 @@ +package vmhost + +import "github.com/multiversx/mx-chain-core-go/core" + +const ( + // MultiESDTTransferFixOnCallBackFlag defines the flag that activates the multi esdt transfer fix on callback + MultiESDTTransferFixOnCallBackFlag core.EnableEpochFlag = "MultiESDTTransferFixOnCallBackFlag" + // RemoveNonUpdatedStorageFlag defines the flag that activates the remove non updated storage fix + RemoveNonUpdatedStorageFlag core.EnableEpochFlag = "RemoveNonUpdatedStorageFlag" + // CreateNFTThroughExecByCallerFlag defines the flag that activates the create nft through exec by caller fix + CreateNFTThroughExecByCallerFlag core.EnableEpochFlag = "CreateNFTThroughExecByCallerFlag" + // StorageAPICostOptimizationFlag defines the flag that activates the storage api cost optimization + StorageAPICostOptimizationFlag core.EnableEpochFlag = "StorageAPICostOptimizationFlag" + // CheckExecuteOnReadOnlyFlag defines the flag that activates the check execute on read only + CheckExecuteOnReadOnlyFlag core.EnableEpochFlag = "CheckExecuteOnReadOnlyFlag" + // FailExecutionOnEveryAPIErrorFlag defines the flag that activates the fail execution on every api error + FailExecutionOnEveryAPIErrorFlag core.EnableEpochFlag = "FailExecutionOnEveryAPIErrorFlag" + // ManagedCryptoAPIsFlag defines the flag that activates the manage crypto apis + ManagedCryptoAPIsFlag core.EnableEpochFlag = "ManagedCryptoAPIsFlag" + // DisableExecByCallerFlag defines the flag that activates disable exec by caller + DisableExecByCallerFlag core.EnableEpochFlag = "DisableExecByCallerFlag" + // RefactorContextFlag defines the flag that activates the refactor context + RefactorContextFlag core.EnableEpochFlag = "RefactorContextFlag" + // RuntimeMemStoreLimitFlag defines the flag that activates the runtime mem store limit + RuntimeMemStoreLimitFlag core.EnableEpochFlag = "RuntimeMemStoreLimitFlag" + // RuntimeCodeSizeFixFlag defines the flag that activates the runtime code size fix + RuntimeCodeSizeFixFlag core.EnableEpochFlag = "RuntimeCodeSizeFixFlag" + // FixOOGReturnCodeFlag defines the flag that activates the fix oog return code + FixOOGReturnCodeFlag core.EnableEpochFlag = "FixOOGReturnCodeFlag" + // all new flags must be added to allFlags slice from hostCore/host +) diff --git a/vmhost/hostCore/asyncCall.go b/vmhost/hostCore/asyncCall.go index 0dce146d..51fdeb1d 100644 --- a/vmhost/hostCore/asyncCall.go +++ b/vmhost/hostCore/asyncCall.go @@ -103,7 +103,7 @@ func (host *vmHost) isESDTTransferOnReturnDataFromFunctionAndArgs( functionName string, args [][]byte, ) (bool, string, [][]byte) { - if !host.enableEpochsHandler.IsMultiESDTTransferFixOnCallBackFlagEnabled() && functionName == core.BuiltInFunctionMultiESDTNFTTransfer { + if !host.enableEpochsHandler.IsFlagEnabled(vmhost.MultiESDTTransferFixOnCallBackFlag) && functionName == core.BuiltInFunctionMultiESDTNFTTransfer { return false, functionName, args } @@ -205,7 +205,7 @@ func (host *vmHost) executeSyncCallbackCall( destinationErr error, ) (*vmcommon.VMOutput, error) { actualDestination := asyncCallInfo.GetDestination() - if host.enableEpochsHandler.IsMultiESDTTransferFixOnCallBackFlagEnabled() { + if host.enableEpochsHandler.IsFlagEnabled(vmhost.MultiESDTTransferFixOnCallBackFlag) { actualDestination = host.determineDestinationForAsyncCall(asyncCallInfo) } callbackCallInput, err := host.createCallbackContractCallInput( @@ -280,7 +280,7 @@ func (host *vmHost) sendAsyncCallToDestination(asyncCallInfo vmhost.AsyncCallInf } func (host *vmHost) returnCodeToBytes(returnCode vmcommon.ReturnCode) []byte { - if host.enableEpochsHandler.IsManagedCryptoAPIsFlagEnabled() && returnCode == vmcommon.Ok { + if host.enableEpochsHandler.IsFlagEnabled(vmhost.ManagedCryptoAPIsFlag) && returnCode == vmcommon.Ok { return []byte{0} } return big.NewInt(int64(returnCode)).Bytes() @@ -294,7 +294,7 @@ func (host *vmHost) sendCallbackToCurrentCaller() error { currentCall := runtime.GetVMInput() retData := []byte("@" + core.ConvertToEvenHex(int(output.ReturnCode()))) - if !host.enableEpochsHandler.IsManagedCryptoAPIsFlagEnabled() { + if !host.enableEpochsHandler.IsFlagEnabled(vmhost.ManagedCryptoAPIsFlag) { // the legacy implementation was using the message string instead of the code retData = []byte("@" + hex.EncodeToString([]byte(output.ReturnCode().String()))) } @@ -304,7 +304,7 @@ func (host *vmHost) sendCallbackToCurrentCaller() error { } valueToTransfer := currentCall.CallValue - if host.enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabled() { + if host.enableEpochsHandler.IsFlagEnabled(vmhost.StorageAPICostOptimizationFlag) { valueToTransfer = big.NewInt(0) } diff --git a/vmhost/hostCore/execution.go b/vmhost/hostCore/execution.go index d87f61a6..94d24d22 100644 --- a/vmhost/hostCore/execution.go +++ b/vmhost/hostCore/execution.go @@ -105,7 +105,7 @@ func (host *vmHost) performCodeDeployment(input vmhost.CodeDeployInput) (*vmcomm } output.DeployCode(input) - if host.enableEpochsHandler.IsRemoveNonUpdatedStorageFlagEnabled() { + if host.enableEpochsHandler.IsFlagEnabled(vmhost.RemoveNonUpdatedStorageFlag) { output.RemoveNonUpdatedStorage() } @@ -234,7 +234,7 @@ func (host *vmHost) doRunSmartContractCall(input *vmcommon.ContractCallInput) *v return vmOutput } - if host.enableEpochsHandler.IsRemoveNonUpdatedStorageFlagEnabled() { + if host.enableEpochsHandler.IsFlagEnabled(vmhost.RemoveNonUpdatedStorageFlag) { output.RemoveNonUpdatedStorage() } @@ -414,7 +414,7 @@ func (host *vmHost) ExecuteOnSameContext(input *vmcommon.ContractCallInput) (asy librarySCAddress := make([]byte, len(input.RecipientAddr)) copy(librarySCAddress, input.RecipientAddr) - if host.enableEpochsHandler.IsRefactorContextFlagEnabled() { + if host.enableEpochsHandler.IsFlagEnabled(vmhost.RefactorContextFlag) { input.RecipientAddr = input.CallerAddr } diff --git a/vmhost/hostCore/host.go b/vmhost/hostCore/host.go index 6574aa4f..427c7e56 100644 --- a/vmhost/hostCore/host.go +++ b/vmhost/hostCore/host.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" logger "github.com/multiversx/mx-chain-logger-go" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -29,6 +30,22 @@ var _ vmhost.VMHost = (*vmHost)(nil) const minExecutionTimeout = time.Second const internalVMErrors = "internalVMErrors" +// allFlags must have all flags used by mx-chain-vm-v1_4-go in the current version +var allFlags = []core.EnableEpochFlag{ + vmhost.MultiESDTTransferFixOnCallBackFlag, + vmhost.RemoveNonUpdatedStorageFlag, + vmhost.CreateNFTThroughExecByCallerFlag, + vmhost.StorageAPICostOptimizationFlag, + vmhost.CheckExecuteOnReadOnlyFlag, + vmhost.FailExecutionOnEveryAPIErrorFlag, + vmhost.ManagedCryptoAPIsFlag, + vmhost.DisableExecByCallerFlag, + vmhost.RefactorContextFlag, + vmhost.RuntimeMemStoreLimitFlag, + vmhost.RuntimeCodeSizeFixFlag, + vmhost.FixOOGReturnCodeFlag, +} + // vmHost implements HostContext interface. type vmHost struct { cryptoHook crypto.VMCrypto @@ -49,7 +66,7 @@ type vmHost struct { scAPIMethods *wasmer.Imports builtInFuncContainer vmcommon.BuiltInFunctionContainer esdtTransferParser vmcommon.ESDTTransferParser - enableEpochsHandler vmcommon.EnableEpochsHandler + enableEpochsHandler vmhost.EnableEpochsHandler activationEpochMap map[uint32]struct{} } @@ -77,6 +94,10 @@ func NewVMHost( if check.IfNil(hostParameters.EnableEpochsHandler) { return nil, vmhost.ErrNilEnableEpochsHandler } + err := core.CheckHandlerCompatibility(hostParameters.EnableEpochsHandler, allFlags) + if err != nil { + return nil, err + } if check.IfNil(hostParameters.Hasher) { return nil, vmhost.ErrNilHasher } @@ -108,7 +129,7 @@ func NewVMHost( } imports := vmhooksmeta.NewEIFunctions() - err := PopulateAllImports(imports) + err = PopulateAllImports(imports) if err != nil { return nil, err } @@ -186,16 +207,16 @@ func NewVMHost( func createActivationMap(hostParameters *vmhost.VMHostParameters) map[uint32]struct{} { activationMap := make(map[uint32]struct{}) - activationMap[hostParameters.EnableEpochsHandler.CheckExecuteReadOnlyEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.DisableExecByCallerEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.RefactorContextEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.FixFailExecutionOnErrorEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.ManagedCryptoAPIEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.CreateNFTThroughExecByCallerEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.FixOOGReturnCodeEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.MultiESDTTransferAsyncCallBackEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.RemoveNonUpdatedStorageEnableEpoch()] = struct{}{} - activationMap[hostParameters.EnableEpochsHandler.StorageAPICostOptimizationEnableEpoch()] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.CheckExecuteOnReadOnlyFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.DisableExecByCallerFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.RefactorContextFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.FailExecutionOnEveryAPIErrorFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.ManagedCryptoAPIsFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.CreateNFTThroughExecByCallerFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.FixOOGReturnCodeFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.MultiESDTTransferFixOnCallBackFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.RemoveNonUpdatedStorageFlag)] = struct{}{} + activationMap[hostParameters.EnableEpochsHandler.GetActivationEpoch(vmhost.StorageAPICostOptimizationFlag)] = struct{}{} return activationMap } @@ -236,7 +257,7 @@ func (host *vmHost) Storage() vmhost.StorageContext { } // EnableEpochsHandler returns the enableEpochsHandler instance of the host -func (host *vmHost) EnableEpochsHandler() vmcommon.EnableEpochsHandler { +func (host *vmHost) EnableEpochsHandler() vmhost.EnableEpochsHandler { return host.enableEpochsHandler } @@ -531,27 +552,27 @@ func (host *vmHost) EpochConfirmed(epoch uint32, _ uint64) { // FixOOGReturnCodeEnabled returns true if the corresponding flag is set func (host *vmHost) FixOOGReturnCodeEnabled() bool { - return host.enableEpochsHandler.IsFixOOGReturnCodeFlagEnabled() + return host.enableEpochsHandler.IsFlagEnabled(vmhost.FixOOGReturnCodeFlag) } // FixFailExecutionEnabled returns true if the corresponding flag is set func (host *vmHost) FixFailExecutionEnabled() bool { - return host.enableEpochsHandler.IsFailExecutionOnEveryAPIErrorFlagEnabled() + return host.enableEpochsHandler.IsFlagEnabled(vmhost.FailExecutionOnEveryAPIErrorFlag) } // CreateNFTOnExecByCallerEnabled returns true if the corresponding flag is set func (host *vmHost) CreateNFTOnExecByCallerEnabled() bool { - return host.enableEpochsHandler.IsCreateNFTThroughExecByCallerFlagEnabled() + return host.enableEpochsHandler.IsFlagEnabled(vmhost.CreateNFTThroughExecByCallerFlag) } // DisableExecByCaller returns true if the corresponding flag is set func (host *vmHost) DisableExecByCaller() bool { - return host.enableEpochsHandler.IsDisableExecByCallerFlagEnabled() + return host.enableEpochsHandler.IsFlagEnabled(vmhost.DisableExecByCallerFlag) } // CheckExecuteReadOnly returns true if the corresponding flag is set func (host *vmHost) CheckExecuteReadOnly() bool { - return host.enableEpochsHandler.IsCheckExecuteOnReadOnlyFlagEnabled() + return host.enableEpochsHandler.IsFlagEnabled(vmhost.CheckExecuteOnReadOnlyFlag) } func (host *vmHost) setGasTracerEnabledIfLogIsTrace() { diff --git a/vmhost/hostCore/host_test.go b/vmhost/hostCore/host_test.go index 38c9d0ec..1cd543ca 100644 --- a/vmhost/hostCore/host_test.go +++ b/vmhost/hostCore/host_test.go @@ -3,6 +3,7 @@ package hostCore import ( "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-vm-common-go/builtInFunctions" "github.com/multiversx/mx-chain-vm-common-go/parsers" worldmock "github.com/multiversx/mx-chain-vm-v1_4-go/mock/world" @@ -69,6 +70,17 @@ func TestNewVMHost(t *testing.T) { require.Nil(t, host) require.ErrorIs(t, err, vmhost.ErrNilEnableEpochsHandler) }) + t.Run("InvalidEnableEpochsHandler", func(t *testing.T) { + hostParameters := makeHostParameters() + hostParameters.EnableEpochsHandler = &mock.EnableEpochsHandlerStub{ + IsFlagDefinedCalled: func(flag core.EnableEpochFlag) bool { + return false + }, + } + host, err := NewVMHost(blockchainHook, hostParameters) + require.Nil(t, host) + require.ErrorIs(t, err, core.ErrInvalidEnableEpochsHandler) + }) t.Run("NilHasher", func(t *testing.T) { hostParameters := makeHostParameters() hostParameters.Hasher = nil diff --git a/vmhost/hosttest/contracts_from_src_test.go b/vmhost/hosttest/contracts_from_src_test.go index f83010f8..4daf2f6f 100644 --- a/vmhost/hosttest/contracts_from_src_test.go +++ b/vmhost/hosttest/contracts_from_src_test.go @@ -4,6 +4,7 @@ import ( "math/big" "testing" + "github.com/multiversx/mx-chain-core-go/core" vmcommon "github.com/multiversx/mx-chain-vm-common-go" mock "github.com/multiversx/mx-chain-vm-v1_4-go/mock/context" "github.com/multiversx/mx-chain-vm-v1_4-go/mock/contracts" @@ -462,7 +463,9 @@ func runUpdateFromSourceTest(t *testing.T, testConfig *updateFromSourceTestConfi if !testConfig.isFlagEnabled { enableEpochsHandler, _ := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabledField = false + enableEpochsHandler.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } } }). AndAssertResults(asserts) diff --git a/vmhost/hosttest/execution_test.go b/vmhost/hosttest/execution_test.go index 0a536e3f..f18509df 100644 --- a/vmhost/hosttest/execution_test.go +++ b/vmhost/hosttest/execution_test.go @@ -9,6 +9,7 @@ import ( "math/big" "testing" + "github.com/multiversx/mx-chain-core-go/core" logger "github.com/multiversx/mx-chain-logger-go" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-v1_4-go/config" @@ -962,7 +963,9 @@ func runTestMBufferSetByteSliceDeploy(t *testing.T, enabled bool, retCode vmcomm WithSetup(func(host vmhost.VMHost, stubBlockchainHook *contextmock.BlockchainHookStub) { if !enabled { enableEpochsHandler, _ := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabledField = false + enableEpochsHandler.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } } }). AndAssertResults(func(blockchainHook *contextmock.BlockchainHookStub, verify *test.VMOutputVerifier) { @@ -991,7 +994,9 @@ func runTestMBufferSetByteSlice( WithSetup(func(host vmhost.VMHost, stubBlockchainHook *contextmock.BlockchainHookStub) { if !enabled { enableEpochsHandler, _ := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabledField = false + enableEpochsHandler.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } } }). AndAssertResults(func(host vmhost.VMHost, stubBlockchainHook *contextmock.BlockchainHookStub, verify *test.VMOutputVerifier) { @@ -2634,7 +2639,12 @@ func runTestExecutionRuntimeCodeSizeUpgradeContract(t *testing.T, fixEpochFlag b testCase := test.BuildInstanceCallTest(t). WithSetup(func(host vmhost.VMHost, _ *contextmock.BlockchainHookStub) { epochs := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - epochs.IsRuntimeCodeSizeFixEnabledField = fixEpochFlag + epochs.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + if flag == vmhost.RuntimeCodeSizeFixFlag { + return fixEpochFlag + } + return false + } }). WithContracts( test.CreateInstanceContract(test.ParentAddress). diff --git a/vmhost/hosttest/storage_gas_test.go b/vmhost/hosttest/storage_gas_test.go index ed1d91ad..973a3b4e 100644 --- a/vmhost/hosttest/storage_gas_test.go +++ b/vmhost/hosttest/storage_gas_test.go @@ -3,6 +3,7 @@ package hostCoretest import ( "testing" + "github.com/multiversx/mx-chain-core-go/core" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-v1_4-go/mock/contracts" worldmock "github.com/multiversx/mx-chain-vm-v1_4-go/mock/world" @@ -60,7 +61,9 @@ func loadStorage(t *testing.T, key []byte, flagEnabled bool) { if !flagEnabled { enableEpochsHandler, _ := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabledField = false + enableEpochsHandler.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } } accountHandler, _ := world.GetUserAccount(test.ParentAddress) @@ -125,7 +128,9 @@ func loadStorageFromAddress(t *testing.T, key []byte, flagEnabled bool) { if !flagEnabled { enableEpochsHandler, _ := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabledField = false + enableEpochsHandler.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } } }). AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { @@ -214,7 +219,9 @@ func setStorage(t *testing.T, key []byte, flagEnabled bool) { if !flagEnabled { enableEpochsHandler, _ := host.EnableEpochsHandler().(*vmMock.EnableEpochsHandlerStub) - enableEpochsHandler.IsStorageAPICostOptimizationFlagEnabledField = false + enableEpochsHandler.IsFlagEnabledCalled = func(flag core.EnableEpochFlag) bool { + return false + } } }). AndAssertResults(func(world *worldmock.MockWorld, verify *test.VMOutputVerifier) { diff --git a/vmhost/interface.go b/vmhost/interface.go index c5d2347a..a4e8e678 100644 --- a/vmhost/interface.go +++ b/vmhost/interface.go @@ -5,6 +5,7 @@ import ( "io" "math/big" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/esdt" "github.com/multiversx/mx-chain-core-go/data/vm" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -38,7 +39,7 @@ type VMHost interface { Output() OutputContext Metering() MeteringContext Storage() StorageContext - EnableEpochsHandler() vmcommon.EnableEpochsHandler + EnableEpochsHandler() EnableEpochsHandler ExecuteESDTTransfer(destination []byte, sender []byte, esdtTransfers []*vmcommon.ESDTTransfer, callType vm.CallType) (*vmcommon.VMOutput, uint64, error) CreateNewContract(input *vmcommon.ContractCreateInput) ([]byte, error) @@ -340,3 +341,12 @@ type HashComputer interface { Size() int IsInterfaceNil() bool } + +// EnableEpochsHandler is used to verify which flags are set in a specific epoch based on EnableEpochs config +type EnableEpochsHandler interface { + IsFlagDefined(flag core.EnableEpochFlag) bool + IsFlagEnabled(flag core.EnableEpochFlag) bool + IsFlagEnabledInEpoch(flag core.EnableEpochFlag, epoch uint32) bool + GetActivationEpoch(flag core.EnableEpochFlag) uint32 + IsInterfaceNil() bool +} diff --git a/vmhost/mock/enableEpochsHandlerStub.go b/vmhost/mock/enableEpochsHandlerStub.go index 73446141..21971360 100644 --- a/vmhost/mock/enableEpochsHandlerStub.go +++ b/vmhost/mock/enableEpochsHandlerStub.go @@ -1,304 +1,83 @@ package mock -import vmcommon "github.com/multiversx/mx-chain-vm-common-go" +import ( + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-vm-v1_4-go/vmhost" +) -var _ vmcommon.EnableEpochsHandler = (*EnableEpochsHandlerStub)(nil) +var _ vmhost.EnableEpochsHandler = (*EnableEpochsHandlerStub)(nil) // EnableEpochsHandlerStub - type EnableEpochsHandlerStub struct { - IsGlobalMintBurnFlagEnabledField bool - IsESDTTransferRoleFlagEnabledField bool - IsBuiltInFunctionsFlagEnabledField bool - IsCheckCorrectTokenIDForTransferRoleFlagEnabledField bool - IsMultiESDTTransferFixOnCallBackFlagEnabledField bool - IsFixOOGReturnCodeFlagEnabledField bool - IsRemoveNonUpdatedStorageFlagEnabledField bool - IsCreateNFTThroughExecByCallerFlagEnabledField bool - IsStorageAPICostOptimizationFlagEnabledField bool - IsFailExecutionOnEveryAPIErrorFlagEnabledField bool - IsManagedCryptoAPIsFlagEnabledField bool - IsSCDeployFlagEnabledField bool - IsAheadOfTimeGasUsageFlagEnabledField bool - IsRepairCallbackFlagEnabledField bool - IsDisableExecByCallerFlagEnabledField bool - IsRefactorContextFlagEnabledField bool - IsCheckFunctionArgumentFlagEnabledField bool - IsCheckExecuteOnReadOnlyFlagEnabledField bool - IsFixAsyncCallbackCheckFlagEnabledField bool - IsSaveToSystemAccountFlagEnabledField bool - IsCheckFrozenCollectionFlagEnabledField bool - IsSendAlwaysFlagEnabledField bool - IsValueLengthCheckFlagEnabledField bool - IsCheckTransferFlagEnabledField bool - IsTransferToMetaFlagEnabledField bool - IsESDTNFTImprovementV1FlagEnabledField bool - IsFixOldTokenLiquidityEnabledField bool - IsRuntimeMemStoreLimitEnabledField bool - IsRuntimeCodeSizeFixEnabledField bool - IsMaxBlockchainHookCountersFlagEnabledField bool - IsWipeSingleNFTLiquidityDecreaseEnabledField bool - IsAlwaysSaveTokenMetaDataEnabledField bool - IsGuardAccountEnabledField bool - IsSetGuardianEnabledField bool - IsChangeUsernameEnabledField bool - IsConsistentTokensValuesLengthCheckEnabledField bool - IsAutoBalanceDataTriesEnabledField bool - ScToScLogEventEnabledField bool - MultiESDTTransferAsyncCallBackEnableEpochField uint32 - FixOOGReturnCodeEnableEpochField uint32 - RemoveNonUpdatedStorageEnableEpochField uint32 - CreateNFTThroughExecByCallerEnableEpochField uint32 - FixFailExecutionOnErrorEnableEpochField uint32 - ManagedCryptoAPIEnableEpochField uint32 - DisableExecByCallerEnableEpochField uint32 - RefactorContextEnableEpochField uint32 - CheckExecuteReadOnlyEnableEpochField uint32 - StorageAPICostOptimizationEnableEpochField uint32 -} - -// IsDynamicGasCostForDataTrieStorageLoadEnabled - -func (stub *EnableEpochsHandlerStub) IsDynamicGasCostForDataTrieStorageLoadEnabled() bool { + IsFlagDefinedCalled func(flag core.EnableEpochFlag) bool + IsFlagEnabledCalled func(flag core.EnableEpochFlag) bool + IsFlagEnabledInEpochCalled func(flag core.EnableEpochFlag, epoch uint32) bool + GetActivationEpochCalled func(flag core.EnableEpochFlag) uint32 + MultiESDTTransferAsyncCallBackEnableEpochField uint32 + FixOOGReturnCodeEnableEpochField uint32 + RemoveNonUpdatedStorageEnableEpochField uint32 + CreateNFTThroughExecByCallerEnableEpochField uint32 + FixFailExecutionOnErrorEnableEpochField uint32 + ManagedCryptoAPIEnableEpochField uint32 + DisableExecByCallerEnableEpochField uint32 + RefactorContextEnableEpochField uint32 + CheckExecuteReadOnlyEnableEpochField uint32 + StorageAPICostOptimizationEnableEpochField uint32 +} + +// IsFlagDefined - +func (stub *EnableEpochsHandlerStub) IsFlagDefined(flag core.EnableEpochFlag) bool { + if stub.IsFlagDefinedCalled != nil { + return stub.IsFlagDefinedCalled(flag) + } + return true +} + +// IsFlagEnabled - +func (stub *EnableEpochsHandlerStub) IsFlagEnabled(flag core.EnableEpochFlag) bool { + if stub.IsFlagEnabledCalled != nil { + return stub.IsFlagEnabledCalled(flag) + } return false } -// IsGuardAccountEnabled - -func (stub *EnableEpochsHandlerStub) IsGuardAccountEnabled() bool { - return stub.IsGuardAccountEnabledField -} - -// IsSetGuardianEnabled - -func (stub *EnableEpochsHandlerStub) IsSetGuardianEnabled() bool { - return stub.IsSetGuardianEnabledField -} - -// IsFixOldTokenLiquidityEnabled - -func (stub *EnableEpochsHandlerStub) IsFixOldTokenLiquidityEnabled() bool { - return stub.IsFixOldTokenLiquidityEnabledField -} - -// IsGlobalMintBurnFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsGlobalMintBurnFlagEnabled() bool { - return stub.IsGlobalMintBurnFlagEnabledField -} - -// IsESDTTransferRoleFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsESDTTransferRoleFlagEnabled() bool { - return stub.IsESDTTransferRoleFlagEnabledField -} - -// IsBuiltInFunctionsFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsBuiltInFunctionsFlagEnabled() bool { - return stub.IsBuiltInFunctionsFlagEnabledField -} - -// IsCheckCorrectTokenIDForTransferRoleFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsCheckCorrectTokenIDForTransferRoleFlagEnabled() bool { - return stub.IsCheckCorrectTokenIDForTransferRoleFlagEnabledField -} - -// IsMultiESDTTransferFixOnCallBackFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsMultiESDTTransferFixOnCallBackFlagEnabled() bool { - return stub.IsMultiESDTTransferFixOnCallBackFlagEnabledField -} - -// IsFixOOGReturnCodeFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsFixOOGReturnCodeFlagEnabled() bool { - return stub.IsFixOOGReturnCodeFlagEnabledField -} - -// IsRemoveNonUpdatedStorageFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsRemoveNonUpdatedStorageFlagEnabled() bool { - return stub.IsRemoveNonUpdatedStorageFlagEnabledField -} - -// IsCreateNFTThroughExecByCallerFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsCreateNFTThroughExecByCallerFlagEnabled() bool { - return stub.IsCreateNFTThroughExecByCallerFlagEnabledField -} - -// IsStorageAPICostOptimizationFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsStorageAPICostOptimizationFlagEnabled() bool { - return stub.IsStorageAPICostOptimizationFlagEnabledField -} - -// IsFailExecutionOnEveryAPIErrorFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsFailExecutionOnEveryAPIErrorFlagEnabled() bool { - return stub.IsFailExecutionOnEveryAPIErrorFlagEnabledField -} - -// IsManagedCryptoAPIsFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsManagedCryptoAPIsFlagEnabled() bool { - return stub.IsManagedCryptoAPIsFlagEnabledField -} - -// IsSCDeployFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsSCDeployFlagEnabled() bool { - return stub.IsSCDeployFlagEnabledField -} - -// IsAheadOfTimeGasUsageFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsAheadOfTimeGasUsageFlagEnabled() bool { - return stub.IsAheadOfTimeGasUsageFlagEnabledField -} - -// IsRepairCallbackFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsRepairCallbackFlagEnabled() bool { - return stub.IsRepairCallbackFlagEnabledField -} - -// IsDisableExecByCallerFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsDisableExecByCallerFlagEnabled() bool { - return stub.IsDisableExecByCallerFlagEnabledField -} - -// IsRefactorContextFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsRefactorContextFlagEnabled() bool { - return stub.IsRefactorContextFlagEnabledField -} - -// IsCheckFunctionArgumentFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsCheckFunctionArgumentFlagEnabled() bool { - return stub.IsCheckFunctionArgumentFlagEnabledField -} - -// IsCheckExecuteOnReadOnlyFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsCheckExecuteOnReadOnlyFlagEnabled() bool { - return stub.IsCheckExecuteOnReadOnlyFlagEnabledField -} - -// IsFixAsyncCallbackCheckFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsFixAsyncCallbackCheckFlagEnabled() bool { - return stub.IsFixAsyncCallbackCheckFlagEnabledField -} - -// IsSaveToSystemAccountFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsSaveToSystemAccountFlagEnabled() bool { - return stub.IsSaveToSystemAccountFlagEnabledField -} - -// IsCheckFrozenCollectionFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsCheckFrozenCollectionFlagEnabled() bool { - return stub.IsCheckFrozenCollectionFlagEnabledField -} - -// IsSendAlwaysFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsSendAlwaysFlagEnabled() bool { - return stub.IsSendAlwaysFlagEnabledField -} - -// IsValueLengthCheckFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsValueLengthCheckFlagEnabled() bool { - return stub.IsValueLengthCheckFlagEnabledField -} - -// IsCheckTransferFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsCheckTransferFlagEnabled() bool { - return stub.IsCheckTransferFlagEnabledField -} - -// IsTransferToMetaFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsTransferToMetaFlagEnabled() bool { - return stub.IsTransferToMetaFlagEnabledField -} - -// IsESDTNFTImprovementV1FlagEnabled - -func (stub *EnableEpochsHandlerStub) IsESDTNFTImprovementV1FlagEnabled() bool { - return stub.IsESDTNFTImprovementV1FlagEnabledField -} - -// IsRuntimeMemStoreLimitEnabled - -func (stub *EnableEpochsHandlerStub) IsRuntimeMemStoreLimitEnabled() bool { - return stub.IsRuntimeMemStoreLimitEnabledField -} - -// IsRuntimeCodeSizeFixEnabled - -func (stub *EnableEpochsHandlerStub) IsRuntimeCodeSizeFixEnabled() bool { - return stub.IsRuntimeCodeSizeFixEnabledField -} - -// IsMaxBlockchainHookCountersFlagEnabled - -func (stub *EnableEpochsHandlerStub) IsMaxBlockchainHookCountersFlagEnabled() bool { - return stub.IsMaxBlockchainHookCountersFlagEnabledField -} - -// IsWipeSingleNFTLiquidityDecreaseEnabled - -func (stub *EnableEpochsHandlerStub) IsWipeSingleNFTLiquidityDecreaseEnabled() bool { - return stub.IsWipeSingleNFTLiquidityDecreaseEnabledField -} - -// IsAlwaysSaveTokenMetaDataEnabled - -func (stub *EnableEpochsHandlerStub) IsAlwaysSaveTokenMetaDataEnabled() bool { - return stub.IsAlwaysSaveTokenMetaDataEnabledField -} - -// IsChangeUsernameEnabled - -func (stub *EnableEpochsHandlerStub) IsChangeUsernameEnabled() bool { - return stub.IsChangeUsernameEnabledField -} - -// IsConsistentTokensValuesLengthCheckEnabled - -func (stub *EnableEpochsHandlerStub) IsConsistentTokensValuesLengthCheckEnabled() bool { - return stub.IsConsistentTokensValuesLengthCheckEnabledField -} - -// IsAutoBalanceDataTriesEnabled - -func (stub *EnableEpochsHandlerStub) IsAutoBalanceDataTriesEnabled() bool { - return stub.IsAutoBalanceDataTriesEnabledField -} - -// MultiESDTTransferAsyncCallBackEnableEpoch - -func (stub *EnableEpochsHandlerStub) MultiESDTTransferAsyncCallBackEnableEpoch() uint32 { - return stub.MultiESDTTransferAsyncCallBackEnableEpochField -} - -// FixOOGReturnCodeEnableEpoch - -func (stub *EnableEpochsHandlerStub) FixOOGReturnCodeEnableEpoch() uint32 { - return stub.FixOOGReturnCodeEnableEpochField -} - -// RemoveNonUpdatedStorageEnableEpoch - -func (stub *EnableEpochsHandlerStub) RemoveNonUpdatedStorageEnableEpoch() uint32 { - return stub.RemoveNonUpdatedStorageEnableEpochField -} - -// CreateNFTThroughExecByCallerEnableEpoch - -func (stub *EnableEpochsHandlerStub) CreateNFTThroughExecByCallerEnableEpoch() uint32 { - return stub.CreateNFTThroughExecByCallerEnableEpochField -} - -// FixFailExecutionOnErrorEnableEpoch - -func (stub *EnableEpochsHandlerStub) FixFailExecutionOnErrorEnableEpoch() uint32 { - return stub.FixFailExecutionOnErrorEnableEpochField -} - -// ManagedCryptoAPIEnableEpoch - -func (stub *EnableEpochsHandlerStub) ManagedCryptoAPIEnableEpoch() uint32 { - return stub.ManagedCryptoAPIEnableEpochField -} - -// DisableExecByCallerEnableEpoch - -func (stub *EnableEpochsHandlerStub) DisableExecByCallerEnableEpoch() uint32 { - return stub.DisableExecByCallerEnableEpochField -} - -// RefactorContextEnableEpoch - -func (stub *EnableEpochsHandlerStub) RefactorContextEnableEpoch() uint32 { - return stub.RefactorContextEnableEpochField -} - -// CheckExecuteReadOnlyEnableEpoch - -func (stub *EnableEpochsHandlerStub) CheckExecuteReadOnlyEnableEpoch() uint32 { - return stub.CheckExecuteReadOnlyEnableEpochField -} - -// StorageAPICostOptimizationEnableEpoch - -func (stub *EnableEpochsHandlerStub) StorageAPICostOptimizationEnableEpoch() uint32 { - return stub.StorageAPICostOptimizationEnableEpochField +// IsFlagEnabledInEpoch - +func (stub *EnableEpochsHandlerStub) IsFlagEnabledInEpoch(flag core.EnableEpochFlag, epoch uint32) bool { + if stub.IsFlagEnabledInEpochCalled != nil { + return stub.IsFlagEnabledInEpochCalled(flag, epoch) + } + return false } -// IsScToScEventLogEnabled - -func (stub *EnableEpochsHandlerStub) IsScToScEventLogEnabled() bool { - return stub.ScToScLogEventEnabledField +// GetActivationEpoch - +func (stub *EnableEpochsHandlerStub) GetActivationEpoch(flag core.EnableEpochFlag) uint32 { + if stub.GetActivationEpochCalled != nil { + return stub.GetActivationEpochCalled(flag) + } + switch flag { + case vmhost.MultiESDTTransferFixOnCallBackFlag: + return stub.MultiESDTTransferAsyncCallBackEnableEpochField + case vmhost.FixOOGReturnCodeFlag: + return stub.FixOOGReturnCodeEnableEpochField + case vmhost.RemoveNonUpdatedStorageFlag: + return stub.RemoveNonUpdatedStorageEnableEpochField + case vmhost.CreateNFTThroughExecByCallerFlag: + return stub.CreateNFTThroughExecByCallerEnableEpochField + case vmhost.FailExecutionOnEveryAPIErrorFlag: + return stub.FixFailExecutionOnErrorEnableEpochField + case vmhost.ManagedCryptoAPIsFlag: + return stub.ManagedCryptoAPIEnableEpochField + case vmhost.DisableExecByCallerFlag: + return stub.DisableExecByCallerEnableEpochField + case vmhost.RefactorContextFlag: + return stub.RefactorContextEnableEpochField + case vmhost.CheckExecuteOnReadOnlyFlag: + return stub.CheckExecuteReadOnlyEnableEpochField + case vmhost.StorageAPICostOptimizationFlag: + return stub.StorageAPICostOptimizationEnableEpochField + default: + return 0 + } } // IsInterfaceNil -