github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/token/keeper_test.go (about)

     1  package token
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mock"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    10  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/fibonacci-chain/fbc/x/common"
    14  	"github.com/fibonacci-chain/fbc/x/token/types"
    15  )
    16  
    17  func TestKeeper_GetFeeDetailList(t *testing.T) {
    18  	_, keeper, _ := getMockDexApp(t, 0)
    19  	keeper.GetFeeDetailList()
    20  }
    21  
    22  func TestKeeper_UpdateTokenSupply(t *testing.T) {
    23  	mapp, keeper, _ := getMockDexApp(t, 0)
    24  
    25  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
    26  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
    27  
    28  	token := types.Token{
    29  		Description:         "new token",
    30  		Symbol:              common.NativeToken,
    31  		OriginalSymbol:      common.NativeToken,
    32  		WholeName:           "ok coin",
    33  		OriginalTotalSupply: sdk.NewDec(10000),
    34  		Owner:               []byte("gyl"),
    35  		Mintable:            true,
    36  	}
    37  	keeper.NewToken(ctx, token)
    38  
    39  	info := keeper.GetTokenInfo(ctx, "xxbToken")
    40  	require.EqualValues(t, "", info.Symbol)
    41  
    42  	info = keeper.GetTokenInfo(ctx, common.NativeToken)
    43  	require.EqualValues(t, common.NativeToken, info.Symbol)
    44  	tokens := keeper.GetTokensInfo(ctx)
    45  	require.Equal(t, info, tokens[0])
    46  	require.Equal(t, len(tokens), len(keeper.GetCurrenciesInfo(ctx)))
    47  
    48  	name, flag := addTokenSuffix(ctx, keeper, common.NativeToken)
    49  	require.Equal(t, true, flag)
    50  	require.NotEqual(t, common.NativeToken, name)
    51  
    52  	name, flag = addTokenSuffix(ctx, keeper, common.NativeToken+"@#$")
    53  	require.Equal(t, false, flag)
    54  	require.Equal(t, "", name)
    55  
    56  	token = types.Token{
    57  		Description:         "new token",
    58  		Symbol:              common.NativeToken,
    59  		OriginalSymbol:      common.NativeToken,
    60  		WholeName:           "ok coin",
    61  		OriginalTotalSupply: sdk.NewDec(10000),
    62  		Owner:               []byte("gyl"),
    63  		Mintable:            true,
    64  	}
    65  	store := ctx.KVStore(keeper.tokenStoreKey)
    66  	store.Set(types.TokenNumberKey, []byte("0"))
    67  	keeper.NewToken(ctx, token)
    68  }
    69  
    70  func TestKeeper_AddFeeDetail(t *testing.T) {
    71  	mapp, keeper, addrs := getMockDexApp(t, 2)
    72  
    73  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
    74  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
    75  	keeper.enableBackend = true
    76  
    77  	fee, err := sdk.ParseDecCoins(fmt.Sprintf("100%s", common.NativeToken))
    78  	require.Nil(t, err)
    79  
    80  	feeType := "test fee type"
    81  	keeper.AddFeeDetail(ctx, addrs[0].String(), fee, feeType, "")
    82  	keeper.AddFeeDetail(ctx, addrs[1].String(), fee, feeType, "")
    83  
    84  	feeList := keeper.GetFeeDetailList()
    85  	require.Equal(t, 2, len(feeList))
    86  
    87  	require.Equal(t, fee.String(), feeList[0].Fee)
    88  	require.Equal(t, addrs[0].String(), feeList[0].Address)
    89  	require.Equal(t, addrs[1].String(), feeList[1].Address)
    90  }
    91  
    92  func TestKeeper_LockCoins(t *testing.T) {
    93  	mapp, keeper, _ := getMockDexApp(t, 0)
    94  
    95  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
    96  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
    97  
    98  	genAccs, testAccounts := CreateGenAccounts(1,
    99  		sdk.SysCoins{
   100  			sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1000000000)),
   101  		})
   102  	mock.SetGenesis(mapp.App, types.DecAccountArrToBaseAccountArr(genAccs))
   103  
   104  	expectedLockedCoins := sdk.SysCoins{
   105  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(100)),
   106  	}
   107  
   108  	err := keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, expectedLockedCoins, types.LockCoinsTypeQuantity)
   109  	require.NoError(t, err)
   110  	lockedCoins := keeper.GetLockedCoins(ctx, testAccounts[0].baseAccount.Address)
   111  	require.EqualValues(t, expectedLockedCoins, lockedCoins)
   112  	err = keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, expectedLockedCoins, types.LockCoinsTypeQuantity)
   113  	require.NoError(t, err)
   114  	BigCoins := sdk.SysCoins{
   115  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(100000000000)),
   116  	}
   117  	err = keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, BigCoins, types.LockCoinsTypeQuantity)
   118  	require.Error(t, err)
   119  	_, lockStoreKeyNum := keeper.getNumKeys(ctx)
   120  	require.Equal(t, int64(1), lockStoreKeyNum)
   121  
   122  	locks := keeper.GetAllLockedCoins(ctx)
   123  	require.NotNil(t, locks)
   124  	require.EqualValues(t, common.NativeToken, locks[0].Coins[0].Denom)
   125  }
   126  
   127  func TestKeeper_UnlockCoins(t *testing.T) {
   128  	mapp, keeper, _ := getMockDexApp(t, 0)
   129  
   130  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
   131  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
   132  	mapp.supplyKeeper.SetSupply(ctx, supply.NewSupply(mapp.TotalCoinsSupply))
   133  
   134  	genAccs, testAccounts := CreateGenAccounts(1,
   135  		sdk.SysCoins{
   136  			sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1000000000)),
   137  		})
   138  	mock.SetGenesis(mapp.App, types.DecAccountArrToBaseAccountArr(genAccs))
   139  
   140  	lockCoins := sdk.SysCoins{
   141  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(100)),
   142  	}
   143  
   144  	err := keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, lockCoins, types.LockCoinsTypeQuantity)
   145  	require.NoError(t, err)
   146  
   147  	unlockCoins := sdk.SysCoins{
   148  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(10)),
   149  	}
   150  
   151  	err = keeper.UnlockCoins(ctx, testAccounts[0].baseAccount.Address, unlockCoins, types.LockCoinsTypeQuantity)
   152  	require.NoError(t, err)
   153  	err = keeper.UnlockCoins(ctx, []byte(""), unlockCoins, types.LockCoinsTypeQuantity)
   154  	require.Error(t, err)
   155  
   156  	biglockCoins := sdk.SysCoins{
   157  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(999999999)),
   158  	}
   159  
   160  	err = keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, biglockCoins, types.LockCoinsTypeQuantity)
   161  	require.Error(t, err)
   162  	bigunlockCoins := sdk.SysCoins{
   163  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(10000000000000)),
   164  	}
   165  	err = keeper.UnlockCoins(ctx, testAccounts[0].baseAccount.Address, bigunlockCoins, types.LockCoinsTypeQuantity)
   166  	require.Error(t, err)
   167  
   168  	//expectedLockCoins
   169  	expectedCoins := sdk.SysCoins{
   170  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(90)),
   171  	}
   172  	require.EqualValues(t, keeper.GetLockedCoins(ctx, testAccounts[0].baseAccount.Address), expectedCoins)
   173  
   174  	err = keeper.UnlockCoins(ctx, testAccounts[0].baseAccount.Address, keeper.GetLockedCoins(ctx, testAccounts[0].baseAccount.Address), types.LockCoinsTypeQuantity)
   175  	require.NoError(t, err)
   176  	require.EqualValues(t, keeper.GetLockedCoins(ctx, testAccounts[0].baseAccount.Address), sdk.SysCoins(nil))
   177  }
   178  
   179  func TestKeeper_BurnLockedCoins(t *testing.T) {
   180  	mapp, keeper, _ := getMockDexApp(t, 0)
   181  
   182  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
   183  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
   184  
   185  	initCoins := sdk.SysCoins{sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1000000000))}
   186  	genAccs, testAccounts := CreateGenAccounts(1, initCoins)
   187  	mock.SetGenesis(mapp.App, types.DecAccountArrToBaseAccountArr(genAccs))
   188  	mapp.supplyKeeper.SetSupply(ctx, supply.NewSupply(initCoins))
   189  
   190  	lockCoins := sdk.SysCoins{
   191  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(100)),
   192  	}
   193  	err := keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, lockCoins, types.LockCoinsTypeQuantity)
   194  	require.NoError(t, err)
   195  	burnLockCoins := sdk.SysCoins{
   196  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(5)),
   197  	}
   198  	err = keeper.BalanceAccount(ctx, testAccounts[0].baseAccount.Address, burnLockCoins, sdk.ZeroFee().ToCoins())
   199  	require.Nil(t, err)
   200  
   201  	expectedCoins := sdk.SysCoins{
   202  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(95)),
   203  	}
   204  	require.EqualValues(t, keeper.GetLockedCoins(ctx, testAccounts[0].baseAccount.Address), expectedCoins)
   205  	err = keeper.BalanceAccount(ctx, testAccounts[0].baseAccount.Address, expectedCoins, sdk.ZeroFee().ToCoins())
   206  	require.Nil(t, err)
   207  
   208  	expectedCoins = sdk.SysCoins{
   209  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(10000000000000)),
   210  	}
   211  	err = keeper.BalanceAccount(ctx, testAccounts[0].baseAccount.Address, expectedCoins, sdk.ZeroFee().ToCoins())
   212  	require.NotNil(t, err)
   213  }
   214  
   215  func TestKeeper_ReceiveLockedCoins(t *testing.T) {
   216  	mapp, keeper, _ := getMockDexApp(t, 0)
   217  
   218  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
   219  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
   220  
   221  	genAccs, testAccounts := CreateGenAccounts(1,
   222  		sdk.SysCoins{
   223  			sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1000)),
   224  		})
   225  	mock.SetGenesis(mapp.App, types.DecAccountArrToBaseAccountArr(genAccs))
   226  
   227  	lockCoins := sdk.SysCoins{
   228  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(100)),
   229  	}
   230  	err := keeper.LockCoins(ctx, testAccounts[0].baseAccount.Address, lockCoins, types.LockCoinsTypeQuantity)
   231  	require.Nil(t, err)
   232  
   233  	err = keeper.BalanceAccount(ctx, testAccounts[0].baseAccount.Address, sdk.ZeroFee().ToCoins(), lockCoins)
   234  	require.Nil(t, err)
   235  	coins := keeper.GetCoins(ctx, testAccounts[0].baseAccount.Address)
   236  
   237  	expectedCoins := sdk.SysCoins{
   238  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1000)),
   239  	}
   240  	require.EqualValues(t, expectedCoins, coins)
   241  }
   242  
   243  func TestKeeper_SetCoins(t *testing.T) {
   244  	mapp, keeper, _ := getMockDexApp(t, 0)
   245  
   246  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
   247  	ctx := mapp.BaseApp.NewContext(false, abci.Header{})
   248  
   249  	genAccs, testAccounts := CreateGenAccounts(2,
   250  		sdk.SysCoins{
   251  			sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1000)),
   252  		})
   253  	mock.SetGenesis(mapp.App, types.DecAccountArrToBaseAccountArr(genAccs))
   254  
   255  	// issue raw token
   256  	coins := sdk.SysCoins{
   257  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(100)),
   258  	}
   259  	err := keeper.bankKeeper.SetCoins(ctx, testAccounts[0].baseAccount.Address, coins)
   260  	require.Nil(t, err)
   261  
   262  	require.EqualValues(t, keeper.GetCoins(ctx, testAccounts[0].baseAccount.Address), coins)
   263  
   264  	info := keeper.GetCoinsInfo(ctx, testAccounts[0].baseAccount.Address)
   265  	require.NotNil(t, info)
   266  
   267  	keeper.SetParams(ctx, types.DefaultParams())
   268  	pas := keeper.GetParams(ctx)
   269  	require.NotNil(t, pas)
   270  
   271  	//send coin
   272  	coins = sdk.SysCoins{
   273  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1)),
   274  	}
   275  	err1 := keeper.SendCoinsFromAccountToAccount(ctx, testAccounts[0].baseAccount.Address,
   276  		testAccounts[1].baseAccount.Address, coins)
   277  	require.Nil(t, err1)
   278  
   279  	require.EqualValues(t, "1001.000000000000000000", keeper.GetCoinsInfo(ctx,
   280  		testAccounts[1].baseAccount.Address)[0].Available)
   281  }