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 }