mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 15:25:18 +00:00
fix: remove redundant debt limit param (#312)
This commit is contained in:
parent
d286f53053
commit
dca59447aa
@ -59,7 +59,6 @@ func NewCDPGenState(asset string, liquidationRatio sdk.Dec) app.GenesisState {
|
|||||||
{
|
{
|
||||||
Denom: "usdx",
|
Denom: "usdx",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("usdx", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
@ -133,14 +132,12 @@ func NewCDPGenStateMulti() app.GenesisState {
|
|||||||
{
|
{
|
||||||
Denom: "usdx",
|
Denom: "usdx",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("usdx", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Denom: "susd",
|
Denom: "susd",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("susd", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
@ -189,14 +186,10 @@ func badGenStates() []badGenState {
|
|||||||
g6 := baseGenState()
|
g6 := baseGenState()
|
||||||
g6.Params.DebtParams[0].Denom = "susd"
|
g6.Params.DebtParams[0].Denom = "susd"
|
||||||
|
|
||||||
g7 := baseGenState()
|
|
||||||
g7.Params.DebtParams[0].DebtLimit = sdk.NewCoins(sdk.NewInt64Coin("usdx", 1000000000001))
|
|
||||||
|
|
||||||
g8 := baseGenState()
|
g8 := baseGenState()
|
||||||
g8.Params.DebtParams = append(g8.Params.DebtParams, cdp.DebtParam{
|
g8.Params.DebtParams = append(g8.Params.DebtParams, cdp.DebtParam{
|
||||||
Denom: "lol",
|
Denom: "lol",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("lol", 1000000000000)),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
g9 := baseGenState()
|
g9 := baseGenState()
|
||||||
@ -221,7 +214,6 @@ func badGenStates() []badGenState {
|
|||||||
badGenState{Genesis: g4, Reason: "single collateral exceeds debt limit"},
|
badGenState{Genesis: g4, Reason: "single collateral exceeds debt limit"},
|
||||||
badGenState{Genesis: g5, Reason: "combined collateral exceeds debt limit"},
|
badGenState{Genesis: g5, Reason: "combined collateral exceeds debt limit"},
|
||||||
badGenState{Genesis: g6, Reason: "duplicate debt denom"},
|
badGenState{Genesis: g6, Reason: "duplicate debt denom"},
|
||||||
badGenState{Genesis: g7, Reason: "debt limit exceeds global debt limit"},
|
|
||||||
badGenState{Genesis: g8, Reason: "debt param not found in global debt limit"},
|
badGenState{Genesis: g8, Reason: "debt param not found in global debt limit"},
|
||||||
badGenState{Genesis: g9, Reason: "debt denom not set"},
|
badGenState{Genesis: g9, Reason: "debt denom not set"},
|
||||||
badGenState{Genesis: g10, Reason: "previous block time not set"},
|
badGenState{Genesis: g10, Reason: "previous block time not set"},
|
||||||
@ -261,14 +253,12 @@ func baseGenState() cdp.GenesisState {
|
|||||||
{
|
{
|
||||||
Denom: "usdx",
|
Denom: "usdx",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("usdx", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Denom: "susd",
|
Denom: "susd",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("susd", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
|
@ -350,9 +350,6 @@ func (k Keeper) ValidatePrincipalAdd(ctx sdk.Context, principal sdk.Coins) sdk.E
|
|||||||
if !found {
|
if !found {
|
||||||
return types.ErrDebtNotSupported(k.codespace, dc.Denom)
|
return types.ErrDebtNotSupported(k.codespace, dc.Denom)
|
||||||
}
|
}
|
||||||
if sdk.NewCoins(dc).IsAnyGT(dp.DebtLimit) {
|
|
||||||
return types.ErrExceedsDebtLimit(k.codespace, sdk.NewCoins(dc), dp.DebtLimit)
|
|
||||||
}
|
|
||||||
if dc.Amount.LT(dp.DebtFloor) {
|
if dc.Amount.LT(dp.DebtFloor) {
|
||||||
return types.ErrBelowDebtFloor(k.codespace, sdk.NewCoins(dc), dp.DebtFloor)
|
return types.ErrBelowDebtFloor(k.codespace, sdk.NewCoins(dc), dp.DebtFloor)
|
||||||
}
|
}
|
||||||
@ -363,12 +360,21 @@ func (k Keeper) ValidatePrincipalAdd(ctx sdk.Context, principal sdk.Coins) sdk.E
|
|||||||
// ValidatePrincipalDraw validates that an asset is valid for use as debt when drawing debt off an existing cdp
|
// ValidatePrincipalDraw validates that an asset is valid for use as debt when drawing debt off an existing cdp
|
||||||
func (k Keeper) ValidatePrincipalDraw(ctx sdk.Context, principal sdk.Coins) sdk.Error {
|
func (k Keeper) ValidatePrincipalDraw(ctx sdk.Context, principal sdk.Coins) sdk.Error {
|
||||||
for _, dc := range principal {
|
for _, dc := range principal {
|
||||||
dp, found := k.GetDebt(ctx, dc.Denom)
|
_, found := k.GetDebt(ctx, dc.Denom)
|
||||||
if !found {
|
if !found {
|
||||||
return types.ErrDebtNotSupported(k.codespace, dc.Denom)
|
return types.ErrDebtNotSupported(k.codespace, dc.Denom)
|
||||||
}
|
}
|
||||||
if sdk.NewCoins(dc).IsAnyGT(dp.DebtLimit) {
|
}
|
||||||
return types.ErrExceedsDebtLimit(k.codespace, sdk.NewCoins(dc), dp.DebtLimit)
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateDebtLimit validates that the input debt amount does not exceed the global debt limit
|
||||||
|
func (k Keeper) ValidateDebtLimit(ctx sdk.Context, collateralDenom string, principal sdk.Coins) sdk.Error {
|
||||||
|
for _, dc := range principal {
|
||||||
|
totalPrincipal := k.GetTotalPrincipal(ctx, collateralDenom, dc.Denom).Add(dc.Amount)
|
||||||
|
globalLimit := k.GetParams(ctx).GlobalDebtLimit.AmountOf(dc.Denom)
|
||||||
|
if totalPrincipal.GT(globalLimit) {
|
||||||
|
return types.ErrExceedsDebtLimit(k.codespace, sdk.NewCoins(sdk.NewCoin(dc.Denom, totalPrincipal)), sdk.NewCoins(sdk.NewCoin(dc.Denom, globalLimit)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -256,8 +256,11 @@ func (suite *CdpTestSuite) TestValidatePrincipal() {
|
|||||||
err = suite.keeper.ValidatePrincipalAdd(suite.ctx, d)
|
err = suite.keeper.ValidatePrincipalAdd(suite.ctx, d)
|
||||||
suite.Equal(types.CodeDebtNotSupported, err.Result().Code)
|
suite.Equal(types.CodeDebtNotSupported, err.Result().Code)
|
||||||
d = sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000000000001)))
|
d = sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000000000001)))
|
||||||
err = suite.keeper.ValidatePrincipalAdd(suite.ctx, d)
|
err = suite.keeper.ValidateDebtLimit(suite.ctx, "xrp", d)
|
||||||
suite.Equal(types.CodeExceedsDebtLimit, err.Result().Code)
|
suite.Equal(types.CodeExceedsDebtLimit, err.Result().Code)
|
||||||
|
d = sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(100000000)))
|
||||||
|
err = suite.keeper.ValidateDebtLimit(suite.ctx, "xrp", d)
|
||||||
|
suite.NoError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *CdpTestSuite) TestCalculateCollateralizationRatio() {
|
func (suite *CdpTestSuite) TestCalculateCollateralizationRatio() {
|
||||||
|
@ -19,6 +19,11 @@ func (k Keeper) AddPrincipal(ctx sdk.Context, owner sdk.AccAddress, denom string
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = k.ValidateDebtLimit(ctx, cdp.Collateral[0].Denom, principal)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// fee calculation
|
// fee calculation
|
||||||
periods := sdk.NewInt(ctx.BlockTime().Unix()).Sub(sdk.NewInt(cdp.FeesUpdated.Unix()))
|
periods := sdk.NewInt(ctx.BlockTime().Unix()).Sub(sdk.NewInt(cdp.FeesUpdated.Unix()))
|
||||||
fees := k.CalculateFees(ctx, cdp.Principal.Add(cdp.AccumulatedFees), periods, cdp.Collateral[0].Denom)
|
fees := k.CalculateFees(ctx, cdp.Principal.Add(cdp.AccumulatedFees), periods, cdp.Collateral[0].Denom)
|
||||||
|
@ -59,7 +59,6 @@ func NewCDPGenState(asset string, liquidationRatio sdk.Dec) app.GenesisState {
|
|||||||
{
|
{
|
||||||
Denom: "usdx",
|
Denom: "usdx",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("usdx", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
@ -133,14 +132,12 @@ func NewCDPGenStateMulti() app.GenesisState {
|
|||||||
{
|
{
|
||||||
Denom: "usdx",
|
Denom: "usdx",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("usdx", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Denom: "susd",
|
Denom: "susd",
|
||||||
ReferenceAsset: "usd",
|
ReferenceAsset: "usd",
|
||||||
DebtLimit: sdk.NewCoins(sdk.NewInt64Coin("susd", 1000000000000)),
|
|
||||||
ConversionFactor: i(6),
|
ConversionFactor: i(6),
|
||||||
DebtFloor: i(10000000),
|
DebtFloor: i(10000000),
|
||||||
},
|
},
|
||||||
|
@ -51,6 +51,7 @@ func (d Deposit) Empty() bool {
|
|||||||
return d.Equals(Deposit{})
|
return d.Equals(Deposit{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SumCollateral returns the total amount of collateral in the input deposits
|
||||||
func (ds Deposits) SumCollateral() (sum sdk.Int) {
|
func (ds Deposits) SumCollateral() (sum sdk.Int) {
|
||||||
sum = sdk.ZeroInt()
|
sum = sdk.ZeroInt()
|
||||||
for _, d := range ds {
|
for _, d := range ds {
|
||||||
|
@ -113,20 +113,18 @@ func (cps CollateralParams) String() string {
|
|||||||
|
|
||||||
// DebtParam governance params for debt assets
|
// DebtParam governance params for debt assets
|
||||||
type DebtParam struct {
|
type DebtParam struct {
|
||||||
Denom string `json:"denom" yaml:"denom"`
|
Denom string `json:"denom" yaml:"denom"`
|
||||||
ReferenceAsset string `json:"reference_asset" yaml:"reference_asset"`
|
ReferenceAsset string `json:"reference_asset" yaml:"reference_asset"`
|
||||||
DebtLimit sdk.Coins `json:"debt_limit" yaml:"debt_limit"`
|
ConversionFactor sdk.Int `json:"conversion_factor" yaml:"conversion_factor"`
|
||||||
ConversionFactor sdk.Int `json:"conversion_factor" yaml:"conversion_factor"`
|
DebtFloor sdk.Int `json:"debt_floor" yaml:"debt_floor"` // minimum active loan size, used to prevent dust
|
||||||
DebtFloor sdk.Int `json:"debt_floor" yaml:"debt_floor"` // minimum active loan size, used to prevent dust
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dp DebtParam) String() string {
|
func (dp DebtParam) String() string {
|
||||||
return fmt.Sprintf(`Debt:
|
return fmt.Sprintf(`Debt:
|
||||||
Denom: %s
|
Denom: %s
|
||||||
Reference Asset: %s
|
Reference Asset: %s
|
||||||
Debt Limit: %s
|
|
||||||
Conversion Factor: %s
|
Conversion Factor: %s
|
||||||
Debt Floor %s`, dp.Denom, dp.ReferenceAsset, dp.DebtLimit, dp.ConversionFactor, dp.DebtFloor)
|
Debt Floor %s`, dp.Denom, dp.ReferenceAsset, dp.ConversionFactor, dp.DebtFloor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DebtParams array of DebtParam
|
// DebtParams array of DebtParam
|
||||||
@ -164,25 +162,13 @@ func (p *Params) ParamSetPairs() params.ParamSetPairs {
|
|||||||
func (p Params) Validate() error {
|
func (p Params) Validate() error {
|
||||||
// validate debt params
|
// validate debt params
|
||||||
debtDenoms := make(map[string]int)
|
debtDenoms := make(map[string]int)
|
||||||
debtParamsDebtLimit := sdk.Coins{}
|
|
||||||
for _, dp := range p.DebtParams {
|
for _, dp := range p.DebtParams {
|
||||||
_, found := debtDenoms[dp.Denom]
|
_, found := debtDenoms[dp.Denom]
|
||||||
if found {
|
if found {
|
||||||
return fmt.Errorf("duplicate debt denom: %s", dp.Denom)
|
return fmt.Errorf("duplicate debt denom: %s", dp.Denom)
|
||||||
}
|
}
|
||||||
debtDenoms[dp.Denom] = 1
|
debtDenoms[dp.Denom] = 1
|
||||||
if dp.DebtLimit.IsAnyNegative() {
|
|
||||||
return fmt.Errorf("debt limit for all debt tokens should be positive, is %s for %s", dp.DebtLimit, dp.Denom)
|
|
||||||
}
|
|
||||||
debtParamsDebtLimit = debtParamsDebtLimit.Add(dp.DebtLimit)
|
|
||||||
}
|
|
||||||
if !debtParamsDebtLimit.DenomsSubsetOf(p.GlobalDebtLimit) {
|
|
||||||
return fmt.Errorf("debt denom not found in global debt limit:\n\tglobal debt limit: %s\n\tdebt limits: %s",
|
|
||||||
p.GlobalDebtLimit, debtParamsDebtLimit)
|
|
||||||
}
|
|
||||||
if debtParamsDebtLimit.IsAnyGT(p.GlobalDebtLimit) {
|
|
||||||
return fmt.Errorf("debt limit exceeds global debt limit:\n\tglobal debt limit: %s\n\tdebt limits: %s",
|
|
||||||
p.GlobalDebtLimit, debtParamsDebtLimit)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate collateral params
|
// validate collateral params
|
||||||
|
Loading…
Reference in New Issue
Block a user