github.com/Finschia/finschia-sdk@v0.48.1/x/genutil/client/cli/validate_genesis.go (about)

     1  package cli
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	octypes "github.com/Finschia/ostracon/types"
     8  	"github.com/spf13/cobra"
     9  
    10  	"github.com/Finschia/finschia-sdk/client"
    11  	"github.com/Finschia/finschia-sdk/server"
    12  	"github.com/Finschia/finschia-sdk/types/module"
    13  )
    14  
    15  const chainUpgradeGuide = "https://docs.cosmos.network/master/migrations/chain-upgrade-guide-040.html"
    16  
    17  // ValidateGenesisCmd takes a genesis file, and makes sure that it is valid.
    18  func ValidateGenesisCmd(mbm module.BasicManager) *cobra.Command {
    19  	return &cobra.Command{
    20  		Use:   "validate-genesis [file]",
    21  		Args:  cobra.RangeArgs(0, 1),
    22  		Short: "validates the genesis file at the default location or at the location passed as an arg",
    23  		RunE: func(cmd *cobra.Command, args []string) (err error) {
    24  			serverCtx := server.GetServerContextFromCmd(cmd)
    25  			clientCtx := client.GetClientContextFromCmd(cmd)
    26  
    27  			cdc := clientCtx.Codec
    28  
    29  			// Load default if passed no args, otherwise load passed file
    30  			var genesis string
    31  			if len(args) == 0 {
    32  				genesis = serverCtx.Config.GenesisFile()
    33  			} else {
    34  				genesis = args[0]
    35  			}
    36  
    37  			genDoc, err := validateGenDoc(genesis)
    38  			if err != nil {
    39  				return err
    40  			}
    41  
    42  			var genState map[string]json.RawMessage
    43  			if err = json.Unmarshal(genDoc.AppState, &genState); err != nil {
    44  				return fmt.Errorf("error unmarshalling genesis doc %s: %s", genesis, err.Error())
    45  			}
    46  
    47  			if err = mbm.ValidateGenesis(cdc, clientCtx.TxConfig, genState); err != nil {
    48  				return fmt.Errorf("error validating genesis file %s: %s", genesis, err.Error())
    49  			}
    50  
    51  			fmt.Printf("File at %s is a valid genesis file\n", genesis)
    52  			return nil
    53  		},
    54  	}
    55  }
    56  
    57  // validateGenDoc reads a genesis file and validates that it is a correct
    58  // Tendermint GenesisDoc. This function does not do any cosmos-related
    59  // validation.
    60  func validateGenDoc(importGenesisFile string) (*octypes.GenesisDoc, error) {
    61  	genDoc, err := octypes.GenesisDocFromFile(importGenesisFile)
    62  	if err != nil {
    63  		return nil, fmt.Errorf("%s. Make sure that"+
    64  			" you have correctly migrated all Tendermint consensus params, please see the"+
    65  			" chain migration guide at %s for more info",
    66  			err.Error(), chainUpgradeGuide,
    67  		)
    68  	}
    69  
    70  	return genDoc, nil
    71  }