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

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sdk "github.com/cosmos/cosmos-sdk/types"
     7  	"github.com/cosmos/cosmos-sdk/x/distribution/types"
     8  )
     9  
    10  // InitGenesis sets distribution information for genesis
    11  func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) {
    12  	var moduleHoldings sdk.DecCoins
    13  
    14  	err := k.FeePool.Set(ctx, data.FeePool)
    15  	if err != nil {
    16  		panic(err)
    17  	}
    18  
    19  	if err := k.Params.Set(ctx, data.Params); err != nil {
    20  		panic(err)
    21  	}
    22  
    23  	for _, dwi := range data.DelegatorWithdrawInfos {
    24  		delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(dwi.DelegatorAddress)
    25  		if err != nil {
    26  			panic(err)
    27  		}
    28  		withdrawAddress, err := k.authKeeper.AddressCodec().StringToBytes(dwi.WithdrawAddress)
    29  		if err != nil {
    30  			panic(err)
    31  		}
    32  		err = k.SetDelegatorWithdrawAddr(ctx, delegatorAddress, withdrawAddress)
    33  		if err != nil {
    34  			panic(err)
    35  		}
    36  	}
    37  
    38  	var previousProposer sdk.ConsAddress
    39  	if data.PreviousProposer != "" {
    40  		var err error
    41  		previousProposer, err = k.stakingKeeper.ConsensusAddressCodec().StringToBytes(data.PreviousProposer)
    42  		if err != nil {
    43  			panic(err)
    44  		}
    45  	}
    46  
    47  	if err = k.SetPreviousProposerConsAddr(ctx, previousProposer); err != nil {
    48  		panic(err)
    49  	}
    50  
    51  	for _, rew := range data.OutstandingRewards {
    52  		valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(rew.ValidatorAddress)
    53  		if err != nil {
    54  			panic(err)
    55  		}
    56  		err = k.SetValidatorOutstandingRewards(ctx, valAddr, types.ValidatorOutstandingRewards{Rewards: rew.OutstandingRewards})
    57  		if err != nil {
    58  			panic(err)
    59  		}
    60  		moduleHoldings = moduleHoldings.Add(rew.OutstandingRewards...)
    61  	}
    62  	for _, acc := range data.ValidatorAccumulatedCommissions {
    63  		valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(acc.ValidatorAddress)
    64  		if err != nil {
    65  			panic(err)
    66  		}
    67  		err = k.SetValidatorAccumulatedCommission(ctx, valAddr, acc.Accumulated)
    68  		if err != nil {
    69  			panic(err)
    70  		}
    71  	}
    72  	for _, his := range data.ValidatorHistoricalRewards {
    73  		valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(his.ValidatorAddress)
    74  		if err != nil {
    75  			panic(err)
    76  		}
    77  		err = k.SetValidatorHistoricalRewards(ctx, valAddr, his.Period, his.Rewards)
    78  		if err != nil {
    79  			panic(err)
    80  		}
    81  	}
    82  	for _, cur := range data.ValidatorCurrentRewards {
    83  		valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(cur.ValidatorAddress)
    84  		if err != nil {
    85  			panic(err)
    86  		}
    87  		err = k.SetValidatorCurrentRewards(ctx, valAddr, cur.Rewards)
    88  		if err != nil {
    89  			panic(err)
    90  		}
    91  	}
    92  	for _, del := range data.DelegatorStartingInfos {
    93  		valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(del.ValidatorAddress)
    94  		if err != nil {
    95  			panic(err)
    96  		}
    97  		delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(del.DelegatorAddress)
    98  		if err != nil {
    99  			panic(err)
   100  		}
   101  
   102  		err = k.SetDelegatorStartingInfo(ctx, valAddr, delegatorAddress, del.StartingInfo)
   103  		if err != nil {
   104  			panic(err)
   105  		}
   106  	}
   107  	for _, evt := range data.ValidatorSlashEvents {
   108  		valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(evt.ValidatorAddress)
   109  		if err != nil {
   110  			panic(err)
   111  		}
   112  		err = k.SetValidatorSlashEvent(ctx, valAddr, evt.Height, evt.Period, evt.ValidatorSlashEvent)
   113  		if err != nil {
   114  			panic(err)
   115  		}
   116  	}
   117  
   118  	moduleHoldings = moduleHoldings.Add(data.FeePool.CommunityPool...)
   119  	moduleHoldingsInt, _ := moduleHoldings.TruncateDecimal()
   120  
   121  	// check if the module account exists
   122  	moduleAcc := k.GetDistributionAccount(ctx)
   123  	if moduleAcc == nil {
   124  		panic(fmt.Sprintf("%s module account has not been set", types.ModuleName))
   125  	}
   126  
   127  	balances := k.bankKeeper.GetAllBalances(ctx, moduleAcc.GetAddress())
   128  	if balances.IsZero() {
   129  		k.authKeeper.SetModuleAccount(ctx, moduleAcc)
   130  	}
   131  	if !balances.Equal(moduleHoldingsInt) {
   132  		panic(fmt.Sprintf("distribution module balance does not match the module holdings: %s <-> %s", balances, moduleHoldingsInt))
   133  	}
   134  }
   135  
   136  // ExportGenesis returns a GenesisState for a given context and keeper.
   137  func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
   138  	feePool, err := k.FeePool.Get(ctx)
   139  	if err != nil {
   140  		panic(err)
   141  	}
   142  
   143  	params, err := k.Params.Get(ctx)
   144  	if err != nil {
   145  		panic(err)
   146  	}
   147  
   148  	dwi := make([]types.DelegatorWithdrawInfo, 0)
   149  	k.IterateDelegatorWithdrawAddrs(ctx, func(del, addr sdk.AccAddress) (stop bool) {
   150  		dwi = append(dwi, types.DelegatorWithdrawInfo{
   151  			DelegatorAddress: del.String(),
   152  			WithdrawAddress:  addr.String(),
   153  		})
   154  		return false
   155  	})
   156  
   157  	pp, err := k.GetPreviousProposerConsAddr(ctx)
   158  	if err != nil {
   159  		panic(err)
   160  	}
   161  
   162  	outstanding := make([]types.ValidatorOutstandingRewardsRecord, 0)
   163  
   164  	k.IterateValidatorOutstandingRewards(ctx,
   165  		func(addr sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
   166  			outstanding = append(outstanding, types.ValidatorOutstandingRewardsRecord{
   167  				ValidatorAddress:   addr.String(),
   168  				OutstandingRewards: rewards.Rewards,
   169  			})
   170  			return false
   171  		},
   172  	)
   173  
   174  	acc := make([]types.ValidatorAccumulatedCommissionRecord, 0)
   175  	k.IterateValidatorAccumulatedCommissions(ctx,
   176  		func(addr sdk.ValAddress, commission types.ValidatorAccumulatedCommission) (stop bool) {
   177  			acc = append(acc, types.ValidatorAccumulatedCommissionRecord{
   178  				ValidatorAddress: addr.String(),
   179  				Accumulated:      commission,
   180  			})
   181  			return false
   182  		},
   183  	)
   184  
   185  	his := make([]types.ValidatorHistoricalRewardsRecord, 0)
   186  	k.IterateValidatorHistoricalRewards(ctx,
   187  		func(val sdk.ValAddress, period uint64, rewards types.ValidatorHistoricalRewards) (stop bool) {
   188  			his = append(his, types.ValidatorHistoricalRewardsRecord{
   189  				ValidatorAddress: val.String(),
   190  				Period:           period,
   191  				Rewards:          rewards,
   192  			})
   193  			return false
   194  		},
   195  	)
   196  
   197  	cur := make([]types.ValidatorCurrentRewardsRecord, 0)
   198  	k.IterateValidatorCurrentRewards(ctx,
   199  		func(val sdk.ValAddress, rewards types.ValidatorCurrentRewards) (stop bool) {
   200  			cur = append(cur, types.ValidatorCurrentRewardsRecord{
   201  				ValidatorAddress: val.String(),
   202  				Rewards:          rewards,
   203  			})
   204  			return false
   205  		},
   206  	)
   207  
   208  	dels := make([]types.DelegatorStartingInfoRecord, 0)
   209  	k.IterateDelegatorStartingInfos(ctx,
   210  		func(val sdk.ValAddress, del sdk.AccAddress, info types.DelegatorStartingInfo) (stop bool) {
   211  			dels = append(dels, types.DelegatorStartingInfoRecord{
   212  				ValidatorAddress: val.String(),
   213  				DelegatorAddress: del.String(),
   214  				StartingInfo:     info,
   215  			})
   216  			return false
   217  		},
   218  	)
   219  
   220  	slashes := make([]types.ValidatorSlashEventRecord, 0)
   221  	k.IterateValidatorSlashEvents(ctx,
   222  		func(val sdk.ValAddress, height uint64, event types.ValidatorSlashEvent) (stop bool) {
   223  			slashes = append(slashes, types.ValidatorSlashEventRecord{
   224  				ValidatorAddress:    val.String(),
   225  				Height:              height,
   226  				Period:              event.ValidatorPeriod,
   227  				ValidatorSlashEvent: event,
   228  			})
   229  			return false
   230  		},
   231  	)
   232  
   233  	return types.NewGenesisState(params, feePool, dwi, pp, outstanding, acc, his, cur, dels, slashes)
   234  }