github.com/Finschia/finschia-sdk@v0.48.1/x/genutil/types/genesis_state.go (about)

     1  package types
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  
     8  	ostos "github.com/Finschia/ostracon/libs/os"
     9  	octypes "github.com/Finschia/ostracon/types"
    10  
    11  	"github.com/Finschia/finschia-sdk/codec"
    12  	sdk "github.com/Finschia/finschia-sdk/types"
    13  	stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types"
    14  )
    15  
    16  // NewGenesisState creates a new GenesisState object
    17  func NewGenesisState(genTxs []json.RawMessage) *GenesisState {
    18  	// Ensure genTxs is never nil, https://github.com/cosmos/cosmos-sdk/issues/5086
    19  	if len(genTxs) == 0 {
    20  		genTxs = make([]json.RawMessage, 0)
    21  	}
    22  	return &GenesisState{
    23  		GenTxs: genTxs,
    24  	}
    25  }
    26  
    27  // DefaultGenesisState returns the genutil module's default genesis state.
    28  func DefaultGenesisState() *GenesisState {
    29  	return &GenesisState{
    30  		GenTxs: []json.RawMessage{},
    31  	}
    32  }
    33  
    34  // NewGenesisStateFromTx creates a new GenesisState object
    35  // from auth transactions
    36  func NewGenesisStateFromTx(txJSONEncoder sdk.TxEncoder, genTxs []sdk.Tx) *GenesisState {
    37  	genTxsBz := make([]json.RawMessage, len(genTxs))
    38  	for i, genTx := range genTxs {
    39  		var err error
    40  		genTxsBz[i], err = txJSONEncoder(genTx)
    41  		if err != nil {
    42  			panic(err)
    43  		}
    44  	}
    45  	return NewGenesisState(genTxsBz)
    46  }
    47  
    48  // GetGenesisStateFromAppState gets the genutil genesis state from the expected app state
    49  func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *GenesisState {
    50  	var genesisState GenesisState
    51  	if appState[ModuleName] != nil {
    52  		cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState)
    53  	}
    54  	return &genesisState
    55  }
    56  
    57  // SetGenesisStateInAppState sets the genutil genesis state within the expected app state
    58  func SetGenesisStateInAppState(
    59  	cdc codec.JSONCodec, appState map[string]json.RawMessage, genesisState *GenesisState,
    60  ) map[string]json.RawMessage {
    61  	genesisStateBz := cdc.MustMarshalJSON(genesisState)
    62  	appState[ModuleName] = genesisStateBz
    63  	return appState
    64  }
    65  
    66  // GenesisStateFromGenDoc creates the core parameters for genesis initialization
    67  // for the application.
    68  //
    69  // NOTE: The pubkey input is this machines pubkey.
    70  func GenesisStateFromGenDoc(genDoc octypes.GenesisDoc) (genesisState map[string]json.RawMessage, err error) {
    71  	if err = json.Unmarshal(genDoc.AppState, &genesisState); err != nil {
    72  		return genesisState, err
    73  	}
    74  	return genesisState, nil
    75  }
    76  
    77  // GenesisStateFromGenFile creates the core parameters for genesis initialization
    78  // for the application.
    79  //
    80  // NOTE: The pubkey input is this machines pubkey.
    81  func GenesisStateFromGenFile(genFile string) (genesisState map[string]json.RawMessage, genDoc *octypes.GenesisDoc, err error) {
    82  	if !ostos.FileExists(genFile) {
    83  		return genesisState, genDoc,
    84  			fmt.Errorf("%s does not exist, run `init` first", genFile)
    85  	}
    86  
    87  	genDoc, err = octypes.GenesisDocFromFile(genFile)
    88  	if err != nil {
    89  		return genesisState, genDoc, err
    90  	}
    91  
    92  	genesisState, err = GenesisStateFromGenDoc(*genDoc)
    93  	return genesisState, genDoc, err
    94  }
    95  
    96  // ValidateGenesis validates GenTx transactions
    97  func ValidateGenesis(genesisState *GenesisState, txJSONDecoder sdk.TxDecoder) error {
    98  	for i, genTx := range genesisState.GenTxs {
    99  		var tx sdk.Tx
   100  		tx, err := txJSONDecoder(genTx)
   101  		if err != nil {
   102  			return err
   103  		}
   104  
   105  		msgs := tx.GetMsgs()
   106  		if len(msgs) != 1 {
   107  			return errors.New(
   108  				"must provide genesis Tx with exactly 1 CreateValidator message")
   109  		}
   110  
   111  		// TODO: abstract back to staking
   112  		if _, ok := msgs[0].(*stakingtypes.MsgCreateValidator); !ok {
   113  			return fmt.Errorf(
   114  				"genesis transaction %v does not contain a MsgCreateValidator", i)
   115  		}
   116  	}
   117  	return nil
   118  }