From 5fbe669ed1565f4bda2471b472bad18f09bc6320 Mon Sep 17 00:00:00 2001 From: evilpeach Date: Wed, 27 Dec 2023 09:28:56 +0700 Subject: [PATCH 1/3] feat: v1 contract query msgs --- CHANGELOG.md | 1 + src/lib/app-provider/env.ts | 2 +- src/lib/hooks/index.ts | 1 - src/lib/hooks/useQueryCmds.ts | 55 ------------------- .../components/CommandSection.tsx | 7 ++- src/lib/pages/query/components/JsonQuery.tsx | 5 +- src/lib/services/contract.ts | 16 ++++++ src/lib/services/contractService.ts | 11 ++++ 8 files changed, 36 insertions(+), 62 deletions(-) delete mode 100644 src/lib/hooks/useQueryCmds.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index d7e9e3caa..d307919d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Improvements +- [#702](https://github.com/alleslabs/celatone-frontend/pull/702) api v1 - contract's query msgs - [#696](https://github.com/alleslabs/celatone-frontend/pull/696) api v1 - block details - [#695](https://github.com/alleslabs/celatone-frontend/pull/695) api v1 - contract states - [#678](https://github.com/alleslabs/celatone-frontend/pull/678) api v1 - contract table counts diff --git a/src/lib/app-provider/env.ts b/src/lib/app-provider/env.ts index 70498efbf..9977ea488 100644 --- a/src/lib/app-provider/env.ts +++ b/src/lib/app-provider/env.ts @@ -15,7 +15,7 @@ export enum CELATONE_QUERY_KEYS { CONTRACT_DETAIL_BY_CONTRACT_ADDRESS = "CELATONE_QUERY_CONTRACT_DETAIL_BY_CONTRACT_ADDRESS", CONTRACT_CW2_INFO = "CELATONE_QUERY_CONTRACT_CW2_INFO", CONTRACT_INFO = "CELATONE_QUERY_CONTRACT_INFO", - CONTRACT_QUERY_CMDS = "CELATONE_QUERY_CONTRACT_QUERY_CMDS", + CONTRACT_QUERY_MSGS = "CELATONE_QUERY_CONTRACT_QUERY_MSGS", CONTRACT_QUERY = "CELATONE_QUERY_CONTRACT_QUERY", CONTRACT_STATE = "CELATONE_QUERY_CONTRACT_STATE", // ACCOUNT diff --git a/src/lib/hooks/index.ts b/src/lib/hooks/index.ts index 0864e2797..4184bbffb 100644 --- a/src/lib/hooks/index.ts +++ b/src/lib/hooks/index.ts @@ -1,7 +1,6 @@ export * from "./useCodeFilter"; export * from "./useExecuteCmds"; export * from "./useHandleSave"; -export * from "./useQueryCmds"; export * from "./useRedo"; export * from "./useSingleMessageProps"; export * from "./useToast"; diff --git a/src/lib/hooks/useQueryCmds.ts b/src/lib/hooks/useQueryCmds.ts deleted file mode 100644 index e625fa528..000000000 --- a/src/lib/hooks/useQueryCmds.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import type { AxiosError } from "axios"; -import { useState } from "react"; - -import { CELATONE_QUERY_KEYS, useBaseApiRoute } from "lib/app-provider"; -import { queryData } from "lib/services/contract"; -import type { ContractAddr, RpcQueryError } from "lib/types"; - -export const useQueryCmds = (contractAddress: ContractAddr) => { - const [queryCmds, setQueryCmds] = useState<[string, string][]>([]); - const lcdEndpoint = useBaseApiRoute("rest"); - - const { isFetching } = useQuery( - [ - CELATONE_QUERY_KEYS.CONTRACT_QUERY_CMDS, - lcdEndpoint, - contractAddress, - '{"": {}}', - ], - async () => { - if (!contractAddress) return []; - return queryData( - lcdEndpoint, - contractAddress as ContractAddr, - '{"": {}}' - ); - }, - { - enabled: !!contractAddress, - retry: false, - cacheTime: 0, - refetchOnWindowFocus: false, - onError: (e: AxiosError) => { - const cmds: string[] = []; - const resMsg = e.response?.data.message; - - // Check if Sylvia framework - const sylviaRegex = - /Messages supported by this contract: (.*?)(: query wasm contract failed: invalid request)?$/; - const contentMatch = resMsg?.match(sylviaRegex); - - if (contentMatch && contentMatch[1]) { - const content = contentMatch[1].split(","); - content.forEach((each) => cmds.push(each.trim())); - } else { - Array.from(resMsg?.matchAll(/`(.*?)`/g) || []) - .slice(1) - .forEach((match) => cmds.push(match[1])); - } - setQueryCmds(cmds.map((cmd) => [cmd, `{"${cmd}": {}}`])); - }, - } - ); - return { isFetching, queryCmds }; -}; diff --git a/src/lib/pages/contract-details/components/CommandSection.tsx b/src/lib/pages/contract-details/components/CommandSection.tsx index 14335ce09..a4cc2a356 100644 --- a/src/lib/pages/contract-details/components/CommandSection.tsx +++ b/src/lib/pages/contract-details/components/CommandSection.tsx @@ -19,8 +19,9 @@ import { ViewSchemaModal, } from "lib/components/json-schema"; import { Tooltip } from "lib/components/Tooltip"; -import { useExecuteCmds, useQueryCmds } from "lib/hooks"; +import { useExecuteCmds } from "lib/hooks"; import { useSchemaStore } from "lib/providers/store"; +import { useContractQueryMsgs } from "lib/services/contractService"; import type { ContractAddr } from "lib/types"; import { encode, jsonPrettify } from "lib/utils"; @@ -94,8 +95,8 @@ export const CommandSection = observer( const jsonSchema = getSchemaByCodeHash(codeHash); const attached = Boolean(jsonSchema); - const { isFetching: isQueryCmdsFetching, queryCmds } = - useQueryCmds(contractAddress); + const { isFetching: isQueryCmdsFetching, data: queryCmds = [] } = + useContractQueryMsgs(contractAddress); const { isFetching: isExecuteCmdsFetching, execCmds } = useExecuteCmds(contractAddress); diff --git a/src/lib/pages/query/components/JsonQuery.tsx b/src/lib/pages/query/components/JsonQuery.tsx index 8e92316fc..ab3c3ab35 100644 --- a/src/lib/pages/query/components/JsonQuery.tsx +++ b/src/lib/pages/query/components/JsonQuery.tsx @@ -17,9 +17,9 @@ import JsonInput from "lib/components/json/JsonInput"; import JsonReadOnly from "lib/components/json/JsonReadOnly"; import { LoadingOverlay } from "lib/components/LoadingOverlay"; import { DEFAULT_RPC_ERROR } from "lib/data"; -import { useQueryCmds } from "lib/hooks"; import { useContractStore } from "lib/providers/store"; import { queryData } from "lib/services/contract"; +import { useContractQueryMsgs } from "lib/services/contractService"; import type { ContractAddr, HumanAddr, RpcQueryError } from "lib/types"; import { jsonPrettify, @@ -42,7 +42,8 @@ interface JsonQueryProps { } export const JsonQuery = ({ contractAddress, initialMsg }: JsonQueryProps) => { - const { isFetching: cmdsFetching, queryCmds } = useQueryCmds(contractAddress); + const { isFetching: cmdsFetching, data: queryCmds = [] } = + useContractQueryMsgs(contractAddress); const lcdEndpoint = useBaseApiRoute("rest"); const { addActivity } = useContractStore(); const { address } = useCurrentChain(); diff --git a/src/lib/services/contract.ts b/src/lib/services/contract.ts index 6cd52f83c..278509bca 100644 --- a/src/lib/services/contract.ts +++ b/src/lib/services/contract.ts @@ -160,3 +160,19 @@ export const getContractTableCounts = async ( }, }) .then((res) => zContractTableCounts.parse(res.data)); + +const zContractQueryMsgs = z + .object({ + query: z.array(z.string()), + }) + .transform((val) => + val.query.map<[string, string]>((msg) => [msg, `{"${msg}": {}}`]) + ); + +export const getContractQueryMsgs = async ( + endpoint: string, + contractAddress: ContractAddr +) => + axios + .get(`${endpoint}/${encodeURIComponent(contractAddress)}/query-msgs`) + .then(({ data }) => zContractQueryMsgs.parse(data)); diff --git a/src/lib/services/contractService.ts b/src/lib/services/contractService.ts index 6f20430d4..e710758b4 100644 --- a/src/lib/services/contractService.ts +++ b/src/lib/services/contractService.ts @@ -37,6 +37,7 @@ import { parseDate, parseTxHashOpt, parseDateOpt } from "lib/utils"; import { getCodeIdInfo } from "./code"; import { getAdminContractsByAddress, + getContractQueryMsgs, getContractTableCounts, getInstantiatedContractsByAddress, } from "./contract"; @@ -470,3 +471,13 @@ export const useContractTableCounts = ( { enabled: !!address, retry: 1, refetchOnWindowFocus: false } ); }; + +export const useContractQueryMsgs = (contractAddress: ContractAddr) => { + const endpoint = useBaseApiRoute("contracts"); + + return useQuery( + [CELATONE_QUERY_KEYS.CONTRACT_QUERY_MSGS, contractAddress], + async () => getContractQueryMsgs(endpoint, contractAddress), + { retry: false, cacheTime: 0, refetchOnWindowFocus: false } + ); +}; From 0cc2f3d31a7f0f9d4631892c1aef04c0de8d62c2 Mon Sep 17 00:00:00 2001 From: evilpeach Date: Wed, 27 Dec 2023 09:30:44 +0700 Subject: [PATCH 2/3] docs: update pull request number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d307919d1..521721932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Improvements -- [#702](https://github.com/alleslabs/celatone-frontend/pull/702) api v1 - contract's query msgs +- [#703](https://github.com/alleslabs/celatone-frontend/pull/703) api v1 - contract's query msgs - [#696](https://github.com/alleslabs/celatone-frontend/pull/696) api v1 - block details - [#695](https://github.com/alleslabs/celatone-frontend/pull/695) api v1 - contract states - [#678](https://github.com/alleslabs/celatone-frontend/pull/678) api v1 - contract table counts From b3fbdba11765f38ef739b3bd1a187cf25e701678 Mon Sep 17 00:00:00 2001 From: evilpeach Date: Wed, 27 Dec 2023 14:48:09 +0700 Subject: [PATCH 3/3] fix: add endpoint to query key --- src/lib/services/contractService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/services/contractService.ts b/src/lib/services/contractService.ts index e710758b4..54887bee2 100644 --- a/src/lib/services/contractService.ts +++ b/src/lib/services/contractService.ts @@ -476,7 +476,7 @@ export const useContractQueryMsgs = (contractAddress: ContractAddr) => { const endpoint = useBaseApiRoute("contracts"); return useQuery( - [CELATONE_QUERY_KEYS.CONTRACT_QUERY_MSGS, contractAddress], + [CELATONE_QUERY_KEYS.CONTRACT_QUERY_MSGS, endpoint, contractAddress], async () => getContractQueryMsgs(endpoint, contractAddress), { retry: false, cacheTime: 0, refetchOnWindowFocus: false } );