github.com/Finschia/finschia-sdk@v0.49.1/x/foundation/keeper/internal/treasury_test.go (about) 1 package internal_test 2 3 import ( 4 sdk "github.com/Finschia/finschia-sdk/types" 5 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 6 "github.com/Finschia/finschia-sdk/x/foundation" 7 ) 8 9 func (s *KeeperTestSuite) TestCollectFoundationTax() { 10 ctx, _ := s.ctx.CacheContext() 11 12 // empty fee collector first 13 // send the fee to the stranger 14 // and get it back later if the test case requires 15 collector := authtypes.NewModuleAddress(authtypes.FeeCollectorName) 16 fees := s.bankKeeper.GetAllBalances(ctx, collector) 17 err := s.bankKeeper.SendCoinsFromModuleToAccount(ctx, authtypes.FeeCollectorName, s.stranger, fees) 18 s.Require().NoError(err) 19 20 for name, tc := range map[string]struct { 21 fee sdk.Int 22 taxRatio sdk.Dec 23 tax sdk.Int 24 valid bool 25 }{ 26 "common": { 27 fee: fees[0].Amount, 28 taxRatio: sdk.MustNewDecFromStr("0.123456789"), 29 tax: sdk.NewInt(121932631), 30 valid: true, 31 }, 32 "zero fee": { 33 fee: sdk.ZeroInt(), 34 taxRatio: sdk.MustNewDecFromStr("0.123456789"), 35 tax: sdk.ZeroInt(), 36 valid: true, 37 }, 38 "zero ratio": { 39 fee: fees[0].Amount, 40 taxRatio: sdk.ZeroDec(), 41 tax: sdk.ZeroInt(), 42 valid: true, 43 }, 44 } { 45 s.Run(name, func() { 46 ctx, _ := ctx.CacheContext() 47 48 // set fee 49 err := s.bankKeeper.SendCoinsFromAccountToModule(ctx, s.stranger, authtypes.FeeCollectorName, sdk.NewCoins(sdk.NewCoin(fees[0].Denom, tc.fee))) 50 s.Require().NoError(err) 51 52 // set tax ratio 53 s.impl.SetParams(ctx, foundation.Params{ 54 FoundationTax: tc.taxRatio, 55 }) 56 57 before := s.impl.GetTreasury(ctx) 58 s.Require().Equal(1, len(before)) 59 s.Require().Equal(sdk.NewDecFromInt(s.balance), before[0].Amount) 60 61 tax := sdk.NewDecFromInt(tc.fee).MulTruncate(tc.taxRatio).TruncateInt() 62 // ensure the behavior does not change 63 s.Require().Equal(tc.tax, tax) 64 65 err = s.impl.CollectFoundationTax(ctx) 66 if !tc.valid { 67 s.Require().Error(err) 68 return 69 } 70 s.Require().NoError(err) 71 72 expectedAfter := s.balance.Add(tax) 73 after := s.impl.GetTreasury(ctx) 74 s.Require().Equal(1, len(after)) 75 s.Require().Equal(sdk.NewDecFromInt(expectedAfter), after[0].Amount) 76 }) 77 } 78 } 79 80 func (s *KeeperTestSuite) TestFundTreasury() { 81 testCases := map[string]struct { 82 amount sdk.Int 83 valid bool 84 }{ 85 "valid amount": { 86 amount: s.balance, 87 valid: true, 88 }, 89 "insufficient coins": { 90 amount: s.balance.Add(sdk.OneInt()), 91 }, 92 } 93 94 for name, tc := range testCases { 95 s.Run(name, func() { 96 ctx, _ := s.ctx.CacheContext() 97 98 before := s.impl.GetTreasury(ctx) 99 100 amount := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, tc.amount)) 101 err := s.impl.FundTreasury(ctx, s.stranger, amount) 102 if !tc.valid { 103 s.Require().Error(err) 104 return 105 } 106 s.Require().NoError(err) 107 108 expectedAfter := before.Add(sdk.NewDecCoinsFromCoins(amount...)...) 109 poolAfter := s.impl.GetTreasury(ctx) 110 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(poolAfter...)) 111 balanceAfter := sdk.NewDecCoinsFromCoins(s.bankKeeper.GetAllBalances(ctx, authtypes.NewModuleAddress(foundation.TreasuryName))...) 112 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(balanceAfter...)) 113 }) 114 } 115 } 116 117 func (s *KeeperTestSuite) TestWithdrawFromTreasury() { 118 testCases := map[string]struct { 119 amount sdk.Int 120 valid bool 121 }{ 122 "valid amount": { 123 amount: s.balance, 124 valid: true, 125 }, 126 "insufficient coins": { 127 amount: s.balance.Add(sdk.OneInt()), 128 }, 129 } 130 131 for name, tc := range testCases { 132 s.Run(name, func() { 133 ctx, _ := s.ctx.CacheContext() 134 135 before := s.impl.GetTreasury(ctx) 136 137 amount := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, tc.amount)) 138 err := s.impl.WithdrawFromTreasury(ctx, s.stranger, amount) 139 if !tc.valid { 140 s.Require().Error(err) 141 return 142 } 143 s.Require().NoError(err) 144 145 expectedAfter := before.Sub(sdk.NewDecCoinsFromCoins(amount...)) 146 poolAfter := s.impl.GetTreasury(ctx) 147 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(poolAfter...)) 148 balanceAfter := sdk.NewDecCoinsFromCoins(s.bankKeeper.GetAllBalances(ctx, authtypes.NewModuleAddress(foundation.TreasuryName))...) 149 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(balanceAfter...)) 150 }) 151 } 152 }