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 }