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 }