Prize-linked savings app rewarding less screen time: save, build habits, earn yield, win prizes.
No-Scroll Savings: Cross-Chain Behavioral DeFi
Lock your funds to take a social media break, earn yield while you stay off your phone, get paid to improve your digital wellbeing.
Core Concept: Prize-linked savings application that rewards users for reducing screen time and social media usage Users lock USDC deposits (1 week to 3 months) on Arc Testnet while funds earn yield on Ethereum Sepolia Daily compliance tracked via mobile app + Supabase, recorded on-chain for accountability Principal + yield returned after successful challenge completion
Technical Architecture: Arc Testnet (Liquidity Hub):
ERC-4626 compliant SavingsVault handles deposits/redemptions with share-based accounting ChallengeTracker contract manages behavioral challenges, streak counters, and compliance records Low gas costs (~$0.01/tx) enable economically viable daily compliance recording Native USDC - no wrapped tokens required
Cross-Chain Bridge (CCTP Integration):
Node.js backend service polls SavingsVault events every 10 seconds using viem Automated bidirectional bridging: Arc→Sepolia (deposits) and Sepolia→Arc (withdrawals) Circle CCTP flow: burn USDC on source chain → fetch attestation → mint native USDC on destination Error handling: 30s timeout fallback, balance verification, max 3 retry attempts per operation Progress tracking in JSON files for fault tolerance (99% success rate)
Sepolia (Yield Generation):
TreasuryManager receives bridged USDC, deploys to UniswapV4Agent for liquidity provision Custom NoScrollSavingsHook implements full IHooks interface (10 required functions) - V4 mandates hooks for all pools Unlock callback pattern: poolManager.unlock() → unlockCallback() → modifyLiquidity() + settle() in single atomic transaction 50% gas savings vs traditional approve→transfer→addLiquidity flow USDC/WETH pool with 0.3% fee tier, 60 tick spacing Earns trading fees from all USDC/WETH swaps during lock period
Compliance Monitoring:
Mobile app tracks real-time app usage, sends to Supabase PostgreSQL (usage_records table) Dashboard queries last 24 hours for social media apps (Instagram, TikTok, Snapchat, Twitter, Facebook) Boolean compliance result recorded on-chain via ChallengeTracker.recordDailyCompliance() Privacy-preserving: only app name + timestamp stored off-chain, compliance boolean on-chain Streak mechanics: compliant days increase streak, 3+ missed days reset to zero
ENS Integration:
Real Sepolia ENS registration with commit-reveal mechanism (60-second protection against front-running) Frontend calls ETHRegistrarController: generate random secret → makeCommitment() → commit() → wait 60s → register() LocalStorage persistence for secret between commit and reveal transactions 5% price buffer handles ETH volatility between price check and registration Cross-chain resolution: registered on Sepolia, resolved on Arc via ENS gateway
Withdrawal Flow:
User requests redemption: burns shares immediately, creates pending request with unlockTime After lock period: user claims redemption, emits BridgeFromSepoliaRequested event Backend withdraws from UniswapV4Agent (negative liquidityDelta removes position) Reverse CCTP bridge: Sepolia→Arc mints USDC on Arc SavingsVault distributes principal + yield to user wallet
Key Innovations:
Arc as liquidity hub: users interact on low-cost chain while funds generate yield on Ethereum Uniswap V4 unlock callback: single-transaction liquidity operations with 50% gas reduction Custom hook system: tracks all liquidity changes, swap activity, fee generation for analytics Automated bridge orchestration: polling-based event detection with retry logic and fallbacks Behavioral accountability: off-chain privacy + on-chain verification via Supabase integration
Deployed Contracts: Arc Testnet (5042002):
SavingsVault: 0xF4df10e373E509EC3d96237df91bE9B0006E918D ChallengeTracker: 0x2B1A80A3CF8E690b7f69694fF100Bd5c85AF75DA LotteryEngine: 0xA900eF9aB5907f178b6C562f044c896c42c31F7D USDC: 0x3600000000000000000000000000000000000000
Ethereum Sepolia (11155111):
-TreasuryManager: 0xbE51ad59f4a68089fc86697c7d5EFe756268F0d9 -UniswapV4Agent: 0x5AC3d6D73bBfc9C8b26a78cF7D7314B326B2CAb5 -NoScrollSavingsHook: 0x932e5f3e72D7cC0FBcF0E82283e310EEb2cba727 -YieldStrategyManager: 0xa6b00bAE312cBa98Aea60057EcbF2506114e4764 -EmptyHook (backup): 0x0B2D2EC90342B62a9D80967d26A0b10b685d10d0 -PoolManager (V4): 0xE03A1074c86CFEdD5C142C4F04F1a1536e203543 -USDC: 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238 -WETH: 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14
ENS (Sepolia):
ETHRegistrarController: 0x253553366Da8546fC250F378ce31e890FDbbF289 PublicResolver: 0xc7ace338842b0cf896f401199d933d38020b4e8c ENS Registry: 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
Uniswap V4 Pool:
Pool ID: 0x47fa3673209ed2f3343562591254efd890e6873338a92b6bd98b87ffce9d638e Fee Tier: 0.3% (3000 bips) Tick Spacing: 60 Currency0: USDC (0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238) Currency1: WETH (0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14)
Tech Stack:
Contracts: Solidity 0.8.20, Foundry, OpenZeppelin, Uniswap v4-core Backend: Node.js, TypeScript, viem, @circle-sdk/bridge-kit Frontend: Next.js 14, wagmi v2, @supabase/supabase-js, TailwindCSS Infrastructure: Supabase PostgreSQL, Alchemy RPC, MetaMask wallet
Security Features:
ERC-4626 standard for vault composability and share calculation accuracy Immutable core addresses (PoolManager, USDC, WETH) prevent malicious upgrades Backend-only permissions for bridge operations (SavingsVault.transferForCCTPBridge) Row-level security in Supabase: users only access their own usage data Commit-reveal pattern prevents ENS front-running attacks
Pitch Deck : https://www.canva.com/design/DAHAnZILUIg/fRHRk_uNbOuDlhrX-2dzvg/edit?utm_content=DAHAnZILUIg&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
Website : https://no-scroll-savings-5iqe.vercel.app/
Smart Contracts (Foundry + Solidity 0.8.20):
Built ERC-4626 SavingsVault on Arc storing challenge metadata alongside deposits ChallengeTracker manages streaks: compliant days increment, 3+ missed days reset to zero TreasuryManager on Sepolia deploys to UniswapV4Agent with 60/30/10 allocation strategy Used OpenZeppelin contracts for security patterns and access control
Uniswap V4 Integration (The Hacky Part):
V4 requires hooks for ALL pools - address(0) causes revert unlike V3 Built NoScrollSavingsHook implementing full IHooks interface (10 required functions) Had to create custom BeforeSwapDelta and SwapParams type definitions (missing in imports) Implemented unlock callback: poolManager.unlock() → unlockCallback() → modifyLiquidity() + settle() Result: 50% gas savings vs traditional approve→transfer→addLiquidity flow Pool: USDC/WETH, 0.3% fee, ID: 0x47fa...d638e
Cross-Chain Bridge (Node.js + CCTP):
Built backend with viem + @circle-sdk/bridge-kit polling events every 10s (WebSocket unstable on Arc) Dual watchers for deposits (Arc→Sepolia) and withdrawals (Sepolia→Arc) Hack #1: CCTP timeouts handled with 30s wait + balance verification fallback (reduced failures 5%→<1%) Hack #2: Historical scan (5000 blocks) on restart catches missed events Progress tracked in JSON files with max 3 retry attempts
Frontend (Next.js 14 + wagmi v2):
Custom hooks: useDepositUSDC, useRecordCompliance, useRequestRedeem Supabase client queries usage_records for social media detection Dashboard: Challenge → Deposit → Compliance → Withdraw → Stats Real-time updates with wagmi's useBalance and useBlockNumber
ENS Integration (Commit-Reveal):
Challenge: Persist secret between commit (tx1) and reveal (tx2) 60s apart Hacky Solution: localStorage with "don't close browser" warning (wanted frontend-only) Generate random 32-byte secret → makeCommitment() → commit() → wait 60s → register() 5% price buffer handles ETH volatility (99% success rate)
Supabase (PostgreSQL + RLS):
Table: usage_records (user_id, app_name, package_name, created_at) Indexed for fast queries (last 24h per user) Privacy: only app name + timestamp, no content Row-level security: users read own data only
Partner Benefits:
Arc: $0.01/tx made daily compliance viable, native USDC + CCTP enabled seamless bridging CCTP: Native bridging without wrapped tokens, no slippage, eliminated custom bridge contracts Uniswap V4: Singleton gas efficiency, hook analytics, unlock callback 50% gas savings ENS: Decentralized identity (frank.eth vs 0x742d...), cross-chain resolution, commit-reveal security
Notable Challenges:
Empty Hook: V4 mandates hooks, created EmptyHook (0x0B2D...10d0) with all 10 functions CCTP Timeouts: 30s fallback + balance check reduced failures 5%→<1% State Sync: Dual accounting (Arc + Sepolia) with retry logic for edge cases Polling vs WebSocket: Polling more reliable on testnet (10s latency acceptable) Gas: Pool init 55k, deposit+bridge 127k Arc/200k Sepolia, unlock callback 300-400k
Tech Stack:
Contracts: Solidity 0.8.20, Foundry, OpenZeppelin, Uniswap v4-core Backend: Node.js, TypeScript, viem, @circle-sdk/bridge-kit Frontend: Next.js 14, wagmi v2, @supabase/supabase-js, TailwindCSS Infrastructure: Supabase PostgreSQL, Alchemy RPC, MetaMask

