Skip to main content
Rainbow uses curated token lists to provide verified, safe assets while allowing users to discover and add custom tokens.

Token Verification

Tokens in Rainbow are categorized by verification status:

Verified Tokens

Rainbow Verified: Curated by Rainbow team
Community Verified: Popular tokens with high volume
Contract Verified: Source code verified on Etherscan
Verified tokens:
  • Appear first in lists
  • Show verification badge
  • Enabled by default in filters
  • Safer for trading

Unverified Tokens

Unverified tokens:
  • May be legitimate but not reviewed
  • Show warning indicators
  • Require confirmation for actions
  • Can be manually added by address
Exercise caution with unverified tokens. Always verify the contract address from official sources before adding or trading.

Asset Discovery

Rainbow helps users discover assets in multiple ways:

Automatic Detection

1

Balance Scan

Rainbow automatically detects:
  • Tokens held in wallet
  • Across all supported chains
  • Including recent transfers
  • Updates every few minutes
2

Asset Enrichment

Detected tokens enriched with:
  • Current price data
  • 24h price change
  • Token metadata (name, symbol, logo)
  • Verification status
  • Multi-chain availability
3

Display

Assets appear in:
  • Main asset list
  • Sorted by USD value
  • With real-time balances
  • Ready for use

Manual Token Addition

Users can add tokens by contract address:
// From src/__swaps__/types/assets.ts
interface ParsedSearchAsset {
  address: string;      // Contract address
  chainId: ChainId;    // Network ID
  name: string;
  symbol: string;
  decimals: number;
  verified: boolean;   // Will be false for manual adds
  // ... other fields
}
1

Find Contract Address

Get token contract from:
  • Project website
  • Etherscan/block explorer
  • CoinGecko/CoinMarketCap
  • Trusted source
2

Add to Rainbow

In Rainbow:
  • Tap search in asset list
  • Paste contract address
  • Verify token details match
  • Confirm to add
3

Token Added

Token now:
  • Appears in your asset list
  • Shows current balance
  • Available for swaps
  • Marked as unverified

Multi-Chain Token Support

Many tokens exist on multiple chains:
type Asset = {
  // Primary chain
  address: string;
  chainId: number;
  
  // All chains where token exists
  networks: Record<string, {
    address: string;    // Contract on that chain
    decimals: number;   // May differ per chain
  }>;
  
  // Bridge support
  bridging: {
    bridgeable: boolean;
    networks: Record<string, {
      bridgeable: boolean;  // Can bridge to this chain
    }>;
  };
};

Example: USDC Multi-Chain

USDC exists on multiple chains:
  • Ethereum: 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
  • Polygon: 0x2791bca1f2de4661ed88a30c99a7a9449aa84174
  • Arbitrum: 0xff970a61a04b1ca14834a43f5de4533ebddb5cc8
  • Optimism: 0x7f5c764cbc14f9669b88837ca1490cca17c31607
  • Base: 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913
Rainbow:
  • Shows total USDC across all chains
  • Allows per-chain breakdown
  • Enables cross-chain bridging
  • Aggregates for total portfolio
Powerful search across all known tokens:

Search Features

Search Implementation

// From src/__swaps__/screens/Swap/resources/search/searchV2.ts
const searchAssets = ({
  query,
  filter,
  chainId,
}: {
  query: string;
  filter?: 'verified' | 'all';
  chainId?: ChainId;
}) => {
  const searchLower = query.toLowerCase();
  
  return allAssets.filter(asset => {
    // Filter by chain if specified
    if (chainId && asset.chainId !== chainId) {
      return false;
    }
    
    // Filter by verification if specified
    if (filter === 'verified' && !asset.verified) {
      return false;
    }
    
    // Match against symbol, name, or address
    return (
      asset.symbol.toLowerCase().includes(searchLower) ||
      asset.name.toLowerCase().includes(searchLower) ||
      asset.address.toLowerCase() === searchLower
    );
  });
};

Favorites

Users can mark tokens as favorites:

Favorite Features

  • Quick access to frequently used tokens
  • Appear at top of swap token selector
  • Synced across devices (if cloud backup enabled)
  • Per-chain favorites support

Managing Favorites

1

Add Favorite

  • Long press on token in list
  • Tap star icon
  • Or via token details page
2

View Favorites

  • Filter asset list to favorites
  • See in swap token selector
  • Favorites section always visible
3

Remove Favorite

  • Tap star icon again
  • Or via favorites management
Rainbow highlights popular tokens:
// From src/__swaps__/types/search.ts
type AssetToBuySectionId = 
  | 'bridge'
  | 'recent'
  | 'favorites' 
  | 'verified'
  | 'unverified'
  | 'other_networks'
  | 'popular';  // Popular tokens section
  • High volume: Based on trading volume
  • Community favorites: Most held tokens
  • New & trending: Recently popular
  • Per-chain: Different popular tokens per network

Token Metadata

Each token has rich metadata:
interface TokenMetadata {
  name: string;              // Full name
  symbol: string;            // Ticker
  decimals: number;          // Precision
  iconUrl?: string;          // Logo image
  description?: string;      // What is this token
  website?: string;          // Official website
  twitter?: string;          // Social media
  
  colors: {
    primary: string;         // Brand color
    fallback?: string;       // Alt color
  };
  
  price: {
    value: number;           // Current price
    changedAt: number;       // Last update
    relativeChange24h: number; // % change
  };
}

Color Theming

Rainbow uses token colors for UI:
  • Token row background tint
  • Chart colors
  • Button accents
  • Visual consistency
// From src/__swaps__/utils/swaps.ts
const getHighContrastColor = (color: string): ResponseByTheme<string> => {
  let lightColor = color;
  let darkColor = color;
  
  // Ensure contrast in light mode
  const lightModeContrast = chroma.contrast(lightColor, globalColors.white100);
  if (lightModeContrast < 2.5) {
    lightColor = chroma(lightColor)
      .darken(2.5 - lightModeContrast)
      .hex();
  }
  
  // Ensure contrast in dark mode
  const darkModeContrast = chroma.contrast(darkColor, globalColors.grey100);
  if (darkModeContrast < 3) {
    darkColor = chroma(darkColor)
      .set('hsl.l', 0.8)
      .hex();
  }
  
  return { light: lightColor, dark: darkColor };
};

Token Security

Scam Detection

Rainbow identifies potential scams:
interface Asset {
  probableSpam?: boolean;    // Spam flag
  transferable: boolean;     // Can be transferred
  verified: boolean;         // Verified status
}
Scam indicators:
  • Unverified with suspicious name
  • Impersonating popular tokens
  • Non-transferable tokens
  • Honeypot contracts
  • Recent low-value airdrops
Common scam tactics:
  • Fake USDC/USDT with typos
  • “Reward” tokens requiring approval
  • NFTs linking to phishing sites
  • Tokens that can’t be sold
Always verify contract address from official sources!

Safe Token Practices

1

Verify Source

Before adding tokens:
  • Check official project website
  • Verify contract on Etherscan
  • Cross-reference multiple sources
  • Look for verification badges
2

Check Liquidity

For trading:
  • Check DEX liquidity
  • Verify trading volume
  • Look at holder count
  • Check market cap
3

Test Small Amount

Before large transactions:
  • Send small test amount first
  • Verify token behaves normally
  • Check you can sell/swap
  • Confirm contract functions
4

Research Project

Due diligence:
  • Read project documentation
  • Check team/community
  • Review audit reports
  • Understand tokenomics

Custom Token Lists

Advanced users can use custom token lists:

Token List Format

Follows standard format:
{
  "name": "My Token List",
  "tokens": [
    {
      "chainId": 1,
      "address": "0x...",
      "name": "Token Name",
      "symbol": "TKN",
      "decimals": 18,
      "logoURI": "https://..."
    }
  ]
}
Custom token list support is primarily for developers. Most users should rely on Rainbow’s verified token list.

Assets Overview

Managing all your crypto assets

NFTs

NFT collection management

Swaps

Swapping between tokens

Quote Fetching

How swap quotes work

Build docs developers (and LLMs) love