Skip to content

Commit

Permalink
Merge branch 'master' into masih/dex-ibc-test
Browse files Browse the repository at this point in the history
  • Loading branch information
masihyeganeh authored Oct 14, 2024
2 parents 640ffb7 + 304abe8 commit 498ae17
Show file tree
Hide file tree
Showing 6 changed files with 323 additions and 0 deletions.
56 changes: 56 additions & 0 deletions x/asset/ft/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const (
ExtensionFundsFlag = "extension-funds"
ExtensionIssuanceMsgFlag = "extension-issuance-msg"
DEXUnifiedRefAmountFlag = "dex-unified-ref-amount"
DEXWhitelistedDenomsFlag = "dex-whitelisted-denoms"
)

// GetTxCmd returns the transaction commands for this module.
Expand Down Expand Up @@ -67,6 +68,7 @@ func GetTxCmd() *cobra.Command {
CmdTxUpgradeV1(),
CmdGrantAuthorization(),
CmdUpdateDEXUnifiedRefAmount(),
CmdUpdateDEXWhitelistedDenoms(),
)

return cmd
Expand Down Expand Up @@ -897,6 +899,60 @@ $ %s tx %s update-dex-unified-ref-amount ABC-%s 1000.5 --from [sender]
return cmd
}

// CmdUpdateDEXWhitelistedDenoms returns UpdateDEXWhitelistedDenoms cobra command.
func CmdUpdateDEXWhitelistedDenoms() *cobra.Command {
cmd := &cobra.Command{
Use: "update-dex-whitelisted-denoms [denom] --dex-whitelisted-denoms [dex-whitelisted-denoms] --from [sender]",
Args: cobra.ExactArgs(1),
Short: "Update DEX whitelisted denoms",
Long: strings.TrimSpace(
fmt.Sprintf(`Update DEX whitelisted denoms.
Example:
$ %s tx %s update-dex-whitelisted-denoms denom1 --dex-whitelisted-denoms denom2,denom3 --from [sender]
`,
version.AppName, types.ModuleName,
),
),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return errors.WithStack(err)
}

sender := clientCtx.GetFromAddress()
denom := args[0]
if err = sdk.ValidateDenom(denom); err != nil {
return sdkerrors.Wrap(err, "invalid denom")
}

whitelistedDenoms, err := cmd.Flags().GetStringSlice(DEXWhitelistedDenomsFlag)
if err != nil {
return errors.WithStack(err)
}

for _, whitelistedDenom := range whitelistedDenoms {
if err = sdk.ValidateDenom(whitelistedDenom); err != nil {
return sdkerrors.Wrapf(err, "invalid denom %s", whitelistedDenom)
}
}

msg := &types.MsgUpdateDEXWhitelistedDenoms{
Sender: sender.String(),
Denom: denom,
WhitelistedDenoms: whitelistedDenoms,
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}

//nolint:lll // breaking this down will make it look worse when printed to user screen.
cmd.Flags().StringSlice(DEXWhitelistedDenomsFlag, []string{}, "Denoms to add to be whitelisted to be traded with in DEX.")

flags.AddTxFlagsToCmd(cmd)

return cmd
}

func getExpireTime(cmd *cobra.Command) (*time.Time, error) {
exp, err := cmd.Flags().GetInt64(ExpirationFlag)
if err != nil {
Expand Down
76 changes: 76 additions & 0 deletions x/asset/ft/client/cli/tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,82 @@ func TestUpdateDEXUnifiedRefAmount(t *testing.T) {
}, resp.DEXSettings)
}

func TestUpdateDEXWhitelistedDenoms(t *testing.T) {
requireT := require.New(t)
networkCfg, err := config.NetworkConfigByChainID(constant.ChainIDDev)
requireT.NoError(err)
app.ChosenNetwork = networkCfg
testNetwork := network.New(t)

token := types.Token{
Symbol: "btc" + uuid.NewString()[:4],
Subunit: "satoshi" + uuid.NewString()[:4],
Precision: 8,
Description: "description",
Features: []types.Feature{
types.Feature_freezing,
types.Feature_ibc,
types.Feature_dex_whitelisted_denoms,
},
}

ctx := testNetwork.Validators[0].ClientCtx
initialAmount := sdkmath.NewInt(777)
denom := issue(requireT, ctx, token, initialAmount, nil, testNetwork)

newWhitelistedDenoms := []string{"denom1", "denom2"}
args := append([]string{
denom,
fmt.Sprintf("--%s=%s", cli.DEXWhitelistedDenomsFlag, strings.Join(newWhitelistedDenoms, ",")),
}, txValidator1Args(testNetwork)...)
_, err = coreumclitestutil.ExecTxCmd(ctx, testNetwork, cli.CmdUpdateDEXWhitelistedDenoms(), args)
requireT.NoError(err)

var resp types.QueryDEXSettingsResponse
coreumclitestutil.ExecQueryCmd(t, ctx, cli.CmdQueryDEXSettings(), []string{denom}, &resp)
requireT.Equal(types.DEXSettings{
WhitelistedDenoms: newWhitelistedDenoms,
}, resp.DEXSettings)
}

func TestUpdateDEXWhitelistedDenomsToEmptyList(t *testing.T) {
requireT := require.New(t)
networkCfg, err := config.NetworkConfigByChainID(constant.ChainIDDev)
requireT.NoError(err)
app.ChosenNetwork = networkCfg
testNetwork := network.New(t)

token := types.Token{
Symbol: "btc" + uuid.NewString()[:4],
Subunit: "satoshi" + uuid.NewString()[:4],
Precision: 8,
Description: "description",
Features: []types.Feature{
types.Feature_freezing,
types.Feature_ibc,
types.Feature_dex_whitelisted_denoms,
},
}

ctx := testNetwork.Validators[0].ClientCtx
initialAmount := sdkmath.NewInt(777)
denom := issue(requireT, ctx, token, initialAmount, nil, testNetwork)

newWhitelistedDenoms := []string{}
args := append([]string{
denom,
fmt.Sprintf("--%s=%s", cli.DEXWhitelistedDenomsFlag, ""),
}, txValidator1Args(testNetwork)...)
_, err = coreumclitestutil.ExecTxCmd(ctx, testNetwork, cli.CmdUpdateDEXWhitelistedDenoms(), args)
requireT.NoError(err)

var resp types.QueryDEXSettingsResponse
coreumclitestutil.ExecQueryCmd(t, ctx, cli.CmdQueryDEXSettings(), []string{denom}, &resp)
requireT.Equal(types.DEXSettings{
WhitelistedDenoms: newWhitelistedDenoms,
}, resp.DEXSettings)
}

func issue(
requireT *require.Assertions,
ctx client.Context,
Expand Down
37 changes: 37 additions & 0 deletions x/dex/client/cli/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func GetQueryCmd() *cobra.Command {
cmd.AddCommand(CmdQueryOrders())
cmd.AddCommand(CmdQueryOrderBooks())
cmd.AddCommand(CmdQueryOrderBookOrders())
cmd.AddCommand(CmdQueryAccountDenomOrdersCount())

return cmd
}
Expand Down Expand Up @@ -237,3 +238,39 @@ $ %[1]s query %s order-book-orders denom1 denom2 buy

return cmd
}

// CmdQueryAccountDenomOrdersCount returns the QueryAccountDenomOrdersCount cobra command.
func CmdQueryAccountDenomOrdersCount() *cobra.Command {
cmd := &cobra.Command{
Use: "account-denom-orders-count [account] [denom]",
Args: cobra.ExactArgs(2),
Short: "Query account denom orders count",
Long: strings.TrimSpace(
fmt.Sprintf(`Query account denom orders count.
Example:
$ %[1]s query %s account-denom-orders-count %s denom1
`,
version.AppName, types.ModuleName, constant.AddressSampleTest,
),
),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx := client.GetClientContextFromCmd(cmd)
queryClient := types.NewQueryClient(clientCtx)

res, err := queryClient.AccountDenomOrdersCount(cmd.Context(), &types.QueryAccountDenomOrdersCountRequest{
Account: args[0],
Denom: args[1],
})
if err != nil {
return err
}

return clientCtx.PrintProto(res)
},
}

flags.AddQueryFlagsToCmd(cmd)

return cmd
}
71 changes: 71 additions & 0 deletions x/dex/client/cli/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,74 @@ func TestCmdQueryOrderBooksAndOrders(t *testing.T) {
order1,
}, orderBookOrdersRes.Orders)
}

func TestCmdQueryAccountDenomOrdersCount(t *testing.T) {
requireT := require.New(t)
testNetwork := network.New(t)

ctx := testNetwork.Validators[0].ClientCtx
denom1 := issueFT(ctx, requireT, testNetwork, sdkmath.NewInt(1000))

var resp types.QueryParamsResponse
coreumclitestutil.ExecQueryCmd(t, ctx, cli.CmdQueryParams(), []string{}, &resp)

creator := validator1Address(testNetwork)
order1 := types.Order{
Creator: creator.String(),
Type: types.ORDER_TYPE_LIMIT,
ID: "id1",
BaseDenom: denom1,
QuoteDenom: denom2,
Price: lo.ToPtr(types.MustNewPriceFromString("123e-2")),
Quantity: sdkmath.NewInt(100),
Side: types.SIDE_SELL,
TimeInForce: types.TIME_IN_FORCE_GTC,
RemainingQuantity: sdkmath.NewInt(100),
RemainingBalance: sdkmath.NewInt(100),
Reserve: resp.Params.OrderReserve,
}
placeOrder(ctx, requireT, testNetwork, order1)

// check single order
var orderRes types.QueryOrderResponse
coreumclitestutil.ExecQueryCmd(
t, ctx, cli.CmdQueryOrder(), []string{creator.String(), order1.ID}, &orderRes,
)
requireT.Equal(order1, orderRes.Order)

// check order books
var orderBooksRes types.QueryOrderBooksResponse
coreumclitestutil.ExecQueryCmd(t, ctx, cli.CmdQueryOrderBooks(), []string{}, &orderBooksRes)
requireT.ElementsMatch([]types.OrderBookData{
{
BaseDenom: denom1,
QuoteDenom: denom2,
},
{
BaseDenom: denom2,
QuoteDenom: denom1,
},
}, orderBooksRes.OrderBooks)

order2 := types.Order{
Creator: creator.String(),
Type: types.ORDER_TYPE_LIMIT,
ID: "id2",
BaseDenom: denom1,
QuoteDenom: denom3,
Price: lo.ToPtr(types.MustNewPriceFromString("124e-2")),
Quantity: sdkmath.NewInt(100),
Side: types.SIDE_SELL,
TimeInForce: types.TIME_IN_FORCE_GTC,
RemainingQuantity: sdkmath.NewInt(100),
RemainingBalance: sdkmath.NewInt(100),
}
placeOrder(ctx, requireT, testNetwork, order2)

// check orders
var ordersRes types.QueryAccountDenomOrdersCountResponse
coreumclitestutil.ExecQueryCmd(
t, ctx, cli.CmdQueryAccountDenomOrdersCount(), []string{creator.String(), denom1}, &ordersRes,
)
requireT.Equal(uint64(2), ordersRes.Count)
}
42 changes: 42 additions & 0 deletions x/dex/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/samber/lo"
"github.com/spf13/cobra"

"github.com/CoreumFoundation/coreum/v5/pkg/config/constant"
"github.com/CoreumFoundation/coreum/v5/x/dex/types"
)

Expand Down Expand Up @@ -47,6 +48,7 @@ func GetTxCmd() *cobra.Command {
cmd.AddCommand(
CmdPlaceOrder(),
CmdCancelOrder(),
CmdCancelOrdersByDenom(),
)

return cmd
Expand Down Expand Up @@ -212,3 +214,43 @@ $ %s tx %s cancel-order id1 --from [sender]

return cmd
}

// CmdCancelOrdersByDenom returns CancelOrdersByDenom cobra command.
func CmdCancelOrdersByDenom() *cobra.Command {
cmd := &cobra.Command{
Use: "cancel-orders-by-denom [account] [denom] --from [sender]",
Args: cobra.ExactArgs(2),
Short: "Cancel orders by denom",
Long: strings.TrimSpace(
fmt.Sprintf(`Cancel orders by denom.
Example:
$ %s tx %s cancel-orders-by-denom %s denom1 --from [sender]
`,
version.AppName, types.ModuleName, constant.AddressSampleTest,
),
),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return errors.WithStack(err)
}

sender := clientCtx.GetFromAddress()
account := args[0]
denom := args[1]

msg := &types.MsgCancelOrdersByDenom{
Sender: sender.String(),
Account: account,
Denom: denom,
}

return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}

flags.AddTxFlagsToCmd(cmd)

return cmd
}
41 changes: 41 additions & 0 deletions x/dex/client/cli/tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,46 @@ func TestCmdCancelOrder(t *testing.T) {
requireT.NoError(err)
}

func TestCmdCancelOrdersByDenom(t *testing.T) {
requireT := require.New(t)
testNetwork := network.New(t)

ctx := testNetwork.Validators[0].ClientCtx
denom1 := issueFT(ctx, requireT, testNetwork, sdkmath.NewInt(100))
order := types.Order{
ID: "id1",
Type: types.ORDER_TYPE_LIMIT,
BaseDenom: denom1,
QuoteDenom: denom2,
Price: lo.ToPtr(types.MustNewPriceFromString("123e-2")),
Quantity: sdkmath.NewInt(100),
Side: types.SIDE_SELL,
TimeInForce: types.TIME_IN_FORCE_GTC,
}

placeOrder(ctx, requireT, testNetwork, order)

args := append(
[]string{
validator1Address(testNetwork).String(),
denom1,
}, txValidator1Args(testNetwork)...)
_, err := coreumclitestutil.ExecTxCmd(
ctx,
testNetwork,
cli.CmdCancelOrdersByDenom(),
args,
)
requireT.NoError(err)

// check orders
var ordersRes types.QueryAccountDenomOrdersCountResponse
coreumclitestutil.ExecQueryCmd(
t, ctx, cli.CmdQueryAccountDenomOrdersCount(), []string{validator1Address(testNetwork).String(), denom1}, &ordersRes,
)
requireT.Zero(ordersRes.Count)
}

func placeOrder(
ctx client.Context,
requireT *require.Assertions,
Expand Down Expand Up @@ -269,6 +309,7 @@ func issueFT(
}
features := []string{
assetfttypes.Feature_minting.String(),
assetfttypes.Feature_dex_order_cancellation.String(),
}

args = append(args, fmt.Sprintf("--%s=%s", assetftcli.FeaturesFlag, strings.Join(features, ",")))
Expand Down

0 comments on commit 498ae17

Please sign in to comment.