github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/transform/claimable_balance.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 func transformClaimants(claimants []xdr.Claimant) []Claimant { 12 var transformed []Claimant 13 for _, c := range claimants { 14 cv0 := c.MustV0() 15 transformed = append(transformed, Claimant{ 16 Destination: cv0.Destination.Address(), 17 Predicate: cv0.Predicate, 18 }) 19 } 20 return transformed 21 } 22 23 // TransformClaimableBalance converts a claimable balance from the history archive ingestion system into a form suitable for BigQuery 24 func TransformClaimableBalance(ledgerChange ingest.Change, header xdr.LedgerHeaderHistoryEntry) (ClaimableBalanceOutput, error) { 25 ledgerEntry, changeType, outputDeleted, err := utils.ExtractEntryFromChange(ledgerChange) 26 if err != nil { 27 return ClaimableBalanceOutput{}, err 28 } 29 30 balanceEntry, balanceFound := ledgerEntry.Data.GetClaimableBalance() 31 if !balanceFound { 32 return ClaimableBalanceOutput{}, fmt.Errorf("could not extract claimable balance data from ledger entry; actual type is %s", ledgerEntry.Data.Type) 33 } 34 balanceID, err := xdr.MarshalHex(balanceEntry.BalanceId) 35 if err != nil { 36 return ClaimableBalanceOutput{}, fmt.Errorf("Invalid balanceId in op: %d", uint32(ledgerEntry.LastModifiedLedgerSeq)) 37 } 38 outputFlags := uint32(balanceEntry.Flags()) 39 outputAsset, err := transformSingleAsset(balanceEntry.Asset) 40 if err != nil { 41 return ClaimableBalanceOutput{}, err 42 } 43 outputClaimants := transformClaimants(balanceEntry.Claimants) 44 outputAmount := balanceEntry.Amount 45 46 outputLastModifiedLedger := uint32(ledgerEntry.LastModifiedLedgerSeq) 47 48 closedAt, err := utils.TimePointToUTCTimeStamp(header.Header.ScpValue.CloseTime) 49 if err != nil { 50 return ClaimableBalanceOutput{}, err 51 } 52 53 ledgerSequence := header.Header.LedgerSeq 54 55 transformed := ClaimableBalanceOutput{ 56 BalanceID: balanceID, 57 AssetCode: outputAsset.AssetCode, 58 AssetIssuer: outputAsset.AssetIssuer, 59 AssetType: outputAsset.AssetType, 60 AssetID: outputAsset.ID, 61 Claimants: outputClaimants, 62 AssetAmount: float64(outputAmount) / 1.0e7, 63 Sponsor: ledgerEntrySponsorToNullString(ledgerEntry), 64 LastModifiedLedger: outputLastModifiedLedger, 65 LedgerEntryChange: uint32(changeType), 66 Flags: outputFlags, 67 Deleted: outputDeleted, 68 ClosedAt: closedAt, 69 LedgerSequence: uint32(ledgerSequence), 70 } 71 return transformed, nil 72 }