Some checks failed
CodeQL / Analyze (push) Waiting to run
golangci-lint / lint (push) Waiting to run
Tests / Code Coverage / build (amd64) (push) Waiting to run
Tests / Code Coverage / build (arm64) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[additional-args:-tags="test_e2e" name:e2e path:./e2e]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:08-wasm path:./modules/light-clients/08-wasm]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:ibc-go path:.]) (push) Waiting to run
Docker Build & Push Simapp (main) / docker-build (push) Has been cancelled
160 lines
4.5 KiB
Go
160 lines
4.5 KiB
Go
package keeper
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
|
|
errorsmod "cosmossdk.io/errors"
|
|
"cosmossdk.io/store/prefix"
|
|
|
|
"git.cw.tr/mukan-network/mukan-sdk/runtime"
|
|
sdk "git.cw.tr/mukan-network/mukan-sdk/types"
|
|
"git.cw.tr/mukan-network/mukan-sdk/types/query"
|
|
|
|
"git.cw.tr/mukan-network/mukan-ibc/internal/validate"
|
|
"git.cw.tr/mukan-network/mukan-ibc/modules/apps/transfer/types"
|
|
channeltypes "git.cw.tr/mukan-network/mukan-ibc/modules/core/04-channel/types"
|
|
)
|
|
|
|
var _ types.QueryServer = (*Keeper)(nil)
|
|
|
|
// Denom implements the Query/Denom gRPC method
|
|
func (k Keeper) Denom(goCtx context.Context, req *types.QueryDenomRequest) (*types.QueryDenomResponse, error) {
|
|
if req == nil {
|
|
return nil, status.Error(codes.InvalidArgument, "empty request")
|
|
}
|
|
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
|
|
hash, err := types.ParseHexHash(strings.TrimPrefix(req.Hash, "ibc/"))
|
|
if err != nil {
|
|
return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("invalid denom trace hash: %s, error: %s", hash.String(), err))
|
|
}
|
|
|
|
denom, found := k.GetDenom(ctx, hash)
|
|
if !found {
|
|
return nil, status.Error(
|
|
codes.NotFound,
|
|
errorsmod.Wrap(types.ErrDenomNotFound, req.Hash).Error(),
|
|
)
|
|
}
|
|
|
|
return &types.QueryDenomResponse{
|
|
Denom: &denom,
|
|
}, nil
|
|
}
|
|
|
|
// Denoms implements the Query/Denoms gRPC method
|
|
func (k Keeper) Denoms(ctx context.Context, req *types.QueryDenomsRequest) (*types.QueryDenomsResponse, error) {
|
|
if req == nil {
|
|
return nil, status.Error(codes.InvalidArgument, "empty request")
|
|
}
|
|
|
|
var denoms types.Denoms
|
|
store := prefix.NewStore(runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)), types.DenomKey)
|
|
|
|
pageRes, err := query.Paginate(store, req.Pagination, func(_, value []byte) error {
|
|
var denom types.Denom
|
|
if err := k.cdc.Unmarshal(value, &denom); err != nil {
|
|
return err
|
|
}
|
|
|
|
denoms = append(denoms, denom)
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &types.QueryDenomsResponse{
|
|
Denoms: denoms.Sort(),
|
|
Pagination: pageRes,
|
|
}, nil
|
|
}
|
|
|
|
// Params implements the Query/Params gRPC method
|
|
func (k Keeper) Params(goCtx context.Context, _ *types.QueryParamsRequest) (*types.QueryParamsResponse, error) {
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
params := k.GetParams(ctx)
|
|
|
|
return &types.QueryParamsResponse{
|
|
Params: ¶ms,
|
|
}, nil
|
|
}
|
|
|
|
// DenomHash implements the Query/DenomHash gRPC method
|
|
func (k Keeper) DenomHash(goCtx context.Context, req *types.QueryDenomHashRequest) (*types.QueryDenomHashResponse, error) {
|
|
if req == nil {
|
|
return nil, status.Error(codes.InvalidArgument, "empty request")
|
|
}
|
|
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
|
|
// Convert given request trace path to Denom struct to confirm the path in a valid denom trace format
|
|
denom := types.ExtractDenomFromPath(req.Trace)
|
|
if err := denom.Validate(); err != nil {
|
|
return nil, status.Error(codes.InvalidArgument, err.Error())
|
|
}
|
|
|
|
denomHash := denom.Hash()
|
|
found := k.HasDenom(ctx, denomHash)
|
|
if !found {
|
|
return nil, status.Error(
|
|
codes.NotFound,
|
|
errorsmod.Wrap(types.ErrDenomNotFound, req.Trace).Error(),
|
|
)
|
|
}
|
|
|
|
return &types.QueryDenomHashResponse{
|
|
Hash: denomHash.String(),
|
|
}, nil
|
|
}
|
|
|
|
// EscrowAddress implements the EscrowAddress gRPC method
|
|
func (k Keeper) EscrowAddress(goCtx context.Context, req *types.QueryEscrowAddressRequest) (*types.QueryEscrowAddressResponse, error) {
|
|
if req == nil {
|
|
return nil, status.Error(codes.InvalidArgument, "empty request")
|
|
}
|
|
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
|
|
addr := types.GetEscrowAddress(req.PortId, req.ChannelId)
|
|
|
|
if err := validate.GRPCRequest(req.PortId, req.ChannelId); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if !k.channelKeeper.HasChannel(ctx, req.PortId, req.ChannelId) {
|
|
return nil, status.Error(
|
|
codes.NotFound,
|
|
errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "port ID (%s) channel ID (%s)", req.PortId, req.ChannelId).Error(),
|
|
)
|
|
}
|
|
|
|
return &types.QueryEscrowAddressResponse{
|
|
EscrowAddress: addr.String(),
|
|
}, nil
|
|
}
|
|
|
|
// TotalEscrowForDenom implements the TotalEscrowForDenom gRPC method.
|
|
func (k Keeper) TotalEscrowForDenom(goCtx context.Context, req *types.QueryTotalEscrowForDenomRequest) (*types.QueryTotalEscrowForDenomResponse, error) {
|
|
if req == nil {
|
|
return nil, status.Error(codes.InvalidArgument, "empty request")
|
|
}
|
|
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
|
|
if err := sdk.ValidateDenom(req.Denom); err != nil {
|
|
return nil, status.Error(codes.InvalidArgument, err.Error())
|
|
}
|
|
|
|
amount := k.GetTotalEscrowForDenom(ctx, req.Denom)
|
|
|
|
return &types.QueryTotalEscrowForDenomResponse{
|
|
Amount: amount,
|
|
}, nil
|
|
}
|