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  }