github.com/KiraCore/sekai@v0.3.43/x/layer2/keeper/lp_swap_redeem_convert_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"github.com/KiraCore/sekai/x/layer2/types"
     5  	"github.com/cometbft/cometbft/crypto/ed25519"
     6  	sdk "github.com/cosmos/cosmos-sdk/types"
     7  	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
     8  	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
     9  )
    10  
    11  func (suite *KeeperTestSuite) TestLpTokenPrice() {
    12  	dapp := types.Dapp{
    13  		Name:        "dapp1",
    14  		Denom:       "dapp1",
    15  		Description: "dapp1 description",
    16  		Status:      types.Active,
    17  		Website:     "",
    18  		Logo:        "",
    19  		Social:      "",
    20  		Docs:        "",
    21  		Controllers: types.Controllers{
    22  			Whitelist: types.AccountRange{
    23  				Roles:     []uint64{1},
    24  				Addresses: []string{"kira1q24436yrnettd6v4eu6r4t9gycnnddack4jr5r"},
    25  			},
    26  		},
    27  		Bin: []types.BinaryInfo{
    28  			{
    29  				Name:      "dapp1",
    30  				Hash:      "dapp1",
    31  				Source:    "dapp1",
    32  				Reference: "dapp1",
    33  				Type:      "dapp1",
    34  			},
    35  		},
    36  		Pool: types.LpPoolConfig{
    37  			Ratio:   sdk.OneDec(),
    38  			Deposit: "",
    39  			Drip:    86400,
    40  		},
    41  		Issurance: types.IssuranceConfig{
    42  			Deposit:  "",
    43  			Premint:  sdk.OneInt(),
    44  			Postmint: sdk.OneInt(),
    45  			Time:     1680141605,
    46  		},
    47  		VoteQuorum:    30,
    48  		VotePeriod:    86400,
    49  		VoteEnactment: 3000,
    50  		UpdateTimeMax: 60,
    51  		ExecutorsMin:  1,
    52  		ExecutorsMax:  2,
    53  		VerifiersMin:  1,
    54  		TotalBond:     sdk.NewInt64Coin("ukex", 10000),
    55  		CreationTime:  0,
    56  		PoolFee:       sdk.NewDec(1),
    57  	}
    58  
    59  	suite.app.Layer2Keeper.SetDapp(suite.ctx, dapp)
    60  
    61  	lpToken := dapp.LpToken()
    62  	err := suite.app.BankKeeper.MintCoins(suite.ctx, minttypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(lpToken, 10000)})
    63  	suite.Require().NoError(err)
    64  
    65  	price := suite.app.Layer2Keeper.LpTokenPrice(suite.ctx, dapp)
    66  	suite.Require().Equal(price, sdk.OneDec())
    67  }
    68  
    69  func (suite *KeeperTestSuite) TestOnCollectFee() {
    70  	coins := sdk.Coins{sdk.NewInt64Coin("ukex", 10000)}
    71  	err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins)
    72  	suite.Require().NoError(err)
    73  
    74  	moduleAddr := authtypes.NewModuleAddress(types.ModuleName)
    75  	balances := suite.app.BankKeeper.GetAllBalances(suite.ctx, moduleAddr)
    76  	suite.Require().False(balances.Empty())
    77  
    78  	err = suite.app.Layer2Keeper.OnCollectFee(suite.ctx, coins)
    79  	suite.Require().NoError(err)
    80  
    81  	balances = suite.app.BankKeeper.GetAllBalances(suite.ctx, moduleAddr)
    82  	suite.Require().True(balances.Empty())
    83  }
    84  
    85  func (suite *KeeperTestSuite) TestRedeemDappPoolTx() {
    86  	dapp := types.Dapp{
    87  		Name:        "dapp1",
    88  		Denom:       "dapp1",
    89  		Description: "dapp1 description",
    90  		Status:      types.Active,
    91  		Website:     "",
    92  		Logo:        "",
    93  		Social:      "",
    94  		Docs:        "",
    95  		Controllers: types.Controllers{
    96  			Whitelist: types.AccountRange{
    97  				Roles:     []uint64{1},
    98  				Addresses: []string{"kira1q24436yrnettd6v4eu6r4t9gycnnddack4jr5r"},
    99  			},
   100  		},
   101  		Bin: []types.BinaryInfo{
   102  			{
   103  				Name:      "dapp1",
   104  				Hash:      "dapp1",
   105  				Source:    "dapp1",
   106  				Reference: "dapp1",
   107  				Type:      "dapp1",
   108  			},
   109  		},
   110  		Pool: types.LpPoolConfig{
   111  			Ratio:   sdk.OneDec(),
   112  			Deposit: "",
   113  			Drip:    86400,
   114  		},
   115  		Issurance: types.IssuranceConfig{
   116  			Deposit:  "",
   117  			Premint:  sdk.OneInt(),
   118  			Postmint: sdk.OneInt(),
   119  			Time:     1680141605,
   120  		},
   121  		VoteQuorum:    30,
   122  		VotePeriod:    86400,
   123  		VoteEnactment: 3000,
   124  		UpdateTimeMax: 60,
   125  		ExecutorsMin:  1,
   126  		ExecutorsMax:  2,
   127  		VerifiersMin:  1,
   128  		TotalBond:     sdk.NewInt64Coin("ukex", 10000),
   129  		CreationTime:  0,
   130  		PoolFee:       sdk.NewDec(1),
   131  	}
   132  
   133  	suite.app.Layer2Keeper.SetDapp(suite.ctx, dapp)
   134  
   135  	lpToken := dapp.LpToken()
   136  	lpCoins := sdk.Coins{sdk.NewInt64Coin(lpToken, 10000)}
   137  	err := suite.app.BankKeeper.MintCoins(suite.ctx, minttypes.ModuleName, lpCoins)
   138  	suite.Require().NoError(err)
   139  
   140  	addr := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes())
   141  	err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, minttypes.ModuleName, addr, lpCoins)
   142  	suite.Require().NoError(err)
   143  
   144  	err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, sdk.Coins{dapp.TotalBond})
   145  	suite.Require().NoError(err)
   146  
   147  	price := suite.app.Layer2Keeper.LpTokenPrice(suite.ctx, dapp)
   148  	suite.Require().Equal(price, sdk.OneDec())
   149  
   150  	out, err := suite.app.Layer2Keeper.RedeemDappPoolTx(suite.ctx, addr, dapp, sdk.NewDecWithPrec(1, 1), sdk.NewInt64Coin(lpToken, 1000))
   151  	suite.Require().NoError(err)
   152  	suite.Require().Equal(out.String(), "819ukex")
   153  
   154  	out, err = suite.app.Layer2Keeper.SwapDappPoolTx(suite.ctx, addr, dapp, sdk.NewDecWithPrec(1, 1), sdk.NewInt64Coin("ukex", 800))
   155  	suite.Require().NoError(err)
   156  	suite.Require().Equal(out.String(), "667lp/dapp1")
   157  }
   158  
   159  func (suite *KeeperTestSuite) TestConvertDappPoolTx() {
   160  	dapps := []types.Dapp{
   161  		{
   162  			Name:        "dapp1",
   163  			Denom:       "dapp1",
   164  			Description: "dapp1 description",
   165  			Status:      types.Active,
   166  			Website:     "",
   167  			Logo:        "",
   168  			Social:      "",
   169  			Docs:        "",
   170  			Controllers: types.Controllers{
   171  				Whitelist: types.AccountRange{
   172  					Roles:     []uint64{1},
   173  					Addresses: []string{"kira1q24436yrnettd6v4eu6r4t9gycnnddack4jr5r"},
   174  				},
   175  			},
   176  			Bin: []types.BinaryInfo{
   177  				{
   178  					Name:      "dapp1",
   179  					Hash:      "dapp1",
   180  					Source:    "dapp1",
   181  					Reference: "dapp1",
   182  					Type:      "dapp1",
   183  				},
   184  			},
   185  			Pool: types.LpPoolConfig{
   186  				Ratio:   sdk.OneDec(),
   187  				Deposit: "",
   188  				Drip:    86400,
   189  			},
   190  			Issurance: types.IssuranceConfig{
   191  				Deposit:  "",
   192  				Premint:  sdk.OneInt(),
   193  				Postmint: sdk.OneInt(),
   194  				Time:     1680141605,
   195  			},
   196  			VoteQuorum:    30,
   197  			VotePeriod:    86400,
   198  			VoteEnactment: 3000,
   199  			UpdateTimeMax: 60,
   200  			ExecutorsMin:  1,
   201  			ExecutorsMax:  2,
   202  			VerifiersMin:  1,
   203  			TotalBond:     sdk.NewInt64Coin("ukex", 10000),
   204  			CreationTime:  0,
   205  			PoolFee:       sdk.NewDec(1),
   206  		},
   207  		{
   208  			Name:        "dapp2",
   209  			Denom:       "dapp2",
   210  			Description: "dapp2 description",
   211  			Status:      types.Active,
   212  			Website:     "",
   213  			Logo:        "",
   214  			Social:      "",
   215  			Docs:        "",
   216  			Controllers: types.Controllers{
   217  				Whitelist: types.AccountRange{
   218  					Roles:     []uint64{1},
   219  					Addresses: []string{"kira1q24436yrnettd6v4eu6r4t9gycnnddack4jr5r"},
   220  				},
   221  			},
   222  			Bin: []types.BinaryInfo{
   223  				{
   224  					Name:      "dapp2",
   225  					Hash:      "dapp2",
   226  					Source:    "dapp2",
   227  					Reference: "dapp2",
   228  					Type:      "dapp2",
   229  				},
   230  			},
   231  			Pool: types.LpPoolConfig{
   232  				Ratio:   sdk.OneDec(),
   233  				Deposit: "",
   234  				Drip:    86400,
   235  			},
   236  			Issurance: types.IssuranceConfig{
   237  				Deposit:  "",
   238  				Premint:  sdk.OneInt(),
   239  				Postmint: sdk.OneInt(),
   240  				Time:     1680141605,
   241  			},
   242  			VoteQuorum:    30,
   243  			VotePeriod:    86400,
   244  			VoteEnactment: 3000,
   245  			UpdateTimeMax: 60,
   246  			ExecutorsMin:  1,
   247  			ExecutorsMax:  2,
   248  			VerifiersMin:  1,
   249  			TotalBond:     sdk.NewInt64Coin("ukex", 10000),
   250  			CreationTime:  0,
   251  			PoolFee:       sdk.NewDec(1),
   252  		},
   253  	}
   254  
   255  	for _, dapp := range dapps {
   256  		suite.app.Layer2Keeper.SetDapp(suite.ctx, dapp)
   257  	}
   258  	dapp1 := dapps[0]
   259  	dapp2 := dapps[1]
   260  
   261  	addr := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes())
   262  
   263  	lpToken1 := dapp1.LpToken()
   264  	lpCoins1 := sdk.Coins{sdk.NewInt64Coin(lpToken1, 10000)}
   265  	err := suite.app.BankKeeper.MintCoins(suite.ctx, minttypes.ModuleName, lpCoins1)
   266  	suite.Require().NoError(err)
   267  	err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, minttypes.ModuleName, addr, lpCoins1)
   268  	suite.Require().NoError(err)
   269  
   270  	lpToken2 := dapp2.LpToken()
   271  	lpCoins2 := sdk.Coins{sdk.NewInt64Coin(lpToken2, 10000)}
   272  	err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, lpCoins2)
   273  	suite.Require().NoError(err)
   274  
   275  	err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, sdk.Coins{dapp1.TotalBond})
   276  	suite.Require().NoError(err)
   277  
   278  	price := suite.app.Layer2Keeper.LpTokenPrice(suite.ctx, dapp1)
   279  	suite.Require().Equal(price, sdk.OneDec())
   280  
   281  	out, err := suite.app.Layer2Keeper.ConvertDappPoolTx(suite.ctx, addr, dapp1, dapp2, sdk.NewInt64Coin(lpToken1, 1000))
   282  	suite.Require().NoError(err)
   283  	suite.Require().Equal(out.String(), "218lp/dapp2")
   284  }