From f049305c495100ef4b417dbf553d0b7ee8948dad Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Mon, 9 Jun 2025 18:09:21 +0200 Subject: [PATCH 01/10] feat: start farcaster frames v2 support. --- apps/dashboard/package.json | 2 + .../nebula-app/_farcaster/miniapp-context.tsx | 109 +++++++++++++++ .../src/app/nebula-app/_farcaster/warpcast.ts | 53 ++++++++ .../src/app/nebula-app/providers.tsx | 25 ++-- pnpm-lock.yaml | 124 ++++++++++++++---- 5 files changed, 280 insertions(+), 33 deletions(-) create mode 100644 apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx create mode 100644 apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 52841eaa8ee..4cb3d22c351 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -27,6 +27,8 @@ "@chakra-ui/theme-tools": "^2.1.2", "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", + "@farcaster/frame-core": "^0.1.8", + "@farcaster/frame-sdk": "^0.0.60", "@hookform/resolvers": "^3.9.1", "@marsidev/react-turnstile": "^1.1.0", "@radix-ui/react-accordion": "^1.2.7", diff --git a/apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx b/apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx new file mode 100644 index 00000000000..7be31b6734f --- /dev/null +++ b/apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx @@ -0,0 +1,109 @@ +"use client"; + +import type { AddMiniAppResult } from "@farcaster/frame-core/dist/actions/AddMiniApp"; +import type { FrameContext } from "@farcaster/frame-core/dist/context"; +import { sdk } from "@farcaster/frame-sdk"; +import { useQuery } from "@tanstack/react-query"; +import { + type ReactNode, + createContext, + useCallback, + useContext, + useState, +} from "react"; + +interface MiniAppContextType { + isMiniAppReady: boolean; + context: FrameContext | null; + setMiniAppReady: () => void; + addMiniApp: () => Promise; +} + +// eslint-disable-next-line no-restricted-syntax +const MiniAppContext = createContext(undefined); + +export function MiniAppProvider({ + addMiniAppOnLoad, + children, +}: { + addMiniAppOnLoad?: boolean; + children: ReactNode; +}) { + const [context, setContext] = useState(null); + const [isMiniAppReady, setIsMiniAppReady] = useState(false); + + const setMiniAppReady = useCallback(async () => { + try { + const context = await sdk.context; + if (context) { + setContext(context as FrameContext); + } + await sdk.actions.ready(); + } catch (err) { + console.error("SDK initialization error:", err); + } finally { + setIsMiniAppReady(true); + } + }, []); + + useQuery({ + queryKey: ["frame-ready"], + queryFn: async () => { + try { + await setMiniAppReady(); + return true; + } catch (error) { + console.error("[error] setting mini app ready", error); + return false; + } + }, + }); + + const handleAddMiniApp = useCallback(async () => { + try { + const result = await sdk.actions.addFrame(); + if (result) { + return result; + } + return null; + } catch (error) { + console.error("[error] adding frame", error); + return null; + } + }, []); + + useQuery({ + queryKey: ["frame-add"], + queryFn: async () => { + try { + await handleAddMiniApp(); + return true; + } catch (error) { + console.error("[error] adding frame", error); + return false; + } + }, + enabled: isMiniAppReady && !context?.client?.added && addMiniAppOnLoad, + }); + + return ( + + {children} + + ); +} + +export function useMiniApp() { + const context = useContext(MiniAppContext); + if (context === undefined) { + throw new Error("useMiniApp must be used within a MiniAppProvider"); + } + return context; +} diff --git a/apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts b/apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts new file mode 100644 index 00000000000..c2e4791bc9d --- /dev/null +++ b/apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts @@ -0,0 +1,53 @@ +/** + * Get the farcaster manifest for the frame, generate yours from Warpcast Mobile + * On your phone to Settings > Developer > Domains > insert website hostname > Generate domain manifest + * @returns The farcaster manifest for the frame + */ +export async function getFarcasterManifest() { + let frameName = "Nebula"; + let noindex = false; + const appUrl = process.env.NEXT_PUBLIC_URL || "http://nebula.localhost:3000"; + if (appUrl.includes("localhost")) { + frameName += " Local"; + noindex = true; + } else if (appUrl.includes("ngrok")) { + frameName += " NGROK"; + noindex = true; + } else if (appUrl.includes("https://dev.")) { + frameName += " Dev"; + noindex = true; + } + return { + accountAssociation: { + header: process.env.NEXT_PUBLIC_FARCASTER_HEADER, + payload: process.env.NEXT_PUBLIC_FARCASTER_PAYLOAD, + signature: process.env.NEXT_PUBLIC_FARCASTER_SIGNATURE, + }, + frame: { + version: "1", + name: frameName, + iconUrl: `${appUrl}/images/icon.png`, + homeUrl: appUrl, + imageUrl: `${appUrl}/images/feed.png`, + buttonTitle: "Launch App", + splashImageUrl: `${appUrl}/images/splash.png`, + splashBackgroundColor: "#FFFFFF", + webhookUrl: `${appUrl}/api/webhook`, + // Metadata https://github.com/farcasterxyz/miniapps/discussions/191 + subtitle: "AI-powered chat", // 30 characters, no emojis or special characters, short description under app name + description: "AI-powered chat", // 170 characters, no emojis or special characters, promotional message displayed on Mini App Page + primaryCategory: "social", + tags: ["nebula", "ai", "defi", "chat", "social"], // up to 5 tags, filtering/search tags + tagline: "AI-powered chat", // 30 characters, marketing tagline should be punchy and descriptive + ogTitle: `${frameName}`, // 30 characters, app name + short tag, Title case, no emojis + ogDescription: "AI-powered chat", // 100 characters, summarize core benefits in 1-2 lines + screenshotUrls: [ + // 1284 x 2778, visual previews of the app, max 3 screenshots + `${appUrl}/images/feed.png`, + ], + heroImageUrl: `${appUrl}/images/feed.png`, // 1200 x 630px (1.91:1), promotional display image on top of the mini app store + ogImageUrl: `${appUrl}/images/feed.png`, // 1200 x 630px (1.91:1), promotional image, same as app hero image + noindex: noindex, + }, + }; +} diff --git a/apps/dashboard/src/app/nebula-app/providers.tsx b/apps/dashboard/src/app/nebula-app/providers.tsx index 532bb20ab06..4a0e42474ab 100644 --- a/apps/dashboard/src/app/nebula-app/providers.tsx +++ b/apps/dashboard/src/app/nebula-app/providers.tsx @@ -7,6 +7,7 @@ import { useMemo } from "react"; import { Toaster } from "sonner"; import { ThirdwebProvider, useActiveAccount } from "thirdweb/react"; import { NebulaConnectWallet } from "./(app)/components/NebulaConnectButton"; +import { MiniAppProvider } from "./_farcaster/miniapp-context"; const queryClient = new QueryClient(); @@ -14,17 +15,19 @@ export function NebulaProviders(props: { children: React.ReactNode }) { return ( - - - - {props.children} - - + + + + + {props.children} + + + ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f7f5967148..f032dd973cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,6 +76,12 @@ importers: '@emotion/styled': specifier: 11.14.0 version: 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) + '@farcaster/frame-core': + specifier: ^0.1.8 + version: 0.1.8(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@farcaster/frame-sdk': + specifier: ^0.0.60 + version: 0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24) '@hookform/resolvers': specifier: ^3.9.1 version: 3.10.0(react-hook-form@7.55.0(react@19.1.0)) @@ -3482,6 +3488,17 @@ packages: resolution: {integrity: sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==} hasBin: true + '@farcaster/frame-core@0.1.8': + resolution: {integrity: sha512-Y0JATQXa/iaqH3pCp8Dby4iCQbwqw7JJaGtfzUazdr7R+zs3EDP8DYQCkqJu6iGjE9gqgecB+b+DOZpnqMTDNw==} + + '@farcaster/frame-sdk@0.0.60': + resolution: {integrity: sha512-MHQwdFT1VPe3kS0NvnORBPb/DQXr8qpdSDgIgfrdVCB8byQ5uFELlr3gQMuFYFyLFQVXgbMl75z8O6+hvorqow==} + + '@farcaster/quick-auth@0.0.5': + resolution: {integrity: sha512-Z8hWz/7c33zlmII2AJHja/Wz0C03mm2o+CEBtBylmiun1wC4FMgx1Fal699VQvBUG1lpcJ662WxuRNxKogktDw==} + peerDependencies: + typescript: 5.8.3 + '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -8976,6 +8993,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comlink@4.4.2: + resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -11490,6 +11510,9 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + jose@6.0.10: resolution: {integrity: sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==} @@ -13006,6 +13029,14 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + ox@0.4.4: + resolution: {integrity: sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + ox@0.6.12: resolution: {integrity: sha512-78hziRGLj0qTDa0UW4+ynv9tW2Cp1vmCfGokL8D7kiSDh6Y0LAfHL+HaDN4l2a9jcrOG3fexTDtLNtDNkEwLtg==} peerDependencies: @@ -19736,6 +19767,37 @@ snapshots: find-up: 5.0.0 js-yaml: 4.1.0 + '@farcaster/frame-core@0.1.8(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + ox: 0.4.4(typescript@5.8.3)(zod@3.25.24) + zod: 3.25.24 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@farcaster/frame-sdk@0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24)': + dependencies: + '@farcaster/frame-core': 0.1.8(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@farcaster/quick-auth': 0.0.5(typescript@5.8.3) + comlink: 4.4.2 + eventemitter3: 5.0.1 + ox: 0.4.4(typescript@5.8.3)(zod@3.25.24) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + '@farcaster/quick-auth@0.0.5(typescript@5.8.3)': + dependencies: + jose: 5.10.0 + typescript: 5.8.3 + zod: 3.25.24 + '@floating-ui/core@1.6.9': dependencies: '@floating-ui/utils': 0.2.9 @@ -20385,7 +20447,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -25940,7 +26002,7 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.27.2 + '@babel/parser': 7.27.3 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 @@ -27403,13 +27465,13 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.27.3 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -28148,6 +28210,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comlink@4.4.2: {} + comma-separated-tokens@1.0.8: {} comma-separated-tokens@2.0.3: {} @@ -28663,7 +28727,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 csstype: 3.1.3 dom-serializer@0.2.2: @@ -29130,7 +29194,7 @@ snapshots: '@typescript-eslint/parser': 7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react: 7.37.5(eslint@9.24.0(jiti@2.4.2)) @@ -29150,33 +29214,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@8.1.1) - eslint: 8.57.0 + eslint: 9.24.0(jiti@2.4.2) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@8.1.1) - eslint: 9.24.0(jiti@2.4.2) + eslint: 8.57.0 get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -29212,14 +29276,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -29263,7 +29327,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -29914,7 +29978,7 @@ snapshots: fast-unique-numbers@8.0.13: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 tslib: 2.8.1 fast-uri@3.0.6: {} @@ -31172,7 +31236,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/parser': 7.27.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.2 @@ -31336,6 +31400,8 @@ snapshots: jose@4.15.9: {} + jose@5.10.0: {} + jose@6.0.10: {} joycon@3.1.1: {} @@ -33219,6 +33285,20 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + ox@0.4.4(typescript@5.8.3)(zod@3.25.24): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.24) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + ox@0.6.12(typescript@5.8.3)(zod@3.25.24): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -34017,7 +34097,7 @@ snapshots: react-clientside-effect@1.2.7(react@19.1.0): dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 react: 19.1.0 react-confetti@6.3.0(react@19.1.0): @@ -34355,7 +34435,7 @@ snapshots: react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -37058,19 +37138,19 @@ snapshots: worker-timers-broker@6.1.8: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 fast-unique-numbers: 8.0.13 tslib: 2.8.1 worker-timers-worker: 7.0.71 worker-timers-worker@7.0.71: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 tslib: 2.8.1 worker-timers@7.1.8: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.3 tslib: 2.8.1 worker-timers-broker: 6.1.8 worker-timers-worker: 7.0.71 From aebe84416265d1137c5380802bad67a22db5ffed Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Tue, 10 Jun 2025 11:39:06 +0200 Subject: [PATCH 02/10] feat: update with neynar and farcaster.json --- apps/dashboard/package.json | 1 + .../public/.well-known/farcaster.json | 30 ++ .../assets/nebula/frame/ask-nebula-pfp.png | Bin 0 -> 24268 bytes .../assets/nebula/frame/ask-nebula-pfp.svg | 8 + .../assets/nebula/frame/farcaster-logo.svg | 7 + .../public/assets/nebula/frame/frame.png | Bin 0 -> 89328 bytes .../public/assets/nebula/frame/hero.svg | 27 ++ .../public/assets/nebula/frame/icon.png | Bin 0 -> 24268 bytes .../public/assets/nebula/frame/icon.svg | 16 + .../public/assets/nebula/frame/og.svg | 22 + .../public/assets/nebula/frame/screenshot.svg | 69 ++++ .../public/assets/nebula/frame/splash.png | Bin 0 -> 26426 bytes .../public/assets/nebula/frame/splash.svg | 24 ++ .../assets/nebula/frame/thirdweb-logo.png | 1 + .../public/assets/nebula/frame/user-logo.svg | 5 + .../nebula-app/_farcaster/miniapp-context.tsx | 109 ----- apps/dashboard/src/app/nebula-app/layout.tsx | 33 +- .../src/app/nebula-app/providers.tsx | 8 +- pnpm-lock.yaml | 381 +++++++++++++++++- 19 files changed, 611 insertions(+), 130 deletions(-) create mode 100644 apps/dashboard/public/.well-known/farcaster.json create mode 100644 apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.png create mode 100644 apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/farcaster-logo.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/frame.png create mode 100644 apps/dashboard/public/assets/nebula/frame/hero.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/icon.png create mode 100644 apps/dashboard/public/assets/nebula/frame/icon.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/og.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/screenshot.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/splash.png create mode 100644 apps/dashboard/public/assets/nebula/frame/splash.svg create mode 100644 apps/dashboard/public/assets/nebula/frame/thirdweb-logo.png create mode 100644 apps/dashboard/public/assets/nebula/frame/user-logo.svg delete mode 100644 apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 4cb3d22c351..2d504bd7b8c 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -31,6 +31,7 @@ "@farcaster/frame-sdk": "^0.0.60", "@hookform/resolvers": "^3.9.1", "@marsidev/react-turnstile": "^1.1.0", + "@neynar/react": "^1.2.3", "@radix-ui/react-accordion": "^1.2.7", "@radix-ui/react-alert-dialog": "^1.1.10", "@radix-ui/react-avatar": "^1.1.6", diff --git a/apps/dashboard/public/.well-known/farcaster.json b/apps/dashboard/public/.well-known/farcaster.json new file mode 100644 index 00000000000..43ba2677df5 --- /dev/null +++ b/apps/dashboard/public/.well-known/farcaster.json @@ -0,0 +1,30 @@ +{ + "accountAssociation": { + "header": "eyJmaWQiOjE4ODM1MiwidHlwZSI6ImN1c3RvZHkiLCJrZXkiOiIweGFiOTZCNkEzNmVCYzYzMzI3MkE2ZUI2QWQzOUQ5NzljQjllNTE0M0UifQ", + "payload": "eyJkb21haW4iOiJhc2tuZWJ1bGEtZmFyY2FzdGVyLnRoaXJkd2ViLmNvbSJ9", + "signature": "MHg5NjZhOTQ3MTY4MDcwNmMzNzFhYjJiYjM4OGQzNGUzM2U4YWJjNTQ0NTQwNmZkMmJkZjc2OTE4MTBkYWI3ZTczMTg3NzgyZjQ0YzEzZDdkM2VhNWU5MGJlYmYyMGE5ZDNjNTlmM2MzM2E2ZWRlODg3OTliMmQwYTk1MzhhNjBlYTFj" + }, + "frame": { + "version": "1", + "name": "Nebula", + "iconUrl": "https://nebula.thirdweb.com/assets/nebula/frame/ask-nebula-pfp.png", + "imageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/frame.png", + "homeUrl": "https://nebula.thirdweb.com/", + "splashImageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/ask-nebula-pfp.png", + "splashBackgroundColor": "#171B20", + "subtitle": "Web3 AI Assistant", + "description": "Ask questions about your web3 activity, get AI-powered insights about your wallet, and explore blockchain data through natural language", + "primaryCategory": "utility", + "tags": ["ai", "web3", "blockchain", "insights", "wallet"], + "tagline": "Your AI guide to web3", + "ogTitle": "Nebula - Web3 AI Assistant", + "ogDescription": "Interact with your wallet data through natural language queries powered by Thirdweb Nebula AI", + "heroImageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/screenshot.svg", + "ogImageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/og.svg", + "screenshotUrls": [ + "https://nebula.thirdweb.com/assets/nebula/frame/screenshot.svg", + "https://nebula.thirdweb.com/assets/nebula/frame/frame.png", + "https://nebula.thirdweb.com/assets/nebula/frame/og.svg" + ] + } + } \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.png b/apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e5744a0b484e667464c78f5aa36e610ad2dc0f GIT binary patch literal 24268 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 NP8*vU6(4ts_%|JYrsDtr literal 0 HcmV?d00001 diff --git a/apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.svg b/apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.svg new file mode 100644 index 00000000000..8bf89db8383 --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/ask-nebula-pfp.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/farcaster-logo.svg b/apps/dashboard/public/assets/nebula/frame/farcaster-logo.svg new file mode 100644 index 00000000000..062943dd91c --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/farcaster-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/dashboard/public/assets/nebula/frame/frame.png b/apps/dashboard/public/assets/nebula/frame/frame.png new file mode 100644 index 0000000000000000000000000000000000000000..39ef1e6338a683c179b6549f2fd9e2422d49d3fc GIT binary patch literal 89328 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±Gn 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 UUU%6HA&12sRV|g0n^qD35Bimce*gdg literal 0 HcmV?d00001 diff --git a/apps/dashboard/public/assets/nebula/frame/hero.svg b/apps/dashboard/public/assets/nebula/frame/hero.svg new file mode 100644 index 00000000000..8873deaae87 --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/hero.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AskNebula + Your Web3 AI Assistant + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/icon.png b/apps/dashboard/public/assets/nebula/frame/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e5744a0b484e667464c78f5aa36e610ad2dc0f GIT binary patch literal 24268 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 NP8*vU6(4ts_%|JYrsDtr literal 0 HcmV?d00001 diff --git a/apps/dashboard/public/assets/nebula/frame/icon.svg b/apps/dashboard/public/assets/nebula/frame/icon.svg new file mode 100644 index 00000000000..84228c6dd3f --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/og.svg b/apps/dashboard/public/assets/nebula/frame/og.svg new file mode 100644 index 00000000000..cd00953b3ae --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/og.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + AskNebula + Web3 AI Assistant + + + Ask questions about your web3 activity + Get AI-powered insights about your wallet + Explore blockchain data through natural language + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/screenshot.svg b/apps/dashboard/public/assets/nebula/frame/screenshot.svg new file mode 100644 index 00000000000..9e6eb1de640 --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/screenshot.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + AskNebula + by cromewar.eth + + + + × + + ⌄ + ⋯ + + + + Vasiliy Kirochka + 0x1ca8...01d1 + + + + ⟳ + + ↗ + + + + AskNebula Chat + + + + Session + active + + + + Wallet + connected + + + + + Welcome to AskNebula chat! Ask me + anything about your web3 activity. + less than a minute ago + + + + What is my balance? + + + What was my last transaction? + + + What was my last minted NFT? + + + + Ask me anything? + + → + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/splash.png b/apps/dashboard/public/assets/nebula/frame/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ea30a62c75248d3b41af4ac83f4268c3173bcd GIT binary patch literal 26426 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 bia4sfQ&pEa>U}_|oBy=b^i(0rR$>1SjxLL@ literal 0 HcmV?d00001 diff --git a/apps/dashboard/public/assets/nebula/frame/splash.svg b/apps/dashboard/public/assets/nebula/frame/splash.svg new file mode 100644 index 00000000000..8bb9456be77 --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/splash.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/thirdweb-logo.png b/apps/dashboard/public/assets/nebula/frame/thirdweb-logo.png new file mode 100644 index 00000000000..ec919ab48eb --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/thirdweb-logo.png @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/dashboard/public/assets/nebula/frame/user-logo.svg b/apps/dashboard/public/assets/nebula/frame/user-logo.svg new file mode 100644 index 00000000000..44dc35cbd08 --- /dev/null +++ b/apps/dashboard/public/assets/nebula/frame/user-logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx b/apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx deleted file mode 100644 index 7be31b6734f..00000000000 --- a/apps/dashboard/src/app/nebula-app/_farcaster/miniapp-context.tsx +++ /dev/null @@ -1,109 +0,0 @@ -"use client"; - -import type { AddMiniAppResult } from "@farcaster/frame-core/dist/actions/AddMiniApp"; -import type { FrameContext } from "@farcaster/frame-core/dist/context"; -import { sdk } from "@farcaster/frame-sdk"; -import { useQuery } from "@tanstack/react-query"; -import { - type ReactNode, - createContext, - useCallback, - useContext, - useState, -} from "react"; - -interface MiniAppContextType { - isMiniAppReady: boolean; - context: FrameContext | null; - setMiniAppReady: () => void; - addMiniApp: () => Promise; -} - -// eslint-disable-next-line no-restricted-syntax -const MiniAppContext = createContext(undefined); - -export function MiniAppProvider({ - addMiniAppOnLoad, - children, -}: { - addMiniAppOnLoad?: boolean; - children: ReactNode; -}) { - const [context, setContext] = useState(null); - const [isMiniAppReady, setIsMiniAppReady] = useState(false); - - const setMiniAppReady = useCallback(async () => { - try { - const context = await sdk.context; - if (context) { - setContext(context as FrameContext); - } - await sdk.actions.ready(); - } catch (err) { - console.error("SDK initialization error:", err); - } finally { - setIsMiniAppReady(true); - } - }, []); - - useQuery({ - queryKey: ["frame-ready"], - queryFn: async () => { - try { - await setMiniAppReady(); - return true; - } catch (error) { - console.error("[error] setting mini app ready", error); - return false; - } - }, - }); - - const handleAddMiniApp = useCallback(async () => { - try { - const result = await sdk.actions.addFrame(); - if (result) { - return result; - } - return null; - } catch (error) { - console.error("[error] adding frame", error); - return null; - } - }, []); - - useQuery({ - queryKey: ["frame-add"], - queryFn: async () => { - try { - await handleAddMiniApp(); - return true; - } catch (error) { - console.error("[error] adding frame", error); - return false; - } - }, - enabled: isMiniAppReady && !context?.client?.added && addMiniAppOnLoad, - }); - - return ( - - {children} - - ); -} - -export function useMiniApp() { - const context = useContext(MiniAppContext); - if (context === undefined) { - throw new Error("useMiniApp must be used within a MiniAppProvider"); - } - return context; -} diff --git a/apps/dashboard/src/app/nebula-app/layout.tsx b/apps/dashboard/src/app/nebula-app/layout.tsx index 927bbc8a5eb..75a2319ffff 100644 --- a/apps/dashboard/src/app/nebula-app/layout.tsx +++ b/apps/dashboard/src/app/nebula-app/layout.tsx @@ -1,4 +1,4 @@ -import type { Metadata } from "next"; +// import type { Metadata } from "next"; import "../../global.css"; import "./nebula-global.css"; import { DashboardRouterTopProgressBar } from "@/lib/DashboardRouter"; @@ -15,14 +15,33 @@ const title = const description = "The most powerful AI for interacting with the blockchain, with real-time access to EVM chains and their data"; -export const metadata: Metadata = { - title, - description, - openGraph: { +export async function generateMetadata() { + return { title, description, - }, -}; + openGraph: { + title, + description, + }, + other: { + "fc:frame":JSON.stringify({ + version: "next", + imageUrl: "http://nebula.localhost:3000/assets/nebula/frame/frame.png", + button: { + title: "Start Chatting", + action: { + type: "launch_frame", + name: "Nebula", + url: "http://nebula.localhost:3000", + splashImageUrl: "http://nebula.localhost:3000/assets/nebula/frame/splash.png", + splashBackgroundColor: "#0f172a" + } + } + } + )} + } +} + const fontSans = Inter({ subsets: ["latin"], diff --git a/apps/dashboard/src/app/nebula-app/providers.tsx b/apps/dashboard/src/app/nebula-app/providers.tsx index 4a0e42474ab..b5158389b8e 100644 --- a/apps/dashboard/src/app/nebula-app/providers.tsx +++ b/apps/dashboard/src/app/nebula-app/providers.tsx @@ -7,15 +7,15 @@ import { useMemo } from "react"; import { Toaster } from "sonner"; import { ThirdwebProvider, useActiveAccount } from "thirdweb/react"; import { NebulaConnectWallet } from "./(app)/components/NebulaConnectButton"; -import { MiniAppProvider } from "./_farcaster/miniapp-context"; +import { MiniAppProvider } from "@neynar/react"; const queryClient = new QueryClient(); export function NebulaProviders(props: { children: React.ReactNode }) { return ( + - - - + + ); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f032dd973cf..f219ad21275 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,6 +88,9 @@ importers: '@marsidev/react-turnstile': specifier: ^1.1.0 version: 1.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@neynar/react': + specifier: ^1.2.3 + version: 1.2.3(@farcaster/frame-sdk@0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24))(@pigment-css/react@0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3))(hls.js@1.6.5)(mipd@0.0.7(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(swr@2.3.3(react@19.1.0)) '@radix-ui/react-accordion': specifier: ^1.2.7 version: 1.2.7(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2746,6 +2749,9 @@ packages: '@emotion/cache@11.14.0': resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + '@emotion/css@11.13.5': + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -4292,6 +4298,63 @@ packages: resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} + '@mui/private-theming@6.4.9': + resolution: {integrity: sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@6.4.11': + resolution: {integrity: sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@6.4.12': + resolution: {integrity: sha512-fgEfm1qxpKCztndESeL1L0sLwA2c7josZ2w42D8OM3pbLee4bH2twEjoMo6qf7z2rNw1Uc9EU9haXeMoq0oTdQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.24': + resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@6.4.9': + resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@napi-rs/wasm-runtime@0.2.10': resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} @@ -4366,6 +4429,17 @@ packages: cpu: [x64] os: [win32] + '@neynar/react@1.2.3': + resolution: {integrity: sha512-oWnCCVnXrovkP4e4+cKBIahHPwJDt2qMujY8y+2c1DMlqRkQLNxeIWwDpGEjTeo3ctATZ5jh5GJHdMeR3IXBMQ==} + peerDependencies: + '@farcaster/frame-sdk': '>=0.0.53 <1.0.0' + '@pigment-css/react': ^0.0.30 + hls.js: ^1.5.20 + mipd: '>=0.0.7 <1.0.0' + react: ^19.0.0 + react-dom: ^19.0.0 + swr: ^2.3.2 + '@noble/ciphers@0.5.3': resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} @@ -4762,6 +4836,12 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' + '@pigment-css/react@0.0.30': + resolution: {integrity: sha512-aNvpOgbv+M9+YV2wKk3CIyiiiF+8S6KJJKDKGzhFWOVWeQFZBgTOjBHhL/0SyAnCOVjDg2sSXOEElIdEQywXKQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -7279,6 +7359,9 @@ packages: '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qrcode@1.5.5': resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} @@ -7987,6 +8070,18 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@wyw-in-js/processor-utils@0.5.5': + resolution: {integrity: sha512-L3IcAfoowhM0fw9Cnv2CNzfjWNLKpYl2CFqam6NvwpiXNR1kXz/GpO0AOiKvCs5h4Ps5kWxE2e8knXLpk8q/2g==} + engines: {node: '>=16.0.0'} + + '@wyw-in-js/shared@0.5.5': + resolution: {integrity: sha512-Wnvp3RGfynHk81lrp/0fA+Yv5yuIr2Ej13N3lawQeqbK4KlMag3P9npyIljGrEiwK2Bv4byHuXsJFgLI0Fo8bw==} + engines: {node: '>=16.0.0'} + + '@wyw-in-js/transform@0.5.5': + resolution: {integrity: sha512-XMZjhS8poHpxfPg41rkc6eh3Mr2BZAFM7OzYN4jPZUicpJKv7uQAU2dLEqnyDcDllo04LbZIryb2fXwpr+pqPw==} + engines: {node: '>=16.0.0'} + '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} @@ -8363,6 +8458,12 @@ packages: '@babel/core': ^7.12.0 webpack: '>=5' + babel-merge@3.0.0: + resolution: {integrity: sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@babel/core': ^7.0.0 + babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} @@ -9128,6 +9229,15 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -9233,6 +9343,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssjanus@2.3.0: + resolution: {integrity: sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==} + engines: {node: '>=10.0.0'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -9405,6 +9519,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@2.2.1: + resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} + engines: {node: '>=0.10.0'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -10733,6 +10851,10 @@ packages: engines: {node: '>=0.4.7'} hasBin: true + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} + happy-dom@17.4.4: resolution: {integrity: sha512-/Pb0ctk3HTZ5xEL3BZ0hK1AqDSAUuRQitOmROPHhfUYEWpmTImwfD8vFDGADmMAX0JYgbcgxWoLFKtsWhcpuVA==} engines: {node: '>=18.0.0'} @@ -10885,6 +11007,9 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + hls.js@1.6.5: + resolution: {integrity: sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ==} + hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -11192,6 +11317,10 @@ packages: is-empty@1.2.0: resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -12911,6 +13040,10 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} + object.omit@3.0.0: + resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} + engines: {node: '>=0.10.0'} + object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -13875,6 +14008,9 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.1.0: + resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} + react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: @@ -14962,6 +15098,11 @@ packages: babel-plugin-macros: optional: true + stylis-plugin-rtl@2.1.1: + resolution: {integrity: sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==} + peerDependencies: + stylis: 4.x + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -15017,6 +15158,11 @@ packages: react: '>=16.8.0 <19' react-dom: '>=16.8.0 <19' + swr@2.3.3: + resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + synckit@0.11.6: resolution: {integrity: sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -15242,6 +15388,10 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} @@ -17449,6 +17599,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.3)': + dependencies: + '@babel/core': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.3)': dependencies: '@babel/core': 7.27.3 @@ -17878,6 +18037,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.3)': + dependencies: + '@babel/core': 7.27.3 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 @@ -18834,6 +19001,16 @@ snapshots: '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 + '@emotion/css@11.13.5': + dependencies: + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + transitivePeerDependencies: + - supports-color + '@emotion/hash@0.9.2': {} '@emotion/is-prop-valid@1.2.2': @@ -20800,6 +20977,60 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@mui/private-theming@6.4.9(@types/react@19.1.4)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.3 + '@mui/utils': 6.4.9(@types/react@19.1.4)(react@19.1.0) + prop-types: 15.8.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.4 + + '@mui/styled-engine@6.4.11(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.3 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.0 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.4)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) + + '@mui/system@6.4.12(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.3 + '@mui/private-theming': 6.4.9(@types/react@19.1.4)(react@19.1.0) + '@mui/styled-engine': 6.4.11(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(react@19.1.0) + '@mui/types': 7.2.24(@types/react@19.1.4) + '@mui/utils': 6.4.9(@types/react@19.1.4)(react@19.1.0) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.0 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.4)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) + '@types/react': 19.1.4 + + '@mui/types@7.2.24(@types/react@19.1.4)': + optionalDependencies: + '@types/react': 19.1.4 + + '@mui/utils@6.4.9(@types/react@19.1.4)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.3 + '@mui/types': 7.2.24(@types/react@19.1.4) + '@types/prop-types': 15.7.15 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.1.0 + react-is: 19.1.0 + optionalDependencies: + '@types/react': 19.1.4 + '@napi-rs/wasm-runtime@0.2.10': dependencies: '@emnapi/core': 1.4.3 @@ -20853,6 +21084,16 @@ snapshots: '@next/swc-win32-x64-msvc@15.3.2': optional: true + '@neynar/react@1.2.3(@farcaster/frame-sdk@0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24))(@pigment-css/react@0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3))(hls.js@1.6.5)(mipd@0.0.7(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(swr@2.3.3(react@19.1.0))': + dependencies: + '@farcaster/frame-sdk': 0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24) + '@pigment-css/react': 0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3) + hls.js: 1.6.5 + mipd: 0.0.7(typescript@5.8.3) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + swr: 2.3.3(react@19.1.0) + '@noble/ciphers@0.5.3': {} '@noble/ciphers@1.2.1': {} @@ -21331,6 +21572,36 @@ snapshots: '@paulmillr/qr@0.2.1': {} + '@pigment-css/react@0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3)': + dependencies: + '@babel/core': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.27.3 + '@babel/types': 7.27.3 + '@emotion/css': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@19.1.4)(react@19.1.0) + '@emotion/serialize': 1.3.3 + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) + '@mui/system': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) + '@mui/utils': 6.4.9(@types/react@19.1.4)(react@19.1.0) + '@wyw-in-js/processor-utils': 0.5.5 + '@wyw-in-js/shared': 0.5.5 + '@wyw-in-js/transform': 0.5.5(typescript@5.8.3) + clsx: 2.1.1 + cssesc: 3.0.0 + csstype: 3.1.3 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 19.1.0 + stylis: 4.3.6 + stylis-plugin-rtl: 2.1.1(stylis@4.3.6) + transitivePeerDependencies: + - '@types/react' + - supports-color + - typescript + '@pkgjs/parseargs@0.11.0': optional: true @@ -25448,6 +25719,8 @@ snapshots: '@types/node': 22.14.1 kleur: 3.0.3 + '@types/prop-types@15.7.15': {} + '@types/qrcode@1.5.5': dependencies: '@types/node': 22.14.1 @@ -27088,6 +27361,42 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@wyw-in-js/processor-utils@0.5.5': + dependencies: + '@babel/generator': 7.27.3 + '@wyw-in-js/shared': 0.5.5 + transitivePeerDependencies: + - supports-color + + '@wyw-in-js/shared@0.5.5': + dependencies: + debug: 4.4.1(supports-color@8.1.1) + find-up: 5.0.0 + minimatch: 9.0.5 + transitivePeerDependencies: + - supports-color + + '@wyw-in-js/transform@0.5.5(typescript@5.8.3)': + dependencies: + '@babel/core': 7.27.3 + '@babel/generator': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.3) + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.3 + '@babel/types': 7.27.3 + '@wyw-in-js/processor-utils': 0.5.5 + '@wyw-in-js/shared': 0.5.5 + babel-merge: 3.0.0(@babel/core@7.27.3) + cosmiconfig: 8.3.6(typescript@5.8.3) + happy-dom: 15.11.7 + source-map: 0.7.4 + stylis: 4.3.6 + ts-invariant: 0.10.3 + transitivePeerDependencies: + - supports-color + - typescript + '@xmldom/xmldom@0.7.13': {} '@xmldom/xmldom@0.8.10': {} @@ -27452,6 +27761,12 @@ snapshots: schema-utils: 4.3.2 webpack: 5.99.9(esbuild@0.25.4) + babel-merge@3.0.0(@babel/core@7.27.3): + dependencies: + '@babel/core': 7.27.3 + deepmerge: 2.2.1 + object.omit: 3.0.0 + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -28347,6 +28662,15 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + cosmiconfig@8.3.6(typescript@5.8.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.8.3 + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 @@ -28481,6 +28805,8 @@ snapshots: cssesc@3.0.0: {} + cssjanus@2.3.0: {} + csstype@3.1.3: {} cva@1.0.0-beta.2(typescript@5.8.3): @@ -28611,6 +28937,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge@2.2.1: {} + deepmerge@4.3.1: {} default-browser-id@5.0.0: {} @@ -29194,7 +29522,7 @@ snapshots: '@typescript-eslint/parser': 7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react: 7.37.5(eslint@9.24.0(jiti@2.4.2)) @@ -29214,33 +29542,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@8.1.1) - eslint: 9.24.0(jiti@2.4.2) + eslint: 8.57.0 get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@8.1.1) - eslint: 8.57.0 + eslint: 9.24.0(jiti@2.4.2) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -29276,14 +29604,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -29327,7 +29655,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -30476,6 +30804,12 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 + happy-dom@15.11.7: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + happy-dom@17.4.4: dependencies: webidl-conversions: 7.0.0 @@ -30732,6 +31066,8 @@ snapshots: highlightjs-vue@1.0.0: {} + hls.js@1.6.5: {} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -31056,6 +31392,10 @@ snapshots: is-empty@1.2.0: {} + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -33136,6 +33476,10 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 + object.omit@3.0.0: + dependencies: + is-extendable: 1.0.1 + object.values@1.2.1: dependencies: call-bind: 1.0.8 @@ -34216,6 +34560,8 @@ snapshots: react-is@18.3.1: {} + react-is@19.1.0: {} + react-markdown@10.1.0(@types/react@19.1.4)(react@19.1.0): dependencies: '@types/hast': 3.0.4 @@ -35641,6 +35987,11 @@ snapshots: optionalDependencies: '@babel/core': 7.27.1 + stylis-plugin-rtl@2.1.1(stylis@4.3.6): + dependencies: + cssjanus: 2.3.0 + stylis: 4.3.6 + stylis@4.2.0: {} stylis@4.3.2: {} @@ -35746,6 +36097,12 @@ snapshots: - '@types/react' - debug + swr@2.3.3(react@19.1.0): + dependencies: + dequal: 2.0.3 + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) + synckit@0.11.6: dependencies: '@pkgr/core': 0.2.4 @@ -35995,6 +36352,10 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-invariant@0.10.3: + dependencies: + tslib: 2.8.1 + ts-mixer@6.0.4: {} ts-pnp@1.2.0(typescript@5.8.3): From 978b1628ce19401069939d234d2aa8d2fc91308a Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Tue, 10 Jun 2025 15:58:38 +0200 Subject: [PATCH 03/10] feat: working mini app login. --- apps/dashboard/next.config.ts | 3 +- .../.well-known/apple-app-site-association | 30 ---- .../public/.well-known/assetlinks.json | 15 -- .../public/.well-known/farcaster.json | 30 ---- .../apple-app-site-association.json/route.ts | 36 +++++ .../route.ts | 3 + .../app/.well-known/assetlinks.json/route.ts | 19 +++ .../app/.well-known/farcaster.json/route.ts | 47 ++++++ .../(app)/_farcaster/miniapp-provider.tsx | 139 ++++++++++++++++++ .../src/app/nebula-app/(app)/page.tsx | 1 + .../src/app/nebula-app/_farcaster/warpcast.ts | 53 ------- apps/dashboard/src/app/nebula-app/layout.tsx | 23 +-- .../src/app/nebula-app/providers.tsx | 8 +- apps/dashboard/src/middleware.ts | 10 +- 14 files changed, 271 insertions(+), 146 deletions(-) delete mode 100644 apps/dashboard/public/.well-known/apple-app-site-association delete mode 100644 apps/dashboard/public/.well-known/assetlinks.json delete mode 100644 apps/dashboard/public/.well-known/farcaster.json create mode 100644 apps/dashboard/src/app/.well-known/apple-app-site-association.json/route.ts create mode 100644 apps/dashboard/src/app/.well-known/apple-developer-merchantid-domain-association/route.ts create mode 100644 apps/dashboard/src/app/.well-known/assetlinks.json/route.ts create mode 100644 apps/dashboard/src/app/.well-known/farcaster.json/route.ts create mode 100644 apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx delete mode 100644 apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts diff --git a/apps/dashboard/next.config.ts b/apps/dashboard/next.config.ts index ef23f2ed4a7..f5b13c2bcdd 100644 --- a/apps/dashboard/next.config.ts +++ b/apps/dashboard/next.config.ts @@ -29,7 +29,8 @@ const securityHeaders = [ }, { key: "X-Frame-Options", - value: "SAMEORIGIN", + // allow farcaster.xyz as a frame ancestor for the browser mini app + value: "frame-ancestors 'self' https://farcaster.xyz; default 'self'", }, { key: "Referrer-Policy", diff --git a/apps/dashboard/public/.well-known/apple-app-site-association b/apps/dashboard/public/.well-known/apple-app-site-association deleted file mode 100644 index c9cac6e71c3..00000000000 --- a/apps/dashboard/public/.well-known/apple-app-site-association +++ /dev/null @@ -1,30 +0,0 @@ -{ - "applinks": { - "apps": ["XYHGSFAMHX.com.thirdweb.demo"], - "details": [ - { - "appIDs": ["XYHGSFAMHX.com.thirdweb.demo"], - "components": [ - { - "#": "no_universal_links", - "exclude": true, - "comment": "Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link." - }, - { - "/": "/mobile-wallet-protocol", - "comment": "Matches any URL with a path that starts with /mobile-wallet-protocol for coinbase wallet mobile redirects." - }, - { - "/": "/dashboard/*", - "exclude": true, - "comment": "no universal link for dashboard" - } - ] - } - ] - }, - "webcredentials": { - "apps": ["XYHGSFAMHX.com.thirdweb.demo"] - }, - "appclips": {} -} diff --git a/apps/dashboard/public/.well-known/assetlinks.json b/apps/dashboard/public/.well-known/assetlinks.json deleted file mode 100644 index 46c70f80a5b..00000000000 --- a/apps/dashboard/public/.well-known/assetlinks.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "relation": [ - "delegate_permission/common.handle_all_urls", - "delegate_permission/common.get_login_creds" - ], - "target": { - "namespace": "android_app", - "package_name": "com.thirdweb.demo", - "sha256_cert_fingerprints": [ - "40:EB:0D:96:57:F3:D8:1F:BA:87:B8:E4:26:E0:3A:DB:C8:35:96:A8:A2:B2:55:F0:B1:64:F1:39:F8:6F:7E:EB" - ] - } - } -] diff --git a/apps/dashboard/public/.well-known/farcaster.json b/apps/dashboard/public/.well-known/farcaster.json deleted file mode 100644 index 43ba2677df5..00000000000 --- a/apps/dashboard/public/.well-known/farcaster.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "accountAssociation": { - "header": "eyJmaWQiOjE4ODM1MiwidHlwZSI6ImN1c3RvZHkiLCJrZXkiOiIweGFiOTZCNkEzNmVCYzYzMzI3MkE2ZUI2QWQzOUQ5NzljQjllNTE0M0UifQ", - "payload": "eyJkb21haW4iOiJhc2tuZWJ1bGEtZmFyY2FzdGVyLnRoaXJkd2ViLmNvbSJ9", - "signature": "MHg5NjZhOTQ3MTY4MDcwNmMzNzFhYjJiYjM4OGQzNGUzM2U4YWJjNTQ0NTQwNmZkMmJkZjc2OTE4MTBkYWI3ZTczMTg3NzgyZjQ0YzEzZDdkM2VhNWU5MGJlYmYyMGE5ZDNjNTlmM2MzM2E2ZWRlODg3OTliMmQwYTk1MzhhNjBlYTFj" - }, - "frame": { - "version": "1", - "name": "Nebula", - "iconUrl": "https://nebula.thirdweb.com/assets/nebula/frame/ask-nebula-pfp.png", - "imageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/frame.png", - "homeUrl": "https://nebula.thirdweb.com/", - "splashImageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/ask-nebula-pfp.png", - "splashBackgroundColor": "#171B20", - "subtitle": "Web3 AI Assistant", - "description": "Ask questions about your web3 activity, get AI-powered insights about your wallet, and explore blockchain data through natural language", - "primaryCategory": "utility", - "tags": ["ai", "web3", "blockchain", "insights", "wallet"], - "tagline": "Your AI guide to web3", - "ogTitle": "Nebula - Web3 AI Assistant", - "ogDescription": "Interact with your wallet data through natural language queries powered by Thirdweb Nebula AI", - "heroImageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/screenshot.svg", - "ogImageUrl": "https://nebula.thirdweb.com/assets/nebula/frame/og.svg", - "screenshotUrls": [ - "https://nebula.thirdweb.com/assets/nebula/frame/screenshot.svg", - "https://nebula.thirdweb.com/assets/nebula/frame/frame.png", - "https://nebula.thirdweb.com/assets/nebula/frame/og.svg" - ] - } - } \ No newline at end of file diff --git a/apps/dashboard/src/app/.well-known/apple-app-site-association.json/route.ts b/apps/dashboard/src/app/.well-known/apple-app-site-association.json/route.ts new file mode 100644 index 00000000000..ceefb7da147 --- /dev/null +++ b/apps/dashboard/src/app/.well-known/apple-app-site-association.json/route.ts @@ -0,0 +1,36 @@ +import { NextResponse } from "next/server"; + +export async function GET() { + return NextResponse.json({ + applinks: { + apps: ["XYHGSFAMHX.com.thirdweb.demo"], + details: [ + { + appIDs: ["XYHGSFAMHX.com.thirdweb.demo"], + components: [ + { + "#": "no_universal_links", + exclude: true, + comment: + "Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link.", + }, + { + "/": "/mobile-wallet-protocol", + comment: + "Matches any URL with a path that starts with /mobile-wallet-protocol for coinbase wallet mobile redirects.", + }, + { + "/": "/dashboard/*", + exclude: true, + comment: "no universal link for dashboard", + }, + ], + }, + ], + }, + webcredentials: { + apps: ["XYHGSFAMHX.com.thirdweb.demo"], + }, + appclips: {}, + }); +} diff --git a/apps/dashboard/src/app/.well-known/apple-developer-merchantid-domain-association/route.ts b/apps/dashboard/src/app/.well-known/apple-developer-merchantid-domain-association/route.ts new file mode 100644 index 00000000000..7d84734a856 --- /dev/null +++ b/apps/dashboard/src/app/.well-known/apple-developer-merchantid-domain-association/route.ts @@ -0,0 +1,3 @@ +export async function GET() { + return "7B227073704964223A2239373943394538343346343131343044463144313834343232393232313734313034353044314339464446394437384337313531303944334643463542433731222C2276657273696F6E223A312C22637265617465644F6E223A313536363233343735303036312C227369676E6174757265223A22333038303036303932613836343838366637306430313037303261303830333038303032303130313331306633303064303630393630383634383031363530333034303230313035303033303830303630393261383634383836663730643031303730313030303061303830333038323033653333303832303338386130303330323031303230323038346333303431343935313964353433363330306130363038326138363438636533643034303330323330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333031653137306433313339333033353331333833303331333333323335333735613137306433323334333033353331333633303331333333323335333735613330356633313235333032333036303335353034303330633163363536333633326437333664373032643632373236663662363537323264373336393637366535663535343333343264353035323466343433313134333031323036303335353034306230633062363934663533323035333739373337343635366437333331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333035393330313330363037326138363438636533643032303130363038326138363438636533643033303130373033343230303034633231353737656465626436633762323231386636386464373039306131323138646337623062643666326332383364383436303935643934616634613534313162383334323065643831316633343037653833333331663163353463336637656233323230643662616435643465666634393238393839336537633066313361333832303231313330383230323064333030633036303335353164313330313031666630343032333030303330316630363033353531643233303431383330313638303134323366323439633434663933653465663237653663346636323836633366613262626664326534623330343530363038326230363031303530353037303130313034333933303337333033353036303832623036303130353035303733303031383632393638373437343730336132663266366636333733373032653631373037303663363532653633366636643266366636333733373033303334326436313730373036633635363136393633363133333330333233303832303131643036303335353164323030343832303131343330383230313130333038323031306330363039326138363438383666373633363430353031333038316665333038316333303630383262303630313035303530373032303233303831623630633831623335323635366336393631366536333635323036663665323037343638363937333230363336353732373436393636363936333631373436353230363237393230363136653739323037303631373237343739323036313733373337353664363537333230363136333633363537303734363136653633363532303666363632303734363836353230373436383635366532303631373037303663363936333631363236633635323037333734363136653634363137323634323037343635373236643733323036313665363432303633366636653634363937343639366636653733323036663636323037353733363532633230363336353732373436393636363936333631373436353230373036663663363936333739323036313665363432303633363537323734363936363639363336313734363936663665323037303732363136333734363936333635323037333734363137343635366436353665373437333265333033363036303832623036303130353035303730323031313632613638373437343730336132663266373737373737326536313730373036633635326536333666366432663633363537323734363936363639363336313734363536313735373436383666373236393734373932663330333430363033353531643166303432643330326233303239613032376130323538363233363837343734373033613266326636333732366332653631373037303663363532653633366636643266363137303730366336353631363936333631333332653633373236633330316430363033353531643065303431363034313439343537646236666435373438313836383938393736326637653537383530376537396235383234333030653036303335353164306630313031666630343034303330323037383033303066303630393261383634383836663736333634303631643034303230353030333030613036303832613836343863653364303430333032303334393030333034363032323130306265303935373166653731653165373335623535653561666163623463373266656234343566333031383532323263373235313030326236316562643666353530323231303064313862333530613564643664643665623137343630333562313165623263653837636661336536616636636264383338303839306463383263646461613633333038323032656533303832303237356130303330323031303230323038343936643266626633613938646139373330306130363038326138363438636533643034303330323330363733313162333031393036303335353034303330633132343137303730366336353230353236663666373432303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330316531373064333133343330333533303336333233333334333633333330356131373064333233393330333533303336333233333334333633333330356133303761333132653330326330363033353530343033306332353431373037303663363532303431373037303663363936333631373436393666366532303439366537343635363737323631373436393666366532303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030346630313731313834313964373634383564353161356532353831303737366538383061326566646537626165346465303864666334623933653133333536643536363562333561653232643039373736306432323465376262613038666437363137636538386362373662623636373062656338653832393834666635343435613338316637333038316634333034363036303832623036303130353035303730313031303433613330333833303336303630383262303630313035303530373330303138363261363837343734373033613266326636663633373337303265363137303730366336353265363336663664326636663633373337303330333432643631373037303663363537323666366637343633363136373333333031643036303335353164306530343136303431343233663234396334346639336534656632376536633466363238366333666132626266643265346233303066303630333535316431333031303166663034303533303033303130316666333031663036303335353164323330343138333031363830313462626230646561313538333338383961613438613939646562656264656261666461636232346162333033373036303335353164316630343330333032653330326361303261613032383836323636383734373437303361326632663633373236633265363137303730366336353265363336663664326636313730373036633635373236663666373436333631363733333265363337323663333030653036303335353164306630313031666630343034303330323031303633303130303630613261383634383836663736333634303630323065303430323035303033303061303630383261383634386365336430343033303230333637303033303634303233303361636637323833353131363939623138366662333563333536636136326266663431376564643930663735346461323865626566313963383135653432623738396638393866373962353939663938643534313064386639646539633266653032333033323264643534343231623061333035373736633564663333383362393036376664313737633263323136643936346663363732363938323132366635346638376137643162393963623962303938393231363130363939306630393932316430303030333138323031386233303832303138373032303130313330383138363330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533303230383463333034313439353139643534333633303064303630393630383634383031363530333034303230313035303061303831393533303138303630393261383634383836663730643031303930333331306230363039326138363438383666373064303130373031333031633036303932613836343838366637306430313039303533313066313730643331333933303338333133393331333733313332333333303561333032613036303932613836343838366637306430313039333433313164333031623330306430363039363038363438303136353033303430323031303530306131306130363038326138363438636533643034303330323330326630363039326138363438383666373064303130393034333132323034323062303731303365313430613462386231376262613230316130336163643036396234653431366232613263383066383661383338313435633239373566633131333030613036303832613836343863653364303430333032303434363330343430323230343639306264636637626461663833636466343934396534633035313039656463663334373665303564373261313264376335666538633033303033343464663032323032363764353863393365626233353031333836363062353730373938613064643731313734316262353864626436613138363633353038353431656565393035303030303030303030303030227D"; +} diff --git a/apps/dashboard/src/app/.well-known/assetlinks.json/route.ts b/apps/dashboard/src/app/.well-known/assetlinks.json/route.ts new file mode 100644 index 00000000000..47374d23c2a --- /dev/null +++ b/apps/dashboard/src/app/.well-known/assetlinks.json/route.ts @@ -0,0 +1,19 @@ +import { NextResponse } from "next/server"; + +export async function GET() { + return NextResponse.json([ + { + relation: [ + "delegate_permission/common.handle_all_urls", + "delegate_permission/common.get_login_creds", + ], + target: { + namespace: "android_app", + package_name: "com.thirdweb.demo", + sha256_cert_fingerprints: [ + "40:EB:0D:96:57:F3:D8:1F:BA:87:B8:E4:26:E0:3A:DB:C8:35:96:A8:A2:B2:55:F0:B1:64:F1:39:F8:6F:7E:EB", + ], + }, + }, + ]); +} diff --git a/apps/dashboard/src/app/.well-known/farcaster.json/route.ts b/apps/dashboard/src/app/.well-known/farcaster.json/route.ts new file mode 100644 index 00000000000..92a218023b4 --- /dev/null +++ b/apps/dashboard/src/app/.well-known/farcaster.json/route.ts @@ -0,0 +1,47 @@ +import { NextResponse } from "next/server"; + +export async function GET() { + try { + const appUrl = + process.env.NEXT_PUBLIC_APP_URL || "http://nebula---localhost:3000"; + const manifest = { + accountAssociation: { + header: process.env.NEXT_PUBLIC_FARCASTER_HEADER, + payload: process.env.NEXT_PUBLIC_FARCASTER_PAYLOAD, + signature: process.env.NEXT_PUBLIC_FARCASTER_SIGNATURE, + }, + frame: { + version: "1", + name: "Nebula", + iconUrl: `${appUrl}/assets/nebula/frame/ask-nebula-pfp.png`, + imageUrl: `${appUrl}/assets/nebula/frame/frame.png`, + homeUrl: appUrl, + splashImageUrl: `${appUrl}/assets/nebula/frame/ask-nebula-pfp.png`, + splashBackgroundColor: "#171B20", + subtitle: "Web3 AI Assistant", + description: + "Ask questions about your web3 activity, get AI-powered insights about your wallet, and explore blockchain data through natural language", + primaryCategory: "utility", + tags: ["ai", "web3", "blockchain", "insights", "wallet"], + tagline: "Your AI guide to web3", + ogTitle: "Nebula - Web3 AI Assistant", + ogDescription: + "Interact with your wallet data through natural language queries powered by Thirdweb Nebula AI", + heroImageUrl: `${appUrl}/assets/nebula/frame/screenshot.svg`, + ogImageUrl: `${appUrl}/assets/nebula/frame/og.svg`, + screenshotUrls: [ + `${appUrl}/assets/nebula/frame/screenshot.svg`, + `${appUrl}/assets/nebula/frame/frame.png`, + `${appUrl}/assets/nebula/frame/og.svg`, + ], + }, + }; + return NextResponse.json(manifest); + } catch (error) { + console.error("Error generating manifest:", error); + return NextResponse.json( + { error: (error as Error).message }, + { status: 500 }, + ); + } +} diff --git a/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx b/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx new file mode 100644 index 00000000000..cc0047bab6c --- /dev/null +++ b/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx @@ -0,0 +1,139 @@ +"use client"; + +import type { AddMiniAppResult } from "@farcaster/frame-core/dist/actions/AddMiniApp"; +import type { FrameContext } from "@farcaster/frame-core/dist/context"; +import { sdk } from "@farcaster/frame-sdk"; +import { useQuery } from "@tanstack/react-query"; +import { + type ReactNode, + createContext, + useCallback, + useContext, + useState, +} from "react"; +import { base } from "thirdweb/chains"; +import { useConnect } from "thirdweb/react"; +import { EIP1193 } from "thirdweb/wallets"; +import { nebulaAppThirdwebClient } from "../utils/nebulaThirdwebClient"; + +interface MiniAppContextType { + isMiniAppReady: boolean; + isInMiniApp: boolean; + context: FrameContext | null; + setMiniAppReady: () => void; + addMiniApp: () => Promise; +} + +// eslint-disable-next-line no-restricted-syntax +const MiniAppContext = createContext(undefined); + +export function MiniAppProvider({ + addMiniAppOnLoad, + children, +}: { + addMiniAppOnLoad?: boolean; + children: ReactNode; +}) { + const [context, setContext] = useState(null); + const [isMiniAppReady, setIsMiniAppReady] = useState(false); + const [isInMiniApp, setisInMiniApp] = useState(false); + const [, setError] = useState(null); + const { connect } = useConnect(); + + const connectWallet = useCallback(async () => { + connect(async () => { + const wallet = EIP1193.fromProvider({ provider: sdk.wallet.ethProvider }); + await wallet.connect({ client: nebulaAppThirdwebClient, chain: base }); + return wallet; + }); + }, [connect]); + + const setMiniAppReady = useCallback(async () => { + try { + const isInMiniApp = await sdk.isInMiniApp(); + setisInMiniApp(isInMiniApp); + if (!isInMiniApp) return; + const context = await sdk.context; + if (context) { + setContext(context as FrameContext); + } else { + setError("Failed to load Farcaster context"); + } + await sdk.actions.ready(); + if (sdk.wallet) { + await connectWallet(); + } + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to initialize SDK"); + console.error("SDK initialization error:", err); + } finally { + setIsMiniAppReady(true); + } + }, [connectWallet]); + + useQuery({ + queryKey: ["miniapp-ready"], + queryFn: async () => { + try { + await setMiniAppReady(); + return true; + } catch (err) { + setError( + err instanceof Error ? err.message : "Failed to initialize SDK", + ); + console.error("SDK initialization error:", err); + return false; + } + }, + }); + + const handleAddMiniApp = useCallback(async () => { + try { + if (!isInMiniApp) return null; + const result = await sdk.actions.addFrame(); + if (result) { + return result; + } + return null; + } catch (error) { + console.error("[error] adding frame", error); + return null; + } + }, [isInMiniApp]); + + useQuery({ + queryKey: ["miniapp-add"], + queryFn: async () => { + try { + await handleAddMiniApp(); + return true; + } catch (error) { + console.error("[error] adding frame", error); + return false; + } + }, + enabled: isMiniAppReady && !context?.client?.added && addMiniAppOnLoad, + }); + + return ( + + {children} + + ); +} + +export function useMiniApp() { + const context = useContext(MiniAppContext); + if (context === undefined) { + throw new Error("useMiniApp must be used within a MiniAppProvider"); + } + return context; +} diff --git a/apps/dashboard/src/app/nebula-app/(app)/page.tsx b/apps/dashboard/src/app/nebula-app/(app)/page.tsx index 541a0c0c884..5adbbd07b44 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/page.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/page.tsx @@ -22,6 +22,7 @@ export default async function Page(props: { ]); if (!authToken || !accountAddress) { + console.log("redirecting to login"); loginRedirect(); } diff --git a/apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts b/apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts deleted file mode 100644 index c2e4791bc9d..00000000000 --- a/apps/dashboard/src/app/nebula-app/_farcaster/warpcast.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Get the farcaster manifest for the frame, generate yours from Warpcast Mobile - * On your phone to Settings > Developer > Domains > insert website hostname > Generate domain manifest - * @returns The farcaster manifest for the frame - */ -export async function getFarcasterManifest() { - let frameName = "Nebula"; - let noindex = false; - const appUrl = process.env.NEXT_PUBLIC_URL || "http://nebula.localhost:3000"; - if (appUrl.includes("localhost")) { - frameName += " Local"; - noindex = true; - } else if (appUrl.includes("ngrok")) { - frameName += " NGROK"; - noindex = true; - } else if (appUrl.includes("https://dev.")) { - frameName += " Dev"; - noindex = true; - } - return { - accountAssociation: { - header: process.env.NEXT_PUBLIC_FARCASTER_HEADER, - payload: process.env.NEXT_PUBLIC_FARCASTER_PAYLOAD, - signature: process.env.NEXT_PUBLIC_FARCASTER_SIGNATURE, - }, - frame: { - version: "1", - name: frameName, - iconUrl: `${appUrl}/images/icon.png`, - homeUrl: appUrl, - imageUrl: `${appUrl}/images/feed.png`, - buttonTitle: "Launch App", - splashImageUrl: `${appUrl}/images/splash.png`, - splashBackgroundColor: "#FFFFFF", - webhookUrl: `${appUrl}/api/webhook`, - // Metadata https://github.com/farcasterxyz/miniapps/discussions/191 - subtitle: "AI-powered chat", // 30 characters, no emojis or special characters, short description under app name - description: "AI-powered chat", // 170 characters, no emojis or special characters, promotional message displayed on Mini App Page - primaryCategory: "social", - tags: ["nebula", "ai", "defi", "chat", "social"], // up to 5 tags, filtering/search tags - tagline: "AI-powered chat", // 30 characters, marketing tagline should be punchy and descriptive - ogTitle: `${frameName}`, // 30 characters, app name + short tag, Title case, no emojis - ogDescription: "AI-powered chat", // 100 characters, summarize core benefits in 1-2 lines - screenshotUrls: [ - // 1284 x 2778, visual previews of the app, max 3 screenshots - `${appUrl}/images/feed.png`, - ], - heroImageUrl: `${appUrl}/images/feed.png`, // 1200 x 630px (1.91:1), promotional display image on top of the mini app store - ogImageUrl: `${appUrl}/images/feed.png`, // 1200 x 630px (1.91:1), promotional image, same as app hero image - noindex: noindex, - }, - }; -} diff --git a/apps/dashboard/src/app/nebula-app/layout.tsx b/apps/dashboard/src/app/nebula-app/layout.tsx index 75a2319ffff..437ae41950a 100644 --- a/apps/dashboard/src/app/nebula-app/layout.tsx +++ b/apps/dashboard/src/app/nebula-app/layout.tsx @@ -16,6 +16,8 @@ const description = "The most powerful AI for interacting with the blockchain, with real-time access to EVM chains and their data"; export async function generateMetadata() { + const appUrl = + process.env.NEXT_PUBLIC_APP_URL || "http://nebula---localhost:3000"; return { title, description, @@ -24,25 +26,24 @@ export async function generateMetadata() { description, }, other: { - "fc:frame":JSON.stringify({ + "fc:frame": JSON.stringify({ version: "next", - imageUrl: "http://nebula.localhost:3000/assets/nebula/frame/frame.png", + imageUrl: `${appUrl}/assets/nebula/frame/frame.png`, button: { title: "Start Chatting", action: { type: "launch_frame", name: "Nebula", - url: "http://nebula.localhost:3000", - splashImageUrl: "http://nebula.localhost:3000/assets/nebula/frame/splash.png", - splashBackgroundColor: "#0f172a" - } - } - } - )} - } + url: appUrl, + splashImageUrl: `${appUrl}/assets/nebula/frame/ask-nebula-pfp.png`, + splashBackgroundColor: "#0f172a", + }, + }, + }), + }, + }; } - const fontSans = Inter({ subsets: ["latin"], variable: "--font-sans", diff --git a/apps/dashboard/src/app/nebula-app/providers.tsx b/apps/dashboard/src/app/nebula-app/providers.tsx index b5158389b8e..9577c5912ab 100644 --- a/apps/dashboard/src/app/nebula-app/providers.tsx +++ b/apps/dashboard/src/app/nebula-app/providers.tsx @@ -6,16 +6,16 @@ import { ThemeProvider, useTheme } from "next-themes"; import { useMemo } from "react"; import { Toaster } from "sonner"; import { ThirdwebProvider, useActiveAccount } from "thirdweb/react"; +import { MiniAppProvider } from "./(app)/_farcaster/miniapp-provider"; import { NebulaConnectWallet } from "./(app)/components/NebulaConnectButton"; -import { MiniAppProvider } from "@neynar/react"; const queryClient = new QueryClient(); export function NebulaProviders(props: { children: React.ReactNode }) { return ( - + - - + + ); } diff --git a/apps/dashboard/src/middleware.ts b/apps/dashboard/src/middleware.ts index c512b0f10ec..655d0b59c6b 100644 --- a/apps/dashboard/src/middleware.ts +++ b/apps/dashboard/src/middleware.ts @@ -29,6 +29,7 @@ export const config = { export async function middleware(request: NextRequest) { const { pathname } = request.nextUrl; + // console.log(pathname); // nebula subdomain handling const host = request.headers.get("host"); @@ -48,9 +49,14 @@ export async function middleware(request: NextRequest) { // nebula.thirdweb.com -> render page at app/nebula-app // on vercel preview, the format is nebula---thirdweb-www-git-.thirdweb-preview.com if ( - subdomain && - (subdomain === "nebula" || subdomain.startsWith("nebula---")) + (subdomain && + (subdomain === "nebula" || subdomain.startsWith("nebula---"))) || + host?.includes("ngrok") ) { + // ignore well-known paths when served under nebula + if (paths[0] === ".well-known") { + return NextResponse.next(); + } // preserve search params when redirecting to /login page if ( !nebulaAuthCookie && From e7952c02bdf6535cf5436e7feddc46c3d02dbf56 Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Wed, 11 Jun 2025 16:32:44 +0200 Subject: [PATCH 04/10] feat: add basic worldcoin setup. --- apps/dashboard/package.json | 1 + .../(app)/_worldcoin/minikit-provider.tsx | 23 +++++ .../src/app/nebula-app/providers.tsx | 25 +++--- pnpm-lock.yaml | 88 +++++++++++++++++++ 4 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 2d504bd7b8c..57662033e63 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -57,6 +57,7 @@ "@thirdweb-dev/vault-sdk": "workspace:*", "@vercel/functions": "2.0.0", "@vercel/og": "^0.6.8", + "@worldcoin/minikit-js": "^1.9.5", "abitype": "1.0.8", "chakra-react-select": "^4.7.6", "class-variance-authority": "^0.7.1", diff --git a/apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx b/apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx new file mode 100644 index 00000000000..552a9da2665 --- /dev/null +++ b/apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx @@ -0,0 +1,23 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { MiniKit } from "@worldcoin/minikit-js"; + +export default function MinikitProvider({ + children, +}: { children: React.ReactNode }) { + useQuery({ + queryKey: ["minikit-install"], + queryFn: async () => { + try { + MiniKit.install(); + return true; + } catch (error) { + console.error(error); + return false; + } + }, + }); + + return <>{children}; +} diff --git a/apps/dashboard/src/app/nebula-app/providers.tsx b/apps/dashboard/src/app/nebula-app/providers.tsx index 9577c5912ab..878a350615c 100644 --- a/apps/dashboard/src/app/nebula-app/providers.tsx +++ b/apps/dashboard/src/app/nebula-app/providers.tsx @@ -7,6 +7,7 @@ import { useMemo } from "react"; import { Toaster } from "sonner"; import { ThirdwebProvider, useActiveAccount } from "thirdweb/react"; import { MiniAppProvider } from "./(app)/_farcaster/miniapp-provider"; +import MinikitProvider from "./(app)/_worldcoin/minikit-provider"; import { NebulaConnectWallet } from "./(app)/components/NebulaConnectButton"; const queryClient = new QueryClient(); @@ -16,17 +17,19 @@ export function NebulaProviders(props: { children: React.ReactNode }) { - - - - {props.children} - - + + + + + {props.children} + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f219ad21275..e694c5ac93d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,6 +166,9 @@ importers: '@vercel/og': specifier: ^0.6.8 version: 0.6.8 + '@worldcoin/minikit-js': + specifier: ^1.9.5 + version: 1.9.5(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3)(viem@2.30.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24))(zod@3.25.24) abitype: specifier: 1.0.8 version: 1.0.8(typescript@5.8.3)(zod@3.25.24) @@ -8070,6 +8073,17 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@worldcoin/idkit-core@2.1.0': + resolution: {integrity: sha512-6MOFcOGqpk3iiW1i25NYmRJ6JUO8KetqS5Ic0l2cqnEEKvjMa/NT1+WTuenjTUF//Mqwy5kWgtVBzUqeyEfQ2g==} + engines: {node: '>=12.4'} + + '@worldcoin/minikit-js@1.9.5': + resolution: {integrity: sha512-pO2gy4OxBcZoFFkZlpKv1Ov73apoRa3UCTCnScFj20LHH8ByjFhcTDEi1rxYg5i9ljby2PfRpClSGeG/1wbtUg==} + engines: {node: '>= 16'} + peerDependencies: + react: ^17 || ^18 || ^19 + viem: ^2.23.5 + '@wyw-in-js/processor-utils@0.5.5': resolution: {integrity: sha512-L3IcAfoowhM0fw9Cnv2CNzfjWNLKpYl2CFqam6NvwpiXNR1kXz/GpO0AOiKvCs5h4Ps5kWxE2e8knXLpk8q/2g==} engines: {node: '>=16.0.0'} @@ -8662,6 +8676,9 @@ packages: browser-assert@1.2.1: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + browser-or-node@3.0.0-pre.0: + resolution: {integrity: sha512-J6/RvtjajlHVJMBZ/Xk+5O9E8CKUHOZDz5e/eG8UBjWBSB/d/tgqFOua/xxqP+eGfgZlaJHELHnC3mdsVTTMIQ==} + browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} @@ -13162,6 +13179,14 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + ox@0.1.8: + resolution: {integrity: sha512-GJl6uKXxhPq/XgyvAnIokGuGU/pt9CU8reRJjzi4a02HOpLc2CEXXD4bRCITFFAzdRqHj3DQ6GDS7PlCytPM/A==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + ox@0.4.4: resolution: {integrity: sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==} peerDependencies: @@ -16460,6 +16485,21 @@ packages: zod@3.25.24: resolution: {integrity: sha512-E77RpEqxeBGBVbcK/5QKQsLM+3u6aN7pVgiGJENbwYfdsExPS/xyyUMfmeM3eY32LBCIjuzv6XU505sHn2t+Kw==} + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} engines: {node: '>=12.20.0'} @@ -27361,6 +27401,31 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@worldcoin/idkit-core@2.1.0(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3)(zod@3.25.24)': + dependencies: + browser-or-node: 3.0.0-pre.0 + buffer: 6.0.3 + ox: 0.1.8(typescript@5.8.3)(zod@3.25.24) + zustand: 4.5.7(@types/react@19.1.4)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - immer + - react + - typescript + - zod + + '@worldcoin/minikit-js@1.9.5(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3)(viem@2.30.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24))(zod@3.25.24)': + dependencies: + '@worldcoin/idkit-core': 2.1.0(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3)(zod@3.25.24) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.24) + react: 19.1.0 + viem: 2.30.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24) + transitivePeerDependencies: + - '@types/react' + - immer + - typescript + - zod + '@wyw-in-js/processor-utils@0.5.5': dependencies: '@babel/generator': 7.27.3 @@ -28031,6 +28096,8 @@ snapshots: browser-assert@1.2.1: {} + browser-or-node@3.0.0-pre.0: {} + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 @@ -33629,6 +33696,20 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + ox@0.1.8(typescript@5.8.3)(zod@3.25.24): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.24) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + ox@0.4.4(typescript@5.8.3)(zod@3.25.24): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -37691,6 +37772,13 @@ snapshots: zod@3.25.24: {} + zustand@4.5.7(@types/react@19.1.4)(react@19.1.0): + dependencies: + use-sync-external-store: 1.5.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.4 + react: 19.1.0 + zustand@5.0.0(@types/react@19.1.4)(react@19.1.0)(use-sync-external-store@1.4.0(react@19.1.0)): optionalDependencies: '@types/react': 19.1.4 From 9d4d8f30d00ceb551f95e39371cd70a69738c9a7 Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Thu, 12 Jun 2025 09:37:13 +0200 Subject: [PATCH 05/10] fix: polishing for release. --- apps/dashboard/package.json | 1 - .../src/app/nebula-app/(app)/page.tsx | 1 - pnpm-lock.yaml | 365 +----------------- 3 files changed, 2 insertions(+), 365 deletions(-) diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 57662033e63..5ad39969e7d 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -31,7 +31,6 @@ "@farcaster/frame-sdk": "^0.0.60", "@hookform/resolvers": "^3.9.1", "@marsidev/react-turnstile": "^1.1.0", - "@neynar/react": "^1.2.3", "@radix-ui/react-accordion": "^1.2.7", "@radix-ui/react-alert-dialog": "^1.1.10", "@radix-ui/react-avatar": "^1.1.6", diff --git a/apps/dashboard/src/app/nebula-app/(app)/page.tsx b/apps/dashboard/src/app/nebula-app/(app)/page.tsx index 5adbbd07b44..541a0c0c884 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/page.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/page.tsx @@ -22,7 +22,6 @@ export default async function Page(props: { ]); if (!authToken || !accountAddress) { - console.log("redirecting to login"); loginRedirect(); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e694c5ac93d..1a3cafaa559 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,9 +88,6 @@ importers: '@marsidev/react-turnstile': specifier: ^1.1.0 version: 1.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@neynar/react': - specifier: ^1.2.3 - version: 1.2.3(@farcaster/frame-sdk@0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24))(@pigment-css/react@0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3))(hls.js@1.6.5)(mipd@0.0.7(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(swr@2.3.3(react@19.1.0)) '@radix-ui/react-accordion': specifier: ^1.2.7 version: 1.2.7(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2752,9 +2749,6 @@ packages: '@emotion/cache@11.14.0': resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - '@emotion/css@11.13.5': - resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} - '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -4301,63 +4295,6 @@ packages: resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} - '@mui/private-theming@6.4.9': - resolution: {integrity: sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/styled-engine@6.4.11': - resolution: {integrity: sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - - '@mui/system@6.4.12': - resolution: {integrity: sha512-fgEfm1qxpKCztndESeL1L0sLwA2c7josZ2w42D8OM3pbLee4bH2twEjoMo6qf7z2rNw1Uc9EU9haXeMoq0oTdQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/types@7.2.24': - resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@6.4.9': - resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@napi-rs/wasm-runtime@0.2.10': resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} @@ -4432,17 +4369,6 @@ packages: cpu: [x64] os: [win32] - '@neynar/react@1.2.3': - resolution: {integrity: sha512-oWnCCVnXrovkP4e4+cKBIahHPwJDt2qMujY8y+2c1DMlqRkQLNxeIWwDpGEjTeo3ctATZ5jh5GJHdMeR3IXBMQ==} - peerDependencies: - '@farcaster/frame-sdk': '>=0.0.53 <1.0.0' - '@pigment-css/react': ^0.0.30 - hls.js: ^1.5.20 - mipd: '>=0.0.7 <1.0.0' - react: ^19.0.0 - react-dom: ^19.0.0 - swr: ^2.3.2 - '@noble/ciphers@0.5.3': resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} @@ -4839,12 +4765,6 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' - '@pigment-css/react@0.0.30': - resolution: {integrity: sha512-aNvpOgbv+M9+YV2wKk3CIyiiiF+8S6KJJKDKGzhFWOVWeQFZBgTOjBHhL/0SyAnCOVjDg2sSXOEElIdEQywXKQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -7362,9 +7282,6 @@ packages: '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/qrcode@1.5.5': resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} @@ -8084,18 +8001,6 @@ packages: react: ^17 || ^18 || ^19 viem: ^2.23.5 - '@wyw-in-js/processor-utils@0.5.5': - resolution: {integrity: sha512-L3IcAfoowhM0fw9Cnv2CNzfjWNLKpYl2CFqam6NvwpiXNR1kXz/GpO0AOiKvCs5h4Ps5kWxE2e8knXLpk8q/2g==} - engines: {node: '>=16.0.0'} - - '@wyw-in-js/shared@0.5.5': - resolution: {integrity: sha512-Wnvp3RGfynHk81lrp/0fA+Yv5yuIr2Ej13N3lawQeqbK4KlMag3P9npyIljGrEiwK2Bv4byHuXsJFgLI0Fo8bw==} - engines: {node: '>=16.0.0'} - - '@wyw-in-js/transform@0.5.5': - resolution: {integrity: sha512-XMZjhS8poHpxfPg41rkc6eh3Mr2BZAFM7OzYN4jPZUicpJKv7uQAU2dLEqnyDcDllo04LbZIryb2fXwpr+pqPw==} - engines: {node: '>=16.0.0'} - '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} @@ -8472,12 +8377,6 @@ packages: '@babel/core': ^7.12.0 webpack: '>=5' - babel-merge@3.0.0: - resolution: {integrity: sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@babel/core': ^7.0.0 - babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} @@ -9246,15 +9145,6 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -9360,10 +9250,6 @@ packages: engines: {node: '>=4'} hasBin: true - cssjanus@2.3.0: - resolution: {integrity: sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==} - engines: {node: '>=10.0.0'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -9536,10 +9422,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@2.2.1: - resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} - engines: {node: '>=0.10.0'} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -10868,10 +10750,6 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@15.11.7: - resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} - engines: {node: '>=18.0.0'} - happy-dom@17.4.4: resolution: {integrity: sha512-/Pb0ctk3HTZ5xEL3BZ0hK1AqDSAUuRQitOmROPHhfUYEWpmTImwfD8vFDGADmMAX0JYgbcgxWoLFKtsWhcpuVA==} engines: {node: '>=18.0.0'} @@ -11024,9 +10902,6 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hls.js@1.6.5: - resolution: {integrity: sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ==} - hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -11334,10 +11209,6 @@ packages: is-empty@1.2.0: resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -13057,10 +12928,6 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.omit@3.0.0: - resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} - engines: {node: '>=0.10.0'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -14033,9 +13900,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.1.0: - resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} - react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: @@ -15123,11 +14987,6 @@ packages: babel-plugin-macros: optional: true - stylis-plugin-rtl@2.1.1: - resolution: {integrity: sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==} - peerDependencies: - stylis: 4.x - stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -15183,11 +15042,6 @@ packages: react: '>=16.8.0 <19' react-dom: '>=16.8.0 <19' - swr@2.3.3: - resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - synckit@0.11.6: resolution: {integrity: sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -15413,10 +15267,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-invariant@0.10.3: - resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} - engines: {node: '>=8'} - ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} @@ -17639,15 +17489,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.3)': - dependencies: - '@babel/core': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.3)': dependencies: '@babel/core': 7.27.3 @@ -18077,14 +17918,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.3)': - dependencies: - '@babel/core': 7.27.3 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.3) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 @@ -19041,16 +18874,6 @@ snapshots: '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 - '@emotion/css@11.13.5': - dependencies: - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - transitivePeerDependencies: - - supports-color - '@emotion/hash@0.9.2': {} '@emotion/is-prop-valid@1.2.2': @@ -21017,60 +20840,6 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@mui/private-theming@6.4.9(@types/react@19.1.4)(react@19.1.0)': - dependencies: - '@babel/runtime': 7.27.3 - '@mui/utils': 6.4.9(@types/react@19.1.4)(react@19.1.0) - prop-types: 15.8.1 - react: 19.1.0 - optionalDependencies: - '@types/react': 19.1.4 - - '@mui/styled-engine@6.4.11(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(react@19.1.0)': - dependencies: - '@babel/runtime': 7.27.3 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/sheet': 1.4.0 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 19.1.0 - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.4)(react@19.1.0) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) - - '@mui/system@6.4.12(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0)': - dependencies: - '@babel/runtime': 7.27.3 - '@mui/private-theming': 6.4.9(@types/react@19.1.4)(react@19.1.0) - '@mui/styled-engine': 6.4.11(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(react@19.1.0) - '@mui/types': 7.2.24(@types/react@19.1.4) - '@mui/utils': 6.4.9(@types/react@19.1.4)(react@19.1.0) - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 19.1.0 - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.4)(react@19.1.0) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) - '@types/react': 19.1.4 - - '@mui/types@7.2.24(@types/react@19.1.4)': - optionalDependencies: - '@types/react': 19.1.4 - - '@mui/utils@6.4.9(@types/react@19.1.4)(react@19.1.0)': - dependencies: - '@babel/runtime': 7.27.3 - '@mui/types': 7.2.24(@types/react@19.1.4) - '@types/prop-types': 15.7.15 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 19.1.0 - react-is: 19.1.0 - optionalDependencies: - '@types/react': 19.1.4 - '@napi-rs/wasm-runtime@0.2.10': dependencies: '@emnapi/core': 1.4.3 @@ -21124,16 +20893,6 @@ snapshots: '@next/swc-win32-x64-msvc@15.3.2': optional: true - '@neynar/react@1.2.3(@farcaster/frame-sdk@0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24))(@pigment-css/react@0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3))(hls.js@1.6.5)(mipd@0.0.7(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(swr@2.3.3(react@19.1.0))': - dependencies: - '@farcaster/frame-sdk': 0.0.60(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.24) - '@pigment-css/react': 0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3) - hls.js: 1.6.5 - mipd: 0.0.7(typescript@5.8.3) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - swr: 2.3.3(react@19.1.0) - '@noble/ciphers@0.5.3': {} '@noble/ciphers@1.2.1': {} @@ -21612,36 +21371,6 @@ snapshots: '@paulmillr/qr@0.2.1': {} - '@pigment-css/react@0.0.30(@types/react@19.1.4)(react@19.1.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser': 7.27.3 - '@babel/types': 7.27.3 - '@emotion/css': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@19.1.4)(react@19.1.0) - '@emotion/serialize': 1.3.3 - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) - '@mui/system': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0))(@types/react@19.1.4)(react@19.1.0) - '@mui/utils': 6.4.9(@types/react@19.1.4)(react@19.1.0) - '@wyw-in-js/processor-utils': 0.5.5 - '@wyw-in-js/shared': 0.5.5 - '@wyw-in-js/transform': 0.5.5(typescript@5.8.3) - clsx: 2.1.1 - cssesc: 3.0.0 - csstype: 3.1.3 - lodash: 4.17.21 - prop-types: 15.8.1 - react: 19.1.0 - stylis: 4.3.6 - stylis-plugin-rtl: 2.1.1(stylis@4.3.6) - transitivePeerDependencies: - - '@types/react' - - supports-color - - typescript - '@pkgjs/parseargs@0.11.0': optional: true @@ -25759,8 +25488,6 @@ snapshots: '@types/node': 22.14.1 kleur: 3.0.3 - '@types/prop-types@15.7.15': {} - '@types/qrcode@1.5.5': dependencies: '@types/node': 22.14.1 @@ -27426,42 +27153,6 @@ snapshots: - typescript - zod - '@wyw-in-js/processor-utils@0.5.5': - dependencies: - '@babel/generator': 7.27.3 - '@wyw-in-js/shared': 0.5.5 - transitivePeerDependencies: - - supports-color - - '@wyw-in-js/shared@0.5.5': - dependencies: - debug: 4.4.1(supports-color@8.1.1) - find-up: 5.0.0 - minimatch: 9.0.5 - transitivePeerDependencies: - - supports-color - - '@wyw-in-js/transform@0.5.5(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.3 - '@babel/generator': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.3) - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.3 - '@babel/types': 7.27.3 - '@wyw-in-js/processor-utils': 0.5.5 - '@wyw-in-js/shared': 0.5.5 - babel-merge: 3.0.0(@babel/core@7.27.3) - cosmiconfig: 8.3.6(typescript@5.8.3) - happy-dom: 15.11.7 - source-map: 0.7.4 - stylis: 4.3.6 - ts-invariant: 0.10.3 - transitivePeerDependencies: - - supports-color - - typescript - '@xmldom/xmldom@0.7.13': {} '@xmldom/xmldom@0.8.10': {} @@ -27826,12 +27517,6 @@ snapshots: schema-utils: 4.3.2 webpack: 5.99.9(esbuild@0.25.4) - babel-merge@3.0.0(@babel/core@7.27.3): - dependencies: - '@babel/core': 7.27.3 - deepmerge: 2.2.1 - object.omit: 3.0.0 - babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -28729,15 +28414,6 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.8.3): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.8.3 - cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 @@ -28872,8 +28548,6 @@ snapshots: cssesc@3.0.0: {} - cssjanus@2.3.0: {} - csstype@3.1.3: {} cva@1.0.0-beta.2(typescript@5.8.3): @@ -29004,8 +28678,6 @@ snapshots: deep-is@0.1.4: {} - deepmerge@2.2.1: {} - deepmerge@4.3.1: {} default-browser-id@5.0.0: {} @@ -30871,12 +30543,6 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@15.11.7: - dependencies: - entities: 4.5.0 - webidl-conversions: 7.0.0 - whatwg-mimetype: 3.0.0 - happy-dom@17.4.4: dependencies: webidl-conversions: 7.0.0 @@ -31133,8 +30799,6 @@ snapshots: highlightjs-vue@1.0.0: {} - hls.js@1.6.5: {} - hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -31459,10 +31123,6 @@ snapshots: is-empty@1.2.0: {} - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -33543,10 +33203,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 - object.omit@3.0.0: - dependencies: - is-extendable: 1.0.1 - object.values@1.2.1: dependencies: call-bind: 1.0.8 @@ -33769,8 +33425,8 @@ snapshots: ox@0.6.9(typescript@5.8.3)(zod@3.25.24): dependencies: '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.8.2 - '@noble/hashes': 1.7.2 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.25.24) @@ -34641,8 +34297,6 @@ snapshots: react-is@18.3.1: {} - react-is@19.1.0: {} - react-markdown@10.1.0(@types/react@19.1.4)(react@19.1.0): dependencies: '@types/hast': 3.0.4 @@ -36068,11 +35722,6 @@ snapshots: optionalDependencies: '@babel/core': 7.27.1 - stylis-plugin-rtl@2.1.1(stylis@4.3.6): - dependencies: - cssjanus: 2.3.0 - stylis: 4.3.6 - stylis@4.2.0: {} stylis@4.3.2: {} @@ -36178,12 +35827,6 @@ snapshots: - '@types/react' - debug - swr@2.3.3(react@19.1.0): - dependencies: - dequal: 2.0.3 - react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - synckit@0.11.6: dependencies: '@pkgr/core': 0.2.4 @@ -36433,10 +36076,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-invariant@0.10.3: - dependencies: - tslib: 2.8.1 - ts-mixer@6.0.4: {} ts-pnp@1.2.0(typescript@5.8.3): From a940346cf2b8afe1a8b593e33f9de84ed98087cb Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Thu, 12 Jun 2025 09:48:10 +0200 Subject: [PATCH 06/10] feat: add new env variables in env.example file --- apps/dashboard/.env.example | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/dashboard/.env.example b/apps/dashboard/.env.example index 3f719125270..c20ff8fe6e4 100644 --- a/apps/dashboard/.env.example +++ b/apps/dashboard/.env.example @@ -108,4 +108,10 @@ STRIPE_SECRET_KEY="" # required for server wallet management NEXT_PUBLIC_THIRDWEB_VAULT_URL="" -NEXT_PUBLIC_ENGINE_CLOUD_URL="" \ No newline at end of file +NEXT_PUBLIC_ENGINE_CLOUD_URL="" + +# farcaster frame env variables +NEXT_PUBLIC_APP_URL= +NEXT_PUBLIC_FARCASTER_HEADER= +NEXT_PUBLIC_FARCASTER_PAYLOAD= +NEXT_PUBLIC_FARCASTER_SIGNATURE= \ No newline at end of file From 823c9480b08f8299627f11e5574b700dc4b86e70 Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Thu, 12 Jun 2025 11:07:50 +0200 Subject: [PATCH 07/10] feat: removed unused export. --- .../(app)/_farcaster/miniapp-provider.tsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx b/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx index cc0047bab6c..00424ee3ba2 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/_farcaster/miniapp-provider.tsx @@ -4,13 +4,7 @@ import type { AddMiniAppResult } from "@farcaster/frame-core/dist/actions/AddMin import type { FrameContext } from "@farcaster/frame-core/dist/context"; import { sdk } from "@farcaster/frame-sdk"; import { useQuery } from "@tanstack/react-query"; -import { - type ReactNode, - createContext, - useCallback, - useContext, - useState, -} from "react"; +import { type ReactNode, createContext, useCallback, useState } from "react"; import { base } from "thirdweb/chains"; import { useConnect } from "thirdweb/react"; import { EIP1193 } from "thirdweb/wallets"; @@ -129,11 +123,3 @@ export function MiniAppProvider({ ); } - -export function useMiniApp() { - const context = useContext(MiniAppContext); - if (context === undefined) { - throw new Error("useMiniApp must be used within a MiniAppProvider"); - } - return context; -} From 5fa098c5d88a389e053d1f741a658f97dea835d0 Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Fri, 13 Jun 2025 19:48:39 +0200 Subject: [PATCH 08/10] feat: removed worldcoin provider. --- apps/dashboard/package.json | 1 - .../(app)/_worldcoin/minikit-provider.tsx | 23 ----- .../src/app/nebula-app/providers.tsx | 25 +++--- pnpm-lock.yaml | 88 ------------------- 4 files changed, 11 insertions(+), 126 deletions(-) delete mode 100644 apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 241d2947d8f..75cbe7c5880 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -56,7 +56,6 @@ "@thirdweb-dev/vault-sdk": "workspace:*", "@vercel/functions": "2.1.0", "@vercel/og": "^0.6.8", - "@worldcoin/minikit-js": "^1.9.5", "abitype": "1.0.8", "chakra-react-select": "^4.7.6", "class-variance-authority": "^0.7.1", diff --git a/apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx b/apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx deleted file mode 100644 index 552a9da2665..00000000000 --- a/apps/dashboard/src/app/nebula-app/(app)/_worldcoin/minikit-provider.tsx +++ /dev/null @@ -1,23 +0,0 @@ -"use client"; - -import { useQuery } from "@tanstack/react-query"; -import { MiniKit } from "@worldcoin/minikit-js"; - -export default function MinikitProvider({ - children, -}: { children: React.ReactNode }) { - useQuery({ - queryKey: ["minikit-install"], - queryFn: async () => { - try { - MiniKit.install(); - return true; - } catch (error) { - console.error(error); - return false; - } - }, - }); - - return <>{children}; -} diff --git a/apps/dashboard/src/app/nebula-app/providers.tsx b/apps/dashboard/src/app/nebula-app/providers.tsx index 878a350615c..9577c5912ab 100644 --- a/apps/dashboard/src/app/nebula-app/providers.tsx +++ b/apps/dashboard/src/app/nebula-app/providers.tsx @@ -7,7 +7,6 @@ import { useMemo } from "react"; import { Toaster } from "sonner"; import { ThirdwebProvider, useActiveAccount } from "thirdweb/react"; import { MiniAppProvider } from "./(app)/_farcaster/miniapp-provider"; -import MinikitProvider from "./(app)/_worldcoin/minikit-provider"; import { NebulaConnectWallet } from "./(app)/components/NebulaConnectButton"; const queryClient = new QueryClient(); @@ -17,19 +16,17 @@ export function NebulaProviders(props: { children: React.ReactNode }) { - - - - - {props.children} - - - + + + + {props.children} + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd75bb584de..ad8827faa6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -163,9 +163,6 @@ importers: '@vercel/og': specifier: ^0.6.8 version: 0.6.8 - '@worldcoin/minikit-js': - specifier: ^1.9.5 - version: 1.9.6(@types/react@19.1.8)(react@19.1.0)(typescript@5.8.3)(viem@2.31.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.62))(zod@3.25.62) abitype: specifier: 1.0.8 version: 1.0.8(typescript@5.8.3)(zod@3.25.62) @@ -7586,17 +7583,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@worldcoin/idkit-core@2.1.0': - resolution: {integrity: sha512-6MOFcOGqpk3iiW1i25NYmRJ6JUO8KetqS5Ic0l2cqnEEKvjMa/NT1+WTuenjTUF//Mqwy5kWgtVBzUqeyEfQ2g==} - engines: {node: '>=12.4'} - - '@worldcoin/minikit-js@1.9.6': - resolution: {integrity: sha512-nKPj9hQngHV0bD4/SD/XZmNAYv/zfZjptPjnuzIWouRR8AQHFpdkCPIw03QujhBG+3kUwUpsBAgYPwEk4vj2dw==} - engines: {node: '>= 16'} - peerDependencies: - react: ^17 || ^18 || ^19 - viem: ^2.23.5 - '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} @@ -8170,9 +8156,6 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browser-or-node@3.0.0-pre.0: - resolution: {integrity: sha512-J6/RvtjajlHVJMBZ/Xk+5O9E8CKUHOZDz5e/eG8UBjWBSB/d/tgqFOua/xxqP+eGfgZlaJHELHnC3mdsVTTMIQ==} - browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} @@ -12663,14 +12646,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.1.8: - resolution: {integrity: sha512-GJl6uKXxhPq/XgyvAnIokGuGU/pt9CU8reRJjzi4a02HOpLc2CEXXD4bRCITFFAzdRqHj3DQ6GDS7PlCytPM/A==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - ox@0.4.4: resolution: {integrity: sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==} peerDependencies: @@ -15980,21 +15955,6 @@ packages: zod@3.25.62: resolution: {integrity: sha512-YCxsr4DmhPcrKPC9R1oBHQNlQzlJEyPAId//qTau/vBee9uO8K6prmRq4eMkOyxvBfH4wDPIPdLx9HVMWIY3xA==} - zustand@4.5.7: - resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0.6' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} engines: {node: '>=12.20.0'} @@ -26986,31 +26946,6 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@worldcoin/idkit-core@2.1.0(@types/react@19.1.8)(react@19.1.0)(typescript@5.8.3)(zod@3.25.62)': - dependencies: - browser-or-node: 3.0.0-pre.0 - buffer: 6.0.3 - ox: 0.1.8(typescript@5.8.3)(zod@3.25.62) - zustand: 4.5.7(@types/react@19.1.8)(react@19.1.0) - transitivePeerDependencies: - - '@types/react' - - immer - - react - - typescript - - zod - - '@worldcoin/minikit-js@1.9.6(@types/react@19.1.8)(react@19.1.0)(typescript@5.8.3)(viem@2.31.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.62))(zod@3.25.62)': - dependencies: - '@worldcoin/idkit-core': 2.1.0(@types/react@19.1.8)(react@19.1.0)(typescript@5.8.3)(zod@3.25.62) - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.62) - react: 19.1.0 - viem: 2.31.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.62) - transitivePeerDependencies: - - '@types/react' - - immer - - typescript - - zod - '@xmldom/xmldom@0.7.13': {} '@xmldom/xmldom@0.8.10': {} @@ -27653,8 +27588,6 @@ snapshots: brorand@1.1.0: {} - browser-or-node@3.0.0-pre.0: {} - browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 @@ -33187,20 +33120,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.1.8(typescript@5.8.3)(zod@3.25.62): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.8.2 - '@noble/hashes': 1.7.2 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.62) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - ox@0.4.4(typescript@5.8.3)(zod@3.25.62): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -37324,13 +37243,6 @@ snapshots: zod@3.25.62: {} - zustand@4.5.7(@types/react@19.1.8)(react@19.1.0): - dependencies: - use-sync-external-store: 1.5.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.8 - react: 19.1.0 - zustand@5.0.0(@types/react@19.1.8)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): optionalDependencies: '@types/react': 19.1.8 From 70a3c29633ccb5d191c45a342c81d256ff0dec1a Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Fri, 13 Jun 2025 20:00:45 +0200 Subject: [PATCH 09/10] feat: removed .well-known public folder. --- .../.well-known/apple-developer-merchantid-domain-association | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/dashboard/public/.well-known/apple-developer-merchantid-domain-association diff --git a/apps/dashboard/public/.well-known/apple-developer-merchantid-domain-association b/apps/dashboard/public/.well-known/apple-developer-merchantid-domain-association deleted file mode 100644 index 2ff95c96281..00000000000 --- a/apps/dashboard/public/.well-known/apple-developer-merchantid-domain-association +++ /dev/null @@ -1 +0,0 @@ -7B227073704964223A2239373943394538343346343131343044463144313834343232393232313734313034353044314339464446394437384337313531303944334643463542433731222C2276657273696F6E223A312C22637265617465644F6E223A313536363233343735303036312C227369676E6174757265223A22333038303036303932613836343838366637306430313037303261303830333038303032303130313331306633303064303630393630383634383031363530333034303230313035303033303830303630393261383634383836663730643031303730313030303061303830333038323033653333303832303338386130303330323031303230323038346333303431343935313964353433363330306130363038326138363438636533643034303330323330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333031653137306433313339333033353331333833303331333333323335333735613137306433323334333033353331333633303331333333323335333735613330356633313235333032333036303335353034303330633163363536333633326437333664373032643632373236663662363537323264373336393637366535663535343333343264353035323466343433313134333031323036303335353034306230633062363934663533323035333739373337343635366437333331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333035393330313330363037326138363438636533643032303130363038326138363438636533643033303130373033343230303034633231353737656465626436633762323231386636386464373039306131323138646337623062643666326332383364383436303935643934616634613534313162383334323065643831316633343037653833333331663163353463336637656233323230643662616435643465666634393238393839336537633066313361333832303231313330383230323064333030633036303335353164313330313031666630343032333030303330316630363033353531643233303431383330313638303134323366323439633434663933653465663237653663346636323836633366613262626664326534623330343530363038326230363031303530353037303130313034333933303337333033353036303832623036303130353035303733303031383632393638373437343730336132663266366636333733373032653631373037303663363532653633366636643266366636333733373033303334326436313730373036633635363136393633363133333330333233303832303131643036303335353164323030343832303131343330383230313130333038323031306330363039326138363438383666373633363430353031333038316665333038316333303630383262303630313035303530373032303233303831623630633831623335323635366336393631366536333635323036663665323037343638363937333230363336353732373436393636363936333631373436353230363237393230363136653739323037303631373237343739323036313733373337353664363537333230363136333633363537303734363136653633363532303666363632303734363836353230373436383635366532303631373037303663363936333631363236633635323037333734363136653634363137323634323037343635373236643733323036313665363432303633366636653634363937343639366636653733323036663636323037353733363532633230363336353732373436393636363936333631373436353230373036663663363936333739323036313665363432303633363537323734363936363639363336313734363936663665323037303732363136333734363936333635323037333734363137343635366436353665373437333265333033363036303832623036303130353035303730323031313632613638373437343730336132663266373737373737326536313730373036633635326536333666366432663633363537323734363936363639363336313734363536313735373436383666373236393734373932663330333430363033353531643166303432643330326233303239613032376130323538363233363837343734373033613266326636333732366332653631373037303663363532653633366636643266363137303730366336353631363936333631333332653633373236633330316430363033353531643065303431363034313439343537646236666435373438313836383938393736326637653537383530376537396235383234333030653036303335353164306630313031666630343034303330323037383033303066303630393261383634383836663736333634303631643034303230353030333030613036303832613836343863653364303430333032303334393030333034363032323130306265303935373166653731653165373335623535653561666163623463373266656234343566333031383532323263373235313030326236316562643666353530323231303064313862333530613564643664643665623137343630333562313165623263653837636661336536616636636264383338303839306463383263646461613633333038323032656533303832303237356130303330323031303230323038343936643266626633613938646139373330306130363038326138363438636533643034303330323330363733313162333031393036303335353034303330633132343137303730366336353230353236663666373432303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330316531373064333133343330333533303336333233333334333633333330356131373064333233393330333533303336333233333334333633333330356133303761333132653330326330363033353530343033306332353431373037303663363532303431373037303663363936333631373436393666366532303439366537343635363737323631373436393666366532303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030346630313731313834313964373634383564353161356532353831303737366538383061326566646537626165346465303864666334623933653133333536643536363562333561653232643039373736306432323465376262613038666437363137636538386362373662623636373062656338653832393834666635343435613338316637333038316634333034363036303832623036303130353035303730313031303433613330333833303336303630383262303630313035303530373330303138363261363837343734373033613266326636663633373337303265363137303730366336353265363336663664326636663633373337303330333432643631373037303663363537323666366637343633363136373333333031643036303335353164306530343136303431343233663234396334346639336534656632376536633466363238366333666132626266643265346233303066303630333535316431333031303166663034303533303033303130316666333031663036303335353164323330343138333031363830313462626230646561313538333338383961613438613939646562656264656261666461636232346162333033373036303335353164316630343330333032653330326361303261613032383836323636383734373437303361326632663633373236633265363137303730366336353265363336663664326636313730373036633635373236663666373436333631363733333265363337323663333030653036303335353164306630313031666630343034303330323031303633303130303630613261383634383836663736333634303630323065303430323035303033303061303630383261383634386365336430343033303230333637303033303634303233303361636637323833353131363939623138366662333563333536636136326266663431376564643930663735346461323865626566313963383135653432623738396638393866373962353939663938643534313064386639646539633266653032333033323264643534343231623061333035373736633564663333383362393036376664313737633263323136643936346663363732363938323132366635346638376137643162393963623962303938393231363130363939306630393932316430303030333138323031386233303832303138373032303130313330383138363330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533303230383463333034313439353139643534333633303064303630393630383634383031363530333034303230313035303061303831393533303138303630393261383634383836663730643031303930333331306230363039326138363438383666373064303130373031333031633036303932613836343838366637306430313039303533313066313730643331333933303338333133393331333733313332333333303561333032613036303932613836343838366637306430313039333433313164333031623330306430363039363038363438303136353033303430323031303530306131306130363038326138363438636533643034303330323330326630363039326138363438383666373064303130393034333132323034323062303731303365313430613462386231376262613230316130336163643036396234653431366232613263383066383661383338313435633239373566633131333030613036303832613836343863653364303430333032303434363330343430323230343639306264636637626461663833636466343934396534633035313039656463663334373665303564373261313264376335666538633033303033343464663032323032363764353863393365626233353031333836363062353730373938613064643731313734316262353864626436613138363633353038353431656565393035303030303030303030303030227D \ No newline at end of file From be35ac89836e451a19f543b0b8b436c44b5c96cc Mon Sep 17 00:00:00 2001 From: PaoloRollo Date: Fri, 13 Jun 2025 20:01:15 +0200 Subject: [PATCH 10/10] fix: remove commented log. --- apps/dashboard/src/middleware.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/dashboard/src/middleware.ts b/apps/dashboard/src/middleware.ts index 655d0b59c6b..0a134e4a7d5 100644 --- a/apps/dashboard/src/middleware.ts +++ b/apps/dashboard/src/middleware.ts @@ -29,7 +29,6 @@ export const config = { export async function middleware(request: NextRequest) { const { pathname } = request.nextUrl; - // console.log(pathname); // nebula subdomain handling const host = request.headers.get("host");