github.com/Finschia/finschia-sdk@v0.48.1/x/bank/types/genesis.go (about) 1 package types 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 "github.com/Finschia/finschia-sdk/codec" 8 sdk "github.com/Finschia/finschia-sdk/types" 9 ) 10 11 // Validate performs basic validation of supply genesis data returning an 12 // error for any failed validation criteria. 13 func (gs GenesisState) Validate() error { 14 if err := gs.Params.Validate(); err != nil { 15 return err 16 } 17 18 seenBalances := make(map[string]bool) 19 seenMetadatas := make(map[string]bool) 20 21 totalSupply := sdk.Coins{} 22 23 for _, balance := range gs.Balances { 24 if seenBalances[balance.Address] { 25 return fmt.Errorf("duplicate balance for address %s", balance.Address) 26 } 27 28 if err := balance.Validate(); err != nil { 29 return err 30 } 31 32 seenBalances[balance.Address] = true 33 34 totalSupply = totalSupply.Add(balance.Coins...) 35 } 36 37 for _, metadata := range gs.DenomMetadata { 38 if seenMetadatas[metadata.Base] { 39 return fmt.Errorf("duplicate client metadata for denom %s", metadata.Base) 40 } 41 42 if err := metadata.Validate(); err != nil { 43 return err 44 } 45 46 seenMetadatas[metadata.Base] = true 47 } 48 49 if !gs.Supply.Empty() { 50 // NOTE: this errors if supply for any given coin is zero 51 err := gs.Supply.Validate() 52 if err != nil { 53 return err 54 } 55 56 if !gs.Supply.IsEqual(totalSupply) { 57 return fmt.Errorf("genesis supply is incorrect, expected %v, got %v", gs.Supply, totalSupply) 58 } 59 } 60 61 return nil 62 } 63 64 // NewGenesisState creates a new genesis state. 65 func NewGenesisState(params Params, balances []Balance, supply sdk.Coins, denomMetaData []Metadata) *GenesisState { 66 return &GenesisState{ 67 Params: params, 68 Balances: balances, 69 Supply: supply, 70 DenomMetadata: denomMetaData, 71 } 72 } 73 74 // DefaultGenesisState returns a default bank module genesis state. 75 func DefaultGenesisState() *GenesisState { 76 return NewGenesisState(DefaultParams(), []Balance{}, sdk.Coins{}, []Metadata{}) 77 } 78 79 // GetGenesisStateFromAppState returns x/bank GenesisState given raw application 80 // genesis state. 81 func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *GenesisState { 82 var genesisState GenesisState 83 84 if appState[ModuleName] != nil { 85 cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) 86 } 87 88 return &genesisState 89 }