Memora
Memora transforms personal memories into permanent, immersive Memory NFTs
Problem Statement
Memories fade and lose their emotional impact over time Digital content disappears from platforms and cloud services Traditional photos/videos lack the immersive depth of real experience No way to preserve the complete context of a momentWhat if you could step back into your memories with full context and experience them in 3D?
Solution
🏗️ How It's Built🖥️Frontend Architecture (Next.js 14)app/ ├── layout.tsx # Root layout with providers ├── page.tsx # Landing page ├── upload/ # Memory upload interface ├── gallery/ # NFT collection browser └── memory/[id]/ # Individual memory viewer components/ ├── WalletConnect.tsx # MetaMask integration ├── UploadMemory.tsx # Video upload + metadata form ├── MemoryGallery.tsx # Collection display ├── Scene3DViewer.tsx # 3D scene renderer ├── LumaSplatsViewer.tsx # Gaussian splat viewer └── VoiceAI.tsx # Voice conversation interface🎨3D Rendering SystemLumaSplats Integration:// components/LumaSplatsViewer.tsx import { LumaSplatsThree } from '@lumaai/luma-web' const splat = new LumaSplatsThree({ source: scene.url, // IPFS URL to .splat file enableControls: isOwner, // Ownership-based controls particleRevealEnabled: true // Enhanced visual effects })Ownership-Based Access:NFT Owners: Full HD quality, enhanced controls, downloadable contentNon-owners: Preview mode with limited quality and upgrade prompts🔗Web3 Integration (MetaMask + ethers.js)// lib/wallet.ts import { ethers } from 'ethers' const connectWallet = async () => { const provider = new ethers.BrowserProvider(window.ethereum) const signer = await provider.getSigner() const address = await signer.getAddress() // NFT ownership verification const balance = await nftContract.balanceOf(address) }Features:MetaMask wallet connectionMulti-network support (Ethereum, Sepolia, Polygon)Real-time balance and NFT collection displayOwnership verification for 3D scene access🎤Voice AI System (Azure OpenAI)// components/VoiceAI.tsx const startRecording = async () => { const stream = await navigator.mediaDevices.getUserMedia({ audio: true }) const mediaRecorder = new MediaRecorder(stream) // Record audio, convert to WAV, send to Azure OpenAI } const sendToAI = async (audioBlob: Blob) => { const response = await fetch(azureEndpoint, { method: 'POST', headers: { 'api-key': apiKey }, body: createFormData(audioBlob, conversationHistory) }) // Returns audio response for natural conversations }Capabilities:Audio-to-Audioconversations using gpt-4o-mini-audio-previewMemory Contextunderstanding with ETH Global Prague specificsConversation Historymanagement for coherent dialoguesWebM to WAVconversion for API compatibility📡Oracle Data Integration (Flare Network)// scripts/flare-data-fetch.js class FlareDataFetcher { async fetchAllData(location) { const [crypto, weather, market, time] = await Promise.all([ this.fetchCryptoPrices(['ETH/USD', 'BTC/USD', 'FLR/USD']), this.fetchWeatherData(location), this.fetchMarketData(), this.fetchTimeData() ]) return { crypto, weather, market, time } } }Data Sources:Crypto Prices: ETH, BTC, FLR via FTSOv2 with confidence scoresWeather Data: Temperature, humidity, pressure, wind conditionsMarket Metrics: Market cap, dominance, fear & greed indexTime Context: Unix timestamps, timezones, blockchain state🗄️Storage ArchitectureMemory Storage Pipeline: Video Upload → Metadata Collection → Oracle Data Fetch → IPFS Upload → NFT Minting IPFS Structure: └── memory-{id}/ ├── scene.splat # 3D Gaussian splat file ├── metadata.json # Enhanced with oracle data ├── thumbnail.jpg # Preview image └── original.mp4 # Source videoStorage Providers:IPFS: Immediate content addressingLighthouse: Decentralized storage with SDKsAkave: Hot storage layer for FilecoinFilecoin: Long-term cold storage with on-chain deals🔍NFT Verification (Blockscout APIs)// scripts/blockscout-nft-test.js class BlockscoutNFTTester { async fetchNFTs(account) { const url = `${apiBase}/v2/addresses/${account}/nft` const response = await fetch(url) return this.formatNFTData(await response.json()) } }Multi-Network Support:Ethereum, Sepolia, Polygon, Base, ArbitrumReal-time NFT collection queriesOwnership verification for access controlsRich metadata extraction and display
Hackathon
ETHGlobal Prague
2025
Prizes
- 🏆
Big Blockscout Explorer Pool Prize
Blockscout
Contributors
- yangezheng
23 contributions