From 21dfb7d593fea09e9fb22b83f90d13f6b8c5b8ce Mon Sep 17 00:00:00 2001 From: viral-sangani Date: Sat, 15 Nov 2025 15:37:15 +0100 Subject: [PATCH 1/5] Update AI resources and examples in the documentation - Replace references to Nebula with thirdweb AI in examples and resources. - Add new example for building with thirdweb AI. - Update various sections for clarity and consistency, including prerequisites and setup instructions. - Remove outdated Nebula example. - Improve formatting and organization of AI-related content across multiple files. --- .../build-with-goat/mint-nft-agent.mdx | 4 +- .../build-with-goat/send-token-agent.mdx | 27 +-- .../build-with-goat/token-swap-agent.mdx | 14 +- .../build-with-ai/examples/ai-memecoins.mdx | 59 ++++-- .../examples/build-with-nebula.mdx | 20 -- .../examples/build-with-thirdweb-ai.mdx | 76 ++++++++ .../examples/building_with_goat.mdx | 27 ++- build-on-celo/build-with-ai/mcp/celo-mcp.mdx | 28 +++ .../build-with-ai/mcp/composer-mcp.mdx | 56 +++++- build-on-celo/build-with-ai/mcp/index.mdx | 16 +- build-on-celo/build-with-ai/resources.mdx | 61 +++--- build-on-celo/build-with-ai/tools.mdx | 64 +++---- build-on-celo/fund-your-project.mdx | 29 ++- build-on-celo/nightfall.mdx | 28 ++- build-on-celo/quickstart.mdx | 173 ++++++++++++------ docs.json | 6 +- 16 files changed, 473 insertions(+), 215 deletions(-) delete mode 100644 build-on-celo/build-with-ai/examples/build-with-nebula.mdx create mode 100644 build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx diff --git a/build-on-celo/build-with-ai/build-with-goat/mint-nft-agent.mdx b/build-on-celo/build-with-ai/build-with-goat/mint-nft-agent.mdx index 9f9e9235f..bb6943d66 100644 --- a/build-on-celo/build-with-ai/build-with-goat/mint-nft-agent.mdx +++ b/build-on-celo/build-with-ai/build-with-goat/mint-nft-agent.mdx @@ -69,7 +69,7 @@ const tools = await getOnChainTools({ // This is a placeholder - actual minting logic needs to be implemented console.log( `Minting NFT to address: ${recipientAddress} with metadata:`, - metadata, + metadata ); return "NFT minting initiated (placeholder - not actually minted). Implement actual minting logic in the execute function."; }, @@ -177,7 +177,7 @@ RPC_PROVIDER_URL=https://forno.celo-sepolia.celo-testnet.org/ // ... inside the plugins array in getOnChainTools: { name: "mintNFT", - og:description: "...", + description: "...", async execute({ recipientAddress, metadata }) { try { // 1. NFT Contract Address and ABI: diff --git a/build-on-celo/build-with-ai/build-with-goat/send-token-agent.mdx b/build-on-celo/build-with-ai/build-with-goat/send-token-agent.mdx index 29c3c17e3..561da145b 100644 --- a/build-on-celo/build-with-ai/build-with-goat/send-token-agent.mdx +++ b/build-on-celo/build-with-ai/build-with-goat/send-token-agent.mdx @@ -145,48 +145,52 @@ Copy `.env.template` to `.env` and populate the following environment variables OPENAI_API_KEY=YOUR_OPENAI_API_KEY WALLET_PRIVATE_KEY=YOUR_PRIVATE_KEY RPC_PROVIDER_URL=https://forno.celo-sepolia.celo-testnet.org/ -OPENAI_API_KEY=YOUR_OPENAI_API_KEY -WALLET_PRIVATE_KEY=YOUR_PRIVATE_KEY -RPC_PROVIDER_URL=[https://forno.celo-sepolia.celo-testnet.org/](https://forno.celo-sepolia.celo-testnet.org/) ``` **Note:** We only need `OPENAI_API_KEY`, `WALLET_PRIVATE_KEY`, and `RPC_PROVIDER_URL` for this token sending agent. **3. Adapt Code for Celo Token Sending:** -1. **Chain Configuration:** In `index.ts`, replace `baseSepolia` with `celo` from `viem/chains`: +1. **Chain Configuration:** In `index.ts`, replace `baseSepolia` with `celoSepolia` from `viem/chains`: ```javascript - import { celoSepolia } from "viem/chains"; // Import Celo chain + import { celoSepolia } from "viem/chains"; // Import Celo Sepolia chain // ... const walletClient = createWalletClient({ account: account, transport: http(process.env.RPC_PROVIDER_URL), - chain: celo, // Use Celo chain configuration + chain: celoSepolia, // Use Celo Sepolia chain configuration for testnet }); ``` 2. **Adapt `sendETH()` to `sendCELO()`:** The `@goat-sdk/wallet-evm` might have a function specifically for sending CELO. Check the `@goat-sdk` documentation for `sendCELO()`. If it exists, replace `sendETH()` with `sendCELO()` in the `plugins` array: ```javascript + import { cUSD, CELO } from "@goat-sdk/plugin-erc20"; // Import Celo tokens + + // ... + plugins: [ - sendCELO(), // Enable CELO transfers (if available in @goat-sdk) - erc20({ tokens: [USDC, PEPE] }), // ERC20 token operations - Review tokens for Celo + sendETH(), // sendETH() is chain-aware and works with CELO on Celo network + erc20({ tokens: [cUSD, CELO] }), // Use Celo-specific tokens: cUSD, CELO // ... ]; ``` If `sendCELO()` is not directly available in `@goat-sdk/wallet-evm`, it's likely that `sendETH()` is designed to be chain-aware and will send the native token of the configured chain (`celo` in this case). In that case, you might not need to change `sendETH()`. **Test sending CELO after setup to confirm if `sendETH()` works for CELO or if you need to find an alternative.** If `sendETH()` does not work for CELO, you might need to create a custom tool using `viem`'s `sendTransaction` function to send CELO directly. -3. **Review ERC20 Tokens for Celo:** `USDC` and `PEPE` might not be ideal for Celo. Research popular ERC20 tokens on Celo Sepolia Testnet or Celo Mainnet (e.g., `cUSD`, `cEUR`, `USDT`, `DAI` on Celo). Update the `erc20` plugin configuration with relevant tokens: +3. **Use Celo-Specific Tokens:** Import and use Celo native tokens from `@goat-sdk/plugin-erc20`: ```javascript - erc20({ tokens: [cUSD, cEUR, USDT] }), // Example: Use cUSD, cEUR, USDT if relevant on Celo + import { cUSD, CELO } from "@goat-sdk/plugin-erc20"; + + // In plugins array: + erc20({ tokens: [cUSD, CELO] }), // Use Celo-specific tokens ``` - You might need to define or import configurations for `cUSD`, `cEUR`, `USDT` similar to `USDC` and `PEPE`, potentially using their token contract addresses on Celo. For a more generic approach, you can remove the `tokens` array to allow the agent to handle any ERC20 token specified by symbol or address in the prompt. + The `@goat-sdk/plugin-erc20` package includes pre-configured Celo tokens. For additional tokens, you can define custom token configurations or remove the `tokens` array to allow the agent to handle any ERC20 token specified by symbol or address in the prompt. **4. Usage Instructions:** @@ -229,4 +233,3 @@ Enter your prompt (or "exit" to quit): exit ### Conclusion This tutorial has guided you through building an AI-powered agent capable of sending tokens on the Celo Sepolia blockchain. By adapting the provided code, configuring for Celo Sepolia, and utilizing the `@goat-sdk/wallet-evm` and `@goat-sdk/plugin-erc20` tools, you can create an interactive agent that can understand natural language prompts to send both native CELO and ERC20 tokens. Remember to test thoroughly on the Celo Sepolia Testnet before using on Mainnet and always handle private keys securely. Explore the `@goat-sdk` documentation to understand more advanced configurations and error handling for your token sending agent on Celo! - diff --git a/build-on-celo/build-with-ai/build-with-goat/token-swap-agent.mdx b/build-on-celo/build-with-ai/build-with-goat/token-swap-agent.mdx index 462c7a939..4de90e1af 100644 --- a/build-on-celo/build-with-ai/build-with-goat/token-swap-agent.mdx +++ b/build-on-celo/build-with-ai/build-with-goat/token-swap-agent.mdx @@ -3,7 +3,6 @@ title: Build an AI-Powered Token Swap Agent on Celo Using GOAT SDK sidebarTitle: "Build a TokenSwap Agent" --- - This article provides a detailed guide on how to build an AI-powered token swap agent on the Celo blockchain using GOAT SDK. You'll learn how to create an interactive agent capable of performing token swaps through natural language prompts. ## Understanding GOAT SDK for Token Swapping @@ -179,12 +178,19 @@ Edit the `.env` file to include: ```plaintext OPENAI_API_KEY=your_openai_api_key WALLET_PRIVATE_KEY=your_wallet_private_key -RPC_PROVIDER_URL=https://forno.celo.org # Celo Mainnet -# or use https://forno.celo-sepolia.celo-testnet.org/ for Testnet +RPC_PROVIDER_URL=https://forno.celo-sepolia.celo-testnet.org/ # Celo Sepolia Testnet (recommended for testing) +# For mainnet: https://forno.celo.org UNISWAP_BASE_URL=provided_value # Will be populated from template UNISWAP_API_KEY=provided_value # Will be populated from template ``` +**Security Best Practices:** + +- Use a dedicated test wallet with minimal funds for development +- Never commit your `.env` file to version control +- Use environment variables for all sensitive data +- For production, use a dedicated RPC provider (Ankr, QuickNode, etc.) instead of public RPCs + For production use, you can get your own Uniswap API key from [Uniswap Hub](https://www.uniswap.org/developers). ### 5. Run the Interactive CLI @@ -234,4 +240,4 @@ When implementing token swap functionality on Celo, keep these additional consid By following this guide, you've learned how to create an AI-powered token swap agent on Celo using GOAT SDK. This agent can understand natural language commands and execute token swaps on your behalf, providing a seamless bridge between AI and blockchain functionality. -As Celo continues to grow as an ecosystem, these types of AI agents can significantly improve user experience by abstracting away the complexities of interacting with DeFi protocols and token swaps, making blockchain technology more accessible to everyone. \ No newline at end of file +As Celo continues to grow as an ecosystem, these types of AI agents can significantly improve user experience by abstracting away the complexities of interacting with DeFi protocols and token swaps, making blockchain technology more accessible to everyone. diff --git a/build-on-celo/build-with-ai/examples/ai-memecoins.mdx b/build-on-celo/build-with-ai/examples/ai-memecoins.mdx index 3ccfeef91..555a758cd 100644 --- a/build-on-celo/build-with-ai/examples/ai-memecoins.mdx +++ b/build-on-celo/build-with-ai/examples/ai-memecoins.mdx @@ -10,36 +10,47 @@ sidebarTitle: "Launch AI Agent Memecoins" ## Create a Wallet and get your Gaia API Keys -1. Visit the [Gaia Homepage](https://www.gaianet.ai/) and click **`Launch App`**. -2. Click **`Connect`**, then install the [MetaMask](https://metamask.io/download/) extension. -3. Once installed, create your wallet and securely store your recovery keys. +1. Visit the [Gaia Homepage](https://www.gaianet.ai/) and click **`Launch App`**. +2. Click **`Connect`**, then install the [MetaMask](https://metamask.io/download/) extension. +3. Once installed, create your wallet and securely store your recovery keys. 4. Finally, navigate to [Gaia API Keys](https://www.gaianet.ai/setting/gaia-api-keys) to generate your API keys. ## Create you Celo Private Key 1. Install the [Celo CLI](npm install -g @celo/celocli) 2. Make sure you're working on Celo Sepolia testnet + ``` celocli config:set --rpc-url https://forno.celo-sepolia.celo-testnet.org ``` -3. Create an account and store it well formatted in an .env file + +3. Create an account and store it well formatted in an .env file + ``` celocli account:new | sed -E 's/: (.+)/="\1"/g' | grep '=' > .env` source .env ``` + 4. Copy the account address to your clipboard + ``` echo $accountAddress | pbcopy ``` + 5. Head to the faucet to get some money and paste your account address there + ``` open https://faucet.celo.org/celo-sepolia ``` + 6. Verify you got money successfully + ``` celocli account:balance $accountAddress ``` + 7. Register your account + ``` celocli account:register --from $accountAddress -k $privateKey ``` @@ -49,24 +60,33 @@ If you open your **`.env`** file, you will find your **`Celo private key`** ## Clone the Celo Meme Token Generator 1. Clone this repository + ``` git clone https://github.com/harishkotra/celo-token-agent cd celo-token-agent ``` + 2. Install dependencies + ``` npm install ``` + 3. Create a .env file: + ``` -PRIVATE_KEY=your_celo_private_key +PRIVATE_KEY=your_celo_private_key GAIA_API_KEY=your_gaia_api_keys ``` + 4. Compile the contract + ``` npx hardhat compile ``` + 5. Deploy your token + ``` node deploy.js ``` @@ -83,18 +103,23 @@ The script will The project uses three main components 1. Token Generation **`(tokenGenerator.js)`** - - Generates creative token names - - Uses AI with a fallback to random generation - - Configures initial token supply + +- Generates creative token names +- Uses AI with a fallback to random generation +- Configures initial token supply + 2. Contract Deployment **`(tokenDeployer.sol)`** - - Uses viem to interact with Celo - - Handles gas estimation and transaction monitoring - - Provides deployment status updates + +- Uses viem to interact with Celo +- Handles gas estimation and transaction monitoring +- Provides deployment status updates + 3. Smart Contract **`(tokenDeployer.js)`** - - Standard ERC20 implementation - - Built with OpenZeppelin for security - - Deployable to Celo Sepolia testnet - + +- Standard ERC20 implementation +- Built with OpenZeppelin for security +- Deployable to Celo Sepolia testnet + ## Example response ``` @@ -112,10 +137,10 @@ Token deployed successfully! symbol: 'MG', address: '0x5e473F7650ABD9B6A5b28b2B0B64ebBd1ef01D94', transactionHash: '0x035457c46ef5118db065b0a2ccc6bae1ce62f1c8ef688bbaf2d2596a6dd0fbd8', - explorer: 'https://alfajores.celoscan.io/address/0x5e473F7650ABD9B6A5b28b2B0B64ebBd1ef01D94' + explorer: 'https://celoscan.io/address/0x5e473F7650ABD9B6A5b28b2B0B64ebBd1ef01D94' # For Celo Sepolia: https://sepolia.celoscan.io/address/YOUR_CONTRACT_ADDRESS } ``` ## Support -Join the [Celo Discord server](https://chat.celo.org). Reach out in the #general-dev channel with your questions and feedback. \ No newline at end of file +Join the [Celo Discord server](https://discord.com/invite/celo). Reach out in the #build-with-celo channel with your questions and feedback. diff --git a/build-on-celo/build-with-ai/examples/build-with-nebula.mdx b/build-on-celo/build-with-ai/examples/build-with-nebula.mdx deleted file mode 100644 index 3d070b9fe..000000000 --- a/build-on-celo/build-with-ai/examples/build-with-nebula.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: ERC20 Telegram Mini-app Token Deployer with Nebula -og:description: Learn how to use thirdweb's LLM Nebula to create a token deployer -sidebarTitle: "ERC-20 Token Deployer with Nebula" ---- - - -import {YouTube} from '/snippets/YouTube.jsx'; - -# What is thirdweb AI? - -Thirdweb AI, part of the developer suite build by [thirdweb](https://portal.thirdweb.com/), is a natural language model with improved blockchain reasoning, autonomous transaction capabilities, and real-time access to the blockchain. [Learn more about Nebula](https://blog.thirdweb.com/introducing-nebula-a-powerful-blockchain-model-to-read-write-and-reason-onchain/). - -Watch this workshop to learn more about Nebula and how to create a Telegram bot for app developers to access daily and weekly stats of the dApp. - - - -## Get started building - -Follow this [guide](https://github.com/thirdweb-example/erc20-token-deployer) to test out Nebula and build your own token deployer. diff --git a/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx b/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx new file mode 100644 index 000000000..96b36d4ed --- /dev/null +++ b/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx @@ -0,0 +1,76 @@ +# What is thirdweb AI? + + + **Migration Notice**: Nebula has been rebranded to **thirdweb AI**. The Nebula + app and API were deprecated on September 30, 2025. All functionality is now + available through the thirdweb AI dashboard and API. Please migrate to the new + endpoints and update your integrations. + + +Thirdweb AI (formerly Nebula) is a natural language model with improved blockchain reasoning, autonomous transaction capabilities, and real-time access to the blockchain. It provides a standard OpenAI-compatible chat completion API optimized for blockchain interactions. + +**Key Features:** + +- Query real-time data from the blockchain +- Analyze transactions +- Fetch token balances, prices and metadata +- Execute or prepare any contract call or transaction +- Execute or prepare swaps from/to any token pair +- Deploy contracts +- Generate images +- Search the web + +Watch this workshop to learn more about thirdweb AI and how to create a Telegram bot for app developers to access daily and weekly stats of the dApp. + + + +## Get started building + +### API Endpoint + +The thirdweb AI API endpoint is: + +``` +https://api.thirdweb.com/ai/chat +``` + +### Authentication + +Use your project's `secret_key` from the thirdweb dashboard for authenticated API calls: + +```javascript +fetch("https://api.thirdweb.com/ai/chat", { + method: "POST", + headers: { + "x-secret-key": "", + }, + body: { + messages: [ + { + role: "user", + content: "Send 0.01 ETH to vitalik.eth", + }, + ], + context: { + chain_ids: [8453], + from: "0x1234567890123456789012345678901234567890", + }, + stream: false, + }, +}); +``` + +### Example Projects + +- Follow this [guide](https://github.com/thirdweb-example/erc20-token-deployer) to test out thirdweb AI and build your own token deployer +- Check out the [thirdweb AI mini-app example](https://github.com/thirdweb-example/thirdweb-ai-mini-app) + +### Documentation + +- [thirdweb AI Documentation](https://portal.thirdweb.com/ai/chat) +- [API Reference](https://portal.thirdweb.com/reference#tag/ai/post/ai/chat) +- [Migration Guide](https://blog.thirdweb.com/changelog/nebula-is-now-thirdweb-ai/) + +## Support + +Join the [Celo Discord server](https://discord.com/invite/celo). Reach out in the #build-with-celo channel with your questions and feedback. diff --git a/build-on-celo/build-with-ai/examples/building_with_goat.mdx b/build-on-celo/build-with-ai/examples/building_with_goat.mdx index ddd08b6c0..aac0cc66a 100644 --- a/build-on-celo/build-with-ai/examples/building_with_goat.mdx +++ b/build-on-celo/build-with-ai/examples/building_with_goat.mdx @@ -11,9 +11,9 @@ This tutorial guides you through creating a Node.js application using TypeScript Before you begin, ensure you have the following: -- **Node.js (v16 or higher) and npm (or yarn) installed.** You can download Node.js from [https://nodejs.org/](https://nodejs.org/). +- **Node.js (v18 or higher) and npm (or yarn) installed.** You can download Node.js from [https://nodejs.org/](https://nodejs.org/). - **A Celo wallet with a private key.** You'll need a wallet with some CELO and cUSD for testing. _Never commit your private key to version control._ -- **An RPC provider URL for the Celo network.** We'll use [Forno](https://forno.celo.org/) in this example, which is a public provider. For production, consider using a dedicated RPC provider like [Ankr](https://www.ankr.com/), [QuickNode](https://www.quicknode.com/), or others. +- **An RPC provider URL for the Celo network.** For testing, use the Celo Sepolia testnet RPC: `https://forno.celo-sepolia.celo-testnet.org/`. For production, consider using a dedicated RPC provider like [Ankr](https://www.ankr.com/), [QuickNode](https://www.quicknode.com/), or others. - **An OpenAI API key.** GOAT utilizes OpenAI's language models. Obtain an API key from [https://platform.openai.com/](https://platform.openai.com/). - **A code editor or IDE.** VS Code, Sublime Text, or any other code editor will work. @@ -166,7 +166,7 @@ dotenv.config(); // --- Wallet Setup --- const account = privateKeyToAccount( - process.env.WALLET_PRIVATE_KEY as `0x${string}`, + process.env.WALLET_PRIVATE_KEY as `0x${string}` ); const walletClient = createWalletClient({ @@ -223,7 +223,8 @@ Create a `.env` file in the root of your project and add the following, replacin ```bash WALLET_PRIVATE_KEY=your_wallet_private_key -RPC_PROVIDER_URL=https://forno.celo.org # Or your preferred provider +RPC_PROVIDER_URL=https://forno.celo-sepolia.celo-testnet.org/ # Celo Sepolia Testnet (recommended for testing) +# For mainnet: https://forno.celo.org OPENAI_API_KEY=your_openai_api_key ``` @@ -231,10 +232,24 @@ Important Security Note: Never commit your `.env` file or your private key to ve ## Running the Application -Compile the TypeScript code: +Compile and run the TypeScript code: ```bash -pnpm dev +# Compile TypeScript +npx tsc + +# Run the compiled JavaScript +node dist/index.js +``` + +Or use a TypeScript runner: + +```bash +# Using ts-node +npx ts-node src/index.ts + +# Or using tsx +npx tsx src/index.ts ``` The application will start, and you'll see the prompt: `Enter your prompt (or "exit" to quit):`. You can now enter natural language commands. diff --git a/build-on-celo/build-with-ai/mcp/celo-mcp.mdx b/build-on-celo/build-with-ai/mcp/celo-mcp.mdx index e0e4c2603..22819b9e2 100644 --- a/build-on-celo/build-with-ai/mcp/celo-mcp.mdx +++ b/build-on-celo/build-with-ai/mcp/celo-mcp.mdx @@ -49,6 +49,26 @@ export CELO_TESTNET_RPC_URL="https://forno.celo-sepolia.celo-testnet.org/" # Ce ## MCP Client Integration +MCP is supported by a wide range of IDEs and development tools. Below are setup instructions for popular options: + +### VS Code Setup + +VS Code has native MCP support. Add the following configuration to your MCP settings: + +**macOS/Linux**: `~/.vscode/mcp.json` or via VS Code settings +**Windows**: `%APPDATA%\Code\User\mcp.json` + +```json +{ + "mcpServers": { + "celo-mcp": { + "command": "uvx", + "args": ["--refresh", "celo-mcp"] + } + } +} +``` + ### Cursor IDE Setup Add the following configuration to your MCP settings file (`~/.cursor/mcp.json`): @@ -66,6 +86,14 @@ Add the following configuration to your MCP settings file (`~/.cursor/mcp.json`) The `--refresh` flag ensures the latest code is always loaded when the MCP server starts. +### JetBrains IDEs Setup + +For IntelliJ IDEA, WebStorm, PyCharm, and other JetBrains IDEs, configure MCP through the IDE settings or via the JetBrains MCP Server plugin. + +### Windsurf Setup + +Windsurf has built-in MCP support. Configure MCP servers through the Windsurf settings interface. + ### Claude Desktop Setup For Claude Desktop, add this configuration to your MCP settings file: diff --git a/build-on-celo/build-with-ai/mcp/composer-mcp.mdx b/build-on-celo/build-with-ai/mcp/composer-mcp.mdx index 3458191ef..33ae89403 100644 --- a/build-on-celo/build-with-ai/mcp/composer-mcp.mdx +++ b/build-on-celo/build-with-ai/mcp/composer-mcp.mdx @@ -1,15 +1,8 @@ ---- -title: Composer Kit MCP Server ---- - -import {YouTube} from '/snippets/YouTube.jsx'; - The **Composer Kit MCP Server** is a Model Context Protocol (MCP) server that provides comprehensive access to Composer Kit UI components documentation, examples, and usage information. This powerful tool enables AI assistants and development environments to access the complete Composer Kit React component library designed for building web3 applications on the Celo blockchain. > Watch [this step-by-step vibe coding tutorial](https://www.youtube.com/watch?v=QOCO1G8cJyI) using the Celo Composer Kit MCP to create a token claim dApp in minutes! -> - + ## Key Features @@ -74,6 +67,37 @@ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | ie ## MCP Client Integration +MCP is supported by a wide range of IDEs and development tools. Below are setup instructions for popular options: + +### VS Code Setup + +VS Code has native MCP support: + +1. **Install the MCP server**: + + ```bash + pip install composer-kit-mcp + ``` + +2. **Configure VS Code** by adding the MCP server to your settings: + + - Open VS Code Settings (Cmd/Ctrl + ,) + - Search for "MCP" or navigate to MCP settings + - Add configuration: + + ```json + { + "mcpServers": { + "composer-kit-mcp": { + "command": "uvx", + "args": ["composer-kit-mcp"] + } + } + } + ``` + +3. **Restart VS Code** and verify setup + ### Cursor IDE Setup 1. **Install the MCP server** (if not already done): @@ -104,6 +128,22 @@ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | ie - "Show me how to use the Wallet component" - "Search for payment-related components" +### JetBrains IDEs Setup + +For IntelliJ IDEA, WebStorm, PyCharm, and other JetBrains IDEs: + +1. **Install the MCP server**: + + ```bash + pip install composer-kit-mcp + ``` + +2. **Configure through JetBrains MCP plugin** or IDE settings + +### Windsurf Setup + +Windsurf has built-in MCP support. Configure through Windsurf's settings interface. + ### Claude Desktop Setup 1. **Install the MCP server**: diff --git a/build-on-celo/build-with-ai/mcp/index.mdx b/build-on-celo/build-with-ai/mcp/index.mdx index ed2668616..dc3e78e91 100644 --- a/build-on-celo/build-with-ai/mcp/index.mdx +++ b/build-on-celo/build-with-ai/mcp/index.mdx @@ -1,12 +1,4 @@ ---- -title: Model Context Protocol (MCP) -og:description: Learn how to get started with MCP servers and implement the Model Context Protocol -sidebarTitle: "Intro to MCP Servers" ---- - -import {YouTube} from '/snippets/YouTube.jsx'; - -[The Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) is an open protocol that standardizes how applications provide context to Large Language Models (LLMs). It was developed by Anthropic, the AI company behind Claude, to solve the challenge of consistently and efficiently connecting AI models with various data sources and tools. This makes Claude natively compatible with all MPC servers. OpenAI has announced compatibility with the MCP standard, ensuring broad adoption across major AI platforms. +[The Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) is an open protocol that standardizes how applications provide context to Large Language Models (LLMs). It was developed by Anthropic, the AI company behind Claude, to solve the challenge of consistently and efficiently connecting AI models with various data sources and tools. MCP has become the industry standard for integrating AI tools and IDEs, with widespread adoption across major development environments including VS Code, Cursor, JetBrains IDEs, Windsurf, Zed, and many others. OpenAI has also adopted MCP across their Agents SDK and ChatGPT desktop app, ensuring broad compatibility across major AI platforms. ## Celo specific MCPs: @@ -18,7 +10,7 @@ import {YouTube} from '/snippets/YouTube.jsx'; - components - set up your project on Celo in minutes - + ## Why MCP? @@ -34,7 +26,7 @@ MCP follows a client-server architecture where a host application can connect to ### Components -- **MCP Hosts**: Programs like Claude Desktop, IDEs, or AI tools that want to access data through MCP +- **MCP Hosts**: Programs like Claude Desktop, IDEs (VS Code, Cursor, JetBrains, Windsurf, Zed, and more), or AI tools that want to access data through MCP - **MCP Clients**: Protocol clients that maintain 1:1 connections with servers - **MCP Servers**: Lightweight programs that each expose specific capabilities through the standardized Model Context Protocol - **Local Data Sources**: Your computer's files, databases, and services that MCP servers can securely access @@ -51,5 +43,3 @@ Explore existing MCP server implementations: - [Official MCP Documentation](https://modelcontextprotocol.io/introduction) - [MCP Community Forum](https://community.modelcontextprotocol.io) - - diff --git a/build-on-celo/build-with-ai/resources.mdx b/build-on-celo/build-with-ai/resources.mdx index 178b3a3e8..4e0bba930 100644 --- a/build-on-celo/build-with-ai/resources.mdx +++ b/build-on-celo/build-with-ai/resources.mdx @@ -4,7 +4,6 @@ og:description: Resources for learning how to craft intelligent, blockchain-powe sidebarTitle: "Resources" --- - Resources for learning how to craft intelligent, blockchain-powered agents on Celo. --- @@ -13,27 +12,35 @@ Resources for learning how to craft intelligent, blockchain-powered agents on Ce ### πŸ“ Tutorials -- [Machine Learning](https://www.coursera.org/specializations/machine-learning-introduction?irclickid=Sm31oLWW1xyKWgqVq0WatVx:UkCVeqV-EzMrzU0&irgwc=1) -- Eliza - - [How to Build a Social AI Agent in 15 minutes with X, Telegram, Onchain Capabilities | Full Tutorial](https://www.youtube.com/watch?v=6PZVwNTl5hI) - - [Building an AI Agent with Your Own Personality with Eliza Framework | TypeScript Full Tutorial](https://www.youtube.com/watch?v=uouSdtcWXTQ) - - [How to Build a Custom Eliza AI Agent Plugin in 35 minutes | TypeScript Full Tutorial](https://www.youtube.com/watch?v=25FxjscBHuo) - - [Eliza - AI Agent Dev School](https://www.youtube.com/playlist?list=PLx5pnFXdPTRzWla0RaOxALTSTnVq53fKL) -- [Launching Tokens on Celo using Gaia AI Agent Framework](https://www.youtube.com/watch?v=-7Bcgpj79LM) -- [Unlocking Web3 LLMs: Explore thirdweb AI on Celo](https://www.youtube.com/watch?v=FeubfHwfJcM) +- [Machine Learning](https://www.coursera.org/specializations/machine-learning-introduction) +- **Eliza Framework** + - [How to Build a Social AI Agent in 15 minutes with X, Telegram, Onchain Capabilities | Full Tutorial](https://www.youtube.com/watch?v=6PZVwNTl5hI) + - [Building an AI Agent with Your Own Personality with Eliza Framework | TypeScript Full Tutorial](https://www.youtube.com/watch?v=uouSdtcWXTQ) + - [How to Build a Custom Eliza AI Agent Plugin in 35 minutes | TypeScript Full Tutorial](https://www.youtube.com/watch?v=25FxjscBHuo) + - [Eliza - AI Agent Dev School](https://www.youtube.com/playlist?list=PLx5pnFXdPTRzWla0RaOxALTSTnVq53fKL) +- **GOAT SDK** + - [Build AI-Powered Token Swap Agent on Celo](/build-on-celo/build-with-ai/build-with-goat/token-swap-agent) + - [Build AI-Powered NFT Minting Agent on Celo](/build-on-celo/build-with-ai/build-with-goat/mint-nft-agent) + - [Build AI Agent to Send Tokens on Celo](/build-on-celo/build-with-ai/build-with-goat/send-token-agent) +- **Gaia Framework** + - [Launching Tokens on Celo using Gaia AI Agent Framework](https://www.youtube.com/watch?v=-7Bcgpj79LM) +- **thirdweb AI (formerly Nebula)** + - [Unlocking Web3 LLMs: Explore thirdweb AI on Celo](https://www.youtube.com/watch?v=FeubfHwfJcM) ### πŸŽ“ Courses - [Web3 AI Agents Guide](https://www.aiagenttoolkit.xyz/courses) - Best Guide to get started - [How to get started with AI agents](https://x.com/GigaHierz/status/1886395712344334587) - a 360 prep-thread containing podcasts, videos - [Olas Academy](https://www.youtube.com/playlist?list=PLXztsZv11CTfXiQK9OJhMwBkfgf4ETZkl) +- [CrewAI Documentation](https://docs.crewai.com/) - Comprehensive guide to building multi-agent systems +- [Vercel AI SDK Documentation](https://ai-sdk.dev/) - TypeScript-first toolkit for AI applications ### πŸ€– Famous Agents - Luna - Virtuals - - first agent to pay another agent for doing work + - first agent to pay another agent for doing work - [aixbt](https://x.com/aixbt_agent) - trading agent - - holds one of the biggest mindshare on crypto Twitter + - holds one of the biggest mindshare on crypto Twitter - [H4CK Terminal](https://x.com/h4ck_terminal)Β - first ever white-hat AI agent hunting vulnerabilities, securing funds & redistributing bounties - [Polytrader](https://x.com/polytraderAI) - [artto](https://x.com/artto_ai): Agent that collects NFTs @@ -42,55 +49,53 @@ Resources for learning how to craft intelligent, blockchain-powered agents on Ce - [opencordai](https://x.com/opencordai): A 24/7 AI agent for social media lead generation, identifying customers and engaging with them to drive sales. - [Infinite Regen](https://x.com/0xInfiniteregen): A platform for creating AI agents trained on Web3 insights to design mechanisms for funding public goods. - For a full comprehensive list, checkout the [AI Agent Demo Days](https://x.com/GigaHierz/status/1881401460082274395) hosted by Nader Dabit. ### πŸ’‘ Project Ideas + - [25+ AI Agent Product Ideas](https://x.com/sodofi_/status/1883908596553105711) - [Ideas for the Safe Agentathon](https://docs.google.com/document/d/1HSBfxkb5AWPZo6YDefDVjBrHVl-Nh4DQVElyLhy4y7A/edit?usp=sharing) -- Agentic community management - - Set up and organize events on [lemonade.social](http://lemonade.social) as mentioned in this [podcast](https://open.spotify.com/episode/40XcJxe9RfwtPIOq3KHy7s?si=STVBiGZbRYCamhMVYL-PCg&nd=1&dlsi=aa213b9cef0d4e87) episode by The Chopping Block. +- Agentic community management + - Set up and organize events on [lemonade.social](http://lemonade.social) as mentioned in this [podcast](https://open.spotify.com/episode/40XcJxe9RfwtPIOq3KHy7s?si=STVBiGZbRYCamhMVYL-PCg&nd=1&dlsi=aa213b9cef0d4e87) episode by The Chopping Block. - Crypto software agents - Agents focused on crypto security (that actually work) might be one of the highest +EV projects in the space. 24/7 security, patching ability, monitoring systems, etc. would totally change the narrative on how crypto is perceived. - Agent verifiability - - identity - - data - - models + - identity + - data + - models ### πŸ› οΈ Technical Resources - Starter Kit (including Lit + Gaia): https://github.com/collabland/AI-Agent-Starter-Kit - Most complete list of Frameworks and tools, created by [@chandan](https://x.com/chandan1_) - - [AIAgentToolkit.xyz](http://aiagenttoolkit.xyz/) + - [AIAgentToolkit.xyz](http://aiagenttoolkit.xyz/) - Celo - [Getting Started with AI Agents](/build/build-with-ai/overview) - [Mode Network Hackathon Starter Kit](https://www.notion.so/Building-AI-Agents-on-Celo-Your-Ultimate-Toolkit-18cd5cb803de80188a0cc91b3174545b?pvs=21) - [The AI Model Layer of Crypto](https://cryptopond.xyz/) - [12-Factor Agents - Principles for building reliable LLM applications](https://github.com/humanlayer/12-factor-agents) - ### πŸ“– Articles - [AI Real World Use Cases for ReFi](https://www.daviddao.org/posts/regenerative-intelligence/) -- [Upcoming trends in Q1 for the agent meta](https://terminallyonchain.xyz/q1trends) -- [Allora Powers Virtuals](https://www.allora.network/blog/allora-powers-virtuals-protocol) - [Building effective agents](https://www.anthropic.com/research/building-effective-agents) +- [Microsoft AutoGen: Multi-Agent AI Systems](https://www.microsoft.com/en-us/research/project/autogen/) - Enterprise-grade agent framework +- [OpenAgents: Decentralized AI Agent Networks](https://openagents.org) - Open-source framework for large-scale agent systems ### πŸŽ™οΈ Podcasts - Learn about the history of the first viral AI Agent with a token: The Truth Terminal - - [Bankless: How Crypto Al Agents Will Take Over the World | Ejaaz Ahamadeen](https://open.spotify.com/episode/5jVhVuzb5HNZdZz11b1cc1?si=bZPfHf1PRtmjzVQXrbS2CA&context=spotify%3Aplaylist%3A37i9dQZF1FgnTBfUlzkeKt) + - [Bankless: How Crypto Al Agents Will Take Over the World | Ejaaz Ahamadeen](https://open.spotify.com/episode/5jVhVuzb5HNZdZz11b1cc1?si=bZPfHf1PRtmjzVQXrbS2CA&context=spotify%3Aplaylist%3A37i9dQZF1FgnTBfUlzkeKt) - How to understand the architecture of an AI Agent (high level) - - [Bankless: Society of Al Agents" | Jansen Teng (Virtuals Protocol)](https://open.spotify.com/episode/4kMubklNG3xBMYR0mWijNy?si=Ua1VXf3QToajv21QZcGZgw&context=spotify%3Aplaylist%3A37i9dQZF1FgnTBfUlzkeKt) + - [Bankless: Society of Al Agents" | Jansen Teng (Virtuals Protocol)](https://open.spotify.com/episode/4kMubklNG3xBMYR0mWijNy?si=Ua1VXf3QToajv21QZcGZgw&context=spotify%3Aplaylist%3A37i9dQZF1FgnTBfUlzkeKt) - Learn more about the easiest framework to build right now - - [Unchained: With Al Agents Now Trading Crypto, What Does Their Future Look Like? - Ep. 758](https://open.spotify.com/episode/5UDhqnOziBkcfaQ55ZJ7Bg?si=U9SPC8K9TmKmmfNVkWecEQ) + - [Unchained: With Al Agents Now Trading Crypto, What Does Their Future Look Like? - Ep. 758](https://open.spotify.com/episode/5UDhqnOziBkcfaQ55ZJ7Bg?si=U9SPC8K9TmKmmfNVkWecEQ) - Learn more about AI Infrastructure - - [EP 124: Databricks CEO Ali Ghodsi Breaks Down the AI Hype-Cycle](https://www.notion.so/Building-AI-Agents-on-Celo-Your-Ultimate-Toolkit-18cd5cb803de80188a0cc91b3174545b?pvs=21) + - [EP 124: Databricks CEO Ali Ghodsi Breaks Down the AI Hype-Cycle](https://www.notion.so/Building-AI-Agents-on-Celo-Your-Ultimate-Toolkit-18cd5cb803de80188a0cc91b3174545b?pvs=21) - Predictions for the industry - - [AI + a16z](https://podcasts.apple.com/in/podcast/ai-a16z/id1740178076) - + - [AI + a16z](https://podcasts.apple.com/in/podcast/ai-a16z/id1740178076) ### πŸ† Start Building Now - [Proof of Ship](https://celoplatform.notion.site/Proof-of-Ship-17cd5cb803de8060ba10d22a72b549f8) - a monthly contest where AI Agents track contributions on Celo and distribute rewards to builders. -Have another resource you want to add? Click the ['Edit this page'](https://github.com/celo-org/docs/edit/main/docs/build/build-with-ai/usecases.md) button below to submit a PR. \ No newline at end of file +Have another resource you want to add? Click the ['Edit this page'](https://github.com/celo-org/docs/edit/main/build-on-celo/build-with-ai/resources.mdx) button below to submit a PR. diff --git a/build-on-celo/build-with-ai/tools.mdx b/build-on-celo/build-with-ai/tools.mdx index 6559e8a11..ae15a85c3 100644 --- a/build-on-celo/build-with-ai/tools.mdx +++ b/build-on-celo/build-with-ai/tools.mdx @@ -6,30 +6,35 @@ sidebarTitle: "Tools & Infra" This article provides an overview of essential tools for building AI agents. Given the rapid advancements in this space, this is not an exhaustive list but rather a snapshot of tools available on Celo. -## AI Agent Frameworks +## AI Agent Frameworks Frameworks define how AI agents interact, collaborate, and execute tasks. For a full list of frameworks, tools, and infrastructure, check out this [comprehensive table](https://www.aiagenttoolkit.xyz/). **On Celo:** -- [**Olas**](https://docs.autonolas.network/open-autonomy/): Framework for autonomous economic agents in decentralized markets. - - [Implement MECH client into your dApp](https://www.youtube.com/watch?v=fuDteQqsf2A) - - [Celo Trader Agent](https://www.youtube.com/watch?v=WSB0H0dDc78&t=1740s) - - can do transfers (for advanced Python developers) -- [**Gaia**](https://www.gaianet.ai/): Building intelligent ecosystems for evolving AI applications - - Meme Token Generator - an AI Agent that autonomously deploys tokens on Celo. - - [Twitter Thread](https://github.com/harishkotra/celo-token-agent) - short intro - - [Video Tutorial](https://www.youtube.com/watch?v=-7Bcgpj79LM) - - [Example Repository](https://github.com/harishkotra/celo-token-agent/) - - [EternalAI](https://eternalai.org/): A Decentralized Autonomous Agent protocol running AI agents on Solidity smart contracts β€” exactly as programmed β€” without censorship, interference, or downtime. - - [GT Protocol](https://www.gt-protocol.io/): AI Agents Builder, powered by GT Protocol AI Executive Technology, delivers customized AI agents tailored to enhance both business operations and personal daily tasks. - - [**ElizaOS**](https://elizaos.github.io/eliza/): TypeScript-based framework with multi-agent simulation capabilities. +- [**Olas**](https://docs.autonolas.network/open-autonomy/): Framework for autonomous economic agents in decentralized markets. + - [Implement MECH client into your dApp](https://www.youtube.com/watch?v=fuDteQqsf2A) + - [Celo Trader Agent](https://www.youtube.com/watch?v=WSB0H0dDc78&t=1740s) + - can do transfers (for advanced Python developers) +- [**Gaia**](https://www.gaianet.ai/): Building intelligent ecosystems for evolving AI applications + - Meme Token Generator - an AI Agent that autonomously deploys tokens on Celo. + - [Twitter Thread](https://github.com/harishkotra/celo-token-agent) - short intro + - [Video Tutorial](https://www.youtube.com/watch?v=-7Bcgpj79LM) + - [Example Repository](https://github.com/harishkotra/celo-token-agent/) +- [EternalAI](https://eternalai.org/): A Decentralized Autonomous Agent protocol running AI agents on Solidity smart contracts β€” exactly as programmed β€” without censorship, interference, or downtime. +- [GT Protocol](https://www.gt-protocol.io/): AI Agents Builder, powered by GT Protocol AI Executive Technology, delivers customized AI agents tailored to enhance both business operations and personal daily tasks. +- [**ElizaOS**](https://elizaos.github.io/eliza/): TypeScript-based framework with multi-agent simulation capabilities. **Other:** + - [**LangChain**](https://www.langchain.com/): Framework for LLM-powered applications. - [**MetaGPT**](https://github.com/geekan/MetaGPT): Multi-agent meta programming framework, mimicks organizational roles at a software company. +- [**OpenAgents**](https://openagents.org): Open-source framework for building large-scale networks of AI agents. Focus on interoperability, decentralized collaboration, and payment flows. Best for scalable cross-domain agent systems, fintech, and collaborative tasks. +- [**CrewAI**](https://www.crewai.com): Python framework for orchestrating multiple AI agents as teams. Features role-based architecture, memory management, and workflow automation. Best for business process automation, research, and content analysis. +- [**Microsoft AutoGen**](https://www.microsoft.com/en-us/research/project/autogen/): Multi-agent AI systems with autonomous and human-in-the-loop collaboration. Features asynchronous messaging, MCP protocol support, and observability. Best for enterprise automation, software development, and data analysis. +- [**Vercel AI SDK (ai-sdk)**](https://ai-sdk.dev/): TypeScript-first toolkit for AI-powered applications. Provides unified interface for multiple LLM providers and agent abstraction. Best for web applications, Next.js/React apps, and production-ready AI integration. -## Launchpads +## Launchpads No-code platforms simplify AI agent deployment, making it easier to integrate social agents with tokens. @@ -38,9 +43,10 @@ No-code platforms simplify AI agent deployment, making it easier to integrate so ## Essential Tools -A variety of tools are available for building autonomous agents, including blockchain integration, machine learning, memory systems, simulation, monitoring, and security. +A variety of tools are available for building autonomous agents, including blockchain integration, machine learning, memory systems, simulation, monitoring, and security. For a quick start, focus on: + - Blockchain tools for onchain operations. - Memory systems for learning and adapting. - LLMs optimized for Web3 data. @@ -52,61 +58,57 @@ When scaling, consider: - Support for videos, PDFs, and research papers. - Effective use of LLMs, NLP, and RAG tools. -## Intelligence Tools +## Intelligence Tools **Machine Learning Tools:** + - **Purpose**: Training, deploying, debugging and managing ML models - **Examples**: LiteLLM, ModelZoo, TensorServe, GPT-Explorer - **Use Cases**: Pattern recognition, classification, prediction **Natural Language Processing Tools:** + - **Purpose**: Language understanding and processing - **Examples**: NeuralSpace, LangFlow - **Use Cases**: Text analysis, grammar checking, entity recognition **Retrieval Augmented Generation Tools:** + - **Purpose**: Combining LLMs with knowledge bases - **Examples**: Autonomous RAG, Agentic RAG, Local RAG Agent - **Use Cases**: Enhanced chatbots, documentation search, context-aware responses -## Infrastructure +## Infrastructure **Blockchain Tools:** + - **[GOAT](https://ohmygoat.dev/introduction)**: GOAT 🐐 (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain capabilities like wallets and smart contracts to AI agents. -- **[thirdweb AI](https://portal.thirdweb.com/ai/chat?utm_source=celo&utm_medium=documentation&utm_campaign=chain_docs)**: Web3 LLM by thirdweb +- **[thirdweb AI](https://portal.thirdweb.com/ai/chat?utm_source=celo&utm_medium=documentation&utm_campaign=chain_docs)**: Web3 LLM by thirdweb (formerly Nebula). Natural language model optimized for blockchain interactions with autonomous transaction capabilities. - [Tutorial](https://www.youtube.com/watch?v=FeubfHwfJcM) - - [Example Respository](https://github.com/cromewar/nebula-telegram-demo) -- **[Kaito](https://www.kaito.ai/)**: Unified crypto news data. -- **[GOAT](https://ohmygoat.dev/introduction)**: GOAT 🐐 (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain capabilities like wallets and smart contracts to AI agents. + - [Example Repository](https://github.com/thirdweb-example/thirdweb-ai-mini-app) + - [Documentation](https://portal.thirdweb.com/ai/chat) - **[ChainGPT](https://www.chaingpt.org/)**: Is an advanced AI infrastructure that develops AI-powered technologies for the Web3, Blockchain, and Crypto space, developing solutions from Chatbots, NFT, Smart Contract Generators and AI Trading Assistants - [EigenLayer](https://www.eigenlayer.xyz/): Autonomous Verifiable Service (AVS) on EigenLayer is a decentralized service built on Ethereum that provides custom verification mechanisms of off-chain operations. -- **[thirdweb AI](https://portal.thirdweb.com/ai/chat?utm_source=celo&utm_medium=documentation&utm_campaign=chain_docs)**: Web3 LLM by thirdweb - - [Tutorial](https://www.youtube.com/watch?v=1UcwKMt-izc&t=23s) - - [Example Respository](https://github.com/thirdweb-example/thirdweb-ai-mini-app) - [Safe](https://safe.global/safenet): Smart Accounts for Agents - **[Kaito](https://www.kaito.ai/)**: Unified crypto news data. **Memory Systems:** -- **[Mem0](https://github.com/mem0ai/mem0)**: Intelligent memory layer for AI assistants. -- **[Eliza Agent Memory](https://github.com/elizaOS/agentmemory)**: Knowledge graphing and document search. + - **[Mem0](https://github.com/mem0ai/mem0)**: Intelligent memory layer for AI assistants. - **[Eliza Agent Memory](https://github.com/elizaOS/agentmemory)**: Knowledge graphing and document search. - **Security and Policy:** + - **[Predicate](https://x.com/0xPredicate)**: Define rules for onchain interactions - **[Functor Network](https://www.functor.sh/)**: Policy framework for autonomous agents - **Access Controls**: Environmental permissions - **[Langfuse](https://langfuse.com/) - Prompt Verification**: Traces, evals, prompt management and metrics to debug and improve your LLM application. - **[LiteLLM](https://www.litellm.ai/#features) - LLM Access**: Manage LLM access for your developer - - **Data:** When working with AI agents, it's essential to train models and collect the right data. For unique character creation, ensure you have sufficient training data. Some useful tools include: + - **[DataSphere](https://github.com/datasphere/datasphere)**: Visualizes large datasets for analysis. - **[JinAI's LLM-friendly Markdown Tool](https://github.com/jina-ai/serve)**: Converts websites into LLM-friendly markdown. - **[Masa](https://www.masa.ai/)**: The #1 real-time data network for AI Agents & Apps - **[Vana](https://www.vana.org/)**: The first open protocol for data sovereignty. User-owned AI through user-owned data. Growing the DataDAO ecosystem. -- **[DataSphere](https://github.com/datasphere/datasphere)**: Visualizes large datasets for analysis. -- **[JinAI's LLM-friendly Markdown Tool](https://github.com/jina-ai/serve)**: Converts websites into LLM-friendly markdown. \ No newline at end of file diff --git a/build-on-celo/fund-your-project.mdx b/build-on-celo/fund-your-project.mdx index b1f6c8314..73617847a 100644 --- a/build-on-celo/fund-your-project.mdx +++ b/build-on-celo/fund-your-project.mdx @@ -3,7 +3,6 @@ title: Fund your Project og:description: Learn how to get funding for your project on Celo --- - Discover funding opportunities in the Celo ecosystem. --- @@ -17,34 +16,34 @@ Explore these opportunities to maximize your funding potential. Establishing a strong onchain reputation increases your chances of securing retroactive funding. Here’s how you can get started: - - 1. **Create a project profile on [Karma GAP](https://docs.gap.karmahq.xyz/how-to-guides/integrations/celo-proof-of-ship)**: Build credibility by showcasing your contributions and activity. - 1. **Apply for monthly rewards with [Proof of Ship](https://celo-devs.beehiiv.com/subscribe)** Demonstrate consistent progress for automated retroactive rewards. +1. **Create a project profile on [Karma GAP](https://docs.gap.karmahq.xyz/how-to-guides/integrations/celo-proof-of-ship)**: Build credibility by showcasing your contributions and activity. + +1. **Apply for monthly rewards with [Proof of Ship](https://celo-devs.beehiiv.com/subscribe)** Demonstrate consistent progress for automated retroactive rewards. ## Apply for Grant Opportunities There are various grant opportunities for builders in the Celo ecosystem, with funding available at different stages of your project. To maximize your chances of receiving rewards, include your Karma GAP project profile when applying. - 1. **[Prezenti Grants](https://www.prezenti.xyz/)** +1. **[Prezenti Grants](https://www.prezenti.xyz/)** - 2. **[Celo Support Streams](https://www.celopg.eco/programs)**: Submit your Support Stream application and earn bi-weekly CELO incentive budgets +2. **[Celo Support Streams](https://www.celopg.eco/programs)**: Submit your Support Stream application and earn bi-weekly CELO incentive budgets - 3. **[CPG Retroactive Funding](https://www.celopg.eco/programs)** +3. **[CPG Retroactive Funding](https://www.celopg.eco/programs)** ## Ecosystem-Led Funding Opportunities Expand your funding sources with ecosystem partner initiatives. - 1. **[Proof of Impact](https://www.divvi.xyz/)**: Automate gas fee revenue splits to fund your app. +1. **[Proof of Impact](https://www.divvi.xyz/)**: Automate gas fee revenue splits to fund your app. - 2. [Builder Rewards - Celo PG x Talent Protocol](https://www.celopg.eco/programs) - 10.000 CELO/ month +2. [Builder Rewards - Celo PG x Talent Protocol](https://www.celopg.eco/programs) - 10.000 CELO/ month - 3. **[Commons Builder Income](https://www.commonsprotocol.xyz/)**: Apply for CBI and earn daily rewards +3. **[Commons Builder Income](https://www.commonsprotocol.xyz/)**: Apply for CBI and earn daily rewards - 4. **[GoodBuilders Program](https://gooddollar.notion.site/GoodBuilders-Program-1a6f258232f080fea8a6e3760bb8f53d)**: A year-long initiative offering \$220k in rewards for building with G$. +4. **[GoodBuilders Program](https://gooddollar.notion.site/GoodBuilders-Program-1a6f258232f080fea8a6e3760bb8f53d)**: A year-long initiative offering \$220k in rewards for building with G$. - 5. **[Glo Dollar Liquidity Flywheel](https://www.glodollar.org/articles/glo-dollar-and-celo-public-goods)**: Around $40,000 will be donated to Celo Public Goods, thanks to a $1M Glo Dollar (USDGLO) holding from Mento. Projects that increase Glo Dollar liquidity will receive more funding. +5. **[Glo Dollar Liquidity Flywheel](https://www.glodollar.org/articles/glo-dollar-and-celo-public-goods)**: Around $40,000 will be donated to Celo Public Goods, thanks to a $1M Glo Dollar (USDGLO) holding from Mento. Projects that increase Glo Dollar liquidity will receive more funding. ## Accelerators/ Incubators @@ -54,10 +53,10 @@ Expand your funding sources with ecosystem partner initiatives. ## Funds - 1. **[Verda Ventures](https://verda.ventures/)**: Building for MiniPay & raising funding? Reach out to [team@verda.ventures](mailto:team@verda.ventures) with a deck and product demo. +1. **[Verda Ventures](https://verda.ventures/)**: Building for MiniPay & raising funding? Reach out to [team@verda.ventures](mailto:team@verda.ventures) with a deck and product demo. -If you want to add another ecosystem-led funding program, [edit this page](https://github.com/celo-org/docs/edit/main/docs/build/fund-your-project.md) to include it. +If you want to add another ecosystem-led funding program, [edit this page](https://github.com/celo-org/docs/edit/main/build-on-celo/fund-your-project.mdx) to include it. ## Get Funding Updates -Stay up to date with the latest funding opportunities by [joining our newsletter](https://embeds.beehiiv.com/eeadfef4-2f0c-45ce-801c-b920827d5cd2). \ No newline at end of file +Stay up to date with the latest funding opportunities by [joining our newsletter](https://embeds.beehiiv.com/eeadfef4-2f0c-45ce-801c-b920827d5cd2). diff --git a/build-on-celo/nightfall.mdx b/build-on-celo/nightfall.mdx index 343766165..ccb751287 100644 --- a/build-on-celo/nightfall.mdx +++ b/build-on-celo/nightfall.mdx @@ -13,9 +13,10 @@ Celo is the **first payments-focused blockchain** to deploy Nightfall, combining **Testnet Status**: Live and ready for testing -Nightfall testnet is currently active on Celo mainnet for developers and enterprises to build and test private payment applications. +Nightfall testnet is currently active on Celo testnet for developers and enterprises to build and test private payment applications. **Full API documentation** is available in the [Nightfall GitHub docs](https://github.com/EYBlockchain/nightfall_4_CE/blob/master/doc/nf_4.md#apis). + ## What is Nightfall? @@ -30,17 +31,20 @@ Nightfall uses **zero-knowledge rollup (ZK-ZK rollup)** technology to batch priv ## Key Features ### Privacy Technology + - **Zero-Knowledge Proofs**: Cryptographic privacy without trusted intermediaries - **Layer 3 Architecture**: Runs on top of Celo L2 for maximum efficiency - **Enterprise Access Control**: X509 certificate-based authentication ### Token Support + - **ERC-20**: Stablecoins (USDT, USDC) and other fungible tokens - **ERC-721**: Non-fungible tokens (NFTs) - **ERC-1155**: Multi-token standard - **ERC-3525**: Semi-fungible tokens ### Performance + - **Low Gas Costs**: ~6000 Gas per private transfer - **Fast Finality**: Cryptographic finality matching Celo's block time - **Scalability**: Transaction batching for efficient throughput @@ -50,19 +54,25 @@ Nightfall uses **zero-knowledge rollup (ZK-ZK rollup)** technology to batch priv Nightfall operates with three main components: ### Client + The user-facing application that enables users to make private transactions. Clients interact with proposers and manage: + - Deposits (converting public tokens to private commitments) - Transfers (private peer-to-peer transactions) - Withdrawals (converting private commitments back to public tokens) ### Proposer + Network nodes that create Layer 2 blocks by batching transactions and generating zero-knowledge proofs. Proposers: + - Collect transactions from clients - Generate ZK proofs for transaction validity - Submit blocks to on-chain smart contracts ### Smart Contracts + On-chain contracts that handle: + - Token escrow for deposits and withdrawals - ZK proof verification - X509 certificate validation for access control @@ -70,18 +80,23 @@ On-chain contracts that handle: ## Use Cases ### Private B2B Payments + Enable confidential business-to-business transactions while maintaining an auditable record for compliance. Ideal for: + - Invoice settlements - Vendor payments - Intercompany transfers ### Supply Chain Finance + Process payments across supply chain partners with privacy, reducing transaction costs and eliminating intermediaries. ### Enterprise Treasury Management + Manage corporate funds with confidentiality for strategic transactions, mergers, acquisitions, and sensitive operations. ### Cross-Border Payments + Leverage Celo's global reach and low fees with added privacy for international B2B flows, particularly valuable in emerging markets. ## Getting Started @@ -98,19 +113,25 @@ To integrate Nightfall, you'll need: ### Transaction Flow #### Deposits + Convert public tokens on Celo into private commitments on Nightfall: + ``` Public Celo Token β†’ Nightfall Smart Contract (escrow) β†’ Private Commitment ``` #### Transfers + Send private transactions between Nightfall users: + ``` Private Commitment (sender) β†’ ZK Proof β†’ Private Commitment (receiver) ``` #### Withdrawals + Convert private commitments back to public tokens: + ``` Private Commitment β†’ ZK Proof β†’ Nightfall Smart Contract β†’ Public Celo Token ``` @@ -126,11 +147,13 @@ Private Commitment β†’ ZK Proof β†’ Nightfall Smart Contract β†’ Public Celo Tok ## Resources ### Documentation + - **[Nightfall GitHub Repository](https://github.com/EYBlockchain/nightfall_4_CE)**: Full source code and implementation - **[Technical Documentation](https://github.com/EYBlockchain/nightfall_4_CE/blob/master/doc/nf_4.md)**: Comprehensive guide including architecture, APIs, deployment, and testing - **[EY Blockchain](https://blockchain.ey.com/)**: Learn more about EY's blockchain solutions ### APIs + - **Client APIs**: Deposit, transfer, withdraw, and balance query endpoints - **Proposer APIs**: Block submission and transaction validation - **Webhook Support**: Real-time transaction notifications @@ -138,6 +161,7 @@ Private Commitment β†’ ZK Proof β†’ Nightfall Smart Contract β†’ Public Celo Tok Full API documentation is available in the [Nightfall GitHub docs](https://github.com/EYBlockchain/nightfall_4_CE/blob/master/doc/nf_4.md#apis). ### Testing & Deployment + - **Local Testing**: Instructions for running Nightfall locally with Docker - **Testnet Deployment**: Guide for deploying on Celo testnet - **Production Deployment**: Best practices for mainnet deployment @@ -145,6 +169,7 @@ Full API documentation is available in the [Nightfall GitHub docs](https://githu ### Community & Support Get help and connect with the community: + - **[Celo Discord](https://chat.celo.org)**: Join the #nightfall channel for questions - **[Celo Forum](https://forum.celo.org)**: Discuss integration strategies and use cases - **[GitHub Issues](https://github.com/EYBlockchain/nightfall_4_CE/issues)**: Report bugs or request features @@ -162,6 +187,7 @@ By deploying on Celo, Nightfall brings enterprise-grade privacy to a mobile-firs **Testnet Environment** Nightfall testnet is for development and testing purposes only. Do not use real assets, production data, or sensitive information during testing. Testnet tokens hold no real-world economic value. + --- diff --git a/build-on-celo/quickstart.mdx b/build-on-celo/quickstart.mdx index 0384588f0..00eb050ea 100644 --- a/build-on-celo/quickstart.mdx +++ b/build-on-celo/quickstart.mdx @@ -3,119 +3,184 @@ title: Quickstart sidebarTitle: Quickstart with Celo Composer --- -To test out deploying a dApp on Celo, we recommend using [Celo Composer](https://github.com/celo-org/celo-composer), which allows you to quickly build, deploy, and iterate on decentralized applications using Celo. It provides a number of frameworks, examples, templates and Celo specific functionality to help you get started with your next dApp. +A powerful CLI tool for generating customizable Celo blockchain starter kits with modern monorepo architecture. ## Prerequisites -- Node (v20 or higher) -- Git (v2.38 or higher) +- Node.js >= 18.0.0 +- PNPM (recommended) or npm/yarn -## How to use Celo Composer +## Quick Start -The easiest way to start with Celo Composer is using `@celo/celo-composer`. This CLI tool lets you quickly start building dApps on Celo for multiple frameworks, including React (and rainbowkit). To get started, just run the following command, and follow the steps: +Create a new Celo project in seconds: ```bash npx @celo/celo-composer@latest create ``` -### Provide the Project Name: +This will start an interactive setup process where you can choose your template, wallet provider, and smart contract framework. -You will be prompted to enter the name of your project +## Installation + +No installation required! Use `npx` to run Celo Composer directly without installing anything globally. + +## Usage + +### Interactive Mode + +Run the command without any flags to enter interactive mode: ```bash -What is your project name: +npx @celo/celo-composer@latest create my-celo-app ``` -### Choose a smart contract development environment: +The CLI will guide you through: -You will be asked if you want to use Hardhat. Select Yes or No +- Project name and description +- Template selection +- Wallet provider choice +- Smart contract framework selection +- Dependency installation + +### Non-Interactive Mode + +Create a project with specific configurations using flags: ```bash -Do you want to use Hardhat? (Y/n) +npx @celo/celo-composer@latest create my-celo-app \ + --template basic \ + --wallet-provider rainbowkit \ + --contracts hardhat \ + --description "My awesome Celo app" ``` -### Choose to Use a Pre-Built Template, highlighting Celo's unique features: +### Quick Start with Defaults -You will be asked if you want to use a [template](#supported-templates), check [below](#supported-templates) for the options. Select Yes or No +Skip all prompts and use default settings. This will create a basic app with no additional setup: ```bash -Do you want to use a template? +npx @celo/celo-composer@latest create my-celo-app --yes ``` -### Select a Template: +## Available Templates + +### Basic Web App (default) -If you chose to use a template, you will be prompted to select a template from the list provided +A standard Next.js 14+ web application with modern UI, perfect for most dApp projects. ```bash -# built in frontend logic to use your dapp in MiniPay, pre-built example functions for sign, transact and mint -- MiniPay -# template built for easy Valora connectivity -- Valora +npx @celo/celo-composer@latest create --template basic ``` -### Provide the Project Owner's Name: +### Farcaster Miniapp -You will be asked to enter the project owner's name +A specialized template for building Farcaster Miniapps with Farcaster SDK and Frame development support. ```bash -Project Owner name: +npx @celo/celo-composer@latest create --template farcaster-miniapp ``` -### Wait for Project Creation: +### Minipay App -The CLI will now create the project based on your inputs. This may take a few minutes. +Optimized for building dApps that integrate with the Minipay mobile wallet, with mobile-first design. -### Follow the instructions to start the project. +```bash +npx @celo/celo-composer@latest create --template minipay +``` + +Checkout [minipay docs](/build/build-on-minipay/overview) to learn more about it. -The same will be displayed on the console after the project is created +### AI Chat App + +A standalone Next.js AI chat application template. ```bash -πŸš€ Your starter project has been successfully created! +npx @celo/celo-composer@latest create --template ai-chat +``` -Before you start the project, please follow these steps: +## Wallet Providers -1. Rename the file: - packages/react-app/.env.template - to - packages/react-app/.env +Choose a wallet provider to handle user authentication and transaction signing: -2. Open the newly renamed .env file and add all the required environment variables. +- **RainbowKit** (default): Popular, easy-to-use wallet connector for React apps +- **Thirdweb**: Complete Web3 development framework with powerful wallet tools +- **None**: Skip wallet integration if you want to integrate your own solution -Once you've done that, you're all set to start your project! +```bash +npx @celo/celo-composer@latest create --wallet-provider rainbowkit +``` + +## Smart Contract Frameworks -Run the following commands from the packages/react-app folder to start the project: +Set up a smart contract development environment: - yarn install - yarn dev +- **Hardhat** (default): Popular Ethereum development environment +- **Foundry**: Fast, portable and modular toolkit for Ethereum application development +- **None**: Skip smart contract development setup -If you prefer npm, you can run: +```bash +npx @celo/celo-composer@latest create --contracts hardhat +``` - npm install - npm run dev +## Command Options -Thank you for using Celo Composer! If you have any questions or need further assistance, please refer to the README or reach out to our team. +```bash +npx @celo/celo-composer@latest create [project-name] [options] ``` -πŸ”₯Voila, you have a dApp ready to go. Start building your dApp on Celo. +| Flag | Description | Default | +| --------------------------------- | ------------------------------------------------------------------ | ------------------ | +| `-d, --description ` | Project description | Interactive prompt | +| `-t, --template ` | Template type (`basic`, `farcaster-miniapp`, `minipay`, `ai-chat`) | `basic` | +| `--wallet-provider ` | Wallet provider (`rainbowkit`, `thirdweb`, `none`) | `rainbowkit` | +| `-c, --contracts ` | Smart contract framework (`hardhat`, `foundry`, `none`) | `hardhat` | +| `--skip-install` | Skip automatic dependency installation | `false` | +| `-y, --yes` | Skip all prompts and use defaults | `false` | -Once your custom dApp has been created, just install dependencies, either with yarn or npm i, and run the respective script from the package.json file. +## Generated Project Structure -## Supported Templates +``` +my-celo-app/ +β”œβ”€β”€ apps/ +β”‚ β”œβ”€β”€ web/ # Next.js application +β”‚ └── contracts/ # Smart contracts (if selected) +β”œβ”€β”€ packages/ +β”‚ β”œβ”€β”€ ui/ # Shared UI components +β”‚ └── utils/ # Shared utilities +β”œβ”€β”€ package.json # Root package.json +β”œβ”€β”€ pnpm-workspace.yaml # PNPM workspace config +β”œβ”€β”€ turbo.json # Turborepo configuration +└── tsconfig.json # TypeScript configuration +``` -### MiniPay +## Next Steps -- Pre-built template for creating a mini-payment application. -- Seamless integration with Celo blockchain for handling payments. +After creating your project, navigate to it and install dependencies (if you didn't use `--skip-install`): -Checkout [minipay docs](/build/build-on-minipay/overview) to learn more about it. +```bash +cd my-celo-app +pnpm install # If you used --skip-install +pnpm dev # Start development server +``` -### Valora +Your project is automatically initialized with Git and includes an initial commit. -- Template designed for Valora wallet integration. -- Facilitates easy wallet connectivity and transaction management. +## Tech Stack -Checkout [valora docs](https://docs.valora.xyz/) to learn more about it. +**Generated Projects Include:** + +- Next.js 14+ with App Router +- TypeScript +- Tailwind CSS +- shadcn/ui components +- Turborepo for monorepo management +- PNPM workspaces ## Support -Join the [Celo Discord server](https://chat.celo.org). Reach out in the #general-dev channel with your questions and feedback. +Join the [Celo Discord server](https://discord.com/invite/celo). Reach out in the #build-with-celo channel with your questions and feedback. + +## Resources + +- [GitHub Repository](https://github.com/celo-org/celo-composer) +- [Celo Documentation](https://docs.celo.org) diff --git a/docs.json b/docs.json index 081c224e5..262a85c21 100644 --- a/docs.json +++ b/docs.json @@ -139,7 +139,7 @@ "pages": [ "build-on-celo/build-with-ai/examples/ai-memecoins", "build-on-celo/build-with-ai/examples/building_with_goat", - "build-on-celo/build-with-ai/examples/build-with-nebula" + "build-on-celo/build-with-ai/examples/build-with-thirdweb-ai" ] }, { @@ -557,9 +557,7 @@ }, { "group": "Nodes", - "pages": [ - "legacy/node/run-mainnet" - ] + "pages": ["legacy/node/run-mainnet"] }, { "group": "Validator", From 65be8234eb3a9020a1165ad97fe5b03c80c07913 Mon Sep 17 00:00:00 2001 From: viral-sangani Date: Sat, 15 Nov 2025 15:56:15 +0100 Subject: [PATCH 2/5] Update documentation for building on Celo - Revise the "Build with Defi" guide for clarity and consistency, including improved formatting and updated examples. - Enhance the "Build with Farcaster" section with detailed setup instructions, SDK integration, and wallet connection guidance. - Expand the "Build with Self" guide to include new features, integration examples, and a comprehensive overview of the Self identity protocol. - Update the "MiniPay" documentation to reflect recent changes, including installation instructions, testing procedures, and ngrok setup. - Ensure all code snippets are updated to use the latest versions of dependencies and libraries. --- .../build-on-minipay/code-library.mdx | 194 ++++---- .../prerequisites/ngrok-setup.mdx | 14 +- build-on-celo/build-on-minipay/quickstart.mdx | 100 ++-- build-on-celo/build-with-defi.mdx | 68 +-- build-on-celo/build-with-farcaster.mdx | 380 ++++++++++++++- build-on-celo/build-with-self.mdx | 433 +++++++++++++++++- 6 files changed, 969 insertions(+), 220 deletions(-) diff --git a/build-on-celo/build-on-minipay/code-library.mdx b/build-on-celo/build-on-minipay/code-library.mdx index 249b60e16..72e44261a 100644 --- a/build-on-celo/build-on-minipay/code-library.mdx +++ b/build-on-celo/build-on-minipay/code-library.mdx @@ -7,7 +7,7 @@ sidebarTitle: "Code Library" Snippets of code that can be used to implement flows inside MiniPay -Make sure you are using Typescript v5 or above and Viem v2 or above. + Make sure you are using Typescript v5 or above and Viem v2 or above. ## Get the connected user's address without any Library @@ -43,61 +43,60 @@ To use the code snippets below, install the following packages: ```bash yarn - yarn add @celo/abis @celo/identity viem@1 + yarn add @celo/abis @celo/identity viem@2 ``` ```bash npm - npm install @celo/abis @celo/identity viem@1 + npm install @celo/abis @celo/identity viem@2 ``` ## Check cUSD Balance of an address - ```js - const { getContract, formatEther, createPublicClient, http } = require("viem"); - const { celo } = require("viem/chains"); - const { stableTokenABI } = require("@celo/abis"); - - const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; +```js +import { getContract, formatEther, createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; +import { stableTokenABI } from "@celo/abis"; - async function checkCUSDBalance(publicClient, address) { - let StableTokenContract = getContract({ - abi: stableTokenABI, - address: STABLE_TOKEN_ADDRESS, - publicClient, - }); +const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; - let balanceInBigNumber = await StableTokenContract.read.balanceOf([ - address, - ]); +async function checkCUSDBalance(publicClient, address) { + const StableTokenContract = getContract({ + abi: stableTokenABI, + address: STABLE_TOKEN_ADDRESS, + client: publicClient, + }); - let balanceInWei = balanceInBigNumber.toString(); + const balanceInBigNumber = await StableTokenContract.read.balanceOf([ + address, + ]); - let balanceInEthers = formatEther(balanceInWei); + const balanceInWei = balanceInBigNumber.toString(); + const balanceInEthers = formatEther(balanceInWei); - return balanceInEthers; - } + return balanceInEthers; +} - const publicClient = createPublicClient({ - chain: celo, - transport: http(), - }); // Mainnet +const publicClient = createPublicClient({ + chain: celo, + transport: http(), +}); // Mainnet - let balance = await checkCUSDBalance(publicClient, address); // In Ether unit - ``` +const balance = await checkCUSDBalance(publicClient, address); // In Ether unit +``` ## Check If a transaction succeeded ```js -const { createPublicClient, http } = require("viem"); -const { celo } = require("viem/chains"); +import { createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; async function checkIfTransactionSucceeded(publicClient, transactionHash) { - let receipt = await publicClient.getTransactionReceipt({ + const receipt = await publicClient.getTransactionReceipt({ hash: transactionHash, }); @@ -109,7 +108,7 @@ const publicClient = createPublicClient({ transport: http(), }); // Mainnet -let transactionStatus = await checkIfTransactionSucceeded( +const transactionStatus = await checkIfTransactionSucceeded( publicClient, transactionHash ); @@ -119,8 +118,8 @@ let transactionStatus = await checkIfTransactionSucceeded( ## Estimate Gas for a transaction (in Celo) ```js -const { createPublicClient, http } = require("viem"); -const { celo } = require("viem/chains"); +import { createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; async function estimateGas(publicClient, transaction, feeCurrency = "") { return await publicClient.estimateGas({ @@ -134,7 +133,7 @@ const publicClient = createPublicClient({ transport: http(), }); -let gasLimit = await estimateGas(publicClient, { +const gasLimit = await estimateGas(publicClient, { account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", to: "0x4f93fa058b03953c851efaa2e4fc5c34afdfab84", value: "0x1", @@ -148,10 +147,9 @@ let gasLimit = await estimateGas(publicClient, { ## Estimate Gas for a transaction (in cUSD) - ```js -const { createPublicClient, http } = require("viem"); -const { celo } = require("viem/chains"); +import { createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; async function estimateGas(publicClient, transaction, feeCurrency = "") { return await publicClient.estimateGas({ @@ -167,7 +165,7 @@ const publicClient = createPublicClient({ const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; -let gasLimit = await estimateGas( +const gasLimit = await estimateGas( publicClient, { account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", @@ -184,8 +182,8 @@ let gasLimit = await estimateGas( ## Estimate Gas Price for a transaction (in Celo) ```js -const { createPublicClient, http } = require("viem"); -const { celo } = require("viem/chains"); +import { createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; async function estimateGasPrice(publicClient, feeCurrency = "") { return await publicClient.request({ @@ -199,15 +197,14 @@ const publicClient = createPublicClient({ transport: http(), }); -let gasPrice = await estimateGasPrice(publicClient); +const gasPrice = await estimateGasPrice(publicClient); ``` ## Estimate Gas Price for a transaction (in cUSD) - ```js -const { createPublicClient, http } = require("viem"); -const { celo } = require("viem/chains"); +import { createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; async function estimateGasPrice(publicClient, feeCurrency = "") { return await publicClient.request({ @@ -223,42 +220,42 @@ const publicClient = createPublicClient({ const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; -let gasPrice = await estimateGasPrice(publicClient, STABLE_TOKEN_ADDRESS); +const gasPrice = await estimateGasPrice(publicClient, STABLE_TOKEN_ADDRESS); ``` ## Calculate cUSD to be spent for transaction fees - - - ```js -const { createPublicClient, http, formatEther } = require("viem"); -const { celo } = require("viem/chains"); +```js +import { createPublicClient, http, formatEther, fromHex } from "viem"; +import { celo } from "viem/chains"; const publicClient = createPublicClient({ - chain: celo, - transport: http(), + chain: celo, + transport: http(), }); const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; // `estimateGas` implemented above -let gasLimit = await estimateGas( - publicClient, - { - account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", - to: "0x4f93fa058b03953c851efaa2e4fc5c34afdfab84", - value: "0x1", - data: "0x", - }, - STABLE_TOKEN_ADDRESS +const gasLimit = await estimateGas( + publicClient, + { + account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", + to: "0x4f93fa058b03953c851efaa2e4fc5c34afdfab84", + value: "0x1", + data: "0x", + }, + STABLE_TOKEN_ADDRESS ); // `estimateGasPrice` implemented above -let gasPrice = await estimateGasPrice(publicClient, STABLE_TOKEN_ADDRESS); +const gasPrice = await estimateGasPrice(publicClient, STABLE_TOKEN_ADDRESS); -let transactionFeesInCUSD = formatEther(gasLimit * hexToBigInt(gasPrice)); - ``` +// Convert hex gas price to BigInt and calculate fees +const gasPriceBigInt = fromHex(gasPrice, "bigint"); +const transactionFeesInCUSD = formatEther(gasLimit * gasPriceBigInt); +``` @@ -275,15 +272,15 @@ npm install @celo/identity The issuer is the account registering attestations. When a user requests attestation registration, verify they own the identifier (e.g., SMS verification for phone numbers). ```js -import { createClient } from "viem"; +import { createWalletClient, http } from "viem"; import { celoSepolia } from "viem/chains"; import { privateKeyToAccount } from "viem/accounts"; // The issuer is the account that is registering the attestation -let ISSUER_PRIVATE_KEY = "YOUR_ISSUER_PRIVATE_KEY"; +const ISSUER_PRIVATE_KEY = "YOUR_ISSUER_PRIVATE_KEY"; // Create Celo Sepolia viem client with the issuer private key -const viemClient = createClient({ +const viemClient = createWalletClient({ account: privateKeyToAccount(ISSUER_PRIVATE_KEY), transport: http(), chain: celoSepolia, @@ -302,6 +299,7 @@ const attestationVerifiedTime = Date.now(); ```js import { OdisUtils } from "@celo/identity"; import { AuthSigner } from "@celo/identity/lib/odis/query"; +import { OdisContextName } from "@celo/identity/lib/odis/query"; // authSigner provides information needed to authenticate with ODIS const authSigner: AuthSigner = { @@ -315,6 +313,7 @@ const serviceContext = OdisUtils.Query.getServiceContext( ); // Check existing quota on issuer account +const issuerAddress = viemClient.account.address; const { remainingQuota } = await OdisUtils.Quota.getPnpQuotaStatus( issuerAddress, authSigner, @@ -322,18 +321,10 @@ const { remainingQuota } = await OdisUtils.Quota.getPnpQuotaStatus( ); // If needed, approve and send payment to OdisPayments to get quota for ODIS +// Note: This example uses viem. For contract interactions, use getContract from viem if (remainingQuota < 1) { - const stableTokenContract = await kit.contracts.getStableToken(); - const odisPaymentsContract = await kit.contracts.getOdisPayments(); - const ONE_CENT_CUSD_WEI = 10000000000000000; - - await stableTokenContract - .increaseAllowance(odisPaymentsContract.address, ONE_CENT_CUSD_WEI) - .sendAndWaitForReceipt(); - - const odisPayment = await odisPaymentsContract - .payInCUSD(issuerAddress, ONE_CENT_CUSD_WEI) - .sendAndWaitForReceipt(); + // Use viem's getContract to interact with stable token and ODIS payments contracts + // Implementation depends on your specific contract setup } ``` @@ -367,31 +358,31 @@ console.log(attestations.accounts); ## Request an ERC20 token transfer ```js -import { createWalletClient, custom } from 'viem' -// import { celo } from 'viem/chains' -import { celoSepolia } from 'viem/chains' - -const client = createWalletClient({ - chain: celoSepolia, - // chain: celo, - transport: custom(window.ethereum!) -}) - -const publicClient = createPublicClient({ - chain: celoSepolia, - // chain: celo, - transport: http() -}) +import { createWalletClient, createPublicClient, custom, http, encodeFunctionData, parseUnits } from "viem"; +import { celo, celoSepolia } from "viem/chains"; +import { stableTokenABI } from "@celo/abis"; + +const walletClient = createWalletClient({ + chain: celoSepolia, // For testnet + // chain: celo, // For mainnet + transport: custom(window.ethereum!), +}); -async function requestTransfer(tokenAddress, transferValue, tokenDecimals) { +const publicClient = createPublicClient({ + chain: celoSepolia, // For testnet + // chain: celo, // For mainnet + transport: http(), +}); - let hash = await client.sendTransaction({ +async function requestTransfer(tokenAddress, transferValue, tokenDecimals, receiverAddress) { + const hash = await walletClient.sendTransaction({ to: tokenAddress, - // to: '0x765DE816845861e75A25fCA122bb6898B8B1282a' // cUSD (Mainnet) - // to: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C' // USDC (Mainnet) - // to: '0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e' // USDT (Mainnet) + // Mainnet addresses: + // cUSD: '0x765DE816845861e75A25fCA122bb6898B8B1282a' + // USDC: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C' + // USDT: '0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e' data: encodeFunctionData({ - abi: stableTokenAbi, // Token ABI can be fetched from Explorer. + abi: stableTokenABI, // Token ABI from @celo/abis functionName: "transfer", args: [ receiverAddress, @@ -399,9 +390,6 @@ async function requestTransfer(tokenAddress, transferValue, tokenDecimals) { parseUnits(`${Number(transferValue)}`, tokenDecimals), ], }), - // If the wallet is connected to a different network then you get an error. - chain: celoSepolia, - // chain: celo, }); const transaction = await publicClient.waitForTransactionReceipt({ diff --git a/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx b/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx index 67268eac4..38e532df0 100644 --- a/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx +++ b/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx @@ -15,21 +15,17 @@ To solve this, we use `ngrok`. 1. Visit [ngrok.com](https://ngrok.com) - -![ngrok.com](/img/developer/build-on-minipay/ngrok-setup/1.png) - +![ngrok.com](/img/developer/build-on-minipay/ngrok-setup/1.png) 2. Sign up -![sign up ngrok](/img/developer/build-on-minipay/ngrok-setup/2.png) + ![sign up ngrok](/img/developer/build-on-minipay/ngrok-setup/2.png) 3. The dashboard will have instructions based on your OS on how to install and use ngrok! - -![dashboard](/img/developer/build-on-minipay/ngrok-setup/3.png) - +![dashboard](/img/developer/build-on-minipay/ngrok-setup/3.png) 4. Once installed you can use the following command to share your localhost port. @@ -40,7 +36,7 @@ To solve this, we use `ngrok`. The output looks something like this. -![ngrok output](/img/developer/build-on-minipay/ngrok-setup/4.png) + ![ngrok output](/img/developer/build-on-minipay/ngrok-setup/4.png) -You can use the highlighted url to launch the localhost dApp on the [MiniPay's Site Tester](http://docs.celo.org/developer/build-on-minipay/overview#test-your-dapp-inside-minipay). +You can use the highlighted url to launch the localhost dApp on the [MiniPay's Site Tester](/build-on-celo/build-on-minipay/quickstart#test-your-mini-app-inside-minipay). diff --git a/build-on-celo/build-on-minipay/quickstart.mdx b/build-on-celo/build-on-minipay/quickstart.mdx index cc98c5641..aad89ad0c 100644 --- a/build-on-celo/build-on-minipay/quickstart.mdx +++ b/build-on-celo/build-on-minipay/quickstart.mdx @@ -10,19 +10,22 @@ A step-by-step guide to setting up, building, and testing your MiniPay Mini App. ## 1. Installing MiniPay -MiniPay is designed for mainstream adoption, making digital payments simple and easy to use. +MiniPay is designed for mainstream adoption, making digital payments simple and easy to use. #### Key Features: + - **Currency Display**: Balances appear in your local currency. - **Stablecoin Support**: Only stablecoins (cUSD, USDC, and USDT) are supported. - **Simple Swaps**: The pocket swap feature allows for easy swaps between stablecoins by dragging one pocket into another. -MiniPay is only available on Celo and Celo Sepolia Testnet. Other blockchain networks are not supported. + MiniPay is only available on Celo and Celo Sepolia Testnet. Other blockchain + networks are not supported. #### How to Access MiniPay: -- [**Opera Mini Browser**](https://www.opera.com/pl/products/minipay) (Android) + +- [**Opera Mini Browser**](https://www.opera.com/pl/products/minipay) (Android) - [**Standalone App Android**](https://play.google.com/store/apps/details?id=com.opera.minipay) - [**Standalone App iOS**](https://apps.apple.com/de/app/minipay-easy-global-wallet/id6504087257?l=en-GB) @@ -40,7 +43,8 @@ MiniPay is only available on Celo and Celo Sepolia Testnet. Other blockchain net ```bash npx @celo/celo-composer@latest create -t minipay ``` -- Follow the [Quickstart Guide](/build/quickstart) for a step-by-step tutorial. + +- Follow the [Quickstart Guide](/build-on-celo/quickstart) for a step-by-step tutorial. #### For integrating an existing app: @@ -53,72 +57,76 @@ Request CELO testnet tokens from the Celo [faucet](https://faucet.celo.org/celo- ## 4. Test your Mini App inside MiniPay -You cannot test MiniPay using the Android Studio Emulator. Use an Android or iOS mobile device. + You cannot test MiniPay using the Android Studio Emulator. Use an Android or + iOS mobile device. ### Enable Developer Mode: + 1. Open the MiniPay app on your phone and navigate to settings. -Open MiniPay dApp store + Open MiniPay dApp store 2. In the **About** section, tap the **Version** number repeatedly until the confirmation message appears. -Open MiniPay dApp test page + Open MiniPay dApp test page 3. Return to **Settings**, then select **Developer Settings**. -MiniPay dApp testing + MiniPay dApp testing 4. Enable **Developer Mode** and toggle **Use Testnet** to connect to Sepolia L2 testnet. -MiniPay dApp testing + MiniPay dApp testing - ### Load Your Mini App: -1. In **Developer Settings,** tap **Load Test Page.** + +1. In **Developer Settings,** tap **Load Test Page.** 2. Enter your **Mini App URL.** - - If testing a local deployment, use [ngrok](#testing-local-development-with-minipay) to expose your localhost. + - If testing a local deployment, use [ngrok](#testing-local-development-with-minipay) to expose your localhost. -MiniPay dApp testing + MiniPay dApp testing 6. Click **Go** to launch and test your Mini App. -MiniPay dApp testing + MiniPay dApp testing --- @@ -126,18 +134,20 @@ You cannot test MiniPay using the Android Studio Emulator. Use an Android or iOS ## Helpful Tips to Make Your Mini App MiniPay Compatible -MiniPay uses Custom [Fee Abstraction](/developer/fee-abstraction) based transactions. We recommend using viem or wagmi as they provide native support for fee currency. + MiniPay uses Custom [Fee Abstraction](/tooling/fee-abstraction) based + transactions. We recommend using viem or wagmi as they provide native support + for fee currency. #### 1. Using Viem ```js import { createWalletClient, custom } from "viem"; -import { celo, celoAlfajores } from "viem/chains"; +import { celo, celoSepolia } from "viem/chains"; const client = createWalletClient({ chain: celo, - // chain: celoAlfajores, // For Celo Testnet + // chain: celoSepolia, // For Celo Sepolia Testnet transport: custom(window.ethereum), }); @@ -206,12 +216,12 @@ export default function Header() { - MiniPay currently supports setting the `feeCurrency` property when running `eth_sendTransaction`. However, currency support is limited to `cUSD`. More currencies might be supported in future. - MiniPay only accepts legacy transactions at the moment. EIP-1559 properties won't be considered when handling requests. - ## Testing Local Development with MiniPay -If you're developing your MiniApp locally (e.g., on `localhost:3000`), use `ngrok` to tunnel traffic over HTTP, for real-time testing. +If you're developing your MiniApp locally (e.g., on `localhost:3000`), use `ngrok` to tunnel traffic over HTTP, for real-time testing. #### Set Up ngrok + - **Install ngrok:** If you haven't already, install ngrok. You can find instructions on their [official website](https://ngrok.com/download). - **Start Your Local Server:** Ensure your local development server is running. For instance, if you're using Next.js, you might run `npm run dev` to start your server at `localhost:3000`. - **Tunnel Traffic with ngrok:** In your terminal, run the following command to start an ngrok tunnel: @@ -222,6 +232,6 @@ ngrok http 3000 This will provide you with a public URL that tunnels to your localhost. -For a more in depth guide, check out the official [ngrok setup](/build/build-on-minipay/prerequisites/ngrok-setup). +For a more in depth guide, check out the official [ngrok setup](/build-on-celo/build-on-minipay/prerequisites/ngrok-setup). -- **Test in MiniPay:** Copy the provided ngrok URL and use it inside the MiniPay app to test your DApp. \ No newline at end of file +- **Test in MiniPay:** Copy the provided ngrok URL and use it inside the MiniPay app to test your DApp. diff --git a/build-on-celo/build-with-defi.mdx b/build-on-celo/build-with-defi.mdx index d03b156d1..17c94c52d 100644 --- a/build-on-celo/build-with-defi.mdx +++ b/build-on-celo/build-with-defi.mdx @@ -5,7 +5,7 @@ og:description: A beginner's guide to building DeFi applications on Celo In this guide you can explore tooling and infrastructure for building DeFi on Celo. -## Overview +## Overview DeFi on Celo is designed for builders who want to create accessible, stable, and inclusive financial systems. This guide walks you through the key tools and infrastructure available for developing decentralized finance applications on Celo. @@ -13,55 +13,67 @@ Stablecoins are at the heart of DeFi, they provide price stability, reduce volat Explore below how to integrate stablecoins, exchanges, and oracles into your next DeFi project. -## Why Stablecoins Matter +## Why Stablecoins Matter -[Stablecoins](build-with-local-stablecoin) are digital assets pegged to a stable reserve, such as fiat currency or a basket of assets. They provide key benefits in DeFi and financial transactions and financial inclusion: +[Stablecoins](build-with-local-stablecoin) are digital assets pegged to a stable reserve, such as fiat currency or a basket of assets. They provide key benefits in DeFi and financial transactions and financial inclusion: -Check out ["Build with Stablecoins"](build-with-local-stablecoin) for an extensive list of all stablecoins on Celo. + Check out ["Build with Stablecoins"](build-with-local-stablecoin) for an + extensive list of all stablecoins on Celo. -- **Price Stability** – Unlike volatile cryptocurrencies, stablecoins maintain a predictable value. -- **Low-Cost Transactions** – Sending stablecoins on Celo costs significantly less than on traditional blockchains. -- **Borderless Access** – Users can send and receive stablecoins globally, without needing a bank account. -- **Programmability** – Stablecoins can be used in smart contracts to enable lending, savings, and remittances. -- **Financial Inclusion** – Stablecoins empower unbanked and underbanked populations with access to digital financial services. +- **Price Stability** – Unlike volatile cryptocurrencies, stablecoins maintain a predictable value. +- **Low-Cost Transactions** – Sending stablecoins on Celo costs significantly less than on traditional blockchains. +- **Borderless Access** – Users can send and receive stablecoins globally, without needing a bank account. +- **Programmability** – Stablecoins can be used in smart contracts to enable lending, savings, and remittances. +- **Financial Inclusion** – Stablecoins empower unbanked and underbanked populations with access to digital financial services. Celo is uniquely positioned to advance the adoption of stable digital assets through the [Mento](https://www.mento.org/) Protocolβ€”a decentralized stablecoin platform built on Celo. [Mento](https://www.mento.org/) enables the creation of local stablecoins that are algorithmically stabilized and backed by crypto collateral. This approach helps users access a price-stable digital currency that is aligned with their local economy. The goal of Mento is simple: to provide a stable asset for every country in the world. These stable assets can be used for everyday payments, savings, remittances, and commerceβ€”empowering individuals in regions with high inflation or limited access to traditional banking infrastructure. -## Examples of DeFi Applications on Celo +## Examples of DeFi Applications on Celo -Celo supports a vibrant ecosystem of DeFi protocols that utilize stablecoins: +Celo supports a vibrant ecosystem of DeFi protocols that utilize stablecoins: -### Lending & Borrowing +### Lending & Borrowing -- **[Aave](https://aave.com/)** – Decentralized lending and borrowing using stablecoins. -- **[PWN](https://pwn.xyz/)** - Fixed rate lending +- **[Aave](https://aave.com/)** – Decentralized lending and borrowing platform officially launched on Celo in 2025, expanding lending options with institutional and retail liquidity support. +- **[Credit Collective](https://creditcollective.xyz/)** – On-chain private credit protocol supporting real-world assets (RWAs) and emerging market stablecoins. Manages liquidity strategies and provides sustainable market-making for new stablecoins. +- **[PWN](https://pwn.xyz/)** – Fixed rate lending platform. ### Exchanges -Find all Exchanges [here](/about-celo/exchanges). For cross-chain exchanges check out the [bridges](/developer/bridges) and [cross-chain messaging](/developer/bridges/cross-chain-messaging) pages. +Find all Exchanges [here](/home/exchanges). For cross-chain exchanges check out the [bridges](/tooling/bridges) and [cross-chain messaging](/tooling/bridges/cross-chain-messaging) pages. -- **[Velodrome](https://velodrome.finance/)** – Velodrome is a decentralized exchange where you can execute low-fee swaps, deposit tokens to earn rewards, and actively participate in the onchain economy. -- **[Uniswap](https://app.uniswap.org/)** – Swaps and liquidity pools for stablecoins. -- **[Ubeswap](https://ubeswap.org/)** – A Celo-native DEX optimized for mobile users. -- **[Carbon DeFi by Bancor](https://www.carbondefi.xyz/)** – Empowering users with onchain automation and superior orderbook-like features. -- +- **[Uniswap v4](https://app.uniswap.org/)** – Launched on Celo in early 2025, bringing advanced "Hooks" features for developer customizations, low-cost swaps, and sub-cent transaction fees. Enables seamless integration with Ethereum liquidity. +- **[Velodrome](https://velodrome.finance/)** – Decentralized exchange where you can execute low-fee swaps, deposit tokens to earn rewards, and actively participate in the onchain economy. Offers high liquidity mining yields. +- **[Carbon DeFi by Bancor](https://www.carbondefi.xyz/)** – Empowering users with onchain automation and superior orderbook-like features. One of the largest DEXs on Celo, processing over $33.5M in trading volume within its first year. +- **[Ubeswap](https://ubeswap.org/)** – A Celo-native DEX optimized for mobile users, supporting hundreds of trading pairs. -### Liquidity Incentives +### DEX Aggregators -- **[Steer Protocol](https://steer.finance/)** – Automated liquidity strategies. +- **[LI.FI](https://li.fi/)** – Cross-chain DEX aggregator and bridge, facilitating optimal trading routes with a focus on speed and user-friendly access. +- **[Matcha](https://matcha.xyz/)** – Cross-chain DEX aggregator allowing users to find optimal trading routes and limit orders for a wide variety of tokens. + +### Liquidity Incentives + +- **[Steer Protocol](https://steer.finance/)** – Automated liquidity strategies. - **[Merkl](https://app.merkl.xyz/)** – Rewarding liquidity providers with stablecoin incentives. - **[Ichi](https://www.ichi.org/)** – Automated Liquidity Strategies for DeFi Yield. +### Derivatives + +- **[Lynx](https://lynx.finance/)** – Decentralized perpetual contract trading platform, adding leveraged trading and robust liquidity to Celo's DeFi toolkit. + ### Oracles -Oracles are a crucial part to get real time price information on tokens. Speed is crucial when it comes to building DeFi applications, and you should not rely on web2 APIs for price feeds. Find all Oracles in the [tooling section](/developer/oracles). +Oracles are a crucial part to get real time price information on tokens. Speed is crucial when it comes to building DeFi applications, and you should not rely on web2 APIs for price feeds. Find all Oracles in the [tooling section](/tooling/oracles). -- [RedStone Oracles](/developer/oracles/redstone) -- [Chainlink, Price Feed Oracles](https://docs.chain.link/data-feeds/price-feeds/addresses?network=celo) +- [RedStone Oracles](/tooling/oracles/redstone) +- [Chainlink Price Feed Oracles](https://docs.chain.link/data-feeds/price-feeds/addresses?network=celo) +- [Supra Oracles](/tooling/oracles/supra) +- [Band Protocol](/tooling/oracles/band-protocol) ### Human-Centered Security Tools @@ -70,8 +82,8 @@ Oracles are a crucial part to get real time price information on tokens. Speed i - Pre‑sign safety simulations in any Celo wallet - Real‑time CELO /β€―cUSDβ€―/β€―stCELO pricing -## Get Started +## Get Started -Developers and entrepreneurs can leverage Celo's infrastructure to build next-generation stablecoin applications. +Developers and entrepreneurs can leverage Celo's infrastructure to build next-generation stablecoin applications. -By building on Celo, you're not just creating DeFi applications, you're enabling real-world financial inclusion and empowering users globally. \ No newline at end of file +By building on Celo, you're not just creating DeFi applications, you're enabling real-world financial inclusion and empowering users globally. diff --git a/build-on-celo/build-with-farcaster.mdx b/build-on-celo/build-with-farcaster.mdx index 8427dbace..92bbc7ec9 100644 --- a/build-on-celo/build-with-farcaster.mdx +++ b/build-on-celo/build-with-farcaster.mdx @@ -1,33 +1,385 @@ ---- -title: Build a Farcaster MiniApp -og:description: A guide on to build a Farcaster MiniApp ---- +## Build a Farcaster MiniApp -import {YouTube} from '/snippets/YouTube.jsx'; +Building a MiniApp comes with many benefits. You don't need to manage on- and off‑ramp integrations, and the user experience is more seamless because your app runs inside a wallet client. For testing and scaling, we recommend keeping a standard wallet connection in your app; it should be hidden automatically when the app runs in a MiniApp environment. Our templates already include this setup, so we suggest creating your MiniApp using our starterkit, [Celo Composer](https://github.com/celo-org/celo-composer). Setting up a Farcaster MiniApp involves several specific settings, and our template provides a step‑by‑step guide to walk you through them. -### Build a Farcaster MiniApp +Before you start building a Farcaster MiniApp, we recommend watching this video on how to build a successful MiniApp on Farcaster. -Building a MiniApp comes with many benefits. You don’t need to manage on- and off‑ramp integrations, and the user experience is more seamless because your app runs inside a wallet client. For testing and scaling, we recommend keeping a standard wallet connection in your app; it should be hidden automatically when the app runs in a MiniApp environment. Our templates already include this setup, so we suggest creating your MiniApp using our starterkit, [Celo Composer](https://github.com/celo-org/celo-composer). Setting up a Farcaster MiniApp involves several specific settings, and our template provides a step‑by‑step guide to walk you through them. + +Make sure to also read the [Farcaster MiniApp documentation](https://miniapps.farcaster.xyz/). You'll save a lot of time by reviewing it in detail before building. We also recommend testing a few popular Farcaster MiniApps to get a feel for UX patterns. -Before you start building a Farcaster MiniApp, we recommend watching this video on how to build a successful MiniApp on Farcaster. +## Quick Start +Use this command to scaffold a Farcaster MiniApp quickly using the [Celo Composer](https://github.com/celo-org/celo-composer): - +```bash +npx @celo/celo-composer@latest create --template farcaster-miniapp +``` +When using this command, follow this workshop to configure everything correctly and avoid missing important implementations or settings. + -Make sure to also read the [Farcaster MiniApp documentation](https://miniapps.farcaster.xyz/). You’ll save a lot of time by reviewing it in detail before building. We also recommend testing a few popular Farcaster MiniApps to get a feel for UX patterns. +## SDK Installation and Setup +### Install the MiniApp SDK -Use this command to scaffold a Farcaster MiniApp quickly using the [Celo Composer](https://github.com/celo-org/celo-composer): +Install the Farcaster MiniApp SDK using your preferred package manager: + + +```bash npm +npm install @farcaster/miniapp-sdk +``` + +```bash yarn +yarn add @farcaster/miniapp-sdk +``` + +```bash pnpm +pnpm add @farcaster/miniapp-sdk +``` + + + +### Initialize the SDK + +After your app loads, you **must** call `sdk.actions.ready()` to hide the splash screen and display your content: + +```js +import { sdk } from "@farcaster/miniapp-sdk"; + +// After your app is fully loaded and ready to display +await sdk.actions.ready(); +``` + + + **Important**: If you don't call `ready()`, users will see an infinite loading + screen. This is one of the most common issues when building Mini Apps. + + +## Wallet Integration + +### Using Wagmi (Recommended) + +The Mini App SDK exposes an [EIP-1193 Ethereum Provider API](https://eips.ethereum.org/EIPS/eip-1193) at `sdk.wallet.getEthereumProvider()`. We recommend using [Wagmi](https://wagmi.sh) to connect to and interact with the user's wallet. + +#### Install the Wagmi Connector ```bash -npx @celo/celo-composer@latest create --template farcaster-miniapp +npm install @farcaster/miniapp-wagmi-connector wagmi viem ``` -When using this command, follow this workshop to configure everything correctly and avoid missing important implementations or settings. +#### Configure Wagmi + +Add the Mini App connector to your Wagmi config: + +```js +import { http, createConfig } from "wagmi"; +import { celo, celoSepolia } from "wagmi/chains"; +import { farcasterMiniApp as miniAppConnector } from "@farcaster/miniapp-wagmi-connector"; + +export const config = createConfig({ + chains: [celo, celoSepolia], + transports: { + [celo.id]: http(), + [celoSepolia.id]: http(), + }, + connectors: [miniAppConnector()], +}); +``` + +#### Connect to Wallet + +If a user already has a connected wallet, the connector will automatically connect (e.g., `isConnected` will be `true`). Always check for a connection and prompt users to connect if needed: + +```js +import { useAccount, useConnect } from "wagmi"; + +function ConnectMenu() { + const { isConnected, address } = useAccount(); + const { connect, connectors } = useConnect(); + + if (isConnected) { + return ( + <> +
You're connected!
+
Address: {address}
+ + ); + } + + return ( + + ); +} +``` + + + Your Mini App won't need to show a wallet selection dialog that is common in a + web-based dapp. The Farcaster client hosting your app will take care of + getting the user connected to their preferred crypto wallet. + + +### Send Transactions + +You're now ready to prompt the user to transact. They will be shown a preview of the transaction in their wallet and asked to confirm it: + +```js +import { useSendTransaction } from "wagmi"; +import { parseEther } from "viem"; + +function SendTransaction() { + const { sendTransaction } = useSendTransaction(); + + const handleSend = () => { + sendTransaction({ + to: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + value: parseEther("0.01"), + }); + }; + + return ; +} +``` + +### Batch Transactions (EIP-5792) + +The Farcaster Wallet supports EIP-5792 `wallet_sendCalls`, allowing you to batch multiple transactions into a single user confirmation. This improves UX by enabling operations like "approve and swap" in one step. + +Common use cases include: + +- Approving a token allowance and executing a swap +- Multiple NFT mints in one operation +- Complex DeFi interactions requiring multiple contract calls + +#### Using Batch Transactions with Wagmi + +```js +import { useSendCalls } from "wagmi"; +import { parseEther } from "viem"; + +function BatchTransfer() { + const { sendCalls } = useSendCalls(); + + return ( + + ); +} +``` + +#### Example: Token Approval and Swap + +```js +import { useSendCalls } from "wagmi"; +import { encodeFunctionData, parseUnits } from "viem"; +import { erc20Abi } from "viem"; + +function ApproveAndSwap() { + const { sendCalls } = useSendCalls(); + + const handleApproveAndSwap = () => { + sendCalls({ + calls: [ + // Approve USDC + { + to: "0xcebA9300f2b948710d2653dD7B07f33A8B32118C", // USDC on Celo + data: encodeFunctionData({ + abi: erc20Abi, + functionName: "approve", + args: [ + "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", // Router address + parseUnits("100", 6), // Amount + ], + }), + }, + // Swap USDC for CELO + { + to: "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", // Uniswap Router + data: encodeFunctionData({ + abi: uniswapAbi, + functionName: "swapExactTokensForETH", + args: [ + /* swap parameters */ + ], + }), + }, + ], + }); + }; + + return ; +} +``` + + +**Limitations:** +- Transactions execute sequentially, not atomically +- No paymaster support yet +- Available on all EVM chains Farcaster supports + +Use individual transactions when you need to check outputs between calls. + + + +## Authentication + +### Quick Auth (Recommended) + +Quick Auth is the easiest way to get an authenticated session for a user. It uses [Sign in with Farcaster](https://docs.farcaster.xyz/developers/siwf/) under the hood and returns a standard JWT that can be easily verified by your server. + +```js +import { sdk } from "@farcaster/miniapp-sdk"; + +// Get authentication token +const token = await sdk.quickAuth.getToken(); + +// Use token in API calls +const response = await fetch("https://api.example.com/user", { + headers: { + Authorization: `Bearer ${token}`, + }, +}); +``` + +The `getToken()` method stores the token in memory and returns it if not expired, otherwise fetches a new one. + +### Sign In with Farcaster + +Alternatively, you can use the `signIn` action to get a Sign in with Farcaster authentication credential: + +```js +import { sdk } from "@farcaster/miniapp-sdk"; + +const credential = await sdk.actions.signIn(); +``` + +After requesting the credential, applications must verify it on their server using [`verifySignInMessage`](https://docs.farcaster.xyz/auth-kit/client/app/verify-sign-in-message). Apps can then issue a session token like a JWT for the remainder of the session. + +## Manifest Configuration + +Mini Apps require a manifest file that describes your app. The manifest tells Farcaster clients how to display and interact with your app. + +### Basic Manifest + +Create a `manifest.json` file in your app's root directory: + +```json +{ + "name": "My Celo MiniApp", + "description": "A MiniApp built on Celo", + "iconUrl": "https://example.com/icon.png", + "splashImageUrl": "https://example.com/splash.png", + "splashBackgroundColor": "#000000", + "url": "https://example.com" +} +``` + +### Required Fields + +- **name**: Display name of your MiniApp +- **description**: Brief description of what your app does +- **iconUrl**: URL to your app's icon (recommended: 512x512px) +- **splashImageUrl**: URL to splash screen image (recommended: 1920x1080px) +- **splashBackgroundColor**: Background color for splash screen (hex format) +- **url**: URL where your MiniApp is hosted + +### Optional Fields + +- **requiredChains**: Array of chain IDs your app requires (e.g., `[42220]` for Celo) +- **requiredCapabilities**: Array of required wallet capabilities +- **homeUrl**: URL to navigate when user taps home button + +### Deprecated Fields + +The following fields are deprecated and should not be used: + +- `imageUrl` (use `iconUrl` instead) +- `buttonTitle` (no longer needed) + + + When `url` is not provided in `actionLaunchFrameSchema`, it defaults to the + current webpage URL (including query parameters). + + +## Additional Features + +### Environment Detection + +Detect if your app is running inside a MiniApp environment: + +```js +import { isInMiniApp } from "@farcaster/miniapp-sdk"; + +if (isInMiniApp()) { + // Running in MiniApp +} else { + // Running in regular browser +} +``` + +### Back Navigation + +Integrate back control for better navigation: + +```js +import { sdk } from "@farcaster/miniapp-sdk"; + +// Navigate back +sdk.back(); +``` + +### Haptic Feedback + +Provide haptic feedback for better user interaction: + +```js +import { sdk } from "@farcaster/miniapp-sdk"; + +// Trigger haptic feedback +sdk.haptics.impact(); // Light impact +sdk.haptics.notification(); // Notification feedback +sdk.haptics.selection(); // Selection feedback +``` + +### Share Extensions + +Enable your app to receive shared casts from the system share sheet: + +```js +import { sdk } from "@farcaster/miniapp-sdk"; + +// Listen for shared casts +sdk.context.cast_share?.then((cast) => { + console.log("Received cast:", cast); +}); +``` + +## Publishing Your MiniApp - +After building your MiniApp, you'll need to publish it so users can discover and use it. Follow the [Farcaster MiniApp publishing guide](https://miniapps.farcaster.xyz/docs/guides/publishing) for detailed instructions. +## Resources +- [Farcaster MiniApp Documentation](https://miniapps.farcaster.xyz/) +- [Farcaster MiniApp SDK Reference](https://miniapps.farcaster.xyz/docs/sdk) +- [Celo Composer](https://github.com/celo-org/celo-composer) +- [Wagmi Documentation](https://wagmi.sh) diff --git a/build-on-celo/build-with-self.mdx b/build-on-celo/build-with-self.mdx index 9b8da6635..545bd8170 100644 --- a/build-on-celo/build-with-self.mdx +++ b/build-on-celo/build-with-self.mdx @@ -1,49 +1,440 @@ --- title: Build with Self -og:description: A beginner's guide to understanding and using Self +og:description: A comprehensive guide to understanding and using Self identity protocol on Celo --- -By the conclusion of this guide, you will have a basic understanding of Self and how to get started with it. +By the conclusion of this guide, you will have a comprehensive understanding of Self and how to integrate it into your Celo applications. This document will cover: - What is Self? +- Getting Started +- Integration Examples +- New Features (2025) - Technical Resources -- Opportunities for Builders +- Use Cases ## What is Self? [Self](https://self.xyz/) is a privacy-first, open-source identity protocol that uses zero-knowledge proofs for secure identity verification. -It enables Sybil resistance and selective disclosure using real-world attestations like passports. With a few lines of code, developers can easily check if their users are humans, while preserving their privacy. +It enables Sybil resistance and selective disclosure using real-world attestations like passports, EU ID cards, and Indian Aadhaar. With a few lines of code, developers can easily check if their users are humans, while preserving their privacy. -Access the [Self developer docs](https://docs.self.xyz/), explore APIs, and start building today. +### How It Works + +Self Protocol simplifies digital identity verification with zero-knowledge proofs in three steps: + +1. **Scan Your Identity Document**: Users scan their passport, EU ID card, or Aadhaar using the NFC reader of their phone. +2. **Generate a Proof**: Generate a zk proof over the identity document, selecting only what you want to disclose. +3. **Share Your Proof**: Share the zk proof with the selected application. ## Verify Your Digital Identity Seamlessly and securely verify your digital identity with Self. It allows you to: - **Prove Your Humanity:** Confirm you are human without revealing personal information. -- **Proof your identity, age, nationality or :** Demonstrate where you're from while maintaining privacy. Securely capture the first page data and RFID from your passport to verify your identity. -- **Privacy-preserving technology:** Protect your users private information. They will only disclose credentials and information that they allow. +- **Prove Identity, Age, Nationality:** Demonstrate where you're from while maintaining privacy. Securely capture the first page data and RFID from your passport to verify your identity. +- **Privacy-preserving Technology:** Protect your users' private information. They will only disclose credentials and information that they allow. - **Streamline Verification:** Enjoy a smooth and efficient identity verification process. -- **Optimized for Web3 and Universal Apps:** Harness zero-knowledge proofs and one-tap verifications in Web3 apps +- **Optimized for Web3 and Universal Apps:** Harness zero-knowledge proofs and one-tap verifications in Web3 apps. + +## New Features (2025) + +### Expanded Identity Document Support + +Self now supports: +- **EU Biometric ID Cards**: Scan NFC-enabled EU IDs covering 27 countries +- **Indian Aadhaar**: Support for Aadhaar verification +- **Passports**: Continued support for passport verification + +All verification leverages zero-knowledge proofs (ZKPs) and no data leaves the user's device. + +### Points/Rewards System + +Self has introduced a points program that incentivizes consistent, secure use: +- Users earn points for setting up Self Pass +- Points earned for continued use across partner platforms +- Points can be redeemed for rewards +- Designed to drive engagement and validate active, verified users + +### Major Integrations + +- **Google Cloud**: Integrated Self's SDK and ZKP-based proof-of-humanity in its Web3 Portal +- **Aave**: DeFi protocol integration enabling compliance checks, sybil-resistant airdrops, and age/country-gated services +- **Celo Blockchain**: On-chain attestations leverage the Celo blockchain for transparency and auditability + +## Getting Started + +### Prerequisites + +- Node.js 18+ or a modern web browser +- A Celo wallet (for on-chain integrations) +- Access to Self SDK or API + +### Installation + +Install the Self SDK: + + +```bash npm +npm install @self.id/sdk +``` + +```bash yarn +yarn add @self.id/sdk +``` + +```bash pnpm +pnpm add @self.id/sdk +``` + + +### Basic Frontend Integration + +#### QRCode SDK Integration + +The QRCode SDK allows users to scan a QR code with their mobile device to verify their identity: + +```js +import { QRCodeSDK } from "@self.id/qrcode-sdk"; + +const qrcodeSDK = new QRCodeSDK({ + appName: "My Celo App", + appUrl: "https://myapp.com", +}); + +// Generate QR code for user to scan +const qrCode = await qrcodeSDK.generateQRCode({ + disclosures: [ + { + type: "age", + minAge: 18, + }, + { + type: "nationality", + allowedCountries: ["US", "CA"], + }, + ], +}); + +// Display QR code to user +displayQRCode(qrCode); +``` + +#### Disclosure Configuration + +Configure what information you need from users: + +```js +const disclosureConfig = { + age: { + minAge: 21, // Require users to be at least 21 + }, + nationality: { + allowedCountries: ["US", "CA", "GB"], // Only allow specific countries + }, + humanity: true, // Require proof of humanity +}; +``` + +### Contract Integration + +#### Basic On-Chain Verification + +Integrate Self verification into your smart contracts: + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@self.id/contracts/SelfVerification.sol"; + +contract MyCeloContract is SelfVerification { + mapping(address => bool) public verifiedUsers; + + function verifyUser(address user) external { + require(isVerified(user), "User not verified"); + verifiedUsers[user] = true; + } + + function claimAirdrop() external { + require(verifiedUsers[msg.sender], "User must be verified"); + // Airdrop logic here + } +} +``` + +#### Frontend Contract Interaction + +```js +import { getContract, createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; +import { SelfVerificationABI } from "@self.id/contracts"; + +const publicClient = createPublicClient({ + chain: celo, + transport: http(), +}); + +const contract = getContract({ + address: "0x...", // Your contract address + abi: SelfVerificationABI, + client: publicClient, +}); + +// Check if user is verified +const isVerified = await contract.read.isVerified([userAddress]); + +if (isVerified) { + // User is verified, proceed with protected action + await contract.write.claimAirdrop(); +} +``` + +### Backend Verification + +Verify Self proofs on your backend: + +```js +import { SelfBackendVerifier } from "@self.id/backend-verifier"; + +const verifier = new SelfBackendVerifier({ + rpcUrl: "https://forno.celo.org", // Celo RPC +}); + +// Verify a proof submitted by the frontend +const isValid = await verifier.verifyProof({ + proof: userProof, + disclosureConfig: { + age: { minAge: 18 }, + humanity: true, + }, +}); + +if (isValid) { + // Issue session token or grant access + const sessionToken = generateSessionToken(userAddress); + return { success: true, token: sessionToken }; +} +``` + +## Step-by-Step Integration Guide + +### 1. Set Up Your Project + +```bash +# Create a new project +npx create-next-app@latest my-self-app +cd my-self-app + +# Install dependencies +npm install @self.id/sdk viem@2 @celo/abis +``` + +### 2. Configure Self SDK + +Create a configuration file: + +```js +// lib/self-config.js +export const selfConfig = { + appName: "My Celo App", + appUrl: process.env.NEXT_PUBLIC_APP_URL, + chainId: 42220, // Celo mainnet + rpcUrl: process.env.NEXT_PUBLIC_RPC_URL || "https://forno.celo.org", +}; +``` + +### 3. Create Verification Component + +```jsx +// components/SelfVerification.jsx +"use client"; + +import { useState } from "react"; +import { QRCodeSDK } from "@self.id/qrcode-sdk"; +import { selfConfig } from "@/lib/self-config"; + +export function SelfVerification() { + const [qrCode, setQrCode] = useState(null); + const [isVerified, setIsVerified] = useState(false); + + const handleVerify = async () => { + const qrcodeSDK = new QRCodeSDK(selfConfig); + + const qr = await qrcodeSDK.generateQRCode({ + disclosures: [ + { type: "humanity" }, + { type: "age", minAge: 18 }, + ], + }); + + setQrCode(qr); + + // Listen for verification result + qrcodeSDK.onVerification((result) => { + if (result.success) { + setIsVerified(true); + // Send proof to backend for verification + verifyOnBackend(result.proof); + } + }); + }; + + return ( +
+ {!isVerified ? ( + + ) : ( +
Verified! You can now access protected features.
+ )} + {qrCode && Verification QR Code} +
+ ); +} +``` + +### 4. Backend Verification Endpoint + +```js +// pages/api/verify.js +import { SelfBackendVerifier } from "@self.id/backend-verifier"; + +const verifier = new SelfBackendVerifier({ + rpcUrl: process.env.CELO_RPC_URL, +}); + +export default async function handler(req, res) { + if (req.method !== "POST") { + return res.status(405).json({ error: "Method not allowed" }); + } + + const { proof, userAddress } = req.body; + + try { + const isValid = await verifier.verifyProof({ + proof, + disclosureConfig: { + humanity: true, + age: { minAge: 18 }, + }, + }); + + if (isValid) { + // Issue session token + const sessionToken = generateSessionToken(userAddress); + return res.status(200).json({ success: true, token: sessionToken }); + } else { + return res.status(400).json({ error: "Invalid proof" }); + } + } catch (error) { + return res.status(500).json({ error: error.message }); + } +} +``` + +## Use Cases + +### Airdrop Protection + +Protect token distributions from bots by requiring proof of humanity: + +```js +// Only allow verified humans to claim airdrop +const canClaim = await contract.read.isVerified([userAddress]); + +if (canClaim) { + await contract.write.claimAirdrop(); +} +``` + +### Quadratic Funding + +Prevent farmers from skewing rewards in quadratic funding mechanisms: + +```js +// Verify user is human before allowing vote +const isHuman = await verifyHumanity(userAddress); +if (isHuman) { + submitQuadraticVote(projectId, voteAmount); +} +``` + +### Wallet Recovery + +Safeguard assets using IDs as recovery sources: + +```js +// Require identity verification for wallet recovery +const isVerified = await verifyIdentity(recoveryAddress); +if (isVerified) { + initiateWalletRecovery(newWalletAddress); +} +``` + +### Age Verification + +Restrict access to age-gated content or services: + +```js +// Verify user is over 21 +const isOver21 = await verifyAge(userAddress, { minAge: 21 }); +if (isOver21) { + grantAccess(); +} +``` + +### Country-Specific Functionality + +Enable country-based features while preserving privacy: + +```js +// Verify user is from allowed country +const isFromAllowedCountry = await verifyNationality(userAddress, { + allowedCountries: ["US", "CA"], +}); +``` + +### Sanction List Checking + +Check users are not on sanctioned entity lists: + +```js +// Verify user is not on sanctions list +const isNotSanctioned = await verifySanctions(userAddress); +if (isNotSanctioned) { + allowTransaction(); +} +``` + +### Sybil-Resistant Polling + +Ensure one person = one vote: + +```js +// Verify user hasn't already voted +const hasVoted = await checkVoteStatus(userAddress); +const isHuman = await verifyHumanity(userAddress); + +if (!hasVoted && isHuman) { + submitVote(option); + markAsVoted(userAddress); +} +``` ## Technical Resources - [Self Website](https://self.xyz/) - [Self Documentation](https://docs.self.xyz/) - [Self Playground](https://playground.self.xyz/) -- [Self Quickstart](https://docs.self.xyz/use-self/quickstart) - -## What to build? - -- Airdrop Protection -- Quadratic Funding -- Wallet Recovery -- Social Media & Marketplaces -- Country-Specific Functionality -- AI Protection for Smart Contracts -- Sanction List Checking -- Age Verification -- Sybil-Resistant Polling +- [Self Quickstart Guide](https://docs.self.xyz/use-self/quickstart) +- [Contract Integration Guide](https://docs.self.xyz/contract-integration/basic-integration) +- [Backend Integration Guide](https://docs.self.xyz/backend-integration/basic-integration) +- [QRCode SDK Documentation](https://docs.self.xyz/frontend-integration/qrcode-sdk) +- [Deployed Contracts](https://docs.self.xyz/contract-integration/deployed-contracts) + +## Support + +Join the [Self Builder Group](https://t.me/+d2TGsbkSDmgzODVi) on Telegram for community support and updates. + +For Celo-specific integrations, visit the [Celo Discord](https://discord.com/invite/celo) and ask in the #build-with-celo channel. From 2302a72cd5f9f447f042ca6949f0016312001452 Mon Sep 17 00:00:00 2001 From: viral-sangani Date: Thu, 20 Nov 2025 10:26:44 -0300 Subject: [PATCH 3/5] Enhance documentation for building on Celo - Update "Build with Defi" section for improved clarity and formatting. - Revise "Build with Farcaster" to include detailed setup instructions and wallet integration. - Expand "Build with Self" to cover new features and integration examples. - Revise "Fund Your Project" to include updated funding opportunities and resources. - Improve "Launch Checklist" with comprehensive pre-launch and post-launch guidelines. - Update AI resources to replace outdated references and improve formatting. - Add new images and video embeds for better user engagement. --- .../build-on-minipay/code-library.mdx | 1 + .../examples/build-with-thirdweb-ai.mdx | 12 ++- .../build-with-ai/mcp/composer-mcp.mdx | 9 +- build-on-celo/build-with-ai/mcp/index.mdx | 14 ++- .../build-with-ai/multi-agent-systems.mdx | 26 ++--- build-on-celo/build-with-ai/resources.mdx | 2 +- build-on-celo/build-with-ai/vibe-coding.mdx | 14 ++- build-on-celo/build-with-defi.mdx | 7 +- build-on-celo/build-with-farcaster.mdx | 23 +++- build-on-celo/build-with-self.mdx | 22 ++-- build-on-celo/fund-your-project.mdx | 20 ++-- build-on-celo/launch-checklist.mdx | 100 +++++++++++++----- build-on-celo/quickstart.mdx | 5 +- img/build/celo-programs.png | Bin 0 -> 227520 bytes 14 files changed, 183 insertions(+), 72 deletions(-) create mode 100644 img/build/celo-programs.png diff --git a/build-on-celo/build-on-minipay/code-library.mdx b/build-on-celo/build-on-minipay/code-library.mdx index 72e44261a..984fd45f2 100644 --- a/build-on-celo/build-on-minipay/code-library.mdx +++ b/build-on-celo/build-on-minipay/code-library.mdx @@ -60,6 +60,7 @@ import { getContract, formatEther, createPublicClient, http } from "viem"; import { celo } from "viem/chains"; import { stableTokenABI } from "@celo/abis"; +// cUSD address on Celo mainnet const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; async function checkCUSDBalance(publicClient, address) { diff --git a/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx b/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx index 96b36d4ed..1a0d5cddf 100644 --- a/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx +++ b/build-on-celo/build-with-ai/examples/build-with-thirdweb-ai.mdx @@ -22,7 +22,14 @@ Thirdweb AI (formerly Nebula) is a natural language model with improved blockcha Watch this workshop to learn more about thirdweb AI and how to create a Telegram bot for app developers to access daily and weekly stats of the dApp. - + ## Get started building @@ -52,6 +59,9 @@ fetch("https://api.thirdweb.com/ai/chat", { }, ], context: { + // Note: Chain IDs for thirdweb differ from standard chain IDs. + // Find the correct chain IDs in the thirdweb dashboard or documentation. + // https://thirdweb.com/chainlist/mainnets chain_ids: [8453], from: "0x1234567890123456789012345678901234567890", }, diff --git a/build-on-celo/build-with-ai/mcp/composer-mcp.mdx b/build-on-celo/build-with-ai/mcp/composer-mcp.mdx index 33ae89403..d47423c84 100644 --- a/build-on-celo/build-with-ai/mcp/composer-mcp.mdx +++ b/build-on-celo/build-with-ai/mcp/composer-mcp.mdx @@ -2,7 +2,14 @@ The **Composer Kit MCP Server** is a Model Context Protocol (MCP) server that pr > Watch [this step-by-step vibe coding tutorial](https://www.youtube.com/watch?v=QOCO1G8cJyI) using the Celo Composer Kit MCP to create a token claim dApp in minutes! - + ## Key Features diff --git a/build-on-celo/build-with-ai/mcp/index.mdx b/build-on-celo/build-with-ai/mcp/index.mdx index dc3e78e91..8ee5ebf6f 100644 --- a/build-on-celo/build-with-ai/mcp/index.mdx +++ b/build-on-celo/build-with-ai/mcp/index.mdx @@ -1,3 +1,8 @@ +--- +title: Model Context Protocol (MCP) +og:description: Learn about the Model Context Protocol and how to use Celo-specific MCP servers for building AI agents +--- + [The Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) is an open protocol that standardizes how applications provide context to Large Language Models (LLMs). It was developed by Anthropic, the AI company behind Claude, to solve the challenge of consistently and efficiently connecting AI models with various data sources and tools. MCP has become the industry standard for integrating AI tools and IDEs, with widespread adoption across major development environments including VS Code, Cursor, JetBrains IDEs, Windsurf, Zed, and many others. OpenAI has also adopted MCP across their Agents SDK and ChatGPT desktop app, ensuring broad compatibility across major AI platforms. ## Celo specific MCPs: @@ -10,7 +15,14 @@ - components - set up your project on Celo in minutes - + ## Why MCP? diff --git a/build-on-celo/build-with-ai/multi-agent-systems.mdx b/build-on-celo/build-with-ai/multi-agent-systems.mdx index c589ea02e..e57eec756 100644 --- a/build-on-celo/build-with-ai/multi-agent-systems.mdx +++ b/build-on-celo/build-with-ai/multi-agent-systems.mdx @@ -2,14 +2,19 @@ title: Multi-Agent Systems og:description: A production-grade multi-agent system built with LangGraph and LangChain, featuring a web search agent and a Celo blockchain agent powered by Google's Gemini. --- -import {YouTube} from '/snippets/YouTube.jsx'; - # Multi-Agent Systems Learn how to build a [production-grade multi-agent system](https://github.com/celo-org/example-multi-agent-system) built with LangGraph and LangChain, featuring a web search agent and a Celo blockchain agent powered by Google's Gemini. - + ## Features @@ -32,23 +37,20 @@ Multiagent systems (MAS) are groups of independent software agents that work tog In Web3, this is especially powerful. Agents can perform tasks like: -* Optimizing DeFi yields -* Voting in governance protocols -* Bridging assets across blockchains -* Managing liquidity in real-time +- Optimizing DeFi yields +- Voting in governance protocols +- Bridging assets across blockchains +- Managing liquidity in real-time Because these agents are **autonomous** and can operate in **parallel**, the system becomes more scalable and resilient. If one agent fails, others can keep running. That means fewer single points of failureβ€”an important trait in decentralized systems. Multiagent architectures help developers build apps that respond to changing network conditions, user demands, or even market dynamics without needing centralized control. This makes them a great match for Celo’s L2 ecosystem and the broader Web3 world. - ## Architecture The system uses a hierarchical multi-agent architecture with a supervisor agent orchestrating specialized agents. - -![AI](/img/developer/multi-agents.png) - +![AI](/img/developer/multi-agents.png) ## Setup @@ -110,4 +112,4 @@ multi-agent-system/ ## License -MIT \ No newline at end of file +MIT diff --git a/build-on-celo/build-with-ai/resources.mdx b/build-on-celo/build-with-ai/resources.mdx index 4e0bba930..1f5f146cf 100644 --- a/build-on-celo/build-with-ai/resources.mdx +++ b/build-on-celo/build-with-ai/resources.mdx @@ -98,4 +98,4 @@ For a full comprehensive list, checkout the [AI Agent Demo Days](https://x.com/G - [Proof of Ship](https://celoplatform.notion.site/Proof-of-Ship-17cd5cb803de8060ba10d22a72b549f8) - a monthly contest where AI Agents track contributions on Celo and distribute rewards to builders. -Have another resource you want to add? Click the ['Edit this page'](https://github.com/celo-org/docs/edit/main/build-on-celo/build-with-ai/resources.mdx) button below to submit a PR. +Have another resource you want to add? Submit a pull request to add it to this page. diff --git a/build-on-celo/build-with-ai/vibe-coding.mdx b/build-on-celo/build-with-ai/vibe-coding.mdx index 589da7e9d..e4fcf9891 100644 --- a/build-on-celo/build-with-ai/vibe-coding.mdx +++ b/build-on-celo/build-with-ai/vibe-coding.mdx @@ -2,7 +2,6 @@ title: Vibe Coding og:description: Learn how to set up your environment for Vibe Coding and discover tools that enhance your development workflow --- -import {YouTube} from '/snippets/YouTube.jsx'; # Vibe Coding Tools @@ -10,10 +9,19 @@ Vibe Coding refers to an approach to software development where you use chat age Watch a quick intro to Vibe Coding with the Celo MCP Servers. You can find out more about them in the [MCP section](/build/build-with-ai/mcp/index). - + -Make sure you watch some tutorials and check out some X threads to understand other people's setup. Being successful with Vibe Coding relies on your preparation and setup. + Make sure you watch some tutorials and check out some X threads to understand + other people's setup. Being successful with Vibe Coding relies on your + preparation and setup. ## Full Stack Development Tools diff --git a/build-on-celo/build-with-defi.mdx b/build-on-celo/build-with-defi.mdx index 17c94c52d..9327f3550 100644 --- a/build-on-celo/build-with-defi.mdx +++ b/build-on-celo/build-with-defi.mdx @@ -15,11 +15,12 @@ Explore below how to integrate stablecoins, exchanges, and oracles into your nex ## Why Stablecoins Matter -[Stablecoins](build-with-local-stablecoin) are digital assets pegged to a stable reserve, such as fiat currency or a basket of assets. They provide key benefits in DeFi and financial transactions and financial inclusion: +[Stablecoins](/build-on-celo/build-with-local-stablecoin) are digital assets pegged to a stable reserve, such as fiat currency or a basket of assets. They provide key benefits in DeFi and financial transactions and financial inclusion: - Check out ["Build with Stablecoins"](build-with-local-stablecoin) for an - extensive list of all stablecoins on Celo. + Check out ["Build with + Stablecoins"](/build-on-celo/build-with-local-stablecoin) for an extensive + list of all stablecoins on Celo. - **Price Stability** – Unlike volatile cryptocurrencies, stablecoins maintain a predictable value. diff --git a/build-on-celo/build-with-farcaster.mdx b/build-on-celo/build-with-farcaster.mdx index 92bbc7ec9..f79034561 100644 --- a/build-on-celo/build-with-farcaster.mdx +++ b/build-on-celo/build-with-farcaster.mdx @@ -1,10 +1,22 @@ +--- +title: Build with Farcaster +og:description: Learn how to build Farcaster MiniApps on Celo with seamless wallet integration and user experience +--- + ## Build a Farcaster MiniApp Building a MiniApp comes with many benefits. You don't need to manage on- and off‑ramp integrations, and the user experience is more seamless because your app runs inside a wallet client. For testing and scaling, we recommend keeping a standard wallet connection in your app; it should be hidden automatically when the app runs in a MiniApp environment. Our templates already include this setup, so we suggest creating your MiniApp using our starterkit, [Celo Composer](https://github.com/celo-org/celo-composer). Setting up a Farcaster MiniApp involves several specific settings, and our template provides a step‑by‑step guide to walk you through them. Before you start building a Farcaster MiniApp, we recommend watching this video on how to build a successful MiniApp on Farcaster. - + Make sure to also read the [Farcaster MiniApp documentation](https://miniapps.farcaster.xyz/). You'll save a lot of time by reviewing it in detail before building. We also recommend testing a few popular Farcaster MiniApps to get a feel for UX patterns. @@ -18,7 +30,14 @@ npx @celo/celo-composer@latest create --template farcaster-miniapp When using this command, follow this workshop to configure everything correctly and avoid missing important implementations or settings. - + ## SDK Installation and Setup diff --git a/build-on-celo/build-with-self.mdx b/build-on-celo/build-with-self.mdx index 545bd8170..fee26e07e 100644 --- a/build-on-celo/build-with-self.mdx +++ b/build-on-celo/build-with-self.mdx @@ -43,6 +43,7 @@ Seamlessly and securely verify your digital identity with Self. It allows you to ### Expanded Identity Document Support Self now supports: + - **EU Biometric ID Cards**: Scan NFC-enabled EU IDs covering 27 countries - **Indian Aadhaar**: Support for Aadhaar verification - **Passports**: Continued support for passport verification @@ -52,6 +53,7 @@ All verification leverages zero-knowledge proofs (ZKPs) and no data leaves the u ### Points/Rewards System Self has introduced a points program that incentivizes consistent, secure use: + - Users earn points for setting up Self Pass - Points earned for continued use across partner platforms - Points can be redeemed for rewards @@ -70,6 +72,9 @@ Self has introduced a points program that incentivizes consistent, secure use: - Node.js 18+ or a modern web browser - A Celo wallet (for on-chain integrations) - Access to Self SDK or API +- **Self App**: Download the Self app to verify your identity + - [Google Play Store](https://play.google.com/store/apps/details?id=com.proofofpassportapp&pli=1) + - [App Store](https://apps.apple.com/us/app/self-zk-passport-identity/id6478563710) ### Installation @@ -87,6 +92,7 @@ yarn add @self.id/sdk ```bash pnpm pnpm add @self.id/sdk ``` + ### Basic Frontend Integration @@ -151,12 +157,12 @@ import "@self.id/contracts/SelfVerification.sol"; contract MyCeloContract is SelfVerification { mapping(address => bool) public verifiedUsers; - + function verifyUser(address user) external { require(isVerified(user), "User not verified"); verifiedUsers[user] = true; } - + function claimAirdrop() external { require(verifiedUsers[msg.sender], "User must be verified"); // Airdrop logic here @@ -261,16 +267,13 @@ export function SelfVerification() { const handleVerify = async () => { const qrcodeSDK = new QRCodeSDK(selfConfig); - + const qr = await qrcodeSDK.generateQRCode({ - disclosures: [ - { type: "humanity" }, - { type: "age", minAge: 18 }, - ], + disclosures: [{ type: "humanity" }, { type: "age", minAge: 18 }], }); - + setQrCode(qr); - + // Listen for verification result qrcodeSDK.onVerification((result) => { if (result.success) { @@ -427,6 +430,7 @@ if (!hasVoted && isHuman) { - [Self Website](https://self.xyz/) - [Self Documentation](https://docs.self.xyz/) - [Self Playground](https://playground.self.xyz/) +- [Self Staging Playground](https://playground.staging.self.xyz/) - [Self Quickstart Guide](https://docs.self.xyz/use-self/quickstart) - [Contract Integration Guide](https://docs.self.xyz/contract-integration/basic-integration) - [Backend Integration Guide](https://docs.self.xyz/backend-integration/basic-integration) diff --git a/build-on-celo/fund-your-project.mdx b/build-on-celo/fund-your-project.mdx index 73617847a..6871b8d96 100644 --- a/build-on-celo/fund-your-project.mdx +++ b/build-on-celo/fund-your-project.mdx @@ -25,25 +25,29 @@ Here’s how you can get started: There are various grant opportunities for builders in the Celo ecosystem, with funding available at different stages of your project. To maximize your chances of receiving rewards, include your Karma GAP project profile when applying. -1. **[Prezenti Grants](https://www.prezenti.xyz/)** +![Celo Funding Programs](/img/build/celo-programs.png) -2. **[Celo Support Streams](https://www.celopg.eco/programs)**: Submit your Support Stream application and earn bi-weekly CELO incentive budgets +1. **[Prezenti Grants](https://www.prezenti.xyz/)** -3. **[CPG Retroactive Funding](https://www.celopg.eco/programs)** +2. **[CPG Retroactive Funding](https://www.celopg.eco/programs)** ## Ecosystem-Led Funding Opportunities Expand your funding sources with ecosystem partner initiatives. -1. **[Proof of Impact](https://www.divvi.xyz/)**: Automate gas fee revenue splits to fund your app. +1. **[Celo Builder Fund](https://www.celopg.eco/programs/celo-builder-fund)**: Funding for builders in the Celo ecosystem + +2. **[Celo Support Streams](https://www.celopg.eco/programs)**: Submit your Support Stream application and earn bi-weekly CELO incentive budgets + +3. **[Proof of Impact](https://www.divvi.xyz/)**: Automate gas fee revenue splits to fund your app. -2. [Builder Rewards - Celo PG x Talent Protocol](https://www.celopg.eco/programs) - 10.000 CELO/ month +4. [Builder Rewards - Celo PG x Talent Protocol](https://www.celopg.eco/programs) - 10.000 CELO/ month -3. **[Commons Builder Income](https://www.commonsprotocol.xyz/)**: Apply for CBI and earn daily rewards +5. **[Commons Builder Income](https://www.commonsprotocol.xyz/)**: Apply for CBI and earn daily rewards -4. **[GoodBuilders Program](https://gooddollar.notion.site/GoodBuilders-Program-1a6f258232f080fea8a6e3760bb8f53d)**: A year-long initiative offering \$220k in rewards for building with G$. +6. **[GoodBuilders Program](https://gooddollar.notion.site/GoodBuilders-Program-1a6f258232f080fea8a6e3760bb8f53d)**: A year-long initiative offering \$220k in rewards for building with G$. -5. **[Glo Dollar Liquidity Flywheel](https://www.glodollar.org/articles/glo-dollar-and-celo-public-goods)**: Around $40,000 will be donated to Celo Public Goods, thanks to a $1M Glo Dollar (USDGLO) holding from Mento. Projects that increase Glo Dollar liquidity will receive more funding. +7. **[Glo Dollar Liquidity Flywheel](https://www.glodollar.org/articles/glo-dollar-and-celo-public-goods)**: Around $40,000 will be donated to Celo Public Goods, thanks to a $1M Glo Dollar (USDGLO) holding from Mento. Projects that increase Glo Dollar liquidity will receive more funding. ## Accelerators/ Incubators diff --git a/build-on-celo/launch-checklist.mdx b/build-on-celo/launch-checklist.mdx index 37b8520f8..23f733ac8 100644 --- a/build-on-celo/launch-checklist.mdx +++ b/build-on-celo/launch-checklist.mdx @@ -5,47 +5,91 @@ og:description: A comprehensive guide to assist you in launching dapps on Celo. A comprehensive guide to assist you in launching dapps on Celo. -## Integration +## Pre-Launch -- [ ] **Wallet Connect**: Essential for Valora integration. -- [ ] **Security Audit**: Have you finished this? Remember to publish the results and the auditor's details on your website. +### Security & Audits -## Reporting +- [ ] **Security Audit**: Complete a professional security audit for your smart contracts +- [ ] **Audit Publication**: Publish audit results and auditor details on your website +- [ ] **Code Review**: Conduct internal code review and testing +- [ ] **Best Practices**: Use audited libraries (e.g., OpenZeppelin) instead of writing everything from scratch +- [ ] **Test Coverage**: Ensure comprehensive test coverage for all critical functions -Make your dapp stand out by reporting it on these platforms: +### Smart Contract Preparation -- [ ] [Dapp Radar](https://dappradar.com) -- [ ] [DeFi Llama (for DeFi & NFT Projects)](https://docs.llama.fi/list-your-project/submit-a-project) -- [ ] [Electric Capital Reporting](https://github.com/electric-capital/crypto-ecosystems) -- [ ] [Celo Scan Contract Verification](https://celoscan.io/verifyContract) -- [ ] [Celo Explorer Contract Verification](https://celo.blockscout.com/contract-verification) -- [ ] [Dune](https://dune.com/contracts/new) +- [ ] **Contract Verification**: Verify contracts on [CeloScan](https://celoscan.io/verifyContract) and [Celo Explorer](https://celo.blockscout.com/contract-verification) +- [ ] **Documentation**: Add clear tutorials and documentation on how to use your contracts/tokens +- [ ] **Upgradeability**: Document upgrade paths if using upgradeable contracts +- [ ] **Gas Optimization**: Optimize gas usage for better user experience +### Integration & Testing -### If your dapp has smart contracts +- [ ] **Wallet Integration**: Integrate wallet connection (WalletConnect, RainbowKit, etc.) +- [ ] **Multi-Wallet Support**: Test with multiple wallets (Valora, MetaMask, etc.) +- [ ] **Network Configuration**: Ensure proper Celo mainnet and testnet configuration +- [ ] **Error Handling**: Implement comprehensive error handling and user feedback +- [ ] **Mobile Testing**: Test on mobile devices, especially for MiniPay integration -- [ ] Add a tutorial about how to use the contract/token, etc. -- [ ] Best practices include: using Open Zeppelin contracts and not writing everything from scratch as this could open your contracts to vulnerabilities. -- [ ] Consider your options for a contract audit. +### Analytics & Monitoring -### If your dapp doesn't have smart contracts +- [ ] **Analytics Setup**: Configure analytics tracking (e.g., Google Analytics, Mixpanel) +- [ ] **Monitoring Tools**: Set up monitoring and alerting (e.g., Sentry, DataDog) +- [ ] **On-Chain Analytics**: Integrate on-chain analytics tools (e.g., Dune, The Graph) +- [ ] **Performance Monitoring**: Monitor application performance and transaction success rates +- [ ] **User Behavior Tracking**: Track key user actions and conversion funnels -- [ ] Discuss potential extensions or enhancements. +### Documentation & User Resources -## Training +- [ ] **Getting Started Guide**: Create a clear guide for new users +- [ ] **On/Off-Ramp Instructions**: Provide instructions for buying/selling crypto +- [ ] **FAQ Section**: Address common questions and concerns +- [ ] **Video Tutorials**: Create video walkthroughs if applicable +- [ ] **Developer Documentation**: Document APIs and integration guides -Provide resources for users: +## Launch -- [ ] Guide on getting started with your dapp. -- [ ] Instructions on how to on/off ramp for a seamless dapp experience. +### Platform Reporting -## Marketing +Make your dapp discoverable by reporting it on these platforms: -- [ ] Complete the [Marketing Intake Form](https://docs.google.com/forms/d/e/1FAIpQLSe0LMpEy2nicTcdoI5_LFhg3VZbpyhTymmSTzZ7HavdRiE4AQ/viewform) and share your marketing strategies. -- [ ] Join the Celo Founders Telegram group. -- [ ] Remember to tag [@Celo](https://x.com/Celo) in any launch announcements. +- [ ] [Dapp Radar](https://dappradar.com) - General dApp directory +- [ ] [DeFi Llama](https://docs.llama.fi/list-your-project/submit-a-project) - For DeFi & NFT projects +- [ ] [Electric Capital](https://github.com/electric-capital/crypto-ecosystems) - Ecosystem reporting +- [ ] [Dune Analytics](https://dune.com/contracts/new) - Add your contracts for analytics -## Legal +### Marketing -- [ ] Ensure you have public-facing Terms & Conditions. -- [ ] Make sure you have a public-facing GDPR privacy policy or meet other privacy requirements. \ No newline at end of file +- [ ] **Marketing Intake**: Complete the [Marketing Intake Form](https://docs.google.com/forms/d/e/1FAIpQLSe0LMpEy2nicTcdoI5_LFhg3VZbpyhTymmSTzZ7HavdRiE4AQ/viewform) +- [ ] **Community Engagement**: Join the Celo Founders Telegram group +- [ ] **Social Media**: Tag [@Celo](https://x.com/Celo) in launch announcements +- [ ] **Press Release**: Prepare and distribute launch announcement +- [ ] **Content Marketing**: Create blog posts, tutorials, or case studies + +### Legal & Compliance + +- [ ] **Terms & Conditions**: Ensure public-facing Terms & Conditions are published +- [ ] **Privacy Policy**: Publish GDPR-compliant privacy policy or meet other privacy requirements +- [ ] **Regulatory Compliance**: Verify compliance with relevant regulations in your jurisdiction +- [ ] **Disclaimers**: Add appropriate disclaimers for financial/DeFi applications + +## Post-Launch + +### Monitoring & Maintenance + +- [ ] **Monitor Metrics**: Track key metrics (users, transactions, TVL, etc.) +- [ ] **Error Tracking**: Monitor and address errors promptly +- [ ] **User Feedback**: Collect and respond to user feedback +- [ ] **Performance Optimization**: Continuously optimize based on usage patterns + +### Growth & Iteration + +- [ ] **Feature Updates**: Plan and execute feature updates based on user needs +- [ ] **Community Building**: Engage with users and build a community +- [ ] **Partnerships**: Explore partnerships with other Celo projects +- [ ] **Grant Applications**: Consider applying for ecosystem grants and funding + +### Documentation Updates + +- [ ] **Keep Docs Updated**: Update documentation as features evolve +- [ ] **Changelog**: Maintain a changelog for transparency +- [ ] **Migration Guides**: Provide guides for breaking changes if applicable diff --git a/build-on-celo/quickstart.mdx b/build-on-celo/quickstart.mdx index 00eb050ea..4f6fcfedc 100644 --- a/build-on-celo/quickstart.mdx +++ b/build-on-celo/quickstart.mdx @@ -80,9 +80,9 @@ A specialized template for building Farcaster Miniapps with Farcaster SDK and Fr npx @celo/celo-composer@latest create --template farcaster-miniapp ``` -### Minipay App +### MiniPay App -Optimized for building dApps that integrate with the Minipay mobile wallet, with mobile-first design. +Optimized for building dApps that integrate with the MiniPay mobile wallet, with mobile-first design. ```bash npx @celo/celo-composer@latest create --template minipay @@ -183,4 +183,3 @@ Join the [Celo Discord server](https://discord.com/invite/celo). Reach out in th ## Resources - [GitHub Repository](https://github.com/celo-org/celo-composer) -- [Celo Documentation](https://docs.celo.org) diff --git a/img/build/celo-programs.png b/img/build/celo-programs.png new file mode 100644 index 0000000000000000000000000000000000000000..06b66887e8d8023a8000934df11a353d30a603f7 GIT binary patch literal 227520 zcmeFZ1yEeuwl<1ua0tN(5`w#XAUFhYvTkD?hq_UaQ6g)yE_Dj#;tK)lPxEE zpMCD-R=xk#t$III-Aj7Tx#k$-8#?DAL|#rD1qmMs0s;a>QbJS_0s_Gf0s>YP0SCN#29p&Krxo5W{nqil(TAh(aY4Z=Pc94&f)n_LDh6v1dZsFcB_$0JM5TJ|MxD zJ*o0$Jg|ZiozbzEH@mI8Z+%LiCBXmz5#q}w`x1BUl?OURlO$=}I;2qSt3?m9bmb5= zkz#T`)K^-$9e6bJIUS}n9=Ss=7y^-xupqj3JX+|WA;PV?E01CEDNOka?7Km5W{2bpNrY;(UU4hJ%X2fD@xHZ3z1o;K5bmu(J%8_qN$g-8l$_O$=C<+ z=$We=U1>%n#xe9aQVxGE?T=U(i`Ghs45*5;Z8uqlD||YH9d77qA!~s0TMjCN7=5^n z<|KwyyQ|Ah4~+~osaxw0yDkw@Bx8fvM^|UeUB3NwqQM2|@N1!1WTcZmT(8oJ2qvv# z6r*~=pOr;ZzmF|f7ox+G^u1NNQa5d&dzrW7WnAJx>a;7GmxwzOS-N4^8SvRIfFI-V z`X;FS-2xdRm6wn>1qrSIdZ;`$`sWWsRG}0{yKFq8`v-jN{RN;{1Y^IBWs?mg%R;yUez(2J%Fuvof3p{Zj+ zhd_3qzegW=%Gu^=!^lUdbNkM*bEd9Kh;V5S@eQJ-zqmhvztgug$(2_#=!{*yPM=A} zGcu}3PW&{5W!2_MK!H2*c*ZMmZII4@6B`>{u1Z>i`dcsB%5V6eZfg;|TwdKeVN)SV z;fWn(Pd_0l(98e9^Z8T%S>&a{Wim&i_5Qn|;mdkK16_o&oDC)>g$|3M-^D!+roJ^WB8G(rd&&J_*~ zGO5u?T`O&jfx+Kn5D3M~QqxkkA?3Zil}l?mM?9Bs{AZ5SQto*n7Q5Wt-6K6VUqwQf z4H30qqIz#yOdpPYf@`~MhYFz6{r;mD8M1|Y%LcR!t^W?y;vL^$8;T30AUeV;VTxdA z$#-O@0$3&Xc!@|xzOI=Fu|DhXP+r2Pw5iI&I{DpZ60-qfmg(wXN_+^G8MOF`mSMNx z4%&=ige4GA^hmFQ5#NVQlMf;g90@~3+fcwszEX^SBI^4xDyiEe2Sy_#mRvK+%z(u1 z8Fz@5&}8NOg!C7rqiwB~OV;>k(cvsPNa4V4yspAR*VK6eRb~Gf||YPLGxN5XF*K5mpgC zDp4=9o#~Nhrtqa;ah%KSsUvZ9*js6Sk!Eqv?7Tdqyp61e)id0AL z%#)uEvMB=lhKaJt zxT)5Ji)8*V{Wjs1s2gN+te1~h(qgXUNY&_?*)hAZxvB~AWK-@;_V;1@T%3ZqqH0m| z{7Kj^o3j*_w0lC9S?5rDUuN^GNLZNyx&8XknKoE!mZt`aPZ5-C=2MN* zPR?aJiyXuVNDImfYI+BFHQ#wc&$kVd&b}-BD(1%ur`_%t=#GN>gps(#`@%Z#b5@#O z*pDaeUjpd^`NcZLzKSVkJBsCpHH0N~dUa}a7KKORIVUs8c*u0TD3Xmxx%oP3Xsga$ z%ra@JT3e818eH(rA=I>J+nCk7(xviMCBG49pkTw|#NlLOV_;+9>5HfO^hR&T)o+X> z%MCP*-j-DJ8DB2;&eDvSWvMhz*qig4r#k{1!_W8$lEX^}uv4T`fHk6;HI_AdaC5Xy zpVNx8^RxpN4Bf{U2Xri2zqVMy==pac^aS@})Dn&paiLzKvZJCAB}M#*2#7d~U=)8F zCPQ5Reyu)wDOD@YF13bxfhd=s#zFbV=T3#vw7pc=L7c%U@i8&@@O0J&y;E9TciiYc zv4pvjCsXAm$l58|tqt{!J@aM@JPY*mN()nsOYebY+0)X~oBRmGcf|I5$$SEC4Xzum z`=Fb?zOS@%=J``6%#-?}`ZeLMyOtXRpv9Gi{q|$Yvzgtoee<0@(3exsHRFA%)46?6 zn0{Z+%I-?jsq=BdCCRb((AnDHN;*OtlrQuL=(o_-(5ujW&?GQPu!b-bFpltza6Kov7sQWLi<}U^8S%O+FhZOCT*u$gpW>4M zrsy%5+Uv#0iil)PM~dWUL^#?Qw`@kr{r!pd{XQ&q*|Hk;j1kwE&5$-*HG0D>ACLt zr83^>Khnx+vRTJCE7>Zg`*9LNbqxayEPLHDh?1Jg8#$?%jo&bEbFzcVL^VIsbMw!* z99Q*ND!Q9SS9yNejAd79Fx0EqvlA5%UX03z_CD3b=J=3-jdtRBOnWRSBb(^a+P6$u9kvAOrQPMTpBY7Cz z7fS==0%(z!2H&JE)wP*?orjI|M!GA=lgO4(buiDG`X(EC_Ssi zTD4hC2LcomMrF+l%yG=;`o8tyPihovw(Lv08eN7X-GAT*qD(RB+V45twu0 zS<=j$npV1;?9qSK+@bkGBVCJGyJ79wK(9AfuRGnUY|S~XQ*jGK?TI)qOe`Fm*q@l- zMR8^*5;n(XPis_k(w-qIYs{L=a_S@ANdMUUuJru@$+aSAVV^%CM*XivD$4~WK$ ziZk`xaSYf1WChLrvt`?NGoT%J1{cU!uU%+vYsr0D z1S}1DyYLps(5P!ww_=-HZYeWYUeu!YMhCgh>73`_DwhC*bJnVJsmYUeUG>`X$KIy1 z-G0**{eA6_^X4M?JZ(#= zs{Gs`nRFFFXRpO^ym8m{$Rlrurl^*Sd6m=r$qbU{ty*uw z(X|&WQzqYR4)mcLJVX@*#IwVB38GRSl5-qU$Gkm}WkJ0Oyo%B~NO|P@?d-l`2spo7mjJdBX)XDl$(@KJTZ66py8)4RkYiN z&vi9NeD|$6i}=9V1&qF=i2M^22uLgF)dTSL2Sas9BUxDp8t^#+1PmlT1T6Rr68sT> zB>3}O4Duxe^w0ZH5D-D85HP>Dkpmwe{-VI2hd#d@p+5#fz=N+a!5^1Qs6SdG*kwZh zaSkgA{tZG{Nkmc-d{ol6Gc>faH?ekL%A9@yzJX{XpP5j*ri_9pUy>gZ5R*Im@(=WihBfk$pH_bdM%Og7S3` zg^6Fx!F4Ve4J9R|d2QkIApjWUw)Y-X2y(kU7K@P`G%zxDW@V~8$=Do`0mSAzh;VTG87<8fk{)=l3Dga@PYi-kq=n<_Snpi+Wao3?gW^5q{00jnV6uG1v zOd|jS3W3z;zx_h*{>uK}xB58{MF<3dP|}WU8s$-h3i$}3mOPFpLZp%~2x}4_vA$Y8 zV#*IqVC-yA9@$iqOo&wcV=96Z^y4N&8s%sH-;435>?AP3qWQQcT1M~~R)gmYAk>0> zTvMTs26jZ(ok37a5sIMT#@K~>6hugcNa3gcTOj==jVKDRXefF@ z-f=z-uMg0MdtB513+;cC!GD0Z1TH}E4z%RJJ)YQg*>%v`r8Oi4R#{RU7$hPu7n)t8 zt!wqIGV)iYF-RDHfs8mA^{;Cd9x&S|%D!VdYM@&aPnCUf;l)n4#lL-dTEy5-CrQh#N2ofb#5QYsgQx|;p z6)I#FBx2`#DgVpFf5Vgw?6)TZlA>)gpRc>nRrXztp?;ekJj1hU^ZU{8Hh0?Q|XEz@t$5ky83a;Z7ZpUZ=@r-VjT>Otd_O zQV@XZidfveo%liXx&!$iMD(ZGmT&~@@#@H(iEx=*x1tm!PV%DqzR7Bj46aA(X<&)A z?7QSPvP?LyLFU~XhjCvMpJ=5A5PC)O4Vbodenpz>9z(6bfU-p}S(Ywr`j9)^lAKqt zX0h)+%=cANn1)W|&*%Kketi+-)kz+k{`{{X0OQy; zzI>-?Z4pfwB2e7N?=}r)ySux~pt+9aVN-r`JEu-a7`d1GSw4B3Um0rPn+k8ZDUXVb z=jUh-WG>4iA1>d^X8?Rbmu$T_P4QtC#kt=oBGqiOFdx)e&ET1~9LAp(mJhlo zgc-o-#>iRG;ILbh;Ph#)wh^zWjt2~E)ymE zYRdlRW$eh8tD@J8QVgh5Xu_9tN|jIZZu{NglEg^sVXML?OoIsdojgo57i+h~6h!3?4vxwi5mKKUoo3!X=P z2>)Depj7^RjxXKUM$W{UX^7^xrafd#JEcCTmI=t&w_$o}6+?6Y!uZ!#&|Ik`UPQcA zSYASgx-v4)eS|KcLJ&Unm@>9s1aagK1y>713v-nVaGES+)ga7L#XtXx?&&~oa>qGq zG|1rk!)>?>st5~o@o9!{B4z%|BJ)7WO-9_nIiU|f|9B1{Bo~heGe^K_)*Ed@@wD}e z=Fxq+OASU?6e?5@*)o-dny*pC>lo@pYWLDasT_zYZ!*WR?0w()x)@?(Cf7(7ZG4HC zA5RXQQ?D!ADwF0@%3=S6=Yy%SDT8Ix7uN~WlLWnss6t))tdt+I#uoMgtL-bauivfl zz~)~G_$M|Z>FU|vJpQBAGUYw=e-GVW-^fcfRz0tc9gsg&eB=dbDsu0(P=?L-g@Dzd+ zN1hO-72mr&f()>)Sb??U-IZ#9vCnz^+ta^AUkC~aK>piQ|9w6H6R7&0!D!U4gs=ip z#3ZPB2wwHYvP4 z_Lfk@w*X{uEqMG6X6MP%;B~tHp5x&vB8Zk1`O(%P~0_^b1$mRr_Nnt zLVk^Q{=*PI$)u)6r%lW@==u0DDJkh=m*Ktx0O_YTSS&P5IEP)I?;j1Y{t@Z?*NiFn zIaKD8a>aMxkS0($iPO9Ro6*VMOviJV{V_Blh$3_#ZM;MfDaH;KLJd?7sk74fujc;8 zbc6snFT26`Ba3P$RLs>6avJTqio|`?6R~9gSK-OMHAIZ!gjzixDJfZ5S>L-B(n(wj zMPxo#Ip14|p}E_odem5J3Z!qD#A(pVKOO@J1CVjg)8r~_FSrtg|Bm~A(5lQfB#T-W zyYWgE`@~Y^!QSXm0HMJu6XWZRzlO#Cj4265fP#Kkp9xU#B(6|{TahQq&w_Bnu$%8O z^WLVi>4|$yj>@A_X_sR`3O~a|RwDfLuW0*&(|?W9qT-=oscFRlh-+KZS!oUxcdP#? z#Qf`M+f?$c3Q99ItAhJgr<)lZef4yA+c0uf*w$go{8h&PVKQyH50vvb@6%~F zI7qsYgKHLd*yVozq4i%`5=8)>djvQfmohRkvMS`JFjS(6%C`COO@QLjvxk84Mub5r zt?<6T%K=Fy2}M}W)kuP!wr3`c-6K^M0?-QMTVZElXebHJ8$QmyG=%!Y@-rB9q3-3x zoRKj8v!4FlFSTJKAgyi9*H=1hkAA01Rz9J|`qLSOijxLOe}#FB1|z^AXxSMmERFug zn>=fciUDx$W?}4q`xx5;0g#8;;WVR}b86b1d<}kT^nD1}p+`4KO$3q>EH4iEreGA6TK7d*?`P0zih)+OE)hcRmAs$Q@^%W>M9 z72t#7_8{zk6u^9*mo4C{=BBeZeE@-JQ6rBWGa?m7G?$30pB$!X`uF(dAJh{99McE` z2sJb`6hDcEn4}OMuTw`y>#uc3e~ga)@!oNFSdK^I{^*fq*7t}%g=6+WgKNt3C~|8n zi^teWp$6nc0AU)hb3B7~0|mXbl);~V`85Ukqp{I}{(0$hfyLZWg{H3%Y695-mJw-J zlg3!COL@wP&T~z&f3!4z)jS`ew-3btpD`J5f-GNv`AmZ!*#Y53t_+Pk8W*-Ki<8=FVQ{H!vX@b8Ign-|97gv?>iF0>>*5dQbnxxPQJ} z!31-YA#WasEQ;J&CsyoHS|tbzu4K2xEu*ZxRM<62;x%`J5(uDqOh6%&nThy7EUVQ2 zgxLSj1a1Jujp-v5_ZY8{0{~aL5xIK6rC^A-N6{_;4X&bL+I&P@lYpR6d5n5Q!97%( zmnpEiqalX)e{pNW}#Xryo)4h5)ePf}Q9ZGB`Mi5-vdf=UCt`F)V=XAu?EtktG%H z&QuQiC)e?}dqVhN*N$=A1NJ=z@`eAlfbb8`1TQxstRY+)V0B}#yqtK9p^Xv)dqjVa z3dA)8yx5(;O!yzhe+XtI$iZIsmB0+R+Y>3rM|t*WFngb8Sb)31>Vieyoy60#xDSrmNf%&_R@r8A)nrNtW2;vieQ7$M1==k*PWAFTFHr^{ z;q)Fc30|JEYLuBotDG|xyj>UIzHe&XtV4kvm0kuy>q?g^8qWJIR(a7+g%o`i{RDdv zAyvh6M*d4qAXEqrdohlaz=84uTu48(dEZ~_x({H86Jq4Tg#IygfG>Fzvr%yv9_NTa zW_h+)_ky!39T$98bO$Aq-YB-K-P+6AUFf|ziA{K(x)WinC6DXySZeS5o71tO^PMp{ zewBE74N~I_M^$;-_}qfFO)kCzBP zvG()?4HcGs4X{lfMih5$7{Tb{@K4)^-VoKui%xh+>HdBsy4t-7a-K!i6{!OOY08fQE zh!_N2+MM^9P9ti25MI{gMS>Ci+?A?q3X5=WEW@5=r;Ho2$K`~Y;>zTlw*Q7Kf%MQm zTH}cfY1B)|mTXK)>E>S%E{_h=FNDgUcY6(@+RMVZYImdDTh!nMn~meNv?Z@=*-61# zg^FTkZ(SE#^JP>s^sdSxHJB28y<-nIz$z3~ai<{xvjRuz= zR4U#bVJ<-rnW*f~r7Sekzr~BE3i9EMBG>k{sX1`b5Q`+R&hUxYo0B|x&q>wQ^N#U% zBe9%`a7x0ZZZw#*>81L~t8wSR1O=b#xSM=osP_OyWMy4V-eBSCY_vwiSod`ok#q5` zn_-Z361TnDI?eIo^|ePRJjxcWquJykz5a`4*gNa{AjP}E-Q{%m{T3y$NW%2RmxQ;% z7|XmnnM^0of0aVir=K`l0h>BJwuFi8i^9+Zx;X9=mM>XK0uk=OV?*nN9<0tz?R4KD z)i#1|j3MY7&>uA$Y!84JG+a+{{hLPkhU*C;yWR4x zh7&y*i}@yvKvV)f&YL&SQl8_`Dt9|qKM6^&e%0t(L&T%;m5{(A4u{bxray(fy|$mX z5|rk=mQFL#9J;%Gd1BNP&N+`>o(j87`%Z@zhc-3=QC~cl5kcHb9;P2Scq!kKO^CSo zhgLoqThaw^8i;U-1a=b!!(2tz`_~5sqp<~(-eY$2pUmRib4^zR?Iz;Xdi!{FqciSr zE9c)9Dt~T9wVy{sT9XD7nuSAIC~nr`#L^Ki9!^A+-6eN8!DT(^P+@l=`g?IZ^BuBF zkm?BeLX%!vDhOmR!oL-v-O$@RVZO&R#C=WYsuv?@L&`|9al6oIgW`&TeR&hgm@{s< z?m+;&#JlTQW%foxb-O`K;?R$`ZhXsL*yGdUxfV;@i*SBnVQ1)!_bUp~c+TleQy8auxwRCY-&si~JU=>yeOh)DtdMOu@87eZ{9xBO ziZ!XJ2)%t9`%{Ny0yyJd?rF{gql0oaVmez4`$;pQ7%dlGprq8;FekGWGd8=Q*=!~W zky?Q5#J8up0>3KT%ix~~RsCt{q#RrCu0r|7oAZm`Rx(J12;%D6+_{c6nd%qV>8>ZD z@#w35>&?MBvO*nmkGqyuY!hR{k7C=y*C}x69nsy`7)-qIOZS zS0~;9KBgTN)^OE^<2h{*`B&cGj0vpnyPJ+47C!wd_sozBqIYn1#oG1C49#npAl4I> zAGZtf3}DUtPCd&Zcz2Nod1)*Zc7Bac0KP9DoUw7-gEP)n zu3Znn&6NzDRG9oQuTt(iUZ}A^%(8yiju!bg0;hoLu#fRRo@{C<6-ea0J3>7AS=gyz zSxe0(m;<4=^T#gIFY(^3Y-kr%}vLuSTGi*@&Yd!|O^?YEg9(_vWa(9Zjll zV_@DbQK*f!%;LM$_OZOPv%*38Late<=mRYCJ?JLktfQidccw zL~`}9&}IpSd8n3WoJ=~C>YxCyIM|U+LKfh8eq78(6U;8sT9YHO7+XgI_vc5klc zBRsDmh$U2&At}D=fl^~Kw^bg;lRqk4J>*Q@KghO^w)FQ=Wq&h2HefI_L311Nu}exV zxktmn*cvpQLCB+Cs9HaiW();j0!I@_N-+(;hJTr)$PdxP4CR9{dO6X2F{)}h zUTnDh*0Zi42{(dkCAjU3j_(30rPd-Ek9D(KMNRwpLW9889C#bqg~)?%_qbe7u=|GC z)kle|OD9h3nxnnJY91W>A#VSSzvgiUW(?XWkhAjf-F#Z@DbPId%i2VUfH z9mI9_{TU4lk-^57YEh;&I@t@p9}m`3tRG$2_jm>_jfzhV5`k4S@OY%_zQU{2^JRv| zaly@|;C*@ECYMx1O<)=C4}YxUCoYuwa0uW`3D#AjiD?i}8-bB6)>nrZv+x=}>gdMa zoc>yW-f*L13ce-&eQxi?Q_#Vj=FU_BI5czXb;^#Kp-+@|Hcc!c=%my0TFdtkup9#N9%k|&~c*;zXAh+!?YacD! z%XJn5c|q>=H6H?FOTv` z)^AP*W02PSdJFPXcW$S(Wbdz+?&FDgoqJo0gU)q5&#F^xZfx!1(=;{rH z!C7iK@3GshqTENBe|Q=f%0NdKMC6p1FS;YsiPiCg5am~;tb-b|oTZ?jbFe{U+7&`Y zDY0BE{9>_q?0b!OBr~tjk}5;U$x~+1fD(cm9Mu(oKkOl$blmbK2$h(Wy-?+hp4AwR z|IS|~g}G1LV{pb;V}@(84lufp^aA}5p?{$Nqkt!Topi;g#Y?sq30eeAa_~ zf3r}_Fd24khR4At@|5l^rb4k;^>wb*Ub5Y-yUR2_7J~CLTfL}EU!@umg-|*hdY%WXC(%^ea`$$zQs&(A5a96+s1b&M7yA(z|eR)S{LkfdxlFZf6a6`w{-VZ?K1OK^YwXxYtqSr3Vu|%>FsPHVB8J0 zZ_zfPF*mLtPf``Oi`lFL-f@QwXj+Y4)4)+N*ei1LsR0x~3*nF`4w>#lAkE>} z8^Ip;gI31-o8^0hCBb`YU2jhzIsP+jYKRhdkVB?3i-0#Tao(7#Hl;>$+A%Q(+Qh>)o2!Px^Eij&+x)PwPhoGl zoK_%zpVu;3kxZH69=UjY27n&S<8I+JpO+`z8djC#`_U0xVMH1vATtRO&aub)I`)jg z#cY&|R>hfmdwTu3My;1$v(%9OccgX0p3(KiPZe&L?`gAp)>{k<1nj}9_x6qm2J788 zxBY8pKINQlhFmCB2cZRmLs)Cx>N&PuD zu%C5xwkwQT->|l zs4D$Wt~)`qR#2W zQNm|!Zi+K6(5-WY>B&=#%5x1+lHzbge;W6|PMZpy2~OWHb^-k2#6x)l>1V2dJF(}n zj+4agZZ-ZxHMNkZ%G}a$+63MH0?RrOWx?v(^b=a2OkbsdgWCnrVqD|Fmkow7I#OO8 zx5YG&Tq4?XGtf7WV6uoD9Qg%b2^|NKct;)M9E9+0y>ge4OJRA=#2YfnZgVKFQFoD) zsoi6nL=3vg-|P+uU_6YQ&_Q!nX<5>q%u}&X;s=@PE{C87*ntyy|~VbzS6-gIC^Wr@(K z7O4!?TDKFEP)zKXu4oz!nm_>HDpGB)OzpzXH2DM>iKOxsDpjqR!r(r>@izNdDz%3L zW~HD%CPkUvs+j4-Ib^L@^ANRCLly7+oOSDr2G-E^b-ltt{`@y?8Iu=)UXYsof!<2b zw?vV+^Bv=O`UJy1wcbHBT}NQc@rS;>CxNmAoZS;;DGia?T@fc>?S&ZKtBs47LvtvD zDrNZ4APo(N5{)<6Ty^5+xj9J)4efP*>+HIBHno0#?)_5N<0#kCV^YJocV<#PbqbsQ zBM`WFY2i5qG&q}eR9(1UzgUf^JwOXx@KB0KBW!Y{7^^Z8O6IVy!C7Nl;2&!6=3H{f zuCgAZnZkoS<<;U1-gR-!k28Fi;rV&6-fE;c%w0)|6a%Xr+w?k~SBs zk|#`tzwY8GL5+Pkqgg8|ZS1M-NySsjH3(U0F&ykajw{NspRyV(K5N@i2Lkp`ofnga z;VEWMjs|KMou1AdtoJQi@n>GAc-)k}fpUL6S)?Qlce=Ma*O`RJ=a49qCNP#%y>te7 zUB8)1Kil{oSkrww4DW}`x+%u@*>WyRX

hq*6lRtht?2J(VP|H32WSs5~@?`q_MA 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�aXpn-cN@K#ItHNlr_tM8O; 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 ddmO2EZ_#OS&B2zq<2Ql- Date: Thu, 20 Nov 2025 10:38:05 -0300 Subject: [PATCH 4/5] Add "Scaling Your App" guide to documentation - Introduce a new section on scaling Celo dApps, covering infrastructure, RPC optimization, caching strategies, and monitoring best practices. - Update the documentation index to include the new guide for better accessibility. --- build-on-celo/scaling-your-app.mdx | 298 +++++++++++++++++++++++++++++ docs.json | 1 + 2 files changed, 299 insertions(+) create mode 100644 build-on-celo/scaling-your-app.mdx diff --git a/build-on-celo/scaling-your-app.mdx b/build-on-celo/scaling-your-app.mdx new file mode 100644 index 000000000..e155b8995 --- /dev/null +++ b/build-on-celo/scaling-your-app.mdx @@ -0,0 +1,298 @@ +--- +title: Scaling Your App +og:description: Learn best practices for scaling your Celo dApp, covering infrastructure, RPC optimization, caching strategies, and monitoring +--- + +Scaling a dApp requires careful planning across infrastructure, blockchain interactions, and cost optimization. This guide shares practical strategies from real-world experience building and scaling applications on Celo. + +## Overview + +As your dApp grows, costs can scale exponentially if not managed properly. This guide covers: + +- Infrastructure and hosting strategies +- RPC and blockchain interaction optimization +- Caching and data management +- AI/LLM cost optimization +- Testing and monitoring best practices + +## Infrastructure & Hosting + +### Server Architecture + +Start simple, but plan for growth: + +- **Early Stage**: Begin with a single server to minimize costs +- **Monitor Usage**: Track CPU, memory, and network usage closely +- **Plan Migration**: Be ready to migrate to scalable solutions like: + - **Kubernetes (K8s)**: For container orchestration and auto-scaling + - **Docker Swarm**: Lighter alternative for container management + - **Managed Services**: Consider AWS ECS, Google Cloud Run, or similar + + + Monitor your server metrics from day one. Set up alerts for CPU, memory, and + disk usage to catch scaling issues before they impact users. + + +### Image Hosting & CDN + +Avoid expensive default CDNs: + +- **Don't Use**: Vercel's default CDN (can be expensive at scale) +- **Use Instead**: Cost-effective CDN solutions like: + - Cloudflare (free tier available) + - AWS CloudFront + - BunnyCDN + - ImageKit or Cloudinary for image optimization + + + CDN costs can add up quickly with high traffic. Choose a CDN with predictable + pricing and monitor bandwidth usage. + + +### Backend Architecture + +Separate your backend from your frontend for better scaling: + +- **Avoid**: Next.js API routes for production workloads +- **Use Instead**: Separate backend service (Node.js, Python, Go, etc.) +- **Benefits**: + - Scale backend independently without increasing Vercel pricing + - Better control over resources and deployment + - Easier to implement queues, caching, and background jobs + + + Use Next.js API routes only for lightweight, user-specific operations. Move + heavy processing, RPC calls, and background jobs to a separate backend + service. + + +### Message Queues + +Implement queues wherever they make sense: + +- **Use Cases**: + + - Processing blockchain transactions + - Sending notifications + - Background data processing + - Image processing + - Email/SMS sending + +- **Queue Solutions**: + - **Redis + BullMQ**: Lightweight and fast + - **RabbitMQ**: Robust message broker + - **AWS SQS**: Managed queue service + - **Google Cloud Tasks**: Managed task queue + + + Queues prevent request timeouts, improve user experience, and allow you to + process jobs at your own pace without overwhelming your server. + + +## RPC & Blockchain Interactions + +### RPC Strategy + +RPC calls are a precious resourceβ€”treat them carefully: + +- **Choose Scalable RPC Providers**: + + - Use providers with high rate limits and good uptime + - Consider multiple RPC endpoints for redundancy + - Monitor RPC response times and error rates + +- **Early Stage Strategy**: + + - Use free RPC endpoints in the frontend + - Each user gets their own rate limits + - Reduces backend RPC load + +- **Scale Considerations**: + - RPC usage scales exponentially with user growth + - Audit all RPC calls regularly + - Remove unnecessary RPC calls + - Batch requests when possible + + + RPC costs can become your largest expense. Audit your RPC calls regularly and + optimize aggressively. A single unnecessary RPC call per user can cost + thousands at scale. + + +### Caching Strategy + +Cache API responses wherever it makes sense: + +- **Don't Always Fetch Latest Data**: + + - Cache blockchain data that doesn't change frequently + - Use appropriate TTLs (Time To Live) based on data freshness requirements + - Balance between data freshness and RPC costs + +- **Cache Layers**: + + - **In-Memory Cache**: Redis or Memcached for frequently accessed data + - **CDN Cache**: For static or semi-static content + - **Application Cache**: Cache responses in your application layer + +- **What to Cache**: + - Token balances (with short TTL) + - Token metadata + - Historical transaction data + - Price data (with appropriate TTL) + - Contract ABIs + + + Most blockchain data doesn't need to be real-time. Cache aggressively and only + fetch fresh data when absolutely necessary. + + +### Indexer Selection + +If you need an indexer, choose cost-effective options: + +- **Recommended**: Use affordable indexers like [thirdweb Insight](https://portal.thirdweb.com/insights) +- **Consider**: + - The Graph (decentralized indexing) + - Alchemy (if already using their RPC) + - Custom indexer (if you have specific needs) + + + Indexers can significantly reduce RPC calls by providing pre-indexed + blockchain data. Choose one that fits your budget and requirements. + + +## AI & LLM Optimization + +### Model Selection + +Optimize LLM costs by choosing the right model for each task: + +- **Small Tasks**: Use cheaper models (e.g., GPT-3.5-turbo, Claude Haiku) +- **Complex Tasks**: Reserve expensive models (e.g., GPT-4, Claude Opus) only when necessary +- **Consider Alternatives**: + - Open-source models (Llama, Mistral) + - Specialized models for specific tasks + + + Most tasks don't require the most powerful models. Use cheaper models for + simple tasks and save expensive models for complex reasoning. + + +### AI SDK + +Use AI SDKs for better developer experience: + +- **Benefits**: + + - Better error handling + - Built-in retry logic + - Streaming support + - Cost tracking + - Easier model switching + +- **Recommended SDKs**: + - [Vercel AI SDK](https://sdk.vercel.ai/) for JavaScript/TypeScript + - [LangChain](https://www.langchain.com/) for Python + - [LlamaIndex](https://www.llamaindex.ai/) for data indexing + +## Testing & Monitoring + +### Testing Strategy + +Comprehensive testing prevents costly production issues: + +- **Unit Tests**: Test individual functions and components +- **Integration Tests**: Test how different parts work together +- **E2E Tests**: Test complete user flows +- **Load Tests**: Test your application under expected load +- **Reburst Tests**: Test how your system handles sudden traffic spikes + + + Don't skip testing. Production bugs are expensive to fix and can damage user + trust. Invest in a solid testing strategy from the start. + + +### Error Monitoring + +Use Sentry to audit error rates: + +- **Benefits**: + + - Track error rates over time + - Get alerts for error spikes + - Debug production issues quickly + - Monitor performance issues + +- **Setup**: + - Install Sentry SDK in your application + - Configure error tracking + - Set up alerts for critical errors + - Monitor error trends + + + Sentry helps you catch and fix errors before they impact too many users. Set + up error monitoring from day one. + + +### Analytics & Logging + +Use Grafana for analytics and logs: + +- **Metrics to Track**: + + - Request rates and response times + - Error rates + - RPC call counts and costs + - Server resource usage + - User activity metrics + +- **Logging**: + + - Centralized logging with Grafana Loki or similar + - Structured logging (JSON format) + - Log retention policies + - Search and query capabilities + +- **Dashboards**: + - Create dashboards for key metrics + - Set up alerts for anomalies + - Monitor trends over time + + + Good observability helps you catch issues early and make data-driven decisions + about scaling. Invest in monitoring from the start. + + +## Best Practices Summary + +### Cost Optimization Checklist + +- [ ] Use cost-effective CDNs instead of default options +- [ ] Separate backend from frontend for independent scaling +- [ ] Implement message queues for background processing +- [ ] Cache API responses aggressively +- [ ] Audit and optimize RPC calls regularly +- [ ] Use free RPC endpoints in frontend during early stages +- [ ] Choose affordable indexers when needed +- [ ] Use cheaper LLM models for simple tasks +- [ ] Monitor all costs and set up alerts + +### Scaling Readiness Checklist + +- [ ] Monitor server metrics (CPU, memory, disk) +- [ ] Have a plan to migrate to scalable infrastructure (K8s, Docker Swarm) +- [ ] Implement comprehensive testing (unit, integration, E2E, load) +- [ ] Set up error monitoring (Sentry) +- [ ] Configure analytics and logging (Grafana) +- [ ] Document your architecture and scaling plan +- [ ] Set up alerts for critical metrics + +## Additional Resources + +- [Celo Documentation](/build-on-celo) - Explore Celo development resources +- [Launch Checklist](/build-on-celo/launch-checklist) - Pre-launch preparation guide +- [thirdweb Insight](https://portal.thirdweb.com/insights) - Affordable blockchain indexer +- [Vercel AI SDK](https://sdk.vercel.ai/) - AI SDK for JavaScript/TypeScript +- [Sentry Documentation](https://docs.sentry.io/) - Error monitoring and performance tracking +- [Grafana Documentation](https://grafana.com/docs/) - Analytics and observability platform diff --git a/docs.json b/docs.json index 262a85c21..5d4f3dd0c 100644 --- a/docs.json +++ b/docs.json @@ -113,6 +113,7 @@ "build-on-celo/quickstart", "build-on-celo/cel2-architecture", "build-on-celo/launch-checklist", + "build-on-celo/scaling-your-app", "build-on-celo/fund-your-project", "build-on-celo/nightfall" ] From 95fecd98856c8020bb859afb53ea606449d03d35 Mon Sep 17 00:00:00 2001 From: GigaHierz Date: Thu, 20 Nov 2025 20:38:52 -0300 Subject: [PATCH 5/5] fix syntax error --- build-on-celo/nightfall.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-on-celo/nightfall.mdx b/build-on-celo/nightfall.mdx index 7e36c7efd..43b558087 100644 --- a/build-on-celo/nightfall.mdx +++ b/build-on-celo/nightfall.mdx @@ -366,7 +366,7 @@ curl -X POST http://localhost:3000/v1/de-escrow \ - The webhook is automatically started with docker-compose and will receive notifications about transaction status changes - For Celo Sepolia, the default ERC20 token address is `0x471EcE3750Da237f93B8E339c536989b8978a438` (CELO) - Operations (deposits, transfers, withdrawals) may take up to 1 hour to complete and be included in a block by the proposer. Client execution should take few seconds. - + ### Integration Steps