diff --git a/app/app.go b/app/app.go index 6dd7a511..418c4f80 100644 --- a/app/app.go +++ b/app/app.go @@ -93,7 +93,6 @@ import ( "github.com/kava-labs/kava/app/ante" kavaparams "github.com/kava-labs/kava/app/params" - kavadistrquery "github.com/kava-labs/kava/app/query/distribution" "github.com/kava-labs/kava/x/auction" auctionkeeper "github.com/kava-labs/kava/x/auction/keeper" auctiontypes "github.com/kava-labs/kava/x/auction/types" @@ -608,7 +607,7 @@ func NewApp( &app.liquidKeeper, &hardKeeper, &savingsKeeper, - communitytypes.ModuleAccountName, + &app.distrKeeper, ) // x/community's deposit/withdraw to lend proposals depend on hard keeper. @@ -624,7 +623,7 @@ func NewApp( kavadistSubspace, app.bankKeeper, app.accountKeeper, - app.communityKeeper, + app.distrKeeper, app.loadBlockedMaccAddrs(), ) @@ -972,25 +971,7 @@ func NewApp( } func (app *App) RegisterServices(cfg module.Configurator) { - // Register services from all unmodified modules - for _, module := range app.mm.Modules { - // skip registration of distribution services - if module.Name() == distrtypes.ModuleName { - continue - } - module.RegisterServices(cfg) - } - - // register ditribution services except query server - distrtypes.RegisterMsgServer(cfg.MsgServer(), distrkeeper.NewMsgServerImpl(app.distrKeeper)) - cfg.RegisterMigration( - distrtypes.ModuleName, - 1, - distrkeeper.NewMigrator(app.distrKeeper).Migrate1to2, - ) - - // register fake distribution query server - distrtypes.RegisterQueryServer(cfg.QueryServer(), kavadistrquery.NewQueryServer(app.distrKeeper, app.communityKeeper)) + app.mm.RegisterServices(cfg) } // BeginBlocker contains app specific logic for the BeginBlock abci call. diff --git a/app/query/distribution/expected_keepers.go b/app/query/distribution/expected_keepers.go deleted file mode 100644 index ea8a77fd..00000000 --- a/app/query/distribution/expected_keepers.go +++ /dev/null @@ -1,10 +0,0 @@ -package distribution - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// CommunityKeeper defines the contract needed to be fulfilled for community module dependencies. -type CommunityKeeper interface { - GetModuleAccountBalance(sdk.Context) sdk.Coins -} diff --git a/app/query/distribution/query.go b/app/query/distribution/query.go deleted file mode 100644 index 1312c5f4..00000000 --- a/app/query/distribution/query.go +++ /dev/null @@ -1,38 +0,0 @@ -package distribution - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" -) - -var _ distrtypes.QueryServer = &queryServer{} - -type queryServer struct { - distrkeeper.Keeper - - communityKeeper CommunityKeeper -} - -// NewQueryServer returns a grpc query server for the distribution module. -// It forwards most requests to the distribution keeper, except for the community pool request -// which is mapped to the kava community module. -func NewQueryServer(distrKeeper distrkeeper.Keeper, commKeeper CommunityKeeper) distrtypes.QueryServer { - return &queryServer{ - Keeper: distrKeeper, - communityKeeper: commKeeper, - } -} - -// CommunityPool queries the kava community module -// The original community pool, which is a separately accounted for portion of x/auth's fee pool -// is replaces with the x/community module account. -// TODO: implement legacy community pool balance query in x/community -// To query the original community pool, including historical values, use x/community's LegacyCommunityPoolBalance -func (q queryServer) CommunityPool(c context.Context, req *distrtypes.QueryCommunityPoolRequest) (*distrtypes.QueryCommunityPoolResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - balance := q.communityKeeper.GetModuleAccountBalance(ctx) - return &distrtypes.QueryCommunityPoolResponse{Pool: sdk.NewDecCoinsFromCoins(balance...)}, nil -} diff --git a/app/query/distribution/query_test.go b/app/query/distribution/query_test.go deleted file mode 100644 index 8f030531..00000000 --- a/app/query/distribution/query_test.go +++ /dev/null @@ -1,170 +0,0 @@ -package distribution_test - -import ( - "context" - "fmt" - "testing" - - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtime "github.com/tendermint/tendermint/types/time" - - "github.com/kava-labs/kava/app" - distrquery "github.com/kava-labs/kava/app/query/distribution" - communitytypes "github.com/kava-labs/kava/x/community/types" -) - -type queryTestSuite struct { - suite.Suite - - App app.TestApp - Ctx sdk.Context - - queryClient distrtypes.QueryClient - communityPoolAddress sdk.AccAddress -} - -func (suite *queryTestSuite) SetupTest() { - app.SetSDKConfig() - tApp := app.NewTestApp() - ctx := tApp.NewContext(true, tmproto.Header{Height: 1, Time: tmtime.Now()}) - - tApp.InitializeFromGenesisStates() - - suite.App = tApp - suite.Ctx = ctx - - queryHelper := baseapp.NewQueryServerTestHelper(suite.Ctx, suite.App.InterfaceRegistry()) - distrtypes.RegisterQueryServer(queryHelper, distrquery.NewQueryServer( - tApp.GetDistrKeeper(), - tApp.GetCommunityKeeper(), - )) - suite.queryClient = distrtypes.NewQueryClient(queryHelper) - suite.communityPoolAddress = tApp.GetAccountKeeper().GetModuleAddress(communitytypes.ModuleAccountName) -} - -func TestGRPQueryTestSuite(t *testing.T) { - suite.Run(t, new(queryTestSuite)) -} - -func (suite queryTestSuite) FundCommunityPool(amt sdk.Coins) { - err := suite.App.FundModuleAccount(suite.Ctx, communitytypes.ModuleAccountName, amt) - suite.NoError(err) -} - -func (suite queryTestSuite) CheckCommunityPoolBalance(expected sdk.Coins, result sdk.DecCoins) { - actual := suite.App.GetBankKeeper().GetAllBalances(suite.Ctx, suite.communityPoolAddress) - // check that account was properly funded - suite.Equal(expected, actual, "unexpected community pool balance") - - // transform the expected values to DecCoins to compare with result - decCoins := sdk.NewDecCoinsFromCoins(expected...) - suite.True(decCoins.IsEqual(result), "unexpected community pool query response") -} - -func (suite *queryTestSuite) Test_CommunityPoolOverride() { - singleDenom := sdk.NewCoins(sdk.NewInt64Coin("ukava", 1e10)) - multiDenom := singleDenom.Add(sdk.NewInt64Coin("other-denom", 1e9)) - - testCases := []struct { - name string - funds sdk.Coins - }{ - {"single denom", singleDenom}, - {"multiple denoms", multiDenom}, - {"no balance", sdk.NewCoins()}, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("queries the correct balance - %s", tc.name), func() { - suite.SetupTest() - - // init community pool funds - if !tc.funds.IsZero() { - suite.FundCommunityPool(tc.funds) - } - - // query the overridden endpoint - balance, err := suite.queryClient.CommunityPool( - context.Background(), - &distrtypes.QueryCommunityPoolRequest{}, - ) - suite.NoError(err) - suite.CheckCommunityPoolBalance(tc.funds, balance.Pool) - }) - } -} - -// modified from sdk test of distribution querier -func (suite *queryTestSuite) Test_OGDistributionQueries() { - suite.SetupTest() - - ctx, distrKeeper, stakingKeeper := suite.Ctx, suite.App.GetDistrKeeper(), suite.App.GetStakingKeeper() - - // setup a validator - addr := app.RandomAddress() - valAddr := sdk.ValAddress(addr) - bondDenom := stakingKeeper.BondDenom(ctx) - - // test param queries - params := distrtypes.Params{ - CommunityTax: sdk.ZeroDec(), - BaseProposerReward: sdk.NewDecWithPrec(2, 1), - BonusProposerReward: sdk.NewDecWithPrec(1, 1), - WithdrawAddrEnabled: true, - } - distrKeeper.SetParams(ctx, params) - r1, err := suite.queryClient.Params(context.Background(), &distrtypes.QueryParamsRequest{}) - suite.NoError(err) - suite.Equal(params, r1.Params) - - // test outstanding rewards query - outstandingRewards := sdk.NewDecCoins(sdk.NewInt64DecCoin(bondDenom, 100), sdk.NewInt64DecCoin("other", 10)) - distrKeeper.SetValidatorOutstandingRewards(ctx, valAddr, distrtypes.ValidatorOutstandingRewards{Rewards: outstandingRewards}) - r2, err := suite.queryClient.ValidatorOutstandingRewards(context.Background(), &distrtypes.QueryValidatorOutstandingRewardsRequest{ValidatorAddress: valAddr.String()}) - suite.NoError(err) - suite.Equal(outstandingRewards, r2.Rewards.Rewards) - - // test validator commission query - commission := sdk.DecCoins{{Denom: "token1", Amount: sdk.NewDec(4)}, {Denom: "token2", Amount: sdk.NewDec(2)}} - distrKeeper.SetValidatorAccumulatedCommission(ctx, valAddr, distrtypes.ValidatorAccumulatedCommission{Commission: commission}) - r3, err := suite.queryClient.ValidatorCommission(context.Background(), &distrtypes.QueryValidatorCommissionRequest{ValidatorAddress: valAddr.String()}) - suite.NoError(err) - suite.Equal(commission, r3.Commission.Commission) - - // test delegator's total rewards query - r4, err := suite.queryClient.DelegationTotalRewards(context.Background(), &distrtypes.QueryDelegationTotalRewardsRequest{DelegatorAddress: addr.String()}) - suite.NoError(err) - suite.Equal(&distrtypes.QueryDelegationTotalRewardsResponse{}, r4) - - // test validator slashes query with height range - slashOne := distrtypes.NewValidatorSlashEvent(3, sdk.NewDecWithPrec(5, 1)) - slashTwo := distrtypes.NewValidatorSlashEvent(7, sdk.NewDecWithPrec(6, 1)) - distrKeeper.SetValidatorSlashEvent(ctx, valAddr, 3, 0, slashOne) - distrKeeper.SetValidatorSlashEvent(ctx, valAddr, 7, 0, slashTwo) - slashes := suite.getQueriedValidatorSlashes(valAddr, 0, 2) - suite.Equal(0, len(slashes)) - slashes = suite.getQueriedValidatorSlashes(valAddr, 0, 5) - suite.Equal([]distrtypes.ValidatorSlashEvent{slashOne}, slashes) - slashes = suite.getQueriedValidatorSlashes(valAddr, 0, 10) - suite.Equal([]distrtypes.ValidatorSlashEvent{slashOne, slashTwo}, slashes) - - // non-zero delegator reward queries are not tested here. -} - -func (suite *queryTestSuite) getQueriedValidatorSlashes(validatorAddr sdk.ValAddress, startHeight uint64, endHeight uint64) (slashes []distrtypes.ValidatorSlashEvent) { - result, err := suite.queryClient.ValidatorSlashes( - context.Background(), - &distrtypes.QueryValidatorSlashesRequest{ - ValidatorAddress: validatorAddr.String(), - StartingHeight: startHeight, - EndingHeight: endHeight, - }, - ) - suite.NoError(err) - return result.Slashes -} diff --git a/x/earn/keeper/keeper.go b/x/earn/keeper/keeper.go index 582daed5..b9ffa3f0 100644 --- a/x/earn/keeper/keeper.go +++ b/x/earn/keeper/keeper.go @@ -22,8 +22,8 @@ type Keeper struct { hardKeeper types.HardKeeper savingsKeeper types.SavingsKeeper - // name of module account the community pool deposit/withdraw proposals use - communityPoolMaccName string + // Keeper for community pool transfers + distKeeper types.DistributionKeeper } // NewKeeper creates a new keeper @@ -36,7 +36,7 @@ func NewKeeper( liquidKeeper types.LiquidKeeper, hardKeeper types.HardKeeper, savingsKeeper types.SavingsKeeper, - communityPoolMaccName string, + distKeeper types.DistributionKeeper, ) Keeper { if !paramstore.HasKeyTable() { paramstore = paramstore.WithKeyTable(types.ParamKeyTable()) @@ -51,8 +51,7 @@ func NewKeeper( liquidKeeper: liquidKeeper, hardKeeper: hardKeeper, savingsKeeper: savingsKeeper, - - communityPoolMaccName: communityPoolMaccName, + distKeeper: distKeeper, } } diff --git a/x/earn/keeper/proposal_handler.go b/x/earn/keeper/proposal_handler.go index 50265ed7..03b08c7c 100644 --- a/x/earn/keeper/proposal_handler.go +++ b/x/earn/keeper/proposal_handler.go @@ -4,15 +4,46 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/kava-labs/kava/x/earn/types" + kavadisttypes "github.com/kava-labs/kava/x/kavadist/types" ) // HandleCommunityPoolDepositProposal is a handler for executing a passed community pool deposit proposal func HandleCommunityPoolDepositProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolDepositProposal) error { - return k.DepositFromModuleAccount(ctx, k.communityPoolMaccName, p.Amount, types.STRATEGY_TYPE_SAVINGS) + fundAcc := k.accountKeeper.GetModuleAccount(ctx, kavadisttypes.FundModuleAccount) + if err := k.distKeeper.DistributeFromFeePool(ctx, sdk.NewCoins(p.Amount), fundAcc.GetAddress()); err != nil { + return err + } + + err := k.DepositFromModuleAccount(ctx, kavadisttypes.FundModuleAccount, p.Amount, types.STRATEGY_TYPE_SAVINGS) + if err != nil { + return err + } + + return nil + } // HandleCommunityPoolWithdrawProposal is a handler for executing a passed community pool withdraw proposal. func HandleCommunityPoolWithdrawProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolWithdrawProposal) error { - _, err := k.WithdrawFromModuleAccount(ctx, k.communityPoolMaccName, p.Amount, types.STRATEGY_TYPE_SAVINGS) - return err + // Withdraw to fund module account + withdrawAmount, err := k.WithdrawFromModuleAccount(ctx, kavadisttypes.FundModuleAccount, p.Amount, types.STRATEGY_TYPE_SAVINGS) + if err != nil { + return err + } + + // Move funds to the community pool manually + err = k.bankKeeper.SendCoinsFromModuleToModule( + ctx, + kavadisttypes.FundModuleAccount, + k.distKeeper.GetDistributionAccount(ctx).GetName(), + sdk.NewCoins(withdrawAmount), + ) + if err != nil { + return err + } + feePool := k.distKeeper.GetFeePool(ctx) + newCommunityPool := feePool.CommunityPool.Add(sdk.NewDecCoinFromCoin(withdrawAmount)) + feePool.CommunityPool = newCommunityPool + k.distKeeper.SetFeePool(ctx, feePool) + return nil } diff --git a/x/earn/keeper/proposal_handler_test.go b/x/earn/keeper/proposal_handler_test.go index cab6adb0..23856736 100644 --- a/x/earn/keeper/proposal_handler_test.go +++ b/x/earn/keeper/proposal_handler_test.go @@ -4,7 +4,6 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - communitytypes "github.com/kava-labs/kava/x/community/types" "github.com/kava-labs/kava/x/earn/keeper" "github.com/kava-labs/kava/x/earn/testutil" "github.com/kava-labs/kava/x/earn/types" @@ -25,12 +24,15 @@ func TestProposalTestSuite(t *testing.T) { } func (suite *proposalTestSuite) TestCommunityDepositProposal() { + distKeeper := suite.App.GetDistrKeeper() ctx := suite.Ctx - macc := suite.App.GetAccountKeeper().GetModuleAccount(ctx, communitytypes.ModuleAccountName) + macc := distKeeper.GetDistributionAccount(ctx) fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 100000000)) depositAmount := sdk.NewCoin("ukava", sdk.NewInt(10000000)) suite.Require().NoError(suite.App.FundModuleAccount(ctx, macc.GetName(), fundAmount)) - + feePool := distKeeper.GetFeePool(ctx) + feePool.CommunityPool = sdk.NewDecCoinsFromCoins(fundAmount...) + distKeeper.SetFeePool(ctx, feePool) suite.CreateVault("ukava", types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, false, nil) prop := types.NewCommunityPoolDepositProposal("test title", "desc", depositAmount) @@ -39,18 +41,23 @@ func (suite *proposalTestSuite) TestCommunityDepositProposal() { balance := suite.BankKeeper.GetAllBalances(ctx, macc.GetAddress()) suite.Require().Equal(fundAmount.Sub(sdk.NewCoins(depositAmount)), balance) - - communityPoolBalance := suite.App.GetCommunityKeeper().GetModuleAccountBalance(ctx) + feePool = distKeeper.GetFeePool(ctx) + communityPoolBalance, change := feePool.CommunityPool.TruncateDecimal() suite.Require().Equal(fundAmount.Sub(sdk.NewCoins(depositAmount)), communityPoolBalance) + suite.Require().True(change.Empty()) } func (suite *proposalTestSuite) TestCommunityWithdrawProposal() { + distKeeper := suite.App.GetDistrKeeper() ctx := suite.Ctx - macc := suite.App.GetAccountKeeper().GetModuleAccount(ctx, communitytypes.ModuleAccountName) + macc := distKeeper.GetDistributionAccount(ctx) fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 100000000)) depositAmount := sdk.NewCoin("ukava", sdk.NewInt(10000000)) suite.Require().NoError(suite.App.FundModuleAccount(ctx, macc.GetName(), fundAmount)) - + feePool := distKeeper.GetFeePool(ctx) + feePool.CommunityPool = sdk.NewDecCoinsFromCoins(fundAmount...) + distKeeper.SetFeePool(ctx, feePool) + // TODO update to STRATEGY_TYPE_SAVINGS once implemented suite.CreateVault("ukava", types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, false, nil) deposit := types.NewCommunityPoolDepositProposal("test title", "desc", depositAmount) @@ -66,7 +73,8 @@ func (suite *proposalTestSuite) TestCommunityWithdrawProposal() { suite.Require().NoError(err) balance = suite.BankKeeper.GetAllBalances(ctx, macc.GetAddress()) suite.Require().Equal(fundAmount, balance) - - communityPoolBalance := suite.App.GetCommunityKeeper().GetModuleAccountBalance(ctx) + feePool = distKeeper.GetFeePool(ctx) + communityPoolBalance, change := feePool.CommunityPool.TruncateDecimal() suite.Require().Equal(fundAmount, communityPoolBalance) + suite.Require().True(change.Empty()) } diff --git a/x/earn/testutil/suite.go b/x/earn/testutil/suite.go index f5200b9b..8e7f0970 100644 --- a/x/earn/testutil/suite.go +++ b/x/earn/testutil/suite.go @@ -17,6 +17,7 @@ import ( savingskeeper "github.com/kava-labs/kava/x/savings/keeper" savingstypes "github.com/kava-labs/kava/x/savings/types" + "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -204,7 +205,7 @@ func (suite *Suite) GetEvents() sdk.Events { // AddCoinsToModule adds coins to the earn module account func (suite *Suite) AddCoinsToModule(amount sdk.Coins) { // Does not use suite.BankKeeper.MintCoins as module account would not have permission to mint - err := suite.App.FundModuleAccount(suite.Ctx, types.ModuleName, amount) + err := simapp.FundModuleAccount(suite.BankKeeper, suite.Ctx, types.ModuleName, amount) suite.Require().NoError(err) } @@ -226,7 +227,7 @@ func (suite *Suite) CreateAccount(initialBalance sdk.Coins, index int) authtypes acc := ak.NewAccountWithAddress(suite.Ctx, addrs[index]) ak.SetAccount(suite.Ctx, acc) - err := suite.App.FundAccount(suite.Ctx, acc.GetAddress(), initialBalance) + err := simapp.FundAccount(suite.BankKeeper, suite.Ctx, acc.GetAddress(), initialBalance) suite.Require().NoError(err) return acc @@ -239,7 +240,7 @@ func (suite *Suite) NewAccountFromAddr(addr sdk.AccAddress, balance sdk.Coins) a acc := ak.NewAccountWithAddress(suite.Ctx, addr) ak.SetAccount(suite.Ctx, acc) - err := suite.App.FundAccount(suite.Ctx, acc.GetAddress(), balance) + err := simapp.FundAccount(suite.BankKeeper, suite.Ctx, acc.GetAddress(), balance) suite.Require().NoError(err) return acc diff --git a/x/earn/types/expected_keepers.go b/x/earn/types/expected_keepers.go index 99dd28da..e2533c88 100644 --- a/x/earn/types/expected_keepers.go +++ b/x/earn/types/expected_keepers.go @@ -3,6 +3,7 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" + disttypes "github.com/cosmos/cosmos-sdk/x/distribution/types" hardtypes "github.com/kava-labs/kava/x/hard/types" savingstypes "github.com/kava-labs/kava/x/savings/types" @@ -25,6 +26,14 @@ type BankKeeper interface { SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error } +// DistributionKeeper defines the expected interface needed for community-pool deposits to earn vaults +type DistributionKeeper interface { + GetFeePool(ctx sdk.Context) (feePool disttypes.FeePool) + SetFeePool(ctx sdk.Context, feePool disttypes.FeePool) + GetDistributionAccount(ctx sdk.Context) types.ModuleAccountI + DistributeFromFeePool(ctx sdk.Context, amount sdk.Coins, receiveAddr sdk.AccAddress) error +} + // LiquidKeeper defines the expected interface needed for derivative to staked token conversions. type LiquidKeeper interface { GetStakedTokensForDerivatives(ctx sdk.Context, derivatives sdk.Coins) (sdk.Coin, error) diff --git a/x/kavadist/keeper/keeper.go b/x/kavadist/keeper/keeper.go index 90c10452..191a2156 100644 --- a/x/kavadist/keeper/keeper.go +++ b/x/kavadist/keeper/keeper.go @@ -13,12 +13,12 @@ import ( // Keeper keeper for the cdp module type Keeper struct { - key sdk.StoreKey - cdc codec.BinaryCodec - paramSubspace paramtypes.Subspace - bankKeeper types.BankKeeper - accountKeeper types.AccountKeeper - communityKeeper types.CommunityKeeper + key sdk.StoreKey + cdc codec.BinaryCodec + paramSubspace paramtypes.Subspace + bankKeeper types.BankKeeper + distKeeper types.DistKeeper + accountKeeper types.AccountKeeper blacklistedAddrs map[string]bool } @@ -26,7 +26,7 @@ type Keeper struct { // NewKeeper creates a new keeper func NewKeeper( cdc codec.BinaryCodec, key sdk.StoreKey, paramstore paramtypes.Subspace, bk types.BankKeeper, ak types.AccountKeeper, - ck types.CommunityKeeper, blacklistedAddrs map[string]bool, + dk types.DistKeeper, blacklistedAddrs map[string]bool, ) Keeper { if !paramstore.HasKeyTable() { paramstore = paramstore.WithKeyTable(types.ParamKeyTable()) @@ -37,8 +37,8 @@ func NewKeeper( cdc: cdc, paramSubspace: paramstore, bankKeeper: bk, + distKeeper: dk, accountKeeper: ak, - communityKeeper: ck, blacklistedAddrs: blacklistedAddrs, } } diff --git a/x/kavadist/keeper/proposal_handler.go b/x/kavadist/keeper/proposal_handler.go index 68540e42..0cc47e2a 100644 --- a/x/kavadist/keeper/proposal_handler.go +++ b/x/kavadist/keeper/proposal_handler.go @@ -13,7 +13,7 @@ func HandleCommunityPoolMultiSpendProposal(ctx sdk.Context, k Keeper, p *types.C if k.blacklistedAddrs[receiverInfo.Address] { return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is blacklisted from receiving external funds", receiverInfo.Address) } - err := k.communityKeeper.DistributeFromCommunityPool(ctx, receiverInfo.GetAddress(), receiverInfo.Amount) + err := k.distKeeper.DistributeFromFeePool(ctx, receiverInfo.Amount, receiverInfo.GetAddress()) if err != nil { return err } diff --git a/x/kavadist/keeper/proposal_handler_test.go b/x/kavadist/keeper/proposal_handler_test.go index dc8ad5ea..97857333 100644 --- a/x/kavadist/keeper/proposal_handler_test.go +++ b/x/kavadist/keeper/proposal_handler_test.go @@ -3,22 +3,21 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - communitytypes "github.com/kava-labs/kava/x/community/types" "github.com/kava-labs/kava/x/kavadist/keeper" "github.com/kava-labs/kava/x/kavadist/types" ) func (suite *keeperTestSuite) TestHandleCommunityPoolMultiSpendProposal() { - addr, communityKeeper, ctx := suite.Addrs[0], suite.App.GetCommunityKeeper(), suite.Ctx + addr, distrKeeper, ctx := suite.Addrs[0], suite.App.GetDistrKeeper(), suite.Ctx initBalances := suite.BankKeeper.GetAllBalances(ctx, addr) - // add coins to the module account and fund community pool - initialFunds := int64(1000000) - fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", initialFunds)) - suite.Require().NoError(suite.App.FundModuleAccount(ctx, communitytypes.ModuleAccountName, fundAmount)) - // expect funds to start in community pool - commPoolFunds := communityKeeper.GetModuleAccountBalance(ctx) - suite.Require().True(fundAmount.IsEqual(commPoolFunds)) + // add coins to the module account and fund fee pool + macc := distrKeeper.GetDistributionAccount(ctx) + fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 1000000)) + suite.Require().NoError(suite.App.FundModuleAccount(ctx, macc.GetName(), fundAmount)) + feePool := distrKeeper.GetFeePool(ctx) + feePool.CommunityPool = sdk.NewDecCoinsFromCoins(fundAmount...) + distrKeeper.SetFeePool(ctx, feePool) proposalAmount1 := int64(1100) proposalAmount2 := int64(1200) @@ -36,12 +35,6 @@ func (suite *keeperTestSuite) TestHandleCommunityPoolMultiSpendProposal() { suite.Require().Nil(err) balances := suite.BankKeeper.GetAllBalances(ctx, addr) - - // expect funds to be transferred to recipient expected := initBalances.AmountOf("ukava").Add(sdk.NewInt(proposalAmount1 + proposalAmount2)) suite.Require().Equal(expected, balances.AmountOf("ukava")) - - // expect funds to be deducted from community pool - expectedCommPool := commPoolFunds.AmountOf("ukava").SubRaw(proposalAmount1 + proposalAmount2) - suite.Require().Equal(expectedCommPool, communityKeeper.GetModuleAccountBalance(ctx).AmountOf("ukava")) } diff --git a/x/kavadist/types/expected_keepers.go b/x/kavadist/types/expected_keepers.go index 387a5423..e78d3d9f 100644 --- a/x/kavadist/types/expected_keepers.go +++ b/x/kavadist/types/expected_keepers.go @@ -5,9 +5,9 @@ import ( authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) -// CommunityKeeper defines the expected community keeper interface -type CommunityKeeper interface { - DistributeFromCommunityPool(ctx sdk.Context, sender sdk.AccAddress, amount sdk.Coins) error +// DistKeeper defines the expected distribution keeper interface +type DistKeeper interface { + DistributeFromFeePool(ctx sdk.Context, amount sdk.Coins, receiveAddr sdk.AccAddress) error } // AccountKeeper defines the expected account keeper interface