github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/genesis.go (about)

     1  package gov
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"cosmossdk.io/collections"
     7  
     8  	sdk "github.com/cosmos/cosmos-sdk/types"
     9  	"github.com/cosmos/cosmos-sdk/x/gov/keeper"
    10  	"github.com/cosmos/cosmos-sdk/x/gov/types"
    11  	v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
    12  )
    13  
    14  // InitGenesis - store genesis parameters
    15  func InitGenesis(ctx sdk.Context, ak types.AccountKeeper, bk types.BankKeeper, k *keeper.Keeper, data *v1.GenesisState) {
    16  	err := k.ProposalID.Set(ctx, data.StartingProposalId)
    17  	if err != nil {
    18  		panic(err)
    19  	}
    20  
    21  	err = k.Params.Set(ctx, *data.Params)
    22  	if err != nil {
    23  		panic(err)
    24  	}
    25  
    26  	err = k.Constitution.Set(ctx, data.Constitution)
    27  	if err != nil {
    28  		panic(err)
    29  	}
    30  
    31  	// check if the deposits pool account exists
    32  	moduleAcc := k.GetGovernanceAccount(ctx)
    33  	if moduleAcc == nil {
    34  		panic(fmt.Sprintf("%s module account has not been set", types.ModuleName))
    35  	}
    36  
    37  	var totalDeposits sdk.Coins
    38  	for _, deposit := range data.Deposits {
    39  		err := k.SetDeposit(ctx, *deposit)
    40  		if err != nil {
    41  			panic(err)
    42  		}
    43  		totalDeposits = totalDeposits.Add(deposit.Amount...)
    44  	}
    45  
    46  	for _, vote := range data.Votes {
    47  		addr, err := ak.AddressCodec().StringToBytes(vote.Voter)
    48  		if err != nil {
    49  			panic(err)
    50  		}
    51  		err = k.Votes.Set(ctx, collections.Join(vote.ProposalId, sdk.AccAddress(addr)), *vote)
    52  		if err != nil {
    53  			panic(err)
    54  		}
    55  	}
    56  
    57  	for _, proposal := range data.Proposals {
    58  		switch proposal.Status {
    59  		case v1.StatusDepositPeriod:
    60  			err := k.InactiveProposalsQueue.Set(ctx, collections.Join(*proposal.DepositEndTime, proposal.Id), proposal.Id)
    61  			if err != nil {
    62  				panic(err)
    63  			}
    64  		case v1.StatusVotingPeriod:
    65  			err := k.ActiveProposalsQueue.Set(ctx, collections.Join(*proposal.VotingEndTime, proposal.Id), proposal.Id)
    66  			if err != nil {
    67  				panic(err)
    68  			}
    69  		}
    70  		err := k.SetProposal(ctx, *proposal)
    71  		if err != nil {
    72  			panic(err)
    73  		}
    74  	}
    75  
    76  	// if account has zero balance it probably means it's not set, so we set it
    77  	balance := bk.GetAllBalances(ctx, moduleAcc.GetAddress())
    78  	if balance.IsZero() {
    79  		ak.SetModuleAccount(ctx, moduleAcc)
    80  	}
    81  
    82  	// check if total deposits equals balance, if it doesn't panic because there were export/import errors
    83  	if !balance.Equal(totalDeposits) {
    84  		panic(fmt.Sprintf("expected module account was %s but we got %s", balance.String(), totalDeposits.String()))
    85  	}
    86  }
    87  
    88  // ExportGenesis - output genesis parameters
    89  func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) (*v1.GenesisState, error) {
    90  	startingProposalID, err := k.ProposalID.Peek(ctx)
    91  	if err != nil {
    92  		return nil, err
    93  	}
    94  
    95  	var proposals v1.Proposals
    96  	err = k.Proposals.Walk(ctx, nil, func(_ uint64, value v1.Proposal) (stop bool, err error) {
    97  		proposals = append(proposals, &value)
    98  		return false, nil
    99  	})
   100  	if err != nil {
   101  		return nil, err
   102  	}
   103  
   104  	constitution, err := k.Constitution.Get(ctx)
   105  	if err != nil {
   106  		return nil, err
   107  	}
   108  
   109  	params, err := k.Params.Get(ctx)
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  
   114  	var proposalsDeposits v1.Deposits
   115  	err = k.Deposits.Walk(ctx, nil, func(_ collections.Pair[uint64, sdk.AccAddress], value v1.Deposit) (stop bool, err error) {
   116  		proposalsDeposits = append(proposalsDeposits, &value)
   117  		return false, nil
   118  	})
   119  	if err != nil {
   120  		panic(err)
   121  	}
   122  
   123  	// export proposals votes
   124  	var proposalsVotes v1.Votes
   125  	err = k.Votes.Walk(ctx, nil, func(_ collections.Pair[uint64, sdk.AccAddress], value v1.Vote) (stop bool, err error) {
   126  		proposalsVotes = append(proposalsVotes, &value)
   127  		return false, nil
   128  	})
   129  	if err != nil {
   130  		panic(err)
   131  	}
   132  
   133  	return &v1.GenesisState{
   134  		StartingProposalId: startingProposalID,
   135  		Deposits:           proposalsDeposits,
   136  		Votes:              proposalsVotes,
   137  		Proposals:          proposals,
   138  		Params:             &params,
   139  		Constitution:       constitution,
   140  	}, nil
   141  }