Skip to content

Commit

Permalink
add permissions to call the CloseMarket
Browse files Browse the repository at this point in the history
  • Loading branch information
jgimeno committed Dec 30, 2023
1 parent a29fca4 commit b38c161
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 22 deletions.
14 changes: 8 additions & 6 deletions x/perp/v2/integration/action/settlement.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,31 @@ import (

// closeMarket
type closeMarket struct {
pair asset.Pair
pair asset.Pair
sender sdk.AccAddress
}

func (c closeMarket) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error) {
err := app.PerpKeeperV2.Admin.CloseMarket(ctx, c.pair)
err := app.PerpKeeperV2.Admin.CloseMarket(ctx, c.pair, c.sender)
if err != nil {
return ctx, err
}

return ctx, nil
}

func CloseMarket(pair asset.Pair) action.Action {
return closeMarket{pair: pair}
func CloseMarket(pair asset.Pair, adminAccount sdk.AccAddress) action.Action {
return closeMarket{pair: pair, sender: adminAccount}
}

// closeMarketShouldFail
type closeMarketShouldFail struct {
pair asset.Pair
pair asset.Pair
sender sdk.AccAddress
}

func (c closeMarketShouldFail) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error) {
err := app.PerpKeeperV2.Admin.CloseMarket(ctx, c.pair)
err := app.PerpKeeperV2.Admin.CloseMarket(ctx, c.pair, c.sender)
if err == nil {
return ctx, err
}
Expand Down
6 changes: 5 additions & 1 deletion x/perp/v2/keeper/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,11 @@ func (k admin) CreateMarket(
// CloseMarket closes the market. From now on, no new position can be opened on
// this market or closed. Only the open positions can be settled by calling
// SettlePosition.
func (k admin) CloseMarket(ctx sdk.Context, pair asset.Pair) (err error) {
func (k admin) CloseMarket(ctx sdk.Context, pair asset.Pair, sender sdk.AccAddress) (err error) {
if err := k.SudoKeeper.CheckPermissions(sender, ctx); err != nil {
return err
}

market, err := k.GetMarket(ctx, pair)
if err != nil {
return err
Expand Down
18 changes: 12 additions & 6 deletions x/perp/v2/keeper/admin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,12 @@ func TestCreateMarket(t *testing.T) {
app, ctx := testapp.NewNibiruTestAppAndContext()
admin := app.PerpKeeperV2.Admin

adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

// Error because of invalid market
market := perptypes.DefaultMarket(pair).WithMaintenanceMarginRatio(sdk.NewDec(2))
err := admin.CreateMarket(ctx, keeper.ArgsCreateMarket{
err = admin.CreateMarket(ctx, keeper.ArgsCreateMarket{
Pair: pair,
PriceMultiplier: amm.PriceMultiplier,
SqrtDepth: amm.SqrtDepth,
Expand Down Expand Up @@ -160,7 +163,7 @@ func TestCreateMarket(t *testing.T) {
require.ErrorContains(t, err, "already exists")

// Close the market to test that we can create it again but with an increased version
err = admin.CloseMarket(ctx, pair)
err = admin.CloseMarket(ctx, pair, adminUser)
require.NoError(t, err)

err = admin.CreateMarket(ctx, keeper.ArgsCreateMarket{
Expand Down Expand Up @@ -189,6 +192,9 @@ func TestCloseMarket(t *testing.T) {
startTime := time.Now()
alice := testutil.AccAddress()

adminAccount, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

tc := TestCases{
TC("market can be disabled").
Given(
Expand All @@ -200,7 +206,7 @@ func TestCloseMarket(t *testing.T) {
),
).
When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminAccount),
).
Then(
MarketShouldBeEqual(
Expand All @@ -222,7 +228,7 @@ func TestCloseMarket(t *testing.T) {
FundAccount(alice, sdk.NewCoins(sdk.NewCoin(perptypes.TestingCollateralDenomNUSD, sdk.NewInt(1e6)))),
).
When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminAccount),
).
Then(
MarketOrderFails(
Expand Down Expand Up @@ -254,7 +260,7 @@ func TestCloseMarket(t *testing.T) {
sdk.ZeroDec(),
),
).When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminAccount),
CloseMarketShouldFail(pairBtcUsdc),
CloseMarketShouldFail("random:pair"),
).Then(
Expand All @@ -279,7 +285,7 @@ func TestCloseMarket(t *testing.T) {
sdk.ZeroDec(),
),
).When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminAccount),
AMMShouldBeEqual(pairBtcUsdc, AMM_SettlementPriceShoulBeEqual(sdk.MustNewDecFromStr("1.099800000000000000"))),
).Then(
PartialCloseFails(alice, pairBtcUsdc, sdk.NewDec(5_000), perptypes.ErrMarketNotEnabled),
Expand Down
5 changes: 4 additions & 1 deletion x/perp/v2/keeper/clearing_house_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ func TestMarketOrder(t *testing.T) {
pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD)
startBlockTime := time.Now()

adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

tc := TestCases{
TC("open big short position and then close after reducing swap invariant").
Given(
Expand Down Expand Up @@ -885,7 +888,7 @@ func TestMarketOrder(t *testing.T) {
SetBlockTime(startBlockTime),
SetBlockNumber(1),
FundAccount(alice, sdk.NewCoins(sdk.NewCoin(types.TestingCollateralDenomNUSD, sdk.NewInt(47_714_285_715)))),
CloseMarket(pairBtcNusd),
CloseMarket(pairBtcNusd, adminUser),
).
When(
MarketOrderFails(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(47_619_047_619), sdk.OneDec(), sdk.ZeroDec(),
Expand Down
9 changes: 7 additions & 2 deletions x/perp/v2/keeper/hooks_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package keeper_test

import (
"github.com/NibiruChain/nibiru/x/common/testutil"
"github.com/stretchr/testify/require"
"testing"
"time"

Expand All @@ -21,6 +23,9 @@ func TestAfterEpochEnd(t *testing.T) {
pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC)
startTime := time.Now()

adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

tc := TestCases{
TC("index > mark").
Given(
Expand Down Expand Up @@ -122,7 +127,7 @@ func TestAfterEpochEnd(t *testing.T) {
TC("market closed").
Given(
CreateCustomMarket(pairBtcUsdc, WithEnabled(true)),
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminUser),
SetBlockTime(startTime),
StartEpoch(epochtypes.ThirtyMinuteEpochID),
InsertOraclePriceSnapshot(pairBtcUsd, startTime.Add(15*time.Minute), sdk.NewDec(2)),
Expand All @@ -137,7 +142,7 @@ func TestAfterEpochEnd(t *testing.T) {
TC("not correct epoch id").
Given(
CreateCustomMarket(pairBtcUsdc, WithEnabled(true)),
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminUser),
SetBlockTime(startTime),
StartEpoch(epochtypes.DayEpochID),
InsertOraclePriceSnapshot(pairBtcUsd, startTime.Add(15*time.Minute), sdk.NewDec(2)),
Expand Down
5 changes: 4 additions & 1 deletion x/perp/v2/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,9 @@ func (m msgServer) ShiftSwapInvariant(
return &types.MsgShiftSwapInvariantResponse{}, err
}

// CloseMarket closes a market.
func (m msgServer) CloseMarket(ctx context.Context, msg *types.MsgCloseMarket) (*types.MsgCloseMarketResponse, error) {
panic("implement me")
sender, _ := sdk.AccAddressFromBech32(msg.Sender)
err := m.k.Admin.CloseMarket(sdk.UnwrapSDKContext(ctx), msg.Pair, sender)
return &types.MsgCloseMarketResponse{}, err
}
5 changes: 4 additions & 1 deletion x/perp/v2/keeper/msg_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -408,14 +408,17 @@ func TestMsgServerSettlePosition(t *testing.T) {
pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD)
alice := testutil.AccAddress()

adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

tests := TestCases{
TC("Settleposition").
Given(
CreateCustomMarket(pair, WithEnabled(true)),
FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(types.TestingCollateralDenomNUSD, 100))),
MarketOrder(alice, pair, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec()),
MoveToNextBlock(),
CloseMarket(pair),
CloseMarket(pair, adminUser),
).
When(
MsgServerSettlePosition(alice, pair, 1),
Expand Down
12 changes: 8 additions & 4 deletions x/perp/v2/keeper/settlement_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package keeper_test

import (
"github.com/stretchr/testify/require"
"testing"
"time"

Expand All @@ -23,6 +24,9 @@ func TestSettlePosition(t *testing.T) {
alice := testutil.AccAddress()
bob := testutil.AccAddress()

adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

tc := TestCases{
TC("Happy path").When(
CreateCustomMarket(
Expand All @@ -43,7 +47,7 @@ func TestSettlePosition(t *testing.T) {
sdk.ZeroDec(),
),
).When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminUser),
SettlePosition(pairBtcUsdc, 1, alice),
).Then(
PositionShouldNotExist(alice, pairBtcUsdc, 1),
Expand Down Expand Up @@ -84,7 +88,7 @@ func TestSettlePosition(t *testing.T) {
// Her Realized Pnl is -101.01010101 and her margin is 100, so -1.01010101 is bad debt
// Bob's Realized Pnl is 1010, so he has 1010 more than his margin

CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminUser),
SettlePosition(
pairBtcUsdc,
1,
Expand Down Expand Up @@ -160,7 +164,7 @@ func TestSettlePosition(t *testing.T) {
sdk.ZeroDec(),
),
).When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminUser),
CreateCustomMarket(
pairBtcUsdc,
WithPricePeg(sdk.OneDec()),
Expand Down Expand Up @@ -206,7 +210,7 @@ func TestSettlePosition(t *testing.T) {
sdk.ZeroDec(),
),
).When(
CloseMarket(pairBtcUsdc),
CloseMarket(pairBtcUsdc, adminUser),
CreateCustomMarket(
pairBtcUsdc,
WithPricePeg(sdk.OneDec()),
Expand Down

0 comments on commit b38c161

Please sign in to comment.