github.com/Finschia/finschia-sdk@v0.49.1/x/fbridge/keeper/genesis.go (about) 1 package keeper 2 3 import ( 4 "encoding/binary" 5 6 sdk "github.com/Finschia/finschia-sdk/types" 7 "github.com/Finschia/finschia-sdk/x/fbridge/types" 8 ) 9 10 func (k Keeper) InitGenesis(ctx sdk.Context, gs *types.GenesisState) error { 11 if err := k.SetParams(ctx, gs.Params); err != nil { 12 return err 13 } 14 15 k.setNextSequence(ctx, gs.SendingState.NextSeq) 16 for _, info := range gs.SendingState.SeqToBlocknum { 17 k.setSeqToBlocknum(ctx, info.Seq, info.Blocknum) 18 } 19 20 for _, pair := range gs.Roles { 21 if err := k.setRole(ctx, pair.Role, sdk.MustAccAddressFromBech32(pair.Address)); err != nil { 22 return err 23 } 24 } 25 26 for _, sw := range gs.BridgeSwitches { 27 if err := k.setBridgeSwitch(ctx, sdk.MustAccAddressFromBech32(sw.Guardian), sw.Status); err != nil { 28 return err 29 } 30 } 31 32 k.setNextProposalID(ctx, gs.NextRoleProposalId) 33 for _, proposal := range gs.RoleProposals { 34 k.setRoleProposal(ctx, proposal) 35 } 36 37 for _, vote := range gs.Votes { 38 k.setVote(ctx, vote.ProposalId, sdk.MustAccAddressFromBech32(vote.Voter), vote.Option) 39 } 40 41 // TODO: we initialize the appropriate genesis parameters whenever the feature is added 42 43 k.InitMemStore(ctx) 44 45 return nil 46 } 47 48 func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { 49 return &types.GenesisState{ 50 Params: k.GetParams(ctx), 51 SendingState: types.SendingState{ 52 NextSeq: k.GetNextSequence(ctx), 53 SeqToBlocknum: k.getAllSeqToBlocknums(ctx), 54 }, 55 ReceivingState: types.ReceivingState{}, 56 NextRoleProposalId: k.GetNextProposalID(ctx), 57 RoleProposals: k.GetRoleProposals(ctx), 58 Votes: k.GetAllVotes(ctx), 59 Roles: k.GetRolePairs(ctx), 60 BridgeSwitches: k.GetBridgeSwitches(ctx), 61 } 62 } 63 64 func (k Keeper) getAllSeqToBlocknums(ctx sdk.Context) []types.BlockSeqInfo { 65 infos := make([]types.BlockSeqInfo, 0) 66 store := ctx.KVStore(k.storeKey) 67 iterator := sdk.KVStorePrefixIterator(store, types.KeySeqToBlocknumPrefix) 68 defer iterator.Close() 69 70 for ; iterator.Valid(); iterator.Next() { 71 seq := binary.BigEndian.Uint64(iterator.Key()[1:]) 72 v := binary.BigEndian.Uint64(iterator.Value()) 73 info := types.BlockSeqInfo{Seq: seq, Blocknum: v} 74 infos = append(infos, info) 75 } 76 77 return infos 78 } 79 80 // IterateVotes iterates over the all the votes for role proposals and performs a callback function 81 func (k Keeper) IterateVotes(ctx sdk.Context, cb func(proposal types.Vote) (stop bool)) { 82 store := ctx.KVStore(k.storeKey) 83 84 iterator := sdk.KVStorePrefixIterator(store, types.KeyProposalVotePrefix) 85 defer iterator.Close() 86 for ; iterator.Valid(); iterator.Next() { 87 id, voter := types.SplitVoterVoteKey(iterator.Key()) 88 opt := types.VoteOption(binary.BigEndian.Uint32(iterator.Value())) 89 v := types.Vote{ProposalId: id, Voter: voter.String(), Option: opt} 90 if cb(v) { 91 break 92 } 93 } 94 } 95 96 // GetAllVotes returns all the votes from the store 97 func (k Keeper) GetAllVotes(ctx sdk.Context) (votes []types.Vote) { 98 k.IterateVotes(ctx, func(vote types.Vote) bool { 99 votes = append(votes, vote) 100 return false 101 }) 102 return 103 }