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

     1  package tx
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	txsigning "cosmossdk.io/x/tx/signing"
    10  	"cosmossdk.io/x/tx/signing/aminojson"
    11  
    12  	"github.com/cosmos/cosmos-sdk/codec"
    13  	"github.com/cosmos/cosmos-sdk/codec/legacy"
    14  	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
    15  	"github.com/cosmos/cosmos-sdk/testutil/testdata"
    16  	sdk "github.com/cosmos/cosmos-sdk/types"
    17  	signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
    18  	"github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
    19  	"github.com/cosmos/cosmos-sdk/x/auth/signing"
    20  	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
    21  )
    22  
    23  var (
    24  	_, pubkey1, addr1 = testdata.KeyTestPubAddr()
    25  	_, _, addr2       = testdata.KeyTestPubAddr()
    26  
    27  	coins   = sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}
    28  	gas     = uint64(10000)
    29  	msg     = banktypes.NewMsgSend(addr1, addr2, coins)
    30  	memo    = "foo"
    31  	timeout = uint64(10)
    32  )
    33  
    34  func buildTx(t *testing.T, bldr *wrapper) {
    35  	bldr.SetFeeAmount(coins)
    36  	bldr.SetGasLimit(gas)
    37  	bldr.SetMemo(memo)
    38  	bldr.SetTimeoutHeight(timeout)
    39  	require.NoError(t, bldr.SetMsgs(msg))
    40  }
    41  
    42  func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) {
    43  	legacytx.RegressionTestingAminoCodec = codec.NewLegacyAmino()
    44  	var (
    45  		chainID        = "test-chain"
    46  		accNum  uint64 = 7
    47  		seqNum  uint64 = 7
    48  	)
    49  
    50  	testcases := []struct {
    51  		name           string
    52  		signer         string
    53  		malleate       func(*wrapper)
    54  		expectedSignBz []byte
    55  	}{
    56  		{
    57  			"signer which is also fee payer (no tips)", addr1.String(),
    58  			func(w *wrapper) {},
    59  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas}, []sdk.Msg{msg}, memo),
    60  		},
    61  
    62  		{
    63  			"explicit fee payer", addr1.String(),
    64  			func(w *wrapper) { w.SetFeePayer(addr2) },
    65  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas, Payer: addr2.String()}, []sdk.Msg{msg}, memo),
    66  		},
    67  		{
    68  			"explicit fee granter", addr1.String(),
    69  			func(w *wrapper) { w.SetFeeGranter(addr2) },
    70  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas, Granter: addr2.String()}, []sdk.Msg{msg}, memo),
    71  		},
    72  		{
    73  			"explicit fee payer and fee granter", addr1.String(),
    74  			func(w *wrapper) {
    75  				w.SetFeePayer(addr2)
    76  				w.SetFeeGranter(addr2)
    77  			},
    78  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas, Payer: addr2.String(), Granter: addr2.String()}, []sdk.Msg{msg}, memo),
    79  		},
    80  	}
    81  
    82  	handler := signModeLegacyAminoJSONHandler{}
    83  	for _, tc := range testcases {
    84  		tc := tc
    85  		t.Run(tc.name, func(t *testing.T) {
    86  			bldr := newBuilder(nil)
    87  			buildTx(t, bldr)
    88  			tx := bldr.GetTx()
    89  			tc.malleate(bldr)
    90  
    91  			signingData := signing.SignerData{
    92  				Address:       tc.signer,
    93  				ChainID:       chainID,
    94  				AccountNumber: accNum,
    95  				Sequence:      seqNum,
    96  			}
    97  			signBz, err := handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx)
    98  			require.NoError(t, err)
    99  
   100  			require.Equal(t, tc.expectedSignBz, signBz)
   101  		})
   102  	}
   103  
   104  	bldr := newBuilder(nil)
   105  	buildTx(t, bldr)
   106  	tx := bldr.GetTx()
   107  	signingData := signing.SignerData{
   108  		Address:       addr1.String(),
   109  		ChainID:       chainID,
   110  		AccountNumber: accNum,
   111  		Sequence:      seqNum,
   112  		PubKey:        pubkey1,
   113  	}
   114  
   115  	// expect error with wrong sign mode
   116  	_, err := handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, tx)
   117  	require.Error(t, err)
   118  
   119  	// expect error with extension options
   120  	bldr = newBuilder(nil)
   121  	buildTx(t, bldr)
   122  	any, err := cdctypes.NewAnyWithValue(testdata.NewTestMsg())
   123  	require.NoError(t, err)
   124  	bldr.tx.Body.ExtensionOptions = []*cdctypes.Any{any}
   125  	tx = bldr.GetTx()
   126  	_, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx)
   127  	require.Error(t, err)
   128  
   129  	// expect error with non-critical extension options
   130  	bldr = newBuilder(nil)
   131  	buildTx(t, bldr)
   132  	bldr.tx.Body.NonCriticalExtensionOptions = []*cdctypes.Any{any}
   133  	tx = bldr.GetTx()
   134  	_, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx)
   135  	require.Error(t, err)
   136  }
   137  
   138  func TestLegacyAminoJSONHandler_AllGetSignBytesComparison(t *testing.T) {
   139  	var (
   140  		chainID = "test-chain"
   141  		accNum  uint64
   142  		seqNum  uint64 = 7
   143  	)
   144  
   145  	modeHandler := aminojson.NewSignModeHandler(aminojson.SignModeHandlerOptions{})
   146  	mode, _ := signing.APISignModeToInternal(modeHandler.Mode())
   147  	legacyAmino := codec.NewLegacyAmino()
   148  	legacy.RegisterAminoMsg(legacyAmino, &banktypes.MsgSend{}, "cosmos-sdk/MsgSend")
   149  	legacytx.RegressionTestingAminoCodec = legacyAmino
   150  
   151  	testcases := []struct {
   152  		name           string
   153  		signer         string
   154  		malleate       func(*wrapper)
   155  		expectedSignBz []byte
   156  	}{
   157  		{
   158  			"signer which is also fee payer (no tips)", addr1.String(),
   159  			func(w *wrapper) {},
   160  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas}, []sdk.Msg{msg}, memo),
   161  		},
   162  
   163  		{
   164  			"explicit fee payer", addr1.String(),
   165  			func(w *wrapper) { w.SetFeePayer(addr2) },
   166  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas, Payer: addr2.String()}, []sdk.Msg{msg}, memo),
   167  		},
   168  		{
   169  			"explicit fee granter", addr1.String(),
   170  			func(w *wrapper) { w.SetFeeGranter(addr2) },
   171  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas, Granter: addr2.String()}, []sdk.Msg{msg}, memo),
   172  		},
   173  		{
   174  			"explicit fee payer and fee granter", addr1.String(),
   175  			func(w *wrapper) {
   176  				w.SetFeePayer(addr2)
   177  				w.SetFeeGranter(addr2)
   178  			},
   179  			legacytx.StdSignBytes(chainID, accNum, seqNum, timeout, legacytx.StdFee{Amount: coins, Gas: gas, Payer: addr2.String(), Granter: addr2.String()}, []sdk.Msg{msg}, memo),
   180  		},
   181  	}
   182  
   183  	handler := signModeLegacyAminoJSONHandler{}
   184  	for _, tc := range testcases {
   185  		tc := tc
   186  		t.Run(tc.name, func(t *testing.T) {
   187  			bldr := newBuilder(nil)
   188  			buildTx(t, bldr)
   189  			tx := bldr.GetTx()
   190  			tc.malleate(bldr)
   191  
   192  			signingData := signing.SignerData{
   193  				Address:       tc.signer,
   194  				ChainID:       chainID,
   195  				AccountNumber: accNum,
   196  				Sequence:      seqNum,
   197  				PubKey:        pubkey1,
   198  			}
   199  			signBz, err := handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx)
   200  			require.NoError(t, err)
   201  
   202  			// compare with new signing
   203  			newSignBz, err := signing.GetSignBytesAdapter(context.Background(), txsigning.NewHandlerMap(modeHandler), mode, signingData, tx)
   204  			require.NoError(t, err)
   205  
   206  			require.Equal(t, string(tc.expectedSignBz), string(signBz))
   207  			require.Equal(t, string(tc.expectedSignBz), string(newSignBz))
   208  		})
   209  	}
   210  
   211  	legacytx.RegressionTestingAminoCodec = nil
   212  }
   213  
   214  func TestLegacyAminoJSONHandler_DefaultMode(t *testing.T) {
   215  	handler := signModeLegacyAminoJSONHandler{}
   216  	require.Equal(t, signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, handler.DefaultMode())
   217  }
   218  
   219  func TestLegacyAminoJSONHandler_Modes(t *testing.T) {
   220  	handler := signModeLegacyAminoJSONHandler{}
   221  	require.Equal(t, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON}, handler.Modes())
   222  }