mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 15:47:26 +00:00 
			
		
		
		
	Exclude non-bkava denoms from aggregate underlying ukava calculation (#1311)
This commit is contained in:
		
							parent
							
								
									c20c954917
								
							
						
					
					
						commit
						b68685af32
					
				@ -343,8 +343,16 @@ func (s queryServer) getOneAccountBkavaVaultDeposit(
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remove non-bkava coins, GetStakedTokensForDerivatives expects only bkava
 | 
			
		||||
	totalBkavaValue := sdk.NewCoins()
 | 
			
		||||
	for _, coin := range totalAccountValue {
 | 
			
		||||
		if s.keeper.liquidKeeper.IsDerivativeDenom(ctx, coin.Denom) {
 | 
			
		||||
			totalBkavaValue = totalBkavaValue.Add(coin)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Use account value with only the aggregate bkava converted to underlying staked tokens
 | 
			
		||||
	stakedValue, err := s.keeper.liquidKeeper.GetStakedTokensForDerivatives(ctx, totalAccountValue)
 | 
			
		||||
	stakedValue, err := s.keeper.liquidKeeper.GetStakedTokensForDerivatives(ctx, totalBkavaValue)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -417,13 +417,23 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() {
 | 
			
		||||
		[]sdk.AccAddress{},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	suite.CreateVault(
 | 
			
		||||
		"ukava",
 | 
			
		||||
		types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS},
 | 
			
		||||
		false,
 | 
			
		||||
		[]sdk.AccAddress{},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	address1, derivatives1, _ := suite.createAccountWithDerivatives(testutil.TestBkavaDenoms[0], sdk.NewInt(1e9))
 | 
			
		||||
	address2, derivatives2, _ := suite.createAccountWithDerivatives(testutil.TestBkavaDenoms[1], sdk.NewInt(1e9))
 | 
			
		||||
 | 
			
		||||
	err := suite.App.FundAccount(suite.Ctx, address1, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e9))))
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	// Slash the last validator to reduce the value of it's derivatives to test bkava to underlying token conversion.
 | 
			
		||||
	// First call end block to bond validator to enable slashing.
 | 
			
		||||
	staking.EndBlocker(suite.Ctx, suite.App.GetStakingKeeper())
 | 
			
		||||
	err := suite.slashValidator(sdk.ValAddress(address2), sdk.MustNewDecFromStr("0.5"))
 | 
			
		||||
	err = suite.slashValidator(sdk.ValAddress(address2), sdk.MustNewDecFromStr("0.5"))
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	suite.Run("no deposits", func() {
 | 
			
		||||
@ -458,6 +468,9 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() {
 | 
			
		||||
	err = suite.Keeper.Deposit(suite.Ctx, address1, derivatives2, types.STRATEGY_TYPE_SAVINGS)
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	err = suite.Keeper.Deposit(suite.Ctx, address1, sdk.NewInt64Coin("ukava", 1e6), types.STRATEGY_TYPE_SAVINGS)
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	suite.Run("multiple deposits", func() {
 | 
			
		||||
		// Query all deposits for account 1
 | 
			
		||||
		res, err := suite.queryClient.Deposits(
 | 
			
		||||
@ -468,6 +481,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() {
 | 
			
		||||
		suite.Require().Len(res.Deposits, 1)
 | 
			
		||||
		// first validator isn't slashed, so bkava units equal to underlying staked tokens
 | 
			
		||||
		// last validator slashed 50% so derivatives are worth half
 | 
			
		||||
		// Excludes non-bkava deposits
 | 
			
		||||
		expectedValue := derivatives1.Amount.Add(derivatives2.Amount.QuoRaw(2))
 | 
			
		||||
		suite.Require().ElementsMatchf(
 | 
			
		||||
			[]types.DepositResponse{
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,7 @@ type BankKeeper interface {
 | 
			
		||||
// LiquidKeeper defines the expected interface needed for derivative to staked token conversions.
 | 
			
		||||
type LiquidKeeper interface {
 | 
			
		||||
	GetStakedTokensForDerivatives(ctx sdk.Context, derivatives sdk.Coins) (sdk.Coin, error)
 | 
			
		||||
	IsDerivativeDenom(ctx sdk.Context, denom string) bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HardKeeper defines the expected interface needed for the hard strategy.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user