diff --git a/app/globals.css b/app/globals.css index 0599562..5d91d57 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,6 +1,6 @@ @import "tailwindcss"; @import "tw-animate-css"; -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap'); @custom-variant dark (&:is(.dark *)); @@ -126,3 +126,143 @@ @apply bg-background text-foreground; } } + +/* Custom animations for interactive homepage */ +@keyframes gradient { + 0%, 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } +} + +@keyframes float { + 0%, 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-20px); + } +} + +@keyframes pulse-glow { + 0%, 100% { + box-shadow: 0 0 20px rgba(168, 85, 247, 0.4); + } + 50% { + box-shadow: 0 0 40px rgba(168, 85, 247, 0.8); + } +} + +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +@keyframes slideInFromBottom { + 0% { + opacity: 0; + transform: translateY(30px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes scaleIn { + 0% { + opacity: 0; + transform: scale(0.9); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +.animate-gradient { + background-size: 200% 200%; + animation: gradient 3s ease infinite; +} + +.animate-float { + animation: float 3s ease-in-out infinite; +} + +.animate-pulse-glow { + animation: pulse-glow 2s ease-in-out infinite; +} + +.animate-shimmer { + animation: shimmer 2s linear infinite; +} + +.animate-slide-in { + animation: slideInFromBottom 0.6s ease-out; +} + +.animate-scale-in { + animation: scaleIn 0.5s ease-out; +} + +/* Smooth scroll behavior */ +html { + scroll-behavior: smooth; +} + +/* Card hover effects */ +.card-hover-effect { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.card-hover-effect:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: 0 20px 60px rgba(168, 85, 247, 0.3); +} + +/* Glassmorphism effect */ +.glass-effect { + backdrop-filter: blur(10px); + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.1); +} + +/* Text gradient effect */ +.text-gradient { + background: linear-gradient(135deg, #a855f7, #ec4899, #8b5cf6); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-size: 200% 200%; + animation: gradient 3s ease infinite; +} + +/* Parallax container */ +.parallax-container { + transform-style: preserve-3d; + perspective: 1000px; +} + +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-track { + background: oklch(0.08 0 0); +} + +::-webkit-scrollbar-thumb { + background: oklch(0.7 0.18 270); + border-radius: 5px; +} + +::-webkit-scrollbar-thumb:hover { + background: oklch(0.6 0.15 270); +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 882a6b9..6b99dcd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,14 +1,93 @@ +'use client' + import Link from "next/link" import { Button } from "@/components/ui/button" -import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Card, CardDescription, CardHeader, CardTitle, CardContent } from "@/components/ui/card" import { Navigation } from "@/components/navigation" -import { ArrowRight, Database, Shield, Zap } from "lucide-react" +import { ArrowRight, Database, Shield, Zap, CheckCircle2, TrendingUp, Users, Network, Sparkles, Rocket, DollarSign, BarChart3, Code, Lock, Globe } from "lucide-react" import Orb from "@/components/Orb" +import { useEffect, useState, useRef } from "react" export default function HomePage() { + const [mounted, setMounted] = useState(false) + const [hoveredCard, setHoveredCard] = useState(null) + const [visibleSections, setVisibleSections] = useState>(new Set()) + const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }) + const [scrollProgress, setScrollProgress] = useState(0) + const sectionRefs = useRef<{ [key: string]: HTMLElement | null }>({}) + + useEffect(() => { + setMounted(true) + + // Mouse tracking for parallax effects + const handleMouseMove = (e: MouseEvent) => { + setMousePosition({ x: e.clientX, y: e.clientY }) + } + + // Scroll progress tracking + const handleScroll = () => { + const totalHeight = document.documentElement.scrollHeight - window.innerHeight + const progress = (window.scrollY / totalHeight) * 100 + setScrollProgress(progress) + } + + window.addEventListener('mousemove', handleMouseMove) + window.addEventListener('scroll', handleScroll) + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setVisibleSections((prev) => new Set(prev).add(entry.target.id)) + } + }) + }, + { threshold: 0.1 } + ) + + Object.values(sectionRefs.current).forEach((ref) => { + if (ref) observer.observe(ref) + }) + + return () => { + observer.disconnect() + window.removeEventListener('mousemove', handleMouseMove) + window.removeEventListener('scroll', handleScroll) + } + }, []) + + const setSectionRef = (id: string) => (el: HTMLElement | null) => { + sectionRefs.current[id] = el + } + + // Parallax offset calculation + const parallaxOffset = { + x: (mousePosition.x - window.innerWidth / 2) / 50, + y: (mousePosition.y - window.innerHeight / 2) / 50 + } + return ( -
- {/* */} +
+ {/* Scroll Progress Bar */} +
+
+
+ + {/* Animated Background Grid */} +
+
+
+ {/* Hero Section */} @@ -28,7 +107,8 @@ export default function HomePage() { width: 'min(90vw, 90vh)', height: 'min(90vw, 90vh)', maxWidth: '800px', - maxHeight: '800px' + maxHeight: '800px', + transform: `translate(${parallaxOffset.x * 2}px, ${parallaxOffset.y * 2}px)` }}>
-
+ + {/* Floating particles effect */} +
+ {[...Array(20)].map((_, i) => ( +
+ ))} +
+ +
-

+
+ + Decentralized Price Discovery +
+

Orb Oracle: -
The Price of Everything
+
+ The Price of Everything +

-
- -
+ + {/* Live Stats (Animated Counters) */} +
+
+ +
+
Permissionless
+
+
+ +
0%
+
Creation Fee
+
+
+ +
100%
+
On-Chain
+
+
+
+
+ + {/* Scroll indicator */} +
+
+
- {/* Features Section */} -
+ {/* How It Works Section */} +
-
-

Why choose OracleNet?

-

- Enterprise-grade infrastructure for the next generation of decentralized applications +

+
+ MECHANISM +
+

How Does Orb Oracle Work?

+

+ A revolutionary bonding curve mechanism that enables anyone to create and trade price oracles with built-in liquidity

-
- - -
- -
- Lightning Fast - - Sub-second data feeds with 99.9% uptime guarantee for mission-critical applications - -
-
- - - -
- -
- Secure & Reliable - - Multi-signature validation and cryptographic proofs ensure data integrity - -
-
- - - -
- -
- Rich Data Sources - - Connect to thousands of APIs, IoT devices, and real-world data providers - -
-
+
+ {[ + { + icon: TrendingUp, + title: "1. Create an Oracle", + desc: "Anyone can create an oracle for any asset. The oracle starts with a bonding curve that determines its price based on supply and demand. Initial creation requires minimal capital, making it accessible to everyone.", + color: "from-purple-500 to-pink-500" + }, + { + icon: Users, + title: "2. Trade & Build Liquidity", + desc: "As users buy and sell oracle shares, the bonding curve automatically provides liquidity. No need for external liquidity providers—the protocol handles it algorithmically, ensuring seamless trading at all times.", + color: "from-blue-500 to-purple-500" + }, + { + icon: Network, + title: "3. Consensus Pricing", + desc: "The oracle price is determined by market participants through trading activity. This creates a decentralized consensus mechanism where the collective wisdom of traders establishes fair market value.", + color: "from-pink-500 to-red-500" + }, + { + icon: CheckCircle2, + title: "4. Use Anywhere", + desc: "Once established, oracle prices can be integrated into any DeFi protocol, smart contract, or dApp. The on-chain data is tamper-proof, always available, and reflects real-time market consensus.", + color: "from-green-500 to-blue-500" + } + ].map((item, idx) => ( + setHoveredCard(idx)} + onMouseLeave={() => setHoveredCard(null)} + > + {/* Gradient overlay on hover */} +
+ + +
+ +
+ {item.title} +
+ + + {item.desc} + + + + ))}
- {/* Stats Section */} -
+ {/* Why Better Section */} +
-
-
-
1,247
-
Active Oracles
-
-
-
$2.4B
-
Total Value Secured
+
+
+ ADVANTAGES
-
-
99.9%
-
Uptime
+

Why Choose Orb Oracle?

+

+ Traditional oracles have limitations. We've built a better solution from the ground up. +

+
+ +
+ {[ + { icon: Zap, title: "Permissionless Creation", desc: "Unlike centralized oracles that require approval, anyone can create an oracle for any asset instantly. No gatekeepers, no waiting, no barriers to entry.", id: 10, gradient: "from-yellow-500 to-orange-500" }, + { icon: Shield, title: "Built-in Liquidity", desc: "Bonding curves eliminate the need for external market makers. Liquidity is always available, prices are algorithmically determined, and trading is instant.", id: 11, gradient: "from-blue-500 to-cyan-500" }, + { icon: Database, title: "Market-Driven Truth", desc: "Instead of relying on centralized data sources, prices emerge from market consensus. If the crowd believes it has value, it does—pure decentralization.", id: 12, gradient: "from-purple-500 to-pink-500" }, + { icon: TrendingUp, title: "Incentive Aligned", desc: "Oracle creators earn fees from trading activity. The more useful and accurate the oracle, the more trading volume it generates, creating perfect incentive alignment.", id: 13, gradient: "from-green-500 to-emerald-500" }, + { icon: Lock, title: "Truly Decentralized", desc: "No single point of failure, no admin keys, no centralized control. The protocol is fully on-chain and governed by code, not corporations.", id: 14, gradient: "from-red-500 to-pink-500" }, + { icon: Code, title: "Instant Integration", desc: "Simple smart contract interfaces make it easy to integrate oracle data into any dApp. Get started in minutes with our developer-friendly APIs.", id: 15, gradient: "from-indigo-500 to-purple-500" } + ].map((item, idx) => ( + setHoveredCard(item.id)} + onMouseLeave={() => setHoveredCard(null)} + style={{ transitionDelay: `${idx * 100}ms` }} + > + {/* Animated gradient background on hover */} +
+ + +
+ +
+ {item.title} +
+ + + {item.desc} + + + + {/* Hover indicator */} +
+ + ))} +
+
+
+ + {/* Features Comparison Section */} +
+
+
+
+ COMPARISON
-
-
50+
-
Supported Chains
+

Orb Oracle vs Traditional Oracles

+

+ See how we stack up against centralized alternatives +

+
+ +
+
+ {/* Orb Oracle Column */} +
+
+ +

Orb Oracle

+
+
    + {[ + "✓ Permissionless creation", + "✓ Built-in liquidity via bonding curves", + "✓ Market-driven consensus", + "✓ Zero creation fees", + "✓ Earn trading fees", + "✓ Fully decentralized", + "✓ No admin keys", + "✓ Instant deployment" + ].map((feature, idx) => ( +
  • + + {feature} +
  • + ))} +
+
+ + {/* Traditional Oracles Column */} +
+
+ +

Traditional Oracles

+
+
    + {[ + "✗ Requires approval/whitelisting", + "✗ External liquidity needed", + "✗ Centralized data sources", + "✗ High setup costs", + "✗ No creator incentives", + "✗ Centralized control", + "✗ Single point of failure", + "✗ Slow deployment process" + ].map((feature, idx) => ( +
  • + + {feature} +
  • + ))} +
+
{/* CTA Section */} -
-
-
-

Ready to build the future?

-

- Join thousands of developers building the next generation of decentralized applications +

+
+ + {/* Animated orbs in background */} +
+
+
+
+ +
+
+
+ + Start Earning Today +
+

Ready to Create Your Oracle?

+

+ Join the future of decentralized price discovery. Create an oracle for any asset and start earning from trading fees today.

- +
+
+ + No Fees to Create + Deploy for free +
+
+ + Instant Deployment + Live in seconds +
+
+ + Earn Trading Fees + Passive income +
+
+ + {/* Footer */} +
) -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0fe3916..a91e970 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1125,6 +1125,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -3001,6 +3002,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -3481,6 +3483,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -3913,6 +3916,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -4319,6 +4323,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.2.tgz", "integrity": "sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/query-core": "5.90.2" }, @@ -4437,6 +4442,7 @@ "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4448,6 +4454,7 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -4469,6 +4476,7 @@ "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.17.3.tgz", "integrity": "sha512-jHivr1UPoJTX5Uel4AZSOwrCf4mO42LcdmnhJtUxZaRWhW4FviFbIfs0moAWWld7GOT+2XnuVZjjA/K32uUnMQ==", "license": "MIT", + "peer": true, "dependencies": { "@emotion/hash": "^0.9.0", "@vanilla-extract/private": "^1.0.8", @@ -4581,6 +4589,7 @@ "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.21.2.tgz", "integrity": "sha512-Rp4waam2z0FQUDINkJ91jq38PI5wFUHCv1YBL2LXzAQswaEk1ZY8d6+WG3vYGhFHQ22DXy2AlQ8IWmj+2EG3zQ==", "license": "MIT", + "peer": true, "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", @@ -5739,6 +5748,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6005,6 +6015,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", @@ -6305,6 +6316,7 @@ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", + "peer": true, "dependencies": { "node-fetch": "^2.7.0" } @@ -6683,6 +6695,7 @@ "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", "integrity": "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==", "license": "MIT", + "peer": true, "dependencies": { "@ecies/ciphers": "^0.2.3", "@noble/ciphers": "^1.3.0", @@ -6705,7 +6718,8 @@ "version": "8.5.1", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.5.1.tgz", "integrity": "sha512-JUb5+FOHobSiWQ2EJNaueCNT/cQU9L6XWBbWmorWPQT9bkbk+fhsuLr8wWrzXKagO3oWszBO7MSx+GfaRk4E6A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/embla-carousel-react": { "version": "8.5.1", @@ -7011,7 +7025,8 @@ "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/eventemitter3": { "version": "5.0.1", @@ -7982,6 +7997,7 @@ "resolved": "https://registry.npmjs.org/next/-/next-14.2.16.tgz", "integrity": "sha512-LcO7WnFu6lYSvCzZoo1dB+IO0xXz5uEv52HF1IUN0IqVTUIZGHuuR10I5efiLadGt+4oZqTcNZyVVEem/TM5nA==", "license": "MIT", + "peer": true, "dependencies": { "@next/env": "14.2.16", "@swc/helpers": "0.5.5", @@ -8466,6 +8482,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -8581,6 +8598,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -8614,6 +8632,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -8627,6 +8646,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz", "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -8650,6 +8670,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -8752,6 +8773,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8814,7 +8836,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -8961,6 +8984,7 @@ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", "license": "MIT", + "peer": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -9134,7 +9158,8 @@ "version": "4.1.13", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tailwindcss-animate": { "version": "1.0.7", @@ -9247,6 +9272,7 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9437,6 +9463,7 @@ "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", "integrity": "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==", "license": "MIT", + "peer": true, "dependencies": { "derive-valtio": "0.1.0", "proxy-compare": "2.6.0", @@ -9513,6 +9540,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", @@ -9537,6 +9565,7 @@ "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.17.5.tgz", "integrity": "sha512-Sk2e40gfo68gbJ6lHkpIwCMkH76rO0+toCPjf3PzdQX37rZo9042DdNTYcSg3zhnx8abFJtrk/5vAWfR8APTDw==", "license": "MIT", + "peer": true, "dependencies": { "@wagmi/connectors": "5.11.2", "@wagmi/core": "2.21.2", @@ -9640,6 +9669,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -9729,6 +9759,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/utils/config.ts b/utils/config.ts index 9d96080..f353201 100644 --- a/utils/config.ts +++ b/utils/config.ts @@ -9,9 +9,12 @@ import { getDefaultConfig } from '@rainbow-me/rainbowkit' +// Fallback project ID for development (get your own at https://cloud.walletconnect.com) +const projectId = process.env.NEXT_PUBLIC_PROJECT_ID || 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6' + export const config = getDefaultConfig({ appName: 'OrbOracle', - projectId: process.env.NEXT_PUBLIC_PROJECT_ID ?? '', + projectId, chains: [ mainnet, base,