diff --git a/CHANGELOG.md b/CHANGELOG.md index b2c29afb7b..aac3bdbccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,6 +90,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - [1323](https://github.com/umee-network/umee/pull/1323) Oracle cli - Add validator address override option. - [1329](https://github.com/umee-network/umee/pull/1329) Implement MaxCollateralShare. - [1330](https://github.com/umee-network/umee/pull/1330) Implemented MaxSupplyUtilization. +- [1319](https://github.com/umee-network/umee/pull/1319) Implemented MaxSupply. - [1331](https://github.com/umee-network/umee/pull/1331) Implemented MinCollateralLiquidity. ### Improvements diff --git a/x/leverage/fixtures/token.go b/x/leverage/fixtures/token.go index 813fd28b88..650c9debdc 100644 --- a/x/leverage/fixtures/token.go +++ b/x/leverage/fixtures/token.go @@ -31,6 +31,6 @@ func Token(base, symbol string) types.Token { MaxCollateralShare: sdk.MustNewDecFromStr("1"), MaxSupplyUtilization: sdk.MustNewDecFromStr("0.9"), MinCollateralLiquidity: sdk.MustNewDecFromStr("0"), - MaxSupply: sdk.NewInt(100000000000), + MaxSupply: sdk.NewInt(100_000_000000), } } diff --git a/x/leverage/keeper/keeper.go b/x/leverage/keeper/keeper.go index 7a0b9f147d..ee17fe1519 100644 --- a/x/leverage/keeper/keeper.go +++ b/x/leverage/keeper/keeper.go @@ -83,6 +83,21 @@ func (k Keeper) Supply(ctx sdk.Context, supplierAddr sdk.AccAddress, coin sdk.Co return sdk.Coin{}, err } + token, err := k.GetTokenSettings(ctx, coin.Denom) + if err != nil { + return sdk.Coin{}, err + } + + total, err := k.GetTotalSupply(ctx, coin.Denom) + if err != nil { + return sdk.Coin{}, err + } + + if token.MaxSupply.IsPositive() && total.Add(coin).Amount.GTE(token.MaxSupply) { + return sdk.Coin{}, types.ErrMaxSupply.Wrapf("attempted: %s, current supply: %s, max supply: %s", + coin, total.Amount, token.MaxSupply) + } + // determine uToken amount to mint uToken, err := k.ExchangeToken(ctx, coin) if err != nil { diff --git a/x/leverage/keeper/keeper_test.go b/x/leverage/keeper/keeper_test.go index fa20b4d57c..462370f427 100644 --- a/x/leverage/keeper/keeper_test.go +++ b/x/leverage/keeper/keeper_test.go @@ -28,6 +28,9 @@ func (s *IntegrationTestSuite) TestSupply() { s.borrow(borrower, coin(atomDenom, 10_000000)) s.tk.SetBorrow(ctx, borrower, coin(atomDenom, 60_000000)) + // create a supplier that will exceed token's default MaxSupply + whale := s.newAccount(coin(umeeDenom, 1_000_000_000000)) + tcs := []testCase{ { "unregistered denom", @@ -78,6 +81,13 @@ func (s *IntegrationTestSuite) TestSupply() { coin("u/"+atomDenom, 40_000000), nil, }, + { + "max supply", + whale, + coin(umeeDenom, 1_000_000_000000), + sdk.Coin{}, + types.ErrMaxSupply, + }, } for _, tc := range tcs { diff --git a/x/leverage/types/errors.go b/x/leverage/types/errors.go index 960b568d2c..97480f9bad 100644 --- a/x/leverage/types/errors.go +++ b/x/leverage/types/errors.go @@ -37,6 +37,7 @@ var ( ErrMaxSupplyUtilization = sdkerrors.Register(ModuleName, 501, "market would exceed MaxSupplyUtilization") ErrMinCollateralLiquidity = sdkerrors.Register(ModuleName, 502, "market would fall below MinCollateralLiquidity") ErrMaxCollateralShare = sdkerrors.Register(ModuleName, 503, "market would exceed MaxCollateralShare") + ErrMaxSupply = sdkerrors.Register(ModuleName, 504, "market would exceed MaxSupply") // 6XX = Internal Failsafes ErrInvalidUtilization = sdkerrors.Register(ModuleName, 600, "invalid token utilization")