The latest and most accurate documentation for Exhibition is now hosted externally.
Exhibition is a primary market infrastructure protocol built on Nexus Layer 1 β a blockchain purpose-built for intelligent markets and high-performance financial applications.
It enables projects to launch tokens, raise funds, and bootstrap on-chain liquidity through an integrated AMM β with every parameter configured upfront, enforced by the protocol, and immutable once capital enters.
The core thesis is simple: if it matters, it must be configured before capital enters and deterministically executed.
Three core principles guide the system:
- Deterministic β Launch configurations β token supply, fund goal, soft cap, token price, liquidity allocation (minimum 70%), lock duration, and vesting schedule β are set before capital enters and enforced on-chain. No discretionary execution. No post-launch amendments.
- Verifiable β These exact configurations are fully visible before and during a launch. Contributors can independently confirm what they're entering into before capital moves, and audit exactly how it was executed after.
- Protected β Contributors are safeguarded by enforced soft caps, a permissionless pull-refund mechanism, optional vesting schedules for purchased tokens, locked liquidity, and an emergency refund path if the project owner fails to finalize within the protocol deadline.
- Configure launches with fixed funding goals, soft caps, contribution limits, timelines, and liquidity percentage
- Protocol-enforced liquidity bootstrapping β a preconfigured percentage of raised capital is automatically allocated to the AMM
- Liquidity is locked at creation and remains immutable for the configured duration
- Vesting schedules with configurable cliff, duration, interval, and initial release
- Deterministic full refunds if the soft cap is not met
- Enforced liquidity finalization deadlines with fallback refund paths
- Constant product automated market maker
- Native liquidity creation from launch capital
- Time-weighted average price (TWAP) oracle
- Liquidity position tracking β unrealized and realized earnings per position
- Liquidity lock enforcement for launch-created pools
- exNEX portal β wrap/unwrap native NEX to exNEX
- Testnet faucet β request EXH and USDX
- Real-time pricing derived directly from on-chain pool reserves
- Unified portfolio view β LP positions, earnings, and lock status
- Project metadata β off-chain launch descriptions, social links, and media managed via a backend API
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, Turbopack) |
| Blockchain | wagmi 2 + viem + RainbowKit 2 |
| State | valtio, TanStack Query |
| UI | Tailwind CSS v4, shadcn/ui (Radix) |
| Forms | react-hook-form + zod |
| Language | TypeScript |
| Network | Nexus Testnet |
| Property | Value |
All contracts are deployed and live on Nexus Testnet. No local deployment required.
| Contract | Address |
|---|---|
| Exhibition | 0xe69e3E1C5B448c2E594Fd33f0400907798907DF5 |
| ExhibitionAMM | 0x5A8891C782A65083D490814755A167c6bD1b4C13 |
| ExhibitionLPTokens | 0xbf131952cb4Ffc16134989532Eb0aB60d563Af5D |
| ExhibitionFactory | 0x88b4CcB1d0820C8BE944F8C6B6950252e7835982 |
| USDX | 0x25Ec99546f11Cd98454Dc65f314C72423CB30d57 |
| exNEX | 0xA6168C17807e2c914e4546a2D2040056974bD39f |
| EXH | 0xa8286B8e01665d03A183aDd918beb0f318939233 |
- Node.js 20+
- A WalletConnect Project ID from cloud.walletconnect.com
git clone https://github.com/ExhibitionDefi/exhibitiondapp
cd exhibitiondapp
npm installCreate a .env.local file in the root:
# Contracts
NEXT_PUBLIC_EXHIBITION_ADDRESS=
NEXT_PUBLIC_EXHIBITION_AMM_ADDRESS=
NEXT_PUBLIC_EXHIBITION_LP_TOKENS_ADDRESS=
NEXT_PUBLIC_EXHIBITION_FACTORY_ADDRESS=
# Tokens
NEXT_PUBLIC_NEXUS_USD_ADDRESS=
NEXT_PUBLIC_EXHIBITION_NEX_ADDRESS=
NEXT_PUBLIC_EXH_ADDRESS=
# Network
NEXT_PUBLIC_NEXUS_CHAIN_ID=3945
NEXT_PUBLIC_NEXUS_CHAIN_NAME=Nexus Testnet
NEXT_PUBLIC_NEXUS_TESTNET_RPC_URL=https://testnet.rpc.nexus.xyz
NEXT_PUBLIC_NEXUS_TESTNET_EXPLORER_URL=https://testnet.explorer.nexus.xyz
# WalletConnect
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=your_project_id_here
# BACKEND API URLs
NEXT_PUBLIC_API_URL=npm run devOpen http://localhost:3000 in your browser.
npm run build
npm startsrc/
βββ app/ # Next.js App Router pages
β βββ page.tsx # Landing page
β βββ launches/ # Launch list + detail pages
β βββ amm/ # Swap, liquidity, pools pages
β βββ portfolio/ # LP positions page
β βββ dashboard/ # User launches + contributions
β βββ faucet/ # Faucet + exNEX portal
βββ components/
β βββ ui/ # shadcn/ui + custom components
β βββ layout/ # Navbar, Footer, PageWrapper
β βββ launch/ # Launch cards, panels, wizard
β βββ amm/ # Swap, liquidity, pool components
βββ hooks/
β βββ contracts/
β β βββ exhibition/ # Exhibition contract hooks
β β βββ amm/ # AMM contract hooks + derived hooks (pricing, token list)
β β βββ tokens/ # ERC20 approvals, balances, faucet, and NEX wrap/unwrap
β βββ auth/ # Auth + project metadata (backend API)
β βββ ui/ # Debounce, Modal, Toast
β βββ wizard/ # Create launch wizard state
βββ lib/
β βββ abis/ # Contract ABIs
β βββ apiClient.ts # Custom fetch wrapper β base URL, CSRF headers, auth cookies, typed request helpers
β βββ constants.ts # Block constants, status maps
β βββ contracts.ts # Contract addresses + ABIs
β βββ formatters/ # Display formatting utilities
β βββ sanitizers/ # Input sanitization
β βββ tokenLogos.ts # Static token logo resolver
β βββ validators/ # Zod schemas for wizard
β βββ parseContractError.ts # Shared contract error parser β extracts revert reasons, classifies rejections
β βββ tokenMetadataCache.ts # Module-level ERC20 metadata cache β persists across renders, never resets on refetch
β βββ wagmi.ts # Wagmi + RainbowKit config
βββ providers/ # React context providers
βββ types/ # TypeScript type definitions
All contract write hooks follow a consistent error handling pattern:
- User rejection β if the user rejects in their wallet, the hook returns
'rejected'and resets silently. No error state is set. - Contract revert β if the contract reverts, the hook returns
'error'with the revert reason extracted via viem'sContractFunctionRevertedError. - Network / RPC failure β if the RPC drops or times out, the hook returns
'error'with the short error message. The app does not crash. - No throws β write hooks never throw. All errors are captured and surfaced via the
error: string | nullfield andisError: booleanflag returned from the hook.
All write hooks return Promise<WriteResult> where WriteResult = 'success' | 'rejected' | 'error', powered by the shared parseContractError utility in lib/parseContractError.ts.
Created (Upcoming)
β Owner deposits project tokens
Active β open for contributions
β Hard cap reached instantly OR duration ends β anyone calls finalizeProject()
Successful β funding goal met, soft cap reached
β Owner deposits liquidity tokens + calls finalizeLiquidityAndReleaseFunds()
Completed β liquidity locked in AMM, tokens claimable
ββ Alternative paths ββββββββββββββββββββββββββββββββββββββββββ
Active β Failed β soft cap not reached after end block
Failed β Refundable β first contributor calls requestRefund()
Successful β Refundable β owner misses liquidity deadline; anyone calls requestEmergencyRefund()
- MetaMask
- Rainbow
- CoinbaseWallet
- Trust Wallet
- WalletConnect (all compatible wallets)
This project is currently in testnet phase. Contributions, bug reports, and feedback are welcome via GitHub Issues.
MIT