github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/tx/direct_aux.go (about)

     1  package tx
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	errorsmod "cosmossdk.io/errors"
     8  
     9  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    10  	sdk "github.com/cosmos/cosmos-sdk/types"
    11  	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
    12  	types "github.com/cosmos/cosmos-sdk/types/tx"
    13  	signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
    14  	"github.com/cosmos/cosmos-sdk/x/auth/signing"
    15  )
    16  
    17  var _ signing.SignModeHandler = signModeDirectAuxHandler{}
    18  
    19  // signModeDirectAuxHandler defines the SIGN_MODE_DIRECT_AUX SignModeHandler
    20  type signModeDirectAuxHandler struct{}
    21  
    22  // DefaultMode implements SignModeHandler.DefaultMode
    23  func (signModeDirectAuxHandler) DefaultMode() signingtypes.SignMode {
    24  	return signingtypes.SignMode_SIGN_MODE_DIRECT_AUX
    25  }
    26  
    27  // Modes implements SignModeHandler.Modes
    28  func (signModeDirectAuxHandler) Modes() []signingtypes.SignMode {
    29  	return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT_AUX}
    30  }
    31  
    32  // GetSignBytes implements SignModeHandler.GetSignBytes
    33  func (signModeDirectAuxHandler) GetSignBytes(
    34  	mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx,
    35  ) ([]byte, error) {
    36  	if mode != signingtypes.SignMode_SIGN_MODE_DIRECT_AUX {
    37  		return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, mode)
    38  	}
    39  
    40  	protoTx, ok := tx.(*wrapper)
    41  	if !ok {
    42  		return nil, fmt.Errorf("can only handle a protobuf Tx, got %T", tx)
    43  	}
    44  
    45  	pkAny, err := codectypes.NewAnyWithValue(data.PubKey)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  
    50  	addr := data.Address
    51  	if addr == "" {
    52  		return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "got empty address in %s handler", signingtypes.SignMode_SIGN_MODE_DIRECT_AUX)
    53  	}
    54  
    55  	feePayer := protoTx.FeePayer()
    56  
    57  	// Fee payer cannot use SIGN_MODE_DIRECT_AUX, because SIGN_MODE_DIRECT_AUX
    58  	// does not sign over fees, which would create malleability issues.
    59  	if strings.EqualFold(sdk.AccAddress(feePayer).String(), data.Address) {
    60  		return nil, sdkerrors.ErrUnauthorized.Wrapf("fee payer %s cannot sign with %s", sdk.AccAddress(feePayer).String(), signingtypes.SignMode_SIGN_MODE_DIRECT_AUX)
    61  	}
    62  
    63  	signDocDirectAux := types.SignDocDirectAux{
    64  		BodyBytes:     protoTx.getBodyBytes(),
    65  		ChainId:       data.ChainID,
    66  		AccountNumber: data.AccountNumber,
    67  		Sequence:      data.Sequence,
    68  		Tip:           protoTx.tx.AuthInfo.Tip,
    69  		PublicKey:     pkAny,
    70  	}
    71  
    72  	return signDocDirectAux.Marshal()
    73  }