Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(perp): move create market from Wasm Binding to MsgCreateMarket as part of #1642 #1761

Closed
wants to merge 12 commits into from
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* [#1752](https://github.com/NibiruChain/nibiru/pull/1752) - feat(oracle): MsgEditOracleParams sudo tx msg as part of #1642
* [#1755](https://github.com/NibiruChain/nibiru/pull/1755) - feat(oracle): Add more events on validator's performance
* [#1749](https://github.com/NibiruChain/nibiru/pull/1749) - feat(perp): move close market from Wasm Binding to MsgCloseMarket
* [#1761](https://github.com/NibiruChain/nibiru/pull/1761) - feat(perp): move create market from Wasm Binding to MsgCreateMarket


### Non-breaking/Compatible Improvements
Expand Down
1 change: 0 additions & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasmkeeper.
wasmOpts = append(wasmOpts, wasmbinding.NibiruWasmOptions(
nibiru.GRPCQueryRouter(),
nibiru.appCodec,
nibiru.PerpKeeperV2,
nibiru.SudoKeeper,
nibiru.OracleKeeper,
)...)
Expand Down
34 changes: 34 additions & 0 deletions proto/nibiru/perp/v2/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ service Msg {
rpc WithdrawFromPerpFund(MsgWithdrawFromPerpFund)
returns (MsgWithdrawFromPerpFundResponse) {}

rpc CreateMarket(MsgCreateMarket) returns (MsgCreateMarketResponse) {}

// CloseMarket: gRPC tx msg for closing a market.
// [Admin] Only callable by sudoers.
rpc CloseMarket(MsgCloseMarket) returns (MsgCloseMarketResponse) {}
Expand Down Expand Up @@ -457,6 +459,38 @@ message MsgWithdrawFromPerpFund {

message MsgWithdrawFromPerpFundResponse {}

// -------------------------- CreateMarket --------------------------

// CreateMarket: gRPC tx msg for creating a new market.
// Admin-only.
message MsgCreateMarket {
string sender = 1;
string pair = 2 [
(gogoproto.customtype) =
"github.com/NibiruChain/nibiru/x/common/asset.Pair",
(gogoproto.moretags) = "yaml:\"pair\"",
(gogoproto.nullable) = false
];

string price_multiplier = 3 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.moretags) = "yaml:\"price_multiplier\"",
(gogoproto.nullable) = false
];

string sqrt_depth = 4 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.moretags) = "yaml:\"sqrt_depth\"",
(gogoproto.nullable) = false
];

Market market = 5 [
(gogoproto.nullable) = true
];
}

message MsgCreateMarketResponse {}

// -------------------------- CloseMarket --------------------------

// CloseMarket: gRPC tx msg for closing a market.
Expand Down
14 changes: 0 additions & 14 deletions wasmbinding/exec_perp.go

This file was deleted.

6 changes: 0 additions & 6 deletions wasmbinding/exec_perp_test.go
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's just delete this file, as there's no more tests in it.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"github.com/stretchr/testify/suite"

"github.com/NibiruChain/nibiru/app"
"github.com/NibiruChain/nibiru/wasmbinding"
"github.com/NibiruChain/nibiru/wasmbinding/wasmbin"
"github.com/NibiruChain/nibiru/x/common/asset"
"github.com/NibiruChain/nibiru/x/common/denoms"
Expand All @@ -31,7 +30,6 @@ type TestSuitePerpExecutor struct {
nibiru *app.NibiruApp
ctx sdk.Context
contractDeployer sdk.AccAddress
exec *wasmbinding.ExecutorPerp

contractPerp sdk.AccAddress
ratesMap map[asset.Pair]sdk.Dec
Expand Down Expand Up @@ -115,10 +113,6 @@ func (s *TestSuitePerpExecutor) SetupSuite() {
s.ctx = ctx
s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding]

s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, s.contractPerp, coins))
s.exec = &wasmbinding.ExecutorPerp{
PerpV2: nibiru.PerpKeeperV2,
}
s.nibiru.PerpKeeperV2.Collateral.Set(s.ctx, perpv2types.TestingCollateralDenomNUSD)
s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, s.contractPerp, coins))

Expand Down
4 changes: 0 additions & 4 deletions wasmbinding/message_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"

oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper"
perpv2keeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper"
)

var _ wasmkeeper.Messenger = (*CustomMessenger)(nil)
Expand All @@ -21,7 +20,6 @@ var _ wasmkeeper.Messenger = (*CustomMessenger)(nil)
// own custom `DispatchMsg` for CosmWasm execute calls on Nibiru.
type CustomMessenger struct {
Wasm wasmkeeper.Messenger
Perp ExecutorPerp
Sudo keeper.Keeper
Oracle ExecutorOracle
}
Expand Down Expand Up @@ -85,14 +83,12 @@ func (messenger *CustomMessenger) DispatchMsg(
}

func CustomMessageDecorator(
perpv2 perpv2keeper.Keeper,
sudoKeeper keeper.Keeper,
oracleKeeper oraclekeeper.Keeper,
) func(wasmkeeper.Messenger) wasmkeeper.Messenger {
return func(originalWasmMessenger wasmkeeper.Messenger) wasmkeeper.Messenger {
return &CustomMessenger{
Wasm: originalWasmMessenger,
Perp: ExecutorPerp{PerpV2: perpv2},
Sudo: sudoKeeper,
Oracle: ExecutorOracle{Oracle: oracleKeeper},
}
Expand Down
4 changes: 1 addition & 3 deletions wasmbinding/wasm.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ import (
"github.com/NibiruChain/nibiru/x/sudo/keeper"

oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper"
perpv2keeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper"
)

// NibiruWasmOptions: Wasm Options are extension points to instantiate the Wasm
// keeper with non-default values
func NibiruWasmOptions(
grpcQueryRouter *baseapp.GRPCQueryRouter,
appCodec codec.Codec,
perpv2 perpv2keeper.Keeper,
sudoKeeper keeper.Keeper,
oracleKeeper oraclekeeper.Keeper,
) []wasmkeeper.Option {
Expand All @@ -29,7 +27,7 @@ func NibiruWasmOptions(
})

wasmExecuteOption := wasmkeeper.WithMessageHandlerDecorator(
CustomMessageDecorator(perpv2, sudoKeeper, oracleKeeper),
CustomMessageDecorator(sudoKeeper, oracleKeeper),
)

return []wasmkeeper.Option{wasmQueryOption, wasmExecuteOption}
Expand Down
13 changes: 8 additions & 5 deletions x/perp/v2/integration/action/market.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ type createPool struct {
pair asset.Pair
market types.Market
amm types.AMM

adminAccount sdk.AccAddress
}

func (c createPool) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error) {
Expand All @@ -171,15 +173,16 @@ func (c createPool) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error)
PriceMultiplier: c.amm.PriceMultiplier,
SqrtDepth: c.amm.SqrtDepth,
Market: &c.market,
})
}, c.adminAccount)
return ctx, err
}

func CreateMarket(pair asset.Pair, market types.Market, amm types.AMM) action.Action {
func CreateMarket(pair asset.Pair, market types.Market, amm types.AMM, adminAccount sdk.AccAddress) action.Action {
return createPool{
pair: pair,
market: market,
amm: amm,
pair: pair,
market: market,
amm: amm,
adminAccount: adminAccount,
}
}

Expand Down
28 changes: 20 additions & 8 deletions x/perp/v2/keeper/amm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,14 +160,17 @@ func TestShiftPegMultiplier_Fail(t *testing.T) {

account := testutil.AccAddress()

err := app.PerpKeeperV2.Sudo().CreateMarket(
adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

err = app.PerpKeeperV2.Sudo().CreateMarket(
ctx,
keeper.ArgsCreateMarket{
Pair: pair,
PriceMultiplier: sdk.NewDec(2),
SqrtDepth: sdk.NewDec(1_000_000),
EnableMarket: true,
},
adminUser,
)
app.PerpKeeperV2.ReserveSnapshots.Insert(
ctx,
Expand Down Expand Up @@ -230,14 +233,17 @@ func TestShiftSwapInvariant_Fail(t *testing.T) {
app, ctx := testapp.NewNibiruTestAppAndContext()
account := testutil.AccAddress()

err := app.PerpKeeperV2.Sudo().CreateMarket(
adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

err = app.PerpKeeperV2.Sudo().CreateMarket(
ctx,
keeper.ArgsCreateMarket{
Pair: pair,
PriceMultiplier: sdk.NewDec(2),
SqrtDepth: sdk.NewDec(1_000),
EnableMarket: true,
},
adminUser,
)
app.PerpKeeperV2.ReserveSnapshots.Insert(
ctx,
Expand Down Expand Up @@ -437,14 +443,17 @@ func TestKeeper_GetMarketByPairAndVersion(t *testing.T) {

pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD)

err := app.PerpKeeperV2.Sudo().CreateMarket(
adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

err = app.PerpKeeperV2.Sudo().CreateMarket(
ctx,
keeper.ArgsCreateMarket{
Pair: pair,
PriceMultiplier: sdk.NewDec(2),
SqrtDepth: sdk.NewDec(1_000_000),
EnableMarket: true,
},
adminUser,
)
require.NoError(t, err)

Expand All @@ -462,14 +471,17 @@ func TestKeeper_GetAMMByPairAndVersion(t *testing.T) {

pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD)

err := app.PerpKeeperV2.Sudo().CreateMarket(
adminUser, err := sdk.AccAddressFromBech32(testutil.ADDR_SUDO_ROOT)
require.NoError(t, err)

err = app.PerpKeeperV2.Sudo().CreateMarket(
ctx,
keeper.ArgsCreateMarket{
Pair: pair,
PriceMultiplier: sdk.NewDec(2),
SqrtDepth: sdk.NewDec(1_000_000),
EnableMarket: true,
},
adminUser,
)
require.NoError(t, err)

Expand Down
31 changes: 26 additions & 5 deletions x/perp/v2/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,7 @@
// ShiftSwapInvariant: gRPC tx msg for changing a market's swap invariant.
// [SUDO] Only callable by sudoers.
func (m msgServer) ShiftSwapInvariant(
goCtx context.Context, msg *types.MsgShiftSwapInvariant,
) (*types.MsgShiftSwapInvariantResponse, error) {
goCtx context.Context, msg *types.MsgShiftSwapInvariant) (*types.MsgShiftSwapInvariantResponse, error) {
// Sender is checked in `msg.ValidateBasic` before reaching this fn call.
sender, _ := sdk.AccAddressFromBech32(msg.Sender)
ctx := sdk.UnwrapSDKContext(goCtx)
Expand All @@ -221,9 +220,7 @@

// WithdrawFromPerpFund: gRPC tx msg for changing a market's swap invariant.
// [SUDO] Only callable by sudoers.
func (m msgServer) WithdrawFromPerpFund(
goCtx context.Context, msg *types.MsgWithdrawFromPerpFund,
) (resp *types.MsgWithdrawFromPerpFundResponse, err error) {
func (m msgServer) WithdrawFromPerpFund(goCtx context.Context, msg *types.MsgWithdrawFromPerpFund) (resp *types.MsgWithdrawFromPerpFundResponse, err error) {
// Sender is checked in `msg.ValidateBasic` before reaching this fn call.
sender, _ := sdk.AccAddressFromBech32(msg.Sender)
toAddr, _ := sdk.AccAddressFromBech32(msg.ToAddr)
Expand All @@ -234,8 +231,32 @@
}

// CloseMarket closes a market.
func (m msgServer) CloseMarket(ctx context.Context, msg *types.MsgCloseMarket) (*types.MsgCloseMarketResponse, error) {
sender, _ := sdk.AccAddressFromBech32(msg.Sender)
err := m.k.Sudo().CloseMarket(sdk.UnwrapSDKContext(ctx), msg.Pair, sender)
return &types.MsgCloseMarketResponse{}, err

Check warning on line 237 in x/perp/v2/keeper/msg_server.go

View check run for this annotation

Codecov / codecov/patch

x/perp/v2/keeper/msg_server.go#L234-L237

Added lines #L234 - L237 were not covered by tests
}

// CreateMarket gRPC tx msg for creating a new market.
// [Admin] Only callable by sudoers.
func (m msgServer) CreateMarket(
goCtx context.Context, msg *types.MsgCreateMarket,
) (*types.MsgCreateMarketResponse, error) {
sender, _ := sdk.AccAddressFromBech32(msg.Sender)
ctx := sdk.UnwrapSDKContext(goCtx)

args := ArgsCreateMarket{
Pair: msg.Pair,
PriceMultiplier: msg.PriceMultiplier,
SqrtDepth: msg.SqrtDepth,

Market: msg.Market,
}

err := m.k.Sudo().CreateMarket(ctx, args, sender)
if err != nil {
return nil, err
}

Check warning on line 259 in x/perp/v2/keeper/msg_server.go

View check run for this annotation

Codecov / codecov/patch

x/perp/v2/keeper/msg_server.go#L244-L259

Added lines #L244 - L259 were not covered by tests

return &types.MsgCreateMarketResponse{}, nil

Check warning on line 261 in x/perp/v2/keeper/msg_server.go

View check run for this annotation

Codecov / codecov/patch

x/perp/v2/keeper/msg_server.go#L261

Added line #L261 was not covered by tests
}
11 changes: 7 additions & 4 deletions x/perp/v2/keeper/sudo.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@
if denom == "" {
denomFromState, err := k.Collateral.Get(ctx)
if err != nil {
return err
}

Check warning on line 47 in x/perp/v2/keeper/sudo.go

View check run for this annotation

Codecov / codecov/patch

x/perp/v2/keeper/sudo.go#L46-L47

Added lines #L46 - L47 were not covered by tests
collateralDenom = denomFromState
}

Expand All @@ -70,16 +70,18 @@
PriceMultiplier sdk.Dec
SqrtDepth sdk.Dec
Market *types.Market // pointer makes it optional
// EnableMarket: Optionally enable the default market without explicitly passing
// in each field as an argument. If 'Market' is present, this field is ignored.
EnableMarket bool
}

// CreateMarket creates a pool for a specific pair.
func (k sudoExtension) CreateMarket(
ctx sdk.Context,
args ArgsCreateMarket,
adminAccount sdk.AccAddress,
) error {
if err := k.SudoKeeper.CheckPermissions(adminAccount, ctx); err != nil {
return err
}

pair := args.Pair
market, err := k.GetMarket(ctx, pair)
if err == nil && market.Enabled {
Expand All @@ -92,10 +94,11 @@
baseReserve := sqrtDepth
if args.Market == nil {
market = types.DefaultMarket(pair)
market.Enabled = args.EnableMarket
} else {
market = *args.Market
}
market.Enabled = true

if err := market.Validate(); err != nil {
return err
}
Expand Down
Loading
Loading