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 }