github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/ammswap/types/msg_test.go (about)

     1  //go:build ignore
     2  
     3  package types
     4  
     5  import (
     6  	"encoding/hex"
     7  	"encoding/json"
     8  	"fmt"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/fibonacci-chain/fbc/x/common"
    13  
    14  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  const addrStr = "1212121212121212123412121212121212121234"
    19  
    20  func testCode(t *testing.T, err sdk.Error, expectedCode uint32) {
    21  	if expectedCode != 0 {
    22  		require.NotNil(t, err)
    23  	} else {
    24  		require.Nil(t, err)
    25  	}
    26  }
    27  
    28  func TestMsgCreateExchange(t *testing.T) {
    29  	addr, err := hex.DecodeString(addrStr)
    30  	require.Nil(t, err)
    31  	testToken := InitPoolToken(TestBasePooledToken)
    32  	msg := NewMsgCreateExchange(testToken.Symbol, TestQuotePooledToken, addr)
    33  	require.Nil(t, msg.ValidateBasic())
    34  	require.Equal(t, RouterKey, msg.Route())
    35  	require.Equal(t, "create_exchange", msg.Type())
    36  
    37  	bytesMsg := msg.GetSignBytes()
    38  	resMsg := &MsgCreateExchange{}
    39  	err = json.Unmarshal(bytesMsg, resMsg)
    40  	require.Nil(t, err)
    41  	resAddr := msg.GetSigners()[0]
    42  	require.EqualValues(t, addr, resAddr)
    43  
    44  	expectTokenPair := TestBasePooledToken + "_" + TestQuotePooledToken
    45  	require.Equal(t, expectTokenPair, msg.GetSwapTokenPairName())
    46  }
    47  
    48  func TestMsgCreateExchangeInvalid(t *testing.T) {
    49  	addr, err := hex.DecodeString(addrStr)
    50  	require.Nil(t, err)
    51  	tests := []struct {
    52  		testCase         string
    53  		symbol0          string
    54  		symbol1          string
    55  		addr             sdk.AccAddress
    56  		exceptResultCode uint32
    57  	}{
    58  		{"success", "aaa", common.NativeToken, addr, sdk.CodeOK},
    59  		{"success", "aaa", "bbb", addr, sdk.CodeOK},
    60  		{"success", "bbb", "aaa", addr, sdk.CodeOK},
    61  		{"nil addr", "aaa", common.NativeToken, nil, sdk.CodeInvalidAddress},
    62  		{"invalid token", "1ab", common.NativeToken, addr, sdk.CodeInvalidCoins},
    63  		{"invalid token", common.NativeToken, common.NativeToken, addr, sdk.CodeInvalidCoins},
    64  		//{"The lexicographic order of BaseTokenName must be less than QuoteTokenName", "xxb", addr, sdk.CodeUnknownRequest},
    65  
    66  	}
    67  	for i, testCase := range tests {
    68  		msg := NewMsgCreateExchange(testCase.symbol0, testCase.symbol1, testCase.addr)
    69  		err := msg.ValidateBasic()
    70  		fmt.Println(i, err)
    71  		testCode(t, err, testCase.exceptResultCode)
    72  	}
    73  }
    74  
    75  func TestMsgAddLiquidity(t *testing.T) {
    76  	addr, err := hex.DecodeString(addrStr)
    77  	require.Nil(t, err)
    78  	minLiquidity := sdk.NewDec(1)
    79  	maxBaseAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(10000))
    80  	quoteAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(10000))
    81  	deadLine := time.Now().Unix()
    82  	msg := NewMsgAddLiquidity(minLiquidity, maxBaseAmount, quoteAmount, deadLine, addr)
    83  	require.Nil(t, msg.ValidateBasic())
    84  	require.Equal(t, RouterKey, msg.Route())
    85  	require.Equal(t, "add_liquidity", msg.Type())
    86  
    87  	bytesMsg := msg.GetSignBytes()
    88  	resMsg := &MsgAddLiquidity{}
    89  	err = json.Unmarshal(bytesMsg, resMsg)
    90  	require.Nil(t, err)
    91  	resAddr := msg.GetSigners()[0]
    92  	require.EqualValues(t, addr, resAddr)
    93  
    94  	expectTokenPair := TestBasePooledToken + "_" + TestQuotePooledToken
    95  	require.Equal(t, expectTokenPair, msg.GetSwapTokenPairName())
    96  }
    97  
    98  func TestMsgAddLiquidityInvalid(t *testing.T) {
    99  	addr, err := hex.DecodeString(addrStr)
   100  	require.Nil(t, err)
   101  	minLiquidity := sdk.NewDec(1)
   102  	maxBaseAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(10000))
   103  	quoteAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(10000))
   104  	notPositiveQuoteAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(0))
   105  	invalidMaxBaseAmount := sdk.NewDecCoinFromDec("bsa", sdk.NewDec(10000))
   106  	invalidMaxBaseAmount.Denom = "1add"
   107  	invalidQuoteAmount := sdk.NewDecCoinFromDec("bsa", sdk.NewDec(10000))
   108  	invalidQuoteAmount.Denom = "1dfdf"
   109  	notNativeQuoteAmount := sdk.NewDecCoinFromDec("abc", sdk.NewDec(10000))
   110  	deadLine := time.Now().Unix()
   111  
   112  	tests := []struct {
   113  		testCase         string
   114  		minLiquidity     sdk.Dec
   115  		maxBaseAmount    sdk.SysCoin
   116  		quoteAmount      sdk.SysCoin
   117  		deadLine         int64
   118  		addr             sdk.AccAddress
   119  		exceptResultCode uint32
   120  	}{
   121  		{"success", minLiquidity, maxBaseAmount, quoteAmount, deadLine, addr, sdk.CodeOK},
   122  		{"tokens must be positive", minLiquidity, maxBaseAmount, notPositiveQuoteAmount, deadLine, addr, sdk.CodeUnknownRequest},
   123  		{"invalid MaxBaseAmount", minLiquidity, invalidMaxBaseAmount, quoteAmount, deadLine, addr, sdk.CodeUnknownRequest},
   124  		{"invalid QuoteAmount", minLiquidity, maxBaseAmount, invalidQuoteAmount, deadLine, addr, sdk.CodeUnknownRequest},
   125  		{"success(quote token supports any type of tokens)", minLiquidity, maxBaseAmount, notNativeQuoteAmount, deadLine, addr, sdk.CodeOK},
   126  		{"empty sender", minLiquidity, maxBaseAmount, quoteAmount, deadLine, nil, sdk.CodeInvalidAddress},
   127  		{"invalid token", minLiquidity, maxBaseAmount, maxBaseAmount, deadLine, addr, sdk.CodeUnknownRequest},
   128  		{"The lexicographic order of BaseTokenName must be less than QuoteTokenName", minLiquidity, quoteAmount, maxBaseAmount, deadLine, addr, sdk.CodeUnknownRequest},
   129  	}
   130  	for i, testCase := range tests {
   131  		fmt.Println(testCase.testCase)
   132  		msg := NewMsgAddLiquidity(testCase.minLiquidity, testCase.maxBaseAmount, testCase.quoteAmount, testCase.deadLine, testCase.addr)
   133  		err := msg.ValidateBasic()
   134  		fmt.Println(i, err)
   135  		testCode(t, err, testCase.exceptResultCode)
   136  	}
   137  }
   138  
   139  func TestMsgRemoveLiquidity(t *testing.T) {
   140  	addr, err := hex.DecodeString(addrStr)
   141  	require.Nil(t, err)
   142  	liquidity, err := sdk.NewDecFromStr("0.01")
   143  	require.Nil(t, err)
   144  	minBaseAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(1))
   145  	minQuoteAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(1))
   146  	deadLine := time.Now().Unix()
   147  	msg := NewMsgRemoveLiquidity(liquidity, minBaseAmount, minQuoteAmount, deadLine, addr)
   148  
   149  	require.Nil(t, msg.ValidateBasic())
   150  	require.Equal(t, RouterKey, msg.Route())
   151  	require.Equal(t, "remove_liquidity", msg.Type())
   152  
   153  	bytesMsg := msg.GetSignBytes()
   154  	resMsg := &MsgRemoveLiquidity{}
   155  	err = json.Unmarshal(bytesMsg, resMsg)
   156  	require.Nil(t, err)
   157  	resAddr := msg.GetSigners()[0]
   158  	require.EqualValues(t, addr, resAddr)
   159  
   160  	expectTokenPair := TestBasePooledToken + "_" + TestQuotePooledToken
   161  	require.Equal(t, expectTokenPair, msg.GetSwapTokenPairName())
   162  }
   163  
   164  func TestMsgRemoveLiquidityInvalid(t *testing.T) {
   165  	addr, err := hex.DecodeString(addrStr)
   166  	require.Nil(t, err)
   167  	liquidity, err := sdk.NewDecFromStr("0.01")
   168  	require.Nil(t, err)
   169  	minBaseAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(1))
   170  	minQuoteAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(1))
   171  	deadLine := time.Now().Unix()
   172  	notPositiveLiquidity := sdk.NewDec(0)
   173  	invalidMinBaseAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(1))
   174  	invalidMinBaseAmount.Denom = "1sss"
   175  	invalidMinQuoteAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(1))
   176  	invalidMinQuoteAmount.Denom = "1sss"
   177  	notNativeQuoteAmount := sdk.NewDecCoinFromDec("sss", sdk.NewDec(1))
   178  
   179  	tests := []struct {
   180  		testCase         string
   181  		liquidity        sdk.Dec
   182  		minBaseAmount    sdk.SysCoin
   183  		minQuoteAmount   sdk.SysCoin
   184  		deadLine         int64
   185  		addr             sdk.AccAddress
   186  		exceptResultCode uint32
   187  	}{
   188  		{"success", liquidity, minBaseAmount, minQuoteAmount, deadLine, addr, sdk.CodeOK},
   189  		{"empty sender", liquidity, minBaseAmount, minQuoteAmount, deadLine, nil, sdk.CodeInvalidAddress},
   190  		{"coins must be positive", notPositiveLiquidity, minBaseAmount, minQuoteAmount, deadLine, addr, sdk.CodeUnknownRequest},
   191  		{"invalid MinBaseAmount", liquidity, invalidMinBaseAmount, minQuoteAmount, deadLine, addr, sdk.CodeUnknownRequest},
   192  		{"invalid MinQuoteAmount", liquidity, minBaseAmount, invalidMinQuoteAmount, deadLine, addr, sdk.CodeUnknownRequest},
   193  		{"success(quote token supports any type of tokens)", liquidity, minBaseAmount, notNativeQuoteAmount, deadLine, addr, sdk.CodeOK},
   194  		{"invalid token", liquidity, minBaseAmount, minBaseAmount, deadLine, addr, sdk.CodeUnknownRequest},
   195  		{"The lexicographic order of BaseTokenName must be less than QuoteTokenName", liquidity, minQuoteAmount, minBaseAmount, deadLine, addr, sdk.CodeUnknownRequest},
   196  	}
   197  	for _, testCase := range tests {
   198  		msg := NewMsgRemoveLiquidity(testCase.liquidity, testCase.minBaseAmount, testCase.minQuoteAmount, testCase.deadLine, testCase.addr)
   199  		err := msg.ValidateBasic()
   200  		testCode(t, err, testCase.exceptResultCode)
   201  	}
   202  }
   203  
   204  func TestMsgTokenToToken(t *testing.T) {
   205  	addr, err := hex.DecodeString(addrStr)
   206  	require.Nil(t, err)
   207  	minBoughtTokenAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(1))
   208  	deadLine := time.Now().Unix()
   209  	soldTokenAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(2))
   210  	msg := NewMsgTokenToToken(soldTokenAmount, minBoughtTokenAmount, deadLine, addr, addr)
   211  
   212  	require.Nil(t, msg.ValidateBasic())
   213  	require.Equal(t, RouterKey, msg.Route())
   214  	require.Equal(t, TypeMsgTokenSwap, msg.Type())
   215  
   216  	bytesMsg := msg.GetSignBytes()
   217  	resMsg := &MsgTokenToToken{}
   218  	err = json.Unmarshal(bytesMsg, resMsg)
   219  	require.Nil(t, err)
   220  	resAddr := msg.GetSigners()[0]
   221  	require.EqualValues(t, addr, resAddr)
   222  	expectTokenPair := TestBasePooledToken + "_" + TestQuotePooledToken
   223  	require.Equal(t, expectTokenPair, msg.GetSwapTokenPairName())
   224  	msg = NewMsgTokenToToken(minBoughtTokenAmount, soldTokenAmount, deadLine, addr, addr)
   225  	require.Equal(t, expectTokenPair, msg.GetSwapTokenPairName())
   226  }
   227  
   228  func TestMsgTokenToTokenInvalid(t *testing.T) {
   229  	addr, err := hex.DecodeString(addrStr)
   230  	require.Nil(t, err)
   231  	minBoughtTokenAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(1))
   232  	deadLine := time.Now().Unix()
   233  	soldTokenAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(2))
   234  	invalidMinBoughtTokenAmount := sdk.NewDecCoinFromDec(TestBasePooledToken, sdk.NewDec(1))
   235  	invalidMinBoughtTokenAmount.Denom = "1aaa"
   236  	invalidSoldTokenAmount := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(2))
   237  	invalidSoldTokenAmount.Denom = "1sdf"
   238  	invalidSoldTokenAmount2 := sdk.NewDecCoinFromDec(TestQuotePooledToken, sdk.NewDec(0))
   239  	invalidSoldTokenAmount2.Denom = "aaa"
   240  	notNativeSoldTokenAmount := sdk.NewDecCoinFromDec("abc", sdk.NewDec(2))
   241  
   242  	tests := []struct {
   243  		testCase             string
   244  		minBoughtTokenAmount sdk.SysCoin
   245  		soldTokenAmount      sdk.SysCoin
   246  		deadLine             int64
   247  		recipient            sdk.AccAddress
   248  		addr                 sdk.AccAddress
   249  		exceptResultCode     uint32
   250  	}{
   251  		{"success", minBoughtTokenAmount, soldTokenAmount, deadLine, addr, addr, sdk.CodeOK},
   252  		{"empty sender", minBoughtTokenAmount, soldTokenAmount, deadLine, addr, nil, sdk.CodeInvalidAddress},
   253  		{"empty recipient", minBoughtTokenAmount, soldTokenAmount, deadLine, nil, addr, sdk.CodeInvalidAddress},
   254  		{"success(both token to sell and token to buy do not contain native token)", minBoughtTokenAmount, notNativeSoldTokenAmount, deadLine, addr, addr, sdk.CodeOK},
   255  		{"invalid SoldTokenAmount", soldTokenAmount, invalidSoldTokenAmount, deadLine, addr, addr, sdk.CodeUnknownRequest},
   256  		{"invalid MinBoughtTokenAmount", invalidMinBoughtTokenAmount, soldTokenAmount, deadLine, addr, addr, sdk.CodeUnknownRequest},
   257  		{"invalid token", minBoughtTokenAmount, minBoughtTokenAmount, deadLine, addr, addr, sdk.CodeUnknownRequest},
   258  		{"invalid SoldTokenAmount(zero)", minBoughtTokenAmount, invalidSoldTokenAmount2, deadLine, addr, addr, sdk.CodeUnknownRequest},
   259  	}
   260  	for _, testCase := range tests {
   261  		msg := NewMsgTokenToToken(testCase.soldTokenAmount, testCase.minBoughtTokenAmount, testCase.deadLine, testCase.recipient, testCase.addr)
   262  		err := msg.ValidateBasic()
   263  		testCode(t, err, testCase.exceptResultCode)
   264  	}
   265  }