> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sqd.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Solana Networks

> Browse all Solana and SVM-compatible networks supported by SQD — Solana mainnet, devnet, Eclipse, Spray, and other SVM chains with Portal API endpoints.

export function NetworksTable({networks, columns = {}, hideTestnetToggle = false}) {
  const {useState} = React;
  const {showChainId = false, showTraces = false, showStateDiffs = false, showType = false, showCategory = false} = columns;
  const [filter, setFilter] = useState("");
  const [copiedId, setCopiedId] = useState(null);
  const [sortColumn, setSortColumn] = useState("name");
  const [sortDirection, setSortDirection] = useState("asc");
  const [showTestnets, setShowTestnets] = useState(true);
  const filteredNetworks = networks.filter(network => {
    const networkType = network.type || (network.name.toLowerCase().includes("testnet") || network.name.toLowerCase().includes("devnet") ? "testnet" : "mainnet");
    if (!showTestnets && (networkType === "testnet" || networkType === "devnet")) {
      return false;
    }
    const filterLower = filter.toLowerCase();
    const nameMatch = network.name.toLowerCase().includes(filterLower);
    if (showChainId) {
      const chainIdMatch = network.chainId ? network.chainId.toString().includes(filterLower) : false;
      return nameMatch || chainIdMatch;
    }
    return nameMatch;
  });
  const hasStrictChainIdMatch = showChainId && filter.trim() !== "" && (/^\d+$/).test(filter.trim()) && filteredNetworks.some(network => network.chainId && network.chainId.toString() === filter.trim());
  const finalFilteredNetworks = hasStrictChainIdMatch ? filteredNetworks.filter(network => network.chainId && network.chainId.toString() === filter.trim()) : filteredNetworks;
  const handleSort = column => {
    if (sortColumn === column) {
      setSortDirection(sortDirection === "asc" ? "desc" : "asc");
    } else {
      setSortColumn(column);
      setSortDirection("asc");
    }
  };
  const sortedNetworks = [...finalFilteredNetworks].sort((a, b) => {
    let aVal, bVal;
    switch (sortColumn) {
      case "name":
        aVal = a.name.toLowerCase();
        bVal = b.name.toLowerCase();
        break;
      case "chainId":
        aVal = a.chainId ? parseInt(a.chainId) : 0;
        bVal = b.chainId ? parseInt(b.chainId) : 0;
        break;
      case "slug":
        aVal = a.slug.toLowerCase();
        bVal = b.slug.toLowerCase();
        break;
      case "portal":
        aVal = a.portal ? 1 : 0;
        bVal = b.portal ? 1 : 0;
        break;
      case "realtime":
        aVal = a.realtime ? 1 : 0;
        bVal = b.realtime ? 1 : 0;
        break;
      case "traces":
        aVal = a.traces ? 1 : 0;
        bVal = b.traces ? 1 : 0;
        break;
      case "stateDiffs":
        aVal = a.stateDiffs ? 1 : 0;
        bVal = b.stateDiffs ? 1 : 0;
        break;
      case "type":
        aVal = a.type || "";
        bVal = b.type || "";
        break;
      case "category":
        aVal = a.category || "";
        bVal = b.category || "";
        break;
      default:
        return 0;
    }
    if (aVal < bVal) return sortDirection === "asc" ? -1 : 1;
    if (aVal > bVal) return sortDirection === "asc" ? 1 : -1;
    return 0;
  });
  const copyToClipboard = async (text, id) => {
    try {
      await navigator.clipboard.writeText(text);
      setCopiedId(id);
      setTimeout(() => setCopiedId(null), 2000);
    } catch (err) {
      console.error('Failed to copy:', err);
    }
  };
  const getPortalUrl = slug => `https://portal.sqd.dev/datasets/${slug}`;
  const getV2ArchiveUrl = slug => `v2.archive.subsquid.io/network/${slug}`;
  const colSpan = 3 + (showChainId ? 1 : 0) + (showTraces ? 1 : 0) + (showStateDiffs ? 1 : 0) + (showType ? 1 : 0) + (showCategory ? 1 : 0);
  return <div>
  <div className="overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm">
    <div className="px-4 py-3 bg-gray-50 dark:bg-gray-800/50 flex items-center justify-between gap-3 border-b border-gray-200 dark:border-gray-700">
      <div className="flex items-center gap-2 flex-1 max-w-2xl">
        <input type="text" placeholder={showChainId ? "Filter by network name or chain ID..." : "Filter by network name..."} value={filter} onChange={e => setFilter(e.target.value)} className="flex-1 h-10 px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 shadow-sm transition-all" />
        {!hideTestnetToggle && <button onClick={() => setShowTestnets(!showTestnets)} className={`inline-flex items-center h-10 gap-2 px-4 py-2 text-sm font-medium rounded-md border transition-all whitespace-nowrap ${showTestnets ? "bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700" : "bg-gray-50 dark:bg-gray-900 border-gray-200 dark:border-gray-700 text-gray-500 dark:text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800"}`} aria-label={showTestnets ? "Hide testnets" : "Show testnets"}>
            {showTestnets ? <svg className="w-4 h-4 text-green-600 dark:text-green-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
              </svg> : <svg className="w-4 h-4 text-gray-400 dark:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
              </svg>}
            Show testnets
          </button>}
      </div>
      <a href="https://t.me/karelxfi" target="\_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1.5 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white text-sm font-semibold rounded-md shadow-sm hover:shadow-md transition-all whitespace-nowrap" style={{
    backgroundColor: "#1e40af"
  }}>
        <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
        </svg>
        Request Network
      </a>
    </div>
    <div className="px-4 overflow-x-auto pt-0">
      <table className="min-w-full table-fixed border-collapse text-sm bg-white dark:bg-gray-900 m-0 -mx-4 w-[calc(100%+2rem)]">
        <thead>
          <tr className="bg-gray-50 dark:bg-gray-800/50 border-b border-gray-200 dark:border-gray-700">
            <th className="text-left py-3 pl-4 pr-3 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" onClick={() => handleSort("name")}>
              <div className="flex items-center gap-1">
                Network
                {sortColumn === "name" && <span className="text-gray-500 dark:text-gray-400">
                    {sortDirection === "asc" ? "↑" : "↓"}
                  </span>}
              </div>
            </th>
            {showChainId && <th className="text-left py-3 px-3 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '100px',
    minWidth: '100px',
    maxWidth: '100px'
  }} onClick={() => handleSort("chainId")}>
                <div className="flex items-center gap-1">
                  Chain ID
                  {sortColumn === "chainId" && <span className="text-gray-500 dark:text-gray-400">
                      {sortDirection === "asc" ? "↑" : "↓"}
                    </span>}
                </div>
              </th>}
            {showType && <th className="text-left py-3 px-3 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '90px',
    minWidth: '90px',
    maxWidth: '90px'
  }} onClick={() => handleSort("type")}>
                <div className="flex items-center gap-1">
                  Network
                  {sortColumn === "type" && <span className="text-gray-500 dark:text-gray-400">
                      {sortDirection === "asc" ? "↑" : "↓"}
                    </span>}
                </div>
              </th>}
            {showCategory && <th className="text-left py-3 px-3 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '90px',
    minWidth: '90px',
    maxWidth: '90px'
  }} onClick={() => handleSort("category")}>
                <div className="flex items-center gap-1">
                  Type
                  {sortColumn === "category" && <span className="text-gray-500 dark:text-gray-400">
                      {sortDirection === "asc" ? "↑" : "↓"}
                    </span>}
                </div>
              </th>}
            <th className="text-center py-3 px-2 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '75px',
    minWidth: '75px',
    maxWidth: '75px'
  }} onClick={() => handleSort("portal")}>
              <div className="flex items-center justify-center gap-1">
                <Tooltip tip="Available on Portal infrastructure">
                  Portal
                </Tooltip>
                {sortColumn === "portal" && <span className="text-gray-500 dark:text-gray-400">
                    {sortDirection === "asc" ? "↑" : "↓"}
                  </span>}
              </div>
            </th>
            <th className="text-center py-3 px-2 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '75px',
    minWidth: '75px',
    maxWidth: '75px'
  }} onClick={() => handleSort("realtime")}>
              <div className="flex items-center justify-center gap-1 whitespace-nowrap">
                <Tooltip tip="Supports real-time streaming">Real-Time</Tooltip>
                {sortColumn === "realtime" && <span className="text-gray-500 dark:text-gray-400">
                    {sortDirection === "asc" ? "↑" : "↓"}
                  </span>}
              </div>
            </th>
            {showTraces && <th className="text-center py-3 px-2 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '75px',
    minWidth: '75px',
    maxWidth: '75px'
  }} onClick={() => handleSort("traces")}>
                <div className="flex items-center justify-center gap-1">
                  Traces
                  {sortColumn === "traces" && <span className="text-gray-500 dark:text-gray-400">
                      {sortDirection === "asc" ? "↑" : "↓"}
                    </span>}
                </div>
              </th>}
            {showStateDiffs && <th className="text-center py-3 px-2 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" style={{
    width: '75px',
    minWidth: '75px',
    maxWidth: '75px'
  }} onClick={() => handleSort("stateDiffs")}>
                <div className="flex items-center justify-center gap-1 whitespace-nowrap">
                  State Diffs
                  {sortColumn === "stateDiffs" && <span className="text-gray-500 dark:text-gray-400">
                      {sortDirection === "asc" ? "↑" : "↓"}
                    </span>}
                </div>
              </th>}
            <th className="text-left py-3 px-3 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 select-none" onClick={() => handleSort("slug")}>
              <div className="flex items-center gap-1">
                <Tooltip tip="Dataset identifier for use with Portal endpoints">
                  Slug
                </Tooltip>
                {sortColumn === "slug" && <span className="text-gray-500 dark:text-gray-400">
                    {sortDirection === "asc" ? "↑" : "↓"}
                  </span>}
              </div>
            </th>
            <th className="text-left py-3 px-3 font-semibold text-gray-700 dark:text-gray-300 text-xs tracking-wider">
              Details
            </th>
          </tr>
        </thead>
        <tbody className="divide-y divide-gray-100 dark:divide-gray-800">
          {sortedNetworks.length > 0 ? sortedNetworks.map((network, index) => {
    const portalId = `portal-${network.slug}`;
    const v2Id = `v2-${network.slug}`;
    return <tr key={index} className="hover:bg-gray-50 dark:hover:bg-gray-800/30 transition-colors duration-150">
                  <td className="py-3 pl-4 pr-3 text-left text-gray-900 dark:text-gray-100 font-medium">
                    {network.tooltip ? <span className="inline">
                        <Tooltip tip={network.tooltip}>{network.name}</Tooltip>
                      </span> : network.name}
                  </td>
                  {showChainId && <td className="py-3 px-3 text-left text-gray-700 dark:text-gray-300" style={{
      width: '90px',
      minWidth: '90px',
      maxWidth: '90px'
    }}>
                      {network.chainId || "-"}
                    </td>}
                  {showType && <td className="py-3 px-3 text-left text-gray-700 dark:text-gray-300" style={{
      width: '90px',
      minWidth: '90px',
      maxWidth: '90px'
    }}>
                      <span className="inline-flex items-center px-2 py-1 rounded-md text-xs font-medium capitalize bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 border border-gray-200 dark:border-gray-700">
                        {network.type || "mainnet"}
                      </span>
                    </td>}
                  {showCategory && <td className="py-3 px-3 text-left text-gray-700 dark:text-gray-300" style={{
      width: '90px',
      minWidth: '90px',
      maxWidth: '90px'
    }}>
                      <span className="inline-flex items-center px-2 py-1 rounded-md text-xs font-medium capitalize bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700">
                        {network.category || "-"}
                      </span>
                    </td>}
                  <td className="py-3 px-2 text-center" style={{
      width: '75px',
      minWidth: '75px',
      maxWidth: '75px'
    }}>
                    <span className={network.portal ? "text-green-600 dark:text-green-400" : "text-gray-400 dark:text-gray-500"}>
                      {network.portal ? <Icon icon="circle-check" iconType="solid" /> : <Icon icon="circle-xmark" iconType="regular" />}
                    </span>
                  </td>
                  <td className="py-3 px-2 text-center" style={{
      width: '75px',
      minWidth: '75px',
      maxWidth: '75px'
    }}>
                    <span className={network.realtime ? "text-green-600 dark:text-green-400" : "text-red-500 dark:text-red-400"}>
                      {network.realtime ? <Icon icon="circle-check" iconType="solid" /> : <Icon icon="circle-xmark" iconType="regular" />}
                    </span>
                  </td>
                  {showTraces && <td className="py-3 px-2 text-center" style={{
      width: '75px',
      minWidth: '75px',
      maxWidth: '75px'
    }}>
                      <span className={network.traces ? "text-green-600 dark:text-green-400" : "text-gray-400 dark:text-gray-500"}>
                        {network.traces ? <Icon icon="circle-check" iconType="solid" /> : <Icon icon="circle-xmark" iconType="regular" />}
                      </span>
                    </td>}
                  {showStateDiffs && <td className="py-3 px-2 text-center" style={{
      width: '75px',
      minWidth: '75px',
      maxWidth: '75px'
    }}>
                      <span className={network.stateDiffs ? "text-green-600 dark:text-green-400" : "text-gray-400 dark:text-gray-500"}>
                        {network.stateDiffs ? <Icon icon="circle-check" iconType="solid" /> : <Icon icon="circle-xmark" iconType="regular" />}
                      </span>
                    </td>}
                  <td className="py-3 px-3 text-left">
                    <div className="flex items-center gap-2">
                      <code className="text-xs bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded-md font-mono text-gray-800 dark:text-gray-200 border border-gray-200 dark:border-gray-700">
                        {network.slug}
                      </code>
                      {network.portal && <Tooltip tip={copiedId === portalId ? "Copied!" : "Copy Portal endpoint URL"}>
                          <button onClick={e => {
      e.stopPropagation();
      copyToClipboard(getPortalUrl(network.slug), portalId);
    }} className="p-1 rounded-md hover:bg-gray-100 dark:hover:bg-gray-700 transition-all duration-150 hover:scale-110 flex items-center justify-center" aria-label="Copy Portal URL">
                            <span className={copiedId === portalId ? "text-green-600 dark:text-green-400" : "text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300"}>
                              {copiedId === portalId ? <Icon icon="circle-check" iconType="solid" /> : <Icon icon="copy" iconType="regular" />}
                            </span>
                          </button>
                        </Tooltip>}
                    </div>
                  </td>
                  <td className="py-3 px-3 text-left">
                    <a href={network.details} className="text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 hover:underline font-medium transition-colors inline-flex items-center gap-1">
                      View
                      <span className="text-xs">→</span>
                    </a>
                  </td>
                </tr>;
  }) : <tr>
              <td colSpan={colSpan} className="py-6 px-4 text-center text-gray-500 dark:text-gray-400">
                <div className="flex flex-col items-center gap-1.5">
                  <span className="text-lg">🔍</span>
                  <span>No networks found matching "{filter}"</span>
                </div>
              </td>
            </tr>}
        </tbody>
      </table>
    </div>
  </div>
</div>;
}

export const solanaNetworks = [{
  "name": "Eclipse",
  "type": "mainnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "eclipse-mainnet",
  "details": "/en/data/solana/eclipse-mainnet",
  "legacyUrl": "v2.archive.subsquid.io/network/eclipse-mainnet"
}, {
  "name": "Eclipse Testnet",
  "type": "testnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "eclipse-testnet",
  "details": "/en/data/solana/eclipse-testnet",
  "legacyUrl": "v2.archive.subsquid.io/network/eclipse-testnet"
}, {
  "name": "Solana",
  "type": "mainnet",
  "tooltip": "Solana on Portal is available from genesis and uses slots, not blocks. V2 archives (legacy) are available starting from block 269,828,500 (block, not slot).",
  "portal": true,
  "realtime": true,
  "slug": "solana-mainnet",
  "details": "/en/data/solana/solana-mainnet",
  "legacyUrl": "v2.archive.subsquid.io/network/solana-mainnet"
}, {
  "name": "Solana Devnet",
  "type": "devnet",
  "tooltip": null,
  "portal": true,
  "realtime": true,
  "slug": "solana-devnet",
  "details": "/en/data/solana/solana-devnet",
  "legacyUrl": null
}, {
  "name": "Soon",
  "type": "mainnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "soon-mainnet",
  "details": "/en/data/solana/soon-mainnet",
  "legacyUrl": "v2.archive.subsquid.io/network/soon-mainnet"
}, {
  "name": "Soon Devnet",
  "type": "devnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "soon-devnet",
  "details": "/en/data/solana/soon-devnet",
  "legacyUrl": "v2.archive.subsquid.io/network/soon-devnet"
}, {
  "name": "Soon Testnet",
  "type": "testnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "soon-testnet",
  "details": "/en/data/solana/soon-testnet",
  "legacyUrl": "v2.archive.subsquid.io/network/soon-testnet"
}, {
  "name": "SVM BNB",
  "type": "mainnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "svm-bnb-mainnet",
  "details": "/en/data/solana/svm-bnb-mainnet",
  "legacyUrl": null
}, {
  "name": "SVM BNB Testnet",
  "type": "testnet",
  "tooltip": null,
  "portal": true,
  "realtime": false,
  "slug": "svm-bnb-testnet",
  "details": "/en/data/solana/svm-bnb-testnet",
  "legacyUrl": null
}];

<Warning>
  **Portal Migration**: We're migrating from v2 archives to Portal. v2 archives
  will be sunset soon. [Get Started with Portal →](/en/portal/migration)
</Warning>

{(() => {
const { useState } = React;
return (
<NetworksTable
  networks={solanaNetworks}
  columns={{ showType: true }}
/>
); })()}
