UnifiedPay treats all USDC across chains as one unified liquidity surface.
UnifiedPay enables creators to accept USDC payments on Arc Network as the primary settlement layer, while giving users visibility into their unified USDC balance across 15+ chains via Circle Gateway. Payments are made to human-readable ENS names (creator.eth) instead of hex addresses, with dynamic ENS resolution at runtime.
The result: A non-custodial payment experience where users pay on Arc, creators receive on Arc, and the complexity of multi-chain USDC management is abstracted away.
Traditional Web3 payment platforms fragment liquidity across chains. A creator might accept payments on Ethereum, Polygon, and Base β but this creates:
- Fragmented balances that require manual reconciliation
- Poor UX β users must switch chains or bridge assets
- Hex address fatigue β sharing
0x1234...instead of human names
UnifiedPay uses:
- Arc Network as the single settlement and coordination layer
- Circle Gateway for unified USDC balance visibility across 15+ chains
- ENS for human-readable payment identities
Users see their total USDC across all chains, pay on Arc, and creators receive instantly on Arc β all without bridging, swapping, or managing multiple chain UIs.
Arc serves as the coordination and settlement layer for UnifiedPay.
While users may hold USDC on Ethereum, Base, Arbitrum, or other chains (visible via Circle Gateway), all payments settle on Arc. This design:
- β Avoids fragmenting liquidity β One settlement layer, not N chains
- β Provides fast, low-cost settlement β Creators receive payments instantly
- β Uses Arc as single source of truth β Payment state lives on Arc
- β Eliminates bridge UX β No manual chain switching or asset transfers
Arc is not just "another chain" β it's the unified settlement surface for cross-chain USDC liquidity.
1. User sees unified USDC balance (via Circle Gateway)
2. User pays with USDC on Arc Network
3. Payment settles on Arc (coordination layer)
4. Creator receives USDC on Arc (single chain, instant)
By using Arc as the settlement layer, UnifiedPay demonstrates how multiple chains can share one liquidity surface without fragmenting user experience.
Circle Gateway provides unified USDC balance visibility.
UnifiedPay integrates Circle Gateway's balance aggregation API to show users their total USDC across 15+ chains in one unified view:
- Ethereum
- Base
- Arbitrum
- Optimism
- Polygon
- Avalanche
- Solana
- Unichain
- Sonic
- World Chain
- HyperEVM
- Sei
- Arc Network
- ...and more
β What it does:
- Aggregates USDC balances across all chains into one unified number
- Provides real-time balance visibility via Circle's API
- Helps users answer: "Do I have enough USDC across my wallets to make this payment?"
β What it doesn't do:
- Does NOT automatically bridge or swap assets
- Does NOT custody user funds
- Does NOT execute cross-chain transfers
This is balance reconciliation, not bridging. Users see their total USDC liquidity surface, then pay with USDC on Arc.
- Uses Circle Gateway REST API (
/v1/balances) - Read-only integration (no write operations)
- Falls back to direct RPC queries if Circle Gateway is unavailable
- Supports both testnet and mainnet environments
Code reference: lib/circle-gateway.ts
ENS provides human-readable payment identities.
Instead of sharing payment links like unifiedpay.com/pay/0x1234..., creators can use ENS names like:
unifiedpay.com/pay/creator.eth β
β Runtime ENS resolution (forward and reverse)
- Forward:
creator.ethβ0x1234... - Reverse:
0x1234...βcreator.eth
β ENS avatar display from on-chain records
- Fetches and displays ENS avatars via
resolver.getAvatar()
β Dynamic lookups β No hardcoded addresses
- All ENS resolution happens at runtime via ethers.js ENS API
- Uses Ethereum Sepolia testnet for ENS lookups
ENS is not cosmetic β it's the identity layer for payments:
- Better UX: Share
creator.ethinstead of0x1234... - On-chain verification: ENS names resolve to addresses trustlessly
- Portable identity: ENS names work across all chains
- Uses ethers.js
provider.resolveName()andprovider.lookupAddress() - Implements 5-minute in-memory cache for performance
- Gracefully falls back to hex addresses if ENS resolution fails
- Supports ENS avatars from IPFS, HTTP, and data URIs
Code reference: lib/ens.ts
For detailed ENS implementation documentation, see ENS_INTEGRATION.md
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User Wallet β
β (USDC on multiple chains: Ethereum, Base, Arbitrum, etc.) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β Circle Gateway API β
β (Balance Aggregation) β
ββββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β UnifiedPay Frontend β
β - ENS Resolution β
β - Payment UI β
ββββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β Arc Network β
β (Settlement Layer) β
β - USDC Transfer β
β - Payment Recording β
ββββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β Creator Wallet β
β (Receives on Arc) β
ββββββββββββββββββββββββββ
- Circle Gateway β Read-only balance visibility across 15+ chains
- Arc Network β Settlement and coordination layer for payments
- ENS β Human-readable identity resolution
- UnifiedPay β Frontend + API that orchestrates all three
- Frontend: Next.js 16 (App Router), React 18, Tailwind CSS
- Wallet Connection: thirdweb WalletConnect
- Blockchain Interaction: ethers.js
- Database: PostgreSQL (Supabase) + Prisma ORM
- Payment Settlement: Arc Network USDC contracts
- Balance Aggregation: Circle Gateway REST API
- Identity Resolution: ENS via ethers.js on Sepolia
-
Arc Network Integration
- USDC payment settlement on Arc
- Arc as primary coordination layer
- Direct Arc Network RPC integration
-
Circle Gateway Integration
- Unified USDC balance across 15+ chains
- Real-time balance aggregation via Circle API
- Fallback to direct RPC queries
-
ENS Integration
- Runtime ENS name resolution (forward + reverse)
- ENS avatar display from on-chain records
- Dynamic lookups via ethers.js
- Human-readable payment URLs (
/pay/creator.eth)
-
Payment Infrastructure
- Non-custodial direct wallet-to-wallet transfers
- Zero platform fees (100% to creators)
- Automatic content unlocking after payment
- Payment history and analytics dashboard
-
User Experience
- Single-page payment flow
- No chain switching required
- ENS-based identity throughout UI
- Automatic cross-chain bridging β Users pay on Arc (no bridge UI)
- Token swaps β USDC-only (no DEX integration)
- Custodial wallets β Fully non-custodial (users control keys)
- Fiat on/off ramps β Crypto-native only
| Feature | Implementation |
|---|---|
| Uses Arc as coordination layer | All payments settle on Arc; Arc is the single source of truth for payment state |
| Demonstrates multi-chain UX | Circle Gateway shows balances across 15+ chains; users pay on Arc without chain switching |
| Shows Arc's unique value | Arc enables "one liquidity surface" by serving as the settlement layer for cross-chain USDC |
| Technical implementation | Direct Arc Network integration via RPC; USDC transfers on Arc; payment recording on Arc |
Why this matters for Arc: UnifiedPay demonstrates how Arc can serve as a coordination layer that unifies fragmented multi-chain liquidity into one settlement surface.
| Feature | Implementation |
|---|---|
| Runtime ENS resolution | Uses ethers.js resolveName() and lookupAddress() β no hardcoded addresses |
| Human-readable identities | Payment URLs use ENS names (/pay/creator.eth) instead of hex addresses |
| ENS avatar integration | Displays ENS avatars from on-chain records via resolver.getAvatar() |
| Forward + reverse lookup | Resolves ENS names to addresses AND addresses to ENS names |
| Dynamic, not static | All ENS data fetched at runtime; 5-minute cache for performance |
Why this matters for ENS: UnifiedPay treats ENS as the identity layer for Web3 payments, making payment URLs human-readable and verifiable on-chain.
- Next.js 16 (App Router)
- React 18
- Tailwind CSS
- thirdweb for wallet connection
- Next.js API Routes
- Prisma ORM
- PostgreSQL (Supabase)
- Arc Network (settlement layer)
- Circle Gateway (balance aggregation)
- ENS (Ethereum Sepolia testnet)
- ethers.js (blockchain interaction)
usersβ Wallet addresses of creatorspayment_pagesβ Public payment pagespayment_itemsβ Individual payment itemspaymentsβ Record of all payments
- Node.js 18+
- PostgreSQL database (Supabase recommended)
- Arc Network RPC endpoint
- Circle Gateway API key (optional)
- thirdweb account for wallet connection
- Install dependencies:
npm install- Set up environment variables:
cp .env.example .env
# Edit .env with your actual API keys and configuration
# IMPORTANT: Never commit .env to git - it contains sensitive keys!Required environment variables:
# Database
DATABASE_URL="postgresql://..."
# Arc Network
NEXT_PUBLIC_RPC_URL_ARC_TESTNET="https://..."
# Circle Gateway (optional)
CIRCLE_GATEWAY_API_KEY="your-api-key"
# ENS (Ethereum Sepolia)
NEXT_PUBLIC_RPC_URL_ETHEREUM_SEPOLIA="https://..."
# thirdweb
NEXT_PUBLIC_THIRDWEB_CLIENT_ID="your-client-id"- Set up the database:
# Generate Prisma Client
npm run db:generate
# Push schema to PostgreSQL database (creates tables)
npm run db:push
# Or create a migration
npm run db:migrateNote: Make sure your DATABASE_URL in .env points to your PostgreSQL database (Supabase connection string).
- Run the development server:
npm run devOpen http://localhost:3000 with your browser.
/app # Next.js App Router pages and API routes
/components # React components
/prisma # Prisma schema and migrations
/lib # Core utilities
βββ circle-gateway.ts # Circle Gateway API client
βββ ens.ts # ENS resolution utilities
βββ blockchain.ts # Arc Network integration
βββ constants.ts # Chain IDs, contract addresses
/public # Static assets
- Live Demo: https://unifiedpay.birangal.com/
- GitHub Repository: https://github.com/AdityaBirangal/UnifiedPay
- ENS Implementation Docs: ENS_INTEGRATION.md
Aditya Birangal
- πΌ LinkedIn: linkedin.com/in/AdityaBirangal
- π GitHub: @AdityaBirangal
Copyright (c) 2026 Aditya Birangal
Licensed under the MIT License. See LICENSE for details.
Arc Network β’ Circle Gateway β’ ENS
