From 30d24e08e0d16c10c2496c7e4e6f7705bfc3bc47 Mon Sep 17 00:00:00 2001 From: Poafs1 Date: Fri, 24 May 2024 13:49:48 +0700 Subject: [PATCH 1/6] feat(pages): update my publish module to support lcd endpoint --- src/lib/components/module/ModuleCard.tsx | 2 +- src/lib/pages/account-details/index.tsx | 2 +- .../components/UploadScriptCard.tsx | 2 +- .../component/drawer/ModuleSelectDrawer.tsx | 4 +- .../interact/component/form/ViewArea.tsx | 2 +- src/lib/pages/interact/data.ts | 2 +- src/lib/pages/interact/index.tsx | 5 +- .../module-details/components/ModuleInfo.tsx | 2 +- .../tables/history/PublishedEventsTable.tsx | 2 +- .../PublishedEventsTableMobileCard.tsx | 2 +- .../history/PublishedEventsTableRow.tsx | 2 +- .../components/tables/history/index.tsx | 2 +- src/lib/pages/module-details/index.tsx | 2 +- .../components/MyPublishedModulesTable.tsx | 13 +- .../components/UploadModuleCard.tsx | 4 +- src/lib/pages/publish-module/formConstants.ts | 2 +- src/lib/pages/publish-module/publish.tsx | 2 +- src/lib/pages/publish-module/utils.ts | 2 +- src/lib/services/move/index.ts | 2 +- src/lib/services/move/module.ts | 347 ------------------ src/lib/services/move/module/api.ts | 191 ++++++++++ .../{moduleService.ts => module/index.ts} | 61 ++- src/lib/services/move/module/lcd.ts | 44 +++ src/lib/services/searchService.ts | 2 +- src/lib/services/types/index.ts | 1 + src/lib/services/types/move/index.ts | 1 + src/lib/services/types/move/module.ts | 159 ++++++++ 27 files changed, 451 insertions(+), 411 deletions(-) delete mode 100644 src/lib/services/move/module.ts create mode 100644 src/lib/services/move/module/api.ts rename src/lib/services/move/{moduleService.ts => module/index.ts} (90%) create mode 100644 src/lib/services/move/module/lcd.ts create mode 100644 src/lib/services/types/move/index.ts create mode 100644 src/lib/services/types/move/module.ts diff --git a/src/lib/components/module/ModuleCard.tsx b/src/lib/components/module/ModuleCard.tsx index c78d53f55..f5320d908 100644 --- a/src/lib/components/module/ModuleCard.tsx +++ b/src/lib/components/module/ModuleCard.tsx @@ -5,7 +5,7 @@ import { useMemo } from "react"; import { AppLink } from "../AppLink"; import { CustomIcon } from "../icon"; import { AmpEvent, track } from "lib/amplitude"; -import { useVerifyModule } from "lib/services/move/moduleService"; +import { useVerifyModule } from "lib/services/move"; import type { BechAddr, IndexedModule, Option } from "lib/types"; import { CountBadge } from "./CountBadge"; diff --git a/src/lib/pages/account-details/index.tsx b/src/lib/pages/account-details/index.tsx index 3d8597008..f5fc5db8f 100644 --- a/src/lib/pages/account-details/index.tsx +++ b/src/lib/pages/account-details/index.tsx @@ -29,7 +29,7 @@ import { InvalidState } from "lib/components/state"; import { UserDocsLink } from "lib/components/UserDocsLink"; import { useFormatAddresses } from "lib/hooks/useFormatAddresses"; import { useAccountData } from "lib/services/accountService"; -import { useModulesByAddress } from "lib/services/move/moduleService"; +import { useModulesByAddress } from "lib/services/move"; import { useResourcesByAddress } from "lib/services/move/resourceService"; import { useNftsCountByAccount } from "lib/services/nft"; import type { Addr, BechAddr, HexAddr, Option } from "lib/types"; diff --git a/src/lib/pages/deploy-script/components/UploadScriptCard.tsx b/src/lib/pages/deploy-script/components/UploadScriptCard.tsx index 79103c448..184f28625 100644 --- a/src/lib/pages/deploy-script/components/UploadScriptCard.tsx +++ b/src/lib/pages/deploy-script/components/UploadScriptCard.tsx @@ -5,7 +5,7 @@ import type { FileState } from ".."; import { ComponentLoader } from "lib/components/ComponentLoader"; import { DropZone } from "lib/components/dropzone"; import { UploadCard } from "lib/components/upload/UploadCard"; -import { useDecodeScript } from "lib/services/move/moduleService"; +import { useDecodeScript } from "lib/services/move"; import type { ExposedFunction, Option } from "lib/types"; const DEFAULT_TEMP_FILE = { diff --git a/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx b/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx index 73b0893b6..530690afc 100644 --- a/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx +++ b/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx @@ -13,7 +13,7 @@ import { useEffect, useState } from "react"; import { ModuleEmptyState } from "../common"; import { useConvertHexAddress } from "lib/app-provider"; import { CustomIcon } from "lib/components/icon"; -import { useModulesByAddressLcd } from "lib/services/move/moduleService"; +import { useModulesByAddressLcd } from "lib/services/move/"; import type { BechAddr, HexAddr, IndexedModule, Option } from "lib/types"; import { isHexWalletAddress } from "lib/utils"; @@ -54,7 +54,7 @@ export const ModuleSelectDrawer = ({ refetchOnWindowFocus: false, enabled: false, retry: false, - onSuccess: (data) => setModules(data), + onSuccess: ({ items }) => setModules(items), }, }); diff --git a/src/lib/pages/interact/component/form/ViewArea.tsx b/src/lib/pages/interact/component/form/ViewArea.tsx index 1633f40a7..33968f17a 100644 --- a/src/lib/pages/interact/component/form/ViewArea.tsx +++ b/src/lib/pages/interact/component/form/ViewArea.tsx @@ -17,7 +17,7 @@ import { SubmitButton } from "lib/components/button"; import { CustomIcon } from "lib/components/icon"; import JsonReadOnly from "lib/components/json/JsonReadOnly"; import { DEFAULT_RPC_ERROR } from "lib/data"; -import { useFunctionView } from "lib/services/move/moduleService"; +import { useFunctionView } from "lib/services/move"; import type { AbiFormData, ExposedFunction, diff --git a/src/lib/pages/interact/data.ts b/src/lib/pages/interact/data.ts index 5dc16b373..fa716e19d 100644 --- a/src/lib/pages/interact/data.ts +++ b/src/lib/pages/interact/data.ts @@ -38,7 +38,7 @@ export const useSearchModules = ({ refetchOnWindowFocus: false, enabled: false, retry: false, - onSuccess: onModulesSuccess, + onSuccess: ({ items }) => onModulesSuccess(items), onError, }, }); diff --git a/src/lib/pages/interact/index.tsx b/src/lib/pages/interact/index.tsx index 8c3c1a94f..3b55ffdb8 100644 --- a/src/lib/pages/interact/index.tsx +++ b/src/lib/pages/interact/index.tsx @@ -10,10 +10,7 @@ import { ModuleSourceCode } from "lib/components/module"; import PageContainer from "lib/components/PageContainer"; import { PageHeader } from "lib/components/PageHeader"; import { useOpenNewTab } from "lib/hooks"; -import { - useModuleByAddressLcd, - useVerifyModule, -} from "lib/services/move/moduleService"; +import { useModuleByAddressLcd, useVerifyModule } from "lib/services/move"; import type { Addr, ExposedFunction, IndexedModule } from "lib/types"; import { getFirstQueryParam } from "lib/utils"; diff --git a/src/lib/pages/module-details/components/ModuleInfo.tsx b/src/lib/pages/module-details/components/ModuleInfo.tsx index c06438de5..72207f413 100644 --- a/src/lib/pages/module-details/components/ModuleInfo.tsx +++ b/src/lib/pages/module-details/components/ModuleInfo.tsx @@ -2,7 +2,7 @@ import { Flex, Heading, Text } from "@chakra-ui/react"; import { CustomIcon } from "lib/components/icon"; import { ModuleSourceCode } from "lib/components/module"; -import type { ModuleVerificationInternal } from "lib/services/move/module"; +import type { ModuleVerificationInternal } from "lib/services/types"; import type { HexAddr, Nullable, diff --git a/src/lib/pages/module-details/components/tables/history/PublishedEventsTable.tsx b/src/lib/pages/module-details/components/tables/history/PublishedEventsTable.tsx index c692cf168..9d1ae07e6 100644 --- a/src/lib/pages/module-details/components/tables/history/PublishedEventsTable.tsx +++ b/src/lib/pages/module-details/components/tables/history/PublishedEventsTable.tsx @@ -3,7 +3,7 @@ import { TableContainer } from "@chakra-ui/react"; import { useMobile } from "lib/app-provider"; import { Loading } from "lib/components/Loading"; import { MobileTableContainer } from "lib/components/table"; -import type { ModuleHistory } from "lib/services/move/module"; +import type { ModuleHistory } from "lib/services/types"; import type { Option } from "lib/types"; import { PublishedEventsTableHeader } from "./PublishedEventsTableHeader"; diff --git a/src/lib/pages/module-details/components/tables/history/PublishedEventsTableMobileCard.tsx b/src/lib/pages/module-details/components/tables/history/PublishedEventsTableMobileCard.tsx index f7594051a..06fb1db2b 100644 --- a/src/lib/pages/module-details/components/tables/history/PublishedEventsTableMobileCard.tsx +++ b/src/lib/pages/module-details/components/tables/history/PublishedEventsTableMobileCard.tsx @@ -6,7 +6,7 @@ import { MobileLabel, RemarkRender, } from "lib/components/table"; -import type { ModuleHistory } from "lib/services/move/module"; +import type { ModuleHistory } from "lib/services/types"; import { dateFromNow, formatUTC } from "lib/utils"; import { PolicyChanges } from "./PublishedEventsTableRow"; diff --git a/src/lib/pages/module-details/components/tables/history/PublishedEventsTableRow.tsx b/src/lib/pages/module-details/components/tables/history/PublishedEventsTableRow.tsx index b00c487e4..9a6d6b52c 100644 --- a/src/lib/pages/module-details/components/tables/history/PublishedEventsTableRow.tsx +++ b/src/lib/pages/module-details/components/tables/history/PublishedEventsTableRow.tsx @@ -5,7 +5,7 @@ import { capitalize } from "lodash"; import { ExplorerLink } from "lib/components/ExplorerLink"; import { CustomIcon } from "lib/components/icon"; import { RemarkRender, TableRow } from "lib/components/table"; -import type { ModuleHistory } from "lib/services/move/module"; +import type { ModuleHistory } from "lib/services/types"; import { dateFromNow, formatUTC } from "lib/utils"; interface PublishedEventsTableRowProps { diff --git a/src/lib/pages/module-details/components/tables/history/index.tsx b/src/lib/pages/module-details/components/tables/history/index.tsx index 5fd8bc15e..128529969 100644 --- a/src/lib/pages/module-details/components/tables/history/index.tsx +++ b/src/lib/pages/module-details/components/tables/history/index.tsx @@ -5,7 +5,7 @@ import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState, ErrorFetching } from "lib/components/state"; import { ViewMore } from "lib/components/table"; -import { useModuleHistories } from "lib/services/move/moduleService"; +import { useModuleHistories } from "lib/services/move"; import type { HexAddr, Option } from "lib/types"; import { PublishedEventsTable } from "./PublishedEventsTable"; diff --git a/src/lib/pages/module-details/index.tsx b/src/lib/pages/module-details/index.tsx index 5e2f34f9a..d7a6d1022 100644 --- a/src/lib/pages/module-details/index.tsx +++ b/src/lib/pages/module-details/index.tsx @@ -15,7 +15,7 @@ import { useModuleData, useModuleTableCounts, useVerifyModule, -} from "lib/services/move/moduleService"; +} from "lib/services/move"; import { FunctionTypeTabs, diff --git a/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx b/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx index f5f75ba97..d5e9892d7 100644 --- a/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx +++ b/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from "react"; -import { useCurrentChain } from "lib/app-provider"; +import { useCurrentChain, useTierConfig } from "lib/app-provider"; import InputWithIcon from "lib/components/InputWithIcon"; import { DisconnectedState, @@ -8,18 +8,25 @@ import { ErrorFetching, } from "lib/components/state"; import { ModulesTable } from "lib/components/table"; -import { useModulesByAddress } from "lib/services/move/moduleService"; +import { useModulesByAddress, useModulesByAddressLcd } from "lib/services/move"; import type { ModuleInfo, Option } from "lib/types"; export const MyPublishedModulesTable = () => { const [keyword, setKeyword] = useState(""); const { address } = useCurrentChain(); + const isFullTier = useTierConfig() === "full"; + + const fullData = useModulesByAddress(address, isFullTier); + const liteData = useModulesByAddressLcd({ + address, + options: { enabled: !isFullTier }, + }); const { data, isFetching: isModulesLoading, error, - } = useModulesByAddress(address); + } = isFullTier ? fullData : liteData; const filteredPublishedModules: Option = useMemo(() => { if (!keyword) return data?.items; diff --git a/src/lib/pages/publish-module/components/UploadModuleCard.tsx b/src/lib/pages/publish-module/components/UploadModuleCard.tsx index 3b6d73118..12604fc50 100644 --- a/src/lib/pages/publish-module/components/UploadModuleCard.tsx +++ b/src/lib/pages/publish-module/components/UploadModuleCard.tsx @@ -10,8 +10,8 @@ import { DropZone } from "lib/components/dropzone"; import { CustomIcon } from "lib/components/icon"; import { Tooltip } from "lib/components/Tooltip"; import { UploadCard } from "lib/components/upload/UploadCard"; -import { useDecodeModule } from "lib/services/move/moduleService"; -import type { DecodeModuleQueryResponse } from "lib/services/move/moduleService"; +import { useDecodeModule } from "lib/services/move"; +import type { DecodeModuleQueryResponse } from "lib/services/types"; import type { Option, UpgradePolicy } from "lib/types"; const DEFAULT_TEMP_FILE = { diff --git a/src/lib/pages/publish-module/formConstants.ts b/src/lib/pages/publish-module/formConstants.ts index 5ddd3dc95..41257d996 100644 --- a/src/lib/pages/publish-module/formConstants.ts +++ b/src/lib/pages/publish-module/formConstants.ts @@ -1,4 +1,4 @@ -import type { DecodeModuleQueryResponse } from "lib/services/move/moduleService"; +import type { DecodeModuleQueryResponse } from "lib/services/types"; import type { Option } from "lib/types"; import { UpgradePolicy } from "lib/types"; diff --git a/src/lib/pages/publish-module/publish.tsx b/src/lib/pages/publish-module/publish.tsx index 590a1d5de..5ff16dd2c 100644 --- a/src/lib/pages/publish-module/publish.tsx +++ b/src/lib/pages/publish-module/publish.tsx @@ -20,7 +20,7 @@ import { EstimatedFeeRender } from "lib/components/EstimatedFeeRender"; import { CustomIcon } from "lib/components/icon"; import PageContainer from "lib/components/PageContainer"; import { useTxBroadcast } from "lib/hooks"; -import type { DecodeModuleQueryResponse } from "lib/services/move/moduleService"; +import type { DecodeModuleQueryResponse } from "lib/services/types"; import type { Option } from "lib/types"; import { composePublishMsg } from "lib/utils"; diff --git a/src/lib/pages/publish-module/utils.ts b/src/lib/pages/publish-module/utils.ts index b62b01e93..03adea739 100644 --- a/src/lib/pages/publish-module/utils.ts +++ b/src/lib/pages/publish-module/utils.ts @@ -1,4 +1,4 @@ -import type { DecodeModuleQueryResponse } from "lib/services/move/moduleService"; +import type { DecodeModuleQueryResponse } from "lib/services/types"; import type { BechAddr20, Option } from "lib/types"; import { UpgradePolicy } from "lib/types"; import { bech32AddressToHex, truncate, unpadHexAddress } from "lib/utils"; diff --git a/src/lib/services/move/index.ts b/src/lib/services/move/index.ts index 84aa5610c..5bcd19bb5 100644 --- a/src/lib/services/move/index.ts +++ b/src/lib/services/move/index.ts @@ -1,3 +1,3 @@ -export * from "./moduleService"; export * from "./poolService"; export * from "./resourceService"; +export * from "./module"; diff --git a/src/lib/services/move/module.ts b/src/lib/services/move/module.ts deleted file mode 100644 index 87bd4e183..000000000 --- a/src/lib/services/move/module.ts +++ /dev/null @@ -1,347 +0,0 @@ -import axios from "axios"; -import { z } from "zod"; - -import { zProposal, zProposalsResponseItem, zTxsResponseItem } from "../types"; -import type { - AbiFormData, - Addr, - ExposedFunction, - HexAddr, - IndexedModule, - ModuleAbi, - ModuleData, - ModuleInfo, - Nullable, -} from "lib/types"; -import { - UpgradePolicy, - zHexAddr, - zPagination, - zRemark, - zUtcDate, -} from "lib/types"; -import { - indexModuleAbi, - libDecode, - parseJsonABI, - parseTxHash, - parseWithError, - serializeAbiData, - snakeToCamel, -} from "lib/utils"; - -const zBaseModuleLcd = z.object({ - address: zHexAddr, - module_name: z.string(), - abi: z.string(), - raw_bytes: z.string(), - upgrade_policy: z.nativeEnum(UpgradePolicy), -}); - -const zIndexedModuleLcd = zBaseModuleLcd.transform((val) => ({ - ...snakeToCamel(val), - ...indexModuleAbi(val.abi), -})); - -const zModuleLcdReturn = z.object({ - module: zIndexedModuleLcd, -}); - -export const getModuleByAddressLcd = async ( - baseEndpoint: string, - address: Addr, - moduleName: string -): Promise => - axios - .get( - `${baseEndpoint}/initia/move/v1/accounts/${encodeURIComponent(address)}/modules/${encodeURIComponent(moduleName)}` - ) - .then(({ data }) => parseWithError(zModuleLcdReturn, data).module); - -const zModulesLcdReturn = z.object({ - modules: z.array(zIndexedModuleLcd), - pagination: zPagination, -}); - -export const getModulesByAddressLcd = async ( - baseEndpoint: string, - address: Addr -): Promise => { - const result: IndexedModule[] = []; - - const fetchFn = async (paginationKey: Nullable) => { - const res = await axios - .get( - `${baseEndpoint}/initia/move/v1/accounts/${encodeURIComponent(address)}/modules${ - paginationKey ? `?pagination.key=${paginationKey}` : "" - }` - ) - .then(({ data }) => parseWithError(zModulesLcdReturn, data)); - result.push(...res.modules); - if (res.pagination.nextKey) await fetchFn(res.pagination.nextKey); - }; - - await fetchFn(null); - - return result.sort((a, b) => a.moduleName.localeCompare(b.moduleName)); -}; - -const zAccountModulesResponse = z.object({ - items: z.array(zIndexedModuleLcd), - total: z.number().nonnegative(), -}); -type AccountModulesResponse = z.infer; - -export const getModulesByAddress = async ( - endpoint: string, - address: Addr -): Promise => - axios - .get(`${endpoint}/${encodeURIComponent(address)}/move/modules`) - .then(({ data }) => parseWithError(zAccountModulesResponse, data)); - -const zModuleVerificationInternal = z - .object({ - id: z.number(), - module_address: zHexAddr, - module_name: z.string(), - verified_at: z.string(), - digest: z.string(), - source: z.string(), - base64: z.string(), - chain_id: z.string(), - }) - .transform(snakeToCamel); -export type ModuleVerificationInternal = z.infer< - typeof zModuleVerificationInternal ->; - -export const getModuleVerificationStatus = async ( - endpoint: string, - address: Addr, - moduleName: string -): Promise> => - axios - .get( - `${endpoint}/${encodeURIComponent(address)}/${encodeURIComponent(moduleName)}` - ) - .then(({ data }) => parseWithError(zModuleVerificationInternal, data)) - .catch(() => null); - -export const getFunctionView = async ( - baseEndpoint: string, - address: HexAddr, - moduleName: string, - fn: ExposedFunction, - abiData: AbiFormData -): Promise => { - const { data } = await axios.post( - `${baseEndpoint}/initia/move/v1/accounts/${address}/modules/${moduleName}/view_functions/${fn.name}`, - serializeAbiData(fn, abiData) - ); - return data.data; -}; - -interface DecodeModuleReturn { - abi: string; -} - -export const decodeModule = async ( - decodeAPI: string, - moduleEncode: string -): Promise => - axios - .post(decodeAPI, { - code_bytes: moduleEncode, - }) - .then(({ data }) => parseJsonABI(libDecode(data.abi))); - -export const decodeScript = async ( - decodeAPI: string, - scriptBytes: string -): Promise => - axios - .post(decodeAPI, { - code_bytes: scriptBytes, - }) - .then(({ data }) => parseJsonABI(libDecode(data.abi))); - -const zModulesResponseItem = z - .object({ - address: zHexAddr, - module_name: z.string(), - height: z.number(), - latest_updated: zUtcDate, - is_republished: z.boolean(), - is_verified: z.boolean(), - }) - .transform(snakeToCamel); - -const zModulesResponse = z.object({ - items: z.array(zModulesResponseItem), - total: z.number().nonnegative(), -}); -export type ModulesResponse = z.infer; - -export const getModules = async ( - endpoint: string, - limit: number, - offset: number -) => - axios - .get(`${endpoint}`, { - params: { - limit, - offset, - }, - }) - .then(({ data }) => parseWithError(zModulesResponse, data)); - -const zModuleDataResponse = zBaseModuleLcd - .extend({ - recent_publish_transaction: z.string().nullable(), - recent_publish_proposal: zProposal - .pick({ id: true, title: true }) - .nullish() - .default(null), - recent_publish_block_height: z.number().nonnegative(), - recent_publish_block_timestamp: zUtcDate, - is_republished: z.boolean(), - }) - .transform((val) => ({ - ...snakeToCamel(val), - ...indexModuleAbi(val.abi), - recentPublishTransaction: val.recent_publish_transaction - ? parseTxHash(val.recent_publish_transaction) - : null, - })); - -export const getModuleData = async ( - endpoint: string, - vmAddress: HexAddr, - moduleName: string, - isGov: boolean -): Promise => - axios - .get(`${endpoint}/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/info`, { - params: { - is_gov: isGov, - }, - }) - .then(({ data }) => parseWithError(zModuleDataResponse, data)); - -const zModuleTableCountsResponse = z.object({ - txs: z.number().nonnegative().nullable(), - histories: z.number().nonnegative().nullable(), - proposals: z.number().nonnegative().nullish().default(null), -}); -export type ModuleTableCountsResponse = z.infer< - typeof zModuleTableCountsResponse ->; - -export const getModuleTableCounts = async ( - endpoint: string, - vmAddress: HexAddr, - moduleName: string, - isGov: boolean -): Promise => - axios - .get( - `${endpoint}/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/table-counts`, - { - params: { - is_gov: isGov, - }, - } - ) - .then(({ data }) => parseWithError(zModuleTableCountsResponse, data)); - -const zModuleTxsResponse = z.object({ - items: z.array(zTxsResponseItem), - total: z.number().nonnegative(), -}); -export type ModuleTxsResponse = z.infer; - -export const getModuleTxs = async ( - endpoint: string, - vmAddress: HexAddr, - moduleName: string, - limit: number, - offset: number, - isInitia: boolean -) => - axios - .get( - `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/txs`, - { - params: { - limit, - offset, - is_initia: isInitia, - }, - } - ) - .then(({ data }) => parseWithError(zModuleTxsResponse, data)); - -const zModuleHistory = z - .object({ - remark: zRemark, - upgrade_policy: z.nativeEnum(UpgradePolicy), - height: z.number().nonnegative(), - timestamp: zUtcDate, - previous_policy: z.nativeEnum(UpgradePolicy).nullable(), - }) - .transform(snakeToCamel); -export type ModuleHistory = z.infer; - -const zModuleHistoriesResponse = z.object({ - items: z.array(zModuleHistory), - total: z.number().nonnegative(), -}); -export type ModuleHistoriesResponse = z.infer; - -export const getModuleHistories = async ( - endpoint: string, - vmAddress: HexAddr, - moduleName: string, - limit: number, - offset: number -) => - axios - .get( - `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/histories`, - { - params: { - limit, - offset, - }, - } - ) - .then(({ data }) => parseWithError(zModuleHistoriesResponse, data)); - -const zModuleRelatedProposalsResponse = z.object({ - items: z.array(zProposalsResponseItem), - total: z.number().nonnegative(), -}); -export type ModuleRelatedProposalsResponse = z.infer< - typeof zModuleRelatedProposalsResponse ->; - -export const getModuleRelatedProposals = async ( - endpoint: string, - vmAddress: HexAddr, - moduleName: string, - limit: number, - offset: number -) => - axios - .get( - `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/related-proposals`, - { - params: { - limit, - offset, - }, - } - ) - .then(({ data }) => parseWithError(zModuleRelatedProposalsResponse, data)); diff --git a/src/lib/services/move/module/api.ts b/src/lib/services/move/module/api.ts new file mode 100644 index 000000000..827e8a911 --- /dev/null +++ b/src/lib/services/move/module/api.ts @@ -0,0 +1,191 @@ +import axios from "axios"; + +import type { + AccountModulesResponse, + DecodeModuleReturn, + ModuleTableCountsResponse, + ModuleVerificationInternal, +} from "lib/services/types"; +import { + zAccountModulesResponse, + zModuleDataResponse, + zModuleHistoriesResponse, + zModuleRelatedProposalsResponse, + zModulesResponse, + zModuleTableCountsResponse, + zModuleTxsResponse, + zModuleVerificationInternal, +} from "lib/services/types"; +import type { + AbiFormData, + Addr, + ExposedFunction, + HexAddr, + ModuleAbi, + ModuleData, + Nullable, +} from "lib/types"; +import { + libDecode, + parseJsonABI, + parseWithError, + serializeAbiData, +} from "lib/utils"; + +export const getModulesByAddress = async ( + endpoint: string, + address: Addr +): Promise => + axios + .get(`${endpoint}/${encodeURIComponent(address)}/move/modules`) + .then(({ data }) => parseWithError(zAccountModulesResponse, data)); + +export const getModuleVerificationStatus = async ( + endpoint: string, + address: Addr, + moduleName: string +): Promise> => + axios + .get( + `${endpoint}/${encodeURIComponent(address)}/${encodeURIComponent(moduleName)}` + ) + .then(({ data }) => parseWithError(zModuleVerificationInternal, data)) + .catch(() => null); + +export const getFunctionView = async ( + baseEndpoint: string, + address: HexAddr, + moduleName: string, + fn: ExposedFunction, + abiData: AbiFormData +): Promise => { + const { data } = await axios.post( + `${baseEndpoint}/initia/move/v1/accounts/${address}/modules/${moduleName}/view_functions/${fn.name}`, + serializeAbiData(fn, abiData) + ); + return data.data; +}; + +export const decodeModule = async ( + decodeAPI: string, + moduleEncode: string +): Promise => + axios + .post(decodeAPI, { + code_bytes: moduleEncode, + }) + .then(({ data }) => parseJsonABI(libDecode(data.abi))); + +export const decodeScript = async ( + decodeAPI: string, + scriptBytes: string +): Promise => + axios + .post(decodeAPI, { + code_bytes: scriptBytes, + }) + .then(({ data }) => parseJsonABI(libDecode(data.abi))); + +export const getModules = async ( + endpoint: string, + limit: number, + offset: number +) => + axios + .get(`${endpoint}`, { + params: { + limit, + offset, + }, + }) + .then(({ data }) => parseWithError(zModulesResponse, data)); + +export const getModuleData = async ( + endpoint: string, + vmAddress: HexAddr, + moduleName: string, + isGov: boolean +): Promise => + axios + .get(`${endpoint}/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/info`, { + params: { + is_gov: isGov, + }, + }) + .then(({ data }) => parseWithError(zModuleDataResponse, data)); + +export const getModuleTableCounts = async ( + endpoint: string, + vmAddress: HexAddr, + moduleName: string, + isGov: boolean +): Promise => + axios + .get( + `${endpoint}/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/table-counts`, + { + params: { + is_gov: isGov, + }, + } + ) + .then(({ data }) => parseWithError(zModuleTableCountsResponse, data)); + +export const getModuleTxs = async ( + endpoint: string, + vmAddress: HexAddr, + moduleName: string, + limit: number, + offset: number, + isInitia: boolean +) => + axios + .get( + `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/txs`, + { + params: { + limit, + offset, + is_initia: isInitia, + }, + } + ) + .then(({ data }) => parseWithError(zModuleTxsResponse, data)); + +export const getModuleHistories = async ( + endpoint: string, + vmAddress: HexAddr, + moduleName: string, + limit: number, + offset: number +) => + axios + .get( + `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/histories`, + { + params: { + limit, + offset, + }, + } + ) + .then(({ data }) => parseWithError(zModuleHistoriesResponse, data)); + +export const getModuleRelatedProposals = async ( + endpoint: string, + vmAddress: HexAddr, + moduleName: string, + limit: number, + offset: number +) => + axios + .get( + `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/related-proposals`, + { + params: { + limit, + offset, + }, + } + ) + .then(({ data }) => parseWithError(zModuleRelatedProposalsResponse, data)); diff --git a/src/lib/services/move/moduleService.ts b/src/lib/services/move/module/index.ts similarity index 90% rename from src/lib/services/move/moduleService.ts rename to src/lib/services/move/module/index.ts index 79285ef00..993a62991 100644 --- a/src/lib/services/move/moduleService.ts +++ b/src/lib/services/move/module/index.ts @@ -11,46 +11,45 @@ import { useBaseApiRoute, useGovConfig, useInitia, + useLcdEndpoint, useMoveConfig, } from "lib/app-provider"; +import type { + DecodeModuleQueryResponse, + ModuleHistoriesResponse, + ModuleRelatedProposalsResponse, + ModulesResponse, + ModuleTableCountsResponse, + ModuleTxsResponse, + ModuleVerificationInternal, +} from "lib/services/types"; import type { AbiFormData, Addr, ExposedFunction, HexAddr, IndexedModule, - ModuleAbi, ModuleData, Nullable, Option, RpcQueryError, - UpgradePolicy, } from "lib/types"; import { truncate } from "lib/utils"; -import type { - ModuleHistoriesResponse, - ModuleRelatedProposalsResponse, - ModulesResponse, - ModuleTableCountsResponse, - ModuleTxsResponse, - ModuleVerificationInternal, -} from "./module"; import { decodeModule, decodeScript, getFunctionView, - getModuleByAddressLcd, getModuleData, getModuleHistories, getModuleRelatedProposals, getModules, getModulesByAddress, - getModulesByAddressLcd, getModuleTableCounts, getModuleTxs, getModuleVerificationStatus, -} from "./module"; +} from "./api"; +import { getModuleByAddressLcd, getModulesByAddressLcd } from "./lcd"; export const useModuleByAddressLcd = ({ address, @@ -74,25 +73,27 @@ export const useModuleByAddressLcd = ({ export const useModulesByAddressLcd = ({ address, - options = {}, }: { - address: Addr; - options?: Omit, "queryKey">; + address: Option; + options?: Omit, "queryKey">; }) => { - const baseEndpoint = useBaseApiRoute("rest"); - const queryFn = () => getModulesByAddressLcd(baseEndpoint, address); + const lcdEndpoint = useLcdEndpoint(); + const queryFn = () => { + if (!address) throw new Error("address is undefined"); + return getModulesByAddressLcd(lcdEndpoint, address); + }; - return useQuery( - [CELATONE_QUERY_KEYS.ACCOUNT_MODULES, baseEndpoint, address], + return useQuery<{ items: IndexedModule[] }>( + [CELATONE_QUERY_KEYS.ACCOUNT_MODULES, lcdEndpoint, address], queryFn, options ); }; -export const useModulesByAddress = (address: Option) => { +export const useModulesByAddress = (address: Option, enabled = true) => { const endpoint = useBaseApiRoute("accounts"); - const { enabled } = useMoveConfig({ shouldRedirect: false }); + const { enabled: moveEnabled } = useMoveConfig({ shouldRedirect: false }); return useQuery( [CELATONE_QUERY_KEYS.MODULES_BY_ADDRESS, endpoint, address], @@ -101,7 +102,7 @@ export const useModulesByAddress = (address: Option) => { return getModulesByAddress(endpoint, address); }, { - enabled, + enabled: enabled && moveEnabled, refetchOnWindowFocus: false, keepPreviousData: true, } @@ -170,11 +171,6 @@ export const useFunctionView = ({ } ); }; -export interface DecodeModuleQueryResponse { - abi: ModuleAbi; - modulePath: string; - currentPolicy: Option; -} export const useDecodeModule = ({ base64EncodedFile, @@ -213,15 +209,6 @@ export const useDecodeModule = ({ ); }; -export interface ModuleInitialPublishInfo { - publisherVmAddress: HexAddr; - createdHeight: Option; - createdTime: Option; - initTxHash: Option; - initProposalId: Option; - initProposalTitle: Option; -} - export const useDecodeScript = ({ base64EncodedFile, options, diff --git a/src/lib/services/move/module/lcd.ts b/src/lib/services/move/module/lcd.ts new file mode 100644 index 000000000..190b521bd --- /dev/null +++ b/src/lib/services/move/module/lcd.ts @@ -0,0 +1,44 @@ +import axios from "axios"; + +import { zModuleLcdReturn, zModulesLcdReturn } from "lib/services/types"; +import type { Addr, IndexedModule, Nullable } from "lib/types"; +import { parseWithError } from "lib/utils"; + +export const getModuleByAddressLcd = async ( + baseEndpoint: string, + address: Addr, + moduleName: string +): Promise => + axios + .get( + `${baseEndpoint}/initia/move/v1/accounts/${encodeURIComponent(address)}/modules/${encodeURIComponent(moduleName)}` + ) + .then(({ data }) => parseWithError(zModuleLcdReturn, data).module); + +export const getModulesByAddressLcd = async ( + endpoint: string, + address: Addr +): Promise<{ items: IndexedModule[] }> => { + const result: IndexedModule[] = []; + + const fetchFn = async (paginationKey: Nullable) => { + const res = await axios + .get( + `${endpoint}/initia/move/v1/accounts/${encodeURI(address)}/modules`, + { + params: { + "pagination.key": paginationKey ?? "", + }, + } + ) + .then(({ data }) => parseWithError(zModulesLcdReturn, data)); + result.push(...res.modules); + if (res.pagination.nextKey) await fetchFn(res.pagination.nextKey); + }; + + await fetchFn(null); + + return { + items: result.sort((a, b) => a.moduleName.localeCompare(b.moduleName)), + }; +}; diff --git a/src/lib/services/searchService.ts b/src/lib/services/searchService.ts index 94a1e5308..556e23788 100644 --- a/src/lib/services/searchService.ts +++ b/src/lib/services/searchService.ts @@ -17,7 +17,7 @@ import { } from "lib/utils"; import { useBlockData } from "./block"; -import { useModuleByAddressLcd } from "./move/moduleService"; +import { useModuleByAddressLcd } from "./move"; import { useAddressByICNSName, useICNSNamesByAddress } from "./nameService"; import type { ICNSNamesResponse } from "./ns"; import { usePoolByPoolId } from "./poolService"; diff --git a/src/lib/services/types/index.ts b/src/lib/services/types/index.ts index fad9bfad1..1b1ceba87 100644 --- a/src/lib/services/types/index.ts +++ b/src/lib/services/types/index.ts @@ -6,3 +6,4 @@ export * from "./staking"; export * from "./validator"; export * from "./wasm"; export * from "./tx"; +export * from "./move"; diff --git a/src/lib/services/types/move/index.ts b/src/lib/services/types/move/index.ts new file mode 100644 index 000000000..b999044ad --- /dev/null +++ b/src/lib/services/types/move/index.ts @@ -0,0 +1 @@ +export * from "./module"; diff --git a/src/lib/services/types/move/module.ts b/src/lib/services/types/move/module.ts new file mode 100644 index 000000000..6ecd710c3 --- /dev/null +++ b/src/lib/services/types/move/module.ts @@ -0,0 +1,159 @@ +import { z } from "zod"; + +import { zProposal, zProposalsResponseItem } from "../proposal"; +import { zTxsResponseItem } from "../tx"; +import type { + HexAddr, + IndexedModule, + ModuleAbi, + ModuleData, + ModuleInfo, + Option, +} from "lib/types"; +import { + UpgradePolicy, + zHexAddr, + zPagination, + zRemark, + zUtcDate, +} from "lib/types"; +import { indexModuleAbi, parseTxHash, snakeToCamel } from "lib/utils"; + +const zBaseModuleLcd = z.object({ + address: zHexAddr, + module_name: z.string(), + abi: z.string(), + raw_bytes: z.string(), + upgrade_policy: z.nativeEnum(UpgradePolicy), +}); + +const zIndexedModuleLcd = zBaseModuleLcd.transform((val) => ({ + ...snakeToCamel(val), + ...indexModuleAbi(val.abi), +})); + +export const zModuleLcdReturn = z.object({ + module: zIndexedModuleLcd, +}); + +export const zModulesLcdReturn = z.object({ + modules: z.array(zIndexedModuleLcd), + pagination: zPagination, +}); + +export const zAccountModulesResponse = z.object({ + items: z.array(zIndexedModuleLcd), + total: z.number().nonnegative(), +}); +export type AccountModulesResponse = z.infer; + +export const zModuleVerificationInternal = z + .object({ + id: z.number(), + module_address: zHexAddr, + module_name: z.string(), + verified_at: z.string(), + digest: z.string(), + source: z.string(), + base64: z.string(), + chain_id: z.string(), + }) + .transform(snakeToCamel); +export type ModuleVerificationInternal = z.infer< + typeof zModuleVerificationInternal +>; + +export interface DecodeModuleReturn { + abi: string; +} + +const zModulesResponseItem = z + .object({ + address: zHexAddr, + module_name: z.string(), + height: z.number(), + latest_updated: zUtcDate, + is_republished: z.boolean(), + is_verified: z.boolean(), + }) + .transform(snakeToCamel); + +export const zModulesResponse = z.object({ + items: z.array(zModulesResponseItem), + total: z.number().nonnegative(), +}); +export type ModulesResponse = z.infer; + +export const zModuleDataResponse = zBaseModuleLcd + .extend({ + recent_publish_transaction: z.string().nullable(), + recent_publish_proposal: zProposal + .pick({ id: true, title: true }) + .nullish() + .default(null), + recent_publish_block_height: z.number().nonnegative(), + recent_publish_block_timestamp: zUtcDate, + is_republished: z.boolean(), + }) + .transform((val) => ({ + ...snakeToCamel(val), + ...indexModuleAbi(val.abi), + recentPublishTransaction: val.recent_publish_transaction + ? parseTxHash(val.recent_publish_transaction) + : null, + })); + +export const zModuleTableCountsResponse = z.object({ + txs: z.number().nonnegative().nullable(), + histories: z.number().nonnegative().nullable(), + proposals: z.number().nonnegative().nullish().default(null), +}); +export type ModuleTableCountsResponse = z.infer< + typeof zModuleTableCountsResponse +>; + +export const zModuleTxsResponse = z.object({ + items: z.array(zTxsResponseItem), + total: z.number().nonnegative(), +}); +export type ModuleTxsResponse = z.infer; + +const zModuleHistory = z + .object({ + remark: zRemark, + upgrade_policy: z.nativeEnum(UpgradePolicy), + height: z.number().nonnegative(), + timestamp: zUtcDate, + previous_policy: z.nativeEnum(UpgradePolicy).nullable(), + }) + .transform(snakeToCamel); +export type ModuleHistory = z.infer; + +export const zModuleHistoriesResponse = z.object({ + items: z.array(zModuleHistory), + total: z.number().nonnegative(), +}); +export type ModuleHistoriesResponse = z.infer; + +export const zModuleRelatedProposalsResponse = z.object({ + items: z.array(zProposalsResponseItem), + total: z.number().nonnegative(), +}); +export type ModuleRelatedProposalsResponse = z.infer< + typeof zModuleRelatedProposalsResponse +>; + +export interface DecodeModuleQueryResponse { + abi: ModuleAbi; + modulePath: string; + currentPolicy: Option; +} + +export interface ModuleInitialPublishInfo { + publisherVmAddress: HexAddr; + createdHeight: Option; + createdTime: Option; + initTxHash: Option; + initProposalId: Option; + initProposalTitle: Option; +} From a7a7a3d54ca36fffbec7069472c2f7d645ac5c51 Mon Sep 17 00:00:00 2001 From: Poafs1 Date: Fri, 24 May 2024 13:58:35 +0700 Subject: [PATCH 2/6] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b58e82c43..d55c8cdce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features +- [#940](https://github.com/alleslabs/celatone-frontend/pull/940) Support my published modules page lite version with LCD endpoint - [#910](https://github.com/alleslabs/celatone-frontend/pull/910) Support proposals page lite version with LCD endpoint - [#930](https://github.com/alleslabs/celatone-frontend/pull/930) Add validator details stats to support lite version - [#928](https://github.com/alleslabs/celatone-frontend/pull/928) Add validator details page lite version From cb737e85ea62b4281ddd50384ebc1d8a669c2fe6 Mon Sep 17 00:00:00 2001 From: Poafs1 Date: Wed, 29 May 2024 14:26:59 +0700 Subject: [PATCH 3/6] feat(utils): update config initia tomcat lite denom --- src/config/chain/initia.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/chain/initia.ts b/src/config/chain/initia.ts index 7256aec9c..ce5d8bf9b 100644 --- a/src/config/chain/initia.ts +++ b/src/config/chain/initia.ts @@ -46,7 +46,7 @@ export const INITIA_CHAIN_CONFIGS: ChainConfigs = { gasPrice: { tokenPerGas: 0.151, denom: - "l2/ad2344d0c17127cc6bce67e360f43cd6c5fa09a7b5f6f9b7b80f9dc3e0c4876e", + "l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884", }, gasAdjustment: 1.5, maxGasLimit: 25_000_000, From 21323c4b9f5702127aafcce92797a3a7cb141d8b Mon Sep 17 00:00:00 2001 From: evilpeach Date: Tue, 4 Jun 2024 12:56:00 +0700 Subject: [PATCH 4/6] fix: as comments --- src/lib/services/move/module/api.ts | 14 ++++++-------- src/lib/services/move/module/index.ts | 3 ++- src/lib/services/move/module/lcd.ts | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/lib/services/move/module/api.ts b/src/lib/services/move/module/api.ts index 827e8a911..0a2224090 100644 --- a/src/lib/services/move/module/api.ts +++ b/src/lib/services/move/module/api.ts @@ -37,7 +37,7 @@ export const getModulesByAddress = async ( address: Addr ): Promise => axios - .get(`${endpoint}/${encodeURIComponent(address)}/move/modules`) + .get(`${endpoint}/${encodeURI(address)}/move/modules`) .then(({ data }) => parseWithError(zAccountModulesResponse, data)); export const getModuleVerificationStatus = async ( @@ -46,9 +46,7 @@ export const getModuleVerificationStatus = async ( moduleName: string ): Promise> => axios - .get( - `${endpoint}/${encodeURIComponent(address)}/${encodeURIComponent(moduleName)}` - ) + .get(`${endpoint}/${encodeURI(address)}/${encodeURI(moduleName)}`) .then(({ data }) => parseWithError(zModuleVerificationInternal, data)) .catch(() => null); @@ -122,7 +120,7 @@ export const getModuleTableCounts = async ( ): Promise => axios .get( - `${endpoint}/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/table-counts`, + `${endpoint}/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/table-counts`, { params: { is_gov: isGov, @@ -141,7 +139,7 @@ export const getModuleTxs = async ( ) => axios .get( - `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/txs`, + `${endpoint}/modules/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/txs`, { params: { limit, @@ -161,7 +159,7 @@ export const getModuleHistories = async ( ) => axios .get( - `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/histories`, + `${endpoint}/modules/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/histories`, { params: { limit, @@ -180,7 +178,7 @@ export const getModuleRelatedProposals = async ( ) => axios .get( - `${endpoint}/modules/${encodeURIComponent(vmAddress)}/${encodeURIComponent(moduleName)}/related-proposals`, + `${endpoint}/modules/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/related-proposals`, { params: { limit, diff --git a/src/lib/services/move/module/index.ts b/src/lib/services/move/module/index.ts index 993a62991..13a5e9c19 100644 --- a/src/lib/services/move/module/index.ts +++ b/src/lib/services/move/module/index.ts @@ -80,7 +80,8 @@ export const useModulesByAddressLcd = ({ }) => { const lcdEndpoint = useLcdEndpoint(); const queryFn = () => { - if (!address) throw new Error("address is undefined"); + if (!address) + throw new Error("address is undefined (useModulesByAddressLcd)"); return getModulesByAddressLcd(lcdEndpoint, address); }; diff --git a/src/lib/services/move/module/lcd.ts b/src/lib/services/move/module/lcd.ts index 190b521bd..de4e72d5b 100644 --- a/src/lib/services/move/module/lcd.ts +++ b/src/lib/services/move/module/lcd.ts @@ -11,7 +11,7 @@ export const getModuleByAddressLcd = async ( ): Promise => axios .get( - `${baseEndpoint}/initia/move/v1/accounts/${encodeURIComponent(address)}/modules/${encodeURIComponent(moduleName)}` + `${baseEndpoint}/initia/move/v1/accounts/${encodeURI(address)}/modules/${encodeURI(moduleName)}` ) .then(({ data }) => parseWithError(zModuleLcdReturn, data).module); From e9649749ab30b6dcad16d83ec0b4d50ae609c9ab Mon Sep 17 00:00:00 2001 From: evilpeach Date: Tue, 4 Jun 2024 16:14:59 +0700 Subject: [PATCH 5/6] fix: route, name, merge duplicated --- src/lib/app-provider/env.ts | 4 +- src/lib/components/module/ModuleCard.tsx | 2 +- src/lib/hooks/useSingleMessageProps.ts | 2 +- src/lib/model/account/api.ts | 2 +- src/lib/model/account/lcd.ts | 2 +- src/lib/pages/account-details/index.tsx | 4 +- .../components/UploadScriptCard.tsx | 2 +- .../component/drawer/ModuleSelectDrawer.tsx | 12 ++--- .../interact/component/form/ViewArea.tsx | 2 +- src/lib/pages/interact/data.ts | 16 +++--- src/lib/pages/interact/index.tsx | 5 +- .../tables/ModuleRelatedProposalsTable.tsx | 2 +- .../components/tables/ModuleTxsTable.tsx | 2 +- .../components/tables/history/index.tsx | 2 +- src/lib/pages/module-details/index.tsx | 2 +- .../modules/components/RecentModulesTable.tsx | 2 +- .../components/MyPublishedModulesTable.tsx | 13 ++--- src/lib/pages/nft-collection-details/data.ts | 2 +- src/lib/pages/proposal-details/data.ts | 2 +- .../components/UploadModuleCard.tsx | 2 +- .../pages/tx-details/components/TxInfo.tsx | 2 +- .../tx-details/components/TxInfoMobile.tsx | 2 +- .../components/tx-message/TxMsgExpand.tsx | 2 +- .../msg-receipts/CoinsComponent.tsx | 2 +- .../ValidatorDetailsBodyFull.tsx | 2 +- src/lib/services/bank/index.ts | 2 +- src/lib/services/move/index.ts | 3 -- src/lib/services/move/module/index.ts | 51 ++++++++++--------- src/lib/services/move/module/lcd.ts | 10 ++-- src/lib/services/searchService.ts | 2 +- src/lib/services/types/move/module.ts | 4 +- 31 files changed, 77 insertions(+), 87 deletions(-) delete mode 100644 src/lib/services/move/index.ts diff --git a/src/lib/app-provider/env.ts b/src/lib/app-provider/env.ts index 9ae0ddf98..7f3b4da3c 100644 --- a/src/lib/app-provider/env.ts +++ b/src/lib/app-provider/env.ts @@ -114,8 +114,8 @@ export enum CELATONE_QUERY_KEYS { // MODULES MODULE_DATA = "CELATONE_QUERY_MODULE_DATA", MODULES_BY_ADDRESS = "CELATONE_QUERY_MODULES_BY_ADDRESS", - ACCOUNT_MODULE = "CELATONE_QUERY_ACCOUNT_MODULE", - ACCOUNT_MODULES = "CELATONE_QUERY_ACCOUNT_MODULES", + MODULES_BY_ADDRESS_LCD = "CELATONE_QUERY_MODULES_BY_ADDRESS_LCD", + MODULE_BY_ADDRESS_LCD = "MODULE_BY_ADDRESS_LCD", MODULES = "CELATONE_QUERY_MODULES", MODULE_VERIFICATION = "CELATONE_QUERY_MODULE_VERIFICATION", FUNCTION_VIEW = "CELATONE_QUERY_FUNCTION_VIEW", diff --git a/src/lib/components/module/ModuleCard.tsx b/src/lib/components/module/ModuleCard.tsx index f5320d908..8a4470ca0 100644 --- a/src/lib/components/module/ModuleCard.tsx +++ b/src/lib/components/module/ModuleCard.tsx @@ -5,7 +5,7 @@ import { useMemo } from "react"; import { AppLink } from "../AppLink"; import { CustomIcon } from "../icon"; import { AmpEvent, track } from "lib/amplitude"; -import { useVerifyModule } from "lib/services/move"; +import { useVerifyModule } from "lib/services/move/module"; import type { BechAddr, IndexedModule, Option } from "lib/types"; import { CountBadge } from "./CountBadge"; diff --git a/src/lib/hooks/useSingleMessageProps.ts b/src/lib/hooks/useSingleMessageProps.ts index 7ee959615..1fc7ec91a 100644 --- a/src/lib/hooks/useSingleMessageProps.ts +++ b/src/lib/hooks/useSingleMessageProps.ts @@ -6,7 +6,7 @@ import type { SingleMsgProps } from "lib/components/action-msg/SingleMsg"; import type { LinkType } from "lib/components/ExplorerLink"; import { useContractStore } from "lib/providers/store"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import type { ContractLocalInfo } from "lib/stores/contract"; import type { AssetInfos, diff --git a/src/lib/model/account/api.ts b/src/lib/model/account/api.ts index e65b360d6..7f4f09700 100644 --- a/src/lib/model/account/api.ts +++ b/src/lib/model/account/api.ts @@ -1,5 +1,5 @@ import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import { useDelegationData } from "lib/services/staking"; import type { BechAddr, diff --git a/src/lib/model/account/lcd.ts b/src/lib/model/account/lcd.ts index ec3fd3ce7..fb39d3916 100644 --- a/src/lib/model/account/lcd.ts +++ b/src/lib/model/account/lcd.ts @@ -6,7 +6,7 @@ import { useCommissionsByValidatorAddressLcd, useDelegationRewardsByAddressLcd, } from "lib/services/distribution"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import { useDelegationsByAddressLcd, useRedelegationsByAddressLcd, diff --git a/src/lib/pages/account-details/index.tsx b/src/lib/pages/account-details/index.tsx index f5fc5db8f..973ac192a 100644 --- a/src/lib/pages/account-details/index.tsx +++ b/src/lib/pages/account-details/index.tsx @@ -29,7 +29,7 @@ import { InvalidState } from "lib/components/state"; import { UserDocsLink } from "lib/components/UserDocsLink"; import { useFormatAddresses } from "lib/hooks/useFormatAddresses"; import { useAccountData } from "lib/services/accountService"; -import { useModulesByAddress } from "lib/services/move"; +import { useModulesByAddress } from "lib/services/move/module"; import { useResourcesByAddress } from "lib/services/move/resourceService"; import { useNftsCountByAccount } from "lib/services/nft"; import type { Addr, BechAddr, HexAddr, Option } from "lib/types"; @@ -90,7 +90,7 @@ const AccountDetailsBody = ({ } = useAccountDetailsTableCounts(accountAddress); // move const { data: modulesData, isFetching: isModulesLoading } = - useModulesByAddress(accountAddress); + useModulesByAddress({ address: accountAddress }); const { data: resourcesData, isFetching: isResourceLoading } = useResourcesByAddress(accountAddress); // nft diff --git a/src/lib/pages/deploy-script/components/UploadScriptCard.tsx b/src/lib/pages/deploy-script/components/UploadScriptCard.tsx index 184f28625..1c80cfcb6 100644 --- a/src/lib/pages/deploy-script/components/UploadScriptCard.tsx +++ b/src/lib/pages/deploy-script/components/UploadScriptCard.tsx @@ -5,7 +5,7 @@ import type { FileState } from ".."; import { ComponentLoader } from "lib/components/ComponentLoader"; import { DropZone } from "lib/components/dropzone"; import { UploadCard } from "lib/components/upload/UploadCard"; -import { useDecodeScript } from "lib/services/move"; +import { useDecodeScript } from "lib/services/move/module"; import type { ExposedFunction, Option } from "lib/types"; const DEFAULT_TEMP_FILE = { diff --git a/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx b/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx index 530690afc..4ad68d81d 100644 --- a/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx +++ b/src/lib/pages/interact/component/drawer/ModuleSelectDrawer.tsx @@ -13,7 +13,7 @@ import { useEffect, useState } from "react"; import { ModuleEmptyState } from "../common"; import { useConvertHexAddress } from "lib/app-provider"; import { CustomIcon } from "lib/components/icon"; -import { useModulesByAddressLcd } from "lib/services/move/"; +import { useModulesByAddress } from "lib/services/move/module"; import type { BechAddr, HexAddr, IndexedModule, Option } from "lib/types"; import { isHexWalletAddress } from "lib/utils"; @@ -48,14 +48,10 @@ export const ModuleSelectDrawer = ({ }); const [modules, setModules] = useState(); - const { refetch } = useModulesByAddressLcd({ + const { refetch } = useModulesByAddress({ address: selectedAddress.hex, - options: { - refetchOnWindowFocus: false, - enabled: false, - retry: false, - onSuccess: ({ items }) => setModules(items), - }, + enabled: false, + onSuccess: ({ items }) => setModules(items), }); useEffect(() => { diff --git a/src/lib/pages/interact/component/form/ViewArea.tsx b/src/lib/pages/interact/component/form/ViewArea.tsx index 33968f17a..7d53db5af 100644 --- a/src/lib/pages/interact/component/form/ViewArea.tsx +++ b/src/lib/pages/interact/component/form/ViewArea.tsx @@ -17,7 +17,7 @@ import { SubmitButton } from "lib/components/button"; import { CustomIcon } from "lib/components/icon"; import JsonReadOnly from "lib/components/json/JsonReadOnly"; import { DEFAULT_RPC_ERROR } from "lib/data"; -import { useFunctionView } from "lib/services/move"; +import { useFunctionView } from "lib/services/move/module"; import type { AbiFormData, ExposedFunction, diff --git a/src/lib/pages/interact/data.ts b/src/lib/pages/interact/data.ts index fa716e19d..d048a43fb 100644 --- a/src/lib/pages/interact/data.ts +++ b/src/lib/pages/interact/data.ts @@ -2,8 +2,8 @@ import { useMemo } from "react"; import { useModuleByAddressLcd, - useModulesByAddressLcd, -} from "lib/services/move"; + useModulesByAddress, +} from "lib/services/move/module"; import type { Addr, IndexedModule, Option } from "lib/types"; export const useSearchModules = ({ @@ -32,15 +32,11 @@ export const useSearchModules = ({ }, }); const { refetch: refetchModules, isFetching: isModulesFetching } = - useModulesByAddressLcd({ + useModulesByAddress({ address, - options: { - refetchOnWindowFocus: false, - enabled: false, - retry: false, - onSuccess: ({ items }) => onModulesSuccess(items), - onError, - }, + enabled: false, + onSuccess: ({ items }) => onModulesSuccess(items), + onError, }); const refetch = useMemo( diff --git a/src/lib/pages/interact/index.tsx b/src/lib/pages/interact/index.tsx index 3b55ffdb8..f196cf864 100644 --- a/src/lib/pages/interact/index.tsx +++ b/src/lib/pages/interact/index.tsx @@ -10,7 +10,10 @@ import { ModuleSourceCode } from "lib/components/module"; import PageContainer from "lib/components/PageContainer"; import { PageHeader } from "lib/components/PageHeader"; import { useOpenNewTab } from "lib/hooks"; -import { useModuleByAddressLcd, useVerifyModule } from "lib/services/move"; +import { + useModuleByAddressLcd, + useVerifyModule, +} from "lib/services/move/module"; import type { Addr, ExposedFunction, IndexedModule } from "lib/types"; import { getFirstQueryParam } from "lib/utils"; diff --git a/src/lib/pages/module-details/components/tables/ModuleRelatedProposalsTable.tsx b/src/lib/pages/module-details/components/tables/ModuleRelatedProposalsTable.tsx index e42627507..b92768637 100644 --- a/src/lib/pages/module-details/components/tables/ModuleRelatedProposalsTable.tsx +++ b/src/lib/pages/module-details/components/tables/ModuleRelatedProposalsTable.tsx @@ -2,7 +2,7 @@ import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState, ErrorFetching } from "lib/components/state"; import { ProposalsTable, ViewMore } from "lib/components/table"; -import { useModuleRelatedProposals } from "lib/services/move"; +import { useModuleRelatedProposals } from "lib/services/move/module"; import type { HexAddr, Option } from "lib/types"; interface ModuleRelatedProposalsTableProps { diff --git a/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx b/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx index 717a701c4..79fc46ff2 100644 --- a/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx +++ b/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx @@ -5,7 +5,7 @@ import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState, ErrorFetching } from "lib/components/state"; import { TransactionsTable, ViewMore } from "lib/components/table"; -import { useModuleTxs } from "lib/services/move"; +import { useModuleTxs } from "lib/services/move/module"; import type { HexAddr, Option } from "lib/types"; interface ModuleTxsTableProps { diff --git a/src/lib/pages/module-details/components/tables/history/index.tsx b/src/lib/pages/module-details/components/tables/history/index.tsx index 128529969..f31b8687d 100644 --- a/src/lib/pages/module-details/components/tables/history/index.tsx +++ b/src/lib/pages/module-details/components/tables/history/index.tsx @@ -5,7 +5,7 @@ import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState, ErrorFetching } from "lib/components/state"; import { ViewMore } from "lib/components/table"; -import { useModuleHistories } from "lib/services/move"; +import { useModuleHistories } from "lib/services/move/module"; import type { HexAddr, Option } from "lib/types"; import { PublishedEventsTable } from "./PublishedEventsTable"; diff --git a/src/lib/pages/module-details/index.tsx b/src/lib/pages/module-details/index.tsx index d7a6d1022..fd0bb4a76 100644 --- a/src/lib/pages/module-details/index.tsx +++ b/src/lib/pages/module-details/index.tsx @@ -15,7 +15,7 @@ import { useModuleData, useModuleTableCounts, useVerifyModule, -} from "lib/services/move"; +} from "lib/services/move/module"; import { FunctionTypeTabs, diff --git a/src/lib/pages/modules/components/RecentModulesTable.tsx b/src/lib/pages/modules/components/RecentModulesTable.tsx index e67597b5c..498a4093a 100644 --- a/src/lib/pages/modules/components/RecentModulesTable.tsx +++ b/src/lib/pages/modules/components/RecentModulesTable.tsx @@ -2,7 +2,7 @@ import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState, ErrorFetching } from "lib/components/state"; import { ModulesTable } from "lib/components/table"; -import { useModules } from "lib/services/move"; +import { useModules } from "lib/services/move/module"; export const RecentModulesTable = () => { const { diff --git a/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx b/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx index d5e9892d7..be3711e36 100644 --- a/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx +++ b/src/lib/pages/my-published-modules/components/MyPublishedModulesTable.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from "react"; -import { useCurrentChain, useTierConfig } from "lib/app-provider"; +import { useCurrentChain } from "lib/app-provider"; import InputWithIcon from "lib/components/InputWithIcon"; import { DisconnectedState, @@ -8,25 +8,18 @@ import { ErrorFetching, } from "lib/components/state"; import { ModulesTable } from "lib/components/table"; -import { useModulesByAddress, useModulesByAddressLcd } from "lib/services/move"; +import { useModulesByAddress } from "lib/services/move/module"; import type { ModuleInfo, Option } from "lib/types"; export const MyPublishedModulesTable = () => { const [keyword, setKeyword] = useState(""); const { address } = useCurrentChain(); - const isFullTier = useTierConfig() === "full"; - - const fullData = useModulesByAddress(address, isFullTier); - const liteData = useModulesByAddressLcd({ - address, - options: { enabled: !isFullTier }, - }); const { data, isFetching: isModulesLoading, error, - } = isFullTier ? fullData : liteData; + } = useModulesByAddress({ address }); const filteredPublishedModules: Option = useMemo(() => { if (!keyword) return data?.items; diff --git a/src/lib/pages/nft-collection-details/data.ts b/src/lib/pages/nft-collection-details/data.ts index 7284c1c4c..97b59a8ae 100644 --- a/src/lib/pages/nft-collection-details/data.ts +++ b/src/lib/pages/nft-collection-details/data.ts @@ -1,5 +1,5 @@ import { useFormatAddresses } from "lib/hooks/useFormatAddresses"; -import { useResourcesByAddress } from "lib/services/move"; +import { useResourcesByAddress } from "lib/services/move/resourceService"; import type { HexAddr, HexAddr32, Option } from "lib/types"; interface SupplyData { diff --git a/src/lib/pages/proposal-details/data.ts b/src/lib/pages/proposal-details/data.ts index 182eb5333..0acc2e54f 100644 --- a/src/lib/pages/proposal-details/data.ts +++ b/src/lib/pages/proposal-details/data.ts @@ -1,6 +1,6 @@ import { useMobile } from "lib/app-provider"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import { useProposalData, useProposalParams } from "lib/services/proposal"; import type { Nullable, Option, ProposalData, ProposalParams } from "lib/types"; import { coinToTokenWithValue, compareTokenWithValues } from "lib/utils"; diff --git a/src/lib/pages/publish-module/components/UploadModuleCard.tsx b/src/lib/pages/publish-module/components/UploadModuleCard.tsx index 12604fc50..5d8bae9b8 100644 --- a/src/lib/pages/publish-module/components/UploadModuleCard.tsx +++ b/src/lib/pages/publish-module/components/UploadModuleCard.tsx @@ -10,7 +10,7 @@ import { DropZone } from "lib/components/dropzone"; import { CustomIcon } from "lib/components/icon"; import { Tooltip } from "lib/components/Tooltip"; import { UploadCard } from "lib/components/upload/UploadCard"; -import { useDecodeModule } from "lib/services/move"; +import { useDecodeModule } from "lib/services/move/module"; import type { DecodeModuleQueryResponse } from "lib/services/types"; import type { Option, UpgradePolicy } from "lib/types"; diff --git a/src/lib/pages/tx-details/components/TxInfo.tsx b/src/lib/pages/tx-details/components/TxInfo.tsx index 62697c8d2..6d00b24ce 100644 --- a/src/lib/pages/tx-details/components/TxInfo.tsx +++ b/src/lib/pages/tx-details/components/TxInfo.tsx @@ -5,7 +5,7 @@ import { ExplorerLink } from "lib/components/ExplorerLink"; import { LabelText } from "lib/components/LabelText"; import { UserDocsLink } from "lib/components/UserDocsLink"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import type { TxData } from "lib/services/types"; import { coinToTokenWithValue, diff --git a/src/lib/pages/tx-details/components/TxInfoMobile.tsx b/src/lib/pages/tx-details/components/TxInfoMobile.tsx index e7c5dd497..0a91e96f0 100644 --- a/src/lib/pages/tx-details/components/TxInfoMobile.tsx +++ b/src/lib/pages/tx-details/components/TxInfoMobile.tsx @@ -4,7 +4,7 @@ import { chakra, Flex, Text } from "@chakra-ui/react"; import { ExplorerLink } from "lib/components/ExplorerLink"; import { LabelText } from "lib/components/LabelText"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import type { TxData } from "lib/services/types"; import { coinToTokenWithValue, diff --git a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx index 1bb2344de..5f49ffbfb 100644 --- a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx +++ b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx @@ -10,7 +10,7 @@ import { ExplorerLink } from "lib/components/ExplorerLink"; import type { IconKeys } from "lib/components/icon"; import { CustomIcon } from "lib/components/icon"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import type { BechAddr } from "lib/types"; import type { VoteOption } from "lib/utils"; import { diff --git a/src/lib/pages/tx-details/components/tx-message/msg-receipts/CoinsComponent.tsx b/src/lib/pages/tx-details/components/tx-message/msg-receipts/CoinsComponent.tsx index 46c0d263c..56ace4593 100644 --- a/src/lib/pages/tx-details/components/tx-message/msg-receipts/CoinsComponent.tsx +++ b/src/lib/pages/tx-details/components/tx-message/msg-receipts/CoinsComponent.tsx @@ -8,7 +8,7 @@ import { ShowMoreButton } from "lib/components/button"; import { UnsupportedTokensModal } from "lib/components/modal/UnsupportedTokensModal"; import { TokenCard } from "lib/components/token/TokenCard"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import { coinToTokenWithValue, filterSupportedTokens } from "lib/utils"; interface CoinsComponentProps { diff --git a/src/lib/pages/validator-details/components/validator-details-body/ValidatorDetailsBodyFull.tsx b/src/lib/pages/validator-details/components/validator-details-body/ValidatorDetailsBodyFull.tsx index ed4722bf3..e8960391e 100644 --- a/src/lib/pages/validator-details/components/validator-details-body/ValidatorDetailsBodyFull.tsx +++ b/src/lib/pages/validator-details/components/validator-details-body/ValidatorDetailsBodyFull.tsx @@ -17,7 +17,7 @@ import PageHeaderContainer from "lib/components/PageHeaderContainer"; import { ErrorFetching, InvalidState } from "lib/components/state"; import { UserDocsLink } from "lib/components/UserDocsLink"; import { useAssetInfos } from "lib/services/assetService"; -import { useMovePoolInfos } from "lib/services/move"; +import { useMovePoolInfos } from "lib/services/move/poolService"; import { useStakingParamsLcd } from "lib/services/staking"; import { useValidatorData } from "lib/services/validator"; diff --git a/src/lib/services/bank/index.ts b/src/lib/services/bank/index.ts index 51890cce4..a746a430c 100644 --- a/src/lib/services/bank/index.ts +++ b/src/lib/services/bank/index.ts @@ -4,7 +4,7 @@ import type { UseQueryResult } from "@tanstack/react-query"; import type { Big } from "big.js"; import { useAssetInfos } from "../assetService"; -import { useMovePoolInfos } from "../move"; +import { useMovePoolInfos } from "../move/poolService"; import type { BalanceInfos } from "../types"; import { CELATONE_QUERY_KEYS, diff --git a/src/lib/services/move/index.ts b/src/lib/services/move/index.ts deleted file mode 100644 index 5bcd19bb5..000000000 --- a/src/lib/services/move/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./poolService"; -export * from "./resourceService"; -export * from "./module"; diff --git a/src/lib/services/move/module/index.ts b/src/lib/services/move/module/index.ts index 13a5e9c19..d4fbdb7ec 100644 --- a/src/lib/services/move/module/index.ts +++ b/src/lib/services/move/module/index.ts @@ -13,8 +13,10 @@ import { useInitia, useLcdEndpoint, useMoveConfig, + useTierConfig, } from "lib/app-provider"; import type { + AccountModulesResponse, DecodeModuleQueryResponse, ModuleHistoriesResponse, ModuleRelatedProposalsResponse, @@ -65,47 +67,48 @@ export const useModuleByAddressLcd = ({ getModuleByAddressLcd(baseEndpoint, address, moduleName); return useQuery( - [CELATONE_QUERY_KEYS.ACCOUNT_MODULE, baseEndpoint, address, moduleName], + [ + CELATONE_QUERY_KEYS.MODULE_BY_ADDRESS_LCD, + baseEndpoint, + address, + moduleName, + ], queryFn, options ); }; -export const useModulesByAddressLcd = ({ +export const useModulesByAddress = ({ address, - options = {}, + enabled = true, + onSuccess, + onError, }: { address: Option; - options?: Omit, "queryKey">; + enabled?: boolean; + onSuccess?: (data: AccountModulesResponse) => void; + onError?: (err: AxiosError) => void; }) => { + const isFullTier = useTierConfig() === "full"; + const apiEndpoint = useBaseApiRoute("accounts"); const lcdEndpoint = useLcdEndpoint(); - const queryFn = () => { - if (!address) - throw new Error("address is undefined (useModulesByAddressLcd)"); - return getModulesByAddressLcd(lcdEndpoint, address); - }; - - return useQuery<{ items: IndexedModule[] }>( - [CELATONE_QUERY_KEYS.ACCOUNT_MODULES, lcdEndpoint, address], - queryFn, - options - ); -}; - -export const useModulesByAddress = (address: Option, enabled = true) => { - const endpoint = useBaseApiRoute("accounts"); - const { enabled: moveEnabled } = useMoveConfig({ shouldRedirect: false }); + const endpoint = isFullTier ? apiEndpoint : lcdEndpoint; return useQuery( [CELATONE_QUERY_KEYS.MODULES_BY_ADDRESS, endpoint, address], async () => { - if (!address) throw new Error("address is undefined"); - return getModulesByAddress(endpoint, address); + if (!address) + throw new Error("address is undefined (useModulesByAddress)"); + return isFullTier + ? getModulesByAddress(endpoint, address) + : getModulesByAddressLcd(endpoint, address); }, { - enabled: enabled && moveEnabled, + enabled, + retry: 0, refetchOnWindowFocus: false, - keepPreviousData: true, + onSuccess, + onError, } ); }; diff --git a/src/lib/services/move/module/lcd.ts b/src/lib/services/move/module/lcd.ts index de4e72d5b..7e9590474 100644 --- a/src/lib/services/move/module/lcd.ts +++ b/src/lib/services/move/module/lcd.ts @@ -1,6 +1,7 @@ import axios from "axios"; -import { zModuleLcdReturn, zModulesLcdReturn } from "lib/services/types"; +import type { AccountModulesResponse } from "lib/services/types"; +import { zModuleResponseLcd, zModulesResponseLcd } from "lib/services/types"; import type { Addr, IndexedModule, Nullable } from "lib/types"; import { parseWithError } from "lib/utils"; @@ -13,12 +14,12 @@ export const getModuleByAddressLcd = async ( .get( `${baseEndpoint}/initia/move/v1/accounts/${encodeURI(address)}/modules/${encodeURI(moduleName)}` ) - .then(({ data }) => parseWithError(zModuleLcdReturn, data).module); + .then(({ data }) => parseWithError(zModuleResponseLcd, data).module); export const getModulesByAddressLcd = async ( endpoint: string, address: Addr -): Promise<{ items: IndexedModule[] }> => { +): Promise => { const result: IndexedModule[] = []; const fetchFn = async (paginationKey: Nullable) => { @@ -31,7 +32,7 @@ export const getModulesByAddressLcd = async ( }, } ) - .then(({ data }) => parseWithError(zModulesLcdReturn, data)); + .then(({ data }) => parseWithError(zModulesResponseLcd, data)); result.push(...res.modules); if (res.pagination.nextKey) await fetchFn(res.pagination.nextKey); }; @@ -40,5 +41,6 @@ export const getModulesByAddressLcd = async ( return { items: result.sort((a, b) => a.moduleName.localeCompare(b.moduleName)), + total: result.length, }; }; diff --git a/src/lib/services/searchService.ts b/src/lib/services/searchService.ts index 556e23788..cf9cbf456 100644 --- a/src/lib/services/searchService.ts +++ b/src/lib/services/searchService.ts @@ -17,7 +17,7 @@ import { } from "lib/utils"; import { useBlockData } from "./block"; -import { useModuleByAddressLcd } from "./move"; +import { useModuleByAddressLcd } from "./move/module"; import { useAddressByICNSName, useICNSNamesByAddress } from "./nameService"; import type { ICNSNamesResponse } from "./ns"; import { usePoolByPoolId } from "./poolService"; diff --git a/src/lib/services/types/move/module.ts b/src/lib/services/types/move/module.ts index 6ecd710c3..2193f4b8c 100644 --- a/src/lib/services/types/move/module.ts +++ b/src/lib/services/types/move/module.ts @@ -32,11 +32,11 @@ const zIndexedModuleLcd = zBaseModuleLcd.transform((val) => ({ ...indexModuleAbi(val.abi), })); -export const zModuleLcdReturn = z.object({ +export const zModuleResponseLcd = z.object({ module: zIndexedModuleLcd, }); -export const zModulesLcdReturn = z.object({ +export const zModulesResponseLcd = z.object({ modules: z.array(zIndexedModuleLcd), pagination: zPagination, }); From be402bd51985c4e850bbe5f121f3967d6a794d4e Mon Sep 17 00:00:00 2001 From: evilpeach Date: Tue, 4 Jun 2024 16:18:53 +0700 Subject: [PATCH 6/6] fix: typo --- src/lib/app-provider/env.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/app-provider/env.ts b/src/lib/app-provider/env.ts index 7f3b4da3c..dfa4e5759 100644 --- a/src/lib/app-provider/env.ts +++ b/src/lib/app-provider/env.ts @@ -115,7 +115,7 @@ export enum CELATONE_QUERY_KEYS { MODULE_DATA = "CELATONE_QUERY_MODULE_DATA", MODULES_BY_ADDRESS = "CELATONE_QUERY_MODULES_BY_ADDRESS", MODULES_BY_ADDRESS_LCD = "CELATONE_QUERY_MODULES_BY_ADDRESS_LCD", - MODULE_BY_ADDRESS_LCD = "MODULE_BY_ADDRESS_LCD", + MODULE_BY_ADDRESS_LCD = "CELATONE_QUERY_MODULE_BY_ADDRESS_LCD", MODULES = "CELATONE_QUERY_MODULES", MODULE_VERIFICATION = "CELATONE_QUERY_MODULE_VERIFICATION", FUNCTION_VIEW = "CELATONE_QUERY_FUNCTION_VIEW",