github.com/KiraCore/sekai@v0.3.43/x/basket/keeper/basket_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/KiraCore/sekai/x/basket/types"
     7  	sdk "github.com/cosmos/cosmos-sdk/types"
     8  )
     9  
    10  func (suite *KeeperTestSuite) TestLastBasketIdGetSet() {
    11  	suite.SetupTest()
    12  
    13  	now := time.Now().UTC()
    14  	suite.ctx = suite.ctx.WithBlockTime(now.Add(time.Hour))
    15  
    16  	suite.app.BasketKeeper.SetLastBasketId(suite.ctx, 1)
    17  	lastBasketId := suite.app.BasketKeeper.GetLastBasketId(suite.ctx)
    18  	suite.Require().Equal(lastBasketId, uint64(1))
    19  }
    20  
    21  func (suite *KeeperTestSuite) TestBasketSetGetDelete() {
    22  	baskets := []types.Basket{
    23  		{
    24  			Id:              1,
    25  			Suffix:          "usd",
    26  			Description:     "usd basket",
    27  			LimitsPeriod:    1800,
    28  			Amount:          sdk.NewInt(1000),
    29  			SwapFee:         sdk.NewDecWithPrec(1, 2), // 1%
    30  			SlipppageFeeMin: sdk.NewDecWithPrec(1, 2), // 1%
    31  			TokensCap:       sdk.NewDecWithPrec(9, 1), // 90%
    32  			MintsMin:        sdk.NewInt(1),
    33  			MintsMax:        sdk.NewInt(100000000),
    34  			MintsDisabled:   false,
    35  			BurnsMin:        sdk.NewInt(1),
    36  			BurnsMax:        sdk.NewInt(100000000),
    37  			BurnsDisabled:   false,
    38  			SwapsMin:        sdk.NewInt(1),
    39  			SwapsMax:        sdk.NewInt(100000000),
    40  			SwapsDisabled:   false,
    41  			Tokens: []types.BasketToken{
    42  				{
    43  					Denom:     "usd1",
    44  					Weight:    sdk.NewDec(1),
    45  					Amount:    sdk.NewInt(500),
    46  					Deposits:  true,
    47  					Withdraws: true,
    48  					Swaps:     true,
    49  				},
    50  				{
    51  					Denom:     "usd2",
    52  					Weight:    sdk.NewDec(10),
    53  					Amount:    sdk.NewInt(50),
    54  					Deposits:  true,
    55  					Withdraws: true,
    56  					Swaps:     true,
    57  				},
    58  			},
    59  			Surplus: sdk.NewCoins(sdk.NewInt64Coin("usd2", 1)),
    60  		},
    61  		{
    62  			Id:              2,
    63  			Suffix:          "euro",
    64  			Description:     "euro basket",
    65  			LimitsPeriod:    1800,
    66  			Amount:          sdk.NewInt(1000),
    67  			SwapFee:         sdk.NewDecWithPrec(1, 2), // 1%
    68  			SlipppageFeeMin: sdk.NewDecWithPrec(1, 2), // 1%
    69  			TokensCap:       sdk.NewDecWithPrec(9, 1), // 90%
    70  			MintsMin:        sdk.NewInt(1),
    71  			MintsMax:        sdk.NewInt(100000000),
    72  			MintsDisabled:   false,
    73  			BurnsMin:        sdk.NewInt(1),
    74  			BurnsMax:        sdk.NewInt(100000000),
    75  			BurnsDisabled:   false,
    76  			SwapsMin:        sdk.NewInt(1),
    77  			SwapsMax:        sdk.NewInt(100000000),
    78  			SwapsDisabled:   false,
    79  			Tokens: []types.BasketToken{
    80  				{
    81  					Denom:     "euro1",
    82  					Weight:    sdk.NewDec(1),
    83  					Amount:    sdk.NewInt(500),
    84  					Deposits:  true,
    85  					Withdraws: true,
    86  					Swaps:     true,
    87  				},
    88  				{
    89  					Denom:     "euro2",
    90  					Weight:    sdk.NewDec(10),
    91  					Amount:    sdk.NewInt(50),
    92  					Deposits:  true,
    93  					Withdraws: true,
    94  					Swaps:     true,
    95  				},
    96  			},
    97  			Surplus: sdk.NewCoins(sdk.NewInt64Coin("euro2", 1)),
    98  		},
    99  	}
   100  
   101  	for _, basket := range baskets {
   102  		suite.app.BasketKeeper.SetBasket(suite.ctx, basket)
   103  	}
   104  
   105  	for _, basket := range baskets {
   106  		b, err := suite.app.BasketKeeper.GetBasketById(suite.ctx, basket.Id)
   107  		suite.Require().NoError(err)
   108  		suite.Require().Equal(b, basket)
   109  
   110  		b, err = suite.app.BasketKeeper.GetBasketByDenom(suite.ctx, basket.GetBasketDenom())
   111  		suite.Require().NoError(err)
   112  		suite.Require().Equal(b, basket)
   113  	}
   114  
   115  	allBaskets := suite.app.BasketKeeper.GetAllBaskets(suite.ctx)
   116  	suite.Require().Len(allBaskets, 2)
   117  
   118  	suite.app.BasketKeeper.DeleteBasket(suite.ctx, baskets[0])
   119  
   120  	allBaskets = suite.app.BasketKeeper.GetAllBaskets(suite.ctx)
   121  	suite.Require().Len(allBaskets, 1)
   122  
   123  	_, err := suite.app.BasketKeeper.GetBasketById(suite.ctx, baskets[0].Id)
   124  	suite.Require().Error(err)
   125  
   126  	_, err = suite.app.BasketKeeper.GetBasketByDenom(suite.ctx, baskets[0].GetBasketDenom())
   127  	suite.Require().Error(err)
   128  }
   129  
   130  func (suite *KeeperTestSuite) TestCreateBasket() {
   131  	sampleBasket := types.Basket{
   132  		Id:              1,
   133  		Suffix:          "usd",
   134  		Description:     "usd basket",
   135  		LimitsPeriod:    1800,
   136  		Amount:          sdk.NewInt(1000),
   137  		SwapFee:         sdk.NewDecWithPrec(1, 2), // 1%
   138  		SlipppageFeeMin: sdk.NewDecWithPrec(1, 2), // 1%
   139  		TokensCap:       sdk.NewDecWithPrec(9, 1), // 90%
   140  		MintsMin:        sdk.NewInt(1),
   141  		MintsMax:        sdk.NewInt(100000000),
   142  		MintsDisabled:   false,
   143  		BurnsMin:        sdk.NewInt(1),
   144  		BurnsMax:        sdk.NewInt(100000000),
   145  		BurnsDisabled:   false,
   146  		SwapsMin:        sdk.NewInt(1),
   147  		SwapsMax:        sdk.NewInt(100000000),
   148  		SwapsDisabled:   false,
   149  		Tokens: []types.BasketToken{
   150  			{
   151  				Denom:     "usd1",
   152  				Weight:    sdk.NewDec(1),
   153  				Amount:    sdk.NewInt(500),
   154  				Deposits:  true,
   155  				Withdraws: true,
   156  				Swaps:     true,
   157  			},
   158  			{
   159  				Denom:     "usd2",
   160  				Weight:    sdk.NewDec(10),
   161  				Amount:    sdk.NewInt(50),
   162  				Deposits:  true,
   163  				Withdraws: true,
   164  				Swaps:     true,
   165  			},
   166  		},
   167  		Surplus: sdk.NewCoins(sdk.NewInt64Coin("usd2", 1)),
   168  	}
   169  
   170  	err := suite.app.BasketKeeper.CreateBasket(suite.ctx, sampleBasket)
   171  	suite.Require().NoError(err)
   172  
   173  	baskets := suite.app.BasketKeeper.GetAllBaskets(suite.ctx)
   174  	suite.Require().Len(baskets, 1)
   175  
   176  	basket := baskets[0]
   177  	lastBasketId := suite.app.BasketKeeper.GetLastBasketId(suite.ctx)
   178  	suite.Require().Equal(lastBasketId, basket.Id)
   179  	// surplus zero check
   180  	suite.Require().Nil(basket.Surplus)
   181  
   182  	// token amount to be zero
   183  	for _, token := range basket.Tokens {
   184  		suite.Require().Equal(token.Amount, sdk.ZeroInt())
   185  	}
   186  
   187  	// total number of tokens zero check
   188  	basket = sampleBasket
   189  	basket.Tokens = []types.BasketToken{}
   190  	err = suite.app.BasketKeeper.CreateBasket(suite.ctx, basket)
   191  	suite.Require().Error(err)
   192  
   193  	// token weight zero check
   194  	basket = sampleBasket
   195  	basket.Tokens[0].Weight = sdk.ZeroDec()
   196  	err = suite.app.BasketKeeper.CreateBasket(suite.ctx, basket)
   197  	suite.Require().Error(err)
   198  
   199  	// duplicated denom check
   200  	basket = sampleBasket
   201  	basket.Tokens[1].Denom = basket.Tokens[0].Denom
   202  	err = suite.app.BasketKeeper.CreateBasket(suite.ctx, basket)
   203  	suite.Require().Error(err)
   204  
   205  	// invalid denom check
   206  	basket = sampleBasket
   207  	basket.Tokens[0].Denom = "1"
   208  	err = suite.app.BasketKeeper.CreateBasket(suite.ctx, basket)
   209  	suite.Require().Error(err)
   210  }
   211  
   212  func (suite *KeeperTestSuite) TestEditBasket() {
   213  	sampleBasket := types.Basket{
   214  		Id:              1,
   215  		Suffix:          "usd",
   216  		Description:     "usd basket",
   217  		LimitsPeriod:    1800,
   218  		Amount:          sdk.NewInt(1000),
   219  		SwapFee:         sdk.NewDecWithPrec(1, 2), // 1%
   220  		SlipppageFeeMin: sdk.NewDecWithPrec(1, 2), // 1%
   221  		TokensCap:       sdk.NewDecWithPrec(9, 1), // 90%
   222  		MintsMin:        sdk.NewInt(1),
   223  		MintsMax:        sdk.NewInt(100000000),
   224  		MintsDisabled:   false,
   225  		BurnsMin:        sdk.NewInt(1),
   226  		BurnsMax:        sdk.NewInt(100000000),
   227  		BurnsDisabled:   false,
   228  		SwapsMin:        sdk.NewInt(1),
   229  		SwapsMax:        sdk.NewInt(100000000),
   230  		SwapsDisabled:   false,
   231  		Tokens: []types.BasketToken{
   232  			{
   233  				Denom:     "usd1",
   234  				Weight:    sdk.NewDec(1),
   235  				Amount:    sdk.NewInt(500),
   236  				Deposits:  true,
   237  				Withdraws: true,
   238  				Swaps:     true,
   239  			},
   240  			{
   241  				Denom:     "usd2",
   242  				Weight:    sdk.NewDec(10),
   243  				Amount:    sdk.NewInt(50),
   244  				Deposits:  true,
   245  				Withdraws: true,
   246  				Swaps:     true,
   247  			},
   248  		},
   249  		Surplus: sdk.NewCoins(sdk.NewInt64Coin("usd2", 1)),
   250  	}
   251  
   252  	suite.app.BasketKeeper.SetBasket(suite.ctx, sampleBasket)
   253  
   254  	// successful update check
   255  	basket := sampleBasket
   256  	basket.Tokens[0].Deposits = false
   257  	err := suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   258  	suite.Require().NoError(err)
   259  	savedBasket, err := suite.app.BasketKeeper.GetBasketById(suite.ctx, basket.Id)
   260  	suite.Require().NoError(err)
   261  	suite.Require().Equal(savedBasket, basket)
   262  
   263  	// surplus amount does not change check
   264  	basket = sampleBasket
   265  	basket.Surplus = sdk.NewCoins(sdk.NewInt64Coin("usd1", 10000000))
   266  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   267  	suite.Require().NoError(err)
   268  	savedBasket, err = suite.app.BasketKeeper.GetBasketById(suite.ctx, basket.Id)
   269  	suite.Require().NoError(err)
   270  	suite.Require().Equal(savedBasket.Surplus, sampleBasket.Surplus)
   271  
   272  	// token amount derivate from previous state or zero
   273  	basket.Tokens = append(basket.Tokens,
   274  		types.BasketToken{
   275  			Denom:     "usd3",
   276  			Weight:    sdk.NewDec(1),
   277  			Amount:    sdk.NewInt(500),
   278  			Deposits:  true,
   279  			Withdraws: true,
   280  			Swaps:     true,
   281  		})
   282  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   283  	suite.Require().NoError(err)
   284  	savedBasket, err = suite.app.BasketKeeper.GetBasketById(suite.ctx, basket.Id)
   285  	suite.Require().NoError(err)
   286  	suite.Require().Len(savedBasket.Tokens, 3)
   287  	suite.Require().Equal(savedBasket.Tokens[0].Amount, sampleBasket.Tokens[0].Amount)
   288  	suite.Require().Equal(savedBasket.Tokens[1].Amount, sampleBasket.Tokens[1].Amount)
   289  	suite.Require().Equal(savedBasket.Tokens[2].Amount, sdk.ZeroInt())
   290  
   291  	// basket existance check
   292  	basket = sampleBasket
   293  	basket.Id = 1000
   294  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   295  	suite.Require().Error(err)
   296  
   297  	// total number of tokens zero check
   298  	basket = sampleBasket
   299  	basket.Tokens = []types.BasketToken{}
   300  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   301  	suite.Require().Error(err)
   302  
   303  	// token weight zero check
   304  	basket = sampleBasket
   305  	basket.Tokens[0].Weight = sdk.ZeroDec()
   306  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   307  	suite.Require().Error(err)
   308  
   309  	// duplicated denom check
   310  	basket = sampleBasket
   311  	basket.Tokens[1].Denom = basket.Tokens[0].Denom
   312  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   313  	suite.Require().Error(err)
   314  
   315  	// invalid denom check
   316  	basket = sampleBasket
   317  	basket.Tokens[0].Denom = "1"
   318  	err = suite.app.BasketKeeper.EditBasket(suite.ctx, basket)
   319  	suite.Require().Error(err)
   320  }