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

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  
     6  	"cosmossdk.io/math"
     7  
     8  	sdk "github.com/cosmos/cosmos-sdk/types"
     9  	"github.com/cosmos/cosmos-sdk/x/staking/types"
    10  )
    11  
    12  // GetBondedPool returns the bonded tokens pool's module account
    13  func (k Keeper) GetBondedPool(ctx context.Context) (bondedPool sdk.ModuleAccountI) {
    14  	return k.authKeeper.GetModuleAccount(ctx, types.BondedPoolName)
    15  }
    16  
    17  // GetNotBondedPool returns the not bonded tokens pool's module account
    18  func (k Keeper) GetNotBondedPool(ctx context.Context) (notBondedPool sdk.ModuleAccountI) {
    19  	return k.authKeeper.GetModuleAccount(ctx, types.NotBondedPoolName)
    20  }
    21  
    22  // bondedTokensToNotBonded transfers coins from the bonded to the not bonded pool within staking
    23  func (k Keeper) bondedTokensToNotBonded(ctx context.Context, tokens math.Int) error {
    24  	bondDenom, err := k.BondDenom(ctx)
    25  	if err != nil {
    26  		return err
    27  	}
    28  
    29  	coins := sdk.NewCoins(sdk.NewCoin(bondDenom, tokens))
    30  	return k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.BondedPoolName, types.NotBondedPoolName, coins)
    31  }
    32  
    33  // notBondedTokensToBonded transfers coins from the not bonded to the bonded pool within staking
    34  func (k Keeper) notBondedTokensToBonded(ctx context.Context, tokens math.Int) error {
    35  	bondDenom, err := k.BondDenom(ctx)
    36  	if err != nil {
    37  		return err
    38  	}
    39  
    40  	coins := sdk.NewCoins(sdk.NewCoin(bondDenom, tokens))
    41  	return k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.NotBondedPoolName, types.BondedPoolName, coins)
    42  }
    43  
    44  // burnBondedTokens burns coins from the bonded pool module account
    45  func (k Keeper) burnBondedTokens(ctx context.Context, amt math.Int) error {
    46  	if !amt.IsPositive() {
    47  		// skip as no coins need to be burned
    48  		return nil
    49  	}
    50  
    51  	bondDenom, err := k.BondDenom(ctx)
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	coins := sdk.NewCoins(sdk.NewCoin(bondDenom, amt))
    57  
    58  	return k.bankKeeper.BurnCoins(ctx, types.BondedPoolName, coins)
    59  }
    60  
    61  // burnNotBondedTokens burns coins from the not bonded pool module account
    62  func (k Keeper) burnNotBondedTokens(ctx context.Context, amt math.Int) error {
    63  	if !amt.IsPositive() {
    64  		// skip as no coins need to be burned
    65  		return nil
    66  	}
    67  
    68  	bondDenom, err := k.BondDenom(ctx)
    69  	if err != nil {
    70  		return err
    71  	}
    72  
    73  	coins := sdk.NewCoins(sdk.NewCoin(bondDenom, amt))
    74  
    75  	return k.bankKeeper.BurnCoins(ctx, types.NotBondedPoolName, coins)
    76  }
    77  
    78  // TotalBondedTokens total staking tokens supply which is bonded
    79  func (k Keeper) TotalBondedTokens(ctx context.Context) (math.Int, error) {
    80  	bondedPool := k.GetBondedPool(ctx)
    81  	bondDenom, err := k.BondDenom(ctx)
    82  	if err != nil {
    83  		return math.ZeroInt(), err
    84  	}
    85  	return k.bankKeeper.GetBalance(ctx, bondedPool.GetAddress(), bondDenom).Amount, nil
    86  }
    87  
    88  // StakingTokenSupply staking tokens from the total supply
    89  func (k Keeper) StakingTokenSupply(ctx context.Context) (math.Int, error) {
    90  	bondDenom, err := k.BondDenom(ctx)
    91  	if err != nil {
    92  		return math.ZeroInt(), err
    93  	}
    94  	return k.bankKeeper.GetSupply(ctx, bondDenom).Amount, nil
    95  }
    96  
    97  // BondedRatio the fraction of the staking tokens which are currently bonded
    98  func (k Keeper) BondedRatio(ctx context.Context) (math.LegacyDec, error) {
    99  	stakeSupply, err := k.StakingTokenSupply(ctx)
   100  	if err != nil {
   101  		return math.LegacyZeroDec(), err
   102  	}
   103  
   104  	if stakeSupply.IsPositive() {
   105  		totalBonded, err := k.TotalBondedTokens(ctx)
   106  		if err != nil {
   107  			return math.LegacyZeroDec(), err
   108  		}
   109  		return math.LegacyNewDecFromInt(totalBonded).QuoInt(stakeSupply), nil
   110  	}
   111  
   112  	return math.LegacyZeroDec(), nil
   113  }