🧪 Skills

celo-defi

Integrate DeFi protocols on Celo. Use when building swaps, lending, or liquidity applications with Uniswap, Aave, Ubeswap, or other DeFi protocols.

v1.0.2011
❤️ 0
⬇️ 57
👁 1
Share

Description


name: celo-defi description: Integrate DeFi protocols on Celo. Use when building swaps, lending, or liquidity applications with Uniswap, Aave, Ubeswap, or other DeFi protocols. license: Apache-2.0 metadata: author: celo-org version: "1.0.0"

Celo DeFi Integration

This skill covers integrating DeFi protocols on Celo, including Uniswap for swaps, Aave for lending/borrowing, and other protocols.

When to Use

  • Building swap functionality with Uniswap or Ubeswap
  • Integrating lending/borrowing with Aave
  • Creating liquidity provision features
  • Building DeFi aggregators

DeFi Protocols on Celo

Decentralized Exchanges

Protocol Description
Uniswap V3/V4 Primary DEX with concentrated liquidity
Ubeswap Celo-native DEX, mobile-optimized
Velodrome Superchain DEX with liquidity mining
Carbon DeFi Orderbook-like automated trading

Lending & Borrowing

Protocol Description
Aave V3 Decentralized lending (launched March 2025)
Credit Collective On-chain private credit for RWAs
PWN Fixed-rate lending

DEX Aggregators

Protocol Description
LI.FI Cross-chain aggregator

Liquidity & Yield

Protocol Description
Steer Protocol Automated liquidity strategies
Merkl Liquidity provider rewards

Uniswap V3 Integration

Contract Addresses - Mainnet (Chain ID: 42220)

Contract Address
Factory 0xAfE208a311B21f13EF87E33A90049fC17A7acDEc
SwapRouter02 0x5615CDAb10dc425a742d643d949a7F474C01abc4
QuoterV2 0x82825d0554fA07f7FC52Ab63c961F330fdEFa8E8
NonfungiblePositionManager 0x3d79EdAaBC0EaB6F08ED885C05Fc0B014290D95A
UniversalRouter 0x643770E279d5D0733F21d6DC03A8efbABf3255B4
Permit2 0x000000000022D473030F116dDEE9F6B43aC78BA3
TickLens 0x5f115D9113F88e0a0Db1b5033D90D4a9690AcD3D
Multicall2 0x633987602DE5C4F337e3DbF265303A1080324204

Contract Addresses - Alfajores Testnet

Contract Address
Factory 0x229Fd76DA9062C1a10eb4193768E192bdEA99572
SwapRouter02 0x8C456F41A3883bA0ba99f810F7A2Da54D9Ea3EF0
QuoterV2 0x3c1FCF8D6f3A579E98F4AE75EB0adA6de70f5673
NonfungiblePositionManager 0x0eC9d3C06Bc0A472A80085244d897bb604548824
UniversalRouter 0x84904B9E85F76a421223565be7b596d7d9A8b8Ce
Permit2 0x000000000022D473030F116dDEE9F6B43aC78BA3

Simple Swap Example

import { createWalletClient, custom, encodeFunctionData } from "viem";
import { celo } from "viem/chains";

const SWAP_ROUTER = "0x5615CDAb10dc425a742d643d949a7F474C01abc4";

const SWAP_ROUTER_ABI = [
  {
    name: "exactInputSingle",
    type: "function",
    stateMutability: "payable",
    inputs: [
      {
        name: "params",
        type: "tuple",
        components: [
          { name: "tokenIn", type: "address" },
          { name: "tokenOut", type: "address" },
          { name: "fee", type: "uint24" },
          { name: "recipient", type: "address" },
          { name: "amountIn", type: "uint256" },
          { name: "amountOutMinimum", type: "uint256" },
          { name: "sqrtPriceLimitX96", type: "uint160" },
        ],
      },
    ],
    outputs: [{ type: "uint256" }],
  },
] as const;

async function swapExactInput(
  tokenIn: string,
  tokenOut: string,
  amountIn: bigint,
  amountOutMin: bigint,
  fee: number = 3000
): Promise<string> {
  const walletClient = createWalletClient({
    chain: celo,
    transport: custom(window.ethereum),
  });

  const [address] = await walletClient.getAddresses();

  const hash = await walletClient.sendTransaction({
    account: address,
    to: SWAP_ROUTER,
    data: encodeFunctionData({
      abi: SWAP_ROUTER_ABI,
      functionName: "exactInputSingle",
      args: [
        {
          tokenIn: tokenIn as `0x${string}`,
          tokenOut: tokenOut as `0x${string}`,
          fee,
          recipient: address,
          amountIn,
          amountOutMinimum: amountOutMin,
          sqrtPriceLimitX96: 0n,
        },
      ],
    }),
  });

  return hash;
}

Ubeswap Integration

Celo-native DEX with V2 and V3 support.

Contract Addresses - Mainnet

Contract Address
V3 Factory 0x67FEa58D5a5a4162cED847E13c2c81c73bf8aeC4
V3 Universal Router 0x3C255DED9B25f0BFB4EF1D14234BD2514d7A7A0d
V3 NFT Position Manager 0x897387c7B996485c3AAa85c94272Cd6C506f8c8F
V2 Factory 0x62d5b84bE28a183aBB507E125B384122D2C25fAE
V2 Router 0xE3D8bd6Aed4F159bc8000a9cD47CffDb95F96121
UBE Token 0x71e26d0E519D14591b9dE9a0fE9513A398101490

Aave V3 Integration

Contract Addresses - Mainnet

Contract Address
Pool 0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402
PoolAddressesProvider 0x9F7Cf9417D5251C59fE94fB9147feEe1aAd9Cea5
PoolConfigurator 0x7567E3434CC1BEf724AB595e6072367Ef4914691
Oracle 0x1e693D088ceFD1E95ba4c4a5F7EeA41a1Ec37e8b
ACLManager 0x7a12dCfd73C1B4cddf294da4cFce75FcaBBa314C
PoolDataProvider 0x2e0f8D3B1631296cC7c56538D6Eb6032601E15ED
Collector 0xC959439207dA5341B74aDcdAC59016aa9Be7E9E7

Supported Assets

Asset Address aToken
USDC 0xcebA9300f2b948710d2653dD7B07f33A8B32118C 0xFF8309b9e99bfd2D4021bc71a362aBD93dBd4785
USDT 0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e -
USDm 0x765de816845861e75a25fca122bb6898b8b1282a -
EURm 0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73 -
CELO 0x471EcE3750Da237f93B8E339c536989b8978a438 -
WETH 0xD221812de1BD094f35587EE8E174B07B6167D9Af -

Supply Assets

const AAVE_POOL = "0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402";

const POOL_ABI = [
  {
    name: "supply",
    type: "function",
    stateMutability: "nonpayable",
    inputs: [
      { name: "asset", type: "address" },
      { name: "amount", type: "uint256" },
      { name: "onBehalfOf", type: "address" },
      { name: "referralCode", type: "uint16" },
    ],
    outputs: [],
  },
] as const;

async function supplyToAave(asset: string, amount: bigint): Promise<string> {
  const walletClient = createWalletClient({
    chain: celo,
    transport: custom(window.ethereum),
  });

  const [address] = await walletClient.getAddresses();

  // First approve the Pool to spend tokens
  const hash = await walletClient.writeContract({
    address: AAVE_POOL,
    abi: POOL_ABI,
    functionName: "supply",
    args: [asset as `0x${string}`, amount, address, 0],
  });

  return hash;
}

Borrow Assets

const POOL_ABI_BORROW = [
  {
    name: "borrow",
    type: "function",
    stateMutability: "nonpayable",
    inputs: [
      { name: "asset", type: "address" },
      { name: "amount", type: "uint256" },
      { name: "interestRateMode", type: "uint256" },
      { name: "referralCode", type: "uint16" },
      { name: "onBehalfOf", type: "address" },
    ],
    outputs: [],
  },
] as const;

async function borrowFromAave(
  asset: string,
  amount: bigint,
  interestRateMode: number = 2 // 2 = variable rate
): Promise<string> {
  const walletClient = createWalletClient({
    chain: celo,
    transport: custom(window.ethereum),
  });

  const [address] = await walletClient.getAddresses();

  const hash = await walletClient.writeContract({
    address: AAVE_POOL,
    abi: POOL_ABI_BORROW,
    functionName: "borrow",
    args: [asset as `0x${string}`, amount, BigInt(interestRateMode), 0, address],
  });

  return hash;
}

Token Approval

Before interacting with DeFi protocols, approve token spending:

const ERC20_ABI = [
  {
    name: "approve",
    type: "function",
    stateMutability: "nonpayable",
    inputs: [
      { name: "spender", type: "address" },
      { name: "amount", type: "uint256" },
    ],
    outputs: [{ type: "bool" }],
  },
] as const;

async function approveToken(
  token: string,
  spender: string,
  amount: bigint
): Promise<string> {
  const walletClient = createWalletClient({
    chain: celo,
    transport: custom(window.ethereum),
  });

  const [address] = await walletClient.getAddresses();

  const hash = await walletClient.writeContract({
    address: token as `0x${string}`,
    abi: ERC20_ABI,
    functionName: "approve",
    args: [spender as `0x${string}`, amount],
  });

  return hash;
}

Fee Tiers (Uniswap V3)

Fee Use Case
100 (0.01%) Stable pairs (USDm/USDC)
500 (0.05%) Stable pairs
3000 (0.3%) Most pairs
10000 (1%) Exotic pairs

Dependencies

{
  "dependencies": {
    "viem": "^2.0.0"
  }
}

For Aave integration:

{
  "dependencies": {
    "@bgd-labs/aave-address-book": "^4.0.0"
  }
}

Additional Resources

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs