github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/params/keeper_upgrade.go (about) 1 package params 2 3 import ( 4 "fmt" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/x/params/types" 8 ) 9 10 // ClaimReadyForUpgrade tells Keeper that someone has get ready for the upgrade. 11 // cb could be nil if there's no code to be execute when the upgrade is take effective. 12 // NOTE: This method could only be called at initialize phase, and 13 // CAN NOT be called when hanlding a tx. 14 func (keeper *Keeper) ClaimReadyForUpgrade(name string, cb func(types.UpgradeInfo)) { 15 keeper.upgradeCache.ClaimReadyForUpgrade(name, cb) 16 } 17 18 func (keeper *Keeper) IsUpgradeEffective(ctx sdk.Context, name string) bool { 19 _, err := keeper.GetEffectiveUpgradeInfo(ctx, name) 20 return err == nil 21 } 22 23 func (keeper *Keeper) GetEffectiveUpgradeInfo(ctx sdk.Context, name string) (types.UpgradeInfo, error) { 24 info, err := keeper.readUpgradeInfo(ctx, name) 25 if err != nil { 26 return types.UpgradeInfo{}, err 27 } 28 29 if !isUpgradeEffective(ctx, info) { 30 keeper.Logger(ctx).Debug("upgrade is not effective", "name", name) 31 return types.UpgradeInfo{}, fmt.Errorf("upgrade '%s' is not effective", name) 32 } 33 34 keeper.Logger(ctx).Debug("upgrade is effective", "name", name) 35 return info, nil 36 } 37 38 func (keeper *Keeper) queryReadyForUpgrade(name string) ([]func(types.UpgradeInfo), bool) { 39 return keeper.upgradeCache.QueryReadyForUpgrade(name) 40 } 41 42 func (keeper *Keeper) readUpgradeInfo(ctx sdk.Context, name string) (types.UpgradeInfo, error) { 43 return keeper.upgradeCache.ReadUpgradeInfo(ctx, name) 44 } 45 46 func (keeper Keeper) iterateAllUpgradeInfo(ctx sdk.Context, cb func(info types.UpgradeInfo) (stop bool)) sdk.Error { 47 return keeper.upgradeCache.IterateAllUpgradeInfo(ctx, cb) 48 } 49 50 func (keeper *Keeper) writeUpgradeInfo(ctx sdk.Context, info types.UpgradeInfo, forceCover bool) sdk.Error { 51 return keeper.upgradeCache.WriteUpgradeInfo(ctx, info, forceCover) 52 } 53 54 func (keeper *Keeper) isUpgradeExist(ctx sdk.Context, name string) bool { 55 return keeper.upgradeCache.IsUpgradeExist(ctx, name) 56 } 57 58 func isUpgradeEffective(ctx sdk.Context, info types.UpgradeInfo) bool { 59 return info.Status == types.UpgradeStatusEffective && uint64(ctx.BlockHeight()) >= info.EffectiveHeight 60 } 61 62 func (keeper *Keeper) ApplyEffectiveUpgrade(ctx sdk.Context) error { 63 return keeper.iterateAllUpgradeInfo(ctx, func(info types.UpgradeInfo) (stop bool) { 64 if info.Status == types.UpgradeStatusEffective { 65 if cbs, ready := keeper.queryReadyForUpgrade(info.Name); ready { 66 for _, cb := range cbs { 67 if cb != nil { 68 cb(info) 69 } 70 } 71 } 72 } 73 return false 74 }) 75 }