github.com/Finschia/finschia-sdk@v0.49.1/x/fswap/types/msgs_test.go (about) 1 package types_test 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/Finschia/finschia-sdk/crypto/keys/secp256k1" 10 sdk "github.com/Finschia/finschia-sdk/types" 11 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 12 "github.com/Finschia/finschia-sdk/x/auth/legacy/legacytx" 13 banktypes "github.com/Finschia/finschia-sdk/x/bank/types" 14 fswaptypes "github.com/Finschia/finschia-sdk/x/fswap/types" 15 ) 16 17 func TestAminoJSON(t *testing.T) { 18 tx := legacytx.StdTx{} 19 20 sender := "link15sdc7wdajsps42fky3j6mnvr4tj9fv6w3hkqkj" 21 22 swapRate, _ := sdk.NewDecFromStr("148.079656") 23 24 testCase := map[string]struct { 25 msg legacytx.LegacyMsg 26 expectedType string 27 expected string 28 }{ 29 "MsgSwap": { 30 &fswaptypes.MsgSwap{ 31 FromAddress: sender, 32 FromCoinAmount: sdk.Coin{ 33 Denom: "cony", 34 Amount: sdk.NewInt(100000), 35 }, 36 ToDenom: "pdt", 37 }, 38 "/lbm.fswap.v1.MsgSwap", 39 "{\"account_number\":\"1\",\"chain_id\":\"foo\",\"fee\":{\"amount\":[],\"gas\":\"0\"},\"memo\":\"memo\",\"msgs\":[{\"type\":\"lbm-sdk/MsgSwap\",\"value\":{\"from_address\":\"link15sdc7wdajsps42fky3j6mnvr4tj9fv6w3hkqkj\",\"from_coin_amount\":{\"amount\":\"100000\",\"denom\":\"cony\"},\"to_denom\":\"pdt\"}}],\"sequence\":\"1\",\"timeout_height\":\"1\"}", 40 }, 41 "MsgSwapAll": { 42 &fswaptypes.MsgSwapAll{ 43 FromAddress: sender, 44 FromDenom: "cony", 45 ToDenom: "pdt", 46 }, 47 "/lbm.fswap.v1.MsgSwapAll", 48 "{\"account_number\":\"1\",\"chain_id\":\"foo\",\"fee\":{\"amount\":[],\"gas\":\"0\"},\"memo\":\"memo\",\"msgs\":[{\"type\":\"lbm-sdk/MsgSwapAll\",\"value\":{\"from_address\":\"link15sdc7wdajsps42fky3j6mnvr4tj9fv6w3hkqkj\",\"from_denom\":\"cony\",\"to_denom\":\"pdt\"}}],\"sequence\":\"1\",\"timeout_height\":\"1\"}", 49 }, 50 "MsgSetSwap": { 51 &fswaptypes.MsgSetSwap{ 52 Authority: sender, 53 Swap: fswaptypes.Swap{ 54 FromDenom: "cony", 55 ToDenom: "pdt", 56 AmountCapForToDenom: sdk.NewInt(1000000000000000), 57 SwapRate: swapRate, 58 }, 59 ToDenomMetadata: banktypes.Metadata{ 60 Description: "test", 61 DenomUnits: []*banktypes.DenomUnit{ 62 { 63 Denom: "kaia", 64 Exponent: 0, 65 Aliases: nil, 66 }, 67 }, 68 Base: "kaia", 69 Display: "kaia", 70 Name: "Kaia", 71 Symbol: "KAIA", 72 }, 73 }, 74 "/lbm.fswap.v1.MsgSetSwap", 75 "{\"account_number\":\"1\",\"chain_id\":\"foo\",\"fee\":{\"amount\":[],\"gas\":\"0\"},\"memo\":\"memo\",\"msgs\":[{\"type\":\"lbm-sdk/MsgSetSwap\",\"value\":{\"authority\":\"link15sdc7wdajsps42fky3j6mnvr4tj9fv6w3hkqkj\",\"swap\":{\"amount_cap_for_to_denom\":\"1000000000000000\",\"from_denom\":\"cony\",\"swap_rate\":\"148.079656000000000000\",\"to_denom\":\"pdt\"},\"to_denom_metadata\":{\"base\":\"kaia\",\"denom_units\":[{\"denom\":\"kaia\"}],\"description\":\"test\",\"display\":\"kaia\",\"name\":\"Kaia\",\"symbol\":\"KAIA\"}}}],\"sequence\":\"1\",\"timeout_height\":\"1\"}", 76 }, 77 } 78 79 for name, tc := range testCase { 80 t.Run(name, func(t *testing.T) { 81 tx.Msgs = []sdk.Msg{tc.msg} 82 require.Equal(t, fswaptypes.RouterKey, tc.msg.Route()) 83 require.Equal(t, tc.expectedType, tc.msg.Type()) 84 require.Equal(t, tc.expected, string(legacytx.StdSignBytes("foo", 1, 1, 1, legacytx.StdFee{}, []sdk.Msg{tc.msg}, "memo"))) 85 }) 86 } 87 } 88 89 func TestMsgSwapValidate(t *testing.T) { 90 pk := secp256k1.GenPrivKey().PubKey() 91 address, err := sdk.Bech32ifyAddressBytes("link", pk.Address()) 92 if err != nil { 93 return 94 } 95 tests := []struct { 96 name string 97 msg *fswaptypes.MsgSwap 98 expectedError error 99 }{ 100 { 101 name: "valid", 102 msg: &fswaptypes.MsgSwap{ 103 FromAddress: address, 104 FromCoinAmount: sdk.NewCoin("fromDenom", sdk.OneInt()), 105 ToDenom: "kei", 106 }, 107 expectedError: nil, 108 }, 109 { 110 name: "invalid: address", 111 msg: &fswaptypes.MsgSwap{ 112 FromAddress: "invalid-address", 113 FromCoinAmount: sdk.NewCoin("fromDenom", sdk.OneInt()), 114 ToDenom: "kei", 115 }, 116 expectedError: sdkerrors.ErrInvalidAddress, 117 }, 118 { 119 name: "invalid: FromCoinAmount empty denom", 120 msg: &fswaptypes.MsgSwap{ 121 FromAddress: address, 122 FromCoinAmount: sdk.Coin{ 123 Denom: "", 124 Amount: sdk.OneInt(), 125 }, 126 ToDenom: "kei", 127 }, 128 expectedError: sdkerrors.ErrInvalidCoins, 129 }, 130 { 131 name: "invalid: FromCoinAmount zero amount", 132 msg: &fswaptypes.MsgSwap{ 133 FromAddress: address, 134 FromCoinAmount: sdk.Coin{ 135 Denom: "cony", 136 Amount: sdk.ZeroInt(), 137 }, 138 ToDenom: "kei", 139 }, 140 expectedError: sdkerrors.ErrInvalidCoins, 141 }, 142 { 143 name: "invalid: ToDenom", 144 msg: &fswaptypes.MsgSwap{ 145 FromAddress: address, 146 FromCoinAmount: sdk.NewCoin("fromDenom", sdk.OneInt()), 147 ToDenom: "", 148 }, 149 expectedError: sdkerrors.ErrInvalidRequest, 150 }, 151 } 152 for _, tc := range tests { 153 t.Run(tc.name, func(t *testing.T) { 154 err := tc.msg.ValidateBasic() 155 require.ErrorIs(t, err, tc.expectedError) 156 }) 157 } 158 } 159 160 func TestMsgSwapAllValidate(t *testing.T) { 161 pk := secp256k1.GenPrivKey().PubKey() 162 address, err := sdk.Bech32ifyAddressBytes("link", pk.Address()) 163 if err != nil { 164 return 165 } 166 tests := []struct { 167 name string 168 msg *fswaptypes.MsgSwapAll 169 expectedError error 170 }{ 171 { 172 name: "valid", 173 msg: &fswaptypes.MsgSwapAll{ 174 FromAddress: address, 175 FromDenom: "cony", 176 ToDenom: "kei", 177 }, 178 expectedError: nil, 179 }, 180 { 181 name: "invalid: address", 182 msg: &fswaptypes.MsgSwapAll{ 183 FromAddress: "invalid-address", 184 FromDenom: "cony", 185 ToDenom: "kei", 186 }, 187 expectedError: sdkerrors.ErrInvalidAddress, 188 }, 189 { 190 name: "invalid: FromDenom", 191 msg: &fswaptypes.MsgSwapAll{ 192 FromAddress: address, 193 FromDenom: "", 194 ToDenom: "kei", 195 }, 196 expectedError: sdkerrors.ErrInvalidRequest, 197 }, 198 { 199 name: "invalid: ToDenom", 200 msg: &fswaptypes.MsgSwapAll{ 201 FromAddress: address, 202 FromDenom: "cony", 203 ToDenom: "", 204 }, 205 expectedError: sdkerrors.ErrInvalidRequest, 206 }, 207 } 208 for _, tc := range tests { 209 t.Run(tc.name, func(t *testing.T) { 210 err := tc.msg.ValidateBasic() 211 require.ErrorIs(t, err, tc.expectedError) 212 }) 213 } 214 } 215 216 func TestMsgSetSwapValidate(t *testing.T) { 217 pk := secp256k1.GenPrivKey().PubKey() 218 address, err := sdk.Bech32ifyAddressBytes("link", pk.Address()) 219 if err != nil { 220 return 221 } 222 tests := []struct { 223 name string 224 msg *fswaptypes.MsgSetSwap 225 expectedError error 226 }{ 227 { 228 name: "valid", 229 msg: &fswaptypes.MsgSetSwap{ 230 Authority: address, 231 Swap: fswaptypes.Swap{ 232 FromDenom: "cony", 233 ToDenom: "kei", 234 AmountCapForToDenom: sdk.OneInt(), 235 SwapRate: sdk.NewDec(123), 236 }, 237 ToDenomMetadata: banktypes.Metadata{ 238 Description: "desc", 239 DenomUnits: []*banktypes.DenomUnit{ 240 { 241 Denom: "kei", 242 Exponent: 0, 243 Aliases: nil, 244 }, 245 }, 246 Base: "kei", 247 Display: "kei", 248 Name: "kei", 249 Symbol: "KAIA", 250 }, 251 }, 252 expectedError: nil, 253 }, 254 { 255 name: "invalid: address", 256 msg: &fswaptypes.MsgSetSwap{ 257 Authority: "invalid-address", 258 Swap: fswaptypes.Swap{ 259 FromDenom: "cony", 260 ToDenom: "kei", 261 AmountCapForToDenom: sdk.OneInt(), 262 SwapRate: sdk.NewDec(123), 263 }, 264 ToDenomMetadata: banktypes.Metadata{ 265 Description: "desc", 266 DenomUnits: []*banktypes.DenomUnit{ 267 { 268 Denom: "kei", 269 Exponent: 0, 270 Aliases: nil, 271 }, 272 }, 273 Base: "kei", 274 Display: "kei", 275 Name: "kei", 276 Symbol: "KAIA", 277 }, 278 }, 279 expectedError: sdkerrors.ErrInvalidAddress, 280 }, 281 { 282 name: "invalid: Swap", 283 msg: &fswaptypes.MsgSetSwap{ 284 Authority: address, 285 Swap: fswaptypes.Swap{}, 286 ToDenomMetadata: banktypes.Metadata{ 287 Description: "desc", 288 DenomUnits: []*banktypes.DenomUnit{ 289 { 290 Denom: "kei", 291 Exponent: 0, 292 Aliases: nil, 293 }, 294 }, 295 Base: "kei", 296 Display: "kei", 297 Name: "kei", 298 Symbol: "KAIA", 299 }, 300 }, 301 expectedError: sdkerrors.ErrInvalidRequest, 302 }, 303 { 304 name: "invalid: ToDenomMetadata", 305 msg: &fswaptypes.MsgSetSwap{ 306 Authority: address, 307 Swap: fswaptypes.Swap{ 308 FromDenom: "cony", 309 ToDenom: "kei", 310 AmountCapForToDenom: sdk.OneInt(), 311 SwapRate: sdk.NewDec(123), 312 }, 313 ToDenomMetadata: banktypes.Metadata{ 314 Description: "", 315 DenomUnits: []*banktypes.DenomUnit{ 316 { 317 Denom: "kei", 318 Exponent: 0, 319 Aliases: nil, 320 }, 321 }, 322 }, 323 }, 324 expectedError: errors.New("name field cannot be blank"), 325 }, 326 327 { 328 name: "invalid: mismatched toDenom", 329 msg: &fswaptypes.MsgSetSwap{ 330 Authority: address, 331 Swap: fswaptypes.Swap{ 332 FromDenom: "cony", 333 ToDenom: "kei", 334 AmountCapForToDenom: sdk.OneInt(), 335 SwapRate: sdk.NewDec(123), 336 }, 337 ToDenomMetadata: banktypes.Metadata{ 338 Description: "desc", 339 DenomUnits: []*banktypes.DenomUnit{ 340 { 341 Denom: "fkei", 342 Exponent: 0, 343 Aliases: nil, 344 }, 345 }, 346 Base: "fkei", 347 Display: "fkei", 348 Name: "fkei", 349 Symbol: "KAIA", 350 }, 351 }, 352 expectedError: sdkerrors.ErrInvalidRequest, 353 }, 354 } 355 for _, tc := range tests { 356 t.Run(tc.name, func(t *testing.T) { 357 err := tc.msg.ValidateBasic() 358 if tc.expectedError != nil { 359 require.Contains(t, err.Error(), tc.expectedError.Error()) 360 } 361 }) 362 } 363 }