diff --git a/types/context.go b/types/context.go index 94f6be6ef8..72a9448474 100644 --- a/types/context.go +++ b/types/context.go @@ -393,6 +393,19 @@ func UnwrapSDKContext(ctx context.Context) Context { return ctx.Value(SdkContextKey).(Context) } +// TryUnwrapSDKContext attempts to retrieve a Context from a context.Context +func TryUnwrapSDKContext(ctx context.Context) (Context, bool) { + if sdkCtx, ok := ctx.(Context); ok { + return sdkCtx, true + } + v := ctx.Value(SdkContextKey) + if v == nil { + return Context{}, false + } + c, ok := v.(Context) + return c, ok +} + // ToSDKEvidence takes comet evidence and returns sdk evidence func ToSDKEvidence(ev []abci.Misbehavior) []comet.Evidence { evidence := make([]comet.Evidence, len(ev)) diff --git a/x/staking/keeper/genesis.go b/x/staking/keeper/genesis.go index 0bb7e7eabd..a082b3207a 100644 --- a/x/staking/keeper/genesis.go +++ b/x/staking/keeper/genesis.go @@ -26,9 +26,11 @@ func (k Keeper) InitGenesis(ctx context.Context, data *types.GenesisState) ([]ap // initialized for the validator set e.g. with a one-block offset - the // first TM block is at height 1, so state updates applied from // genesis.json are in block 0. - sdkCtx := sdk.UnwrapSDKContext(ctx) - sdkCtx = sdkCtx.WithBlockHeight(1 - sdk.ValidatorUpdateDelay) // TODO: remove this need for WithBlockHeight - ctx = sdkCtx + if sdkCtx, ok := sdk.TryUnwrapSDKContext(ctx); ok { + // this munging of the context is not necessary for server/v2 code paths, `ok` will be false + sdkCtx = sdkCtx.WithBlockHeight(1 - sdk.ValidatorUpdateDelay) // TODO: remove this need for WithBlockHeight + ctx = sdkCtx + } if err := k.Params.Set(ctx, data.Params); err != nil { return nil, err