diff --git a/cmd/hack/hack.go b/cmd/hack/hack.go
index 6a481ebc0026580e17ee380680cdb83412d6027d..535cca5031cec95e6ecbe77e426b88f717bdc7f7 100644
--- a/cmd/hack/hack.go
+++ b/cmd/hack/hack.go
@@ -36,7 +36,6 @@ import (
 	"github.com/ledgerwatch/erigon-lib/kv/mdbx"
 	"github.com/ledgerwatch/erigon-lib/patricia"
 	"github.com/ledgerwatch/erigon-lib/recsplit"
-	"github.com/ledgerwatch/erigon-lib/txpool"
 	hackdb "github.com/ledgerwatch/erigon/cmd/hack/db"
 	"github.com/ledgerwatch/erigon/cmd/hack/flow"
 	"github.com/ledgerwatch/erigon/cmd/hack/tool"
@@ -1188,11 +1187,6 @@ func dumpState(chaindata string, block int, name string) error {
 		return err
 	}
 	defer cc.Close()
-	var hc kv.Cursor
-	if hc, err = tx.Cursor(kv.Code); err != nil {
-		return err
-	}
-	defer hc.Close()
 	i := 0
 	numBuf := make([]byte, binary.MaxVarintLen64)
 	k, v, e := sc.First()
@@ -1221,8 +1215,8 @@ func dumpState(chaindata string, block int, name string) error {
 				return err
 			}
 			if a.CodeHash != trie.EmptyCodeHash {
-				var code []byte
-				if _, code, err = hc.SeekExact(a.CodeHash[:]); err != nil {
+				code, err := tx.GetOne(kv.Code, a.CodeHash[:])
+				if err != nil {
 					return err
 				}
 				if len(code) != 0 {
@@ -2649,153 +2643,6 @@ func recsplitWholeChain(chaindata string) error {
 	return nil
 }
 
-func recsplitLookup(chaindata, name string) error {
-	database := mdbx.MustOpen(chaindata)
-	defer database.Close()
-	chainConfig := tool.ChainConfigFromDB(database)
-	chainID, _ := uint256.FromBig(chainConfig.ChainID)
-	logEvery := time.NewTicker(20 * time.Second)
-	defer logEvery.Stop()
-
-	d, err := compress.NewDecompressor(name + ".seg")
-	if err != nil {
-		return err
-	}
-	defer d.Close()
-
-	idx := recsplit.MustOpen(name + ".idx")
-	defer idx.Close()
-
-	var word, word2 = make([]byte, 0, 4096), make([]byte, 0, 4096)
-	wc := 0
-	g := d.MakeGetter()
-	dataGetter := d.MakeGetter()
-
-	parseCtx := txpool.NewTxParseContext(*chainID)
-	parseCtx.WithSender(false)
-	slot := txpool.TxSlot{}
-	var sender [20]byte
-	var l1, l2, total time.Duration
-	start := time.Now()
-	var prev []byte
-	var prevOffset uint64
-	for g.HasNext() {
-		word, _ = g.Next(word[:0])
-		if _, err := parseCtx.ParseTransaction(word[1:], 0, &slot, sender[:]); err != nil {
-			return err
-		}
-		wc++
-
-		t := time.Now()
-		recID := idx.Lookup(slot.IdHash[:])
-		l1 += time.Since(t)
-		t = time.Now()
-		offset := idx.Lookup2(recID)
-		l2 += time.Since(t)
-		if ASSERT {
-			var dataP uint64
-			if prev != nil {
-				dataGetter.Reset(prevOffset)
-				word2, dataP = dataGetter.Next(word2[:0])
-				if !bytes.Equal(word, word2) {
-					fmt.Printf("wc=%d, %d,%d\n", wc, offset, dataP-uint64(len(word2)))
-					fmt.Printf("word: %x,%x\n\n", word, word2)
-					panic(fmt.Errorf("getter returned wrong data. IdHash=%x, offset=%x", slot.IdHash[:], offset))
-				}
-			}
-			prev = common.CopyBytes(word)
-			prevOffset = offset
-		}
-
-		select {
-		default:
-		case <-logEvery.C:
-			var m runtime.MemStats
-			runtime.ReadMemStats(&m)
-			log.Info("Checked", "millions", float64(wc)/1_000_000,
-				"lookup", time.Duration(int64(l1)/int64(wc)), "lookup2", time.Duration(int64(l2)/int64(wc)),
-				"alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys),
-			)
-		}
-	}
-
-	total = time.Since(start)
-	log.Info("Average decoding time", "lookup", time.Duration(int64(l1)/int64(wc)), "lookup + lookup2", time.Duration(int64(l2)/int64(wc)), "items", wc, "total", total)
-	return nil
-}
-
-func createIdx(chaindata string, name string) error {
-	database := mdbx.MustOpen(chaindata)
-	defer database.Close()
-	chainConfig := tool.ChainConfigFromDB(database)
-	chainID, _ := uint256.FromBig(chainConfig.ChainID)
-	d, err := compress.NewDecompressor(name + ".seg")
-	if err != nil {
-		return err
-	}
-	defer d.Close()
-	return _createIdx(*chainID, name, d.Count())
-}
-func _createIdx(chainID uint256.Int, name string, count int) error {
-	d, err := compress.NewDecompressor(name + ".seg")
-	if err != nil {
-		return err
-	}
-	defer d.Close()
-	logEvery := time.NewTicker(20 * time.Second)
-	defer logEvery.Stop()
-	rs, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{
-		KeyCount:   int(count),
-		Enums:      true,
-		BucketSize: 2000,
-		Salt:       0,
-		LeafSize:   8,
-		TmpDir:     "",
-		IndexFile:  name + ".idx",
-	})
-	if err != nil {
-		return err
-	}
-
-RETRY:
-
-	var word = make([]byte, 0, 256)
-	g := d.MakeGetter()
-	wc := 0
-	var pos uint64
-	parseCtx := txpool.NewTxParseContext(chainID)
-	parseCtx.WithSender(false)
-	slot := txpool.TxSlot{}
-	var sender [20]byte
-
-	for g.HasNext() {
-		word, pos = g.Next(word[:0])
-		if _, err := parseCtx.ParseTransaction(word[1:], 0, &slot, sender[:]); err != nil {
-			return err
-		}
-		if err := rs.AddKey(slot.IdHash[:], pos); err != nil {
-			return err
-		}
-		wc++
-		select {
-		default:
-		case <-logEvery.C:
-			log.Info("[Filling recsplit] Processed", "millions", wc/1_000_000)
-		}
-	}
-	log.Info("Building recsplit...")
-
-	if err = rs.Build(); err != nil {
-		if errors.Is(err, recsplit.ErrCollision) {
-			log.Info("Building recsplit. Collision happened. It's ok. Restarting...", "err", err)
-			rs.ResetNextSalt()
-			goto RETRY
-		}
-		return err
-	}
-
-	return nil
-}
 func decompress(name string) error {
 	d, err := compress.NewDecompressor(name + ".seg")
 	if err != nil {
@@ -4077,12 +3924,8 @@ func main() {
 		err = dumpState(*chaindata, int(*block), *name)
 	case "compress":
 		err = compress1(*chaindata, *name, *name)
-	case "createIdx":
-		err = createIdx(*chaindata, *name)
 	case "recsplitWholeChain":
 		err = recsplitWholeChain(*chaindata)
-	case "recsplitLookup":
-		err = recsplitLookup(*chaindata, *name)
 	case "decompress":
 		err = decompress(*name)
 	case "genstate":
diff --git a/turbo/snapshotsync/block_reader.go b/turbo/snapshotsync/block_reader.go
index 44f62d6d4066020cf15a6ab669836efee66eaab1..c136bcd1ac04ff077f390cd05fc6578082a9eba7 100644
--- a/turbo/snapshotsync/block_reader.go
+++ b/turbo/snapshotsync/block_reader.go
@@ -102,7 +102,7 @@ func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx k
 
 	gg := sn.Headers.Segment.MakeGetter()
 	gg.Reset(headerOffset)
-	buf, _ = gg.Next(buf[:0]) //TODO: use gg.Current here
+	buf, _ = gg.Next(buf[:0])
 	h := &types.Header{}
 	if err = rlp.DecodeBytes(buf, h); err != nil {
 		return nil, nil, err
@@ -110,7 +110,7 @@ func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx k
 
 	gg = sn.Bodies.Segment.MakeGetter()
 	gg.Reset(bodyOffset)
-	buf, _ = gg.Next(buf[:0]) //TODO: use gg.Current here
+	buf, _ = gg.Next(buf[:0])
 	b := &types.BodyForStorage{}
 	if err = rlp.DecodeBytes(buf, b); err != nil {
 		return nil, nil, err
@@ -124,7 +124,6 @@ func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx k
 	stream := rlp.NewStream(reader, 0)
 	txs := make([]types.Transaction, b.TxAmount)
 	senders = make([]common.Address, b.TxAmount)
-	//TODO: use gg.Current here
 	for i := uint32(0); i < b.TxAmount; i++ {
 		buf, _ = gg.Next(buf[:0])
 		senders[i].SetBytes(buf[1 : 1+20])