evm-wallet-integration
SKILL.md
EVM Wallet Integration for Celo
This skill covers integrating wallet connection libraries into Celo dApps.
When to Use
- Adding wallet connection to a dApp
- Supporting multiple wallet types
- Implementing authentication flows
- Building wallet experiences
Wallet Connection Libraries
| Library | Description | Best For |
|---|---|---|
| Reown AppKit | Official WalletConnect SDK with wagmi | Production React apps |
| Dynamic | Auth-focused with dashboard | Apps needing user management |
| ConnectKit | Simple wagmi integration | Quick setup |
| Custom wagmi | Direct connector setup | Full control |
Reown AppKit
Official WalletConnect SDK for React apps with built-in wallet UI. Supports 600+ wallets.
Source: https://docs.reown.com/appkit
Note: Reown is the company formerly known as WalletConnect Inc. (rebranded in 2024). The protocol and npm packages for wagmi connectors still use "walletConnect" naming.
Installation
npm install @reown/appkit @reown/appkit-adapter-wagmi wagmi viem @tanstack/react-query
Get Project ID
- Go to cloud.reown.com
- Create a new project
- Copy the project ID
Configuration
// config.ts
import { WagmiAdapter } from "@reown/appkit-adapter-wagmi";
import { celo, celoAlfajores } from "@reown/appkit/networks";
const projectId = process.env.NEXT_PUBLIC_REOWN_PROJECT_ID!;
export const wagmiAdapter = new WagmiAdapter({
networks: [celo, celoAlfajores],
projectId,
ssr: true,
});
export const config = wagmiAdapter.wagmiConfig;
Provider Setup
"use client";
import { WagmiProvider } from "wagmi";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { createAppKit } from "@reown/appkit/react";
import { wagmiAdapter } from "./config";
import { celo, celoAlfajores } from "@reown/appkit/networks";
const queryClient = new QueryClient();
createAppKit({
adapters: [wagmiAdapter],
networks: [celo, celoAlfajores],
projectId: process.env.NEXT_PUBLIC_REOWN_PROJECT_ID!,
metadata: {
name: "My Celo App",
description: "Celo dApp",
url: "https://myapp.com",
icons: ["https://myapp.com/icon.png"],
},
});
export function Providers({ children }: { children: React.ReactNode }) {
return (
<WagmiProvider config={wagmiAdapter.wagmiConfig}>
<QueryClientProvider client={queryClient}>
{children}
</QueryClientProvider>
</WagmiProvider>
);
}
Connect Button
import { AppKitButton } from "@reown/appkit/react";
function Header() {
return (
<nav>
<AppKitButton />
</nav>
);
}
Custom Connect Button
import { useAppKit, useAppKitAccount } from "@reown/appkit/react";
function WalletConnect() {
const { open } = useAppKit();
const { address, isConnected } = useAppKitAccount();
if (isConnected) {
return (
<div>
<p>Connected: {address}</p>
<button onClick={() => open({ view: "Account" })}>Account</button>
</div>
);
}
return <button onClick={() => open()}>Connect Wallet</button>;
}
Using Wagmi Hooks with AppKit
import { useAccount, useBalance, useDisconnect } from "wagmi";
function AccountInfo() {
const { address, isConnected } = useAccount();
const { data: balance } = useBalance({ address });
const { disconnect } = useDisconnect();
if (!isConnected) return null;
return (
<div>
<p>Address: {address}</p>
<p>Balance: {balance?.formatted} {balance?.symbol}</p>
<button onClick={() => disconnect()}>Disconnect</button>
</div>
);
}
Dynamic
Authentication-focused wallet connection with user management dashboard.
Source: https://docs.dynamic.xyz
Installation
npm install @dynamic-labs/sdk-react
Setup
import {
DynamicContextProvider,
DynamicWidget,
} from "@dynamic-labs/sdk-react";
function App() {
return (
<DynamicContextProvider
settings={{
environmentId: process.env.NEXT_PUBLIC_DYNAMIC_ENV_ID!,
}}
>
<DynamicWidget />
</DynamicContextProvider>
);
}
Enable Celo
- Go to app.dynamic.xyz dashboard
- Navigate to Configurations
- Select EVM card
- Toggle Celo on
Custom Implementation
Build wallet connection without a library using wagmi directly.
Wagmi Configuration
import { http, createConfig } from "wagmi";
import { celo, celoSepolia } from "wagmi/chains";
import { injected, walletConnect, metaMask } from "wagmi/connectors";
const projectId = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID!;
export const config = createConfig({
chains: [celo, celoSepolia],
connectors: [
injected(),
walletConnect({ projectId }),
metaMask(),
],
transports: {
[celo.id]: http(),
[celoSepolia.id]: http(),
},
});
Wallet Connect Component
import { useConnect, useConnectors, useAccount, useDisconnect } from "wagmi";
function WalletConnect() {
const { connect } = useConnect();
const connectors = useConnectors();
const { address, isConnected } = useAccount();
const { disconnect } = useDisconnect();
if (isConnected) {
return (
<div>
<p>Connected: {address}</p>
<button onClick={() => disconnect()}>Disconnect</button>
</div>
);
}
return (
<div>
{connectors.map((connector) => (
<button
key={connector.uid}
onClick={() => connect({ connector })}
>
{connector.name}
</button>
))}
</div>
);
}
Network Configuration
Celo Networks
| Network | Chain ID | Reown Import | Wagmi Import |
|---|---|---|---|
| Mainnet | 42220 | celo from @reown/appkit/networks |
celo from wagmi/chains |
| Celo Alfajores | 44787 | celoAlfajores from @reown/appkit/networks |
celoAlfajores from wagmi/chains |
| Celo Sepolia | 11142220 | - | celoSepolia from wagmi/chains |
Reown Project ID
Required for WalletConnect connections. WalletConnect Inc. rebranded to Reown in 2024.
- Go to cloud.reown.com (formerly WalletConnect Cloud)
- Create a new project (select "AppKit" type)
- Copy the project ID
- Add to environment variables:
NEXT_PUBLIC_REOWN_PROJECT_ID=your_project_id
Note: The wagmi
walletConnectconnector still uses the same project ID. Only the cloud console was rebranded.
Best Practices
- Support Multiple Wallets - Don't force users into one wallet
- Handle Network Switching - Prompt users to switch to Celo
- Show Connection State - Clear UI for connected/disconnected
- Handle Errors - User-friendly error messages
- Test on Mobile - Mobile browsers and wallet apps
Dependencies
Reown AppKit
{
"dependencies": {
"@reown/appkit": "^1.0.0",
"@reown/appkit-adapter-wagmi": "^1.0.0",
"wagmi": "^2.0.0",
"viem": "^2.0.0",
"@tanstack/react-query": "^5.0.0"
}
}
Custom wagmi (without AppKit)
{
"dependencies": {
"wagmi": "^2.0.0",
"viem": "^2.0.0",
"@tanstack/react-query": "^5.0.0"
}
}
Additional Resources
- wallet-connectors.md - Connector configuration reference
Weekly Installs
1
Repository
celo-org/agent-skillsGitHub Stars
6
First Seen
5 days ago
Security Audits
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1