Install Template
Last updated
Last updated
To get started, you can either clone the boilerplate repository for a quick setup or recreate it from scratch to better understand its structure.
You can find the template here:
Run the following command to clone the template:
Then install dependencies:
To push your changes to a personal GitHub repository, update the remote URL:
Update the .env
file with your custom settings - :
Once everything is set up, start the development server:
Your application should now be up and running!
While cloning the boilerplate is faster, this approach helps you better understand the app’s architecture and dependencies.
We’ll start by setting up a new Next.js 15 project.
📌 Run the following command:
Your app will be structured as follows:
app/
Houses Next.js routes and pages.
Main entry point for the application.
components/
Stores reusable components for your pages.
hooks/
Contains custom React hooks for logic reuse (e.g., useAuth()
, useFetchData()
).
lib/
config/
→ Global settings (e.g., API URLs, environment variables).
helpers/
→ Utility functions (e.g., formatDate()
, parseCookies()
).
services/
→ API call logic (e.g., authService.ts
, userService.ts
).
types/
→ TypeScript interfaces for better type safety.
Wagmi is used for wallet connections and blockchain interactions.
📌 Install dependencies:
📁 lib/config/
index.ts
→ Fetches configuration from .env
chain.ts
→ Defines the Hyperliquid EVM testnet
axios.ts
→ Installs and configures Axios for API calls
📁 components/
ContextProvider.tsx
→ Wraps the app in WagmiProvider
and passes the config.
UserProvider.tsx
→ Manages user state based on wallet connection (wagmi
+ localStorage
).
📌 Note: Consider improving Builder Fee storage (DB or blockchain instead of local cache).
📁 lib/store.ts
(State Management)
Zustand is used to manage global state efficiently.
📌 Install Zustand:
Responsibilities of store.ts
:
Define user-related state types (User
, Agent
, UserStoreState
).
Create Zustand store for updating, resetting, and accessing user data globally.
lib/utils.ts
→ Utility functions for styling
components/ui/
→ Copy & paste shadcn/UI components (e.g., toast.tsx
, button.tsx
, etc.).
📌 Important: shadcn/UI is not a component library—it's a collection of reusable UI components that you copy manually.
📁 app/page.tsx
Displays either the trading widget (if connected) or the wallet connection button.
📁 components/
ConnectWallet.tsx
→ Wraps a Connect Wallet
button using AppKit.
Trade.tsx
→ Trading widget for buying/selling assets.
📁 components/ApproveBuilderFee.tsx
Ensures users approve the Builder Fee before trading.
📁 lib/services/
approve-builder.ts
→ Handles fee approval via Wagmi.
📁 lib/services/
Hyperliquid allows trading via an "agent" account.
components/ApproveAgent.tsx
Creates a new account (agent) for secure order placement without signing each time.
The agent cannot move user funds, making it a safer approach.
lib/services/approve-agent.ts
📌 Security Note: The agent’s private key is generated locally—ensure it’s never exposed or stored insecurely.
Handles placing, signing, and submitting trades.
market-order.ts
→ /exchange
(trade execution)
mid-price.ts
→ /info
(retrieves real-time mid-prices)
balances.ts
→ /info
(fetches user balances)
token-details.ts
→ /info
(retrieves token metadata)
📌 Update ESLint rules (eslint.config.mjs
):
By following this guide, you’ve built the Builder Codes Dapp from scratch, gaining a deep understanding of:
✅ Next.js & TypeScript setup ✅ Wallet connection & Wagmi configuration ✅ API integration with Hyperliquid ✅ Trading execution with agent-based security ✅ UI & state management with shadcn/UI & Zustand
📚 Reference:
📚 Reference:
wagmi.ts
→ Creates the Wagmi config using .
📚 Reference:
📚 Reference:
tailwind.config.ts
→ Customize Tailwind settings ()
globals.css
→ Define base styles ()
📚 Reference:
🔹 Setup Instructions: Refer to the documentation for detailed steps on integrating your Dapp with the blockchain.
builder-info.ts
→ Calls Hyperliquid API /info
endpoint ().
Calls for agent approval.
signing.ts
→ Uses for encoding.
📌 Modify Next.js config (next.config.ts
)
Check the .