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

     1  package input
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/stellar/go/ingest"
     9  	"github.com/stellar/go/ingest/ledgerbackend"
    10  	"github.com/stellar/stellar-etl/internal/toid"
    11  	"github.com/stellar/stellar-etl/internal/utils"
    12  )
    13  
    14  // AllHistoryTransformInput is a representation of the input for the TransformOperation function
    15  type AllHistoryTransformInput struct {
    16  	Operations []OperationTransformInput
    17  	Trades     []TradeTransformInput
    18  	Ledgers    []LedgerTransformInput
    19  }
    20  
    21  // GetAllHistory returns a slice of operations, trades, effects, transactions, diagnostic events
    22  // for the ledgers in the provided range (inclusive on both ends)
    23  func GetAllHistory(start, end uint32, limit int64, env utils.EnvironmentDetails) (AllHistoryTransformInput, error) {
    24  	ctx := context.Background()
    25  
    26  	backend, err := env.CreateCaptiveCoreBackend()
    27  
    28  	if err != nil {
    29  		return AllHistoryTransformInput{}, err
    30  	}
    31  
    32  	opSlice := []OperationTransformInput{}
    33  	tradeSlice := []TradeTransformInput{}
    34  	txSlice := []LedgerTransformInput{}
    35  	err = backend.PrepareRange(ctx, ledgerbackend.BoundedRange(start, end))
    36  	panicIf(err)
    37  	for seq := start; seq <= end; seq++ {
    38  		changeReader, err := ingest.NewLedgerChangeReader(ctx, backend, env.NetworkPassphrase, seq)
    39  		if err != nil {
    40  			return AllHistoryTransformInput{}, err
    41  		}
    42  		txReader := changeReader.LedgerTransactionReader
    43  
    44  		ledgerCloseMeta, err := backend.GetLedger(ctx, seq)
    45  		if err != nil {
    46  			return AllHistoryTransformInput{}, fmt.Errorf("error getting ledger seq %d from the backend: %v", seq, err)
    47  		}
    48  
    49  		closeTime, err := utils.TimePointToUTCTimeStamp(txReader.GetHeader().Header.ScpValue.CloseTime)
    50  		if err != nil {
    51  			return AllHistoryTransformInput{}, err
    52  		}
    53  
    54  		lhe := txReader.GetHeader()
    55  
    56  		for limit < 0 {
    57  			tx, err := txReader.Read()
    58  			if err == io.EOF {
    59  				break
    60  			}
    61  
    62  			for index, op := range tx.Envelope.Operations() {
    63  				// Operations
    64  				opSlice = append(opSlice, OperationTransformInput{
    65  					Operation:       op,
    66  					OperationIndex:  int32(index),
    67  					Transaction:     tx,
    68  					LedgerSeqNum:    int32(seq),
    69  					LedgerCloseMeta: ledgerCloseMeta,
    70  				})
    71  
    72  				// Trades
    73  				if operationResultsInTrade(op) && tx.Result.Successful() {
    74  					tradeSlice = append(tradeSlice, TradeTransformInput{
    75  						OperationIndex:     int32(index),
    76  						Transaction:        tx,
    77  						CloseTime:          closeTime,
    78  						OperationHistoryID: toid.New(int32(seq), int32(tx.Index), int32(index)).ToInt64(),
    79  					})
    80  				}
    81  			}
    82  			// Transactions
    83  			txSlice = append(txSlice, LedgerTransformInput{
    84  				Transaction:     tx,
    85  				LedgerHistory:   lhe,
    86  				LedgerCloseMeta: ledgerCloseMeta,
    87  			})
    88  
    89  		}
    90  
    91  		txReader.Close()
    92  	}
    93  
    94  	allHistoryTransformInput := AllHistoryTransformInput{
    95  		Operations: opSlice,
    96  		Trades:     tradeSlice,
    97  		Ledgers:    txSlice,
    98  	}
    99  
   100  	return allHistoryTransformInput, nil
   101  }