diff --git a/src/env.ts b/src/env.ts index e50dadf91..6da0da08a 100644 --- a/src/env.ts +++ b/src/env.ts @@ -35,9 +35,11 @@ export const CELATONE_APP_CONTRACT_ADDRESS = ( } }; -export const LCD_ENDPOINT: Record = { +export const FALLBACK_LCD_ENDPOINT: Record = { osmosis: "https://lcd.osmosis.zone", osmosistestnet: "https://lcd-test.osmosis.zone", + terra2: "https://phoenix-lcd.terra.dev", + terra2testnet: "https://pisco-lcd.terra.dev", }; export const MAX_FILE_SIZE = 800_000; @@ -50,9 +52,10 @@ export const MSG_TYPE_URL = { export const CELATONE_CONSTANTS: CelatoneConstants = { gasAdjustment: 1.6, - lcdEndpoint: LCD_ENDPOINT, maxFileSize: MAX_FILE_SIZE, msgTypeUrl: MSG_TYPE_URL, }; export const DUMMY_MNEMONIC = process.env.NEXT_PUBLIC_DUMMY_MNEMONIC; + +export const SUPPORTED_CHAIN = process.env.NEXT_PUBLIC_SUPPORTED_CHAIN; diff --git a/src/lib/app-provider/contexts/app.tsx b/src/lib/app-provider/contexts/app.tsx index 821e69f79..42d18bfb0 100644 --- a/src/lib/app-provider/contexts/app.tsx +++ b/src/lib/app-provider/contexts/app.tsx @@ -12,7 +12,7 @@ import { getExplorerUserAddressUrl, } from "lib/app-fns/explorer"; import { LoadingOverlay } from "lib/components/LoadingOverlay"; -import { DEFAULT_ADDRESS, DEFAULT_CHAIN } from "lib/data"; +import { DEFAULT_ADDRESS, getDefaultChainName } from "lib/data"; import { useCodeStore, useContractStore } from "lib/hooks"; import type { ChainGasPrice, Token, U } from "lib/types"; import { formatUserKey } from "lib/utils"; @@ -113,7 +113,7 @@ export const AppProvider = ({ }, [currentChainName, setCodeUserKey, setContractUserKey]); useEffect(() => { - setCurrentChain(DEFAULT_CHAIN); + setCurrentChain(getDefaultChainName()); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/src/lib/app-provider/hooks/useQueryCmds.ts b/src/lib/app-provider/hooks/useQueryCmds.ts index 8f0129772..a90d321a5 100644 --- a/src/lib/app-provider/hooks/useQueryCmds.ts +++ b/src/lib/app-provider/hooks/useQueryCmds.ts @@ -2,7 +2,7 @@ import { useQuery } from "@tanstack/react-query"; import type { AxiosError } from "axios"; import { useState } from "react"; -import { useEndpoint } from "lib/hooks"; +import { useLCDEndpoint } from "lib/hooks"; import { queryData } from "lib/services/contract"; import type { ContractAddr, RpcQueryError } from "lib/types"; @@ -11,7 +11,7 @@ interface UseQueryCmdsProps { } export const useQueryCmds = ({ contractAddress }: UseQueryCmdsProps) => { const [queryCmds, setQueryCmds] = useState<[string, string][]>([]); - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const { isFetching } = useQuery( ["query", "cmds", endpoint, contractAddress, '{"": {}}'], diff --git a/src/lib/app-provider/query-client/index.ts b/src/lib/app-provider/query-client/index.ts index c47c89b0c..983297515 100644 --- a/src/lib/app-provider/query-client/index.ts +++ b/src/lib/app-provider/query-client/index.ts @@ -1,12 +1,11 @@ import { GraphQLClient } from "graphql-request"; export const GRAPH_URL: Record = { - osmosistestnet: "https://osmosis-testnet-graphql.alleslabs.dev/v1/graphql", /** - * Revisit graphql for terra2 mainnet and keplr key for testnet (currently non-existent) + * Revisit graphql for terra2 mainnet and osmosis mainnet */ - terra2: "https://terra-testnet-graphql.alleslabs.dev/console", - terra2testnet: "https://terra-testnet-graphql.alleslabs.dev/console", + osmosistestnet: "https://osmosis-testnet-graphql.alleslabs.dev/v1/graphql", + terra2testnet: "https://terra-testnet-graphql.alleslabs.dev/v1/graphql", }; export const getIndexerGraphClient = (currentChainName: string) => diff --git a/src/lib/components/ContractSelectSection.tsx b/src/lib/components/ContractSelectSection.tsx index 00eb553e2..5d61d670d 100644 --- a/src/lib/components/ContractSelectSection.tsx +++ b/src/lib/components/ContractSelectSection.tsx @@ -5,7 +5,7 @@ import { useEffect, useMemo } from "react"; import { useForm } from "react-hook-form"; import { MdMode, MdOutlineBookmarkBorder } from "react-icons/md"; -import { useContractStore, useEndpoint, useMobile } from "lib/hooks"; +import { useContractStore, useLCDEndpoint, useMobile } from "lib/hooks"; import { queryInstantiateInfo } from "lib/services/contract"; import type { ContractInfo } from "lib/stores/contract"; import type { ContractAddr, Option } from "lib/types"; @@ -103,7 +103,7 @@ export const ContractSelectSection = observer( ({ contractAddress, onContractSelect }: ContractSelectSectionProps) => { const { getContractInfo } = useContractStore(); const isMobile = useMobile(); - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const contractInfo = getContractInfo(contractAddress); const { diff --git a/src/lib/components/modal/code/SaveNewCode.tsx b/src/lib/components/modal/code/SaveNewCode.tsx index 5b44a288b..36162f18d 100644 --- a/src/lib/components/modal/code/SaveNewCode.tsx +++ b/src/lib/components/modal/code/SaveNewCode.tsx @@ -11,7 +11,7 @@ import { getMaxCodeDescriptionLengthError, MAX_CODE_DESCRIPTION_LENGTH, } from "lib/data"; -import { useCodeStore, useEndpoint } from "lib/hooks"; +import { useCodeStore, useLCDEndpoint } from "lib/hooks"; import { getCodeIdInfo } from "lib/services/code"; interface ModalProps { @@ -50,7 +50,7 @@ export function SaveNewCodeModal({ buttonProps }: ModalProps) { const toast = useToast(); const { isCodeIdExist, saveNewCode, updateCodeInfo, getCodeLocalInfo } = useCodeStore(); - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const { refetch, isFetching, isRefetching } = useQuery( ["query", endpoint, codeId], diff --git a/src/lib/components/modal/contract/SaveNewContract.tsx b/src/lib/components/modal/contract/SaveNewContract.tsx index bd92e36fa..a5e7bf793 100644 --- a/src/lib/components/modal/contract/SaveNewContract.tsx +++ b/src/lib/components/modal/contract/SaveNewContract.tsx @@ -13,7 +13,11 @@ import { ActionModal } from "lib/components/modal/ActionModal"; import type { OffchainDetail } from "lib/components/OffChainForm"; import { OffChainForm } from "lib/components/OffChainForm"; import { DEFAULT_RPC_ERROR, INSTANTIATED_LIST_NAME } from "lib/data"; -import { useContractStore, useEndpoint, useValidateAddress } from "lib/hooks"; +import { + useContractStore, + useLCDEndpoint, + useValidateAddress, +} from "lib/hooks"; import { useHandleContractSave } from "lib/hooks/useHandleSave"; import { queryInstantiateInfo } from "lib/services/contract"; import type { ContractAddr, LVPair, RpcQueryError } from "lib/types"; @@ -31,7 +35,7 @@ interface SaveNewContractProps { buttonProps: ButtonProps; } export function SaveNewContract({ list, buttonProps }: SaveNewContractProps) { - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const { getContractInfo } = useContractStore(); const { validateContractAddress } = useValidateAddress(); diff --git a/src/lib/components/modal/select-contract/SelectContract.tsx b/src/lib/components/modal/select-contract/SelectContract.tsx index 41c240ce7..c75f2925f 100644 --- a/src/lib/components/modal/select-contract/SelectContract.tsx +++ b/src/lib/components/modal/select-contract/SelectContract.tsx @@ -22,7 +22,11 @@ import { MdChevronLeft } from "react-icons/md"; import { useCelatoneApp } from "lib/app-provider"; import { DEFAULT_RPC_ERROR } from "lib/data"; -import { useContractStore, useEndpoint, useValidateAddress } from "lib/hooks"; +import { + useContractStore, + useLCDEndpoint, + useValidateAddress, +} from "lib/hooks"; import { useInstantiatedByMe } from "lib/model/contract"; import { queryContract } from "lib/services/contract"; import type { ContractAddr, RpcQueryError } from "lib/types"; @@ -55,7 +59,7 @@ export const SelectContract = ({ const contractLists = [useInstantiatedByMe(true), ...getContractLists()]; const contractList = contractLists.find((item) => item.slug === listSlug); - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const resetOnClose = () => { setListSlug(""); diff --git a/src/lib/config/terra2testnet.ts b/src/lib/config/terra2testnet.ts new file mode 100644 index 000000000..6db989d14 --- /dev/null +++ b/src/lib/config/terra2testnet.ts @@ -0,0 +1,89 @@ +import type { Chain, AssetList } from "@chain-registry/types"; + +export const terra2testnet: Chain = { + $schema: "../../chain.schema.json", + chain_name: "terra2testnet", + status: "live", + network_type: "testnet", + pretty_name: "Terra Testnet", + chain_id: "pisco-1", + bech32_prefix: "terra", + daemon_name: "terrad", + node_home: "$HOME/.terrad", + slip44: 330, + fees: { + fee_tokens: [ + { + denom: "uluna", + fixed_min_gas_price: 0, + low_gas_price: 0.015, + average_gas_price: 0.015, + high_gas_price: 0.015, + }, + ], + }, + staking: { + staking_tokens: [ + { + denom: "uluna", + }, + ], + }, + codebase: { + git_repo: "https://github.com/terra-money/core", + recommended_version: "v2.2.0", + compatible_versions: ["v2.2.0"], + cosmos_sdk_version: "0.45.10", + tendermint_version: "0.34.22", + cosmwasm_version: "0.27", + cosmwasm_enabled: true, + }, + apis: { + rpc: [ + { + address: "https://terra-testnet-rpc.polkachu.com/", + }, + ], + rest: [ + { + address: "https://pisco-lcd.terra.dev/", + }, + ], + grpc: [], + }, + logo_URIs: { + png: "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/luna.png", + }, + keywords: ["testnet"], +}; + +export const terra2testnetAssets: AssetList = { + $schema: "../../assetlist.schema.json", + chain_name: "terra2testnet", + assets: [ + { + description: "The native token of Terra", + denom_units: [ + { + denom: "uluna", + exponent: 0, + aliases: [], + }, + { + denom: "luna", + exponent: 6, + aliases: [], + }, + ], + base: "uluna", + name: "Luna", + display: "luna", + symbol: "LUNA", + logo_URIs: { + png: "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/luna.png", + }, + coingecko_id: "terra", + keywords: ["staking"], + }, + ], +}; diff --git a/src/lib/data/chain.ts b/src/lib/data/chain.ts new file mode 100644 index 000000000..dcc092337 --- /dev/null +++ b/src/lib/data/chain.ts @@ -0,0 +1,23 @@ +import { SUPPORTED_CHAIN } from "env"; + +export const TERRA_CHAIN_NAMES = ["terra2", "terra2testnet"]; + +export const OSMOSIS_CHAIN_NAMES = ["osmosis", "osmosistestnet"]; + +export const ALL_CHAIN_NAMES = [...TERRA_CHAIN_NAMES, ...OSMOSIS_CHAIN_NAMES]; + +export const getSupportedChainNames = () => { + switch (SUPPORTED_CHAIN) { + case "terra": + return TERRA_CHAIN_NAMES; + case "osmosis": + return OSMOSIS_CHAIN_NAMES; + default: + throw new Error(`Unsupported chain: ${SUPPORTED_CHAIN}`); + } +}; + +export const getDefaultChainName = () => { + const supportedChainNames = getSupportedChainNames(); + return supportedChainNames[0]; +}; diff --git a/src/lib/data/constant.ts b/src/lib/data/constant.ts index 42eb4d9c0..efd05cdf7 100644 --- a/src/lib/data/constant.ts +++ b/src/lib/data/constant.ts @@ -62,8 +62,3 @@ export const typeUrlDict = { }; export const DEFAULT_RPC_ERROR = "Invalid format, or Something went wrong"; -// TODO -export const LCD_ENDPOINT: Record = { - osmosis: "https://lcd.osmosis.zone", - osmosistestnet: "https://lcd-test.osmosis.zone", -}; diff --git a/src/lib/data/graphql.ts b/src/lib/data/graphql.ts deleted file mode 100644 index 8466f1294..000000000 --- a/src/lib/data/graphql.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GraphQLClient } from "graphql-request"; - -export const GRAPH_URL = - "https://osmosis-testnet-graphql.alleslabs.dev/v1/graphql"; - -export const indexerGraphClient = new GraphQLClient(GRAPH_URL); diff --git a/src/lib/data/index.ts b/src/lib/data/index.ts index a7d21355e..d1c9ea543 100644 --- a/src/lib/data/index.ts +++ b/src/lib/data/index.ts @@ -1,2 +1,2 @@ export * from "./constant"; -export * from "./wallet"; +export * from "./chain"; diff --git a/src/lib/data/wallet.ts b/src/lib/data/wallet.ts deleted file mode 100644 index 9df65defb..000000000 --- a/src/lib/data/wallet.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const MAINNET_CHAIN_NAMES = []; - -export const TESTNET_CHAIN_NAMES = ["osmosistestnet"]; - -export const CHAIN_NAMES = [...MAINNET_CHAIN_NAMES, ...TESTNET_CHAIN_NAMES]; - -export const DEFAULT_CHAIN = TESTNET_CHAIN_NAMES[0]; diff --git a/src/lib/env.ts b/src/lib/env.ts deleted file mode 100644 index 484e176a0..000000000 --- a/src/lib/env.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @todo - * Move to App Context later - */ -export const OSMOSIS_TESTNET_GQL_ENDPOINT = - "https://osmosis-testnet-graphql.alleslabs.dev/v1/graphql"; diff --git a/src/lib/hooks/index.ts b/src/lib/hooks/index.ts index 325bd3477..8810afd42 100644 --- a/src/lib/hooks/index.ts +++ b/src/lib/hooks/index.ts @@ -1,7 +1,7 @@ export * from "./store"; export * from "./useMediaQuery"; export * from "./useToast"; -export * from "./useEndpoint"; +export * from "./useLCDEndpoint"; export * from "./useUserKey"; export * from "./useDummyWallet"; export * from "./useAddress"; diff --git a/src/lib/hooks/useAddress.ts b/src/lib/hooks/useAddress.ts index e73808858..21d8346e1 100644 --- a/src/lib/hooks/useAddress.ts +++ b/src/lib/hooks/useAddress.ts @@ -19,6 +19,14 @@ const addressLengthMap: { 43: "user_address", 63: "contract_address", }, + terra2: { + 44: "user_address", + 64: "contract_address", + }, + terra2testnet: { + 44: "user_address", + 64: "contract_address", + }, }; const getAddressTypeByLength = ( diff --git a/src/lib/hooks/useEndpoint.ts b/src/lib/hooks/useEndpoint.ts deleted file mode 100644 index eb89f0beb..000000000 --- a/src/lib/hooks/useEndpoint.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { useWallet } from "@cosmos-kit/react"; - -import { LCD_ENDPOINT } from "lib/data"; - -export const useEndpoint = () => { - const { currentChainName } = useWallet(); - return LCD_ENDPOINT[currentChainName]; -}; diff --git a/src/lib/hooks/useLCDEndpoint.ts b/src/lib/hooks/useLCDEndpoint.ts new file mode 100644 index 000000000..037f1ca10 --- /dev/null +++ b/src/lib/hooks/useLCDEndpoint.ts @@ -0,0 +1,12 @@ +import { useWallet } from "@cosmos-kit/react"; + +import { FALLBACK_LCD_ENDPOINT } from "env"; + +export const useLCDEndpoint = () => { + const { currentChainRecord, currentChainName } = useWallet(); + + return ( + currentChainRecord?.preferredEndpoints?.rest?.at(0) ?? + FALLBACK_LCD_ENDPOINT[currentChainName] + ); +}; diff --git a/src/lib/layout/Header.tsx b/src/lib/layout/Header.tsx index 4f87c2887..657b9ae3a 100644 --- a/src/lib/layout/Header.tsx +++ b/src/lib/layout/Header.tsx @@ -13,7 +13,7 @@ import Link from "next/link"; import { FiChevronDown } from "react-icons/fi"; import { WalletSection } from "lib/components/Wallet"; -import { CHAIN_NAMES } from "lib/data"; +import { getSupportedChainNames } from "lib/data"; const Header = () => { const { currentChainRecord, setCurrentChain, getChainRecord } = useWallet(); @@ -64,21 +64,20 @@ const Header = () => { - {CHAIN_NAMES.map((chainName) => { - return ( - setCurrentChain(chainName)} - flexDirection="column" - alignItems="flex-start" - > - {getChainRecord(chainName)?.chain.pretty_name} - - {getChainRecord(chainName)?.chain.chain_id} - - - ); - })} + {getSupportedChainNames().map((chainName) => ( + setCurrentChain(chainName)} + disabled={currentChainRecord?.chain.chain_id === chainName} + flexDirection="column" + alignItems="flex-start" + > + {getChainRecord(chainName)?.chain.pretty_name} + + {getChainRecord(chainName)?.chain.chain_id} + + + ))} diff --git a/src/lib/model/contract.ts b/src/lib/model/contract.ts index cb9e8770f..df71849a3 100644 --- a/src/lib/model/contract.ts +++ b/src/lib/model/contract.ts @@ -3,7 +3,7 @@ import { useWallet } from "@cosmos-kit/react"; import { useQuery } from "@tanstack/react-query"; import { INSTANTIATED_LIST_NAME } from "lib/data"; -import { useCodeStore, useContractStore, useEndpoint } from "lib/hooks"; +import { useCodeStore, useContractStore, useLCDEndpoint } from "lib/hooks"; import type { InstantiateInfo, PublicInfo } from "lib/services/contract"; import { queryPublicInfo, @@ -81,7 +81,7 @@ export const useContractData = ( const { currentChainRecord } = useWallet(); const { getCodeLocalInfo } = useCodeStore(); const { getContractInfo } = useContractStore(); - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const { data: instantiateInfo } = useQuery( ["query", "instantiateInfo", contractAddress], diff --git a/src/lib/pages/execute/components/ExecuteArea.tsx b/src/lib/pages/execute/components/ExecuteArea.tsx index 5656487b0..f67fcc6ff 100644 --- a/src/lib/pages/execute/components/ExecuteArea.tsx +++ b/src/lib/pages/execute/components/ExecuteArea.tsx @@ -30,7 +30,7 @@ export const ExecuteArea = ({ initialMsg, cmds, }: ExecuteAreaProps) => { - const { address = "" } = useWallet(); + const { address } = useWallet(); const fabricateFee = useFabricateFee(); const executeTx = useExecuteContractTx(); const { broadcast } = useTxBroadcast(); diff --git a/src/lib/pages/home/index.tsx b/src/lib/pages/home/index.tsx index 6abd3137f..e5536f85f 100644 --- a/src/lib/pages/home/index.tsx +++ b/src/lib/pages/home/index.tsx @@ -4,14 +4,12 @@ import { Box } from "@chakra-ui/react"; import { QuickMenu } from "./components/QuickMenu"; import { RecentActivities } from "./components/RecentActivities"; -const Home = () => { - return ( - - - - {/* */} - - ); -}; +const Home = () => ( + + + + {/* */} + +); export default Home; diff --git a/src/lib/pages/pastTxs/query/useTxQuery.ts b/src/lib/pages/pastTxs/query/useTxQuery.ts index 69728842a..8632680ed 100644 --- a/src/lib/pages/pastTxs/query/useTxQuery.ts +++ b/src/lib/pages/pastTxs/query/useTxQuery.ts @@ -1,8 +1,6 @@ -import { useWallet } from "@cosmos-kit/react"; import { useQuery } from "@tanstack/react-query"; -import { request } from "graphql-request"; -import { OSMOSIS_TESTNET_GQL_ENDPOINT } from "lib/env"; +import { useCelatoneApp } from "lib/app-provider"; import type { Transaction } from "lib/types/tx/transaction"; import { snakeToCamel } from "lib/utils/formatter"; @@ -44,7 +42,7 @@ export const useTxQuery = ( pageSize: number, offset: number ) => { - const { currentChainName } = useWallet(); + const { indexerGraphClient } = useCelatoneApp(); // Filter when action buttons are pressed const actionsFilter = () => { const actionsObj = { @@ -89,11 +87,7 @@ export const useTxQuery = ( const queryFn = async (): Promise => { // Determine endpoint - let endpoint = ""; - if (currentChainName === "osmosistestnet") { - endpoint = OSMOSIS_TESTNET_GQL_ENDPOINT; - } - if (endpoint === "" || userAddr === "") { + if (userAddr === "") { return { transactions: [], count: 0 } as Response; } @@ -103,15 +97,17 @@ export const useTxQuery = ( // Show all 4 main action types let response; if (isShowAll) { - response = await request(endpoint, queryShowallFromTxs(search), { - userAddr, - pageSize, - offset, - }); + response = await indexerGraphClient.request( + queryShowallFromTxs(search), + { + userAddr, + pageSize, + offset, + } + ); // When buttons are pressed } else { - response = await request( - endpoint, + response = indexerGraphClient.request( queryWithActionsFromTxs(search, actionsFilter()), { userAddr, @@ -128,8 +124,7 @@ export const useTxQuery = ( // Contract address -> query from contracts table } if (search.length === 63) { - const response = await request( - endpoint, + const response = await indexerGraphClient.request( queryAddrFromContracts(actionsFilter()), { userAddr, diff --git a/src/lib/pages/query/components/QueryArea.tsx b/src/lib/pages/query/components/QueryArea.tsx index 8cb1614e1..4c211f2a2 100644 --- a/src/lib/pages/query/components/QueryArea.tsx +++ b/src/lib/pages/query/components/QueryArea.tsx @@ -10,7 +10,7 @@ import { CopyButton } from "lib/components/CopyButton"; import JsonInput from "lib/components/json/JsonInput"; import JsonReadOnly from "lib/components/json/JsonReadOnly"; import { DEFAULT_RPC_ERROR } from "lib/data"; -import { useContractStore, useEndpoint, useUserKey } from "lib/hooks"; +import { useContractStore, useLCDEndpoint, useUserKey } from "lib/hooks"; import { queryData } from "lib/services/contract"; import type { ContractAddr, RpcQueryError } from "lib/types"; import { encode, jsonPrettify, jsonValidate } from "lib/utils"; @@ -26,7 +26,7 @@ export const QueryArea = ({ initialMsg, cmds, }: QueryAreaProps) => { - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const userKey = useUserKey(); const { addActivity } = useContractStore(); const { address } = useWallet(); diff --git a/src/lib/pages/query/index.tsx b/src/lib/pages/query/index.tsx index 3bcc8296a..42f131485 100644 --- a/src/lib/pages/query/index.tsx +++ b/src/lib/pages/query/index.tsx @@ -8,7 +8,7 @@ import { useCallback, useEffect, useState } from "react"; import { ContractSelectSection } from "lib/components/ContractSelectSection"; import { LoadingOverlay } from "lib/components/LoadingOverlay"; import PageContainer from "lib/components/PageContainer"; -import { useEndpoint } from "lib/hooks"; +import { useLCDEndpoint } from "lib/hooks"; import { queryData } from "lib/services/contract"; import type { ContractAddr, RpcQueryError } from "lib/types"; import { @@ -22,7 +22,7 @@ import { QueryArea } from "./components/QueryArea"; const Query = () => { const router = useRouter(); - const endpoint = useEndpoint(); + const endpoint = useLCDEndpoint(); const [contractAddress, setContractAddress] = useState("" as ContractAddr); const [initialMsg, setInitialMsg] = useState(""); diff --git a/src/lib/services/codeService.ts b/src/lib/services/codeService.ts index 615a041fd..3c648dfac 100644 --- a/src/lib/services/codeService.ts +++ b/src/lib/services/codeService.ts @@ -2,7 +2,7 @@ import type { UseQueryResult } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query"; import { useCallback } from "react"; -import { indexerGraphClient } from "lib/data/graphql"; +import { useCelatoneApp } from "lib/app-provider"; import { getCodeInfoByCodeId, getCodeListByIDsQueryDocument, @@ -17,6 +17,8 @@ import { parseDateDefault, parseTxHashOpt, unwrap } from "lib/utils"; export const useCodeListByUserQuery = ( walletAddr: Option ): UseQueryResult> => { + const { indexerGraphClient } = useCelatoneApp(); + const queryFn = useCallback(async () => { if (!walletAddr) return undefined; @@ -31,7 +33,7 @@ export const useCodeListByUserQuery = ( uploader: code.account.uploader, })) ); - }, [walletAddr]); + }, [indexerGraphClient, walletAddr]); // TODO: add query key later return useQuery(["codes_by_user", walletAddr], queryFn, { @@ -41,6 +43,8 @@ export const useCodeListByUserQuery = ( }; export const useCodeListByIDsQuery = (ids: Option) => { + const { indexerGraphClient } = useCelatoneApp(); + const queryFn = useCallback(async () => { if (!ids) return undefined; @@ -55,7 +59,7 @@ export const useCodeListByIDsQuery = (ids: Option) => { contracts: code.instantiated, })) ); - }, [ids]); + }, [ids, indexerGraphClient]); // TODO: add query key later return useQuery(["codes_by_ids", ids], queryFn, { @@ -67,6 +71,8 @@ export const useCodeListByIDsQuery = (ids: Option) => { export const useCodeInfoByCodeId = ( codeId: Option ): UseQueryResult>> => { + const { indexerGraphClient } = useCelatoneApp(); + const queryFn = useCallback(async () => { if (!codeId) return undefined; @@ -96,7 +102,7 @@ export const useCodeInfoByCodeId = ( instantiatePermission: codes_by_pk.access_config_permission, }; }); - }, [codeId]); + }, [codeId, indexerGraphClient]); return useQuery(["code_info_by_id", codeId], queryFn, { keepPreviousData: true, enabled: !!codeId, @@ -108,6 +114,7 @@ export const useContractListByCodeId = ( offset: number, pageSize: number ): UseQueryResult> => { + const { indexerGraphClient } = useCelatoneApp(); const queryFn = useCallback(async () => { if (!codeId) return undefined; @@ -121,7 +128,7 @@ export const useContractListByCodeId = ( created: parseDateDefault(contract.transaction?.block?.timestamp), })) ); - }, [codeId, offset, pageSize]); + }, [codeId, indexerGraphClient, offset, pageSize]); return useQuery(["contract_list_by_code_id", codeId], queryFn, { keepPreviousData: true, @@ -132,6 +139,7 @@ export const useContractListByCodeId = ( export const useContractListCountByCodeId = ( codeId: Option ): UseQueryResult> => { + const { indexerGraphClient } = useCelatoneApp(); const queryFn = useCallback(async () => { if (!codeId) return undefined; @@ -140,7 +148,7 @@ export const useContractListCountByCodeId = ( codeId, }) .then(({ contracts_aggregate }) => contracts_aggregate?.aggregate?.count); - }, [codeId]); + }, [codeId, indexerGraphClient]); return useQuery(["contract_list_count_by_user", codeId], queryFn, { keepPreviousData: true, diff --git a/src/lib/services/contractService.ts b/src/lib/services/contractService.ts index bd3c76417..32a4bd9e5 100644 --- a/src/lib/services/contractService.ts +++ b/src/lib/services/contractService.ts @@ -2,7 +2,7 @@ import type { UseQueryResult } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query"; import { useCallback } from "react"; -import { indexerGraphClient } from "lib/data/graphql"; +import { useCelatoneApp } from "lib/app-provider"; import { getInstantiatedListByUserQueryDocument, getInstantiatedCountByUserQueryDocument, @@ -20,6 +20,7 @@ interface InstantiateDetail { export const useInstantiatedCountByUserQuery = ( walletAddr: Option ): UseQueryResult> => { + const { indexerGraphClient } = useCelatoneApp(); const queryFn = useCallback(async () => { if (!walletAddr) return undefined; @@ -28,7 +29,7 @@ export const useInstantiatedCountByUserQuery = ( walletAddr, }) .then(({ contracts_aggregate }) => contracts_aggregate?.aggregate?.count); - }, [walletAddr]); + }, [indexerGraphClient, walletAddr]); // TODO: add query key later return useQuery(["instantiated_count_by_user", walletAddr], queryFn, { @@ -40,6 +41,7 @@ export const useInstantiatedCountByUserQuery = ( export const useInstantiatedListByUserQuery = ( walletAddr: Option ): UseQueryResult> => { + const { indexerGraphClient } = useCelatoneApp(); const queryFn = useCallback(async () => { if (!walletAddr) return undefined; @@ -55,7 +57,7 @@ export const useInstantiatedListByUserQuery = ( created: parseDateDefault(contract.transaction?.block?.timestamp), })) ); - }, [walletAddr]); + }, [indexerGraphClient, walletAddr]); // TODO: add query key later return useQuery(["instantiated_list_by_user", walletAddr], queryFn, { @@ -67,6 +69,7 @@ export const useInstantiatedListByUserQuery = ( export const useInstantiateDetailByContractQuery = ( contractAddress: ContractAddr ): UseQueryResult => { + const { indexerGraphClient } = useCelatoneApp(); const queryFn = useCallback(async () => { return indexerGraphClient .request(getInstantiateDetailByContractQueryDocument, { contractAddress }) @@ -75,7 +78,7 @@ export const useInstantiateDetailByContractQuery = ( initMsg: contracts_by_pk?.init_msg ?? "{}", initTxHash: parseTxHash(contracts_by_pk?.transaction?.hash), })); - }, [contractAddress]); + }, [contractAddress, indexerGraphClient]); return useQuery( ["instantiate_detail_by_contract", contractAddress], diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index bed18f54f..d82053ada 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -26,6 +26,7 @@ import { import { AppProvider } from "lib/app-provider/contexts/app"; import { Chakra } from "lib/components/Chakra"; import { MobileGuard } from "lib/components/MobileGuard"; +import { terra2testnet, terra2testnetAssets } from "lib/config/terra2testnet"; import Layout from "lib/layout"; import "lib/styles/globals.css"; import { StoreProvider } from "lib/providers/store"; @@ -69,10 +70,15 @@ const MyApp = ({ Component, pageProps }: AppProps) => { ; maxFileSize: number; msgTypeUrl: { [key in MsgType]: string }; }