github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/transform/liquidity_pool.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 // TransformPool converts an liquidity pool ledger change entry into a form suitable for BigQuery 12 func TransformPool(ledgerChange ingest.Change, header xdr.LedgerHeaderHistoryEntry) (PoolOutput, error) { 13 ledgerEntry, changeType, outputDeleted, err := utils.ExtractEntryFromChange(ledgerChange) 14 if err != nil { 15 return PoolOutput{}, err 16 } 17 18 // LedgerEntryChange must contain a liquidity pool state change to be parsed, otherwise skip 19 if ledgerEntry.Data.Type != xdr.LedgerEntryTypeLiquidityPool { 20 return PoolOutput{}, nil 21 } 22 23 lp, ok := ledgerEntry.Data.GetLiquidityPool() 24 if !ok { 25 return PoolOutput{}, fmt.Errorf("Could not extract liquidity pool data from ledger entry; actual type is %s", ledgerEntry.Data.Type) 26 } 27 28 cp, ok := lp.Body.GetConstantProduct() 29 if !ok { 30 return PoolOutput{}, fmt.Errorf("Could not extract constant product information for liquidity pool %s", xdr.Hash(lp.LiquidityPoolId).HexString()) 31 } 32 33 poolType, ok := xdr.LiquidityPoolTypeToString[lp.Body.Type] 34 if !ok { 35 return PoolOutput{}, fmt.Errorf("Unknown liquidity pool type: %d", lp.Body.Type) 36 } 37 38 var assetAType, assetACode, assetAIssuer string 39 err = cp.Params.AssetA.Extract(&assetAType, &assetACode, &assetAIssuer) 40 if err != nil { 41 return PoolOutput{}, err 42 } 43 assetAID := FarmHashAsset(assetACode, assetAIssuer, assetAType) 44 45 var assetBType, assetBCode, assetBIssuer string 46 err = cp.Params.AssetB.Extract(&assetBType, &assetBCode, &assetBIssuer) 47 assetBID := FarmHashAsset(assetBCode, assetBIssuer, assetBType) 48 49 closedAt, err := utils.TimePointToUTCTimeStamp(header.Header.ScpValue.CloseTime) 50 if err != nil { 51 return PoolOutput{}, err 52 } 53 54 ledgerSequence := header.Header.LedgerSeq 55 56 transformedPool := PoolOutput{ 57 PoolID: PoolIDToString(lp.LiquidityPoolId), 58 PoolType: poolType, 59 PoolFee: uint32(cp.Params.Fee), 60 TrustlineCount: uint64(cp.PoolSharesTrustLineCount), 61 PoolShareCount: utils.ConvertStroopValueToReal(cp.TotalPoolShares), 62 AssetAType: assetAType, 63 AssetACode: assetACode, 64 AssetAIssuer: assetAIssuer, 65 AssetAID: assetAID, 66 AssetAReserve: utils.ConvertStroopValueToReal(cp.ReserveA), 67 AssetBType: assetBType, 68 AssetBCode: assetBCode, 69 AssetBIssuer: assetBIssuer, 70 AssetBID: assetBID, 71 AssetBReserve: utils.ConvertStroopValueToReal(cp.ReserveB), 72 LastModifiedLedger: uint32(ledgerEntry.LastModifiedLedgerSeq), 73 LedgerEntryChange: uint32(changeType), 74 Deleted: outputDeleted, 75 ClosedAt: closedAt, 76 LedgerSequence: uint32(ledgerSequence), 77 } 78 return transformedPool, nil 79 }