github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/cmd/export_contract_data.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/sirupsen/logrus"
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/stellar/stellar-etl/internal/input"
    10  	"github.com/stellar/stellar-etl/internal/transform"
    11  	"github.com/stellar/stellar-etl/internal/utils"
    12  
    13  	"github.com/stellar/go/xdr"
    14  )
    15  
    16  var dataCmd = &cobra.Command{
    17  	Use:   "export_contract_data",
    18  	Short: "Exports the contract data information made from the genesis ledger to a specified endpoint.",
    19  	Long:  `Exports historical contract data from the genesis ledger to the provided end-ledger to an output file. 
    20  	The command reads from the bucket list, which includes the full history of the Stellar ledger. As a result, it 
    21  	should be used in an initial data dump. In order to get offer information within a specified ledger range, see 
    22  	the export_ledger_entry_changes command.`,
    23  	Run: func(cmd *cobra.Command, args []string) {
    24  		cmdLogger.SetLevel(logrus.InfoLevel)
    25  		endNum, strictExport, isTest, isFuture, extra := utils.MustCommonFlags(cmd.Flags(), cmdLogger)
    26  		cmdLogger.StrictExport = strictExport
    27  		env := utils.GetEnvironmentDetails(isTest, isFuture)
    28  		path := utils.MustBucketFlags(cmd.Flags(), cmdLogger)
    29  		cloudStorageBucket, cloudCredentials, cloudProvider := utils.MustCloudStorageFlags(cmd.Flags(), cmdLogger)
    30  
    31  		datas, err := input.GetEntriesFromGenesis(endNum, xdr.LedgerEntryTypeContractData, env.ArchiveURLs)
    32  		if err != nil {
    33  			cmdLogger.Fatal("Error getting ledger entries: ", err)
    34  		}
    35  
    36  		outFile := mustOutFile(path)
    37  		numFailures := 0
    38  		totalNumBytes := 0
    39  		var header xdr.LedgerHeaderHistoryEntry
    40  		for _, data := range datas {
    41  			TransformContractData := transform.NewTransformContractDataStruct(transform.AssetFromContractData, transform.ContractBalanceFromContractData)
    42  			transformed, err, ok := TransformContractData.TransformContractData(data, env.NetworkPassphrase, header)
    43  			if err != nil {
    44  				cmdLogger.LogError(fmt.Errorf("could not transform contract data %+v: %v", data, err))
    45  				numFailures += 1
    46  				continue
    47  			}
    48  
    49  			if !ok {
    50  				continue
    51  			}
    52  
    53  			numBytes, err := exportEntry(transformed, outFile, extra)
    54  			if err != nil {
    55  				cmdLogger.LogError(fmt.Errorf("could not export contract data %+v: %v", data, err))
    56  				numFailures += 1
    57  				continue
    58  			}
    59  			totalNumBytes += numBytes
    60  		}
    61  		outFile.Close()
    62  		cmdLogger.Info("Number of bytes written: ", totalNumBytes)
    63  
    64  		printTransformStats(len(datas), numFailures)
    65  		maybeUpload(cloudCredentials, cloudStorageBucket, cloudProvider, path)
    66  
    67  	},
    68  }
    69  
    70  func init() {
    71  	rootCmd.AddCommand(dataCmd)
    72  	utils.AddCommonFlags(dataCmd.Flags())
    73  	utils.AddBucketFlags("contract_data", dataCmd.Flags())
    74  	utils.AddCloudStorageFlags(dataCmd.Flags())
    75  	dataCmd.MarkFlagRequired("end-ledger")
    76  	/*
    77  		Current flags:
    78  			end-ledger: the ledger sequence number for the end of the export range (required)
    79  			output-file: filename of the output file
    80  			stdout: if set, output is printed to stdout
    81  
    82  		TODO: implement extra flags if possible
    83  			serialize-method: the method for serialization of the output data (JSON, XDR, etc)
    84  			 end time as a replacement for end sequence numbers
    85  	*/
    86  }