From cdd40d9b8353bf47d3dd084b951ec099a1425f91 Mon Sep 17 00:00:00 2001 From: javiersuweijie Date: Tue, 27 Feb 2024 10:12:14 +0800 Subject: [PATCH 1/3] fix: bank msg server interface error --- custom/bank/keeper/msg_server.go | 124 +++++++++++++++++++++++++++++++ custom/bank/module.go | 15 ++-- 2 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 custom/bank/keeper/msg_server.go diff --git a/custom/bank/keeper/msg_server.go b/custom/bank/keeper/msg_server.go new file mode 100644 index 00000000..3446b910 --- /dev/null +++ b/custom/bank/keeper/msg_server.go @@ -0,0 +1,124 @@ +package keeper + +import ( + "context" + "cosmossdk.io/core/address" + errorsmod "cosmossdk.io/errors" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + "github.com/cosmos/cosmos-sdk/telemetry" + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/hashicorp/go-metrics" +) + +type msgServer struct { + types.MsgServer + + keeper bankkeeper.Keeper + addressCodec address.Codec +} + +var _ types.MsgServer = msgServer{} + +func NewMsgServerImpl(keeper Keeper, addressCodec address.Codec) types.MsgServer { + return &msgServer{ + MsgServer: bankkeeper.NewMsgServerImpl(keeper), + keeper: keeper, + addressCodec: addressCodec, + } +} + +func (k msgServer) Send(goCtx context.Context, msg *types.MsgSend) (*types.MsgSendResponse, error) { + + from, err := k.addressCodec.StringToBytes(msg.FromAddress) + if err != nil { + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid from address: %s", err) + } + to, err := k.addressCodec.StringToBytes(msg.ToAddress) + if err != nil { + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid to address: %s", err) + } + + if !msg.Amount.IsValid() { + return nil, errorsmod.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) + } + + if !msg.Amount.IsAllPositive() { + return nil, errorsmod.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := k.keeper.IsSendEnabledCoins(ctx, msg.Amount...); err != nil { + return nil, err + } + + if k.keeper.BlockedAddr(to) { + return nil, errorsmod.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", msg.ToAddress) + } + + err = k.keeper.SendCoins(ctx, from, to, msg.Amount) + if err != nil { + return nil, err + } + + defer func() { + for _, a := range msg.Amount { + if a.Amount.IsInt64() { + telemetry.SetGaugeWithLabels( + []string{"tx", "msg", "send"}, + float32(a.Amount.Int64()), + []metrics.Label{telemetry.NewLabel("denom", a.Denom)}, + ) + } + } + }() + + return &types.MsgSendResponse{}, nil +} + +func (k msgServer) MultiSend(goCtx context.Context, msg *types.MsgMultiSend) (*types.MsgMultiSendResponse, error) { + if len(msg.Inputs) == 0 { + return nil, types.ErrNoInputs + } + + if len(msg.Inputs) != 1 { + return nil, types.ErrMultipleSenders + } + + if len(msg.Outputs) == 0 { + return nil, types.ErrNoOutputs + } + + if err := types.ValidateInputOutputs(msg.Inputs[0], msg.Outputs); err != nil { + return nil, err + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + // NOTE: totalIn == totalOut should already have been checked + for _, in := range msg.Inputs { + if err := k.keeper.IsSendEnabledCoins(ctx, in.Coins...); err != nil { + return nil, err + } + } + + for _, out := range msg.Outputs { + accAddr, err := k.addressCodec.StringToBytes(out.Address) + if err != nil { + return nil, err + } + + if k.keeper.BlockedAddr(accAddr) { + return nil, errorsmod.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", out.Address) + } + } + + err := k.keeper.InputOutputCoins(ctx, msg.Inputs[0], msg.Outputs) + if err != nil { + return nil, err + } + + return &types.MsgMultiSendResponse{}, nil +} diff --git a/custom/bank/module.go b/custom/bank/module.go index 95a6bf93..fc703c62 100644 --- a/custom/bank/module.go +++ b/custom/bank/module.go @@ -1,6 +1,7 @@ package bank import ( + "cosmossdk.io/core/address" "fmt" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" @@ -20,17 +21,19 @@ import ( // It modifies the TotalSupply and SupplyOf GRPC queries type AppModule struct { bankmodule.AppModule - keeper custombankkeeper.Keeper - subspace exported.Subspace + keeper custombankkeeper.Keeper + subspace exported.Subspace + addressCodec address.Codec } // NewAppModule creates a new AppModule object func NewAppModule(cdc codec.Codec, keeper custombankkeeper.Keeper, accountKeeper types.AccountKeeper, ss exported.Subspace) AppModule { bankModule := bankmodule.NewAppModule(cdc, keeper, accountKeeper, ss) return AppModule{ - AppModule: bankModule, - keeper: keeper, - subspace: ss, + AppModule: bankModule, + keeper: keeper, + subspace: ss, + addressCodec: accountKeeper.AddressCodec(), } } @@ -38,7 +41,7 @@ func NewAppModule(cdc codec.Codec, keeper custombankkeeper.Keeper, accountKeeper // NOTE: Overriding this method as not doing so will cause a panic // when trying to force this custom keeper into a bankkeeper.BaseKeeper func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterMsgServer(cfg.MsgServer(), bankkeeper.NewMsgServerImpl(am.keeper)) + types.RegisterMsgServer(cfg.MsgServer(), custombankkeeper.NewMsgServerImpl(am.keeper, am.addressCodec)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) m := bankkeeper.NewMigrator(am.keeper.BaseKeeper, am.subspace) From f65c567e4ca2becdbd0228cd3a9a3e0fa573b0dc Mon Sep 17 00:00:00 2001 From: javiersuweijie Date: Tue, 27 Feb 2024 13:21:31 +0800 Subject: [PATCH 2/3] fix: lint --- custom/bank/keeper/msg_server.go | 2 +- custom/bank/module.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/custom/bank/keeper/msg_server.go b/custom/bank/keeper/msg_server.go index 3446b910..49fdeccc 100644 --- a/custom/bank/keeper/msg_server.go +++ b/custom/bank/keeper/msg_server.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "cosmossdk.io/core/address" errorsmod "cosmossdk.io/errors" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -31,7 +32,6 @@ func NewMsgServerImpl(keeper Keeper, addressCodec address.Codec) types.MsgServer } func (k msgServer) Send(goCtx context.Context, msg *types.MsgSend) (*types.MsgSendResponse, error) { - from, err := k.addressCodec.StringToBytes(msg.FromAddress) if err != nil { return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid from address: %s", err) diff --git a/custom/bank/module.go b/custom/bank/module.go index fc703c62..94195e2e 100644 --- a/custom/bank/module.go +++ b/custom/bank/module.go @@ -1,9 +1,10 @@ package bank import ( - "cosmossdk.io/core/address" "fmt" + "cosmossdk.io/core/address" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/codec" From e21a78b55e7e9f858ab280f7874f61bd1521d56d Mon Sep 17 00:00:00 2001 From: javiersuweijie Date: Tue, 27 Feb 2024 16:25:05 +0800 Subject: [PATCH 3/3] fix: val addr not valid --- cmd/allianced/cmd/testnet.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/allianced/cmd/testnet.go b/cmd/allianced/cmd/testnet.go index c5d601e0..333cc0dc 100644 --- a/cmd/allianced/cmd/testnet.go +++ b/cmd/allianced/cmd/testnet.go @@ -296,10 +296,11 @@ func initTestnetFiles( genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}) genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) + valAddr := sdk.ValAddress(addr) valTokens := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) createValMsg, err := stakingtypes.NewMsgCreateValidator( - addr.String(), + valAddr.String(), valPubKeys[i], sdk.NewCoin(sdk.DefaultBondDenom, valTokens), stakingtypes.NewDescription(nodeDirName, "", "", "", ""),