mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 06:48:03 +00:00 
			
		
		
		
	add x/mint QueryServer for backwards compatibility (#1420)
This commit is contained in:
		
							parent
							
								
									016eecfcc0
								
							
						
					
					
						commit
						0ad5a5932d
					
				@ -3,7 +3,12 @@ package keeper
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	"google.golang.org/grpc/status"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -24,3 +29,57 @@ func (k Keeper) Inflation(c context.Context, _ *types.QueryInflationRequest) (*t
 | 
			
		||||
 | 
			
		||||
	return &types.QueryInflationResponse{Inflation: inflation}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MintQueryServer implements cosmos sdk's x/mint querier.
 | 
			
		||||
// x/mint was removed from kava, but the standard inflation endpoint is still registered
 | 
			
		||||
// for easier third party integration and backwards compatibility.
 | 
			
		||||
type MintQueryServer struct {
 | 
			
		||||
	keeper Keeper
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMintQueryServer returns a service that implements x/mint's QueryServer
 | 
			
		||||
func NewMintQueryServer(kavamintKeeper Keeper) MintQueryServer {
 | 
			
		||||
	return MintQueryServer{kavamintKeeper}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ minttypes.QueryServer = MintQueryServer{}
 | 
			
		||||
 | 
			
		||||
// Params is not implemented. There is no mint module.
 | 
			
		||||
func (MintQueryServer) Params(
 | 
			
		||||
	_ context.Context, _ *minttypes.QueryParamsRequest,
 | 
			
		||||
) (*minttypes.QueryParamsResponse, error) {
 | 
			
		||||
	return nil, status.Error(codes.Unimplemented, "x/mint has been replaced by x/kavamint")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Inflation returns an adjusted inflation rate.
 | 
			
		||||
// The `/cosmos/mint/v1beta1/inflation` endpoint is used by third parties to calculate staking APY.
 | 
			
		||||
// The usual staking APY calculation takes the inflation and determines the portion of it devoted
 | 
			
		||||
// to staking rewards after adjusting for the bonded ratio and x/distribution community_tax.
 | 
			
		||||
// staking_apy = (inflation - community_tax) * total_supply / total_bonded
 | 
			
		||||
// Staking APY is not set directly via the x/kavamint staking_rewards_apy param.
 | 
			
		||||
// This endpoint returns the inflation that makes the above calculation equal to the param:
 | 
			
		||||
// inflation = staking_apy * total_bonded / total_supply
 | 
			
		||||
// NOTE: assumes x/distribution community_tax = 0
 | 
			
		||||
func (mq MintQueryServer) Inflation(
 | 
			
		||||
	c context.Context, _ *minttypes.QueryInflationRequest,
 | 
			
		||||
) (*minttypes.QueryInflationResponse, error) {
 | 
			
		||||
	ctx := sdk.UnwrapSDKContext(c)
 | 
			
		||||
 | 
			
		||||
	stakingApy := mq.keeper.GetParams(ctx).StakingRewardsApy
 | 
			
		||||
	totalBonded := mq.keeper.TotalBondedTokens(ctx)
 | 
			
		||||
	totalSupply := mq.keeper.TotalSupply(ctx)
 | 
			
		||||
 | 
			
		||||
	// inflation = staking_apy * total_bonded / total_supply
 | 
			
		||||
	inflation := stakingApy.MulInt(totalBonded).QuoInt(totalSupply)
 | 
			
		||||
 | 
			
		||||
	return &minttypes.QueryInflationResponse{
 | 
			
		||||
		Inflation: inflation,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AnnualProvisions is not implemented.
 | 
			
		||||
func (MintQueryServer) AnnualProvisions(
 | 
			
		||||
	_ context.Context, _ *minttypes.QueryAnnualProvisionsRequest,
 | 
			
		||||
) (*minttypes.QueryAnnualProvisionsResponse, error) {
 | 
			
		||||
	return nil, status.Error(codes.Unimplemented, "x/mint has been replaced by x/kavamint")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,11 +5,15 @@ import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	"google.golang.org/grpc/status"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/baseapp"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/staking"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/keeper"
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/testutil"
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/types"
 | 
			
		||||
)
 | 
			
		||||
@ -18,6 +22,7 @@ type grpcQueryTestSuite struct {
 | 
			
		||||
	testutil.KavamintTestSuite
 | 
			
		||||
 | 
			
		||||
	queryClient     types.QueryClient
 | 
			
		||||
	mintQueryClient minttypes.QueryClient
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *grpcQueryTestSuite) SetupTest() {
 | 
			
		||||
@ -26,6 +31,10 @@ func (suite *grpcQueryTestSuite) SetupTest() {
 | 
			
		||||
	queryHelper := baseapp.NewQueryServerTestHelper(suite.Ctx, suite.App.InterfaceRegistry())
 | 
			
		||||
	types.RegisterQueryServer(queryHelper, suite.Keeper)
 | 
			
		||||
	suite.queryClient = types.NewQueryClient(queryHelper)
 | 
			
		||||
 | 
			
		||||
	mintQueryServer := keeper.NewMintQueryServer(suite.Keeper)
 | 
			
		||||
	minttypes.RegisterQueryServer(queryHelper, mintQueryServer)
 | 
			
		||||
	suite.mintQueryClient = minttypes.NewQueryClient(queryHelper)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGRPCQueryTestSuite(t *testing.T) {
 | 
			
		||||
@ -116,6 +125,35 @@ func (suite *grpcQueryTestSuite) TestGRPCInflationQuery() {
 | 
			
		||||
			suite.Require().NoError(err)
 | 
			
		||||
			suite.Require().Equal(inflation.Inflation, kavamintKeeper.CumulativeInflation(ctx))
 | 
			
		||||
			suite.Require().Equal(inflation.Inflation, tc.expectedInflation)
 | 
			
		||||
 | 
			
		||||
			// ensure overridden x/mint query for inflation returns the adjusted inflation
 | 
			
		||||
			// the adjusted inflation is the inflation that returns the correct staking apy for the
 | 
			
		||||
			// standard staking apy calculation used by third parties:
 | 
			
		||||
			// staking_apy = (inflation - community_tax) * total_supply / total_bonded
 | 
			
		||||
			// => inflation = staking_apy * total_bonded / total_supply
 | 
			
		||||
			expectedAdjustedInflation := tc.stakingApy.Mul(tc.bondedRatio)
 | 
			
		||||
			mintQ, err := suite.mintQueryClient.Inflation(
 | 
			
		||||
				context.Background(),
 | 
			
		||||
				&minttypes.QueryInflationRequest{},
 | 
			
		||||
			)
 | 
			
		||||
			suite.NoError(err)
 | 
			
		||||
			suite.Equal(expectedAdjustedInflation, mintQ.Inflation)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *grpcQueryTestSuite) TestUnimplementedMintQueries() {
 | 
			
		||||
	suite.SetupTest()
 | 
			
		||||
 | 
			
		||||
	suite.Run("Params is unimplemented", func() {
 | 
			
		||||
		_, err := suite.mintQueryClient.Params(context.Background(), nil)
 | 
			
		||||
		suite.Error(err)
 | 
			
		||||
		suite.Equal(codes.Unimplemented, status.Code(err))
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	suite.Run("AnnualProvisions is unimplemented", func() {
 | 
			
		||||
		_, err := suite.mintQueryClient.AnnualProvisions(context.Background(), nil)
 | 
			
		||||
		suite.Error(err)
 | 
			
		||||
		suite.Equal(codes.Unimplemented, status.Code(err))
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,8 @@ import (
 | 
			
		||||
	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/types/module"
 | 
			
		||||
	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/client/cli"
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/keeper"
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavamint/types"
 | 
			
		||||
@ -66,6 +68,8 @@ func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Rout
 | 
			
		||||
func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
 | 
			
		||||
	types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))
 | 
			
		||||
 | 
			
		||||
	// add x/mint query handler for better 3rd party compatibility
 | 
			
		||||
	minttypes.RegisterQueryHandlerClient(context.Background(), mux, minttypes.NewQueryClient(clientCtx))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetTxCmd returns no root tx command for the kavamint module.
 | 
			
		||||
@ -118,6 +122,11 @@ func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sd
 | 
			
		||||
// module-specific gRPC queries.
 | 
			
		||||
func (am AppModule) RegisterServices(cfg module.Configurator) {
 | 
			
		||||
	types.RegisterQueryServer(cfg.QueryServer(), am.keeper)
 | 
			
		||||
 | 
			
		||||
	// register x/mint query server.
 | 
			
		||||
	// x/mint was replaced by this module but we still want 3rd parties to be able to
 | 
			
		||||
	// request the original sdk endpoints.
 | 
			
		||||
	minttypes.RegisterQueryServer(cfg.QueryServer(), keeper.NewMintQueryServer(am.keeper))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// InitGenesis performs genesis initialization for the kavamint module. It returns
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user