github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/migrations/legacytx/stdtx_test.go (about)

     1  package legacytx
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/cosmos/gogoproto/proto"
     9  	"github.com/stretchr/testify/require"
    10  	"google.golang.org/protobuf/types/known/anypb"
    11  
    12  	basev1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
    13  	txv1beta1 "cosmossdk.io/api/cosmos/tx/v1beta1"
    14  	txsigning "cosmossdk.io/x/tx/signing"
    15  	"cosmossdk.io/x/tx/signing/aminojson"
    16  
    17  	"github.com/cosmos/cosmos-sdk/codec"
    18  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    19  	cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
    20  	"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
    21  	kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
    22  	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
    23  	"github.com/cosmos/cosmos-sdk/testutil/testdata"
    24  	sdk "github.com/cosmos/cosmos-sdk/types"
    25  	"github.com/cosmos/cosmos-sdk/types/tx/signing"
    26  )
    27  
    28  var (
    29  	priv = ed25519.GenPrivKey()
    30  	addr = sdk.AccAddress(priv.PubKey().Address())
    31  )
    32  
    33  func TestStdSignBytes(t *testing.T) {
    34  	type args struct {
    35  		chainID       string
    36  		accnum        uint64
    37  		sequence      uint64
    38  		timeoutHeight uint64
    39  		fee           *txv1beta1.Fee
    40  		msgs          []sdk.Msg
    41  		memo          string
    42  	}
    43  	defaultFee := &txv1beta1.Fee{
    44  		Amount:   []*basev1beta1.Coin{{Denom: "atom", Amount: "150"}},
    45  		GasLimit: 100000,
    46  	}
    47  	msgStr := fmt.Sprintf(`{"type":"testpb/TestMsg","value":{"signers":["%s"]}}`, addr)
    48  	tests := []struct {
    49  		name string
    50  		args args
    51  		want string
    52  	}{
    53  		{
    54  			"with timeout height",
    55  			args{"1234", 3, 6, 10, defaultFee, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    56  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[{"amount":"150","denom":"atom"}],"gas":"100000"},"memo":"memo","msgs":[%s],"sequence":"6","timeout_height":"10"}`, msgStr),
    57  		},
    58  		{
    59  			"no timeout height (omitempty)",
    60  			args{"1234", 3, 6, 0, defaultFee, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    61  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[{"amount":"150","denom":"atom"}],"gas":"100000"},"memo":"memo","msgs":[%s],"sequence":"6"}`, msgStr),
    62  		},
    63  		{
    64  			"empty fee",
    65  			args{"1234", 3, 6, 0, &txv1beta1.Fee{}, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    66  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[],"gas":"0"},"memo":"memo","msgs":[%s],"sequence":"6"}`, msgStr),
    67  		},
    68  		{
    69  			"no fee payer and fee granter (both omitempty)",
    70  			args{"1234", 3, 6, 0, &txv1beta1.Fee{Amount: defaultFee.Amount, GasLimit: defaultFee.GasLimit}, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    71  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[{"amount":"150","denom":"atom"}],"gas":"100000"},"memo":"memo","msgs":[%s],"sequence":"6"}`, msgStr),
    72  		},
    73  		{
    74  			"with fee granter, no fee payer (omitempty)",
    75  			args{"1234", 3, 6, 0, &txv1beta1.Fee{Amount: defaultFee.Amount, GasLimit: defaultFee.GasLimit, Granter: addr.String()}, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    76  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[{"amount":"150","denom":"atom"}],"gas":"100000","granter":"%s"},"memo":"memo","msgs":[%s],"sequence":"6"}`, addr, msgStr),
    77  		},
    78  		{
    79  			"with fee payer, no fee granter (omitempty)",
    80  			args{"1234", 3, 6, 0, &txv1beta1.Fee{Amount: defaultFee.Amount, GasLimit: defaultFee.GasLimit, Payer: addr.String()}, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    81  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[{"amount":"150","denom":"atom"}],"gas":"100000","payer":"%s"},"memo":"memo","msgs":[%s],"sequence":"6"}`, addr, msgStr),
    82  		},
    83  		{
    84  			"with fee payer and fee granter",
    85  			args{"1234", 3, 6, 0, &txv1beta1.Fee{Amount: defaultFee.Amount, GasLimit: defaultFee.GasLimit, Payer: addr.String(), Granter: addr.String()}, []sdk.Msg{testdata.NewTestMsg(addr)}, "memo"},
    86  			fmt.Sprintf(`{"account_number":"3","chain_id":"1234","fee":{"amount":[{"amount":"150","denom":"atom"}],"gas":"100000","granter":"%s","payer":"%s"},"memo":"memo","msgs":[%s],"sequence":"6"}`, addr, addr, msgStr),
    87  		},
    88  	}
    89  	handler := aminojson.NewSignModeHandler(aminojson.SignModeHandlerOptions{
    90  		FileResolver: proto.HybridResolver,
    91  	})
    92  	for i, tc := range tests {
    93  		tc := tc
    94  		t.Run(tc.name, func(t *testing.T) {
    95  			anyMsgs := make([]*anypb.Any, len(tc.args.msgs))
    96  			for j, msg := range tc.args.msgs {
    97  				legacyAny, err := codectypes.NewAnyWithValue(msg)
    98  				require.NoError(t, err)
    99  				anyMsgs[j] = &anypb.Any{
   100  					TypeUrl: legacyAny.TypeUrl,
   101  					Value:   legacyAny.Value,
   102  				}
   103  			}
   104  			got, err := handler.GetSignBytes(
   105  				context.TODO(),
   106  				txsigning.SignerData{
   107  					Address:       "foo",
   108  					ChainID:       tc.args.chainID,
   109  					AccountNumber: tc.args.accnum,
   110  					Sequence:      tc.args.sequence,
   111  				},
   112  				txsigning.TxData{
   113  					Body: &txv1beta1.TxBody{
   114  						Memo:          tc.args.memo,
   115  						Messages:      anyMsgs,
   116  						TimeoutHeight: tc.args.timeoutHeight,
   117  					},
   118  					AuthInfo: &txv1beta1.AuthInfo{
   119  						Fee: tc.args.fee,
   120  					},
   121  				},
   122  			)
   123  			require.NoError(t, err)
   124  			require.Equal(t, tc.want, string(got), "Got unexpected result on test case i: %d", i)
   125  		})
   126  	}
   127  }
   128  
   129  func TestSignatureV2Conversions(t *testing.T) {
   130  	_, pubKey, _ := testdata.KeyTestPubAddr()
   131  	cdc := codec.NewLegacyAmino()
   132  	sdk.RegisterLegacyAminoCodec(cdc)
   133  	dummy := []byte("dummySig")
   134  	sig := StdSignature{PubKey: pubKey, Signature: dummy}
   135  
   136  	sigV2, err := StdSignatureToSignatureV2(cdc, sig)
   137  	require.NoError(t, err)
   138  	require.Equal(t, pubKey, sigV2.PubKey)
   139  	require.Equal(t, &signing.SingleSignatureData{
   140  		SignMode:  signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON,
   141  		Signature: dummy,
   142  	}, sigV2.Data)
   143  
   144  	sigBz, err := SignatureDataToAminoSignature(cdc, sigV2.Data)
   145  	require.NoError(t, err)
   146  	require.Equal(t, dummy, sigBz)
   147  
   148  	// multisigs
   149  	_, pubKey2, _ := testdata.KeyTestPubAddr()
   150  	multiPK := kmultisig.NewLegacyAminoPubKey(1, []cryptotypes.PubKey{
   151  		pubKey, pubKey2,
   152  	})
   153  	dummy2 := []byte("dummySig2")
   154  	bitArray := cryptotypes.NewCompactBitArray(2)
   155  	bitArray.SetIndex(0, true)
   156  	bitArray.SetIndex(1, true)
   157  	msigData := &signing.MultiSignatureData{
   158  		BitArray: bitArray,
   159  		Signatures: []signing.SignatureData{
   160  			&signing.SingleSignatureData{
   161  				SignMode:  signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON,
   162  				Signature: dummy,
   163  			},
   164  			&signing.SingleSignatureData{
   165  				SignMode:  signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON,
   166  				Signature: dummy2,
   167  			},
   168  		},
   169  	}
   170  
   171  	msig, err := SignatureDataToAminoSignature(cdc, msigData)
   172  	require.NoError(t, err)
   173  
   174  	sigV2, err = StdSignatureToSignatureV2(cdc, StdSignature{
   175  		PubKey:    multiPK,
   176  		Signature: msig,
   177  	})
   178  	require.NoError(t, err)
   179  	require.Equal(t, multiPK, sigV2.PubKey)
   180  	require.Equal(t, msigData, sigV2.Data)
   181  }
   182  
   183  func TestGetSignaturesV2(t *testing.T) {
   184  	_, pubKey, _ := testdata.KeyTestPubAddr()
   185  	dummy := []byte("dummySig")
   186  
   187  	cdc := codec.NewLegacyAmino()
   188  	sdk.RegisterLegacyAminoCodec(cdc)
   189  	cryptocodec.RegisterCrypto(cdc)
   190  
   191  	fee := NewStdFee(50000, sdk.Coins{sdk.NewInt64Coin("atom", 150)})
   192  	sig := StdSignature{PubKey: pubKey, Signature: dummy}
   193  	stdTx := NewStdTx([]sdk.Msg{testdata.NewTestMsg()}, fee, []StdSignature{sig}, "testsigs")
   194  
   195  	sigs, err := stdTx.GetSignaturesV2()
   196  	require.Nil(t, err)
   197  	require.Equal(t, len(sigs), 1)
   198  
   199  	require.Equal(t, cdc.MustMarshal(sigs[0].PubKey), cdc.MustMarshal(sig.GetPubKey()))
   200  	require.Equal(t, sigs[0].Data, &signing.SingleSignatureData{
   201  		SignMode:  signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON,
   202  		Signature: sig.GetSignature(),
   203  	})
   204  }