package gov import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/keeper" "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) // InitGenesis - store genesis parameters func InitGenesis(ctx sdk.Context, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, data *v1beta1.GenesisState) { k.SetProposalID(ctx, data.StartingProposalId) k.SetDepositParams(ctx, data.DepositParams) k.SetVotingParams(ctx, data.VotingParams) k.SetTallyParams(ctx, data.TallyParams) // check if the deposits pool account exists moduleAcc := k.GetGovernanceAccount(ctx) if moduleAcc == nil { panic(fmt.Sprintf("%s module account has not been set", types.ModuleName)) } var totalDeposits sdk.Coins for _, deposit := range data.Deposits { k.SetDeposit(ctx, deposit) totalDeposits = totalDeposits.Add(deposit.Amount...) } for _, vote := range data.Votes { k.SetVote(ctx, vote) } for _, proposal := range data.Proposals { switch proposal.Status { case v1beta1.StatusDepositPeriod: k.InsertInactiveProposalQueue(ctx, proposal.ProposalId, proposal.DepositEndTime) case v1beta1.StatusVotingPeriod: k.InsertActiveProposalQueue(ctx, proposal.ProposalId, proposal.VotingEndTime) } k.SetProposal(ctx, proposal) } // if account has zero balance it probably means it's not set, so we set it balance := bk.GetAllBalances(ctx, moduleAcc.GetAddress()) if balance.IsZero() { ak.SetModuleAccount(ctx, moduleAcc) } // check if total deposits equals balance, if it doesn't panic because there were export/import errors if !balance.IsEqual(totalDeposits) { panic(fmt.Sprintf("expected module account was %s but we got %s", balance.String(), totalDeposits.String())) } } // ExportGenesis - output genesis parameters func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *v1beta1.GenesisState { startingProposalID, _ := k.GetProposalID(ctx) depositParams := k.GetDepositParams(ctx) votingParams := k.GetVotingParams(ctx) tallyParams := k.GetTallyParams(ctx) proposals := k.GetProposals(ctx) var proposalsDeposits v1beta1.Deposits var proposalsVotes v1beta1.Votes for _, proposal := range proposals { deposits := k.GetDeposits(ctx, proposal.ProposalId) proposalsDeposits = append(proposalsDeposits, deposits...) votes := k.GetVotes(ctx, proposal.ProposalId) proposalsVotes = append(proposalsVotes, votes...) } return &v1beta1.GenesisState{ StartingProposalId: startingProposalID, Deposits: proposalsDeposits, Votes: proposalsVotes, Proposals: proposals, DepositParams: depositParams, VotingParams: votingParams, TallyParams: tallyParams, } }