github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/keeper/deposit_test.go (about)

     1  package keeper
     2  
     3  import (
     4  	"testing"
     5  
     6  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/fibonacci-chain/fbc/x/gov/types"
    10  	"github.com/fibonacci-chain/fbc/x/params"
    11  	paramsTypes "github.com/fibonacci-chain/fbc/x/params/types"
    12  )
    13  
    14  func TestKeeper_AddDeposit(t *testing.T) {
    15  	ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000)
    16  
    17  	// deposit on proposal which is not exist
    18  	err := keeper.AddDeposit(ctx, 0, Addrs[0],
    19  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
    20  	require.NotNil(t, err)
    21  
    22  	content := types.NewTextProposal("Test", "description")
    23  	proposal, err := keeper.SubmitProposal(ctx, content)
    24  	require.Nil(t, err)
    25  	proposalID := proposal.ProposalID
    26  
    27  	// nil address deposit
    28  	err = keeper.AddDeposit(ctx, proposalID, sdk.AccAddress{},
    29  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
    30  	require.NotNil(t, err)
    31  
    32  	// deposit on proposal whose status is not DepositPeriod
    33  	proposal.Status = types.StatusPassed
    34  	keeper.SetProposal(ctx, proposal)
    35  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0],
    36  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
    37  	require.NotNil(t, err)
    38  
    39  	proposal.Status = types.StatusDepositPeriod
    40  	keeper.SetProposal(ctx, proposal)
    41  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0],
    42  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
    43  	require.Nil(t, err)
    44  
    45  	// change old deposit and activate proposal
    46  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0],
    47  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 100)}, "")
    48  	require.Nil(t, err)
    49  
    50  	// deposit on proposal which registered proposal handler router
    51  	paramsChanges := []params.ParamChange{{Subspace: "staking", Key: "MaxValidators", Value: "105"}}
    52  	content = paramsTypes.NewParameterChangeProposal("Test", "", paramsChanges, 1)
    53  	proposal, err = keeper.SubmitProposal(ctx, content)
    54  	require.Nil(t, err)
    55  	proposalID = proposal.ProposalID
    56  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0],
    57  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 100)}, "")
    58  	require.Nil(t, err)
    59  }
    60  
    61  func TestKeeper_GetDeposit(t *testing.T) {
    62  	ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000)
    63  
    64  	content := types.NewTextProposal("Test", "description")
    65  	proposal, err := keeper.SubmitProposal(ctx, content)
    66  	require.Nil(t, err)
    67  	proposalID := proposal.ProposalID
    68  
    69  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0],
    70  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
    71  	require.Nil(t, err)
    72  
    73  	expectedDeposit := types.Deposit{
    74  		ProposalID: proposalID,
    75  		Depositor:  Addrs[0],
    76  		Amount:     sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)},
    77  	}
    78  	deposit, found := keeper.GetDeposit(ctx, proposalID, Addrs[0])
    79  	require.True(t, found)
    80  	require.True(t, deposit.Equals(expectedDeposit))
    81  
    82  	// get deposit from db
    83  	deposit, found = keeper.GetDeposit(ctx, proposalID, Addrs[0])
    84  	require.True(t, found)
    85  	require.True(t, deposit.Equals(expectedDeposit))
    86  }
    87  
    88  func TestKeeper_GetDeposits(t *testing.T) {
    89  	ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000)
    90  
    91  	content := types.NewTextProposal("Test", "description")
    92  	proposal, err := keeper.SubmitProposal(ctx, content)
    93  	require.Nil(t, err)
    94  	proposalID := proposal.ProposalID
    95  
    96  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0],
    97  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
    98  	require.Nil(t, err)
    99  
   100  	err = keeper.AddDeposit(ctx, proposalID, Addrs[1],
   101  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}, "")
   102  	require.Nil(t, err)
   103  
   104  	expectedDeposits := types.Deposits{
   105  		{
   106  			ProposalID: proposalID,
   107  			Depositor:  Addrs[0],
   108  			Amount:     sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)},
   109  		},
   110  		{
   111  			ProposalID: proposalID,
   112  			Depositor:  Addrs[1],
   113  			Amount:     sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)},
   114  		},
   115  	}
   116  	deposits := keeper.GetDeposits(ctx, proposalID)
   117  	require.Equal(t, expectedDeposits, deposits)
   118  
   119  	// get deposits from db
   120  	deposits = keeper.GetDeposits(ctx, proposalID)
   121  	require.Equal(t, expectedDeposits, deposits)
   122  }
   123  
   124  func TestKeeper_DistributeDeposits(t *testing.T) {
   125  	ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000)
   126  
   127  	content := types.NewTextProposal("Test", "description")
   128  	proposal, err := keeper.SubmitProposal(ctx, content)
   129  	require.Nil(t, err)
   130  	proposalID := proposal.ProposalID
   131  
   132  	amount1 := sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}
   133  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0], amount1, "")
   134  	require.Nil(t, err)
   135  
   136  	amount2 := sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}
   137  	err = keeper.AddDeposit(ctx, proposalID, Addrs[1], amount2, "")
   138  	require.Nil(t, err)
   139  
   140  	moduleAccBalance := keeper.SupplyKeeper().GetModuleAccount(ctx, types.ModuleName).GetCoins()
   141  	require.Equal(t, amount1.Add(amount2...), moduleAccBalance)
   142  
   143  	// after DistributeDeposits
   144  	keeper.DistributeDeposits(ctx, proposalID)
   145  	moduleAccBalance = keeper.SupplyKeeper().GetModuleAccount(ctx, types.ModuleName).GetCoins()
   146  	require.Equal(t, sdk.Coins(nil), moduleAccBalance)
   147  	feeCollectorBalance := keeper.SupplyKeeper().GetModuleAccount(ctx, keeper.feeCollectorName).GetCoins()
   148  	require.Equal(t, amount1.Add(amount2...), feeCollectorBalance)
   149  }
   150  
   151  func TestKeeper_RefundDeposits(t *testing.T) {
   152  	ctx, accKeeper, keeper, _, _ := CreateTestInput(t, false, 1000)
   153  	amount := accKeeper.GetAccount(ctx, Addrs[0]).GetCoins().AmountOf(sdk.DefaultBondDenom)
   154  
   155  	content := types.NewTextProposal("Test", "description")
   156  	proposal, err := keeper.SubmitProposal(ctx, content)
   157  	require.Nil(t, err)
   158  	proposalID := proposal.ProposalID
   159  
   160  	amount1 := sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}
   161  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0], amount1, "")
   162  	require.Nil(t, err)
   163  
   164  	amount2 := sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}
   165  	err = keeper.AddDeposit(ctx, proposalID, Addrs[1], amount2, "")
   166  	require.Nil(t, err)
   167  
   168  	moduleAccBalance := keeper.SupplyKeeper().GetModuleAccount(ctx, types.ModuleName).GetCoins()
   169  	require.Equal(t, amount1.Add(amount2...), moduleAccBalance)
   170  
   171  	// after RefundDeposits
   172  	keeper.RefundDeposits(ctx, proposalID)
   173  	moduleAccBalance = keeper.SupplyKeeper().GetModuleAccount(ctx, types.ModuleName).GetCoins()
   174  	require.Equal(t, sdk.Coins(nil), moduleAccBalance)
   175  
   176  	require.Equal(t, amount, sdk.NewDec(1000))
   177  
   178  	require.Equal(t, accKeeper.GetAccount(ctx, Addrs[1]).GetCoins(),
   179  		sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 1000)})
   180  
   181  	// refund panic
   182  	content = types.NewTextProposal("Test", "description")
   183  	proposal, err = keeper.SubmitProposal(ctx, content)
   184  	require.Nil(t, err)
   185  	proposalID = proposal.ProposalID
   186  
   187  	amount1 = sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 40)}
   188  	err = keeper.AddDeposit(ctx, proposalID, Addrs[0], amount1, "")
   189  	require.Nil(t, err)
   190  
   191  	err = keeper.SupplyKeeper().SendCoinsFromModuleToModule(ctx, types.ModuleName, keeper.feeCollectorName,
   192  		amount1)
   193  	require.Nil(t, err)
   194  	require.Panics(t, func() {
   195  		keeper.RefundDeposits(ctx, proposalID)
   196  	})
   197  }