From f9ed6c859edc704469ca8bef890b902788554f05 Mon Sep 17 00:00:00 2001
From: songwongtp <16089160+songwongtp@users.noreply.github.com>
Date: Mon, 29 Apr 2024 15:18:36 +0700
Subject: [PATCH 1/7] feat: recent code lite
---
CHANGELOG.md | 1 +
src/config/chain/terra.ts | 2 +-
src/lib/components/LoadNext.tsx | 32 +++++
src/lib/components/modal/code/SaveNewCode.tsx | 16 +--
src/lib/components/select-code/CodeSelect.tsx | 12 +-
.../select-code/CodeSelectSection.tsx | 4 +-
src/lib/model/code.ts | 2 +-
src/lib/pages/account-details/data.ts | 2 +-
.../components/code-info/CodeInfoSection.tsx | 2 +-
.../components/code-info/CodeTopInfo.tsx | 2 +-
src/lib/pages/code-details/index.tsx | 2 +-
.../codes/components/RecentCodesTable.tsx | 91 -------------
.../codes/components/RecentCodesTableFull.tsx | 109 +++++++++++++++
.../codes/components/RecentCodesTableLite.tsx | 62 +++++++++
src/lib/pages/codes/data.ts | 18 ++-
src/lib/pages/codes/index.tsx | 33 +----
src/lib/pages/instantiate/instantiate.tsx | 14 +-
.../migrate/components/MigrateContract.tsx | 14 +-
src/lib/services/contractService.ts | 6 +-
src/lib/services/contractState.ts | 8 +-
src/lib/services/move/module.ts | 2 +-
src/lib/services/searchService.ts | 2 +-
src/lib/services/wasm/code/api.ts | 105 +++++++++++++++
.../{codeService.ts => wasm/code/gql.ts} | 82 +-----------
src/lib/services/wasm/code/index.ts | 4 +
src/lib/services/wasm/code/lcd.ts | 65 +++++++++
.../services/{code.ts => wasm/code/types.ts} | 124 +++++++-----------
src/lib/types/rest.ts | 12 +-
28 files changed, 499 insertions(+), 329 deletions(-)
create mode 100644 src/lib/components/LoadNext.tsx
delete mode 100644 src/lib/pages/codes/components/RecentCodesTable.tsx
create mode 100644 src/lib/pages/codes/components/RecentCodesTableFull.tsx
create mode 100644 src/lib/pages/codes/components/RecentCodesTableLite.tsx
create mode 100644 src/lib/services/wasm/code/api.ts
rename src/lib/services/{codeService.ts => wasm/code/gql.ts} (52%)
create mode 100644 src/lib/services/wasm/code/index.ts
create mode 100644 src/lib/services/wasm/code/lcd.ts
rename src/lib/services/{code.ts => wasm/code/types.ts} (58%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 107cdc706..8125115ef 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
+- [#900](https://github.com/alleslabs/celatone-frontend/pull/900) Support lite version recent codes
- [#897](https://github.com/alleslabs/celatone-frontend/pull/897) Add config for lite version support
### Improvements
diff --git a/src/config/chain/terra.ts b/src/config/chain/terra.ts
index 93661dee6..f49b03908 100644
--- a/src/config/chain/terra.ts
+++ b/src/config/chain/terra.ts
@@ -9,7 +9,7 @@ export const TERRA_CHAIN_CONFIGS: ChainConfigs = {
chain: "terra",
registryChainName: "terra2testnet",
prettyName: "Terra Testnet Lite",
- lcd: "https://pisco-lcd.terra.dev:443",
+ lcd: "https://terra-testnet-api.polkachu.com",
rpc: "https://terra-testnet-rpc.polkachu.com:443",
indexer: "https://pisco-1-graphql.alleslabs.dev/v1/graphql",
wallets: [...staionWallets, ...keplrWallets],
diff --git a/src/lib/components/LoadNext.tsx b/src/lib/components/LoadNext.tsx
new file mode 100644
index 000000000..d979d528d
--- /dev/null
+++ b/src/lib/components/LoadNext.tsx
@@ -0,0 +1,32 @@
+import { Button, Flex, Spinner } from "@chakra-ui/react";
+
+import { CustomIcon } from "./icon";
+
+interface LoadNextProps {
+ text: string;
+ fetchNextPage: () => void;
+ isFetchingNextPage: boolean;
+}
+
+export const LoadNext = ({
+ text,
+ fetchNextPage,
+ isFetchingNextPage,
+}: LoadNextProps) => (
+
+ {isFetchingNextPage ? (
+
+ ) : (
+
+ )}
+
+);
diff --git a/src/lib/components/modal/code/SaveNewCode.tsx b/src/lib/components/modal/code/SaveNewCode.tsx
index 33e1103de..072f5bbca 100644
--- a/src/lib/components/modal/code/SaveNewCode.tsx
+++ b/src/lib/components/modal/code/SaveNewCode.tsx
@@ -10,7 +10,7 @@ import { NumberInput, TextInput } from "lib/components/forms";
import { CustomIcon } from "lib/components/icon";
import { useGetMaxLengthError } from "lib/hooks";
import { useCodeStore } from "lib/providers/store";
-import { useLCDCodeInfo } from "lib/services/codeService";
+import { useCodeInfoLcd } from "lib/services/wasm/code";
import type { BechAddr } from "lib/types";
import { getNameAndDescriptionDefault, getPermissionHelper } from "lib/utils";
@@ -55,24 +55,24 @@ export function SaveNewCodeModal({ buttonProps }: SaveNewCodeModalProps) {
const { isCodeIdSaved, saveNewCode, updateCodeInfo, getCodeLocalInfo } =
useCodeStore();
- const { refetch, isFetching, isRefetching } = useLCDCodeInfo(codeId, {
+ const { refetch, isFetching, isRefetching } = useCodeInfoLcd(codeId, {
enabled: false,
retry: false,
cacheTime: 0,
onSuccess(data) {
const { message, messageColor } = getPermissionHelper(
address,
- data.code_info.instantiate_permission.permission,
- data.code_info.instantiate_permission.address
- ? [data.code_info.instantiate_permission.address]
- : data.code_info.instantiate_permission.addresses
+ data.codeInfo.instantiatePermission.permission,
+ data.codeInfo.instantiatePermission.address
+ ? [data.codeInfo.instantiatePermission.address]
+ : data.codeInfo.instantiatePermission.addresses
);
setCodeIdStatus({
state: "success",
- message: `${message} (${data.code_info.instantiate_permission.permission})`,
+ message: `${message} (${data.codeInfo.instantiatePermission.permission})`,
messageColor,
});
- setUploader(data.code_info.creator);
+ setUploader(data.codeInfo.creator);
setUploaderStatus({ state: "success" });
},
onError() {
diff --git a/src/lib/components/select-code/CodeSelect.tsx b/src/lib/components/select-code/CodeSelect.tsx
index 381a1d4ac..54ff841bd 100644
--- a/src/lib/components/select-code/CodeSelect.tsx
+++ b/src/lib/components/select-code/CodeSelect.tsx
@@ -6,8 +6,8 @@ import { PermissionChip } from "../PermissionChip";
import type { FormStatus } from "lib/components/forms";
import { UploadIcon } from "lib/components/icon";
import { useCodeStore } from "lib/providers/store";
-import type { LCDCodeInfoSuccessCallback } from "lib/services/codeService";
-import { useLCDCodeInfo } from "lib/services/codeService";
+import { useCodeInfoLcd } from "lib/services/wasm/code";
+import type { CodeInfoResponseLcd } from "lib/services/wasm/code";
import { AccessConfigPermission } from "lib/types";
import { isId } from "lib/utils";
@@ -15,7 +15,7 @@ import { CodeSelectDrawerButton } from "./CodeSelectDrawerButton";
interface CodeSelectProps extends Omit {
onCodeSelect: (code: string) => void;
- setCodeHash?: LCDCodeInfoSuccessCallback;
+ setCodeHash?: (data: CodeInfoResponseLcd) => void;
codeId: string;
status: FormStatus;
}
@@ -29,7 +29,7 @@ export const CodeSelect = ({
}: CodeSelectProps) => {
const { getCodeLocalInfo } = useCodeStore();
const name = getCodeLocalInfo(Number(codeId))?.name;
- const { data: codeInfo } = useLCDCodeInfo(codeId, {
+ const { data: codeInfo } = useCodeInfoLcd(codeId, {
onSuccess: setCodeHash,
enabled: isId(codeId),
});
@@ -66,11 +66,11 @@ export const CodeSelect = ({
diff --git a/src/lib/components/select-code/CodeSelectSection.tsx b/src/lib/components/select-code/CodeSelectSection.tsx
index fa617b9f2..da57009ae 100644
--- a/src/lib/components/select-code/CodeSelectSection.tsx
+++ b/src/lib/components/select-code/CodeSelectSection.tsx
@@ -5,7 +5,7 @@ import type { Control, FieldPath, FieldValues } from "react-hook-form";
import { AmpEvent, track } from "lib/amplitude";
import { ControllerInput } from "lib/components/forms";
import type { FormStatus } from "lib/components/forms";
-import type { LCDCodeInfoSuccessCallback } from "lib/services/codeService";
+import type { CodeInfoResponseLcd } from "lib/services/wasm/code";
import type { Option } from "lib/types";
import { CodeSelect } from "./CodeSelect";
@@ -16,7 +16,7 @@ interface CodeSelectSectionProps {
control: Control;
error: Option;
onCodeSelect: (codeId: string) => void;
- setCodeHash?: LCDCodeInfoSuccessCallback;
+ setCodeHash?: (data: CodeInfoResponseLcd) => void;
status: FormStatus;
}
diff --git a/src/lib/model/code.ts b/src/lib/model/code.ts
index 8f2d0c455..71e87e457 100644
--- a/src/lib/model/code.ts
+++ b/src/lib/model/code.ts
@@ -11,7 +11,7 @@ import { useCodeStore } from "lib/providers/store";
import {
useCodeListByCodeIds,
useCodeListByWalletAddress,
-} from "lib/services/codeService";
+} from "lib/services/wasm/code";
import type { CodeInfo } from "lib/types";
import { AccessConfigPermission } from "lib/types";
diff --git a/src/lib/pages/account-details/data.ts b/src/lib/pages/account-details/data.ts
index 351f239e4..2e3071415 100644
--- a/src/lib/pages/account-details/data.ts
+++ b/src/lib/pages/account-details/data.ts
@@ -1,11 +1,11 @@
import { useCodeStore, useContractStore } from "lib/providers/store";
import { useAccountTableCounts } from "lib/services/accountService";
import { useBalances } from "lib/services/balanceService";
-import { useCodesByAddress } from "lib/services/codeService";
import {
useAdminContractsByAddress,
useInstantiatedContractsByAddress,
} from "lib/services/contractService";
+import { useCodesByAddress } from "lib/services/wasm/code";
import type {
BechAddr,
CodeInfo,
diff --git a/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx b/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx
index 68de19b0f..30f520e10 100644
--- a/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx
+++ b/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx
@@ -17,7 +17,7 @@ import { JsonSchemaModal } from "lib/components/json-schema";
import { LabelText } from "lib/components/LabelText";
import { PermissionChip } from "lib/components/PermissionChip";
import { ViewPermissionAddresses } from "lib/components/ViewPermissionAddresses";
-import type { Code } from "lib/services/code";
+import type { Code } from "lib/services/wasm/code";
import type { Option } from "lib/types";
import { dateFromNow, formatUTC, getAddressTypeText } from "lib/utils";
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 26c3be207..0eca44fad 100644
--- a/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx
+++ b/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx
@@ -8,7 +8,7 @@ import { CustomIcon } from "lib/components/icon";
import { GitHubLink } from "lib/components/links";
import { PublicDescription } from "lib/components/PublicDescription";
import { useCodeStore } from "lib/providers/store";
-import type { Code } from "lib/services/code";
+import type { Code } from "lib/services/wasm/code";
import { AccessConfigPermission } from "lib/types";
import type { Nullable, ProjectInfo, PublicCodeInfo } from "lib/types";
import { getCw2Info } from "lib/utils";
diff --git a/src/lib/pages/code-details/index.tsx b/src/lib/pages/code-details/index.tsx
index eb922eff5..0175316f2 100644
--- a/src/lib/pages/code-details/index.tsx
+++ b/src/lib/pages/code-details/index.tsx
@@ -16,7 +16,7 @@ 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/codeService";
+import { useCodeDataByCodeId } from "lib/services/wasm/code";
import { CodeContractsTable, CodeInfoSection } from "./components/code-info";
import { CodeTopInfo } from "./components/code-info/CodeTopInfo";
diff --git a/src/lib/pages/codes/components/RecentCodesTable.tsx b/src/lib/pages/codes/components/RecentCodesTable.tsx
deleted file mode 100644
index 7c04515af..000000000
--- a/src/lib/pages/codes/components/RecentCodesTable.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import { observer } from "mobx-react-lite";
-import { useEffect } from "react";
-
-import { useRecentCodes } from "../data";
-import { useCurrentChain, useInternalNavigate } from "lib/app-provider";
-import { Pagination } from "lib/components/pagination";
-import { usePaginator } from "lib/components/pagination/usePaginator";
-import { EmptyState, ErrorFetching } from "lib/components/state";
-import { CodesTable } from "lib/components/table";
-import type { PermissionFilterValue } from "lib/hooks";
-
-interface RecentCodesTableProps {
- permissionValue: PermissionFilterValue;
-}
-
-export const RecentCodesTable = observer(
- ({ permissionValue }: RecentCodesTableProps) => {
- const navigate = useInternalNavigate();
- const { address } = useCurrentChain();
-
- const {
- pagesQuantity,
- setTotalData,
- currentPage,
- setCurrentPage,
- pageSize,
- setPageSize,
- offset,
- } = usePaginator({
- initialState: {
- pageSize: 10,
- currentPage: 1,
- isDisabled: false,
- },
- });
- const { data, isLoading } = useRecentCodes(
- pageSize,
- offset,
- address,
- permissionValue,
- setTotalData
- );
-
- const onRowSelect = (codeId: number) =>
- navigate({
- pathname: "/codes/[codeId]",
- query: { codeId },
- });
-
- useEffect(() => {
- setCurrentPage(1);
- setPageSize(10);
- }, [permissionValue, setCurrentPage, setPageSize]);
-
- return (
- <>
-
- ) : (
-
- )
- }
- onRowSelect={onRowSelect}
- />
- {data && data.total > 10 && (
- {
- const size = Number(e.target.value);
- setPageSize(size);
- setCurrentPage(1);
- }}
- />
- )}
- >
- );
- }
-);
diff --git a/src/lib/pages/codes/components/RecentCodesTableFull.tsx b/src/lib/pages/codes/components/RecentCodesTableFull.tsx
new file mode 100644
index 000000000..87a9cd939
--- /dev/null
+++ b/src/lib/pages/codes/components/RecentCodesTableFull.tsx
@@ -0,0 +1,109 @@
+import { Box } from "@chakra-ui/react";
+import { observer } from "mobx-react-lite";
+import { useEffect } from "react";
+import { useForm } from "react-hook-form";
+
+import { useRecentCodes } from "../data";
+import { useCurrentChain, useInternalNavigate } from "lib/app-provider";
+import { FilterByPermission } from "lib/components/forms";
+import { Pagination } from "lib/components/pagination";
+import { usePaginator } from "lib/components/pagination/usePaginator";
+import { EmptyState, ErrorFetching } from "lib/components/state";
+import { CodesTable } from "lib/components/table";
+import type { PermissionFilterValue } from "lib/hooks";
+
+interface RecentCodesState {
+ permissionValue: PermissionFilterValue;
+}
+
+export const RecentCodesTableFull = observer(() => {
+ const navigate = useInternalNavigate();
+ const { address } = useCurrentChain();
+
+ const { watch, setValue } = useForm({
+ defaultValues: {
+ permissionValue: "all",
+ },
+ });
+ const { permissionValue } = watch();
+
+ const {
+ pagesQuantity,
+ setTotalData,
+ currentPage,
+ setCurrentPage,
+ pageSize,
+ setPageSize,
+ offset,
+ } = usePaginator({
+ initialState: {
+ pageSize: 10,
+ currentPage: 1,
+ isDisabled: false,
+ },
+ });
+ const { data, isLoading } = useRecentCodes(
+ pageSize,
+ offset,
+ address,
+ permissionValue,
+ setTotalData
+ );
+
+ const onRowSelect = (codeId: number) =>
+ navigate({
+ pathname: "/codes/[codeId]",
+ query: { codeId },
+ });
+
+ useEffect(() => {
+ setCurrentPage(1);
+ setPageSize(10);
+ }, [permissionValue, setCurrentPage, setPageSize]);
+
+ return (
+ <>
+
+ {
+ if (newVal === permissionValue) return;
+ setValue("permissionValue", newVal);
+ }}
+ />
+
+
+ ) : (
+
+ )
+ }
+ onRowSelect={onRowSelect}
+ />
+ {data && data.total > 10 && (
+ {
+ const size = Number(e.target.value);
+ setPageSize(size);
+ setCurrentPage(1);
+ }}
+ />
+ )}
+ >
+ );
+});
diff --git a/src/lib/pages/codes/components/RecentCodesTableLite.tsx b/src/lib/pages/codes/components/RecentCodesTableLite.tsx
new file mode 100644
index 000000000..b4bc7c19e
--- /dev/null
+++ b/src/lib/pages/codes/components/RecentCodesTableLite.tsx
@@ -0,0 +1,62 @@
+import { Alert, AlertDescription } from "@chakra-ui/react";
+import { observer } from "mobx-react-lite";
+
+import { useRecentCodesLcd } from "../data";
+import { useInternalNavigate } from "lib/app-provider";
+import { LoadNext } from "lib/components/LoadNext";
+import { EmptyState, ErrorFetching } from "lib/components/state";
+import { CodesTable } from "lib/components/table";
+
+export const RecentCodesTableLite = observer(() => {
+ const navigate = useInternalNavigate();
+
+ const {
+ data,
+ error,
+ fetchNextPage,
+ hasNextPage,
+ isLoading,
+ isFetchingNextPage,
+ } = useRecentCodesLcd();
+
+ const onRowSelect = (codeId: number) =>
+ navigate({
+ pathname: "/codes/[codeId]",
+ query: { codeId },
+ });
+
+ return (
+ <>
+ {data && !!error && (
+
+
+ Error fetching data from LCD. Please refresh to try again.
+
+
+ )}
+
+ ) : (
+
+ )
+ }
+ onRowSelect={onRowSelect}
+ />
+ {hasNextPage && (
+
+ )}
+ >
+ );
+});
diff --git a/src/lib/pages/codes/data.ts b/src/lib/pages/codes/data.ts
index 96b0d792f..560ab1d0c 100644
--- a/src/lib/pages/codes/data.ts
+++ b/src/lib/pages/codes/data.ts
@@ -1,6 +1,6 @@
import type { PermissionFilterValue } from "lib/hooks";
import { useCodeStore } from "lib/providers/store";
-import { useCodes } from "lib/services/codeService";
+import { useCodes, useCodesLcd } from "lib/services/wasm/code";
import type { BechAddr20, CodeInfo, Option } from "lib/types";
export const useRecentCodes = (
@@ -36,3 +36,19 @@ export const useRecentCodes = (
isLoading,
};
};
+
+export const useRecentCodesLcd = () => {
+ const { getCodeLocalInfo, isCodeIdSaved } = useCodeStore();
+ const { data, ...rest } = useCodesLcd();
+
+ return {
+ data: data?.pages.flatMap((page) =>
+ page.code_infos.map((code) => ({
+ ...code,
+ name: getCodeLocalInfo(code.id)?.name,
+ isSaved: isCodeIdSaved(code.id),
+ }))
+ ),
+ ...rest,
+ };
+};
diff --git a/src/lib/pages/codes/index.tsx b/src/lib/pages/codes/index.tsx
index 1f96364fe..162c135f5 100644
--- a/src/lib/pages/codes/index.tsx
+++ b/src/lib/pages/codes/index.tsx
@@ -1,33 +1,20 @@
-import { Box } from "@chakra-ui/react";
import { observer } from "mobx-react-lite";
import { useRouter } from "next/router";
import { useEffect } from "react";
-import { useForm } from "react-hook-form";
import { AmpEvent, track } from "lib/amplitude";
-import { useWasmConfig } from "lib/app-provider";
-import { FilterByPermission } from "lib/components/forms";
+import { useTierConfig, useWasmConfig } from "lib/app-provider";
import PageContainer from "lib/components/PageContainer";
import { PageHeader } from "lib/components/PageHeader";
-import type { PermissionFilterValue } from "lib/hooks";
-import { RecentCodesTable } from "./components/RecentCodesTable";
-
-interface RecentCodesState {
- permissionValue: PermissionFilterValue;
-}
+import { RecentCodesTableFull } from "./components/RecentCodesTableFull";
+import { RecentCodesTableLite } from "./components/RecentCodesTableLite";
const RecentCodes = observer(() => {
useWasmConfig({ shouldRedirect: true });
+ const tier = useTierConfig();
const router = useRouter();
- const { watch, setValue } = useForm({
- defaultValues: {
- permissionValue: "all",
- },
- });
- const { permissionValue } = watch();
-
useEffect(() => {
if (router.isReady) track(AmpEvent.TO_CODES);
}, [router.isReady]);
@@ -39,17 +26,7 @@ const RecentCodes = observer(() => {
subtitle="This page displays all codes on this network sorted by recency"
docHref="introduction/overview#recent-codes"
/>
-
- {
- if (newVal === permissionValue) return;
- setValue("permissionValue", newVal);
- }}
- />
-
-
+ {tier === "lite" ? : }
);
});
diff --git a/src/lib/pages/instantiate/instantiate.tsx b/src/lib/pages/instantiate/instantiate.tsx
index 3055596f8..9d1bc8034 100644
--- a/src/lib/pages/instantiate/instantiate.tsx
+++ b/src/lib/pages/instantiate/instantiate.tsx
@@ -47,8 +47,8 @@ import { UserDocsLink } from "lib/components/UserDocsLink";
import WasmPageContainer from "lib/components/WasmPageContainer";
import { useSchemaStore } from "lib/providers/store";
import { useTxBroadcast } from "lib/providers/tx-broadcast";
-import type { CodeIdInfoResponse } from "lib/services/code";
-import { useLCDCodeInfo } from "lib/services/codeService";
+import { useCodeInfoLcd } from "lib/services/wasm/code";
+import type { CodeInfoResponseLcd } from "lib/services/wasm/code";
import type { BechAddr, BechAddr20, ComposedMsg } from "lib/types";
import { MsgType } from "lib/types";
import {
@@ -193,13 +193,13 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => {
},
});
- const { refetch } = useLCDCodeInfo(codeId, {
+ const { refetch } = useCodeInfoLcd(codeId, {
enabled: false,
retry: false,
cacheTime: 0,
onSuccess(data) {
- const permission = data.code_info.instantiate_permission;
- setValue("codeHash", data.code_info.data_hash.toLowerCase());
+ const permission = data.codeInfo.instantiatePermission;
+ setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
if (
resolvePermission(
address,
@@ -417,8 +417,8 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => {
setValue("codeId", code);
resetMsgInputSchema();
}}
- setCodeHash={(data: CodeIdInfoResponse) => {
- setValue("codeHash", data.code_info.data_hash.toLowerCase());
+ setCodeHash={(data: CodeInfoResponseLcd) => {
+ setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
}}
codeId={codeId}
/>
diff --git a/src/lib/pages/migrate/components/MigrateContract.tsx b/src/lib/pages/migrate/components/MigrateContract.tsx
index 84355915e..0477f8762 100644
--- a/src/lib/pages/migrate/components/MigrateContract.tsx
+++ b/src/lib/pages/migrate/components/MigrateContract.tsx
@@ -27,8 +27,8 @@ import {
import { CodeSelectSection } from "lib/components/select-code";
import { useSchemaStore } from "lib/providers/store";
import { useTxBroadcast } from "lib/providers/tx-broadcast";
-import type { CodeIdInfoResponse } from "lib/services/code";
-import { useLCDCodeInfo } from "lib/services/codeService";
+import type { CodeInfoResponseLcd } from "lib/services/wasm/code";
+import { useCodeInfoLcd } from "lib/services/wasm/code";
import type { BechAddr32, ComposedMsg } from "lib/types";
import { MsgType } from "lib/types";
import { composeMsg, isId, jsonValidate, resolvePermission } from "lib/utils";
@@ -120,13 +120,13 @@ export const MigrateContract = ({
},
});
- const { refetch } = useLCDCodeInfo(codeId, {
+ const { refetch } = useCodeInfoLcd(codeId, {
enabled: false,
retry: false,
cacheTime: 0,
onSuccess(data) {
- const permission = data.code_info.instantiate_permission;
- setValue("codeHash", data.code_info.data_hash.toLowerCase());
+ const permission = data.codeInfo.instantiatePermission;
+ setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
if (
resolvePermission(
address,
@@ -256,8 +256,8 @@ export const MigrateContract = ({
setValue("codeId", code);
resetMsgInputSchema();
}}
- setCodeHash={(data: CodeIdInfoResponse) => {
- setValue("codeHash", data.code_info.data_hash.toLowerCase());
+ setCodeHash={(data: CodeInfoResponseLcd) => {
+ setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
}}
codeId={codeId}
/>
diff --git a/src/lib/services/contractService.ts b/src/lib/services/contractService.ts
index 99929040e..c6971e9c8 100644
--- a/src/lib/services/contractService.ts
+++ b/src/lib/services/contractService.ts
@@ -19,7 +19,6 @@ import {
import type { ContractLocalInfo } from "lib/stores/contract";
import type { BechAddr, BechAddr20, BechAddr32, Dict, Option } from "lib/types";
-import { getCodeIdInfo } from "./code";
import {
getAdminContractsByAddress,
getContractDataByContractAddress,
@@ -36,6 +35,7 @@ import type {
ContractTableCounts,
MigrationHistoriesResponse,
} from "./contract";
+import { getCodeIdInfoLcd } from "./wasm/code";
export interface ContractDetail extends ContractLocalInfo {
codeId: number;
@@ -57,10 +57,10 @@ export const useContractDetailByContractAddress = (
.then(async ({ contracts_by_pk }) => {
if (!contracts_by_pk) throw Error("Contract not found");
// TODO: retrieve code hash from gql instead when available
- const codeHash = await getCodeIdInfo(
+ const codeHash = await getCodeIdInfoLcd(
lcdEndpoint,
contracts_by_pk.code_id
- ).then((data) => data.code_info.data_hash);
+ ).then((data) => data.codeInfo.dataHash);
return {
contractAddress,
codeId: contracts_by_pk.code_id,
diff --git a/src/lib/services/contractState.ts b/src/lib/services/contractState.ts
index 681239f27..9cd825340 100644
--- a/src/lib/services/contractState.ts
+++ b/src/lib/services/contractState.ts
@@ -1,7 +1,7 @@
import axios from "axios";
import { z } from "zod";
-import type { BechAddr32, ContractState } from "lib/types";
+import type { BechAddr32, ContractState, Option } from "lib/types";
import { zPagination } from "lib/types/rest";
import {
libDecode,
@@ -24,13 +24,13 @@ export const getContractStates = async (
baseEndpoint: string,
contractAddress: BechAddr32,
numStatesToLoad: number,
- paginationKey: string | null
+ paginationKey: Option
) => {
const states = await axios
.get(`${baseEndpoint}/${contractAddress}/states`, {
params: {
limit: numStatesToLoad,
- pagination_key: paginationKey,
+ "pagination.key": paginationKey,
},
})
.then(({ data }) => parseWithError(zResponseContractStates, data));
@@ -44,6 +44,6 @@ export const getContractStates = async (
return {
states: parsedStates,
rawStates: states.models,
- nextKey: states.pagination.next_key,
+ nextKey: states.pagination.nextKey,
};
};
diff --git a/src/lib/services/move/module.ts b/src/lib/services/move/module.ts
index 961d8ce6f..53b285759 100644
--- a/src/lib/services/move/module.ts
+++ b/src/lib/services/move/module.ts
@@ -60,7 +60,7 @@ export const getAccountModules = async (
}`
);
result.push(...data.modules);
- if (data.pagination.next_key) await fetchFn(data.pagination.next_key);
+ if (data.pagination.nextKey) await fetchFn(data.pagination.nextKey);
};
await fetchFn(null);
diff --git a/src/lib/services/searchService.ts b/src/lib/services/searchService.ts
index 3d95d047c..a659568b2 100644
--- a/src/lib/services/searchService.ts
+++ b/src/lib/services/searchService.ts
@@ -20,7 +20,6 @@ import {
} from "lib/utils";
import { useBlockData } from "./blockService";
-import { useCodeDataByCodeId } from "./codeService";
import { queryContract } from "./contract";
import { useAccountModules } from "./move/moduleService";
import { useAddressByICNSName, useICNSNamesByAddress } from "./nameService";
@@ -29,6 +28,7 @@ import { usePoolByPoolId } from "./poolService";
import { useProposalData } from "./proposalService";
import { useTxData } from "./txService";
import { useValidatorData } from "./validatorService";
+import { useCodeDataByCodeId } from "./wasm/code";
export type SearchResultType =
| "Code ID"
diff --git a/src/lib/services/wasm/code/api.ts b/src/lib/services/wasm/code/api.ts
new file mode 100644
index 000000000..da3ae7f53
--- /dev/null
+++ b/src/lib/services/wasm/code/api.ts
@@ -0,0 +1,105 @@
+import type { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
+import { useQuery } from "@tanstack/react-query";
+import axios from "axios";
+
+import {
+ CELATONE_QUERY_KEYS,
+ useBaseApiRoute,
+ useGovConfig,
+} from "lib/app-provider";
+import type { BechAddr, BechAddr20, Option } from "lib/types";
+import { parseWithError } from "lib/utils";
+
+import { zCodeData, zCodesResponse } from "./types";
+import type { CodeData, CodesResponse } from "./types";
+
+const getCodes = async (
+ endpoint: string,
+ limit: number,
+ offset: number,
+ address: Option,
+ permission: Option
+): Promise =>
+ axios
+ .get(`${endpoint}`, {
+ params: {
+ limit,
+ offset,
+ address,
+ permission,
+ },
+ })
+ .then(({ data }) => parseWithError(zCodesResponse, data));
+
+export const useCodes = (
+ limit: number,
+ offset: number,
+ address: Option,
+ permission: Option,
+ options?: Pick, "onSuccess">
+): UseQueryResult => {
+ const endpoint = useBaseApiRoute("codes");
+
+ return useQuery(
+ [CELATONE_QUERY_KEYS.CODES, endpoint, limit, offset, address, permission],
+ async () => getCodes(endpoint, limit, offset, address, permission),
+ { retry: 1, refetchOnWindowFocus: false, ...options }
+ );
+};
+
+const getCodesByAddress = async (
+ endpoint: string,
+ address: BechAddr,
+ limit: number,
+ offset: number
+): Promise =>
+ axios
+ .get(`${endpoint}/${encodeURIComponent(address)}/wasm/codes`, {
+ params: {
+ limit,
+ offset,
+ },
+ })
+ .then(({ data }) => zCodesResponse.parse(data));
+
+export const useCodesByAddress = (
+ address: BechAddr,
+ limit: number,
+ offset: number
+): UseQueryResult => {
+ const endpoint = useBaseApiRoute("accounts");
+
+ return useQuery(
+ [CELATONE_QUERY_KEYS.CODES_BY_ADDRESS, endpoint, address, limit, offset],
+ async () => getCodesByAddress(endpoint, address, limit, offset),
+ { retry: 1, refetchOnWindowFocus: false }
+ );
+};
+
+const getCodeDataByCodeId = async (
+ endpoint: string,
+ codeId: number,
+ isGov: boolean
+): Promise =>
+ axios
+ .get(`${endpoint}/${codeId}/info`, {
+ params: {
+ is_gov: isGov,
+ },
+ })
+ .then(({ data }) => parseWithError(zCodeData, data));
+
+export const useCodeDataByCodeId = (codeId: number, enabled = true) => {
+ const { enabled: isGov } = useGovConfig({ shouldRedirect: false });
+ const endpoint = useBaseApiRoute("codes");
+
+ return useQuery(
+ [CELATONE_QUERY_KEYS.CODE_DATA, endpoint, codeId, isGov],
+ async () => getCodeDataByCodeId(endpoint, codeId, isGov),
+ {
+ retry: 1,
+ refetchOnWindowFocus: false,
+ enabled,
+ }
+ );
+};
diff --git a/src/lib/services/codeService.ts b/src/lib/services/wasm/code/gql.ts
similarity index 52%
rename from src/lib/services/codeService.ts
rename to src/lib/services/wasm/code/gql.ts
index 185ef9874..387aa7253 100644
--- a/src/lib/services/codeService.ts
+++ b/src/lib/services/wasm/code/gql.ts
@@ -1,14 +1,8 @@
-/* eslint-disable sonarjs/no-identical-functions */
-import type { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
+import type { UseQueryResult } from "@tanstack/react-query";
import { useQuery } from "@tanstack/react-query";
import { useCallback } from "react";
-import {
- CELATONE_QUERY_KEYS,
- useBaseApiRoute,
- useCelatoneApp,
- useGovConfig,
-} from "lib/app-provider";
+import { CELATONE_QUERY_KEYS, useCelatoneApp } from "lib/app-provider";
import {
getCodeListByIDsQueryDocument,
getCodeListByUserQueryDocument,
@@ -21,15 +15,6 @@ import type {
Option,
PermissionAddresses,
} from "lib/types";
-import { isId } from "lib/utils";
-
-import type { CodeData, CodeIdInfoResponse, CodesResponse } from "./code";
-import {
- getCodeDataByCodeId,
- getCodeIdInfo,
- getCodes,
- getCodesByAddress,
-} from "./code";
export const useCodeListByWalletAddress = (
walletAddr: Option
@@ -107,66 +92,3 @@ export const useCodeListByCodeIds = (
}
);
};
-
-export const useCodeDataByCodeId = (codeId: number, enabled = true) => {
- const { enabled: isGov } = useGovConfig({ shouldRedirect: false });
- const endpoint = useBaseApiRoute("codes");
-
- return useQuery(
- [CELATONE_QUERY_KEYS.CODE_DATA, endpoint, codeId, isGov],
- async () => getCodeDataByCodeId(endpoint, codeId, isGov),
- {
- retry: 1,
- refetchOnWindowFocus: false,
- enabled,
- }
- );
-};
-
-export const useCodes = (
- limit: number,
- offset: number,
- address: Option,
- permission: Option,
- options?: Pick, "onSuccess">
-): UseQueryResult => {
- const endpoint = useBaseApiRoute("codes");
-
- return useQuery(
- [CELATONE_QUERY_KEYS.CODES, endpoint, limit, offset, address, permission],
- async () => getCodes(endpoint, limit, offset, address, permission),
- { retry: 1, refetchOnWindowFocus: false, ...options }
- );
-};
-
-export const useCodesByAddress = (
- address: BechAddr,
- limit: number,
- offset: number
-): UseQueryResult => {
- const endpoint = useBaseApiRoute("accounts");
-
- return useQuery(
- [CELATONE_QUERY_KEYS.CODES_BY_ADDRESS, endpoint, address, limit, offset],
- async () => getCodesByAddress(endpoint, address, limit, offset),
- { retry: 1, refetchOnWindowFocus: false }
- );
-};
-
-export type LCDCodeInfoSuccessCallback = (data: CodeIdInfoResponse) => void;
-
-export const useLCDCodeInfo = (
- codeId: string,
- options?: Omit, "queryKey">
-) => {
- const lcdEndpoint = useBaseApiRoute("rest");
- const queryFn = async () => {
- if (!isId(codeId)) throw new Error("Invalid code ID");
- return getCodeIdInfo(lcdEndpoint, Number(codeId));
- };
- return useQuery(
- [CELATONE_QUERY_KEYS.CODE_INFO, lcdEndpoint, codeId],
- queryFn,
- options
- );
-};
diff --git a/src/lib/services/wasm/code/index.ts b/src/lib/services/wasm/code/index.ts
new file mode 100644
index 000000000..bf74e6f68
--- /dev/null
+++ b/src/lib/services/wasm/code/index.ts
@@ -0,0 +1,4 @@
+export * from "./api";
+export * from "./gql";
+export * from "./lcd";
+export * from "./types";
diff --git a/src/lib/services/wasm/code/lcd.ts b/src/lib/services/wasm/code/lcd.ts
new file mode 100644
index 000000000..f2db12568
--- /dev/null
+++ b/src/lib/services/wasm/code/lcd.ts
@@ -0,0 +1,65 @@
+import type { UseQueryOptions } from "@tanstack/react-query";
+import { useInfiniteQuery, useQuery } from "@tanstack/react-query";
+import axios from "axios";
+
+import {
+ CELATONE_QUERY_KEYS,
+ useBaseApiRoute,
+ useLCDEndpoint,
+} from "lib/app-provider";
+import type { Option } from "lib/types";
+import { isId, parseWithError } from "lib/utils";
+
+import { zCodeInfoResponseLcd, zCodesResponseLcd } from "./types";
+import type { CodeInfoResponseLcd, CodesResponseLcd } from "./types";
+
+export const getCodeIdInfoLcd = async (
+ endpoint: string,
+ id: number
+): Promise =>
+ axios
+ .get(`${endpoint}/cosmwasm/wasm/v1/code/${id}`)
+ .then(({ data }) => parseWithError(zCodeInfoResponseLcd, data));
+
+export const useCodeInfoLcd = (
+ codeId: string,
+ options?: Omit, "queryKey">
+) => {
+ const lcdEndpoint = useBaseApiRoute("rest");
+ const queryFn = async () => {
+ if (!isId(codeId)) throw new Error("Invalid code ID");
+ return getCodeIdInfoLcd(lcdEndpoint, Number(codeId));
+ };
+ return useQuery(
+ [CELATONE_QUERY_KEYS.CODE_INFO, lcdEndpoint, codeId],
+ queryFn,
+ options
+ );
+};
+
+const getCodesLcd = async (
+ endpoint: string,
+ paginationKey: Option
+): Promise =>
+ axios
+ .get(`${endpoint}/cosmwasm/wasm/v1/code`, {
+ params: {
+ "pagination.limit": 10,
+ "pagination.reverse": true,
+ "pagination.key": paginationKey,
+ },
+ })
+ .then(({ data }) => parseWithError(zCodesResponseLcd, data));
+
+export const useCodesLcd = () => {
+ const endpoint = useLCDEndpoint();
+
+ return useInfiniteQuery(
+ [CELATONE_QUERY_KEYS.CODES, endpoint],
+ ({ pageParam }) => getCodesLcd(endpoint, pageParam),
+ {
+ getNextPageParam: (lastPage) => lastPage.pagination.nextKey ?? undefined,
+ refetchOnWindowFocus: false,
+ }
+ );
+};
diff --git a/src/lib/services/code.ts b/src/lib/services/wasm/code/types.ts
similarity index 58%
rename from src/lib/services/code.ts
rename to src/lib/services/wasm/code/types.ts
index 8c63a6772..9ff1db597 100644
--- a/src/lib/services/code.ts
+++ b/src/lib/services/wasm/code/types.ts
@@ -1,43 +1,55 @@
-import axios from "axios";
import { z } from "zod";
+import type { CodeInfo } from "lib/types";
import {
AccessConfigPermission,
zBechAddr,
zProjectInfo,
zPublicCodeInfo,
} from "lib/types";
-import type { BechAddr, BechAddr20, CodeInfo, Option } from "lib/types";
-import {
- parseDate,
- parseTxHash,
- parseWithError,
- snakeToCamel,
-} from "lib/utils";
+import { zPagination } from "lib/types/rest";
+import { parseDate, parseTxHash, snakeToCamel } from "lib/utils";
-export interface CodeIdInfoResponse {
- code_info: {
- code_id: string;
- creator: BechAddr;
- data_hash: string;
- instantiate_permission: {
- permission: AccessConfigPermission;
- address: BechAddr;
- addresses: BechAddr[];
- };
- };
- data: string;
-}
+export const zCodeInfoResponseLcd = z
+ .object({
+ code_info: z.object({
+ code_id: z.string(),
+ creator: zBechAddr,
+ data_hash: z.string(),
+ instantiate_permission: z.object({
+ permission: z.nativeEnum(AccessConfigPermission),
+ address: zBechAddr,
+ addresses: z.array(zBechAddr),
+ }),
+ }),
+ })
+ .transform(snakeToCamel);
+export type CodeInfoResponseLcd = z.infer;
-export const getCodeIdInfo = async (
- endpoint: string,
- id: number
-): Promise => {
- const { data } = await axios.get(
- `${endpoint}/cosmwasm/wasm/v1/code/${id}`
- );
- return data;
-};
+const zCodesResponseItemLcd = z
+ .object({
+ code_id: z.coerce.number(),
+ creator: zBechAddr,
+ instantiate_permission: z.object({
+ permission: z.nativeEnum(AccessConfigPermission),
+ addresses: z.array(zBechAddr),
+ }),
+ })
+ .transform((val) => ({
+ id: val.code_id,
+ cw2Contract: undefined,
+ cw2Version: undefined,
+ uploader: val.creator,
+ contractCount: undefined,
+ instantiatePermission: val.instantiate_permission.permission,
+ permissionAddresses: val.instantiate_permission.addresses,
+ }));
+
+export const zCodesResponseLcd = z.object({
+ code_infos: z.array(zCodesResponseItemLcd),
+ pagination: zPagination,
+});
+export type CodesResponseLcd = z.infer;
const zCodesResponseItem = z
.object({
@@ -59,46 +71,12 @@ const zCodesResponseItem = z
permissionAddresses: val.permission_addresses,
}));
-const zCodesResponse = z.object({
+export const zCodesResponse = z.object({
items: z.array(zCodesResponseItem),
total: z.number().nonnegative(),
});
-
export type CodesResponse = z.infer;
-export const getCodes = async (
- endpoint: string,
- limit: number,
- offset: number,
- address: Option,
- permission: Option
-): Promise =>
- axios
- .get(`${endpoint}`, {
- params: {
- limit,
- offset,
- address,
- permission,
- },
- })
- .then(({ data }) => parseWithError(zCodesResponse, data));
-
-export const getCodesByAddress = async (
- endpoint: string,
- address: BechAddr,
- limit: number,
- offset: number
-): Promise =>
- axios
- .get(`${endpoint}/${encodeURIComponent(address)}/wasm/codes`, {
- params: {
- limit,
- offset,
- },
- })
- .then(({ data }) => zCodesResponse.parse(data));
-
const zCode = z
.object({
code_id: z.number().positive(),
@@ -149,25 +127,11 @@ const zCode = z
export type Code = z.infer;
-const zCodeData = z
+export const zCodeData = z
.object({
info: zCode,
project_info: zProjectInfo.nullable(),
public_info: zPublicCodeInfo.nullable(),
})
.transform(snakeToCamel);
-
export type CodeData = z.infer;
-
-export const getCodeDataByCodeId = async (
- endpoint: string,
- codeId: number,
- isGov: boolean
-): Promise =>
- axios
- .get(`${endpoint}/${codeId}/info`, {
- params: {
- is_gov: isGov,
- },
- })
- .then(({ data }) => parseWithError(zCodeData, data));
diff --git a/src/lib/types/rest.ts b/src/lib/types/rest.ts
index 9d9d96761..937a50f36 100644
--- a/src/lib/types/rest.ts
+++ b/src/lib/types/rest.ts
@@ -1,7 +1,11 @@
import { z } from "zod";
-export const zPagination = z.object({
- next_key: z.string().nullable(),
- total: z.coerce.number(),
-});
+import { snakeToCamel } from "lib/utils";
+
+export const zPagination = z
+ .object({
+ next_key: z.string().nullable(),
+ total: z.coerce.number(),
+ })
+ .transform(snakeToCamel);
export type Pagination = z.infer;
From cff4800b60b4422a92f8511fbb3350f38c0cdf36 Mon Sep 17 00:00:00 2001
From: songwongtp <16089160+songwongtp@users.noreply.github.com>
Date: Mon, 29 Apr 2024 15:39:03 +0700
Subject: [PATCH 2/7] fix: handle instantiate permission
---
src/lib/components/modal/code/SaveNewCode.tsx | 4 +---
src/lib/components/select-code/CodeSelect.tsx | 2 +-
.../select-code/CodeSelectSection.tsx | 2 +-
src/lib/pages/instantiate/instantiate.tsx | 7 +------
.../migrate/components/MigrateContract.tsx | 7 +------
src/lib/services/wasm/code/types.ts | 18 +++++++++++++++---
src/lib/utils/codePermission.ts | 7 ++-----
7 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/src/lib/components/modal/code/SaveNewCode.tsx b/src/lib/components/modal/code/SaveNewCode.tsx
index 072f5bbca..01087d0b9 100644
--- a/src/lib/components/modal/code/SaveNewCode.tsx
+++ b/src/lib/components/modal/code/SaveNewCode.tsx
@@ -63,9 +63,7 @@ export function SaveNewCodeModal({ buttonProps }: SaveNewCodeModalProps) {
const { message, messageColor } = getPermissionHelper(
address,
data.codeInfo.instantiatePermission.permission,
- data.codeInfo.instantiatePermission.address
- ? [data.codeInfo.instantiatePermission.address]
- : data.codeInfo.instantiatePermission.addresses
+ data.codeInfo.instantiatePermission.addresses
);
setCodeIdStatus({
state: "success",
diff --git a/src/lib/components/select-code/CodeSelect.tsx b/src/lib/components/select-code/CodeSelect.tsx
index 54ff841bd..b63e5acb3 100644
--- a/src/lib/components/select-code/CodeSelect.tsx
+++ b/src/lib/components/select-code/CodeSelect.tsx
@@ -15,7 +15,7 @@ import { CodeSelectDrawerButton } from "./CodeSelectDrawerButton";
interface CodeSelectProps extends Omit {
onCodeSelect: (code: string) => void;
- setCodeHash?: (data: CodeInfoResponseLcd) => void;
+ setCodeHash: (data: CodeInfoResponseLcd) => void;
codeId: string;
status: FormStatus;
}
diff --git a/src/lib/components/select-code/CodeSelectSection.tsx b/src/lib/components/select-code/CodeSelectSection.tsx
index da57009ae..81f711744 100644
--- a/src/lib/components/select-code/CodeSelectSection.tsx
+++ b/src/lib/components/select-code/CodeSelectSection.tsx
@@ -16,7 +16,7 @@ interface CodeSelectSectionProps {
control: Control;
error: Option;
onCodeSelect: (codeId: string) => void;
- setCodeHash?: (data: CodeInfoResponseLcd) => void;
+ setCodeHash: (data: CodeInfoResponseLcd) => void;
status: FormStatus;
}
diff --git a/src/lib/pages/instantiate/instantiate.tsx b/src/lib/pages/instantiate/instantiate.tsx
index 9d1bc8034..47986d003 100644
--- a/src/lib/pages/instantiate/instantiate.tsx
+++ b/src/lib/pages/instantiate/instantiate.tsx
@@ -201,12 +201,7 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => {
const permission = data.codeInfo.instantiatePermission;
setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
if (
- resolvePermission(
- address,
- permission.permission,
- permission.addresses,
- permission.address
- )
+ resolvePermission(address, permission.permission, permission.addresses)
)
setStatus({ state: "success" });
else {
diff --git a/src/lib/pages/migrate/components/MigrateContract.tsx b/src/lib/pages/migrate/components/MigrateContract.tsx
index 0477f8762..2d134d317 100644
--- a/src/lib/pages/migrate/components/MigrateContract.tsx
+++ b/src/lib/pages/migrate/components/MigrateContract.tsx
@@ -128,12 +128,7 @@ export const MigrateContract = ({
const permission = data.codeInfo.instantiatePermission;
setValue("codeHash", data.codeInfo.dataHash.toLowerCase());
if (
- resolvePermission(
- address,
- permission.permission,
- permission.addresses,
- permission.address
- )
+ resolvePermission(address, permission.permission, permission.addresses)
)
setStatus({ state: "success" });
else {
diff --git a/src/lib/services/wasm/code/types.ts b/src/lib/services/wasm/code/types.ts
index 9ff1db597..ec049a8b0 100644
--- a/src/lib/services/wasm/code/types.ts
+++ b/src/lib/services/wasm/code/types.ts
@@ -18,12 +18,24 @@ export const zCodeInfoResponseLcd = z
data_hash: z.string(),
instantiate_permission: z.object({
permission: z.nativeEnum(AccessConfigPermission),
- address: zBechAddr,
- addresses: z.array(zBechAddr),
+ address: zBechAddr.optional(),
+ addresses: z.array(zBechAddr).default([]),
}),
}),
})
- .transform(snakeToCamel);
+ .transform(({ code_info: { instantiate_permission, ...rest } }) => ({
+ codeInfo: {
+ ...snakeToCamel(rest),
+ instantiatePermission: {
+ permission: instantiate_permission.permission,
+ addresses:
+ instantiate_permission.address &&
+ instantiate_permission.address !== ""
+ ? [instantiate_permission.address]
+ : instantiate_permission.addresses,
+ },
+ },
+ }));
export type CodeInfoResponseLcd = z.infer;
const zCodesResponseItemLcd = z
diff --git a/src/lib/utils/codePermission.ts b/src/lib/utils/codePermission.ts
index 1f0187f1c..6cffac44e 100644
--- a/src/lib/utils/codePermission.ts
+++ b/src/lib/utils/codePermission.ts
@@ -6,13 +6,10 @@ import { truncate } from "./truncate";
export const resolvePermission = (
address: Option,
permission: AccessConfigPermission = AccessConfigPermission.UNKNOWN,
- permissionAddresses: PermissionAddresses = [],
- permissionAddress = ""
+ permissionAddresses: PermissionAddresses = []
): boolean =>
permission === AccessConfigPermission.EVERYBODY ||
- (address
- ? permissionAddresses.includes(address) || permissionAddress === address
- : false);
+ (address ? permissionAddresses.includes(address) : false);
export const getPermissionHelper = (
address: Option,
From f3ee76f63cc72de601867a962f6fed6fd2f183ee Mon Sep 17 00:00:00 2001
From: songwongtp <16089160+songwongtp@users.noreply.github.com>
Date: Mon, 29 Apr 2024 15:46:01 +0700
Subject: [PATCH 3/7] fix: change lcd pisco
---
src/config/chain/terra.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/config/chain/terra.ts b/src/config/chain/terra.ts
index f49b03908..86cc15746 100644
--- a/src/config/chain/terra.ts
+++ b/src/config/chain/terra.ts
@@ -105,7 +105,7 @@ export const TERRA_CHAIN_CONFIGS: ChainConfigs = {
chain: "terra",
registryChainName: "terra2testnet",
prettyName: "Terra Testnet",
- lcd: "https://pisco-lcd.terra.dev:443",
+ lcd: "https://terra-testnet-api.polkachu.com",
rpc: "https://terra-testnet-rpc.polkachu.com:443",
indexer: "https://pisco-1-graphql.alleslabs.dev/v1/graphql",
wallets: [...staionWallets, ...keplrWallets],
From c1e293b9917eee421f1eb2958255add2fc60baeb Mon Sep 17 00:00:00 2001
From: songwongtp <16089160+songwongtp@users.noreply.github.com>
Date: Mon, 29 Apr 2024 15:52:52 +0700
Subject: [PATCH 4/7] fix: change log
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8125115ef..030f324e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -39,7 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Features
-- [#900](https://github.com/alleslabs/celatone-frontend/pull/900) Support lite version recent codes
+- [#901](https://github.com/alleslabs/celatone-frontend/pull/901) Support lite version recent codes
- [#897](https://github.com/alleslabs/celatone-frontend/pull/897) Add config for lite version support
### Improvements
From 14d6ee19397afb5960f6f7fb2e05a4231c423c71 Mon Sep 17 00:00:00 2001
From: songwongtp <16089160+songwongtp@users.noreply.github.com>
Date: Mon, 29 Apr 2024 16:15:14 +0700
Subject: [PATCH 5/7] fix: mobile card
---
src/lib/components/table/codes/CodesTable.tsx | 13 +++--
.../table/codes/CodesTableHeader.tsx | 10 +++-
.../table/codes/CodesTableMobileCard.tsx | 48 +++++++++++--------
.../components/table/codes/CodesTableRow.tsx | 42 +++++++++-------
.../components/tables/StoredCodesTable.tsx | 14 ++----
.../codes/components/RecentCodesTableFull.tsx | 16 +++----
.../codes/components/RecentCodesTableLite.tsx | 17 +++----
7 files changed, 86 insertions(+), 74 deletions(-)
diff --git a/src/lib/components/table/codes/CodesTable.tsx b/src/lib/components/table/codes/CodesTable.tsx
index d204184af..7e707d3e6 100644
--- a/src/lib/components/table/codes/CodesTable.tsx
+++ b/src/lib/components/table/codes/CodesTable.tsx
@@ -1,6 +1,7 @@
import { MobileTableContainer, TableContainer } from "../tableComponents";
import { useMobile } from "lib/app-provider";
import { Loading } from "lib/components/Loading";
+import { ErrorFetching } from "lib/components/state";
import type { CodeInfo, Option } from "lib/types";
import { CodesTableHeader } from "./CodesTableHeader";
@@ -13,6 +14,7 @@ interface CodesTableProps {
emptyState: JSX.Element;
onRowSelect: (codeId: number) => void;
isReadOnly?: boolean;
+ showCw2andContracts?: boolean;
}
export const CodesTable = ({
@@ -21,15 +23,15 @@ export const CodesTable = ({
emptyState,
onRowSelect,
isReadOnly = false,
+ showCw2andContracts = true,
}: CodesTableProps) => {
const isMobile = useMobile();
if (isLoading) return ;
- if (!codes?.length) return emptyState;
+ if (!codes) return ;
+ if (!codes.length) return emptyState;
- const templateColumns = isReadOnly
- ? "max(100px) minmax(250px, 1fr) minmax(200px, 1fr) max(100px) max(160px) 150px"
- : "max(100px) minmax(250px, 1fr) minmax(200px, 1fr) max(100px) max(160px) 150px 180px";
+ const templateColumns = `max(100px) minmax(250px, 1fr)${showCw2andContracts ? " minmax(200px, 1fr) max(100px)" : ""} max(160px) 150px ${!isReadOnly ? " 180px" : ""}`;
return isMobile ? (
@@ -37,6 +39,7 @@ export const CodesTable = ({
))}
@@ -45,6 +48,7 @@ export const CodesTable = ({
{codes.map((code) => (
))}
diff --git a/src/lib/components/table/codes/CodesTableHeader.tsx b/src/lib/components/table/codes/CodesTableHeader.tsx
index 6268171bb..daee209b2 100644
--- a/src/lib/components/table/codes/CodesTableHeader.tsx
+++ b/src/lib/components/table/codes/CodesTableHeader.tsx
@@ -6,15 +6,21 @@ import { TableHeader } from "../tableComponents";
export const CodesTableHeader = ({
templateColumns,
isReadOnly,
+ showCw2andContracts,
}: {
templateColumns: GridProps["templateColumns"];
isReadOnly: boolean;
+ showCw2andContracts: boolean;
}) => (
Code ID
Code Name
- CW2 Info
- Contracts
+ {showCw2andContracts && (
+ <>
+ CW2 Info
+ Contracts
+ >
+ )}
Uploader
Permission
{!isReadOnly && }
diff --git a/src/lib/components/table/codes/CodesTableMobileCard.tsx b/src/lib/components/table/codes/CodesTableMobileCard.tsx
index 3c8205f5b..1634f03c3 100644
--- a/src/lib/components/table/codes/CodesTableMobileCard.tsx
+++ b/src/lib/components/table/codes/CodesTableMobileCard.tsx
@@ -12,9 +12,11 @@ import { CodeNameCell } from "./CodeNameCell";
interface CodesTableMobileCardProps {
codeInfo: CodeInfo;
+ showCw2andContracts: boolean;
}
export const CodesTableMobileCard = ({
codeInfo,
+ showCw2andContracts,
}: CodesTableMobileCardProps) => {
const cw2Info = getCw2Info(codeInfo.cw2Contract, codeInfo.cw2Version);
const navigate = useInternalNavigate();
@@ -43,31 +45,35 @@ export const CodesTableMobileCard = ({
-
-
- e.stopPropagation()}
- >
- {cw2Info ?? "N/A"}
-
-
+ {showCw2andContracts && (
+
+
+ e.stopPropagation()}
+ >
+ {cw2Info ?? "N/A"}
+
+
+ )}
}
bottomContent={
-
-
- e.stopPropagation()}
- cursor="text"
- color={codeInfo.contractCount ? "text.main" : "text.disabled"}
- >
- {codeInfo.contractCount ?? "N/A"}
-
-
+ {showCw2andContracts && (
+
+
+ e.stopPropagation()}
+ cursor="text"
+ color={codeInfo.contractCount ? "text.main" : "text.disabled"}
+ >
+ {codeInfo.contractCount ?? "N/A"}
+
+
+ )}
void;
isReadOnly: boolean;
+ showCw2andContracts: boolean;
}
export const CodesTableRow = ({
@@ -23,6 +24,7 @@ export const CodesTableRow = ({
templateColumns,
onRowSelect,
isReadOnly,
+ showCw2andContracts,
}: CodesTableRowProps) => {
const getAddressType = useGetAddressType();
const cw2Info = getCw2Info(codeInfo.cw2Contract, codeInfo.cw2Version);
@@ -45,24 +47,28 @@ export const CodesTableRow = ({
-
-
- {cw2Info ?? "N/A"}
-
-
-
- e.stopPropagation()}
- cursor="text"
- color={codeInfo.contractCount ? "text.main" : "text.disabled"}
- >
- {codeInfo.contractCount ?? "N/A"}
-
-
+ {showCw2andContracts && (
+ <>
+
+
+ {cw2Info ?? "N/A"}
+
+
+
+ e.stopPropagation()}
+ cursor="text"
+ color={codeInfo.contractCount ? "text.main" : "text.disabled"}
+ >
+ {codeInfo.contractCount ?? "N/A"}
+
+
+ >
+ )}
- ) : (
-
- )
+
}
onRowSelect={onRowSelect}
/>
diff --git a/src/lib/pages/codes/components/RecentCodesTableFull.tsx b/src/lib/pages/codes/components/RecentCodesTableFull.tsx
index 87a9cd939..e18e1eb02 100644
--- a/src/lib/pages/codes/components/RecentCodesTableFull.tsx
+++ b/src/lib/pages/codes/components/RecentCodesTableFull.tsx
@@ -8,7 +8,7 @@ import { useCurrentChain, useInternalNavigate } from "lib/app-provider";
import { FilterByPermission } from "lib/components/forms";
import { Pagination } from "lib/components/pagination";
import { usePaginator } from "lib/components/pagination/usePaginator";
-import { EmptyState, ErrorFetching } from "lib/components/state";
+import { EmptyState } from "lib/components/state";
import { CodesTable } from "lib/components/table";
import type { PermissionFilterValue } from "lib/hooks";
@@ -77,15 +77,11 @@ export const RecentCodesTableFull = observer(() => {
codes={data?.items}
isLoading={isLoading}
emptyState={
- data ? (
-
- ) : (
-
- )
+
}
onRowSelect={onRowSelect}
/>
diff --git a/src/lib/pages/codes/components/RecentCodesTableLite.tsx b/src/lib/pages/codes/components/RecentCodesTableLite.tsx
index b4bc7c19e..1507926a9 100644
--- a/src/lib/pages/codes/components/RecentCodesTableLite.tsx
+++ b/src/lib/pages/codes/components/RecentCodesTableLite.tsx
@@ -4,7 +4,7 @@ import { observer } from "mobx-react-lite";
import { useRecentCodesLcd } from "../data";
import { useInternalNavigate } from "lib/app-provider";
import { LoadNext } from "lib/components/LoadNext";
-import { EmptyState, ErrorFetching } from "lib/components/state";
+import { EmptyState } from "lib/components/state";
import { CodesTable } from "lib/components/table";
export const RecentCodesTableLite = observer(() => {
@@ -38,17 +38,14 @@ export const RecentCodesTableLite = observer(() => {
codes={data}
isLoading={isLoading}
emptyState={
- data ? (
-
- ) : (
-
- )
+
}
onRowSelect={onRowSelect}
+ showCw2andContracts={false}
/>
{hasNextPage && (
Date: Mon, 29 Apr 2024 16:22:26 +0700
Subject: [PATCH 6/7] feat: mobile
---
.../table/codes/CodesTableMobileCard.tsx | 57 +++++++++++--------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/src/lib/components/table/codes/CodesTableMobileCard.tsx b/src/lib/components/table/codes/CodesTableMobileCard.tsx
index 1634f03c3..63a578bd3 100644
--- a/src/lib/components/table/codes/CodesTableMobileCard.tsx
+++ b/src/lib/components/table/codes/CodesTableMobileCard.tsx
@@ -45,23 +45,34 @@ export const CodesTableMobileCard = ({
- {showCw2andContracts && (
-
-
- e.stopPropagation()}
- >
- {cw2Info ?? "N/A"}
-
-
- )}
+
+ {showCw2andContracts ? (
+ <>
+
+ e.stopPropagation()}
+ >
+ {cw2Info ?? "N/A"}
+
+ >
+ ) : (
+
+
+
+
+ )}
+
}
bottomContent={
-
- {showCw2andContracts && (
+ showCw2andContracts && (
+
- )}
-
-
-
+
+
+
+
-
+ )
}
/>
);
From 73b7c1caca963a223851dc5b6ddd7838332d799e Mon Sep 17 00:00:00 2001
From: songwongtp <16089160+songwongtp@users.noreply.github.com>
Date: Mon, 29 Apr 2024 16:59:35 +0700
Subject: [PATCH 7/7] fix: mobile layout
---
.../components/table/MobileCardTemplate.tsx | 16 ++--
.../table/codes/CodesTableMobileCard.tsx | 76 ++++++++++---------
src/lib/components/table/tableComponents.ts | 2 +-
3 files changed, 51 insertions(+), 43 deletions(-)
diff --git a/src/lib/components/table/MobileCardTemplate.tsx b/src/lib/components/table/MobileCardTemplate.tsx
index 8df428864..fc53b9124 100644
--- a/src/lib/components/table/MobileCardTemplate.tsx
+++ b/src/lib/components/table/MobileCardTemplate.tsx
@@ -1,4 +1,4 @@
-import { Divider, Flex } from "@chakra-ui/react";
+import { Flex } from "@chakra-ui/react";
import type { ReactNode } from "react";
interface MobileCardTemplateProps {
@@ -30,16 +30,22 @@ export const MobileCardTemplate = ({
{middleContent && (
{middleContent}
)}
- {!middleContent && }
- {bottomContent && {bottomContent}}
+ {bottomContent && (
+
+ {bottomContent}
+
+ )}
);
diff --git a/src/lib/components/table/codes/CodesTableMobileCard.tsx b/src/lib/components/table/codes/CodesTableMobileCard.tsx
index 63a578bd3..ac5182c3d 100644
--- a/src/lib/components/table/codes/CodesTableMobileCard.tsx
+++ b/src/lib/components/table/codes/CodesTableMobileCard.tsx
@@ -8,8 +8,6 @@ import { PermissionChip } from "lib/components/PermissionChip";
import type { CodeInfo } from "lib/types";
import { getCw2Info } from "lib/utils";
-import { CodeNameCell } from "./CodeNameCell";
-
interface CodesTableMobileCardProps {
codeInfo: CodeInfo;
showCw2andContracts: boolean;
@@ -30,45 +28,49 @@ export const CodesTableMobileCard = ({
})
}
topContent={
-
-
-
-
+ showCw2andContracts ? (
+
+
+
+
+ ) : (
+
+
+
+
+
+
+
+
+
+
+ )
}
middleContent={
-
-
-
-
-
+ showCw2andContracts && (
- {showCw2andContracts ? (
- <>
-
- e.stopPropagation()}
- >
- {cw2Info ?? "N/A"}
-
- >
- ) : (
-
-
-
-
- )}
+
+ e.stopPropagation()}
+ >
+ {cw2Info ?? "N/A"}
+
-
+ )
}
bottomContent={
showCw2andContracts && (
diff --git a/src/lib/components/table/tableComponents.ts b/src/lib/components/table/tableComponents.ts
index 5919bc50a..75157b2e9 100644
--- a/src/lib/components/table/tableComponents.ts
+++ b/src/lib/components/table/tableComponents.ts
@@ -74,6 +74,6 @@ export const MobileTableContainer = chakra(SimpleGrid, {
columns: 1,
gap: 4,
w: "full",
- mt: 4,
+ my: 4,
},
});