mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 15:25:18 +00:00
remove x/community references (#1454)
* remove new community pool from earn * remove x/community from kavadist * remove overridden community-pool query
This commit is contained in:
parent
0d38ce77a1
commit
05a705be79
25
app/app.go
25
app/app.go
@ -93,7 +93,6 @@ import (
|
|||||||
|
|
||||||
"github.com/kava-labs/kava/app/ante"
|
"github.com/kava-labs/kava/app/ante"
|
||||||
kavaparams "github.com/kava-labs/kava/app/params"
|
kavaparams "github.com/kava-labs/kava/app/params"
|
||||||
kavadistrquery "github.com/kava-labs/kava/app/query/distribution"
|
|
||||||
"github.com/kava-labs/kava/x/auction"
|
"github.com/kava-labs/kava/x/auction"
|
||||||
auctionkeeper "github.com/kava-labs/kava/x/auction/keeper"
|
auctionkeeper "github.com/kava-labs/kava/x/auction/keeper"
|
||||||
auctiontypes "github.com/kava-labs/kava/x/auction/types"
|
auctiontypes "github.com/kava-labs/kava/x/auction/types"
|
||||||
@ -608,7 +607,7 @@ func NewApp(
|
|||||||
&app.liquidKeeper,
|
&app.liquidKeeper,
|
||||||
&hardKeeper,
|
&hardKeeper,
|
||||||
&savingsKeeper,
|
&savingsKeeper,
|
||||||
communitytypes.ModuleAccountName,
|
&app.distrKeeper,
|
||||||
)
|
)
|
||||||
|
|
||||||
// x/community's deposit/withdraw to lend proposals depend on hard keeper.
|
// x/community's deposit/withdraw to lend proposals depend on hard keeper.
|
||||||
@ -624,7 +623,7 @@ func NewApp(
|
|||||||
kavadistSubspace,
|
kavadistSubspace,
|
||||||
app.bankKeeper,
|
app.bankKeeper,
|
||||||
app.accountKeeper,
|
app.accountKeeper,
|
||||||
app.communityKeeper,
|
app.distrKeeper,
|
||||||
app.loadBlockedMaccAddrs(),
|
app.loadBlockedMaccAddrs(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -972,25 +971,7 @@ func NewApp(
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) RegisterServices(cfg module.Configurator) {
|
func (app *App) RegisterServices(cfg module.Configurator) {
|
||||||
// Register services from all unmodified modules
|
app.mm.RegisterServices(cfg)
|
||||||
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))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// BeginBlocker contains app specific logic for the BeginBlock abci call.
|
// BeginBlocker contains app specific logic for the BeginBlock abci call.
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -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
|
|
||||||
}
|
|
@ -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
|
|
||||||
}
|
|
@ -22,8 +22,8 @@ type Keeper struct {
|
|||||||
hardKeeper types.HardKeeper
|
hardKeeper types.HardKeeper
|
||||||
savingsKeeper types.SavingsKeeper
|
savingsKeeper types.SavingsKeeper
|
||||||
|
|
||||||
// name of module account the community pool deposit/withdraw proposals use
|
// Keeper for community pool transfers
|
||||||
communityPoolMaccName string
|
distKeeper types.DistributionKeeper
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewKeeper creates a new keeper
|
// NewKeeper creates a new keeper
|
||||||
@ -36,7 +36,7 @@ func NewKeeper(
|
|||||||
liquidKeeper types.LiquidKeeper,
|
liquidKeeper types.LiquidKeeper,
|
||||||
hardKeeper types.HardKeeper,
|
hardKeeper types.HardKeeper,
|
||||||
savingsKeeper types.SavingsKeeper,
|
savingsKeeper types.SavingsKeeper,
|
||||||
communityPoolMaccName string,
|
distKeeper types.DistributionKeeper,
|
||||||
) Keeper {
|
) Keeper {
|
||||||
if !paramstore.HasKeyTable() {
|
if !paramstore.HasKeyTable() {
|
||||||
paramstore = paramstore.WithKeyTable(types.ParamKeyTable())
|
paramstore = paramstore.WithKeyTable(types.ParamKeyTable())
|
||||||
@ -51,8 +51,7 @@ func NewKeeper(
|
|||||||
liquidKeeper: liquidKeeper,
|
liquidKeeper: liquidKeeper,
|
||||||
hardKeeper: hardKeeper,
|
hardKeeper: hardKeeper,
|
||||||
savingsKeeper: savingsKeeper,
|
savingsKeeper: savingsKeeper,
|
||||||
|
distKeeper: distKeeper,
|
||||||
communityPoolMaccName: communityPoolMaccName,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,15 +4,46 @@ import (
|
|||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
"github.com/kava-labs/kava/x/earn/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
|
// HandleCommunityPoolDepositProposal is a handler for executing a passed community pool deposit proposal
|
||||||
func HandleCommunityPoolDepositProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolDepositProposal) error {
|
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.
|
// HandleCommunityPoolWithdrawProposal is a handler for executing a passed community pool withdraw proposal.
|
||||||
func HandleCommunityPoolWithdrawProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolWithdrawProposal) error {
|
func HandleCommunityPoolWithdrawProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolWithdrawProposal) error {
|
||||||
_, err := k.WithdrawFromModuleAccount(ctx, k.communityPoolMaccName, p.Amount, types.STRATEGY_TYPE_SAVINGS)
|
// Withdraw to fund module account
|
||||||
return err
|
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
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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/keeper"
|
||||||
"github.com/kava-labs/kava/x/earn/testutil"
|
"github.com/kava-labs/kava/x/earn/testutil"
|
||||||
"github.com/kava-labs/kava/x/earn/types"
|
"github.com/kava-labs/kava/x/earn/types"
|
||||||
@ -25,12 +24,15 @@ func TestProposalTestSuite(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *proposalTestSuite) TestCommunityDepositProposal() {
|
func (suite *proposalTestSuite) TestCommunityDepositProposal() {
|
||||||
|
distKeeper := suite.App.GetDistrKeeper()
|
||||||
ctx := suite.Ctx
|
ctx := suite.Ctx
|
||||||
macc := suite.App.GetAccountKeeper().GetModuleAccount(ctx, communitytypes.ModuleAccountName)
|
macc := distKeeper.GetDistributionAccount(ctx)
|
||||||
fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 100000000))
|
fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 100000000))
|
||||||
depositAmount := sdk.NewCoin("ukava", sdk.NewInt(10000000))
|
depositAmount := sdk.NewCoin("ukava", sdk.NewInt(10000000))
|
||||||
suite.Require().NoError(suite.App.FundModuleAccount(ctx, macc.GetName(), fundAmount))
|
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)
|
suite.CreateVault("ukava", types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, false, nil)
|
||||||
prop := types.NewCommunityPoolDepositProposal("test title",
|
prop := types.NewCommunityPoolDepositProposal("test title",
|
||||||
"desc", depositAmount)
|
"desc", depositAmount)
|
||||||
@ -39,18 +41,23 @@ func (suite *proposalTestSuite) TestCommunityDepositProposal() {
|
|||||||
|
|
||||||
balance := suite.BankKeeper.GetAllBalances(ctx, macc.GetAddress())
|
balance := suite.BankKeeper.GetAllBalances(ctx, macc.GetAddress())
|
||||||
suite.Require().Equal(fundAmount.Sub(sdk.NewCoins(depositAmount)), balance)
|
suite.Require().Equal(fundAmount.Sub(sdk.NewCoins(depositAmount)), balance)
|
||||||
|
feePool = distKeeper.GetFeePool(ctx)
|
||||||
communityPoolBalance := suite.App.GetCommunityKeeper().GetModuleAccountBalance(ctx)
|
communityPoolBalance, change := feePool.CommunityPool.TruncateDecimal()
|
||||||
suite.Require().Equal(fundAmount.Sub(sdk.NewCoins(depositAmount)), communityPoolBalance)
|
suite.Require().Equal(fundAmount.Sub(sdk.NewCoins(depositAmount)), communityPoolBalance)
|
||||||
|
suite.Require().True(change.Empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *proposalTestSuite) TestCommunityWithdrawProposal() {
|
func (suite *proposalTestSuite) TestCommunityWithdrawProposal() {
|
||||||
|
distKeeper := suite.App.GetDistrKeeper()
|
||||||
ctx := suite.Ctx
|
ctx := suite.Ctx
|
||||||
macc := suite.App.GetAccountKeeper().GetModuleAccount(ctx, communitytypes.ModuleAccountName)
|
macc := distKeeper.GetDistributionAccount(ctx)
|
||||||
fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 100000000))
|
fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 100000000))
|
||||||
depositAmount := sdk.NewCoin("ukava", sdk.NewInt(10000000))
|
depositAmount := sdk.NewCoin("ukava", sdk.NewInt(10000000))
|
||||||
suite.Require().NoError(suite.App.FundModuleAccount(ctx, macc.GetName(), fundAmount))
|
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)
|
suite.CreateVault("ukava", types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, false, nil)
|
||||||
deposit := types.NewCommunityPoolDepositProposal("test title",
|
deposit := types.NewCommunityPoolDepositProposal("test title",
|
||||||
"desc", depositAmount)
|
"desc", depositAmount)
|
||||||
@ -66,7 +73,8 @@ func (suite *proposalTestSuite) TestCommunityWithdrawProposal() {
|
|||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
balance = suite.BankKeeper.GetAllBalances(ctx, macc.GetAddress())
|
balance = suite.BankKeeper.GetAllBalances(ctx, macc.GetAddress())
|
||||||
suite.Require().Equal(fundAmount, balance)
|
suite.Require().Equal(fundAmount, balance)
|
||||||
|
feePool = distKeeper.GetFeePool(ctx)
|
||||||
communityPoolBalance := suite.App.GetCommunityKeeper().GetModuleAccountBalance(ctx)
|
communityPoolBalance, change := feePool.CommunityPool.TruncateDecimal()
|
||||||
suite.Require().Equal(fundAmount, communityPoolBalance)
|
suite.Require().Equal(fundAmount, communityPoolBalance)
|
||||||
|
suite.Require().True(change.Empty())
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
savingskeeper "github.com/kava-labs/kava/x/savings/keeper"
|
savingskeeper "github.com/kava-labs/kava/x/savings/keeper"
|
||||||
savingstypes "github.com/kava-labs/kava/x/savings/types"
|
savingstypes "github.com/kava-labs/kava/x/savings/types"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/simapp"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
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
|
// AddCoinsToModule adds coins to the earn module account
|
||||||
func (suite *Suite) AddCoinsToModule(amount sdk.Coins) {
|
func (suite *Suite) AddCoinsToModule(amount sdk.Coins) {
|
||||||
// Does not use suite.BankKeeper.MintCoins as module account would not have permission to mint
|
// 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)
|
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])
|
acc := ak.NewAccountWithAddress(suite.Ctx, addrs[index])
|
||||||
ak.SetAccount(suite.Ctx, acc)
|
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)
|
suite.Require().NoError(err)
|
||||||
|
|
||||||
return acc
|
return acc
|
||||||
@ -239,7 +240,7 @@ func (suite *Suite) NewAccountFromAddr(addr sdk.AccAddress, balance sdk.Coins) a
|
|||||||
acc := ak.NewAccountWithAddress(suite.Ctx, addr)
|
acc := ak.NewAccountWithAddress(suite.Ctx, addr)
|
||||||
ak.SetAccount(suite.Ctx, acc)
|
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)
|
suite.Require().NoError(err)
|
||||||
|
|
||||||
return acc
|
return acc
|
||||||
|
@ -3,6 +3,7 @@ package types
|
|||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth/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"
|
hardtypes "github.com/kava-labs/kava/x/hard/types"
|
||||||
savingstypes "github.com/kava-labs/kava/x/savings/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
|
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.
|
// LiquidKeeper defines the expected interface needed for derivative to staked token conversions.
|
||||||
type LiquidKeeper interface {
|
type LiquidKeeper interface {
|
||||||
GetStakedTokensForDerivatives(ctx sdk.Context, derivatives sdk.Coins) (sdk.Coin, error)
|
GetStakedTokensForDerivatives(ctx sdk.Context, derivatives sdk.Coins) (sdk.Coin, error)
|
||||||
|
@ -13,12 +13,12 @@ import (
|
|||||||
|
|
||||||
// Keeper keeper for the cdp module
|
// Keeper keeper for the cdp module
|
||||||
type Keeper struct {
|
type Keeper struct {
|
||||||
key sdk.StoreKey
|
key sdk.StoreKey
|
||||||
cdc codec.BinaryCodec
|
cdc codec.BinaryCodec
|
||||||
paramSubspace paramtypes.Subspace
|
paramSubspace paramtypes.Subspace
|
||||||
bankKeeper types.BankKeeper
|
bankKeeper types.BankKeeper
|
||||||
accountKeeper types.AccountKeeper
|
distKeeper types.DistKeeper
|
||||||
communityKeeper types.CommunityKeeper
|
accountKeeper types.AccountKeeper
|
||||||
|
|
||||||
blacklistedAddrs map[string]bool
|
blacklistedAddrs map[string]bool
|
||||||
}
|
}
|
||||||
@ -26,7 +26,7 @@ type Keeper struct {
|
|||||||
// NewKeeper creates a new keeper
|
// NewKeeper creates a new keeper
|
||||||
func NewKeeper(
|
func NewKeeper(
|
||||||
cdc codec.BinaryCodec, key sdk.StoreKey, paramstore paramtypes.Subspace, bk types.BankKeeper, ak types.AccountKeeper,
|
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 {
|
) Keeper {
|
||||||
if !paramstore.HasKeyTable() {
|
if !paramstore.HasKeyTable() {
|
||||||
paramstore = paramstore.WithKeyTable(types.ParamKeyTable())
|
paramstore = paramstore.WithKeyTable(types.ParamKeyTable())
|
||||||
@ -37,8 +37,8 @@ func NewKeeper(
|
|||||||
cdc: cdc,
|
cdc: cdc,
|
||||||
paramSubspace: paramstore,
|
paramSubspace: paramstore,
|
||||||
bankKeeper: bk,
|
bankKeeper: bk,
|
||||||
|
distKeeper: dk,
|
||||||
accountKeeper: ak,
|
accountKeeper: ak,
|
||||||
communityKeeper: ck,
|
|
||||||
blacklistedAddrs: blacklistedAddrs,
|
blacklistedAddrs: blacklistedAddrs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ func HandleCommunityPoolMultiSpendProposal(ctx sdk.Context, k Keeper, p *types.C
|
|||||||
if k.blacklistedAddrs[receiverInfo.Address] {
|
if k.blacklistedAddrs[receiverInfo.Address] {
|
||||||
return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is blacklisted from receiving external funds", 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -3,22 +3,21 @@ package keeper_test
|
|||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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/keeper"
|
||||||
"github.com/kava-labs/kava/x/kavadist/types"
|
"github.com/kava-labs/kava/x/kavadist/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (suite *keeperTestSuite) TestHandleCommunityPoolMultiSpendProposal() {
|
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)
|
initBalances := suite.BankKeeper.GetAllBalances(ctx, addr)
|
||||||
|
|
||||||
// add coins to the module account and fund community pool
|
// add coins to the module account and fund fee pool
|
||||||
initialFunds := int64(1000000)
|
macc := distrKeeper.GetDistributionAccount(ctx)
|
||||||
fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", initialFunds))
|
fundAmount := sdk.NewCoins(sdk.NewInt64Coin("ukava", 1000000))
|
||||||
suite.Require().NoError(suite.App.FundModuleAccount(ctx, communitytypes.ModuleAccountName, fundAmount))
|
suite.Require().NoError(suite.App.FundModuleAccount(ctx, macc.GetName(), fundAmount))
|
||||||
// expect funds to start in community pool
|
feePool := distrKeeper.GetFeePool(ctx)
|
||||||
commPoolFunds := communityKeeper.GetModuleAccountBalance(ctx)
|
feePool.CommunityPool = sdk.NewDecCoinsFromCoins(fundAmount...)
|
||||||
suite.Require().True(fundAmount.IsEqual(commPoolFunds))
|
distrKeeper.SetFeePool(ctx, feePool)
|
||||||
|
|
||||||
proposalAmount1 := int64(1100)
|
proposalAmount1 := int64(1100)
|
||||||
proposalAmount2 := int64(1200)
|
proposalAmount2 := int64(1200)
|
||||||
@ -36,12 +35,6 @@ func (suite *keeperTestSuite) TestHandleCommunityPoolMultiSpendProposal() {
|
|||||||
suite.Require().Nil(err)
|
suite.Require().Nil(err)
|
||||||
|
|
||||||
balances := suite.BankKeeper.GetAllBalances(ctx, addr)
|
balances := suite.BankKeeper.GetAllBalances(ctx, addr)
|
||||||
|
|
||||||
// expect funds to be transferred to recipient
|
|
||||||
expected := initBalances.AmountOf("ukava").Add(sdk.NewInt(proposalAmount1 + proposalAmount2))
|
expected := initBalances.AmountOf("ukava").Add(sdk.NewInt(proposalAmount1 + proposalAmount2))
|
||||||
suite.Require().Equal(expected, balances.AmountOf("ukava"))
|
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"))
|
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,9 @@ import (
|
|||||||
authTypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
authTypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CommunityKeeper defines the expected community keeper interface
|
// DistKeeper defines the expected distribution keeper interface
|
||||||
type CommunityKeeper interface {
|
type DistKeeper interface {
|
||||||
DistributeFromCommunityPool(ctx sdk.Context, sender sdk.AccAddress, amount sdk.Coins) error
|
DistributeFromFeePool(ctx sdk.Context, amount sdk.Coins, receiveAddr sdk.AccAddress) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// AccountKeeper defines the expected account keeper interface
|
// AccountKeeper defines the expected account keeper interface
|
||||||
|
Loading…
Reference in New Issue
Block a user