github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/input/transactions.go (about)

     1  package input
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  
     7  	"github.com/stellar/stellar-etl/internal/utils"
     8  
     9  	"github.com/stellar/go/ingest"
    10  	"github.com/stellar/go/ingest/ledgerbackend"
    11  	"github.com/stellar/go/support/errors"
    12  	"github.com/stellar/go/xdr"
    13  )
    14  
    15  // LedgerTransformInput is a representation of the input for the TransformTransaction function
    16  type LedgerTransformInput struct {
    17  	Transaction     ingest.LedgerTransaction
    18  	LedgerHistory   xdr.LedgerHeaderHistoryEntry
    19  	LedgerCloseMeta xdr.LedgerCloseMeta
    20  }
    21  
    22  // GetTransactions returns a slice of transactions for the ledgers in the provided range (inclusive on both ends)
    23  func GetTransactions(start, end uint32, limit int64, env utils.EnvironmentDetails) ([]LedgerTransformInput, error) {
    24  	ctx := context.Background()
    25  
    26  	backend, err := env.CreateCaptiveCoreBackend()
    27  
    28  	if err != nil {
    29  		return []LedgerTransformInput{}, err
    30  	}
    31  
    32  	txSlice := []LedgerTransformInput{}
    33  	err = backend.PrepareRange(ctx, ledgerbackend.BoundedRange(start, end))
    34  	panicIf(err)
    35  	for seq := start; seq <= end; seq++ {
    36  		ledgerCloseMeta, err := backend.GetLedger(ctx, seq)
    37  		if err != nil {
    38  			return nil, errors.Wrap(err, "error getting ledger from the backend")
    39  		}
    40  
    41  		txReader, err := ingest.NewLedgerTransactionReaderFromLedgerCloseMeta(env.NetworkPassphrase, ledgerCloseMeta)
    42  		if err != nil {
    43  			return []LedgerTransformInput{}, err
    44  		}
    45  
    46  		lhe := txReader.GetHeader()
    47  
    48  		// A negative limit value means that all input should be processed
    49  		for int64(len(txSlice)) < limit || limit < 0 {
    50  			tx, err := txReader.Read()
    51  			if err == io.EOF {
    52  				break
    53  			}
    54  
    55  			txSlice = append(txSlice, LedgerTransformInput{
    56  				Transaction:     tx,
    57  				LedgerHistory:   lhe,
    58  				LedgerCloseMeta: ledgerCloseMeta,
    59  			})
    60  		}
    61  
    62  		txReader.Close()
    63  		if int64(len(txSlice)) >= limit && limit >= 0 {
    64  			break
    65  		}
    66  	}
    67  
    68  	return txSlice, nil
    69  }