DApp Development

Build modern decentralized applications on XL3 Chain

Modern DApp Development on XL3 Chain

Build responsive, user-friendly decentralized applications using modern web technologies. XL3 Chain provides fast transactions and low fees for optimal user experience.

ReactNext.jswagmiviemTypeScript

Recommended Tech Stack

Frontend Framework
Modern React-based frameworks for optimal performance

Next.js 14+

App Router, SSR, SSG

Recommended

Vite + React

Fast development

Alternative
Web3 Integration
Type-safe blockchain interactions

wagmi v2

React hooks for Ethereum

Recommended

viem

TypeScript Ethereum library

Recommended
UI & Styling
Beautiful and responsive user interfaces

Tailwind CSS

Utility-first CSS

Recommended

shadcn/ui

Beautiful components

Recommended

Quick Start

Create New Project
Set up a new DApp project with XL3 Chain integration

1. Create Next.js App:

npx create-next-app@latest my-xl3-dapp --typescript --tailwind --app

2. Install Web3 Dependencies:

npm install wagmi viem @tanstack/react-query

3. Install UI Components:

npx shadcn-ui@latest init
Configure Web3 Provider
Set up wagmi configuration for XL3 Chain
// lib/config.ts
import { http, createConfig } from 'wagmi'
import { mainnet, sepolia } from 'wagmi/chains'

// XL3 Chain configuration
export const xl3Chain = {
  id: 7117,
  name: 'XL3 Chain',
  nativeCurrency: {
    decimals: 18,
    name: 'XL3',
    symbol: 'XL3',
  },
  rpcUrls: {
    default: {
      http: ['https://rpc.xl3chain.com'],
    },
  },
  blockExplorers: {
    default: {
      name: 'XL3 Explorer',
      url: 'https://exp.0xl3.com',
    },
  },
}

export const config = createConfig({
  chains: [xl3Chain, mainnet, sepolia],
  transports: {
    [xl3Chain.id]: http(),
    [mainnet.id]: http(),
    [sepolia.id]: http(),
  },
})

Code Examples

Wallet Connection Component
Connect and manage wallet connections
// components/WalletConnect.tsx
'use client'
import { useAccount, useConnect, useDisconnect } from 'wagmi'
import { Button } from '@/components/ui/button'

export function WalletConnect() {
  const { address, isConnected } = useAccount()
  const { connect, connectors } = useConnect()
  const { disconnect } = useDisconnect()

  if (isConnected) {
    return (
      <div className="flex items-center gap-4">
        <span className="text-sm">
          {address?.slice(0, 6)}...{address?.slice(-4)}
        </span>
        <Button onClick={() => disconnect()} variant="outline">
          Disconnect
        </Button>
      </div>
    )
  }

  return (
    <div className="flex gap-2">
      {connectors.map((connector) => (
        <Button
          key={connector.uid}
          onClick={() => connect({ connector })}
          variant="outline"
        >
          Connect {connector.name}
        </Button>
      ))}
    </div>
  )
}
Smart Contract Interaction
Read from and write to smart contracts
// components/TokenBalance.tsx
'use client'
import { useReadContract, useWriteContract } from 'wagmi'
import { parseEther } from 'viem'
import { Button } from '@/components/ui/button'

const tokenABI = [
  {
    name: 'balanceOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ name: 'account', type: 'address' }],
    outputs: [{ name: '', type: 'uint256' }],
  },
  {
    name: 'transfer',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { name: 'to', type: 'address' },
      { name: 'amount', type: 'uint256' },
    ],
    outputs: [{ name: '', type: 'bool' }],
  },
] as const

export function TokenBalance({ address, tokenAddress }: {
  address: `0x${string}`
  tokenAddress: `0x${string}`
}) {
  const { data: balance } = useReadContract({
    address: tokenAddress,
    abi: tokenABI,
    functionName: 'balanceOf',
    args: [address],
  })

  const { writeContract } = useWriteContract()

  const handleTransfer = () => {
    writeContract({
      address: tokenAddress,
      abi: tokenABI,
      functionName: 'transfer',
      args: ['0x...', parseEther('1')],
    })
  }

  return (
    <div className="space-y-4">
      <p>Balance: {balance?.toString() || '0'}</p>
      <Button onClick={handleTransfer}>
        Transfer 1 Token
      </Button>
    </div>
  )
}

Best Practices

User Experience
Create intuitive and responsive interfaces

Loading States:

  • • Show loading indicators for transactions
  • • Display transaction progress
  • • Handle pending states gracefully

Error Handling:

  • • Provide clear error messages
  • • Handle network switching
  • • Graceful fallbacks for failures

Responsive Design:

  • • Mobile-first approach
  • • Touch-friendly interactions
  • • Accessible components
Performance
Optimize for speed and efficiency

Code Splitting:

  • • Lazy load components
  • • Dynamic imports for heavy libraries
  • • Route-based splitting

Caching:

  • • Cache contract read results
  • • Use React Query for data fetching
  • • Implement proper cache invalidation

Bundle Optimization:

  • • Tree shake unused code
  • • Optimize images and assets
  • • Use production builds

Additional Resources

wagmi Docs

React hooks for Ethereum

View Docs

Next.js

React framework documentation

Learn More

shadcn/ui

Beautiful UI components

Browse Components

Examples

Sample DApp projects

View Examples