Build responsive, user-friendly decentralized applications using modern web technologies. XL3 Chain provides fast transactions and low fees for optimal user experience.
App Router, SSR, SSG
Fast development
React hooks for Ethereum
TypeScript Ethereum library
Utility-first CSS
Beautiful components
// 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(),
},
})// 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>
)
}// 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>
)
}