mukan-ibc/e2e/testsuite/query/queries.go
Mukan Erkin Törük 88dd97a9f8
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
refactor: replace all github.com upstream refs with git.cw.tr/mukan-network
2026-05-11 03:36:22 +03:00

165 lines
5.8 KiB
Go

package query
import (
"context"
"errors"
"sort"
"github.com/cosmos/interchaintest/v10/ibc"
"cosmossdk.io/math"
"git.cw.tr/mukan-network/mukan-sdk/client/grpc/cmtservice"
sdk "git.cw.tr/mukan-network/mukan-sdk/types"
authtypes "git.cw.tr/mukan-network/mukan-sdk/x/auth/types"
banktypes "git.cw.tr/mukan-network/mukan-sdk/x/bank/types"
controllertypes "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/controller/types"
transfertypes "git.cw.tr/mukan-network/mukan-ibc/modules/apps/transfer/types"
clienttypes "git.cw.tr/mukan-network/mukan-ibc/modules/core/02-client/types"
channeltypes "git.cw.tr/mukan-network/mukan-ibc/modules/core/04-channel/types"
ibcexported "git.cw.tr/mukan-network/mukan-ibc/modules/core/exported"
)
const queryPathTransferDenoms = "/ibc.applications.transfer.v1.Query/Denoms"
// ModuleAccountAddress returns the address of the given module on the given chain.
// Added because interchaintest's method doesn't work.
func ModuleAccountAddress(ctx context.Context, moduleName string, chain ibc.Chain) (sdk.AccAddress, error) {
modAccResp, err := GRPCQuery[authtypes.QueryModuleAccountByNameResponse](
ctx, chain, &authtypes.QueryModuleAccountByNameRequest{Name: moduleName},
)
if err != nil {
return nil, err
}
cfg := chain.Config().EncodingConfig
var account sdk.AccountI
err = cfg.InterfaceRegistry.UnpackAny(modAccResp.Account, &account)
if err != nil {
return nil, err
}
govAccount, ok := account.(sdk.ModuleAccountI)
if !ok {
return nil, errors.New("account is not a module account")
}
if govAccount.GetAddress().String() == "" {
return nil, errors.New("module account address is empty")
}
return govAccount.GetAddress(), nil
}
// ClientState queries the client state on the given chain for the provided clientID.
func ClientState(ctx context.Context, chain ibc.Chain, clientID string) (ibcexported.ClientState, error) {
clientStateResp, err := GRPCQuery[clienttypes.QueryClientStateResponse](ctx, chain, &clienttypes.QueryClientStateRequest{
ClientId: clientID,
})
if err != nil {
return nil, err
}
clientStateAny := clientStateResp.ClientState
cfg := chain.Config().EncodingConfig
var clientState ibcexported.ClientState
err = cfg.InterfaceRegistry.UnpackAny(clientStateAny, &clientState)
if err != nil {
return nil, err
}
return clientState, nil
}
// ClientStatus queries the status of the client by clientID
func ClientStatus(ctx context.Context, chain ibc.Chain, clientID string) (string, error) {
clientStatusResp, err := GRPCQuery[clienttypes.QueryClientStatusResponse](ctx, chain, &clienttypes.QueryClientStatusRequest{
ClientId: clientID,
})
if err != nil {
return "", err
}
return clientStatusResp.Status, nil
}
// GetValidatorSetByHeight returns the validators of the given chain at the specified height. The returned validators
// are sorted by address.
func GetValidatorSetByHeight(ctx context.Context, chain ibc.Chain, height uint64) ([]*cmtservice.Validator, error) {
res, err := GRPCQuery[cmtservice.GetValidatorSetByHeightResponse](ctx, chain, &cmtservice.GetValidatorSetByHeightRequest{
Height: int64(height),
})
if err != nil {
return nil, err
}
sort.SliceStable(res.Validators, func(i, j int) bool {
return res.Validators[i].Address < res.Validators[j].Address
})
return res.Validators, nil
}
// Balance returns the balance of a specific denomination for a given account by address.
func Balance(ctx context.Context, chain ibc.Chain, address string, denom string) (math.Int, error) {
res, err := GRPCQuery[banktypes.QueryBalanceResponse](ctx, chain, &banktypes.QueryBalanceRequest{
Address: address,
Denom: denom,
})
if err != nil {
return math.Int{}, err
}
return res.Balance.Amount, nil
}
// Channel queries the channel on a given chain for the provided portID and channelID
func Channel(ctx context.Context, chain ibc.Chain, portID, channelID string) (channeltypes.Channel, error) {
res, err := GRPCQuery[channeltypes.QueryChannelResponse](ctx, chain, &channeltypes.QueryChannelRequest{
PortId: portID,
ChannelId: channelID,
})
if err != nil {
return channeltypes.Channel{}, err
}
return *res.Channel, nil
}
// TotalEscrowForDenom queries the total amount of tokens in escrow for a denom
func TotalEscrowForDenom(ctx context.Context, chain ibc.Chain, denom string) (sdk.Coin, error) {
res, err := GRPCQuery[transfertypes.QueryTotalEscrowForDenomResponse](ctx, chain, &transfertypes.QueryTotalEscrowForDenomRequest{
Denom: denom,
})
if err != nil {
return sdk.Coin{}, err
}
return res.Amount, nil
}
// PacketAcknowledgements queries the packet acknowledgements on the given chain for the provided channel (optional) list of packet commitment sequences.
func PacketAcknowledgements(ctx context.Context, chain ibc.Chain, portID, channelID string, packetCommitmentSequences []uint64) ([]*channeltypes.PacketState, error) {
res, err := GRPCQuery[channeltypes.QueryPacketAcknowledgementsResponse](ctx, chain, &channeltypes.QueryPacketAcknowledgementsRequest{
PortId: portID,
ChannelId: channelID,
PacketCommitmentSequences: packetCommitmentSequences,
})
if err != nil {
return nil, err
}
return res.Acknowledgements, nil
}
// InterchainAccount queries the interchain account for the given owner and connectionID.
func InterchainAccount(ctx context.Context, chain ibc.Chain, address, connectionID string) (string, error) {
res, err := GRPCQuery[controllertypes.QueryInterchainAccountResponse](ctx, chain, &controllertypes.QueryInterchainAccountRequest{
Owner: address,
ConnectionId: connectionID,
})
if err != nil {
return "", err
}
return res.Address, nil
}
func TransferDenoms(ctx context.Context, chain ibc.Chain) (*transfertypes.QueryDenomsResponse, error) {
return grpcQueryWithMethod[transfertypes.QueryDenomsResponse](ctx, chain, &transfertypes.QueryDenomsRequest{}, queryPathTransferDenoms)
}