github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/tx/direct_test.go (about) 1 package tx 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 protov2 "google.golang.org/protobuf/proto" 10 11 "github.com/cosmos/cosmos-sdk/codec" 12 codectypes "github.com/cosmos/cosmos-sdk/codec/types" 13 "github.com/cosmos/cosmos-sdk/testutil/testdata" 14 sdk "github.com/cosmos/cosmos-sdk/types" 15 txtypes "github.com/cosmos/cosmos-sdk/types/tx" 16 signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" 17 "github.com/cosmos/cosmos-sdk/x/auth/signing" 18 ) 19 20 func TestDirectModeHandler(t *testing.T) { 21 privKey, pubkey, addr := testdata.KeyTestPubAddr() 22 interfaceRegistry := codectypes.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}) 27 txBuilder := txConfig.NewTxBuilder() 28 29 memo := "sometestmemo" 30 msgs := []sdk.Msg{testdata.NewTestMsg(addr)} 31 accSeq := uint64(2) // Arbitrary account sequence 32 any, err := codectypes.NewAnyWithValue(pubkey) 33 require.NoError(t, err) 34 35 var signerInfo []*txtypes.SignerInfo 36 signerInfo = append(signerInfo, &txtypes.SignerInfo{ 37 PublicKey: any, 38 ModeInfo: &txtypes.ModeInfo{ 39 Sum: &txtypes.ModeInfo_Single_{ 40 Single: &txtypes.ModeInfo_Single{ 41 Mode: signingtypes.SignMode_SIGN_MODE_DIRECT, 42 }, 43 }, 44 }, 45 Sequence: accSeq, 46 }) 47 48 sigData := &signingtypes.SingleSignatureData{ 49 SignMode: signingtypes.SignMode_SIGN_MODE_DIRECT, 50 } 51 sig := signingtypes.SignatureV2{ 52 PubKey: pubkey, 53 Data: sigData, 54 Sequence: accSeq, 55 } 56 57 fee := txtypes.Fee{Amount: sdk.NewCoins(sdk.NewInt64Coin("atom", 150)), GasLimit: 20000} 58 59 err = txBuilder.SetMsgs(msgs...) 60 require.NoError(t, err) 61 txBuilder.SetMemo(memo) 62 txBuilder.SetFeeAmount(fee.Amount) 63 txBuilder.SetGasLimit(fee.GasLimit) 64 65 err = txBuilder.SetSignatures(sig) 66 require.NoError(t, err) 67 68 t.Log("verify modes and default-mode") 69 defaultSignMode, err := signing.APISignModeToInternal(txConfig.SignModeHandler().DefaultMode()) 70 require.NoError(t, err) 71 require.Equal(t, defaultSignMode, signingtypes.SignMode_SIGN_MODE_DIRECT) 72 require.Len(t, txConfig.SignModeHandler().SupportedModes(), 1) 73 74 signingData := signing.SignerData{ 75 Address: addr.String(), 76 ChainID: "test-chain", 77 AccountNumber: 1, 78 PubKey: pubkey, 79 } 80 81 signBytes, err := signing.GetSignBytesAdapter( 82 context.Background(), txConfig.SignModeHandler(), defaultSignMode, signingData, 83 txBuilder.GetTx()) 84 require.NoError(t, err) 85 require.NotNil(t, signBytes) 86 87 authInfo := &txtypes.AuthInfo{ 88 Fee: &fee, 89 SignerInfos: signerInfo, 90 } 91 92 authInfoBytes := marshaler.MustMarshal(authInfo) 93 94 anys := make([]*codectypes.Any, len(msgs)) 95 96 for i, msg := range msgs { 97 var err error 98 anys[i], err = codectypes.NewAnyWithValue(msg) 99 if err != nil { 100 panic(err) 101 } 102 } 103 104 txBody := &txtypes.TxBody{ 105 Memo: memo, 106 Messages: anys, 107 } 108 bodyBytes := marshaler.MustMarshal(txBody) 109 110 t.Log("verify GetSignBytes with generating sign bytes by marshaling SignDoc") 111 signDoc := txtypes.SignDoc{ 112 AccountNumber: 1, 113 AuthInfoBytes: authInfoBytes, 114 BodyBytes: bodyBytes, 115 ChainId: "test-chain", 116 } 117 118 expectedSignBytes, err := signDoc.Marshal() 119 require.NoError(t, err) 120 require.Equal(t, expectedSignBytes, signBytes) 121 122 t.Log("verify that setting signature doesn't change sign bytes") 123 sigData.Signature, err = privKey.Sign(signBytes) 124 require.NoError(t, err) 125 err = txBuilder.SetSignatures(sig) 126 require.NoError(t, err) 127 signBytes, err = signing.GetSignBytesAdapter( 128 context.Background(), txConfig.SignModeHandler(), defaultSignMode, signingData, 129 txBuilder.GetTx()) 130 require.NoError(t, err) 131 require.Equal(t, expectedSignBytes, signBytes) 132 133 t.Log("verify GetSignBytes with false txBody data") 134 signDoc.BodyBytes = []byte("dfafdasfds") 135 expectedSignBytes, err = signDoc.Marshal() 136 require.NoError(t, err) 137 require.NotEqual(t, expectedSignBytes, signBytes) 138 } 139 140 func TestDirectModeHandler_nonDIRECT_MODE(t *testing.T) { 141 invalidModes := []signingtypes.SignMode{ 142 signingtypes.SignMode_SIGN_MODE_TEXTUAL, 143 signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, 144 signingtypes.SignMode_SIGN_MODE_UNSPECIFIED, 145 } 146 for _, invalidMode := range invalidModes { 147 t.Run(invalidMode.String(), func(t *testing.T) { 148 var dh signModeDirectHandler 149 var signingData signing.SignerData 150 _, err := dh.GetSignBytes(invalidMode, signingData, nil) 151 require.Error(t, err) 152 wantErr := fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_DIRECT, invalidMode) 153 require.Equal(t, err, wantErr) 154 }) 155 } 156 } 157 158 type nonProtoTx int 159 160 func (npt *nonProtoTx) GetMsgs() []sdk.Msg { return nil } 161 func (npt *nonProtoTx) GetMsgsV2() ([]protov2.Message, error) { return nil, nil } 162 func (npt *nonProtoTx) ValidateBasic() error { return nil } 163 164 var _ sdk.Tx = (*nonProtoTx)(nil) 165 166 func TestDirectModeHandler_nonProtoTx(t *testing.T) { 167 var dh signModeDirectHandler 168 var signingData signing.SignerData 169 tx := new(nonProtoTx) 170 _, err := dh.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, tx) 171 require.Error(t, err) 172 wantErr := fmt.Errorf("can only handle a protobuf Tx, got %T", tx) 173 require.Equal(t, err, wantErr) 174 }