): { methodRender: JSX.Element; storedBlockRender: JSX.Element } => {
if (proposal) {
- const { height, created, proposalId } = proposal;
+ const { id, height, created } = proposal;
return {
methodRender: (
-
+
-
+
),
storedBlockRender:
height && created ? (
@@ -69,9 +69,9 @@ const getMethodSpecificRender = (
const { hash, height, created } = transaction;
return {
methodRender: (
-
+
-
+
),
storedBlockRender:
height && created ? (
@@ -100,7 +100,7 @@ const getMethodSpecificRender = (
* @todo Add genesis conditioning when the view table is available
*/
return {
- methodRender: N/A ,
+ methodRender: N/A ,
storedBlockRender: N/A ,
};
};
@@ -111,6 +111,8 @@ export const CodeInfoSection = ({
attached,
toJsonSchemaTab,
}: CodeInfoSectionProps) => {
+ const isFullTier = useTierConfig() === "full";
+
const { isOpen, onClose, onOpen } = useDisclosure();
const getAddressType = useGetAddressType();
const {
@@ -145,17 +147,14 @@ export const CodeInfoSection = ({
Code Info
-
- {chainId}
-
-
+ {chainId}
+
+
-
- {methodRender}
-
+
+ {isFullTier && methodRender}
+
-
-
-
- {storedBlockRender}
-
-
+
+ {isFullTier && (
+
+
+ {storedBlockRender}
+
+
+ )}
{!isMobile && (
-
+
-
+
)}
-
+
);
};
diff --git a/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx b/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx
index f12421b47..a7ccc42dd 100644
--- a/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx
+++ b/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx
@@ -1,7 +1,7 @@
import { Flex, Heading, Image, Text } from "@chakra-ui/react";
import { CTASection } from "../CTASection";
-import { useMobile } from "lib/app-provider";
+import { useMobile, useTierConfig } from "lib/app-provider";
import { Breadcrumb } from "lib/components/Breadcrumb";
import { CopyLink } from "lib/components/CopyLink";
import { CustomIcon } from "lib/components/icon";
@@ -26,6 +26,8 @@ export const CodeTopInfo = ({
projectInfo,
publicInfo,
}: CodeTopInfoProps) => {
+ const isFullTier = useTierConfig() === "full";
+
const { getCodeLocalInfo } = useCodeStore();
const localCodeInfo = getCodeLocalInfo(codeId);
@@ -109,21 +111,23 @@ export const CodeTopInfo = ({
type="code_hash"
/>
-
-
- CW2 Info:
-
-
- {cw2Info ?? "N/A"}
-
-
+
+ CW2 Info:
+
+
+ {cw2Info ?? "N/A"}
+
+
+ )}
{publicInfo && }
diff --git a/src/lib/pages/code-details/components/code-info/index.ts b/src/lib/pages/code-details/components/code-info/index.ts
index 96efbbba3..91355801b 100644
--- a/src/lib/pages/code-details/components/code-info/index.ts
+++ b/src/lib/pages/code-details/components/code-info/index.ts
@@ -1,2 +1,3 @@
-export * from "./table/CodeContractsTable";
+export * from "./table/CodeContractsTableFull";
+export * from "./table/CodeContractsTableLite";
export * from "./CodeInfoSection";
diff --git a/src/lib/pages/code-details/components/code-info/table/CodeContractsTable.tsx b/src/lib/pages/code-details/components/code-info/table/CodeContractsTableFull.tsx
similarity index 93%
rename from src/lib/pages/code-details/components/code-info/table/CodeContractsTable.tsx
rename to src/lib/pages/code-details/components/code-info/table/CodeContractsTableFull.tsx
index 431b0825e..c075de875 100644
--- a/src/lib/pages/code-details/components/code-info/table/CodeContractsTable.tsx
+++ b/src/lib/pages/code-details/components/code-info/table/CodeContractsTableFull.tsx
@@ -9,12 +9,12 @@ import type { BechAddr32 } from "lib/types";
import { NoContracts } from "./NoContracts";
-interface CodeContractsTableProps {
+interface CodeContractsTableFullProps {
codeId: number;
}
-export const CodeContractsTable = observer(
- ({ codeId }: CodeContractsTableProps) => {
+export const CodeContractsTableFull = observer(
+ ({ codeId }: CodeContractsTableFullProps) => {
const navigate = useInternalNavigate();
const onRowSelect = (contract: BechAddr32) =>
navigate({
diff --git a/src/lib/pages/code-details/components/code-info/table/CodeContractsTableLite.tsx b/src/lib/pages/code-details/components/code-info/table/CodeContractsTableLite.tsx
new file mode 100644
index 000000000..001131742
--- /dev/null
+++ b/src/lib/pages/code-details/components/code-info/table/CodeContractsTableLite.tsx
@@ -0,0 +1,55 @@
+import { observer } from "mobx-react-lite";
+
+import { useInternalNavigate } from "lib/app-provider";
+import { AlertPaginationLcd } from "lib/components/AlertPaginationLcd";
+import { LoadNext } from "lib/components/LoadNext";
+import { ContractsTable, TableTitle } from "lib/components/table";
+import { useCodeContractsLcd } from "lib/pages/code-details/data";
+import type { BechAddr32 } from "lib/types";
+
+import { NoContracts } from "./NoContracts";
+
+interface CodeContractsTableLiteProps {
+ codeId: number;
+}
+
+export const CodeContractsTableLite = observer(
+ ({ codeId }: CodeContractsTableLiteProps) => {
+ const navigate = useInternalNavigate();
+ const {
+ data,
+ error,
+ fetchNextPage,
+ hasNextPage,
+ isLoading,
+ isFetchingNextPage,
+ } = useCodeContractsLcd(codeId);
+
+ const onRowSelect = (contract: BechAddr32) =>
+ navigate({
+ pathname: "/contracts/[contract]",
+ query: { contract },
+ });
+
+ return (
+ <>
+ {data && !!error && }
+
+ }
+ onRowSelect={onRowSelect}
+ showLastUpdate={false}
+ />
+ {hasNextPage && (
+
+ )}
+ >
+ );
+ }
+);
diff --git a/src/lib/pages/code-details/data.ts b/src/lib/pages/code-details/data.ts
index fed9022aa..35428717d 100644
--- a/src/lib/pages/code-details/data.ts
+++ b/src/lib/pages/code-details/data.ts
@@ -2,9 +2,30 @@ import type { UseQueryOptions } from "@tanstack/react-query";
import { useContractStore } from "lib/providers/store";
import type { ContractsResponse } from "lib/services/types";
-import { useContractsByCodeId } from "lib/services/wasm/contract";
+import { useCodeLcd } from "lib/services/wasm/code";
+import {
+ useContractsByCodeId,
+ useContractsByCodeIdLcd,
+} from "lib/services/wasm/contract";
import type { ContractInfo, Option } from "lib/types";
+export const useCodeDataLcd = (codeId: number, enabled: boolean) => {
+ const { data, isLoading } = useCodeLcd(codeId, {
+ enabled,
+ });
+
+ return {
+ data: data
+ ? {
+ info: data,
+ projectInfo: null,
+ publicInfo: null,
+ }
+ : undefined,
+ isLoading,
+ };
+};
+
export const useCodeContracts = (
codeId: number,
limit: number,
@@ -34,3 +55,18 @@ export const useCodeContracts = (
isLoading,
};
};
+
+export const useCodeContractsLcd = (codeId: number) => {
+ const { getContractLocalInfo } = useContractStore();
+ const { data, ...rest } = useContractsByCodeIdLcd(codeId);
+
+ return {
+ data: data?.pages.flatMap((page) =>
+ page.contracts.map((contract) => ({
+ ...contract,
+ ...getContractLocalInfo(contract.contractAddress),
+ }))
+ ),
+ ...rest,
+ };
+};
diff --git a/src/lib/pages/code-details/index.tsx b/src/lib/pages/code-details/index.tsx
index 0175316f2..4e765f96c 100644
--- a/src/lib/pages/code-details/index.tsx
+++ b/src/lib/pages/code-details/index.tsx
@@ -8,6 +8,7 @@ import {
useCelatoneApp,
useInternalNavigate,
useMobile,
+ useTierConfig,
useWasmConfig,
} from "lib/app-provider";
import { CustomTab } from "lib/components/CustomTab";
@@ -16,11 +17,16 @@ import PageContainer from "lib/components/PageContainer";
import { ErrorFetching, InvalidState } from "lib/components/state";
import { UserDocsLink } from "lib/components/UserDocsLink";
import { useSchemaStore } from "lib/providers/store";
-import { useCodeDataByCodeId } from "lib/services/wasm/code";
+import { useCodeData } from "lib/services/wasm/code";
-import { CodeContractsTable, CodeInfoSection } from "./components/code-info";
+import {
+ CodeContractsTableFull,
+ CodeContractsTableLite,
+ CodeInfoSection,
+} from "./components/code-info";
import { CodeTopInfo } from "./components/code-info/CodeTopInfo";
import { CodeSchemaSection } from "./components/json-schema/CodeSchemaSection";
+import { useCodeDataLcd } from "./data";
import { TabIndex, zCodeDetailsQueryParams } from "./types";
const codeTabId = "codeDetailsTab";
@@ -34,18 +40,15 @@ const InvalidCode = () => ;
const CodeDetailsBody = observer(({ codeId, tab }: CodeDetailsBodyProps) => {
const isMobile = useMobile();
+ const isFullTier = useTierConfig() === "full";
- const router = useRouter();
const navigate = useInternalNavigate();
const { getSchemaByCodeHash } = useSchemaStore();
const { currentChainId } = useCelatoneApp();
- const { data, isLoading } = useCodeDataByCodeId(codeId);
-
- useEffect(() => {
- if (router.isReady) track(AmpEvent.TO_CODE_DETAILS, { tab });
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [router.isReady]);
+ const resApi = useCodeData(codeId, isFullTier);
+ const resLcd = useCodeDataLcd(codeId, !isFullTier);
+ const { data, isLoading } = isFullTier ? resApi : resLcd;
const handleTabChange = useCallback(
(nextTab: TabIndex) => () => {
@@ -83,7 +86,11 @@ const CodeDetailsBody = observer(({ codeId, tab }: CodeDetailsBodyProps) => {
index={Object.values(TabIndex).indexOf(tab)}
isLazy
lazyBehavior="keepMounted"
- my={{ base: 0, md: 8 }}
+ my={8}
+ borderTop={{
+ base: "1px solid var(--chakra-colors-gray-700)",
+ md: "none",
+ }}
>
{!isMobile && (
{
attached={!!jsonSchema}
toJsonSchemaTab={handleTabChange(TabIndex.JsonSchema)}
/>
-
+ {isFullTier ? (
+
+ ) : (
+
+ )}
{
const router = useRouter();
const validated = zCodeDetailsQueryParams.safeParse(router.query);
+ useEffect(() => {
+ if (router.isReady && validated.success)
+ track(AmpEvent.TO_CODE_DETAILS, { tab: validated.data.tab });
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [router.isReady]);
+
return (
{validated.success ? (
diff --git a/src/lib/pages/codes/components/RecentCodesTableLite.tsx b/src/lib/pages/codes/components/RecentCodesTableLite.tsx
index 1507926a9..6125324fb 100644
--- a/src/lib/pages/codes/components/RecentCodesTableLite.tsx
+++ b/src/lib/pages/codes/components/RecentCodesTableLite.tsx
@@ -1,15 +1,14 @@
-import { Alert, AlertDescription } from "@chakra-ui/react";
import { observer } from "mobx-react-lite";
import { useRecentCodesLcd } from "../data";
import { useInternalNavigate } from "lib/app-provider";
+import { AlertPaginationLcd } from "lib/components/AlertPaginationLcd";
import { LoadNext } from "lib/components/LoadNext";
import { EmptyState } from "lib/components/state";
import { CodesTable } from "lib/components/table";
export const RecentCodesTableLite = observer(() => {
const navigate = useInternalNavigate();
-
const {
data,
error,
@@ -27,13 +26,7 @@ export const RecentCodesTableLite = observer(() => {
return (
<>
- {data && !!error && (
-
-
- Error fetching data from LCD. Please refresh to try again.
-
-
- )}
+ {data && !!error && }
{
)
}
onRowSelect={onRowSelect}
- withoutTag
+ showTag={false}
/>
{data && data.total > 10 && (
{
},
});
- const { refetch } = useCodeInfoLcd(codeId, {
+ const { refetch } = useCodeLcd(Number(codeId), {
enabled: false,
retry: false,
cacheTime: 0,
- onSuccess(data) {
- const permission = data.codeInfo.instantiatePermission;
- setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
+ onSuccess: (data) => {
+ setValue("codeHash", data.hash.toLowerCase());
if (
- resolvePermission(address, permission.permission, permission.addresses)
+ resolvePermission(
+ address,
+ data.instantiatePermission,
+ data.permissionAddresses
+ )
)
setStatus({ state: "success" });
else {
@@ -212,7 +215,7 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => {
});
}
},
- onError() {
+ onError: () => {
setStatus({ state: "error", message: "This code ID does not exist" });
setSimulateError("");
},
@@ -323,7 +326,8 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => {
if (codeId.length) {
setStatus({ state: "loading" });
const timer = setTimeout(() => {
- refetch();
+ if (isId(codeId)) refetch();
+ else setStatus({ state: "error", message: "Invalid Code ID" });
}, 500);
return () => clearTimeout(timer);
}
@@ -412,9 +416,9 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => {
setValue("codeId", code);
resetMsgInputSchema();
}}
- setCodeHash={(data: CodeInfoResponseLcd) => {
- setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
- }}
+ setCodeHash={(data: Code) =>
+ setValue("codeHash", data.hash.toLowerCase())
+ }
codeId={codeId}
/>