package keeper_test
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/cybercongress/go-cyber/v7/app/apptesting"
"github.com/cybercongress/go-cyber/v7/x/tokenfactory/types"
)
func (suite *KeeperTestSuite) TestMsgCreateDenom() {
var (
tokenFactoryKeeper = suite.App.AppKeepers.TokenFactoryKeeper
bankKeeper = suite.App.AppKeepers.BankKeeper
denomCreationFee = tokenFactoryKeeper.GetParams(suite.Ctx).DenomCreationFee
)
preCreateBalance := bankKeeper.GetBalance(suite.Ctx, suite.TestAccs[0], denomCreationFee[0].Denom)
res, err := suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom(suite.TestAccs[0].String(), "bitcoin"))
suite.Require().NoError(err)
suite.Require().NotEmpty(res.GetNewTokenDenom())
queryRes, err := suite.queryClient.DenomAuthorityMetadata(suite.Ctx.Context(), &types.QueryDenomAuthorityMetadataRequest{
Denom: res.GetNewTokenDenom(),
})
suite.Require().NoError(err)
suite.Require().Equal(suite.TestAccs[0].String(), queryRes.AuthorityMetadata.Admin)
bankQueryRes, err := suite.bankQueryClient.DenomMetadata(suite.Ctx.Context(), &banktypes.QueryDenomMetadataRequest{
Denom: res.GetNewTokenDenom(),
})
suite.Require().NoError(err)
suite.Require().NoError(bankQueryRes.Metadata.Validate())
postCreateBalance := bankKeeper.GetBalance(suite.Ctx, suite.TestAccs[0], tokenFactoryKeeper.GetParams(suite.Ctx).DenomCreationFee[0].Denom)
suite.Require().True(preCreateBalance.Sub(postCreateBalance).IsEqual(denomCreationFee[0]))
_, err = suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom(suite.TestAccs[0].String(), "bitcoin"))
suite.Require().Error(err)
res, err = suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom(suite.TestAccs[0].String(), "litecoin"))
suite.Require().NoError(err)
suite.Require().NotEmpty(res.GetNewTokenDenom())
queryRes2, err := suite.queryClient.DenomsFromCreator(suite.Ctx.Context(), &types.QueryDenomsFromCreatorRequest{
Creator: suite.TestAccs[0].String(),
})
suite.Require().NoError(err)
suite.Require().Len(queryRes2.Denoms, 2)
res, err = suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom(suite.TestAccs[1].String(), "bitcoin"))
suite.Require().NoError(err)
suite.Require().NotEmpty(res.GetNewTokenDenom())
_, err = suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom("osmosis.eth/creator", "bitcoin"))
suite.Require().Error(err)
}
func (suite *KeeperTestSuite) TestCreateDenom() {
var (
primaryDenom = types.DefaultParams().DenomCreationFee[0].Denom
secondaryDenom = apptesting.SecondaryDenom
defaultDenomCreationFee = types.Params{DenomCreationFee: sdk.NewCoins(sdk.NewCoin(primaryDenom, sdk.NewInt(50000000)))}
twoDenomCreationFee = types.Params{DenomCreationFee: sdk.NewCoins(sdk.NewCoin(primaryDenom, sdk.NewInt(50000000)), sdk.NewCoin(secondaryDenom, sdk.NewInt(50000000)))}
nilCreationFee = types.Params{DenomCreationFee: nil}
largeCreationFee = types.Params{DenomCreationFee: sdk.NewCoins(sdk.NewCoin(primaryDenom, sdk.NewInt(5000000000)))}
)
for _, tc := range []struct {
desc string
denomCreationFee types.Params
setup func()
subdenom string
valid bool
}{
{
desc: "subdenom too long",
denomCreationFee: defaultDenomCreationFee,
subdenom: "assadsadsadasdasdsadsadsadsadsadsadsklkadaskkkdasdasedskhanhassyeunganassfnlksdflksafjlkasd",
valid: false,
},
{
desc: "subdenom and creator pair already exists",
denomCreationFee: defaultDenomCreationFee,
setup: func() {
_, err := suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom(suite.TestAccs[0].String(), "bitcoin"))
suite.Require().NoError(err)
},
subdenom: "bitcoin",
valid: false,
},
{
desc: "success case: defaultDenomCreationFee",
denomCreationFee: defaultDenomCreationFee,
subdenom: "evmos",
valid: true,
},
{
desc: "success case: twoDenomCreationFee",
denomCreationFee: twoDenomCreationFee,
subdenom: "catcoin",
valid: true,
},
{
desc: "success case: nilCreationFee",
denomCreationFee: nilCreationFee,
subdenom: "czcoin",
valid: true,
},
{
desc: "account doesn't have enough to pay for denom creation fee",
denomCreationFee: largeCreationFee,
subdenom: "tooexpensive",
valid: false,
},
{
desc: "subdenom having invalid characters",
denomCreationFee: defaultDenomCreationFee,
subdenom: "bit/***///&&&/coin",
valid: false,
},
} {
suite.SetupTest()
suite.Run(fmt.Sprintf("Case %s", tc.desc), func() {
if tc.setup != nil {
tc.setup()
}
tokenFactoryKeeper := suite.App.AppKeepers.TokenFactoryKeeper
bankKeeper := suite.App.AppKeepers.BankKeeper
if err := tokenFactoryKeeper.SetParams(suite.Ctx, tc.denomCreationFee); err != nil {
suite.Require().NoError(err)
}
denomCreationFee := tokenFactoryKeeper.GetParams(suite.Ctx).DenomCreationFee
suite.Require().Equal(tc.denomCreationFee.DenomCreationFee, denomCreationFee)
preCreateBalance := bankKeeper.GetBalance(suite.Ctx, suite.TestAccs[0], "stake")
res, err := suite.msgServer.CreateDenom(sdk.WrapSDKContext(suite.Ctx), types.NewMsgCreateDenom(suite.TestAccs[0].String(), tc.subdenom))
postCreateBalance := bankKeeper.GetBalance(suite.Ctx, suite.TestAccs[0], "stake")
if tc.valid {
suite.Require().NoError(err)
if denomCreationFee != nil {
suite.Require().True(preCreateBalance.Sub(postCreateBalance).IsEqual(denomCreationFee[0]))
}
queryRes, err := suite.queryClient.DenomAuthorityMetadata(suite.Ctx.Context(), &types.QueryDenomAuthorityMetadataRequest{
Denom: res.GetNewTokenDenom(),
})
suite.Require().NoError(err)
suite.Require().Equal(suite.TestAccs[0].String(), queryRes.AuthorityMetadata.Admin)
} else {
suite.Require().Error(err)
suite.Require().True(preCreateBalance.IsEqual(postCreateBalance))
}
})
}
}