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 }