mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 00:05:18 +00:00
fix: enforce max number of liquidations in cdp begin blocker (#849)
* fix: enforce max number of liquidations in cdp begin blocker * address review comments
This commit is contained in:
parent
3a3dd7970d
commit
e4daffcaf8
@ -35,7 +35,7 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k Keeper) {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = k.LiquidateCdps(ctx, cp.LiquidationMarketID, cp.Type, cp.LiquidationRatio)
|
||||
err = k.LiquidateCdps(ctx, cp.LiquidationMarketID, cp.Type, cp.LiquidationRatio, cp.CheckCollateralizationIndexCount)
|
||||
if err != nil && !errors.Is(err, pricefeedtypes.ErrNoValidPrice) {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ func (suite *ModuleTestSuite) TestBeginBlock() {
|
||||
finalXrpCollateral := acc.GetCoins().AmountOf("xrp")
|
||||
seizedXrpCollateral := originalXrpCollateral.Sub(finalXrpCollateral)
|
||||
xrpLiquidations := int(seizedXrpCollateral.Quo(i(10000000000)).Int64())
|
||||
suite.Equal(len(suite.liquidations.xrp), xrpLiquidations)
|
||||
suite.Equal(10, xrpLiquidations)
|
||||
|
||||
acc = sk.GetModuleAccount(suite.ctx, cdp.ModuleName)
|
||||
originalBtcCollateral := acc.GetCoins().AmountOf("btc")
|
||||
@ -145,10 +145,10 @@ func (suite *ModuleTestSuite) TestBeginBlock() {
|
||||
finalBtcCollateral := acc.GetCoins().AmountOf("btc")
|
||||
seizedBtcCollateral := originalBtcCollateral.Sub(finalBtcCollateral)
|
||||
btcLiquidations := int(seizedBtcCollateral.Quo(i(100000000)).Int64())
|
||||
suite.Equal(len(suite.liquidations.btc), btcLiquidations)
|
||||
suite.Equal(10, btcLiquidations)
|
||||
|
||||
acc = sk.GetModuleAccount(suite.ctx, auction.ModuleName)
|
||||
suite.Equal(suite.liquidations.debt, acc.GetCoins().AmountOf("debt").Int64())
|
||||
suite.Equal(int64(71955653865), acc.GetCoins().AmountOf("debt").Int64())
|
||||
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,7 @@ func (k Keeper) SeizeCollateral(ctx sdk.Context, cdp types.CDP) error {
|
||||
}
|
||||
|
||||
// LiquidateCdps seizes collateral from all CDPs below the input liquidation ratio
|
||||
func (k Keeper) LiquidateCdps(ctx sdk.Context, marketID string, collateralType string, liquidationRatio sdk.Dec) error {
|
||||
func (k Keeper) LiquidateCdps(ctx sdk.Context, marketID string, collateralType string, liquidationRatio sdk.Dec, count sdk.Int) error {
|
||||
price, err := k.pricefeedKeeper.GetCurrentPrice(ctx, marketID)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -100,7 +100,7 @@ func (k Keeper) LiquidateCdps(ctx sdk.Context, marketID string, collateralType s
|
||||
// liquidation ratio = 1.5
|
||||
// normalizedRatio = (1/(0.5/1.5)) = 3
|
||||
normalizedRatio := sdk.OneDec().Quo(priceDivLiqRatio)
|
||||
cdpsToLiquidate := k.GetAllCdpsByCollateralTypeAndRatio(ctx, collateralType, normalizedRatio)
|
||||
cdpsToLiquidate := k.GetSliceOfCDPsByRatioAndType(ctx, count, normalizedRatio, collateralType)
|
||||
for _, c := range cdpsToLiquidate {
|
||||
k.hooks.BeforeCDPModified(ctx, c)
|
||||
err := k.SeizeCollateral(ctx, c)
|
||||
|
@ -188,12 +188,12 @@ func (suite *SeizeTestSuite) TestLiquidateCdps() {
|
||||
suite.setPrice(d("0.2"), "xrp:usd")
|
||||
p, found := suite.keeper.GetCollateral(suite.ctx, "xrp-a")
|
||||
suite.True(found)
|
||||
suite.keeper.LiquidateCdps(suite.ctx, "xrp:usd", "xrp-a", p.LiquidationRatio)
|
||||
suite.keeper.LiquidateCdps(suite.ctx, "xrp:usd", "xrp-a", p.LiquidationRatio, p.CheckCollateralizationIndexCount)
|
||||
acc = sk.GetModuleAccount(suite.ctx, types.ModuleName)
|
||||
finalXrpCollateral := acc.GetCoins().AmountOf("xrp")
|
||||
seizedXrpCollateral := originalXrpCollateral.Sub(finalXrpCollateral)
|
||||
xrpLiquidations := int(seizedXrpCollateral.Quo(i(10000000000)).Int64())
|
||||
suite.Equal(len(suite.liquidations.xrp), xrpLiquidations)
|
||||
suite.Equal(10, xrpLiquidations)
|
||||
}
|
||||
|
||||
func (suite *SeizeTestSuite) TestApplyLiquidationPenalty() {
|
||||
|
Loading…
Reference in New Issue
Block a user