diff --git a/__fixtures__/v-next/outputhelperfunc/helper-func-types.ts b/__fixtures__/v-next/outputhelperfunc/helper-func-types.ts index 3973a7c87..fe5fbc652 100644 --- a/__fixtures__/v-next/outputhelperfunc/helper-func-types.ts +++ b/__fixtures__/v-next/outputhelperfunc/helper-func-types.ts @@ -10,7 +10,6 @@ import { BinaryReader, BinaryWriter } from "./binary"; import { getRpcClient } from "./extern"; import { isRpc, Rpc } from "./helpers"; import { TelescopeGeneratedCodec } from "./types"; -import { GlobalDecoderRegistry } from "./registry"; export interface QueryBuilderOptions { encode: (request: TReq, writer?: BinaryWriter) => BinaryWriter @@ -103,12 +102,15 @@ export function buildTx(opts: TxBuilderOptions) { client.addEncoders(opts.encoders ?? []); client.addConverters(opts.converters ?? []); - const data = [ - { - typeUrl: opts.typeUrl, - value: message, - }, - ]; + const data = Array.isArray(message) + ? message.map(msg => ({ + typeUrl: opts.typeUrl, + value: msg, + })) + : [{ + typeUrl: opts.typeUrl, + value: message, + }]; return client.signAndBroadcast!(signerAddress, data, fee, memo); }; } diff --git a/__fixtures__/v-next/outputhelperfunc/react-query.ts b/__fixtures__/v-next/outputhelperfunc/react-query.ts index 88d309a91..182c8a12b 100644 --- a/__fixtures__/v-next/outputhelperfunc/react-query.ts +++ b/__fixtures__/v-next/outputhelperfunc/react-query.ts @@ -127,6 +127,14 @@ export interface UseQueryBuilderOptions { queryKeyPrefix: string, } +const getRpcClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): Rpc | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; export function buildUseQuery(opts: UseQueryBuilderOptions) { return ({ @@ -143,16 +151,17 @@ export function buildUseQuery(opts: UseQueryBuilderOptions(queryKey); - - if(!rpcResolver && clientResolver.rpcEndpoint) { - rpcResolver = clientResolver.rpcEndpoint; - } } else { - rpcResolver = clientResolver; + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY + : DEFAULT_RPC_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getRpcClientFromCache(queryClient, key, endpoint); + // For CacheResolver with endpoint, use endpoint as fallback if no cached client + rpcResolver = cachedClient || + (isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint : + (!isCacheResolver(clientResolver) ? clientResolver : undefined)); } const queryFn = opts.builderQueryFn(rpcResolver); @@ -181,6 +190,14 @@ export interface UseMutationBuilderOptions { ) => Promise, } +const getSigningClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): ISigningClient | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; export function buildUseMutation(opts: UseMutationBuilderOptions) { return ({ @@ -195,12 +212,15 @@ export function buildUseMutation(opts: UseMutationBuilderOptions(queryKey); } else { - clientResolver = clientResolver; + // For both CacheResolver and other cases, try to get from cache first + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY + : DEFAULT_SIGNING_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getSigningClientFromCache(queryClient, key, endpoint); + signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined); } const mutationFn = opts.builderMutationFn(signingClientResolver); diff --git a/__fixtures__/v-next/outputicjs/helper-func-types.ts b/__fixtures__/v-next/outputicjs/helper-func-types.ts index 61fcb2a63..517a4fe4e 100644 --- a/__fixtures__/v-next/outputicjs/helper-func-types.ts +++ b/__fixtures__/v-next/outputicjs/helper-func-types.ts @@ -95,12 +95,15 @@ export function buildTx(opts: TxBuilderOptions) { client.addEncoders(opts.encoders ?? []); client.addConverters(opts.converters ?? []); - const data = [ - { - typeUrl: opts.typeUrl, - value: message, - }, - ]; + const data = Array.isArray(message) + ? message.map(msg => ({ + typeUrl: opts.typeUrl, + value: msg, + })) + : [{ + typeUrl: opts.typeUrl, + value: message, + }]; return client.signAndBroadcast!(signerAddress, data, fee, memo); }; } diff --git a/__fixtures__/v-next/outputicjs/react-query.ts b/__fixtures__/v-next/outputicjs/react-query.ts index 3c74b5a22..d3eb372a9 100644 --- a/__fixtures__/v-next/outputicjs/react-query.ts +++ b/__fixtures__/v-next/outputicjs/react-query.ts @@ -94,6 +94,15 @@ export const useRpcClient = ({ }, options); }; +const getRpcClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): Rpc | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; + export interface UseQueryBuilderOptions { builderQueryFn: (clientResolver?: RpcResolver) => (request: TReq) => Promise, queryKeyPrefix: string, @@ -115,16 +124,17 @@ export function buildUseQuery(opts: UseQueryBuilderOptions(queryKey); - - if(!rpcResolver && clientResolver.rpcEndpoint) { - rpcResolver = clientResolver.rpcEndpoint; - } } else { - rpcResolver = clientResolver; + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY + : DEFAULT_RPC_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getRpcClientFromCache(queryClient, key, endpoint); + // For CacheResolver with endpoint, use endpoint as fallback if no cached client + rpcResolver = cachedClient || + (isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint : + (!isCacheResolver(clientResolver) ? clientResolver : undefined)); } const queryFn = opts.builderQueryFn(rpcResolver); @@ -153,6 +163,14 @@ export interface UseMutationBuilderOptions { ) => Promise, } +const getSigningClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): ISigningClient | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; export function buildUseMutation(opts: UseMutationBuilderOptions) { return ({ @@ -167,12 +185,15 @@ export function buildUseMutation(opts: UseMutationBuilderOptions(queryKey); } else { - clientResolver = clientResolver; + // For both CacheResolver and other cases, try to get from cache first + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY + : DEFAULT_SIGNING_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getSigningClientFromCache(queryClient, key, endpoint); + signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined); } const mutationFn = opts.builderMutationFn(signingClientResolver); diff --git a/packages/telescope/src/helpers/helper-func-types-interface.ts b/packages/telescope/src/helpers/helper-func-types-interface.ts index f971b83e9..5a522118e 100644 --- a/packages/telescope/src/helpers/helper-func-types-interface.ts +++ b/packages/telescope/src/helpers/helper-func-types-interface.ts @@ -7,7 +7,6 @@ import { BinaryReader, BinaryWriter } from "./binary${options.restoreImportExten import { getRpcClient } from "./extern${options.restoreImportExtension ?? ""}"; import { isRpc, Rpc } from "./helpers${options.restoreImportExtension ?? ""}"; import { TelescopeGeneratedCodec } from "./types"; -import { GlobalDecoderRegistry } from "./registry"; export interface QueryBuilderOptions { encode: (request: TReq, writer?: BinaryWriter) => BinaryWriter @@ -100,12 +99,15 @@ export function buildTx(opts: TxBuilderOptions) { client.addEncoders(opts.encoders ?? []); client.addConverters(opts.converters ?? []); - const data = [ - { - typeUrl: opts.typeUrl, - value: message, - }, - ]; + const data = Array.isArray(message) + ? message.map(msg => ({ + typeUrl: opts.typeUrl, + value: msg, + })) + : [{ + typeUrl: opts.typeUrl, + value: message, + }]; return client.signAndBroadcast!(signerAddress, data, fee, memo); }; } diff --git a/packages/telescope/src/helpers/helper-func-types.ts b/packages/telescope/src/helpers/helper-func-types.ts index ef56e4320..48584b29e 100644 --- a/packages/telescope/src/helpers/helper-func-types.ts +++ b/packages/telescope/src/helpers/helper-func-types.ts @@ -92,12 +92,15 @@ export function buildTx(opts: TxBuilderOptions) { client.addEncoders(opts.encoders ?? []); client.addConverters(opts.converters ?? []); - const data = [ - { - typeUrl: opts.typeUrl, - value: message, - }, - ]; + const data = Array.isArray(message) + ? message.map(msg => ({ + typeUrl: opts.typeUrl, + value: msg, + })) + : [{ + typeUrl: opts.typeUrl, + value: message, + }]; return client.signAndBroadcast!(signerAddress, data, fee, memo); }; } diff --git a/packages/telescope/src/helpers/react-query-hooks-icjs.ts b/packages/telescope/src/helpers/react-query-hooks-icjs.ts index af909a103..37fc53431 100644 --- a/packages/telescope/src/helpers/react-query-hooks-icjs.ts +++ b/packages/telescope/src/helpers/react-query-hooks-icjs.ts @@ -111,6 +111,15 @@ export const useRpcClient = ({ }, options); }; +const getRpcClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): Rpc | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; + export interface UseQueryBuilderOptions { builderQueryFn: (clientResolver?: RpcResolver) => (request: TReq) => Promise, queryKeyPrefix: string, @@ -132,16 +141,17 @@ export function buildUseQuery(opts: UseQueryBuilderOptions(queryKey); - - if(!rpcResolver && clientResolver.rpcEndpoint) { - rpcResolver = clientResolver.rpcEndpoint; - } } else { - rpcResolver = clientResolver; + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY + : DEFAULT_RPC_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getRpcClientFromCache(queryClient, key, endpoint); + // For CacheResolver with endpoint, use endpoint as fallback if no cached client + rpcResolver = cachedClient || + (isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint : + (!isCacheResolver(clientResolver) ? clientResolver : undefined)); } const queryFn = opts.builderQueryFn(rpcResolver); @@ -170,6 +180,14 @@ export interface UseMutationBuilderOptions { ) => Promise, } +const getSigningClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): ISigningClient | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; export function buildUseMutation(opts: UseMutationBuilderOptions) { return ({ @@ -184,12 +202,15 @@ export function buildUseMutation(opts: UseMutationBuilderOptions(queryKey); } else { - clientResolver = clientResolver; + // For both CacheResolver and other cases, try to get from cache first + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY + : DEFAULT_SIGNING_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getSigningClientFromCache(queryClient, key, endpoint); + signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined); } const mutationFn = opts.builderMutationFn(signingClientResolver); diff --git a/packages/telescope/src/helpers/react-query-hooks.ts b/packages/telescope/src/helpers/react-query-hooks.ts index ab6574f93..228e01967 100644 --- a/packages/telescope/src/helpers/react-query-hooks.ts +++ b/packages/telescope/src/helpers/react-query-hooks.ts @@ -158,6 +158,14 @@ export interface UseQueryBuilderOptions { queryKeyPrefix: string, } +const getRpcClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): Rpc | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; export function buildUseQuery(opts: UseQueryBuilderOptions) { return ({ @@ -174,16 +182,17 @@ export function buildUseQuery(opts: UseQueryBuilderOptions(queryKey); - - if(!rpcResolver && clientResolver.rpcEndpoint) { - rpcResolver = clientResolver.rpcEndpoint; - } } else { - rpcResolver = clientResolver; + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY + : DEFAULT_RPC_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getRpcClientFromCache(queryClient, key, endpoint); + // For CacheResolver with endpoint, use endpoint as fallback if no cached client + rpcResolver = cachedClient || + (isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint : + (!isCacheResolver(clientResolver) ? clientResolver : undefined)); } const queryFn = opts.builderQueryFn(rpcResolver); @@ -212,6 +221,14 @@ export interface UseMutationBuilderOptions { ) => Promise, } +const getSigningClientFromCache = ( + queryClient: ReturnType, + key: string, + rpcEndpoint?: string | HttpEndpoint +): ISigningClient | undefined => { + const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key]; + return queryClient.getQueryData(queryKey); +}; export function buildUseMutation(opts: UseMutationBuilderOptions) { return ({ @@ -226,12 +243,15 @@ export function buildUseMutation(opts: UseMutationBuilderOptions(queryKey); } else { - clientResolver = clientResolver; + // For both CacheResolver and other cases, try to get from cache first + const key = isCacheResolver(clientResolver) + ? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY + : DEFAULT_SIGNING_CLIENT_QUERY_KEY; + const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined; + + const cachedClient = getSigningClientFromCache(queryClient, key, endpoint); + signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined); } const mutationFn = opts.builderMutationFn(signingClientResolver);