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  }