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  }