diff --git a/.golangci.yml b/.golangci.yml
index 713c6660b5db8ac35e22d04bdb9904718dbae753..c776341cb1272923fac75d22e0a3023574523761 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -23,16 +23,17 @@ linters-settings:
   gocritic:
     # Which checks should be enabled; can't be combined with 'disabled-checks';
     # See https://go-critic.github.io/overview#checks-overview
-    # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run`
+    # To check which checks are enabled run `GL_DEBUG=gocritic ./build/bin/golangci-lint run`
     # By default list of stable checks is used.
     enabled-checks:
       - ruleguard
       - truncateCmp
-    #      - defaultCaseOrder
+      # - defaultCaseOrder
 
     # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty
     disabled-checks:
       - regexpMust
+      - appendAssign
       #      - hugeParam
       - rangeValCopy
       - exitAfterDefer
@@ -44,17 +45,22 @@ linters-settings:
       - captLocal
       - commentFormatting
       - ifElseChain
-      - appendAssign
+      - importShadow
+      - paramTypeCombine
+      - builtinShadow
+      - typeUnparen
 
     # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.
     # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags".
     enabled-tags:
       - performance
+      - diagnostic
+      - opinionated
     disabled-tags:
       - experimental
-    ruleguard:
-      rules: "rules.go"
     settings:
+      ruleguard:
+        rules: "rules.go"
       hugeParam:
         # size in bytes that makes the warning trigger (default 80)
         sizeThreshold: 1000
diff --git a/Makefile b/Makefile
index 25937319595b1a467f748598fa3f717ee3aec71d..49746f7937748d5d59aa0e9f2239ebe6703125cf 100644
--- a/Makefile
+++ b/Makefile
@@ -143,6 +143,7 @@ clean:
 	go clean -cache
 	rm -fr build/*
 	cd libmdbx/ && make clean
+	./build/bin/golangci-lint cache clean
 
 # The devtools target installs tools required for 'go generate'.
 # You need to put $GOBIN (or $GOPATH/bin) in your PATH to use 'go generate'.
diff --git a/cmd/rpcdaemon/commands/eth_call.go b/cmd/rpcdaemon/commands/eth_call.go
index ffa7a386f6ed49a6bf6ed914f505e4c3e2b88750..4f4175bcb4a34f7aec4fb0ce3847e4cd1980bced 100644
--- a/cmd/rpcdaemon/commands/eth_call.go
+++ b/cmd/rpcdaemon/commands/eth_call.go
@@ -401,7 +401,7 @@ func (api *APIImpl) CreateAccessList(ctx context.Context, args ethapi.CallArgs,
 			if res.Err != nil {
 				errString = res.Err.Error()
 			}
-			return &accessListResult{Accesslist: &accessList, Error: errString, GasUsed: (hexutil.Uint64)(res.UsedGas)}, nil
+			return &accessListResult{Accesslist: &accessList, Error: errString, GasUsed: hexutil.Uint64(res.UsedGas)}, nil
 		}
 		prevTracer = tracer
 	}
diff --git a/common/hasher.go b/common/hasher.go
index 168c21b675ea1c96872e58365e0f06db0d3a19c4..87cb09a309fa4a212093343008dc07e15e54405c 100644
--- a/common/hasher.go
+++ b/common/hasher.go
@@ -56,19 +56,3 @@ func HashData(data []byte) (Hash, error) {
 	}
 	return buf, nil
 }
-
-func HashTo(data []byte, to []byte) {
-	h := NewHasher()
-	defer ReturnHasherToPool(h)
-	h.Sha.Reset()
-
-	_, err := h.Sha.Write(data)
-	if err != nil {
-		panic(err)
-	}
-
-	_, err = h.Sha.Read(to)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/common/path.go b/common/path.go
index ca107fbf77aa27a36067d4f8323e5ee1ea30948e..3c76fdacd2f69c5e3c3c7e329884b68e160a3269 100644
--- a/common/path.go
+++ b/common/path.go
@@ -41,7 +41,7 @@ func FileExist(filePath string) bool {
 }
 
 // AbsolutePath returns datadir + filename, or filename if it is absolute.
-func AbsolutePath(datadir string, filename string) string {
+func AbsolutePath(datadir, filename string) string {
 	if filepath.IsAbs(filename) {
 		return filename
 	}
diff --git a/eth/stagedsync/stage_call_traces.go b/eth/stagedsync/stage_call_traces.go
index b40865473d7ea6f09c5e931f686d8656c7b1c045..47a2dc8ff3442bf9227df9bb6ea30f85dca4a354 100644
--- a/eth/stagedsync/stage_call_traces.go
+++ b/eth/stagedsync/stage_call_traces.go
@@ -259,7 +259,9 @@ func UnwindCallTraces(u *UnwindState, s *StageState, tx kv.RwTx, cfg CallTracesC
 
 func DoUnwindCallTraces(logPrefix string, db kv.RwTx, from, to uint64, ctx context.Context, tmpdir string) error {
 	froms := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize))
+	defer froms.Close()
 	tos := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize))
+	defer tos.Close()
 
 	logEvery := time.NewTicker(30 * time.Second)
 	defer logEvery.Stop()
@@ -359,7 +361,9 @@ func pruneCallTraces(tx kv.RwTx, logPrefix string, pruneTo uint64, ctx context.C
 	defer logEvery.Stop()
 
 	froms := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize))
+	defer froms.Close()
 	tos := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize))
+	defer tos.Close()
 
 	{
 		traceCursor, err := tx.CursorDupSort(kv.CallTraceSet)
diff --git a/eth/stagedsync/stage_hashstate.go b/eth/stagedsync/stage_hashstate.go
index ed02a016fb51a639ae32e78316b6b211b1e24224..017e901c308e8d3dde7bf33f7d8d028c07af6187 100644
--- a/eth/stagedsync/stage_hashstate.go
+++ b/eth/stagedsync/stage_hashstate.go
@@ -160,11 +160,9 @@ func readPlainStateOnce(
 	bufferSize := etl.BufferOptimalSize
 
 	accCollector := etl.NewCollector(logPrefix, tmpdir, etl.NewSortableBuffer(bufferSize))
+	defer accCollector.Close()
 	storageCollector := etl.NewCollector(logPrefix, tmpdir, etl.NewSortableBuffer(bufferSize))
-	defer func() {
-		accCollector.Close()
-		storageCollector.Close()
-	}()
+	defer storageCollector.Close()
 
 	t := time.Now()
 	logEvery := time.NewTicker(30 * time.Second)
diff --git a/eth/stagedsync/stage_headers.go b/eth/stagedsync/stage_headers.go
index 4fdc873bc7ae38c25d8a9df72bf4b1fc9757de1a..1e0cd663794a90fb9de676e48aea7b5c984f8f69 100644
--- a/eth/stagedsync/stage_headers.go
+++ b/eth/stagedsync/stage_headers.go
@@ -222,10 +222,10 @@ func HeadersPOS(
 	prevProgress := headerNumber
 
 	headerCollector := etl.NewCollector(logPrefix, cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize))
+	defer headerCollector.Close()
 	cfg.hd.SetHeadersCollector(headerCollector)
 	// Cleanup after we finish backward sync
 	defer func() {
-		headerCollector.Close()
 		cfg.hd.SetHeadersCollector(nil)
 		cfg.hd.Unsync()
 		cfg.hd.SetFetching(false)
diff --git a/rules.go b/rules.go
index a56a624a9227d635701d0120540ba6276dfdaa11..73624f8bf846096755727298cb6acbe8c580e3e7 100644
--- a/rules.go
+++ b/rules.go
@@ -1,8 +1,10 @@
+//go:build gorules
 // +build gorules
 
 package gorules
 
 // https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
+// to apply changes in this file, please do: ./build/bin/golangci-lint cache clean
 import (
 	"github.com/quasilyte/go-ruleguard/dsl"
 	//quasilyterules "github.com/quasilyte/ruleguard-rules-test"