github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/ibc-go/modules/apps/29-fee/keeper/grpc_query.go (about)

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/prefix"
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/query"
    10  	"github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee/types"
    11  
    12  	"google.golang.org/grpc/codes"
    13  	"google.golang.org/grpc/status"
    14  )
    15  
    16  var _ types.QueryServer = Keeper{}
    17  
    18  // IncentivizedPackets implements the Query/IncentivizedPackets gRPC method
    19  func (k Keeper) IncentivizedPackets(goCtx context.Context, req *types.QueryIncentivizedPacketsRequest) (*types.QueryIncentivizedPacketsResponse, error) {
    20  	if req == nil {
    21  		return nil, status.Error(codes.InvalidArgument, "empty request")
    22  	}
    23  
    24  	ctx := sdk.UnwrapSDKContext(goCtx).WithBlockHeight(int64(req.QueryHeight))
    25  
    26  	var identifiedPackets []types.IdentifiedPacketFees
    27  	store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.FeesInEscrowPrefix))
    28  	_, err := query.Paginate(store, req.Pagination, func(key, value []byte) error {
    29  		packetID, err := types.ParseKeyFeesInEscrow(types.FeesInEscrowPrefix + string(key))
    30  		if err != nil {
    31  			return err
    32  		}
    33  
    34  		packetFees := k.MustUnmarshalFees(value)
    35  		identifiedPackets = append(identifiedPackets, types.NewIdentifiedPacketFees(packetID, packetFees.PacketFees))
    36  		return nil
    37  	})
    38  	if err != nil {
    39  		return nil, status.Error(codes.NotFound, err.Error())
    40  	}
    41  
    42  	return &types.QueryIncentivizedPacketsResponse{
    43  		IncentivizedPackets: identifiedPackets,
    44  	}, nil
    45  }
    46  
    47  // IncentivizedPacket implements the Query/IncentivizedPacket gRPC method
    48  func (k Keeper) IncentivizedPacket(goCtx context.Context, req *types.QueryIncentivizedPacketRequest) (*types.QueryIncentivizedPacketResponse, error) {
    49  	if req == nil {
    50  		return nil, status.Error(codes.InvalidArgument, "empty request")
    51  	}
    52  
    53  	ctx := sdk.UnwrapSDKContext(goCtx).WithBlockHeight(int64(req.QueryHeight))
    54  
    55  	feesInEscrow, exists := k.GetFeesInEscrow(ctx, req.PacketId)
    56  	if !exists {
    57  		return nil, status.Error(
    58  			codes.NotFound,
    59  			sdkerrors.Wrapf(types.ErrFeeNotFound, "channel: %s, port: %s, sequence: %d", req.PacketId.ChannelId, req.PacketId.PortId, req.PacketId.Sequence).Error())
    60  	}
    61  
    62  	return &types.QueryIncentivizedPacketResponse{
    63  		IncentivizedPacket: types.NewIdentifiedPacketFees(req.PacketId, feesInEscrow.PacketFees),
    64  	}, nil
    65  }
    66  
    67  // IncentivizedPacketsForChannel implements the Query/IncentivizedPacketsForChannel gRPC method
    68  func (k Keeper) IncentivizedPacketsForChannel(goCtx context.Context, req *types.QueryIncentivizedPacketsForChannelRequest) (*types.QueryIncentivizedPacketsForChannelResponse, error) {
    69  	if req == nil {
    70  		return nil, status.Error(codes.InvalidArgument, "empty request")
    71  	}
    72  
    73  	ctx := sdk.UnwrapSDKContext(goCtx).WithBlockHeight(int64(req.QueryHeight))
    74  
    75  	var packets []*types.IdentifiedPacketFees
    76  	keyPrefix := types.KeyFeesInEscrowChannelPrefix(req.PortId, req.ChannelId)
    77  	store := prefix.NewStore(ctx.KVStore(k.storeKey), keyPrefix)
    78  	_, err := query.Paginate(store, req.Pagination, func(key, value []byte) error {
    79  		packetID, err := types.ParseKeyFeesInEscrow(string(keyPrefix) + string(key))
    80  		if err != nil {
    81  			return err
    82  		}
    83  
    84  		packetFees := k.MustUnmarshalFees(value)
    85  
    86  		identifiedPacketFees := types.NewIdentifiedPacketFees(packetID, packetFees.PacketFees)
    87  		packets = append(packets, &identifiedPacketFees)
    88  
    89  		return nil
    90  	})
    91  	if err != nil {
    92  		return nil, status.Error(codes.NotFound, err.Error())
    93  	}
    94  
    95  	return &types.QueryIncentivizedPacketsForChannelResponse{
    96  		IncentivizedPackets: packets,
    97  	}, nil
    98  }
    99  
   100  // TotalRecvFees implements the Query/TotalRecvFees gRPC method
   101  func (k Keeper) TotalRecvFees(goCtx context.Context, req *types.QueryTotalRecvFeesRequest) (*types.QueryTotalRecvFeesResponse, error) {
   102  	ctx := sdk.UnwrapSDKContext(goCtx)
   103  
   104  	feesInEscrow, found := k.GetFeesInEscrow(ctx, req.PacketId)
   105  	if !found {
   106  		return nil, status.Errorf(
   107  			codes.NotFound,
   108  			sdkerrors.Wrapf(types.ErrFeeNotFound, "channel: %s, port: %s, sequence: %d", req.PacketId.ChannelId, req.PacketId.PortId, req.PacketId.Sequence).Error(),
   109  		)
   110  	}
   111  
   112  	var recvFees sdk.CoinAdapters
   113  	for _, packetFee := range feesInEscrow.PacketFees {
   114  		recvFees = recvFees.Add(packetFee.Fee.RecvFee...)
   115  	}
   116  
   117  	return &types.QueryTotalRecvFeesResponse{
   118  		RecvFees: recvFees,
   119  	}, nil
   120  }
   121  
   122  // TotalAckFees implements the Query/TotalAckFees gRPC method
   123  func (k Keeper) TotalAckFees(goCtx context.Context, req *types.QueryTotalAckFeesRequest) (*types.QueryTotalAckFeesResponse, error) {
   124  	if req == nil {
   125  		return nil, status.Error(codes.InvalidArgument, "empty request")
   126  	}
   127  
   128  	ctx := sdk.UnwrapSDKContext(goCtx)
   129  
   130  	feesInEscrow, found := k.GetFeesInEscrow(ctx, req.PacketId)
   131  	if !found {
   132  		return nil, status.Errorf(
   133  			codes.NotFound,
   134  			sdkerrors.Wrapf(types.ErrFeeNotFound, "channel: %s, port: %s, sequence: %d", req.PacketId.ChannelId, req.PacketId.PortId, req.PacketId.Sequence).Error(),
   135  		)
   136  	}
   137  
   138  	var ackFees sdk.CoinAdapters
   139  	for _, packetFee := range feesInEscrow.PacketFees {
   140  		ackFees = ackFees.Add(packetFee.Fee.AckFee...)
   141  	}
   142  
   143  	return &types.QueryTotalAckFeesResponse{
   144  		AckFees: ackFees,
   145  	}, nil
   146  }
   147  
   148  // TotalTimeoutFees implements the Query/TotalTimeoutFees gRPC method
   149  func (k Keeper) TotalTimeoutFees(goCtx context.Context, req *types.QueryTotalTimeoutFeesRequest) (*types.QueryTotalTimeoutFeesResponse, error) {
   150  	if req == nil {
   151  		return nil, status.Error(codes.InvalidArgument, "empty request")
   152  	}
   153  
   154  	ctx := sdk.UnwrapSDKContext(goCtx)
   155  
   156  	feesInEscrow, found := k.GetFeesInEscrow(ctx, req.PacketId)
   157  	if !found {
   158  		return nil, status.Errorf(
   159  			codes.NotFound,
   160  			sdkerrors.Wrapf(types.ErrFeeNotFound, "channel: %s, port: %s, sequence: %d", req.PacketId.ChannelId, req.PacketId.PortId, req.PacketId.Sequence).Error(),
   161  		)
   162  	}
   163  
   164  	var timeoutFees sdk.CoinAdapters
   165  	for _, packetFee := range feesInEscrow.PacketFees {
   166  		timeoutFees = timeoutFees.Add(packetFee.Fee.TimeoutFee...)
   167  	}
   168  
   169  	return &types.QueryTotalTimeoutFeesResponse{
   170  		TimeoutFees: timeoutFees,
   171  	}, nil
   172  }
   173  
   174  // Payee implements the Query/Payee gRPC method and returns the registered payee address to which packet fees are paid out
   175  func (k Keeper) Payee(goCtx context.Context, req *types.QueryPayeeRequest) (*types.QueryPayeeResponse, error) {
   176  	if req == nil {
   177  		return nil, status.Error(codes.InvalidArgument, "empty request")
   178  	}
   179  
   180  	ctx := sdk.UnwrapSDKContext(goCtx)
   181  
   182  	payeeAddr, found := k.GetPayeeAddress(ctx, req.Relayer, req.ChannelId)
   183  	if !found {
   184  		return nil, status.Errorf(codes.NotFound, "payee address not found for address: %s on channel: %s", req.Relayer, req.ChannelId)
   185  	}
   186  
   187  	return &types.QueryPayeeResponse{
   188  		PayeeAddress: payeeAddr,
   189  	}, nil
   190  }
   191  
   192  // CounterpartyPayee implements the Query/CounterpartyPayee gRPC method and returns the registered counterparty payee address for forward relaying
   193  func (k Keeper) CounterpartyPayee(goCtx context.Context, req *types.QueryCounterpartyPayeeRequest) (*types.QueryCounterpartyPayeeResponse, error) {
   194  	if req == nil {
   195  		return nil, status.Error(codes.InvalidArgument, "empty request")
   196  	}
   197  
   198  	ctx := sdk.UnwrapSDKContext(goCtx)
   199  
   200  	counterpartyPayeeAddr, found := k.GetCounterpartyPayeeAddress(ctx, req.Relayer, req.ChannelId)
   201  	if !found {
   202  		return nil, status.Errorf(codes.NotFound, "counterparty payee address not found for address: %s on channel: %s", req.Relayer, req.ChannelId)
   203  	}
   204  
   205  	return &types.QueryCounterpartyPayeeResponse{
   206  		CounterpartyPayee: counterpartyPayeeAddr,
   207  	}, nil
   208  }
   209  
   210  // FeeEnabledChannels implements the Query/FeeEnabledChannels gRPC method and returns a list of fee enabled channels
   211  func (k Keeper) FeeEnabledChannels(goCtx context.Context, req *types.QueryFeeEnabledChannelsRequest) (*types.QueryFeeEnabledChannelsResponse, error) {
   212  	if req == nil {
   213  		return nil, status.Error(codes.InvalidArgument, "empty request")
   214  	}
   215  
   216  	ctx := sdk.UnwrapSDKContext(goCtx).WithBlockHeight(int64(req.QueryHeight))
   217  
   218  	var feeEnabledChannels []types.FeeEnabledChannel
   219  	store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.FeeEnabledKeyPrefix))
   220  	_, err := query.Paginate(store, req.Pagination, func(key, value []byte) error {
   221  		portID, channelID, err := types.ParseKeyFeeEnabled(types.FeeEnabledKeyPrefix + string(key))
   222  		if err != nil {
   223  			return err
   224  		}
   225  
   226  		feeEnabledChannel := types.FeeEnabledChannel{
   227  			PortId:    portID,
   228  			ChannelId: channelID,
   229  		}
   230  
   231  		feeEnabledChannels = append(feeEnabledChannels, feeEnabledChannel)
   232  
   233  		return nil
   234  	})
   235  	if err != nil {
   236  		return nil, status.Error(codes.NotFound, err.Error())
   237  	}
   238  
   239  	return &types.QueryFeeEnabledChannelsResponse{
   240  		FeeEnabledChannels: feeEnabledChannels,
   241  	}, nil
   242  }
   243  
   244  // FeeEnabledChannel implements the Query/FeeEnabledChannel gRPC method and returns true if the provided
   245  // port and channel identifiers belong to a fee enabled channel
   246  func (k Keeper) FeeEnabledChannel(goCtx context.Context, req *types.QueryFeeEnabledChannelRequest) (*types.QueryFeeEnabledChannelResponse, error) {
   247  	if req == nil {
   248  		return nil, status.Error(codes.InvalidArgument, "empty request")
   249  	}
   250  
   251  	ctx := sdk.UnwrapSDKContext(goCtx)
   252  
   253  	isFeeEnabled := k.IsFeeEnabled(ctx, req.PortId, req.ChannelId)
   254  
   255  	return &types.QueryFeeEnabledChannelResponse{
   256  		FeeEnabled: isFeeEnabled,
   257  	}, nil
   258  }