diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 8c04d7fe9..a912d8369 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -186,7 +186,7 @@ export default async function RootLayout({ } > - {sidebarLayout(children, systemConfig)} + {sidebarLayout(children, systemConfig)} ); diff --git a/src/common/lib/utils/links.ts b/src/common/lib/utils/links.ts index 11e6f6ab8..6fc3f2a9d 100644 --- a/src/common/lib/utils/links.ts +++ b/src/common/lib/utils/links.ts @@ -13,9 +13,10 @@ export function getGeckoIframe(address: Address, network: EtherScanChainName) { return `https://www.geckoterminal.com/${getGeckoNetwork(network)}/pools/${address}?embed=1&info=0&swaps=0&grayscale=0&light_chart=1`; } -export function getMatchaUrl(address: Address, network: EtherScanChainName) { +export function getMatchaUrl(address: Address, network: EtherScanChainName, ref?: string) { const ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; - return `https://matcha.xyz/trade?sellAddress=${ethAddress}&buyAddress=${address}&sellChain=${network}&buyChain=${EtherScanChains[network]}`; + const matchaRef = ref || "nounspace"; + return `https://matcha.xyz/trade?sellAddress=${ethAddress}&buyAddress=${address}&sellChain=${network}&buyChain=${EtherScanChains[network]}&ref=${matchaRef}`; } export function getDexScreenerUrl( diff --git a/src/common/providers/SystemConfigProvider.tsx b/src/common/providers/SystemConfigProvider.tsx new file mode 100644 index 000000000..8e5e973e9 --- /dev/null +++ b/src/common/providers/SystemConfigProvider.tsx @@ -0,0 +1,27 @@ +"use client"; + +import React, { createContext, useContext } from "react"; +import { SystemConfig } from "@/config"; + +const SystemConfigContext = createContext(null); + +export const SystemConfigProvider: React.FC<{ + children: React.ReactNode; + systemConfig: SystemConfig; +}> = ({ children, systemConfig }) => { + return ( + + {children} + + ); +}; + +export const useSystemConfig = (): SystemConfig => { + const context = useContext(SystemConfigContext); + if (!context) { + throw new Error("useSystemConfig must be used within SystemConfigProvider"); + } + return context; +}; + +export default SystemConfigProvider; diff --git a/src/common/providers/index.tsx b/src/common/providers/index.tsx index 32b5278dd..72eede3fb 100644 --- a/src/common/providers/index.tsx +++ b/src/common/providers/index.tsx @@ -17,6 +17,8 @@ import MobilePreviewProvider from "./MobilePreviewProvider"; import { SharedDataProvider } from "./SharedDataProvider"; import { MiniKitContextProvider } from "./MiniKitProvider"; import { GlobalErrorHandler } from "./GlobalErrorHandler"; +import { SystemConfigProvider } from "./SystemConfigProvider"; +import { SystemConfig } from "@/config"; const RarelyUpdatedProviders = React.memo( function RarelyUpdatedProviders({ @@ -38,33 +40,41 @@ const RarelyUpdatedProviders = React.memo( }, ); -export default function Providers({ children }: { children: React.ReactNode }) { +export default function Providers({ + children, + systemConfig, +}: { + children: React.ReactNode; + systemConfig: SystemConfig; +}) { return ( <> - - - - - - - - - - - - {children} - - - - - - - - - - - + + + + + + + + + + + + + {children} + + + + + + + + + + + + ); } diff --git a/src/fidgets/swap/Swap.tsx b/src/fidgets/swap/Swap.tsx index 7368e4cdd..64847bac5 100644 --- a/src/fidgets/swap/Swap.tsx +++ b/src/fidgets/swap/Swap.tsx @@ -11,6 +11,7 @@ import { import { BsArrowRepeat } from "react-icons/bs"; import { mobileStyleSettings, WithMargin } from "../helpers"; import ShadowSelector from "@/common/components/molecules/ShadowSelector"; +import { useSystemConfig } from "@/common/providers/SystemConfigProvider"; type MatchaFidgetSettings = { defaultSellToken: string; @@ -131,10 +132,12 @@ const Swap: React.FC> = ({ size = 0.8, }, }) => { + const systemConfig = useSystemConfig(); + const matchaRef = systemConfig.brand.displayName; const matchaBaseUrl = "https://matcha.xyz/trade"; const [url, setUrl] = React.useState(""); - const buildMatchaUrl = () => { + const buildMatchaUrl = React.useCallback(() => { const params = new URLSearchParams(); if (defaultSellToken) params.append("sellAddress", defaultSellToken); if (defaultBuyToken) params.append("buyAddress", defaultBuyToken); @@ -146,18 +149,13 @@ const Swap: React.FC> = ({ } if (optionalFeeRecipient) params.append("feeRecipient", optionalFeeRecipient); + params.append("ref", matchaRef); return `${matchaBaseUrl}?${params.toString()}`; - }; + }, [defaultSellToken, defaultBuyToken, fromChain, toChain, optionalFeeRecipient, matchaRef]); React.useEffect(() => { setUrl(buildMatchaUrl()); - }, [ - defaultSellToken, - defaultBuyToken, - fromChain, - toChain, - optionalFeeRecipient, - ]); + }, [buildMatchaUrl]); const scaleValue = size;