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 }