diff --git a/src/lib/useLoadLatestVerified.ts b/src/lib/useLoadLatestVerified.ts index 4a0a4890..377a4c74 100644 --- a/src/lib/useLoadLatestVerified.ts +++ b/src/lib/useLoadLatestVerified.ts @@ -1,25 +1,30 @@ import { useQuery } from "@tanstack/react-query"; -import { randomFromArray, backends } from "./useSubmitSources"; +import { randomFromArray, useBackends } from "./useSubmitSources"; export function useLoadLatestVerified() { + const backends = useBackends(); const backend = randomFromArray(backends); - const { isLoading, error, data } = useQuery(["latestVerifiedContracts"], async () => { - const response = await fetch(`${backend}/latestVerified`, { - method: "GET", - }); + const { isLoading, error, data } = useQuery( + ["latestVerifiedContracts"], + async () => { + const response = await fetch(`${backend}/latestVerified`, { + method: "GET", + }); - const latestVerified = ( - (await response.json()) as { - address: string; - mainFile: string; - compiler: string; - }[] - ).slice(0, 100); + const latestVerified = ( + (await response.json()) as { + address: string; + mainFile: string; + compiler: string; + }[] + ).slice(0, 100); - return latestVerified; - }); + return latestVerified; + }, + { enabled: backends.length > 0 }, + ); return { isLoading, error, data }; } diff --git a/src/lib/useOverride.ts b/src/lib/useOverride.ts index 68d1f18b..c4b1d42a 100644 --- a/src/lib/useOverride.ts +++ b/src/lib/useOverride.ts @@ -16,6 +16,11 @@ export function useOverride() { (async () => { if (!walletAddress || !contractAddress) return; if (urlParams.get("override") !== null) { + if (!!import.meta.env.VITE_OVERRIDE) { + setCanOverride(true); + return; + } + const tc = await getClient(); const admin = await getAdmin(Address.parse(window.sourcesRegistryAddress), tc); if (admin === walletAddress) { diff --git a/src/lib/useRemoteConfig.ts b/src/lib/useRemoteConfig.ts index 800564cc..6852aef2 100644 --- a/src/lib/useRemoteConfig.ts +++ b/src/lib/useRemoteConfig.ts @@ -10,16 +10,27 @@ export function useRemoteConfig() { return useQuery( ["remoteConfig"], async () => { - const { funcVersions, tactVersions, tolkVersions } = await (await fetch(configURL)).json(); + const config: { + funcVersions: string[]; + tactVersions: string[]; + tolkVersions: string[]; + backends: string[]; + backendsTestnet: string[]; + } = await (await fetch(configURL)).json(); setEnabled(false); - return { - funcVersions: funcVersions as string[], - tactVersions: tactVersions as string[], - tolkVersions: tolkVersions as string[], - }; + return config; + }, + { + enabled, + initialData: { + funcVersions: [], + tactVersions: [], + tolkVersions: [], + backends: [], + backendsTestnet: [], + }, }, - { enabled, initialData: { funcVersions: [], tactVersions: [], tolkVersions: [] } }, ); } diff --git a/src/lib/useSubmitSources.ts b/src/lib/useSubmitSources.ts index 64ebd1e8..6aaafaa7 100644 --- a/src/lib/useSubmitSources.ts +++ b/src/lib/useSubmitSources.ts @@ -9,6 +9,7 @@ import { AnalyticsAction, sendAnalyticsEvent } from "./googleAnalytics"; import create from "zustand"; import { useLoadVerifierRegistryInfo } from "./useLoadVerifierRegistryInfo"; import { useTonAddress } from "@tonconnect/ui-react"; +import { useRemoteConfig } from "./useRemoteConfig"; export function randomFromArray(arr: T[]) { return arr[Math.floor(Math.random() * arr.length)]; @@ -35,9 +36,7 @@ function jsonToBlob(json: Record): Blob { }); } -export const backends: string[] = window.isTestnet - ? import.meta.env.VITE_BACKEND_URL_TESTNET!.split(",") - : import.meta.env.VITE_BACKEND_URL!.split(","); +const isTestnet = window.isTestnet; const useSubmitSourcesStatusStore = create<{ status: string | null; @@ -49,6 +48,22 @@ const useSubmitSourcesStatusStore = create<{ clear: () => set({ status: null }), })); +export function useBackends() { + const { data: remoteConfig } = useRemoteConfig(); + + let backends: string[] = []; + + if (!!import.meta.env.VITE_BACKEND_URL_OVERRIDE) { + backends = import.meta.env.VITE_BACKEND_URL_OVERRIDE.split(","); + } else if (isTestnet) { + backends = remoteConfig.backendsTestnet; + } else { + backends = remoteConfig.backends; + } + + return backends; +} + export function useSubmitSources() { const { contractAddress } = useContractAddress(); const { data: contractInfo } = useLoadContractInfo(); @@ -57,6 +72,7 @@ export function useSubmitSources() { const walletAddress = useTonAddress(); const { clear, setStatus, status } = useSubmitSourcesStatusStore(); const { data: verifierRegistryData } = useLoadVerifierRegistryInfo(); + const backends = useBackends(); const verifierRegistryConfig = verifierRegistryData?.find((v) => v.name === window.verifierId); @@ -68,6 +84,7 @@ export function useSubmitSources() { if (!walletAddress) { throw new Error("Wallet is not connected"); } + if (backends.length === 0) return; clear();