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  }