diff --git a/apps/hyperdrive-trading/src/network/wagmiClient.ts b/apps/hyperdrive-trading/src/network/wagmiClient.ts index ef17f149e..592fbfca1 100644 --- a/apps/hyperdrive-trading/src/network/wagmiClient.ts +++ b/apps/hyperdrive-trading/src/network/wagmiClient.ts @@ -13,19 +13,41 @@ import { capsuleWallet } from "src/wallets/capsule"; import { Chain, http, Transport } from "viem"; import { base, foundry, gnosis, linea, mainnet, sepolia } from "wagmi/chains"; -const { - VITE_LOCALHOST_NODE_RPC_URL, - VITE_CUSTOM_CHAIN_NODE_RPC_URL, - VITE_CUSTOM_CHAIN_CHAIN_ID, - VITE_WALLET_CONNECT_PROJECT_ID, - VITE_SEPOLIA_RPC_URL, - VITE_MAINNET_RPC_URL, - VITE_LINEA_RPC_URL, - VITE_BASE_RPC_URL, - VITE_GNOSIS_FORK_NODE_RPC_URL, - VITE_GNOSIS_FORK_CHAIN_ID, - VITE_GNOSIS_NODE_RPC_URL, -} = import.meta.env; +// Allow users to override the default RPC URL by setting it in local storage, +// especially useful for custom networks/chains +const VITE_LOCALHOST_NODE_RPC_URL = + localStorage.getItem("VITE_LOCALHOST_NODE_RPC_URL") || + import.meta.env.VITE_LOCALHOST_NODE_RPC_URL; +const VITE_CUSTOM_CHAIN_NODE_RPC_URL = + localStorage.getItem("VITE_CUSTOM_CHAIN_NODE_RPC_URL") || + import.meta.env.VITE_CUSTOM_CHAIN_NODE_RPC_URL; +const VITE_CUSTOM_CHAIN_CHAIN_ID = + localStorage.getItem("VITE_CUSTOM_CHAIN_CHAIN_ID") || + import.meta.env.VITE_CUSTOM_CHAIN_CHAIN_ID; +const VITE_WALLET_CONNECT_PROJECT_ID = + localStorage.getItem("VITE_WALLET_CONNECT_PROJECT_ID") || + import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID; +const VITE_SEPOLIA_RPC_URL = + localStorage.getItem("VITE_SEPOLIA_RPC_URL") || + import.meta.env.VITE_SEPOLIA_RPC_URL; +const VITE_MAINNET_RPC_URL = + localStorage.getItem("VITE_MAINNET_RPC_URL") || + import.meta.env.VITE_MAINNET_RPC_URL; +const VITE_LINEA_RPC_URL = + localStorage.getItem("VITE_LINEA_RPC_URL") || + import.meta.env.VITE_LINEA_RPC_URL; +const VITE_BASE_RPC_URL = + localStorage.getItem("VITE_BASE_RPC_URL") || + import.meta.env.VITE_BASE_RPC_URL; +const VITE_GNOSIS_FORK_NODE_RPC_URL = + localStorage.getItem("VITE_GNOSIS_FORK_NODE_RPC_URL") || + import.meta.env.VITE_GNOSIS_FORK_NODE_RPC_URL; +const VITE_GNOSIS_FORK_CHAIN_ID = + localStorage.getItem("VITE_GNOSIS_FORK_CHAIN_ID") || + import.meta.env.VITE_GNOSIS_FORK_CHAIN_ID; +const VITE_GNOSIS_NODE_RPC_URL = + localStorage.getItem("VITE_GNOSIS_NODE_RPC_URL") || + import.meta.env.VITE_GNOSIS_NODE_RPC_URL; interface WagmiClientConfig { rpcUrl: string; diff --git a/apps/hyperdrive-trading/src/ui/app/Navbar/Navbar.tsx b/apps/hyperdrive-trading/src/ui/app/Navbar/Navbar.tsx index f5a90b2c7..c65d57b35 100644 --- a/apps/hyperdrive-trading/src/ui/app/Navbar/Navbar.tsx +++ b/apps/hyperdrive-trading/src/ui/app/Navbar/Navbar.tsx @@ -9,6 +9,7 @@ import { ExternalLink } from "src/ui/analytics/ExternalLink"; import { useAnalyticsUrl } from "src/ui/analytics/useMarketAnalyticsUrl"; import { HyperdriveLogo } from "src/ui/app/Navbar/HyperdriveLogo"; import { useIsTailwindSmallScreen } from "src/ui/base/mediaBreakpoints"; +import { RpcForm } from "src/ui/chains/RpcForm"; export function Navbar(): ReactElement { const analyticsUrl = useAnalyticsUrl(); @@ -40,6 +41,7 @@ export function Navbar(): ReactElement { + typeof import.meta.env[key] !== "undefined") + .map(([name, key]) => { + return [name, key, localStorage.getItem(key) || import.meta.env[key]]; + }); + +export function RpcForm(): ReactElement { + return ( + <> + {/* Open the modal using document.getElementById('ID').showModal() method */} + + +
+
+

RPC URLs

+

Refresh after saving to see changes

+ {configuredRpcEndpoints.map(([name, key, rpcUrl]) => { + return ( + + ); + })} +
+
+
+ {/* if there is a button in form, it will close the modal */} + +
+
+
+
+ + ); +} + +function RpcInput({ + rpcName, + rpcUrl, + rpcKey, +}: { + rpcName: string; + rpcUrl: string; + rpcKey: string; +}) { + const [rpcUrlDraft, setRpcUrlDraft] = useState(rpcUrl); + return ( +
+
+ {rpcName} +
+ setRpcUrlDraft(e.target.value)} + className="daisy-input daisy-join-item w-full" + /> + +
+ ); +}