diff --git a/client/tx_config.go b/client/tx_config.go index 6992a7a2402d..70cc4862a9c2 100644 --- a/client/tx_config.go +++ b/client/tx_config.go @@ -1,6 +1,8 @@ package client import ( + gogogrpc "github.com/gogo/protobuf/grpc" + sdk "github.com/cosmos/cosmos-sdk/types" signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/signing" @@ -34,6 +36,7 @@ type ( // signatures, and provide canonical bytes to sign over. The transaction must // also know how to encode itself. TxBuilder interface { + gogogrpc.ClientConn GetTx() signing.Tx SetMsgs(msgs ...sdk.Msg) error diff --git a/x/auth/legacy/legacytx/msg_service.go b/x/auth/legacy/legacytx/msg_service.go new file mode 100644 index 000000000000..7827f1d528fd --- /dev/null +++ b/x/auth/legacy/legacytx/msg_service.go @@ -0,0 +1,40 @@ +package legacytx + +import ( + gocontext "context" + "fmt" + + "google.golang.org/grpc" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +// Invoke implements the grpc ClientConn.Invoke method. This is so that we can +// use ADR-031 service `Msg`s with StdTxBuilder. Invoking this method will +// **append** the service Msg into the TxBuilder's Msgs array. +// TODO Full amino support still needs to be added as part of https://github.com/cosmos/cosmos-sdk/issues/7541. +func (s *StdTxBuilder) Invoke(_ gocontext.Context, method string, args, reply interface{}, _ ...grpc.CallOption) error { + req, ok := args.(sdk.MsgRequest) + if !ok { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "%T should implement %T", args, (*sdk.MsgRequest)(nil)) + } + + err := req.ValidateBasic() + if err != nil { + return err + } + + msgs := append(s.Msgs, sdk.ServiceMsg{ + MethodName: method, + Request: req, + }) + s.SetMsgs(msgs...) + + return nil +} + +// NewStream implements the grpc ClientConn.NewStream method. +func (s *StdTxBuilder) NewStream(gocontext.Context, *grpc.StreamDesc, string, ...grpc.CallOption) (grpc.ClientStream, error) { + return nil, fmt.Errorf("not supported") +} diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index 18a555f9099e..9138e1893301 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -193,6 +193,7 @@ func (w *wrapper) GetSignaturesV2() ([]signing.SignatureV2, error) { return res, nil } +// SetMsgs implemented the TxBuilder.SetMsgs method. func (w *wrapper) SetMsgs(msgs ...sdk.Msg) error { anys := make([]*codectypes.Any, len(msgs)) diff --git a/x/auth/tx/msg_service.go b/x/auth/tx/msg_service.go new file mode 100644 index 000000000000..94e9f661063c --- /dev/null +++ b/x/auth/tx/msg_service.go @@ -0,0 +1,39 @@ +package tx + +import ( + gocontext "context" + "fmt" + + "google.golang.org/grpc" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +// Invoke implements the grpc ClientConn.Invoke method. This is so that we can +// use ADR-031 service `Msg`s with wrapper. Invoking this method will +// **append** the service Msg into the TxBuilder's Msgs array. +func (w *wrapper) Invoke(_ gocontext.Context, method string, args, reply interface{}, _ ...grpc.CallOption) error { + req, ok := args.(sdk.MsgRequest) + if !ok { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "%T should implement %T", args, (*sdk.MsgRequest)(nil)) + } + + err := req.ValidateBasic() + if err != nil { + return err + } + + msgs := append(w.GetMsgs(), sdk.ServiceMsg{ + MethodName: method, + Request: req, + }) + w.SetMsgs(msgs...) + + return nil +} + +// NewStream implements the grpc ClientConn.NewStream method. +func (w *wrapper) NewStream(gocontext.Context, *grpc.StreamDesc, string, ...grpc.CallOption) (grpc.ClientStream, error) { + return nil, fmt.Errorf("not supported") +}