github.com/Finschia/finschia-sdk@v0.48.1/x/token/keeper/genesis.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/Finschia/finschia-sdk/types"
     5  	"github.com/Finschia/finschia-sdk/x/token"
     6  )
     7  
     8  // InitGenesis new token genesis
     9  func (k Keeper) InitGenesis(ctx sdk.Context, data *token.GenesisState) {
    10  	if data.ClassState == nil {
    11  		data.ClassState = token.DefaultClassGenesisState()
    12  	}
    13  	k.classKeeper.InitGenesis(ctx, data.ClassState)
    14  
    15  	for _, contractBalances := range data.Balances {
    16  		for _, balance := range contractBalances.Balances {
    17  			addr, err := sdk.AccAddressFromBech32(balance.Address)
    18  			if err != nil {
    19  				panic(err)
    20  			}
    21  			k.setBalance(ctx, contractBalances.ContractId, addr, balance.Amount)
    22  		}
    23  	}
    24  
    25  	for _, class := range data.Classes {
    26  		k.setClass(ctx, class)
    27  	}
    28  
    29  	for _, contractGrants := range data.Grants {
    30  		for _, grant := range contractGrants.Grants {
    31  			grantee, err := sdk.AccAddressFromBech32(grant.Grantee)
    32  			if err != nil {
    33  				panic(err)
    34  			}
    35  			k.setGrant(ctx, contractGrants.ContractId, grantee, grant.Permission)
    36  		}
    37  	}
    38  
    39  	for _, contractAuthorizations := range data.Authorizations {
    40  		for _, authorization := range contractAuthorizations.Authorizations {
    41  			holder, err := sdk.AccAddressFromBech32(authorization.Holder)
    42  			if err != nil {
    43  				panic(err)
    44  			}
    45  			operator, err := sdk.AccAddressFromBech32(authorization.Operator)
    46  			if err != nil {
    47  				panic(err)
    48  			}
    49  			k.setAuthorization(ctx, contractAuthorizations.ContractId, holder, operator)
    50  		}
    51  	}
    52  
    53  	// TODO: remove it (derive it using mints and burns)
    54  	for _, amount := range data.Supplies {
    55  		k.setSupply(ctx, amount.ContractId, amount.Amount)
    56  	}
    57  
    58  	for _, amount := range data.Mints {
    59  		k.setMinted(ctx, amount.ContractId, amount.Amount)
    60  	}
    61  
    62  	for _, amount := range data.Burns {
    63  		k.setBurnt(ctx, amount.ContractId, amount.Amount)
    64  	}
    65  }
    66  
    67  // ExportGenesis returns a GenesisState for a given context.
    68  func (k Keeper) ExportGenesis(ctx sdk.Context) *token.GenesisState {
    69  	var classes []token.Contract
    70  	k.iterateClasses(ctx, func(class token.Contract) (stop bool) {
    71  		classes = append(classes, class)
    72  		return false
    73  	})
    74  
    75  	var balances []token.ContractBalances
    76  	for _, class := range classes {
    77  		id := class.Id
    78  		contractBalances := token.ContractBalances{
    79  			ContractId: id,
    80  		}
    81  
    82  		k.iterateContractBalances(ctx, id, func(balance token.Balance) (stop bool) {
    83  			contractBalances.Balances = append(contractBalances.Balances, balance)
    84  			return false
    85  		})
    86  		if len(contractBalances.Balances) != 0 {
    87  			balances = append(balances, contractBalances)
    88  		}
    89  	}
    90  
    91  	var supplies []token.ContractCoin
    92  	k.iterateSupplies(ctx, func(contractID string, amount sdk.Int) (stop bool) {
    93  		supply := token.ContractCoin{
    94  			ContractId: contractID,
    95  			Amount:     amount,
    96  		}
    97  		supplies = append(supplies, supply)
    98  		return false
    99  	})
   100  
   101  	var mints []token.ContractCoin
   102  	k.iterateMinteds(ctx, func(contractID string, amount sdk.Int) (stop bool) {
   103  		minted := token.ContractCoin{
   104  			ContractId: contractID,
   105  			Amount:     amount,
   106  		}
   107  		mints = append(mints, minted)
   108  		return false
   109  	})
   110  
   111  	var burns []token.ContractCoin
   112  	k.iterateBurnts(ctx, func(contractID string, amount sdk.Int) (stop bool) {
   113  		burnt := token.ContractCoin{
   114  			ContractId: contractID,
   115  			Amount:     amount,
   116  		}
   117  		burns = append(burns, burnt)
   118  		return false
   119  	})
   120  
   121  	var grants []token.ContractGrants
   122  	for _, class := range classes {
   123  		id := class.Id
   124  		contractGrants := token.ContractGrants{
   125  			ContractId: id,
   126  		}
   127  
   128  		k.iterateContractGrants(ctx, id, func(grant token.Grant) (stop bool) {
   129  			contractGrants.Grants = append(contractGrants.Grants, grant)
   130  			return false
   131  		})
   132  		if len(contractGrants.Grants) != 0 {
   133  			grants = append(grants, contractGrants)
   134  		}
   135  	}
   136  
   137  	var authorizations []token.ContractAuthorizations
   138  	for _, class := range classes {
   139  		id := class.Id
   140  		contractAuthorizations := token.ContractAuthorizations{
   141  			ContractId: id,
   142  		}
   143  
   144  		k.iterateContractAuthorizations(ctx, id, func(authorization token.Authorization) (stop bool) {
   145  			contractAuthorizations.Authorizations = append(contractAuthorizations.Authorizations, authorization)
   146  			return false
   147  		})
   148  		if len(contractAuthorizations.Authorizations) != 0 {
   149  			authorizations = append(authorizations, contractAuthorizations)
   150  		}
   151  	}
   152  
   153  	return &token.GenesisState{
   154  		ClassState:     k.classKeeper.ExportGenesis(ctx),
   155  		Balances:       balances,
   156  		Classes:        classes,
   157  		Grants:         grants,
   158  		Authorizations: authorizations,
   159  		Supplies:       supplies,
   160  		Mints:          mints,
   161  		Burns:          burns,
   162  	}
   163  }