mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-10-31 23:17:27 +00:00 
			
		
		
		
	 d500cd1236
			
		
	
	
		d500cd1236
		
			
		
	
	
	
	
		
			
			* add QueryDeployedCosmosCoinContracts proto * also implement protobuf marshaler for InternalEVMAddress * setup iteration & collection for deployed addrs * rewrite grpc query tests * support querying for all deployed contracts * support querying by cosmos denom * fix & test pagination * remove unused iteration methods * add CLI query command * update changelog * update spec * add InternalEVMAddress.MarshalJSON test
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package keeper
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	"google.golang.org/grpc/codes"
 | |
| 	"google.golang.org/grpc/status"
 | |
| 
 | |
| 	"github.com/cosmos/cosmos-sdk/store/prefix"
 | |
| 	sdk "github.com/cosmos/cosmos-sdk/types"
 | |
| 	"github.com/cosmos/cosmos-sdk/types/query"
 | |
| 
 | |
| 	"github.com/kava-labs/kava/x/evmutil/types"
 | |
| )
 | |
| 
 | |
| type queryServer struct {
 | |
| 	keeper Keeper
 | |
| }
 | |
| 
 | |
| // NewQueryServerImpl creates a new server for handling gRPC queries.
 | |
| func NewQueryServerImpl(k Keeper) types.QueryServer {
 | |
| 	return &queryServer{keeper: k}
 | |
| }
 | |
| 
 | |
| var _ types.QueryServer = queryServer{}
 | |
| 
 | |
| // Params queries module params
 | |
| func (s queryServer) Params(stdCtx context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) {
 | |
| 	if req == nil {
 | |
| 		return nil, status.Errorf(codes.InvalidArgument, "empty request")
 | |
| 	}
 | |
| 
 | |
| 	ctx := sdk.UnwrapSDKContext(stdCtx)
 | |
| 	params := s.keeper.GetParams(ctx)
 | |
| 
 | |
| 	return &types.QueryParamsResponse{Params: params}, nil
 | |
| }
 | |
| 
 | |
| // DeployedCosmosCoinContracts gets contract addresses for deployed erc20 contracts
 | |
| // representing cosmos-sdk coins
 | |
| func (s queryServer) DeployedCosmosCoinContracts(
 | |
| 	goCtx context.Context,
 | |
| 	req *types.QueryDeployedCosmosCoinContractsRequest,
 | |
| ) (res *types.QueryDeployedCosmosCoinContractsResponse, err error) {
 | |
| 	if req == nil {
 | |
| 		return nil, status.Errorf(codes.InvalidArgument, "empty request")
 | |
| 	}
 | |
| 
 | |
| 	ctx := sdk.UnwrapSDKContext(goCtx)
 | |
| 	if len(req.CosmosDenoms) > 0 {
 | |
| 		res, err = getDeployedCosmosCoinContractsByDenoms(&s.keeper, ctx, req.CosmosDenoms)
 | |
| 	} else {
 | |
| 		// requesting no sdk denoms is a request for all denoms
 | |
| 		res, err = getAllDeployedCosmosCoinContractsPage(&s.keeper, ctx, req.Pagination)
 | |
| 	}
 | |
| 
 | |
| 	return res, err
 | |
| }
 | |
| 
 | |
| // getAllDeployedCosmosCoinContractsPage gets a page of deployed contracts (no filtering)
 | |
| func getAllDeployedCosmosCoinContractsPage(
 | |
| 	k *Keeper, ctx sdk.Context, pagination *query.PageRequest,
 | |
| ) (*types.QueryDeployedCosmosCoinContractsResponse, error) {
 | |
| 	contracts := make([]types.DeployedCosmosCoinContract, 0)
 | |
| 	contractStore := prefix.NewStore(
 | |
| 		ctx.KVStore(k.storeKey),
 | |
| 		types.DeployedCosmosCoinContractKeyPrefix,
 | |
| 	)
 | |
| 
 | |
| 	pageRes, err := query.FilteredPaginate(contractStore, pagination,
 | |
| 		func(key []byte, value []byte, accumulate bool) (bool, error) {
 | |
| 			if !accumulate {
 | |
| 				return true, nil
 | |
| 			}
 | |
| 			address := types.BytesToInternalEVMAddress(value)
 | |
| 			contract := types.DeployedCosmosCoinContract{
 | |
| 				CosmosDenom: string(key),
 | |
| 				Address:     &address,
 | |
| 			}
 | |
| 			contracts = append(contracts, contract)
 | |
| 			return true, nil
 | |
| 		})
 | |
| 	if err != nil {
 | |
| 		return &types.QueryDeployedCosmosCoinContractsResponse{}, err
 | |
| 	}
 | |
| 
 | |
| 	return &types.QueryDeployedCosmosCoinContractsResponse{
 | |
| 		DeployedCosmosCoinContracts: contracts,
 | |
| 		Pagination:                  pageRes,
 | |
| 	}, nil
 | |
| }
 | |
| 
 | |
| func getDeployedCosmosCoinContractsByDenoms(
 | |
| 	k *Keeper, ctx sdk.Context, denoms []string,
 | |
| ) (*types.QueryDeployedCosmosCoinContractsResponse, error) {
 | |
| 	if len(denoms) > query.DefaultLimit {
 | |
| 		// forego dealing with pagination by rejecting reqs for >100 denoms
 | |
| 		return nil, status.Errorf(codes.InvalidArgument, "maximum of %d denoms allowed per request", query.DefaultLimit)
 | |
| 	}
 | |
| 
 | |
| 	contracts := make([]types.DeployedCosmosCoinContract, 0, len(denoms))
 | |
| 	for _, denom := range denoms {
 | |
| 		address, found := k.GetDeployedCosmosCoinContract(ctx, denom)
 | |
| 		if !found {
 | |
| 			continue
 | |
| 		}
 | |
| 		contracts = append(contracts, types.NewDeployedCosmosCoinContract(denom, address))
 | |
| 	}
 | |
| 
 | |
| 	return &types.QueryDeployedCosmosCoinContractsResponse{
 | |
| 		DeployedCosmosCoinContracts: contracts,
 | |
| 	}, nil
 | |
| }
 |