From ed68a47b55d7990edf7962372af1221f88b8d6e4 Mon Sep 17 00:00:00 2001 From: Dreamer <745124335@qq.com> Date: Tue, 11 Apr 2023 17:20:41 +0800 Subject: [PATCH] refactor: the cli only supports the main unit coin (#353) --- modules/token/client/cli/tx.go | 6 ++-- modules/token/client/cli/utils.go | 9 +++-- modules/token/keeper/keeper.go | 5 +++ modules/token/keeper/legacy_grpc_query.go | 43 +++++++++++++++++++++-- modules/token/module.go | 2 +- modules/token/types/v1/token.go | 16 +++------ modules/token/types/v1/token_test.go | 14 -------- 7 files changed, 60 insertions(+), 35 deletions(-) diff --git a/modules/token/client/cli/tx.go b/modules/token/client/cli/tx.go index 4c4890ec..74d8f038 100644 --- a/modules/token/client/cli/tx.go +++ b/modules/token/client/cli/tx.go @@ -229,7 +229,7 @@ func GetCmdMintToken() *cobra.Command { } } - coin, token, err := parseCoin(clientCtx, args[0]) + coin, token, err := parseMainCoin(clientCtx, args[0]) if err != nil { return err } @@ -292,7 +292,7 @@ func GetCmdBurnToken() *cobra.Command { return err } - coin, _, err := parseCoin(clientCtx, args[0]) + coin, _, err := parseMainCoin(clientCtx, args[0]) if err != nil { return err } @@ -392,7 +392,7 @@ func GetCmdSwapFeeToken() *cobra.Command { } } - coin, _, err := parseCoin(clientCtx, args[0]) + coin, _, err := parseMainCoin(clientCtx, args[0]) if err != nil { return err } diff --git a/modules/token/client/cli/utils.go b/modules/token/client/cli/utils.go index 565001c6..e8d5dde3 100644 --- a/modules/token/client/cli/utils.go +++ b/modules/token/client/cli/utils.go @@ -2,6 +2,7 @@ package cli import ( "context" + "fmt" "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" @@ -41,8 +42,8 @@ func queryToken(cliCtx client.Context, denom string) (v1.TokenI, error) { return evi, err } -func parseCoin(cliCtx client.Context, denom string) (sdk.Coin, v1.TokenI, error) { - decCoin, err := sdk.ParseDecCoin(denom) +func parseMainCoin(cliCtx client.Context, coinStr string) (sdk.Coin, v1.TokenI, error) { + decCoin, err := sdk.ParseDecCoin(coinStr) if err != nil { return sdk.Coin{}, nil, err } @@ -52,6 +53,10 @@ func parseCoin(cliCtx client.Context, denom string) (sdk.Coin, v1.TokenI, error) return sdk.Coin{}, nil, err } + if token.GetSymbol() != decCoin.Denom { + return sdk.Coin{}, nil, fmt.Errorf("the cli currently only supports the main unit: %s", token.GetSymbol()) + } + coin, err := token.ToMinCoin(decCoin) if err != nil { return sdk.Coin{}, nil, err diff --git a/modules/token/keeper/keeper.go b/modules/token/keeper/keeper.go index f16f01b5..2735c46c 100644 --- a/modules/token/keeper/keeper.go +++ b/modules/token/keeper/keeper.go @@ -50,6 +50,11 @@ func NewKeeper( } } +// Codec returns a k.cdc. +func (k Keeper) Codec() codec.Codec { + return k.cdc +} + // Logger returns a module-specific logger. func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("irismod/%s", types.ModuleName)) diff --git a/modules/token/keeper/legacy_grpc_query.go b/modules/token/keeper/legacy_grpc_query.go index 0ca8de78..fcd4c027 100644 --- a/modules/token/keeper/legacy_grpc_query.go +++ b/modules/token/keeper/legacy_grpc_query.go @@ -3,6 +3,12 @@ package keeper import ( "context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + v1 "github.com/irisnet/irismod/modules/token/types/v1" "github.com/irisnet/irismod/modules/token/types/v1beta1" ) @@ -11,13 +17,15 @@ var _ v1beta1.QueryServer = legacyQueryServer{} type legacyQueryServer struct { server v1.QueryServer + cdc codec.Codec } // NewLegacyQueryServer returns an implementation of the token QueryServer interface // for the provided Keeper. -func NewLegacyQueryServer(server v1.QueryServer) v1beta1.QueryServer { +func NewLegacyQueryServer(server v1.QueryServer, cdc codec.Codec) v1beta1.QueryServer { return &legacyQueryServer{ server: server, + cdc: cdc, } } @@ -28,7 +36,13 @@ func (q legacyQueryServer) Token(c context.Context, req *v1beta1.QueryTokenReque if err != nil { return nil, err } - return &v1beta1.QueryTokenResponse{Token: res.Token}, nil + + v1beta1Token, err := v1TokenToV1beta1(q.cdc, res.Token) + if err != nil { + return nil, err + } + + return &v1beta1.QueryTokenResponse{Token: v1beta1Token}, nil } func (q legacyQueryServer) Tokens(c context.Context, req *v1beta1.QueryTokensRequest) (*v1beta1.QueryTokensResponse, error) { @@ -39,7 +53,16 @@ func (q legacyQueryServer) Tokens(c context.Context, req *v1beta1.QueryTokensReq if err != nil { return nil, err } - return &v1beta1.QueryTokensResponse{Tokens: res.Tokens, Pagination: res.Pagination}, nil + + var tokens []*codectypes.Any + for _, token := range res.Tokens { + v1beta1Token, err := v1TokenToV1beta1(q.cdc, token) + if err != nil { + return nil, err + } + tokens = append(tokens, v1beta1Token) + } + return &v1beta1.QueryTokensResponse{Tokens: tokens, Pagination: res.Pagination}, nil } func (q legacyQueryServer) Fees(c context.Context, req *v1beta1.QueryFeesRequest) (*v1beta1.QueryFeesResponse, error) { @@ -82,3 +105,17 @@ func (q legacyQueryServer) TotalBurn(c context.Context, req *v1beta1.QueryTotalB BurnedCoins: res.BurnedCoins, }, nil } + +func v1TokenToV1beta1(cdc codec.Codec, v1token *codectypes.Any) (*codectypes.Any, error) { + var v1beta1Token v1beta1.Token + if err := cdc.Unmarshal(v1token.GetValue(), &v1beta1Token); err != nil { + return nil, err + } + + any, err := codectypes.NewAnyWithValue(&v1beta1Token) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return any, nil +} diff --git a/modules/token/module.go b/modules/token/module.go index 9fc5bd6e..c22331c7 100644 --- a/modules/token/module.go +++ b/modules/token/module.go @@ -118,7 +118,7 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { v1.RegisterQueryServer(cfg.QueryServer(), am.keeper) v1beta1.RegisterMsgServer(cfg.MsgServer(), keeper.NewLegacyMsgServerImpl(v1MsgServer, am.keeper)) - v1beta1.RegisterQueryServer(cfg.QueryServer(), keeper.NewLegacyQueryServer(am.keeper)) + v1beta1.RegisterQueryServer(cfg.QueryServer(), keeper.NewLegacyQueryServer(am.keeper, am.keeper.Codec())) } diff --git a/modules/token/types/v1/token.go b/modules/token/types/v1/token.go index 9c466d5d..c0734369 100644 --- a/modules/token/types/v1/token.go +++ b/modules/token/types/v1/token.go @@ -111,12 +111,8 @@ func (t Token) GetOwner() sdk.AccAddress { // ToMainCoin returns the main denom coin from args func (t Token) ToMainCoin(coin sdk.Coin) (sdk.DecCoin, error) { - if t.Symbol != coin.Denom && t.MinUnit != coin.Denom { - return sdk.NewDecCoinFromDec(coin.Denom, sdk.ZeroDec()), sdkerrors.Wrapf(tokentypes.ErrTokenNotExists, "token not match") - } - - if t.Symbol == coin.Denom { - return sdk.NewDecCoin(coin.Denom, coin.Amount), nil + if t.MinUnit != coin.Denom { + return sdk.NewDecCoinFromDec(coin.Denom, sdk.ZeroDec()), sdkerrors.Wrapf(tokentypes.ErrTokenNotExists, "not the token min_unit") } precision := new(big.Int).Exp(tenInt, big.NewInt(int64(t.Scale)), nil) @@ -127,12 +123,8 @@ func (t Token) ToMainCoin(coin sdk.Coin) (sdk.DecCoin, error) { // ToMinCoin returns the min denom coin from args func (t Token) ToMinCoin(coin sdk.DecCoin) (newCoin sdk.Coin, err error) { - if t.Symbol != coin.Denom && t.MinUnit != coin.Denom { - return sdk.NewCoin(coin.Denom, sdk.ZeroInt()), sdkerrors.Wrapf(tokentypes.ErrTokenNotExists, "token not match") - } - - if t.MinUnit == coin.Denom { - return sdk.NewCoin(coin.Denom, coin.Amount.TruncateInt()), nil + if t.Symbol != coin.Denom { + return sdk.NewCoin(coin.Denom, sdk.ZeroInt()), sdkerrors.Wrapf(tokentypes.ErrTokenNotExists, "not the token symbol") } precision := new(big.Int).Exp(tenInt, big.NewInt(int64(t.Scale)), nil) diff --git a/modules/token/types/v1/token_test.go b/modules/token/types/v1/token_test.go index c9fbaaf4..b8374ef5 100644 --- a/modules/token/types/v1/token_test.go +++ b/modules/token/types/v1/token_test.go @@ -52,13 +52,6 @@ func TestToken_ToMinCoin(t *testing.T) { want: sdk.NewCoin(token.MinUnit, sdk.NewInt(10)), success: (i == 0), }, - { - name: fmt.Sprintf("Min Coin to Min Coin Success,scale=%d", i), - wantErr: false, - args: args{coin: sdk.NewDecCoin(token.MinUnit, sdk.NewInt(10))}, - want: sdk.NewCoin(token.MinUnit, sdk.NewInt(10)), - success: true, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -94,13 +87,6 @@ func TestToken_ToMainCoin(t *testing.T) { wantErr bool success bool }{ - { - name: "Main Coin to Main Coin", - wantErr: false, - args: args{coin: sdk.NewCoin(token.Symbol, sdk.NewInt(10))}, - want: sdk.NewInt64DecCoin(token.Symbol, 10), - success: true, - }, { name: "Min Coin to Main Coin Failed", wantErr: false,