github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/tx/direct_aux_test.go (about) 1 package tx 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/cosmos/cosmos-sdk/codec" 10 "github.com/cosmos/cosmos-sdk/codec/testutil" 11 codectypes "github.com/cosmos/cosmos-sdk/codec/types" 12 "github.com/cosmos/cosmos-sdk/testutil/testdata" 13 sdk "github.com/cosmos/cosmos-sdk/types" 14 txtypes "github.com/cosmos/cosmos-sdk/types/tx" 15 signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" 16 "github.com/cosmos/cosmos-sdk/x/auth/signing" 17 ) 18 19 func TestDirectAuxHandler(t *testing.T) { 20 privKey, pubkey, addr := testdata.KeyTestPubAddr() 21 _, feePayerPubKey, feePayerAddr := testdata.KeyTestPubAddr() 22 interfaceRegistry := testutil.CodecOptions{}.NewInterfaceRegistry() 23 interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) 24 marshaler := codec.NewProtoCodec(interfaceRegistry) 25 26 txConfig := NewTxConfig(marshaler, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT_AUX}) 27 txBuilder := txConfig.NewTxBuilder() 28 29 chainID := "test-chain" 30 memo := "sometestmemo" 31 msgs := []sdk.Msg{testdata.NewTestMsg(addr)} 32 accNum, accSeq := uint64(1), uint64(2) // Arbitrary account number/sequence 33 34 any, err := codectypes.NewAnyWithValue(pubkey) 35 require.NoError(t, err) 36 37 sigData := &signingtypes.SingleSignatureData{ 38 SignMode: signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, 39 } 40 41 sig := signingtypes.SignatureV2{ 42 PubKey: pubkey, 43 Data: sigData, 44 Sequence: accSeq, 45 } 46 feePayerSig := signingtypes.SignatureV2{ 47 PubKey: feePayerPubKey, 48 Data: sigData, 49 Sequence: accSeq, 50 } 51 52 fee := txtypes.Fee{Amount: sdk.NewCoins(sdk.NewInt64Coin("atom", 150)), GasLimit: 20000} 53 54 err = txBuilder.SetMsgs(msgs...) 55 require.NoError(t, err) 56 txBuilder.SetMemo(memo) 57 txBuilder.SetFeeAmount(fee.Amount) 58 txBuilder.SetFeePayer(feePayerAddr) 59 txBuilder.SetGasLimit(fee.GasLimit) 60 61 err = txBuilder.SetSignatures(sig, feePayerSig) 62 require.NoError(t, err) 63 64 signingData := signing.SignerData{ 65 Address: addr.String(), 66 ChainID: chainID, 67 AccountNumber: accNum, 68 Sequence: accSeq, 69 PubKey: pubkey, 70 } 71 feePayerSigningData := signing.SignerData{ 72 Address: feePayerAddr.String(), 73 ChainID: chainID, 74 AccountNumber: accNum, 75 Sequence: accSeq, 76 PubKey: feePayerPubKey, 77 } 78 79 modeHandler := signModeDirectAuxHandler{} 80 81 t.Log("verify fee payer cannot use SIGN_MODE_DIRECT_AUX") 82 _, err = modeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, feePayerSigningData, txBuilder.GetTx()) 83 require.EqualError(t, err, fmt.Sprintf("fee payer %s cannot sign with %s: unauthorized", feePayerAddr.String(), signingtypes.SignMode_SIGN_MODE_DIRECT_AUX)) 84 85 t.Log("verify GetSignBytes with generating sign bytes by marshaling signDocDirectAux") 86 signBytes, err := modeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, signingData, txBuilder.GetTx()) 87 require.NoError(t, err) 88 require.NotNil(t, signBytes) 89 90 anys := make([]*codectypes.Any, len(msgs)) 91 for i, msg := range msgs { 92 var err error 93 anys[i], err = codectypes.NewAnyWithValue(msg) 94 if err != nil { 95 panic(err) 96 } 97 } 98 99 txBody := &txtypes.TxBody{ 100 Memo: memo, 101 Messages: anys, 102 } 103 bodyBytes := marshaler.MustMarshal(txBody) 104 105 signDocDirectAux := txtypes.SignDocDirectAux{ 106 AccountNumber: accNum, 107 BodyBytes: bodyBytes, 108 ChainId: "test-chain", 109 PublicKey: any, 110 Sequence: accSeq, 111 } 112 113 expectedSignBytes, err := signDocDirectAux.Marshal() 114 require.NoError(t, err) 115 require.Equal(t, expectedSignBytes, signBytes) 116 117 t.Log("verify that setting signature doesn't change sign bytes") 118 sigData.Signature, err = privKey.Sign(signBytes) 119 require.NoError(t, err) 120 err = txBuilder.SetSignatures(sig) 121 require.NoError(t, err) 122 signBytes, err = modeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, signingData, txBuilder.GetTx()) 123 require.NoError(t, err) 124 require.Equal(t, expectedSignBytes, signBytes) 125 126 t.Log("verify GetSignBytes with false txBody data") 127 signDocDirectAux.BodyBytes = []byte("dfafdasfds") 128 expectedSignBytes, err = signDocDirectAux.Marshal() 129 require.NoError(t, err) 130 require.NotEqual(t, expectedSignBytes, signBytes) 131 } 132 133 func TestDirectAuxHandler_DefaultMode(t *testing.T) { 134 handler := signModeDirectAuxHandler{} 135 require.Equal(t, signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, handler.DefaultMode()) 136 } 137 138 func TestDirectAuxModeHandler_nonDIRECT_MODE(t *testing.T) { 139 invalidModes := []signingtypes.SignMode{ 140 signingtypes.SignMode_SIGN_MODE_DIRECT, 141 signingtypes.SignMode_SIGN_MODE_TEXTUAL, 142 signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, 143 signingtypes.SignMode_SIGN_MODE_UNSPECIFIED, 144 } 145 for _, invalidMode := range invalidModes { 146 t.Run(invalidMode.String(), func(t *testing.T) { 147 var dh signModeDirectAuxHandler 148 var signingData signing.SignerData 149 _, err := dh.GetSignBytes(invalidMode, signingData, nil) 150 require.Error(t, err) 151 wantErr := fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, invalidMode) 152 require.Equal(t, err, wantErr) 153 }) 154 } 155 } 156 157 func TestDirectAuxModeHandler_nonProtoTx(t *testing.T) { 158 var dh signModeDirectAuxHandler 159 var signingData signing.SignerData 160 tx := new(nonProtoTx) 161 _, err := dh.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT_AUX, signingData, tx) 162 require.Error(t, err) 163 wantErr := fmt.Errorf("can only handle a protobuf Tx, got %T", tx) 164 require.Equal(t, err, wantErr) 165 }