x/distribution: gRPC query service (#6600)

* WIP: adding grpc

* added grpc for query withdraw address

* Fix outstanding rewards query

* added inteerface registry

* added gRPC for delegation rewards

* added remaining commands

* lint issue

* added tests

* added test for community pool

* fixed error

* added test for delegator validators

* updated to use test suite

* updated tests

* more test checks added

* updated tests

* Add sdk wrap

* removed pagination for outstanding rewards

* fixed distr tests issue

* fixed slashes issue

* migrated tests to table driven tests

* docs updated

* review changes

* review changes

* review changes

* Update x/distribution/keeper/grpc_query.go

Co-authored-by: sahith-narahari <sahithnarahari@gmail.com>
Co-authored-by: anilCSE <anil@vitwit.com>
Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com>
Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
atheeshp
2020-07-13 20:01:16 +00:00
committed by GitHub
co-authored by sahith-narahari anilCSE Alexander Bezobchuk Federico Kunze
parent 7678f8a913
commit be111ef036
9 changed files with 5374 additions and 77 deletions
+214
View File
@@ -0,0 +1,214 @@
package keeper
import (
"context"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/cosmos/cosmos-sdk/x/distribution/types"
"github.com/cosmos/cosmos-sdk/x/staking/exported"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
var _ types.QueryServer = Keeper{}
// Params queries params of distribution module
func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
var params types.Params
k.paramSpace.GetParamSet(ctx, &params)
return &types.QueryParamsResponse{Params: params}, nil
}
// ValidatorOutstandingRewards queries rewards of a validator address
func (k Keeper) ValidatorOutstandingRewards(c context.Context, req *types.QueryValidatorOutstandingRewardsRequest) (*types.QueryValidatorOutstandingRewardsResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.ValidatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty validator address")
}
ctx := sdk.UnwrapSDKContext(c)
rewards := k.GetValidatorOutstandingRewards(ctx, req.ValidatorAddress)
return &types.QueryValidatorOutstandingRewardsResponse{Rewards: rewards}, nil
}
// ValidatorCommission queries accumulated commission for a validator
func (k Keeper) ValidatorCommission(c context.Context, req *types.QueryValidatorCommissionRequest) (*types.QueryValidatorCommissionResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.ValidatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty validator address")
}
ctx := sdk.UnwrapSDKContext(c)
commission := k.GetValidatorAccumulatedCommission(ctx, req.ValidatorAddress)
return &types.QueryValidatorCommissionResponse{Commission: commission}, nil
}
// ValidatorSlashes queries slash events of a validator
func (k Keeper) ValidatorSlashes(c context.Context, req *types.QueryValidatorSlashesRequest) (*types.QueryValidatorSlashesResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.ValidatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty validator address")
}
if req.EndingHeight < req.StartingHeight {
return nil, status.Errorf(codes.InvalidArgument, "starting height greater than ending height (%d > %d)", req.StartingHeight, req.EndingHeight)
}
ctx := sdk.UnwrapSDKContext(c)
events := make([]types.ValidatorSlashEvent, 0)
store := ctx.KVStore(k.storeKey)
slashesStore := prefix.NewStore(store, types.GetValidatorSlashEventPrefix(req.ValidatorAddress))
res, err := query.FilteredPaginate(slashesStore, req.Req, func(key []byte, value []byte, accumulate bool) (bool, error) {
var result types.ValidatorSlashEvent
err := k.cdc.UnmarshalBinaryBare(value, &result)
if err != nil {
return false, err
}
if result.ValidatorPeriod < req.StartingHeight || result.ValidatorPeriod > req.EndingHeight {
return false, nil
}
if accumulate {
events = append(events, result)
}
return true, nil
})
if err != nil {
return &types.QueryValidatorSlashesResponse{}, err
}
return &types.QueryValidatorSlashesResponse{Slashes: events, Res: res}, nil
}
// DelegationRewards the total rewards accrued by a delegation
func (k Keeper) DelegationRewards(c context.Context, req *types.QueryDelegationRewardsRequest) (*types.QueryDelegationRewardsResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.DelegatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty delegator address")
}
if req.ValidatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty validator address")
}
ctx := sdk.UnwrapSDKContext(c)
val := k.stakingKeeper.Validator(ctx, req.ValidatorAddress)
if val == nil {
return nil, sdkerrors.Wrap(types.ErrNoValidatorExists, req.ValidatorAddress.String())
}
del := k.stakingKeeper.Delegation(ctx, req.DelegatorAddress, req.ValidatorAddress)
if del == nil {
return nil, types.ErrNoDelegationExists
}
endingPeriod := k.IncrementValidatorPeriod(ctx, val)
rewards := k.CalculateDelegationRewards(ctx, val, del, endingPeriod)
return &types.QueryDelegationRewardsResponse{Rewards: rewards}, nil
}
// DelegationTotalRewards the total rewards accrued by a each validator
func (k Keeper) DelegationTotalRewards(c context.Context, req *types.QueryDelegationTotalRewardsRequest) (*types.QueryDelegationTotalRewardsResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.DelegatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty delegator address")
}
ctx := sdk.UnwrapSDKContext(c)
total := sdk.DecCoins{}
var delRewards []types.DelegationDelegatorReward
k.stakingKeeper.IterateDelegations(
ctx, req.DelegatorAddress,
func(_ int64, del exported.DelegationI) (stop bool) {
valAddr := del.GetValidatorAddr()
val := k.stakingKeeper.Validator(ctx, valAddr)
endingPeriod := k.IncrementValidatorPeriod(ctx, val)
delReward := k.CalculateDelegationRewards(ctx, val, del, endingPeriod)
delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward))
total = total.Add(delReward...)
return false
},
)
return &types.QueryDelegationTotalRewardsResponse{Rewards: delRewards, Total: total}, nil
}
// DelegatorValidators queries the validators list of a delegator
func (k Keeper) DelegatorValidators(c context.Context, req *types.QueryDelegatorValidatorsRequest) (*types.QueryDelegatorValidatorsResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.DelegatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty delegator address")
}
ctx := sdk.UnwrapSDKContext(c)
var validators []sdk.ValAddress
k.stakingKeeper.IterateDelegations(
ctx, req.DelegatorAddress,
func(_ int64, del exported.DelegationI) (stop bool) {
validators = append(validators, del.GetValidatorAddr())
return false
},
)
return &types.QueryDelegatorValidatorsResponse{Validators: validators}, nil
}
// DelegatorWithdrawAddress queries Query/delegatorWithdrawAddress
func (k Keeper) DelegatorWithdrawAddress(c context.Context, req *types.QueryDelegatorWithdrawAddressRequest) (*types.QueryDelegatorWithdrawAddressResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
if req.DelegatorAddress.Empty() {
return nil, status.Error(codes.InvalidArgument, "empty delegator address")
}
ctx := sdk.UnwrapSDKContext(c)
withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, req.DelegatorAddress)
return &types.QueryDelegatorWithdrawAddressResponse{WithdrawAddress: withdrawAddr}, nil
}
// CommunityPool queries the community pool coins
func (k Keeper) CommunityPool(c context.Context, req *types.QueryCommunityPoolRequest) (*types.QueryCommunityPoolResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
pool := k.GetFeePoolCommunityCoins(ctx)
return &types.QueryCommunityPoolResponse{Pool: pool}, nil
}
+661
View File
@@ -0,0 +1,661 @@
package keeper_test
import (
gocontext "context"
"fmt"
"testing"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/cosmos/cosmos-sdk/x/distribution/types"
"github.com/cosmos/cosmos-sdk/x/staking"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/stretchr/testify/suite"
abci "github.com/tendermint/tendermint/abci/types"
)
type KeeperTestSuite struct {
suite.Suite
app *simapp.SimApp
ctx sdk.Context
queryClient types.QueryClient
addrs []sdk.AccAddress
valAddrs []sdk.ValAddress
}
func (suite *KeeperTestSuite) SetupTest() {
app := simapp.Setup(false)
ctx := app.BaseApp.NewContext(false, abci.Header{})
queryHelper := baseapp.NewQueryServerTestHelper(ctx, app.InterfaceRegistry())
types.RegisterQueryServer(queryHelper, app.DistrKeeper)
queryClient := types.NewQueryClient(queryHelper)
suite.app = app
suite.ctx = ctx
suite.queryClient = queryClient
suite.addrs = simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000000000))
suite.valAddrs = simapp.ConvertAddrsToValAddrs(suite.addrs)
}
func (suite *KeeperTestSuite) TestGRPCParams() {
app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient
var (
params types.Params
req *types.QueryParamsRequest
expParams types.Params
)
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty params request",
func() {
req = &types.QueryParamsRequest{}
expParams = types.DefaultParams()
},
true,
},
{
"valid request",
func() {
params = types.Params{
CommunityTax: sdk.NewDecWithPrec(3, 1),
BaseProposerReward: sdk.NewDecWithPrec(2, 1),
BonusProposerReward: sdk.NewDecWithPrec(1, 1),
WithdrawAddrEnabled: true,
}
app.DistrKeeper.SetParams(ctx, params)
req = &types.QueryParamsRequest{}
expParams = params
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
paramsRes, err := queryClient.Params(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().NotNil(paramsRes)
suite.Require().Equal(paramsRes.Params, expParams)
} else {
suite.Require().Error(err)
}
})
}
}
func (suite *KeeperTestSuite) TestGRPCValidatorOutstandingRewards() {
app, ctx, queryClient, valAddrs := suite.app, suite.ctx, suite.queryClient, suite.valAddrs
valCommission := sdk.DecCoins{
sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(5000)),
sdk.NewDecCoinFromDec("stake", sdk.NewDec(300)),
}
// set outstanding rewards
app.DistrKeeper.SetValidatorOutstandingRewards(ctx, valAddrs[0], types.ValidatorOutstandingRewards{Rewards: valCommission})
rewards := app.DistrKeeper.GetValidatorOutstandingRewards(ctx, valAddrs[0])
var req *types.QueryValidatorOutstandingRewardsRequest
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
req = &types.QueryValidatorOutstandingRewardsRequest{}
},
false,
}, {
"valid request",
func() {
req = &types.QueryValidatorOutstandingRewardsRequest{ValidatorAddress: valAddrs[0]}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
validatorOutstandingRewards, err := queryClient.ValidatorOutstandingRewards(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(rewards, validatorOutstandingRewards.Rewards)
suite.Require().Equal(valCommission, validatorOutstandingRewards.Rewards.Rewards)
} else {
suite.Require().Error(err)
suite.Require().Nil(validatorOutstandingRewards)
}
})
}
}
func (suite *KeeperTestSuite) TestGRPCValidatorCommission() {
app, ctx, queryClient, valAddrs := suite.app, suite.ctx, suite.queryClient, suite.valAddrs
commission := sdk.DecCoins{{Denom: "token1", Amount: sdk.NewDec(4)}, {Denom: "token2", Amount: sdk.NewDec(2)}}
app.DistrKeeper.SetValidatorAccumulatedCommission(ctx, valAddrs[0], types.ValidatorAccumulatedCommission{Commission: commission})
var req *types.QueryValidatorCommissionRequest
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
req = &types.QueryValidatorCommissionRequest{}
},
false,
},
{
"valid request",
func() {
req = &types.QueryValidatorCommissionRequest{ValidatorAddress: valAddrs[0]}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
commissionRes, err := queryClient.ValidatorCommission(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().NotNil(commissionRes)
suite.Require().Equal(commissionRes.Commission.Commission, commission)
} else {
suite.Require().Error(err)
suite.Require().Nil(commissionRes)
}
})
}
}
func (suite *KeeperTestSuite) TestGRPCValidatorSlashes() {
app, ctx, queryClient, valAddrs := suite.app, suite.ctx, suite.queryClient, suite.valAddrs
slashes := []types.ValidatorSlashEvent{
types.NewValidatorSlashEvent(3, sdk.NewDecWithPrec(5, 1)),
types.NewValidatorSlashEvent(5, sdk.NewDecWithPrec(5, 1)),
types.NewValidatorSlashEvent(7, sdk.NewDecWithPrec(5, 1)),
types.NewValidatorSlashEvent(9, sdk.NewDecWithPrec(5, 1)),
}
for i, slash := range slashes {
app.DistrKeeper.SetValidatorSlashEvent(ctx, valAddrs[0], uint64(i+2), 0, slash)
}
var (
req *types.QueryValidatorSlashesRequest
expRes *types.QueryValidatorSlashesResponse
)
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
req = &types.QueryValidatorSlashesRequest{}
expRes = &types.QueryValidatorSlashesResponse{}
},
false,
},
{
"Ending height lesser than start height request",
func() {
req = &types.QueryValidatorSlashesRequest{
ValidatorAddress: valAddrs[1],
StartingHeight: 10,
EndingHeight: 1,
}
expRes = &types.QueryValidatorSlashesResponse{Res: &query.PageResponse{}}
},
false,
},
{
"no slash event validator request",
func() {
req = &types.QueryValidatorSlashesRequest{
ValidatorAddress: valAddrs[1],
StartingHeight: 1,
EndingHeight: 10,
}
expRes = &types.QueryValidatorSlashesResponse{Res: &query.PageResponse{}}
},
true,
},
{
"request slashes with offset 2 and limit 2",
func() {
pageReq := &query.PageRequest{
Offset: 2,
Limit: 2,
}
req = &types.QueryValidatorSlashesRequest{
ValidatorAddress: valAddrs[0],
StartingHeight: 1,
EndingHeight: 10,
Req: pageReq,
}
expRes = &types.QueryValidatorSlashesResponse{
Slashes: slashes[2:],
}
},
true,
},
{
"request slashes with page limit 3 and count total",
func() {
pageReq := &query.PageRequest{
Limit: 3,
CountTotal: true,
}
req = &types.QueryValidatorSlashesRequest{
ValidatorAddress: valAddrs[0],
StartingHeight: 1,
EndingHeight: 10,
Req: pageReq,
}
expRes = &types.QueryValidatorSlashesResponse{
Slashes: slashes[:3],
}
},
true,
},
{
"request slashes with page limit 4 and count total",
func() {
pageReq := &query.PageRequest{
Limit: 4,
CountTotal: true,
}
req = &types.QueryValidatorSlashesRequest{
ValidatorAddress: valAddrs[0],
StartingHeight: 1,
EndingHeight: 10,
Req: pageReq,
}
expRes = &types.QueryValidatorSlashesResponse{
Slashes: slashes[:4],
}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
slashesRes, err := queryClient.ValidatorSlashes(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(expRes.GetSlashes(), slashesRes.GetSlashes())
} else {
suite.Require().Error(err)
suite.Require().Nil(slashesRes)
}
})
}
}
func (suite *KeeperTestSuite) TestGRPCDelegationRewards() {
app, ctx, addrs, valAddrs := suite.app, suite.ctx, suite.addrs, suite.valAddrs
sh := staking.NewHandler(app.StakingKeeper)
comm := stakingtypes.NewCommissionRates(sdk.NewDecWithPrec(5, 1), sdk.NewDecWithPrec(5, 1), sdk.NewDec(0))
msg := stakingtypes.NewMsgCreateValidator(
valAddrs[0], valConsPk1, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Description{}, comm, sdk.OneInt(),
)
res, err := sh(ctx, msg)
suite.Require().NoError(err)
suite.Require().NotNil(res)
staking.EndBlocker(ctx, app.StakingKeeper)
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
queryHelper := baseapp.NewQueryServerTestHelper(ctx, app.InterfaceRegistry())
types.RegisterQueryServer(queryHelper, app.DistrKeeper)
queryClient := types.NewQueryClient(queryHelper)
val := app.StakingKeeper.Validator(ctx, valAddrs[0])
initial := int64(10)
tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial)}}
app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens)
// test command delegation rewards grpc
var (
req *types.QueryDelegationRewardsRequest
expRes *types.QueryDelegationRewardsResponse
)
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
req = &types.QueryDelegationRewardsRequest{}
},
false,
},
{
"empty delegator request",
func() {
req = &types.QueryDelegationRewardsRequest{
DelegatorAddress: nil,
ValidatorAddress: valAddrs[0],
}
},
false,
},
{
"empty validator request",
func() {
req = &types.QueryDelegationRewardsRequest{
DelegatorAddress: addrs[1],
ValidatorAddress: nil,
}
},
false,
},
{
"request with wrong delegator and validator",
func() {
req = &types.QueryDelegationRewardsRequest{
DelegatorAddress: addrs[1],
ValidatorAddress: valAddrs[1],
}
},
false,
},
{
"valid request",
func() {
req = &types.QueryDelegationRewardsRequest{
DelegatorAddress: addrs[0],
ValidatorAddress: valAddrs[0],
}
expRes = &types.QueryDelegationRewardsResponse{
Rewards: sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}},
}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
rewards, err := queryClient.DelegationRewards(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(expRes, rewards)
} else {
suite.Require().Error(err)
suite.Require().Nil(rewards)
}
})
}
// test command delegator total rewards grpc
var (
totalRewardsReq *types.QueryDelegationTotalRewardsRequest
expTotalRewardsRes *types.QueryDelegationTotalRewardsResponse
)
testCases = []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
totalRewardsReq = &types.QueryDelegationTotalRewardsRequest{}
},
false,
},
{
"valid total delegation rewards",
func() {
totalRewardsReq = &types.QueryDelegationTotalRewardsRequest{
DelegatorAddress: addrs[0],
}
expectedDelReward := types.NewDelegationDelegatorReward(valAddrs[0],
sdk.DecCoins{sdk.NewInt64DecCoin("stake", 5)})
expTotalRewardsRes = &types.QueryDelegationTotalRewardsResponse{
Rewards: []types.DelegationDelegatorReward{expectedDelReward},
Total: expectedDelReward.Reward,
}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
totalRewardsRes, err := queryClient.DelegationTotalRewards(gocontext.Background(), totalRewardsReq)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(totalRewardsRes, expTotalRewardsRes)
} else {
suite.Require().Error(err)
suite.Require().Nil(totalRewardsRes)
}
})
}
// test command validator delegators grpc
var (
delegatorValidatorsReq *types.QueryDelegatorValidatorsRequest
expDelegatorValidatorsRes *types.QueryDelegatorValidatorsResponse
)
testCases = []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
delegatorValidatorsReq = &types.QueryDelegatorValidatorsRequest{}
},
false,
},
{
"request no delegations address",
func() {
delegatorValidatorsReq = &types.QueryDelegatorValidatorsRequest{
DelegatorAddress: addrs[1],
}
expDelegatorValidatorsRes = &types.QueryDelegatorValidatorsResponse{}
},
true,
},
{
"valid request",
func() {
delegatorValidatorsReq = &types.QueryDelegatorValidatorsRequest{
DelegatorAddress: addrs[0],
}
expDelegatorValidatorsRes = &types.QueryDelegatorValidatorsResponse{
Validators: valAddrs[:1],
}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
validators, err := queryClient.DelegatorValidators(gocontext.Background(), delegatorValidatorsReq)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(validators, expDelegatorValidatorsRes)
} else {
suite.Require().Error(err)
suite.Require().Nil(validators)
}
})
}
}
func (suite *KeeperTestSuite) TestGRPCDelegatorWithdrawAddress() {
app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs
err := app.DistrKeeper.SetWithdrawAddr(ctx, addrs[0], addrs[1])
suite.Require().Nil(err)
var req *types.QueryDelegatorWithdrawAddressRequest
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty request",
func() {
req = &types.QueryDelegatorWithdrawAddressRequest{}
},
false,
},
{
"valid request",
func() {
req = &types.QueryDelegatorWithdrawAddressRequest{DelegatorAddress: addrs[0]}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
withdrawAddress, err := queryClient.DelegatorWithdrawAddress(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(withdrawAddress.WithdrawAddress, addrs[1])
} else {
suite.Require().Error(err)
suite.Require().Nil(withdrawAddress)
}
})
}
}
func (suite *KeeperTestSuite) TestGRPCCommunityPool() {
app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs
var (
req *types.QueryCommunityPoolRequest
expPool *types.QueryCommunityPoolResponse
)
testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"valid request empty community pool",
func() {
req = &types.QueryCommunityPoolRequest{}
expPool = &types.QueryCommunityPoolResponse{}
},
true,
},
{
"valid request",
func() {
amount := sdk.NewCoins(sdk.NewInt64Coin("stake", 100))
suite.Require().NoError(app.BankKeeper.SetBalances(ctx, addrs[0], amount))
err := app.DistrKeeper.FundCommunityPool(ctx, amount, addrs[0])
suite.Require().Nil(err)
req = &types.QueryCommunityPoolRequest{}
expPool = &types.QueryCommunityPoolResponse{Pool: sdk.NewDecCoinsFromCoins(amount...)}
},
true,
},
}
for _, testCase := range testCases {
suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
testCase.malleate()
pool, err := queryClient.CommunityPool(gocontext.Background(), req)
if testCase.expPass {
suite.Require().NoError(err)
suite.Require().Equal(expPool, pool)
} else {
suite.Require().Error(err)
suite.Require().Nil(pool)
}
})
}
}
func TestDistributionTestSuite(t *testing.T) {
suite.Run(t, new(KeeperTestSuite))
}
+3 -1
View File
@@ -134,7 +134,9 @@ func (am AppModule) NewQuerierHandler() sdk.Querier {
return keeper.NewQuerier(am.keeper)
}
func (am AppModule) RegisterQueryService(grpc.Server) {}
func (am AppModule) RegisterQueryService(server grpc.Server) {
types.RegisterQueryServer(server, am.keeper)
}
// InitGenesis performs genesis initialization for the distribution module. It returns
// no validator updates.
+341 -68
View File
@@ -727,6 +727,60 @@ func (m *DelegatorStartingInfo) GetHeight() uint64 {
return 0
}
// DelegationDelegatorReward defines the properties
// of a delegator's delegation reward.
type DelegationDelegatorReward struct {
ValidatorAddress github_com_cosmos_cosmos_sdk_types.ValAddress `protobuf:"bytes,1,opt,name=validator_address,json=validatorAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ValAddress" json:"validator_address,omitempty" yaml:"validator_address"`
Reward github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,2,rep,name=reward,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"reward"`
}
func (m *DelegationDelegatorReward) Reset() { *m = DelegationDelegatorReward{} }
func (m *DelegationDelegatorReward) String() string { return proto.CompactTextString(m) }
func (*DelegationDelegatorReward) ProtoMessage() {}
func (*DelegationDelegatorReward) Descriptor() ([]byte, []int) {
return fileDescriptor_49870d4e3df20cf9, []int{14}
}
func (m *DelegationDelegatorReward) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *DelegationDelegatorReward) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_DelegationDelegatorReward.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *DelegationDelegatorReward) XXX_Merge(src proto.Message) {
xxx_messageInfo_DelegationDelegatorReward.Merge(m, src)
}
func (m *DelegationDelegatorReward) XXX_Size() int {
return m.Size()
}
func (m *DelegationDelegatorReward) XXX_DiscardUnknown() {
xxx_messageInfo_DelegationDelegatorReward.DiscardUnknown(m)
}
var xxx_messageInfo_DelegationDelegatorReward proto.InternalMessageInfo
func (m *DelegationDelegatorReward) GetValidatorAddress() github_com_cosmos_cosmos_sdk_types.ValAddress {
if m != nil {
return m.ValidatorAddress
}
return nil
}
func (m *DelegationDelegatorReward) GetReward() github_com_cosmos_cosmos_sdk_types.DecCoins {
if m != nil {
return m.Reward
}
return nil
}
func init() {
proto.RegisterType((*MsgSetWithdrawAddress)(nil), "cosmos.distribution.MsgSetWithdrawAddress")
proto.RegisterType((*MsgWithdrawDelegatorReward)(nil), "cosmos.distribution.MsgWithdrawDelegatorReward")
@@ -742,6 +796,7 @@ func init() {
proto.RegisterType((*FeePool)(nil), "cosmos.distribution.FeePool")
proto.RegisterType((*CommunityPoolSpendProposal)(nil), "cosmos.distribution.CommunityPoolSpendProposal")
proto.RegisterType((*DelegatorStartingInfo)(nil), "cosmos.distribution.DelegatorStartingInfo")
proto.RegisterType((*DelegationDelegatorReward)(nil), "cosmos.distribution.DelegationDelegatorReward")
}
func init() {
@@ -749,76 +804,78 @@ func init() {
}
var fileDescriptor_49870d4e3df20cf9 = []byte{
// 1098 bytes of a gzipped FileDescriptorProto
// 1126 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcd, 0x6f, 0x1b, 0x45,
0x14, 0xf7, 0x38, 0x6e, 0x9a, 0x4c, 0xd3, 0xa4, 0xdd, 0xd8, 0x49, 0xe4, 0x80, 0x37, 0x1a, 0x89,
0x2a, 0x12, 0x8a, 0x43, 0xe9, 0x2d, 0x07, 0xa4, 0x38, 0x1f, 0x02, 0xd4, 0x90, 0x68, 0x13, 0x82,
0xc4, 0x01, 0x6b, 0xbc, 0x3b, 0x71, 0x46, 0x59, 0xef, 0xac, 0x66, 0xc6, 0xf9, 0xe8, 0x05, 0xa9,
0x14, 0xf7, 0xb8, 0xae, 0x9b, 0x4c, 0xd3, 0xa4, 0xdd, 0xd8, 0x49, 0x70, 0xc0, 0x1b, 0x8d, 0x44,
0x15, 0x09, 0xc5, 0xa1, 0xf4, 0x96, 0x03, 0x52, 0x9c, 0x0f, 0x01, 0x6a, 0x48, 0xb4, 0x09, 0x41,
0x42, 0x08, 0x6b, 0xbc, 0x3b, 0x71, 0x46, 0x59, 0xef, 0xac, 0x66, 0xc6, 0xf9, 0xe8, 0x05, 0xa9,
0xe2, 0xeb, 0x80, 0x44, 0x91, 0x38, 0x70, 0x40, 0xa8, 0x07, 0x0e, 0xd0, 0x7f, 0x82, 0x6b, 0x8f,
0xbd, 0x81, 0x38, 0xb8, 0x28, 0xb9, 0x71, 0xcc, 0x0d, 0x4e, 0x68, 0x67, 0x66, 0x3f, 0xec, 0xb8,
0x10, 0x47, 0x15, 0xdc, 0x3c, 0x6f, 0xde, 0xfc, 0x7e, 0xbf, 0x79, 0xef, 0xcd, 0x7b, 0x6b, 0x78,
0xc7, 0x65, 0xa2, 0xc5, 0xc4, 0xa2, 0x47, 0x85, 0xe4, 0xb4, 0xd1, 0x96, 0x94, 0x05, 0x5d, 0x8b,
0x6a, 0xc8, 0x99, 0x64, 0xd6, 0xa4, 0xf6, 0xab, 0x66, 0xb7, 0xca, 0xc5, 0x26, 0x6b, 0x32, 0xb5,
0xbf, 0x18, 0xfd, 0xd2, 0xae, 0x65, 0xe3, 0xba, 0x68, 0x4e, 0x28, 0x23, 0xfa, 0x32, 0x0f, 0x4b,
0x1b, 0xa2, 0xb9, 0x4d, 0xe4, 0x07, 0x54, 0xee, 0x7b, 0x1c, 0x1f, 0x2d, 0x7b, 0x1e, 0x27, 0x42,
0x58, 0x0f, 0xe0, 0x6d, 0x8f, 0xf8, 0xa4, 0x89, 0x25, 0xe3, 0x75, 0xac, 0x8d, 0x33, 0x60, 0x0e,
0xcc, 0x8f, 0xd5, 0x36, 0xce, 0x3b, 0xf6, 0xcc, 0x09, 0x6e, 0xf9, 0x4b, 0xe8, 0x82, 0x0b, 0xfa,
0xab, 0x63, 0x2f, 0x34, 0xa9, 0xdc, 0x6f, 0x37, 0xaa, 0x2e, 0x6b, 0x2d, 0x76, 0x91, 0x2e, 0x08,
0xef, 0x60, 0x51, 0x9e, 0x84, 0x44, 0x54, 0x97, 0x5d, 0xd7, 0x30, 0x39, 0xb7, 0x12, 0x90, 0x98,
0xfb, 0x08, 0xde, 0x3a, 0x32, 0x72, 0x12, 0xea, 0xbc, 0xa2, 0xbe, 0x7f, 0xde, 0xb1, 0xa7, 0x35,
0x75, 0xaf, 0xc7, 0x15, 0x98, 0x27, 0x8e, 0xba, 0x2f, 0x8d, 0xbe, 0xc9, 0xc3, 0xf2, 0x86, 0x68,
0xc6, 0xb1, 0x58, 0x8d, 0x85, 0x39, 0xe4, 0x08, 0x73, 0xef, 0x7f, 0x8d, 0xc9, 0x03, 0x78, 0xfb,
0x10, 0xfb, 0xd4, 0xeb, 0xe2, 0xce, 0xf7, 0x72, 0x5f, 0x70, 0xb9, 0x2c, 0xf7, 0x2e, 0xf6, 0x13,
0xee, 0x04, 0x24, 0x0e, 0xcb, 0x77, 0x00, 0x56, 0x32, 0x61, 0xd9, 0x8d, 0xf7, 0x57, 0x58, 0xab,
0x45, 0x85, 0xa0, 0x2c, 0xe8, 0x2f, 0x0f, 0xfc, 0x37, 0xf2, 0x7e, 0x06, 0xb0, 0xb8, 0x21, 0x9a,
0xeb, 0xed, 0xc0, 0x8b, 0x14, 0xb5, 0x03, 0x2a, 0x4f, 0xb6, 0x18, 0xf3, 0xad, 0x5d, 0x38, 0x8c,
0x5b, 0xac, 0x1d, 0xc8, 0x19, 0x30, 0x37, 0x34, 0x7f, 0xe3, 0xcd, 0xb1, 0xaa, 0x29, 0xfe, 0x15,
0x46, 0x83, 0xda, 0x1b, 0x4f, 0x3b, 0x76, 0xee, 0xc9, 0x73, 0x7b, 0xfe, 0x12, 0xfc, 0xd1, 0x01,
0xe1, 0x18, 0x34, 0x6b, 0x13, 0x8e, 0x7a, 0x24, 0x64, 0x82, 0x4a, 0xc6, 0x4d, 0x0e, 0xee, 0x0e,
0x9e, 0xe3, 0x14, 0x03, 0xfd, 0x32, 0x04, 0x87, 0xb7, 0x30, 0xc7, 0x2d, 0x61, 0x1d, 0xc0, 0x9b,
0x6e, 0x7c, 0x89, 0xba, 0xc4, 0xc7, 0x2a, 0x88, 0xa3, 0xb5, 0xf5, 0x48, 0xec, 0x6f, 0x1d, 0xfb,
0xce, 0x25, 0x38, 0x56, 0x89, 0x7b, 0xde, 0xb1, 0x8b, 0x3a, 0xe4, 0x5d, 0x60, 0xc8, 0x19, 0x4b,
0xd6, 0x3b, 0xf8, 0xd8, 0xfa, 0x18, 0x16, 0x1b, 0x58, 0x90, 0x7a, 0xc8, 0x59, 0xc8, 0x04, 0xe1,
0x75, 0xae, 0x0a, 0x5d, 0xdd, 0x69, 0xb4, 0xb6, 0x31, 0x30, 0xe7, 0xac, 0xe6, 0xec, 0x87, 0x89,
0x1c, 0x2b, 0x32, 0x6f, 0x19, 0xab, 0x79, 0x51, 0x0f, 0x01, 0x2c, 0x35, 0x58, 0xd0, 0x16, 0x17,
0x24, 0x0c, 0x29, 0x09, 0xef, 0x0d, 0x2c, 0xe1, 0x15, 0x23, 0xa1, 0x1f, 0x28, 0x72, 0x26, 0x95,
0xbd, 0x47, 0xc4, 0x0e, 0x2c, 0x75, 0x35, 0x93, 0x3a, 0x09, 0x70, 0xc3, 0x27, 0xde, 0x4c, 0x61,
0x0e, 0xcc, 0x8f, 0xd4, 0xe6, 0x52, 0xd4, 0xbe, 0x6e, 0xc8, 0x99, 0xcc, 0xf6, 0x91, 0x35, 0x6d,
0x5d, 0x2a, 0x7c, 0xfb, 0xd8, 0xce, 0xa1, 0x87, 0x79, 0x58, 0x4e, 0xde, 0xcb, 0xdb, 0x54, 0x48,
0xc6, 0xa9, 0x8b, 0x7d, 0xcd, 0x2c, 0xac, 0xef, 0x01, 0x9c, 0x76, 0xdb, 0xad, 0xb6, 0x8f, 0x25,
0x3d, 0x24, 0x46, 0x66, 0x9d, 0x63, 0x49, 0x99, 0xa9, 0xd9, 0x89, 0xb8, 0x66, 0x57, 0x89, 0xab,
0xca, 0xf6, 0xfd, 0x28, 0x24, 0xe7, 0x1d, 0xbb, 0x62, 0xf2, 0xdb, 0xff, 0x34, 0x7a, 0xf2, 0xdc,
0x7e, 0xfd, 0x72, 0x41, 0xd3, 0xb5, 0x5d, 0x4a, 0x81, 0xb4, 0x38, 0x27, 0x82, 0xb1, 0x56, 0xe0,
0x04, 0x27, 0x7b, 0x84, 0x93, 0xc0, 0x25, 0x75, 0x57, 0xbd, 0xa5, 0xa8, 0x38, 0x6e, 0xd6, 0xca,
0xe7, 0x1d, 0x7b, 0x4a, 0x4b, 0xe8, 0x71, 0x40, 0xce, 0x78, 0x62, 0x59, 0x51, 0x86, 0xaf, 0x01,
0x9c, 0x4e, 0x9b, 0x46, 0x9b, 0x73, 0x12, 0xc8, 0x38, 0x02, 0x1f, 0xc1, 0xeb, 0x5a, 0xb7, 0x78,
0xd1, 0x85, 0xef, 0x99, 0x77, 0x3a, 0xd0, 0x75, 0x62, 0x50, 0x6b, 0x0a, 0x0e, 0x87, 0x84, 0x53,
0xa6, 0x8b, 0xba, 0xe0, 0x98, 0x15, 0xfa, 0x0c, 0xc0, 0x4a, 0xa2, 0x69, 0xd9, 0x35, 0xb7, 0x27,
0x5e, 0xa6, 0xa7, 0x79, 0x10, 0xba, 0xc9, 0xea, 0xa5, 0xaa, 0xcb, 0xe0, 0xa2, 0xaf, 0x00, 0x9c,
0x4d, 0x84, 0x6c, 0xb6, 0xa5, 0x90, 0x38, 0xf0, 0x68, 0xd0, 0x8c, 0x03, 0x14, 0xfe, 0x6b, 0x80,
0xd6, 0x4c, 0x45, 0x8c, 0xc7, 0xe9, 0x50, 0xde, 0xe8, 0xaa, 0x21, 0x43, 0x3f, 0x01, 0x38, 0x99,
0x28, 0xda, 0xf6, 0xb1, 0xd8, 0x5f, 0x3b, 0x24, 0x81, 0xb4, 0xd6, 0x61, 0xda, 0x7b, 0xeb, 0x26,
0xa8, 0x51, 0x77, 0x2a, 0xd4, 0x66, 0xd3, 0xb1, 0xdc, 0xeb, 0x81, 0x9c, 0x89, 0xc4, 0xb4, 0xa5,
0x2c, 0xd6, 0xbb, 0x70, 0x64, 0x8f, 0x63, 0x37, 0xfa, 0x56, 0x31, 0x9d, 0xa6, 0x3a, 0xd8, 0x33,
0x77, 0x92, 0xf3, 0xe8, 0x07, 0x00, 0x8b, 0x7d, 0xb4, 0x0a, 0xeb, 0x53, 0x00, 0xa7, 0x52, 0x2d,
0x22, 0xda, 0xa9, 0x13, 0xb5, 0x65, 0xc2, 0x38, 0x5f, 0xed, 0xf3, 0xed, 0x54, 0xed, 0x83, 0x55,
0x7b, 0xcd, 0xc4, 0xf7, 0xd5, 0xde, 0x1b, 0x66, 0x51, 0x91, 0x53, 0x3c, 0xec, 0xa3, 0xc3, 0xb4,
0x81, 0x47, 0x00, 0x5e, 0x5f, 0x27, 0x44, 0x4d, 0xa5, 0x4f, 0x00, 0x1c, 0x4f, 0xbb, 0x72, 0xc8,
0x98, 0xff, 0xa2, 0xc4, 0xde, 0x37, 0xc4, 0xa5, 0xde, 0x56, 0x1e, 0x1d, 0x1a, 0x38, 0xbf, 0xe9,
0x5c, 0x89, 0x64, 0xa0, 0xcf, 0xf3, 0xb0, 0xdc, 0x35, 0x2e, 0xb7, 0x43, 0x12, 0x78, 0xba, 0x35,
0x62, 0xdf, 0x2a, 0xc2, 0x6b, 0x92, 0x4a, 0x9f, 0xe8, 0xf9, 0xe3, 0xe8, 0x85, 0x35, 0x07, 0x6f,
0x78, 0x44, 0xb8, 0x9c, 0x86, 0x69, 0xf6, 0x9c, 0xac, 0x29, 0x9a, 0x8d, 0x9c, 0xb8, 0x34, 0xa4,
0x24, 0x90, 0xaa, 0x89, 0x5f, 0x6d, 0x36, 0x26, 0x18, 0x99, 0x21, 0x5e, 0x78, 0x99, 0x43, 0x7c,
0x69, 0xe4, 0x8b, 0xc7, 0x76, 0x4e, 0x25, 0xe7, 0x4f, 0x00, 0x4b, 0xc9, 0xa7, 0xde, 0xb6, 0xc4,
0x5c, 0xd2, 0xa0, 0xf9, 0x4e, 0xb0, 0xa7, 0xba, 0x5f, 0xc8, 0xc9, 0x21, 0x65, 0xd1, 0x2c, 0xc9,
0x16, 0x7c, 0xa6, 0xfb, 0xf5, 0x38, 0x20, 0x67, 0x3c, 0xb6, 0x98, 0x72, 0xdf, 0x81, 0xd7, 0x84,
0xc4, 0x07, 0xc4, 0xd4, 0xfa, 0x5b, 0x03, 0x8f, 0xb4, 0x31, 0x4d, 0xa4, 0x40, 0x90, 0xa3, 0xc1,
0xac, 0x35, 0x38, 0xbc, 0x4f, 0x68, 0x73, 0x5f, 0x07, 0xb9, 0x50, 0x5b, 0xf8, 0xa3, 0x63, 0x4f,
0xb8, 0x9c, 0x44, 0x5d, 0x3b, 0xa8, 0xeb, 0xad, 0x54, 0x64, 0xcf, 0x06, 0x72, 0xcc, 0xe1, 0xda,
0xe6, 0x8f, 0xa7, 0x15, 0xf0, 0xf4, 0xb4, 0x02, 0x9e, 0x9d, 0x56, 0xc0, 0xef, 0xa7, 0x15, 0xf0,
0xe8, 0xac, 0x92, 0x7b, 0x76, 0x56, 0xc9, 0xfd, 0x7a, 0x56, 0xc9, 0x7d, 0x78, 0xf7, 0x1f, 0x35,
0x1e, 0x77, 0xff, 0x3d, 0x51, 0x92, 0x1b, 0xc3, 0xea, 0x8f, 0xc5, 0xbd, 0xbf, 0x03, 0x00, 0x00,
0xff, 0xff, 0xda, 0x06, 0xab, 0xc7, 0xc2, 0x0c, 0x00, 0x00,
0xbd, 0x81, 0x38, 0xb8, 0x28, 0xb9, 0x71, 0x8c, 0xc4, 0x01, 0x4e, 0x68, 0x67, 0x66, 0x77, 0x6d,
0xc7, 0x85, 0x38, 0x8a, 0xe8, 0xcd, 0xfb, 0xe6, 0xcd, 0xef, 0xf7, 0x9b, 0xf7, 0xde, 0xbc, 0x37,
0x86, 0xb7, 0x5d, 0x26, 0x9a, 0x4c, 0xcc, 0x7b, 0x54, 0x48, 0x4e, 0xeb, 0x2d, 0x49, 0x59, 0xd0,
0xf5, 0x51, 0x09, 0x39, 0x93, 0xcc, 0x1a, 0xd7, 0x7e, 0x95, 0xce, 0xa5, 0x52, 0xa1, 0xc1, 0x1a,
0x4c, 0xad, 0xcf, 0x47, 0xbf, 0xb4, 0x6b, 0xc9, 0xb8, 0xce, 0x9b, 0x1d, 0xca, 0x88, 0xbe, 0xcc,
0xc2, 0xe2, 0x9a, 0x68, 0x6c, 0x12, 0xf9, 0x3e, 0x95, 0xbb, 0x1e, 0xc7, 0x07, 0x8b, 0x9e, 0xc7,
0x89, 0x10, 0xd6, 0x7d, 0x78, 0xcb, 0x23, 0x3e, 0x69, 0x60, 0xc9, 0x78, 0x0d, 0x6b, 0xe3, 0x14,
0x98, 0x01, 0xb3, 0x23, 0xd5, 0xb5, 0xd3, 0xb6, 0x3d, 0x75, 0x84, 0x9b, 0xfe, 0x02, 0x3a, 0xe3,
0x82, 0xfe, 0x6e, 0xdb, 0x73, 0x0d, 0x2a, 0x77, 0x5b, 0xf5, 0x8a, 0xcb, 0x9a, 0xf3, 0x5d, 0xa4,
0x73, 0xc2, 0xdb, 0x9b, 0x97, 0x47, 0x21, 0x11, 0x95, 0x45, 0xd7, 0x35, 0x4c, 0xce, 0xcd, 0x04,
0x24, 0xe6, 0x3e, 0x80, 0x37, 0x0f, 0x8c, 0x9c, 0x84, 0x3a, 0xab, 0xa8, 0xef, 0x9d, 0xb6, 0xed,
0x49, 0x4d, 0xdd, 0xeb, 0x71, 0x01, 0xe6, 0xb1, 0x83, 0xee, 0x43, 0xa3, 0x6f, 0xb2, 0xb0, 0xb4,
0x26, 0x1a, 0x71, 0x2c, 0x96, 0x63, 0x61, 0x0e, 0x39, 0xc0, 0xdc, 0x7b, 0xa1, 0x31, 0xb9, 0x0f,
0x6f, 0xed, 0x63, 0x9f, 0x7a, 0x5d, 0xdc, 0xd9, 0x5e, 0xee, 0x33, 0x2e, 0xe7, 0xe5, 0xde, 0xc6,
0x7e, 0xc2, 0x9d, 0x80, 0xc4, 0x61, 0xf9, 0x0e, 0xc0, 0x72, 0x47, 0x58, 0xb6, 0xe3, 0xf5, 0x25,
0xd6, 0x6c, 0x52, 0x21, 0x28, 0x0b, 0xfa, 0xcb, 0x03, 0xff, 0x8f, 0xbc, 0x9f, 0x01, 0x2c, 0xac,
0x89, 0xc6, 0x6a, 0x2b, 0xf0, 0x22, 0x45, 0xad, 0x80, 0xca, 0xa3, 0x0d, 0xc6, 0x7c, 0x6b, 0x1b,
0xe6, 0x71, 0x93, 0xb5, 0x02, 0x39, 0x05, 0x66, 0xae, 0xcc, 0x5e, 0x7f, 0x63, 0xa4, 0x62, 0x8a,
0x7f, 0x89, 0xd1, 0xa0, 0xfa, 0xfa, 0x93, 0xb6, 0x9d, 0x79, 0xfc, 0xcc, 0x9e, 0x3d, 0x07, 0x7f,
0xb4, 0x41, 0x38, 0x06, 0xcd, 0x5a, 0x87, 0xc3, 0x1e, 0x09, 0x99, 0xa0, 0x92, 0x71, 0x93, 0x83,
0x3b, 0x83, 0xe7, 0x38, 0xc5, 0x40, 0xbf, 0x5c, 0x81, 0xf9, 0x0d, 0xcc, 0x71, 0x53, 0x58, 0x7b,
0xf0, 0x86, 0x1b, 0x1f, 0xa2, 0x26, 0xf1, 0xa1, 0x0a, 0xe2, 0x70, 0x75, 0x35, 0x12, 0xfb, 0x5b,
0xdb, 0xbe, 0x7d, 0x0e, 0x8e, 0x65, 0xe2, 0x9e, 0xb6, 0xed, 0x82, 0x0e, 0x79, 0x17, 0x18, 0x72,
0x46, 0x92, 0xef, 0x2d, 0x7c, 0x68, 0x7d, 0x0c, 0x0b, 0x75, 0x2c, 0x48, 0x2d, 0xe4, 0x2c, 0x64,
0x82, 0xf0, 0x1a, 0x57, 0x85, 0xae, 0xce, 0x34, 0x5c, 0x5d, 0x1b, 0x98, 0x73, 0x5a, 0x73, 0xf6,
0xc3, 0x44, 0x8e, 0x15, 0x99, 0x37, 0x8c, 0xd5, 0xdc, 0xa8, 0x07, 0x00, 0x16, 0xeb, 0x2c, 0x68,
0x89, 0x33, 0x12, 0xae, 0x28, 0x09, 0xef, 0x0e, 0x2c, 0xe1, 0x65, 0x23, 0xa1, 0x1f, 0x28, 0x72,
0xc6, 0x95, 0xbd, 0x47, 0xc4, 0x16, 0x2c, 0x76, 0x35, 0x93, 0x1a, 0x09, 0x70, 0xdd, 0x27, 0xde,
0x54, 0x6e, 0x06, 0xcc, 0x0e, 0x55, 0x67, 0x52, 0xd4, 0xbe, 0x6e, 0xc8, 0x19, 0xef, 0xec, 0x23,
0x2b, 0xda, 0xba, 0x90, 0xfb, 0xf6, 0x91, 0x9d, 0x41, 0x0f, 0xb2, 0xb0, 0x94, 0xdc, 0x97, 0xb7,
0xa8, 0x90, 0x8c, 0x53, 0x17, 0xfb, 0x9a, 0x59, 0x58, 0xdf, 0x03, 0x38, 0xe9, 0xb6, 0x9a, 0x2d,
0x1f, 0x4b, 0xba, 0x4f, 0x8c, 0xcc, 0x1a, 0xc7, 0x92, 0x32, 0x53, 0xb3, 0x63, 0x71, 0xcd, 0x2e,
0x13, 0x57, 0x95, 0xed, 0x7b, 0x51, 0x48, 0x4e, 0xdb, 0x76, 0xd9, 0xe4, 0xb7, 0xff, 0x6e, 0xf4,
0xf8, 0x99, 0xfd, 0xda, 0xf9, 0x82, 0xa6, 0x6b, 0xbb, 0x98, 0x02, 0x69, 0x71, 0x4e, 0x04, 0x63,
0x2d, 0xc1, 0x31, 0x4e, 0x76, 0x08, 0x27, 0x81, 0x4b, 0x6a, 0xae, 0xba, 0x4b, 0x51, 0x71, 0xdc,
0xa8, 0x96, 0x4e, 0xdb, 0xf6, 0x84, 0x96, 0xd0, 0xe3, 0x80, 0x9c, 0xd1, 0xc4, 0xb2, 0xa4, 0x0c,
0x5f, 0x03, 0x38, 0x99, 0x36, 0x8d, 0x16, 0xe7, 0x24, 0x90, 0x71, 0x04, 0x3e, 0x82, 0xd7, 0xb4,
0x6e, 0xf1, 0xbc, 0x03, 0xdf, 0x35, 0xf7, 0x74, 0xa0, 0xe3, 0xc4, 0xa0, 0xd6, 0x04, 0xcc, 0x87,
0x84, 0x53, 0xa6, 0x8b, 0x3a, 0xe7, 0x98, 0x2f, 0xf4, 0x19, 0x80, 0xe5, 0x44, 0xd3, 0xa2, 0x6b,
0x4e, 0x4f, 0xbc, 0x8e, 0x9e, 0xe6, 0x41, 0xe8, 0x26, 0x5f, 0x97, 0xaa, 0xae, 0x03, 0x17, 0x7d,
0x05, 0xe0, 0x74, 0x22, 0x64, 0xbd, 0x25, 0x85, 0xc4, 0x81, 0x47, 0x83, 0x46, 0x1c, 0xa0, 0xf0,
0x3f, 0x03, 0xb4, 0x62, 0x2a, 0x62, 0x34, 0x4e, 0x87, 0xf2, 0x46, 0x17, 0x0d, 0x19, 0xfa, 0x09,
0xc0, 0xf1, 0x44, 0xd1, 0xa6, 0x8f, 0xc5, 0xee, 0xca, 0x3e, 0x09, 0xa4, 0xb5, 0x0a, 0xd3, 0xde,
0x5b, 0x33, 0x41, 0x8d, 0xba, 0x53, 0xae, 0x3a, 0x9d, 0x8e, 0xe5, 0x5e, 0x0f, 0xe4, 0x8c, 0x25,
0xa6, 0x0d, 0x65, 0xb1, 0xde, 0x81, 0x43, 0x3b, 0x1c, 0xbb, 0xd1, 0x5b, 0xc5, 0x74, 0x9a, 0xca,
0x60, 0xd7, 0xdc, 0x49, 0xf6, 0xa3, 0x1f, 0x00, 0x2c, 0xf4, 0xd1, 0x2a, 0xac, 0x4f, 0x01, 0x9c,
0x48, 0xb5, 0x88, 0x68, 0xa5, 0x46, 0xd4, 0x92, 0x09, 0xe3, 0x6c, 0xa5, 0xcf, 0xdb, 0xa9, 0xd2,
0x07, 0xab, 0xfa, 0xaa, 0x89, 0xef, 0x2b, 0xbd, 0x27, 0xec, 0x44, 0x45, 0x4e, 0x61, 0xbf, 0x8f,
0x0e, 0xd3, 0x06, 0x1e, 0x02, 0x78, 0x6d, 0x95, 0x10, 0x35, 0x95, 0x3e, 0x01, 0x70, 0x34, 0xed,
0xca, 0x21, 0x63, 0xfe, 0xf3, 0x12, 0x7b, 0xcf, 0x10, 0x17, 0x7b, 0x5b, 0x79, 0xb4, 0x69, 0xe0,
0xfc, 0xa6, 0x73, 0x25, 0x92, 0x81, 0x3e, 0xcf, 0xc2, 0x52, 0xd7, 0xb8, 0xdc, 0x0c, 0x49, 0xe0,
0xe9, 0xd6, 0x88, 0x7d, 0xab, 0x00, 0xaf, 0x4a, 0x2a, 0x7d, 0xa2, 0xe7, 0x8f, 0xa3, 0x3f, 0xac,
0x19, 0x78, 0xdd, 0x23, 0xc2, 0xe5, 0x34, 0x4c, 0xb3, 0xe7, 0x74, 0x9a, 0xa2, 0xd9, 0xc8, 0x89,
0x4b, 0x43, 0x4a, 0x02, 0xa9, 0x9a, 0xf8, 0xc5, 0x66, 0x63, 0x82, 0xd1, 0x31, 0xc4, 0x73, 0x97,
0x39, 0xc4, 0x17, 0x86, 0xbe, 0x78, 0x64, 0x67, 0x54, 0x72, 0xfe, 0x02, 0xb0, 0x98, 0x3c, 0xf5,
0x36, 0x25, 0xe6, 0x92, 0x06, 0x8d, 0xb7, 0x83, 0x1d, 0xd5, 0xfd, 0x42, 0x4e, 0xf6, 0x29, 0x8b,
0x66, 0x49, 0x67, 0xc1, 0x77, 0x74, 0xbf, 0x1e, 0x07, 0xe4, 0x8c, 0xc6, 0x16, 0x53, 0xee, 0x5b,
0xf0, 0xaa, 0x90, 0x78, 0x8f, 0x98, 0x5a, 0x7f, 0x73, 0xe0, 0x91, 0x36, 0xa2, 0x89, 0x14, 0x08,
0x72, 0x34, 0x98, 0xb5, 0x02, 0xf3, 0xbb, 0x84, 0x36, 0x76, 0x75, 0x90, 0x73, 0xd5, 0xb9, 0x3f,
0xda, 0xf6, 0x98, 0xcb, 0x49, 0xd4, 0xb5, 0x83, 0x9a, 0x5e, 0x4a, 0x45, 0xf6, 0x2c, 0x20, 0xc7,
0x6c, 0x46, 0x7f, 0x02, 0xf8, 0x92, 0x39, 0x3b, 0x65, 0x41, 0x9f, 0x07, 0xef, 0x8b, 0x7a, 0xd5,
0x59, 0x1f, 0xc2, 0x7c, 0xf2, 0x1a, 0xb9, 0xbc, 0xce, 0x6b, 0x30, 0xab, 0xeb, 0x3f, 0x1e, 0x97,
0xc1, 0x93, 0xe3, 0x32, 0x78, 0x7a, 0x5c, 0x06, 0xbf, 0x1f, 0x97, 0xc1, 0xc3, 0x93, 0x72, 0xe6,
0xe9, 0x49, 0x39, 0xf3, 0xeb, 0x49, 0x39, 0xf3, 0xc1, 0x9d, 0x7f, 0x85, 0x3c, 0xec, 0xfe, 0x5b,
0xa6, 0x18, 0xea, 0x79, 0xf5, 0x87, 0xea, 0xee, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xca,
0xc4, 0x1b, 0xba, 0x0d, 0x00, 0x00,
}
func (this *MsgSetWithdrawAddress) Equal(that interface{}) bool {
@@ -1239,6 +1296,38 @@ func (this *DelegatorStartingInfo) Equal(that interface{}) bool {
}
return true
}
func (this *DelegationDelegatorReward) Equal(that interface{}) bool {
if that == nil {
return this == nil
}
that1, ok := that.(*DelegationDelegatorReward)
if !ok {
that2, ok := that.(DelegationDelegatorReward)
if ok {
that1 = &that2
} else {
return false
}
}
if that1 == nil {
return this == nil
} else if this == nil {
return false
}
if !bytes.Equal(this.ValidatorAddress, that1.ValidatorAddress) {
return false
}
if len(this.Reward) != len(that1.Reward) {
return false
}
for i := range this.Reward {
if !this.Reward[i].Equal(&that1.Reward[i]) {
return false
}
}
return true
}
func (m *MsgSetWithdrawAddress) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -1821,6 +1910,50 @@ func (m *DelegatorStartingInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *DelegationDelegatorReward) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *DelegationDelegatorReward) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *DelegationDelegatorReward) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if len(m.Reward) > 0 {
for iNdEx := len(m.Reward) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Reward[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintDistribution(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
}
if len(m.ValidatorAddress) > 0 {
i -= len(m.ValidatorAddress)
copy(dAtA[i:], m.ValidatorAddress)
i = encodeVarintDistribution(dAtA, i, uint64(len(m.ValidatorAddress)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func encodeVarintDistribution(dAtA []byte, offset int, v uint64) int {
offset -= sovDistribution(v)
base := offset
@@ -2070,6 +2203,25 @@ func (m *DelegatorStartingInfo) Size() (n int) {
return n
}
func (m *DelegationDelegatorReward) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.ValidatorAddress)
if l > 0 {
n += 1 + l + sovDistribution(uint64(l))
}
if len(m.Reward) > 0 {
for _, e := range m.Reward {
l = e.Size()
n += 1 + l + sovDistribution(uint64(l))
}
}
return n
}
func sovDistribution(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
@@ -3677,6 +3829,127 @@ func (m *DelegatorStartingInfo) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *DelegationDelegatorReward) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowDistribution
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: DelegationDelegatorReward: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: DelegationDelegatorReward: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowDistribution
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthDistribution
}
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthDistribution
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ValidatorAddress = append(m.ValidatorAddress[:0], dAtA[iNdEx:postIndex]...)
if m.ValidatorAddress == nil {
m.ValidatorAddress = []byte{}
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Reward", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowDistribution
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthDistribution
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthDistribution
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Reward = append(m.Reward, types.DecCoin{})
if err := m.Reward[len(m.Reward)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipDistribution(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthDistribution
}
if (iNdEx + skippy) < 0 {
return ErrInvalidLengthDistribution
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipDistribution(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
+3 -1
View File
@@ -1,6 +1,8 @@
package types
import sdk "github.com/cosmos/cosmos-sdk/types"
import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
// querier keys
const (
-7
View File
@@ -32,13 +32,6 @@ func (res QueryDelegatorTotalRewardsResponse) String() string {
return strings.TrimSpace(out)
}
// DelegationDelegatorReward defines the properties
// of a delegator's delegation reward.
type DelegationDelegatorReward struct {
ValidatorAddress sdk.ValAddress `json:"validator_address" yaml:"validator_address"`
Reward sdk.DecCoins `json:"reward" yaml:"reward"`
}
// NewDelegationDelegatorReward constructs a DelegationDelegatorReward.
func NewDelegationDelegatorReward(valAddr sdk.ValAddress,
reward sdk.DecCoins) DelegationDelegatorReward {
File diff suppressed because it is too large Load Diff