KiraCore / sekai

backend - blockchain application
Other
18 stars 17 forks source link

Destination of Slashed Funds in Basket Module Unclear #617

Open kmlbgn opened 10 months ago

kmlbgn commented 10 months ago

PR #610 (commit c4d24761d78026f5ce8bdd707de74ec2c1e172c9) added new hooks to the basket module for handling validator slash events. However, it's not clear where the slashed funds go when the basket pool weight of a slashed validator is reduced. https://github.com/KiraCore/sekai/blob/c4d24761d78026f5ce8bdd707de74ec2c1e172c9/x/basket/keeper/hooks.go#L60-L81

As per KIP :

The slashed tokens, including KIRA's native token KEX, are transferred to a governance-controlled community spending pool where a decision can be made regarding their final fate

kiragpg commented 6 months ago

This is reducing the weight of an asset since that asset's value has been decreased from slashing underlying tokens. Therefore the slash handling should be actualy done in multistakingi module - not on basket module. Here's where it handles slashed tokens

func (k Keeper) SlashStakingPool(ctx sdk.Context, validator string, slash sdk.Dec) {
    pool, found := k.GetStakingPoolByValidator(ctx, validator)
    if !found {
        return
    }
    pool.Slashed = slash
    pool.Enabled = false

    totalStakingTokens := sdk.Coins{}
    for _, stakingToken := range pool.TotalStakingTokens {
        totalStakingTokens = totalStakingTokens.Add(sdk.NewCoin(stakingToken.Denom, sdk.NewDecFromInt(stakingToken.Amount).Mul(sdk.OneDec().Sub(pool.Slashed)).RoundInt()))
    }
    totalSlashedTokens := sdk.Coins(pool.TotalStakingTokens).Sub(totalStakingTokens...)
    pool.TotalStakingTokens = totalStakingTokens

    defaultDenom := k.sk.DefaultDenom(ctx)
    defaultDenomAmount := totalSlashedTokens.AmountOf(defaultDenom)
    burnAmount := sdk.Coins{sdk.NewCoin(defaultDenom, defaultDenomAmount)}
    err := k.bankKeeper.BurnCoins(ctx, types.ModuleName, burnAmount)
    if err != nil {
        panic(err)
    }

    treasurySendAmount := totalSlashedTokens.Sub(burnAmount...)
    err = k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, authtypes.FeeCollectorName, treasurySendAmount)
    if err != nil {
        panic(err)
    }
    feesTreasury := k.distrKeeper.GetFeesTreasury(ctx)
    feesTreasury = feesTreasury.Add(treasurySendAmount...)
    k.distrKeeper.SetFeesTreasury(ctx, feesTreasury)

For KEX tokens it's burnt. For non-KEX tokens, it's sent to fees treasury that can be controlled by governance.