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  }