mukan-ignite/ignite/pkg/cosmostxcollector/collector.go
Mukan Erkin Törük 26b204bd04
Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
feat: fork Ignite CLI v29 as Mukan Ignite — remove cosmos-sdk restrictions
2026-05-11 03:31:37 +03:00

58 lines
1.7 KiB
Go

package cosmostxcollector
import (
"context"
"golang.org/x/sync/errgroup"
"github.com/ignite/cli/v29/ignite/pkg/cosmosclient"
"github.com/ignite/cli/v29/ignite/pkg/cosmostxcollector/adapter"
)
// TXsCollector defines the interface for Cosmos clients that support collection of transactions.
//
//go:generate mockery --name TXsCollector --filename txs_collector.go --with-expecter
type TXsCollector interface {
CollectTXs(ctx context.Context, fromHeight int64, tc chan<- []cosmosclient.TX) error
}
// New creates a new Cosmos transaction collector.
func New(db adapter.Saver, client TXsCollector) Collector {
return Collector{db, client}
}
// Collector defines a type to collect and save Cosmos transactions in a data backend.
type Collector struct {
db adapter.Saver
client TXsCollector
}
// Collect gathers transactions for all blocks starting from a specific height.
// Each group of block transactions is saved sequentially after being collected.
func (c Collector) Collect(ctx context.Context, fromHeight int64) error {
tc := make(chan []cosmosclient.TX)
wg, ctx := errgroup.WithContext(ctx)
// Start collecting block transactions.
// The transactions channel is closed by the client when all transactions
// are collected or when an error occurs during the collection.
wg.Go(func() error {
return c.client.CollectTXs(ctx, fromHeight, tc)
})
// The transactions for each block are saved in "bulks" so they are not
// kept in memory. Also, they are saved sequentially to avoid block height
// gaps that can occur if a group of transactions from a previous block
// fail to be saved.
wg.Go(func() error {
for txs := range tc {
if err := c.db.Save(ctx, txs); err != nil {
return err
}
}
return nil
})
return wg.Wait()
}