github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/transform/contract_code.go (about) 1 package transform 2 3 import ( 4 "fmt" 5 6 "github.com/stellar/go/ingest" 7 "github.com/stellar/go/xdr" 8 "github.com/stellar/stellar-etl/internal/utils" 9 ) 10 11 // TransformContractCode converts a contract code ledger change entry into a form suitable for BigQuery 12 func TransformContractCode(ledgerChange ingest.Change, header xdr.LedgerHeaderHistoryEntry) (ContractCodeOutput, error) { 13 ledgerEntry, changeType, outputDeleted, err := utils.ExtractEntryFromChange(ledgerChange) 14 if err != nil { 15 return ContractCodeOutput{}, err 16 } 17 18 contractCode, ok := ledgerEntry.Data.GetContractCode() 19 if !ok { 20 return ContractCodeOutput{}, fmt.Errorf("Could not extract contract code from ledger entry; actual type is %s", ledgerEntry.Data.Type) 21 } 22 23 // LedgerEntryChange must contain a contract code change to be parsed, otherwise skip 24 if ledgerEntry.Data.Type != xdr.LedgerEntryTypeContractCode { 25 return ContractCodeOutput{}, nil 26 } 27 28 ledgerKeyHash := utils.LedgerEntryToLedgerKeyHash(ledgerEntry) 29 30 contractCodeExtV := contractCode.Ext.V 31 32 contractCodeHash := contractCode.Hash.HexString() 33 34 closedAt, err := utils.TimePointToUTCTimeStamp(header.Header.ScpValue.CloseTime) 35 if err != nil { 36 return ContractCodeOutput{}, err 37 } 38 39 ledgerSequence := header.Header.LedgerSeq 40 41 transformedCode := ContractCodeOutput{ 42 ContractCodeHash: contractCodeHash, 43 ContractCodeExtV: int32(contractCodeExtV), 44 LastModifiedLedger: uint32(ledgerEntry.LastModifiedLedgerSeq), 45 LedgerEntryChange: uint32(changeType), 46 Deleted: outputDeleted, 47 ClosedAt: closedAt, 48 LedgerSequence: uint32(ledgerSequence), 49 LedgerKeyHash: ledgerKeyHash, 50 } 51 return transformedCode, nil 52 }