github.com/KiraCore/sekai@v0.3.43/x/basket/keeper/hooks.go (about)

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/KiraCore/sekai/x/basket/types"
     7  	multistakingtypes "github.com/KiraCore/sekai/x/multistaking/types"
     8  	sdk "github.com/cosmos/cosmos-sdk/types"
     9  )
    10  
    11  func (k Keeper) AfterUpsertStakingPool(ctx sdk.Context, valAddr sdk.ValAddress, pool multistakingtypes.StakingPool) {
    12  	rates := k.tk.GetAllTokenRates(ctx)
    13  	for _, rate := range rates {
    14  		if rate.StakeToken {
    15  			basket, err := k.GetBasketByDenom(ctx, fmt.Sprintf("sdb/%s", rate.Denom))
    16  			if err != nil {
    17  				basket = types.Basket{
    18  					Id:              1,
    19  					Suffix:          fmt.Sprintf("staking/%s", rate.Denom),
    20  					Description:     fmt.Sprintf("Basket of staking derivatives for %s token", rate.Denom),
    21  					Amount:          sdk.ZeroInt(),
    22  					SwapFee:         sdk.ZeroDec(),
    23  					SlipppageFeeMin: sdk.ZeroDec(),
    24  					TokensCap:       sdk.ZeroDec(),
    25  					LimitsPeriod:    86400,
    26  					MintsMin:        sdk.OneInt(),
    27  					MintsMax:        sdk.NewInt(1000_000_000_000), // 1M
    28  					MintsDisabled:   false,
    29  					BurnsMin:        sdk.OneInt(),
    30  					BurnsMax:        sdk.NewInt(1000_000_000_000), // 1M
    31  					BurnsDisabled:   false,
    32  					SwapsMin:        sdk.OneInt(),
    33  					SwapsMax:        sdk.NewInt(1000_000_000_000), // 1M
    34  					SwapsDisabled:   false,
    35  					Tokens:          []types.BasketToken{},
    36  					Surplus:         []sdk.Coin{},
    37  				}
    38  				k.SetBasket(ctx, basket)
    39  			}
    40  
    41  			shareDenom := multistakingtypes.GetShareDenom(pool.Id, rate.Denom)
    42  			tokenMap := make(map[string]bool)
    43  			for _, token := range basket.Tokens {
    44  				tokenMap[token.Denom] = true
    45  			}
    46  			if !tokenMap[shareDenom] {
    47  				basket.Tokens = append(basket.Tokens, types.BasketToken{
    48  					Denom:     shareDenom,
    49  					Weight:    sdk.OneDec(),
    50  					Amount:    sdk.ZeroInt(),
    51  					Deposits:  true,
    52  					Withdraws: true,
    53  					Swaps:     true,
    54  				})
    55  			}
    56  		}
    57  	}
    58  }
    59  
    60  func (k Keeper) AfterSlashStakingPool(ctx sdk.Context, valAddr sdk.ValAddress, pool multistakingtypes.StakingPool, slash sdk.Dec) {
    61  	rates := k.tk.GetAllTokenRates(ctx)
    62  	for _, rate := range rates {
    63  		if rate.StakeToken {
    64  			basket, err := k.GetBasketByDenom(ctx, fmt.Sprintf("sdb/%s", rate.Denom))
    65  			if err != nil {
    66  				continue
    67  			}
    68  
    69  			shareDenom := multistakingtypes.GetShareDenom(pool.Id, rate.Denom)
    70  			for i, token := range basket.Tokens {
    71  				if token.Denom == shareDenom {
    72  					basket.Tokens[i].Weight = token.Weight.Mul(sdk.OneDec().Sub(slash))
    73  					basket.Tokens[i].Deposits = true
    74  					basket.Tokens[i].Withdraws = true
    75  					basket.Tokens[i].Swaps = true
    76  				}
    77  			}
    78  			k.SetBasket(ctx, basket)
    79  		}
    80  	}
    81  }
    82  
    83  func (k Keeper) AfterSlashProposalRaise(ctx sdk.Context, valAddr sdk.ValAddress, pool multistakingtypes.StakingPool) {
    84  	rates := k.tk.GetAllTokenRates(ctx)
    85  	for _, rate := range rates {
    86  		if rate.StakeToken {
    87  			basket, err := k.GetBasketByDenom(ctx, fmt.Sprintf("sdb/%s", rate.Denom))
    88  			if err != nil {
    89  				continue
    90  			}
    91  
    92  			shareDenom := multistakingtypes.GetShareDenom(pool.Id, rate.Denom)
    93  			for i, token := range basket.Tokens {
    94  				if token.Denom == shareDenom {
    95  					basket.Tokens[i].Deposits = false
    96  					basket.Tokens[i].Withdraws = false
    97  					basket.Tokens[i].Swaps = false
    98  				}
    99  			}
   100  			k.SetBasket(ctx, basket)
   101  		}
   102  	}
   103  }
   104  
   105  //_________________________________________________________________________________________
   106  
   107  // Hooks wrapper struct for multistaking keeper
   108  type Hooks struct {
   109  	k Keeper
   110  }
   111  
   112  var _ types.MultistakingHooks = Hooks{}
   113  
   114  // Return the wrapper struct
   115  func (k Keeper) Hooks() Hooks {
   116  	return Hooks{k}
   117  }
   118  
   119  // Implements Multistaking hooks
   120  func (h Hooks) AfterUpsertStakingPool(ctx sdk.Context, valAddr sdk.ValAddress, pool multistakingtypes.StakingPool) {
   121  	h.k.AfterUpsertStakingPool(ctx, valAddr, pool)
   122  }
   123  
   124  // Implements Multistaking hooks
   125  func (h Hooks) AfterSlashStakingPool(ctx sdk.Context, valAddr sdk.ValAddress, pool multistakingtypes.StakingPool, slash sdk.Dec) {
   126  	h.k.AfterSlashStakingPool(ctx, valAddr, pool, slash)
   127  }
   128  
   129  // Implements Slashing hooks
   130  func (h Hooks) AfterSlashProposalRaise(ctx sdk.Context, valAddr sdk.ValAddress, pool multistakingtypes.StakingPool) {
   131  	h.k.AfterSlashProposalRaise(ctx, valAddr, pool)
   132  }