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 }