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 }