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 }