Skip to content

Commit

Permalink
feat(x/tx): API improvements (#15871)
Browse files Browse the repository at this point in the history
  • Loading branch information
kocubinski committed Apr 25, 2023
1 parent e3860ac commit 7041af0
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 6 deletions.
19 changes: 17 additions & 2 deletions x/tx/signing/handler_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,27 @@ import (
// based on sign mode.
type HandlerMap struct {
signModeHandlers map[signingv1beta1.SignMode]SignModeHandler
defaultMode signingv1beta1.SignMode
modes []signingv1beta1.SignMode
}

// NewHandlerMap constructs a new sign mode handler map.
// NewHandlerMap constructs a new sign mode handler map. The first handler is used as the default.
func NewHandlerMap(handlers ...SignModeHandler) *HandlerMap {
if len(handlers) == 0 {
panic("no handlers")
}
res := &HandlerMap{
signModeHandlers: map[signingv1beta1.SignMode]SignModeHandler{},
}

for _, handler := range handlers {
for i, handler := range handlers {
if handler == nil {
panic("nil handler")
}
mode := handler.Mode()
if i == 0 {
res.defaultMode = mode
}
res.signModeHandlers[mode] = handler
res.modes = append(res.modes, mode)
}
Expand All @@ -34,6 +44,11 @@ func (h *HandlerMap) SupportedModes() []signingv1beta1.SignMode {
return h.modes
}

// DefaultMode returns the default mode for this handler map.
func (h *HandlerMap) DefaultMode() signingv1beta1.SignMode {
return h.defaultMode
}

// GetSignBytes returns the sign bytes for the transaction for the requested mode.
func (h *HandlerMap) GetSignBytes(ctx context.Context, signMode signingv1beta1.SignMode, signerData SignerData, txData TxData) ([]byte, error) {
handler, ok := h.signModeHandlers[signMode]
Expand Down
50 changes: 50 additions & 0 deletions x/tx/signing/handler_map_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package signing_test

import (
"context"
"testing"

"github.com/stretchr/testify/require"

signingv1beta1 "cosmossdk.io/api/cosmos/tx/signing/v1beta1"
"cosmossdk.io/x/tx/signing"
)

var (
_ signing.SignModeHandler = directHandler{}
_ signing.SignModeHandler = aminoJSONHandler{}
)

type directHandler struct{}

func (s directHandler) Mode() signingv1beta1.SignMode {
return signingv1beta1.SignMode_SIGN_MODE_DIRECT
}

func (s directHandler) GetSignBytes(_ context.Context, _ signing.SignerData, _ signing.TxData) ([]byte, error) {
panic("not implemented")
}

type aminoJSONHandler struct{}

func (s aminoJSONHandler) Mode() signingv1beta1.SignMode {
return signingv1beta1.SignMode_SIGN_MODE_LEGACY_AMINO_JSON
}

func (s aminoJSONHandler) GetSignBytes(_ context.Context, _ signing.SignerData, _ signing.TxData) ([]byte, error) {
panic("not implemented")
}

func TestNewHandlerMap(t *testing.T) {
require.PanicsWithValue(t, "nil handler", func() {
signing.NewHandlerMap(nil)
})
require.PanicsWithValue(t, "no handlers", func() {
signing.NewHandlerMap()
})
dh := directHandler{}
ah := aminoJSONHandler{}
handlerMap := signing.NewHandlerMap(dh, aminoJSONHandler{})
require.Equal(t, dh.Mode(), handlerMap.DefaultMode())
require.NotEqual(t, ah.Mode(), handlerMap.DefaultMode())
}
10 changes: 6 additions & 4 deletions x/tx/signing/textual/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,19 @@ import (
"fmt"
"reflect"

signingv1beta1 "cosmossdk.io/api/cosmos/tx/signing/v1beta1"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/types/known/anypb"
"google.golang.org/protobuf/types/known/durationpb"
"google.golang.org/protobuf/types/known/timestamppb"

signingv1beta1 "cosmossdk.io/api/cosmos/tx/signing/v1beta1"

cosmos_proto "github.com/cosmos/cosmos-proto"

bankv1beta1 "cosmossdk.io/api/cosmos/bank/v1beta1"
basev1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
cosmos_proto "github.com/cosmos/cosmos-proto"

"cosmossdk.io/x/tx/signing"
"cosmossdk.io/x/tx/signing/textual/internal/textualpb"
Expand All @@ -41,7 +43,7 @@ type SignModeOptions struct {

// FileResolver are the protobuf files to use for resolving message
// descriptors. If it is nil, the global protobuf registry will be used.
FileResolver *protoregistry.Files
FileResolver signing.ProtoFileResolver

// TypeResolver are the protobuf type resolvers to use for resolving message
// types. If it is nil, then a dynamicpb will be used on top of FileResolver.
Expand All @@ -51,7 +53,7 @@ type SignModeOptions struct {
// SignModeHandler holds the configuration for dispatching
// to specific value renderers for SIGN_MODE_TEXTUAL.
type SignModeHandler struct {
fileResolver *protoregistry.Files
fileResolver signing.ProtoFileResolver
typeResolver protoregistry.MessageTypeResolver
coinMetadataQuerier CoinMetadataQueryFn
// scalars defines a registry for Cosmos scalars.
Expand Down

0 comments on commit 7041af0

Please sign in to comment.