diff --git a/next.config.mjs b/next.config.mjs
index 65c5cb4..089dfa9 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -52,6 +52,8 @@ const WS_ORIGIN = env.wsUrl ? new URL(env.wsUrl).origin : null;
* 3. `frame-ancestors 'none'` (and X-Frame-Options: DENY)
* Prevents this app from being embedded in a hostile iframe — critical for
* a wallet-integrated dApp (clickjacking against Freighter sign flows).
+ * The JS check `window.top !== window.self` in `useOriginTrust` provides
+ * a secondary defence that shows a break-out notice to the user.
*
* 4. Freighter wallet communication happens via window.postMessage between
* the page and the browser extension — this is NOT a network request and
@@ -152,6 +154,7 @@ const nextConfig = {
NEXT_PUBLIC_NETWORK: process.env.NEXT_PUBLIC_NETWORK ?? "testnet",
NEXT_PUBLIC_SETTLEMENT_CONTRACT: process.env.NEXT_PUBLIC_SETTLEMENT_CONTRACT ?? "",
NEXT_PUBLIC_SOLVER_REGISTRY_CONTRACT: process.env.NEXT_PUBLIC_SOLVER_REGISTRY_CONTRACT ?? "",
+ NEXT_PUBLIC_TRUSTED_ORIGINS: process.env.NEXT_PUBLIC_TRUSTED_ORIGINS ?? "",
},
async headers() {
return [
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 15d9db9..ab7d952 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -4,6 +4,7 @@ import "./globals.css";
import { WalletHydrator } from "@/components/WalletHydrator";
import { ToastViewport } from "@/components/ToastViewport";
import { IntentStatusWatcher } from "@/components/IntentStatusWatcher";
+import { OriginTrustBanner } from "@/components/OriginTrustBanner";
import { I18nProvider } from "@/lib/i18n/I18nProvider";
import { DEFAULT_LOCALE, LOCALE_HEADER, isLocale, type Locale } from "@/lib/i18n";
@@ -168,6 +169,7 @@ export default async function RootLayout({
+