--- name: thirdweb description: Use thirdweb SDK for Celo development. Includes wallet connection, contract deployment, and pre-built UI components. license: Apache-2.0 metadata: author: celo-org version: "1.0.0" --- # Thirdweb for Celo Thirdweb is a full-stack Web3 development platform with SDK support for Celo. Source: https://docs.celo.org/tooling/libraries-sdks/thirdweb-sdk/index.md ## When to Use - Building dApps with pre-built UI components - Deploying contracts without writing deployment scripts - Integrating 500+ wallet options - Building cross-chain applications ## Installation ```bash npm install thirdweb ``` Or create a new project: ```bash npx thirdweb create app ``` ## Client Setup ### Get Client ID 1. Go to https://thirdweb.com/team 2. Create a project with localhost in allowed domains 3. Copy the client ID ### Initialize Client ```typescript import { createThirdwebClient } from "thirdweb"; export const client = createThirdwebClient({ clientId: process.env.NEXT_PUBLIC_THIRDWEB_CLIENT_ID!, }); ``` For server-side usage: ```typescript const client = createThirdwebClient({ secretKey: process.env.THIRDWEB_SECRET_KEY!, }); ``` Source: https://portal.thirdweb.com/typescript/v5/getting-started ## Chain Configuration ### Using Predefined Chains ```typescript import { celo } from "thirdweb/chains"; // Use directly const chain = celo; ``` ### Custom Chain Definition ```typescript import { defineChain } from "thirdweb"; const celoChain = defineChain(42220); // Or with custom RPC const celoCustom = defineChain({ id: 42220, rpc: "https://forno.celo.org", }); ``` Source: https://portal.thirdweb.com/typescript/v5/chain ## React Provider Setup ```tsx import { ThirdwebProvider } from "thirdweb/react"; function App({ children }: { children: React.ReactNode }) { return ( {children} ); } ``` ## Wallet Connection ### ConnectButton Component ```tsx import { ConnectButton } from "thirdweb/react"; import { celo } from "thirdweb/chains"; import { client } from "./client"; function WalletConnect() { return ( ); } ``` ### With Specific Wallets ```tsx import { ConnectButton } from "thirdweb/react"; import { createWallet } from "thirdweb/wallets"; const wallets = [ createWallet("io.metamask"), createWallet("com.coinbase.wallet"), createWallet("app.valora"), ]; function WalletConnect() { return ( ); } ``` ## Contract Interaction ### Get Contract Reference ```typescript import { getContract } from "thirdweb"; import { celo } from "thirdweb/chains"; const contract = getContract({ client, chain: celo, address: "0x...", }); ``` ### Read Contract Data ```tsx import { useReadContract } from "thirdweb/react"; import { balanceOf } from "thirdweb/extensions/erc20"; function TokenBalance({ address }: { address: string }) { const { data, isLoading } = useReadContract( balanceOf, { contract, address, } ); if (isLoading) return
Loading...
; return
Balance: {data?.toString()}
; } ``` ### Write to Contract ```tsx import { useSendTransaction } from "thirdweb/react"; import { transfer } from "thirdweb/extensions/erc20"; function TransferTokens() { const { mutate: sendTransaction, isPending } = useSendTransaction(); async function handleTransfer() { const transaction = transfer({ contract, to: "0x...", amount: "10", }); sendTransaction(transaction); } return ( ); } ``` ## Account Hooks ### Get Active Account ```tsx import { useActiveAccount } from "thirdweb/react"; function Account() { const account = useActiveAccount(); if (!account) return
Not connected
; return
Connected: {account.address}
; } ``` ### Get Wallet Balance ```tsx import { useWalletBalance } from "thirdweb/react"; import { celo } from "thirdweb/chains"; function Balance() { const account = useActiveAccount(); const { data, isLoading } = useWalletBalance({ client, chain: celo, address: account?.address, }); if (isLoading) return
Loading...
; return
{data?.displayValue} {data?.symbol}
; } ``` ## Server-Side Usage ```typescript import { createThirdwebClient } from "thirdweb"; import { getContract } from "thirdweb"; import { celo } from "thirdweb/chains"; import { getNFTs } from "thirdweb/extensions/erc1155"; const client = createThirdwebClient({ secretKey: process.env.THIRDWEB_SECRET_KEY!, }); const contract = getContract({ client, chain: celo, address: "0x...", }); const nfts = await getNFTs({ contract }); ``` ## Pre-built Extensions Thirdweb provides type-safe extensions for common contracts: | Extension | Import Path | |-----------|-------------| | ERC20 | `thirdweb/extensions/erc20` | | ERC721 | `thirdweb/extensions/erc721` | | ERC1155 | `thirdweb/extensions/erc1155` | ## Deployment Deploy to decentralized storage: ```bash npx thirdweb deploy --app ``` ## Environment Variables ```bash # .env NEXT_PUBLIC_THIRDWEB_CLIENT_ID=your_client_id THIRDWEB_SECRET_KEY=your_secret_key # Server-side only ``` ## Dependencies ```json { "dependencies": { "thirdweb": "^5.0.0" } } ``` ## Additional Resources - [extensions.md](references/extensions.md) - Available contract extensions