diff --git a/pkg/core/interop_system.go b/pkg/core/interop_system.go index c1f43d0239..509d763441 100644 --- a/pkg/core/interop_system.go +++ b/pkg/core/interop_system.go @@ -396,8 +396,12 @@ func putWithContextAndFlags(ic *interop.Context, stc *StorageContext, key []byte if si == nil { si = &state.StorageItem{} sizeInc = len(key) + len(value) - } else if len(value) > len(si.Value) { - sizeInc = len(value) - len(si.Value) + } else if len(value) != 0 { + if len(value) <= len(si.Value) { + sizeInc = (len(value)-1)/4 + 1 + } else { + sizeInc = (len(si.Value)-1)/4 + 1 + len(value) - len(si.Value) + } } if !ic.VM.AddGas(int64(sizeInc) * StoragePrice) { return errGasLimitExceeded diff --git a/pkg/core/interop_system_test.go b/pkg/core/interop_system_test.go index 00d5644ea3..0eaf8e274d 100644 --- a/pkg/core/interop_system_test.go +++ b/pkg/core/interop_system_test.go @@ -364,7 +364,9 @@ func TestStoragePut(t *testing.T) { err := storagePut(ic) require.True(t, errors.Is(err, errGasLimitExceeded), "got: %v", err) }) - initVM(t, []byte{4}, []byte{5, 6, 7, 8}, 2*StoragePrice) + initVM(t, []byte{4}, []byte{5, 6, 7, 8}, 3*StoragePrice) + require.NoError(t, storagePut(ic)) + initVM(t, []byte{4}, []byte{5, 6}, StoragePrice) require.NoError(t, storagePut(ic)) }) }