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 }