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  }