diff --git a/src/components/CCIP/AptosCCTCallout.tsx b/src/components/CCIP/AptosCCTCallout.tsx
new file mode 100644
index 00000000000..2871c09a5a6
--- /dev/null
+++ b/src/components/CCIP/AptosCCTCallout.tsx
@@ -0,0 +1,21 @@
+/** @jsxImportSource react */
+import { useStore } from "@nanostores/react"
+import { selectedChainType } from "~/stores/chainType.js"
+import { Callout } from "@components/Callout/Callout.tsx"
+
+export function AptosCCTCallout() {
+ const chainType = useStore(selectedChainType)
+
+ if (chainType !== "aptos") {
+ return null
+ }
+
+ return (
+
+ Cross-Chain Token (CCT) implementation documentation for Aptos is currently in development. If you are a token
+ developer and wish to enable your token on Aptos, please submit your project details via this{" "}
+ contact form. When filling out the form, select{" "}
+ Token admin registration as the support request type.
+
+ )
+}
diff --git a/src/components/CCIP/TutorialBlockchainSelector/AdminSetupStep.tsx b/src/components/CCIP/TutorialBlockchainSelector/AdminSetupStep.tsx
index 1337420ebf1..8db48f90382 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/AdminSetupStep.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/AdminSetupStep.tsx
@@ -6,7 +6,7 @@ import { TutorialStep } from "../TutorialSetup/TutorialStep.tsx"
import { NetworkAddress } from "./NetworkAddress.tsx"
import { StepCheckbox } from "../TutorialProgress/StepCheckbox.tsx"
import { SolidityParam } from "../TutorialSetup/SolidityParam.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
import styles from "./AdminSetupStep.module.css"
interface AdminSetupStepProps {
diff --git a/src/components/CCIP/TutorialBlockchainSelector/ChainUpdateBuilder.tsx b/src/components/CCIP/TutorialBlockchainSelector/ChainUpdateBuilder.tsx
index f1b00479deb..314a00d6df0 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/ChainUpdateBuilder.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/ChainUpdateBuilder.tsx
@@ -4,7 +4,7 @@ import { laneStore, type RateLimiterConfig, updateRateLimits } from "~/stores/la
import { useStore } from "@nanostores/react"
import styles from "./ChainUpdateBuilder.module.css"
import { ErrorBoundary } from "~/components/ErrorBoundary.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
interface ChainUpdateBuilderProps {
chain: "source" | "destination"
diff --git a/src/components/CCIP/TutorialBlockchainSelector/ContractVerificationStep.tsx b/src/components/CCIP/TutorialBlockchainSelector/ContractVerificationStep.tsx
index 066a2fbc36f..d6d0a812749 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/ContractVerificationStep.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/ContractVerificationStep.tsx
@@ -1,5 +1,5 @@
import { TutorialStep } from "../TutorialSetup/TutorialStep.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
import type { Network } from "~/config/data/ccip/types.ts"
import styles from "./ContractVerificationStep.module.css"
import { getExplorerAddressUrl } from "~/features/utils/index.ts"
diff --git a/src/components/CCIP/TutorialBlockchainSelector/DeployPoolStep.tsx b/src/components/CCIP/TutorialBlockchainSelector/DeployPoolStep.tsx
index d358223477e..42a4fba23bd 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/DeployPoolStep.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/DeployPoolStep.tsx
@@ -9,7 +9,7 @@ import { SolidityParam } from "../TutorialSetup/SolidityParam.tsx"
import { StoredContractAddress } from "./StoredContractAddress.tsx"
import { NetworkAddress } from "./NetworkAddress.tsx"
import { ContractVerificationStep } from "./ContractVerificationStep.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
import type { LaneState, DeployedContracts } from "~/stores/lanes/index.ts"
import styles from "./DeployPoolStep.module.css"
import { isAddress } from "ethers"
diff --git a/src/components/CCIP/TutorialBlockchainSelector/DeployTokenStep.tsx b/src/components/CCIP/TutorialBlockchainSelector/DeployTokenStep.tsx
index 499f2c8eca7..1e261b8c702 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/DeployTokenStep.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/DeployTokenStep.tsx
@@ -5,7 +5,7 @@ import { TutorialCard } from "../TutorialSetup/TutorialCard.tsx"
import { TutorialStep } from "../TutorialSetup/TutorialStep.tsx"
import { NetworkCheck } from "../TutorialSetup/NetworkCheck.tsx"
import { SolidityParam } from "../TutorialSetup/SolidityParam.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
import { ContractVerificationStep } from "./ContractVerificationStep.tsx"
import type { LaneState, DeployedContracts } from "~/stores/lanes/index.ts"
import styles from "./DeployTokenStep.module.css"
diff --git a/src/components/CCIP/TutorialBlockchainSelector/GrantPrivilegesStep.tsx b/src/components/CCIP/TutorialBlockchainSelector/GrantPrivilegesStep.tsx
index 45e3feb6eb0..8d390578362 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/GrantPrivilegesStep.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/GrantPrivilegesStep.tsx
@@ -5,7 +5,7 @@ import { NetworkCheck } from "../TutorialSetup/NetworkCheck.tsx"
import { StepCheckbox } from "../TutorialProgress/StepCheckbox.tsx"
import { SolidityParam } from "../TutorialSetup/SolidityParam.tsx"
import { StoredContractAddress } from "./StoredContractAddress.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
import { TutorialCard } from "../TutorialSetup/TutorialCard.tsx"
import styles from "./GrantPrivilegesStep.module.css"
diff --git a/src/components/CCIP/TutorialBlockchainSelector/PoolConfigVerification.tsx b/src/components/CCIP/TutorialBlockchainSelector/PoolConfigVerification.tsx
index 3b90bde8565..bd47a5a72b0 100644
--- a/src/components/CCIP/TutorialBlockchainSelector/PoolConfigVerification.tsx
+++ b/src/components/CCIP/TutorialBlockchainSelector/PoolConfigVerification.tsx
@@ -6,7 +6,7 @@ import styles from "./PoolConfigVerification.module.css"
import { TutorialCard, TutorialStep } from "../TutorialSetup/index.ts"
import { NetworkCheck } from "../TutorialSetup/NetworkCheck.tsx"
import { SolidityParam } from "../TutorialSetup/SolidityParam.tsx"
-import { Callout } from "../TutorialSetup/Callout.tsx"
+import { Callout } from "@components/Callout/Callout.tsx"
import { StepCheckbox } from "../TutorialProgress/StepCheckbox.tsx"
type ChainType = "source" | "destination"
diff --git a/src/components/CCIP/TutorialSetup/Callout.module.css b/src/components/Callout/Callout.module.css
similarity index 100%
rename from src/components/CCIP/TutorialSetup/Callout.module.css
rename to src/components/Callout/Callout.module.css
diff --git a/src/components/CCIP/TutorialSetup/Callout.tsx b/src/components/Callout/Callout.tsx
similarity index 100%
rename from src/components/CCIP/TutorialSetup/Callout.tsx
rename to src/components/Callout/Callout.tsx
diff --git a/src/components/ChainSelector/ChainTypeSelector.module.css b/src/components/ChainSelector/ChainTypeSelector.module.css
new file mode 100644
index 00000000000..41a417e6c67
--- /dev/null
+++ b/src/components/ChainSelector/ChainTypeSelector.module.css
@@ -0,0 +1,147 @@
+.selector {
+ display: flex;
+ align-items: center;
+ padding: var(--space-3x) var(--space-3x);
+ border-bottom: 1px solid var(--border-color, #e5e7eb);
+ background: var(--color-background-primary, #ffffff);
+ position: sticky;
+ top: 0;
+ z-index: 10;
+}
+
+.dropdown {
+ position: relative;
+ width: auto;
+ min-width: 160px;
+}
+
+.dropdownButton {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2x);
+ width: 100%;
+ padding: var(--space-2x) var(--space-3x);
+ border: 1.5px solid var(--border-color, #e5e7eb);
+ border-radius: 6px;
+ background: var(--color-background-primary, #ffffff);
+ color: var(--color-text-primary);
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.dropdownButton:hover {
+ background: var(--color-background-secondary, #f9fafb);
+ border-color: var(--color-text-tertiary, #9ca3af);
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
+ transform: translateY(-1px);
+}
+
+.dropdownButton:active {
+ transform: translateY(0);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.dropdownButton:focus-visible {
+ outline: 2px solid var(--color-blue-600, #2563eb);
+ outline-offset: 2px;
+ border-color: var(--color-blue-600, #2563eb);
+}
+
+.arrow {
+ margin-left: auto;
+ color: var(--color-text-secondary, #6b7280);
+ transition: transform 0.2s ease;
+}
+
+.arrowOpen {
+ transform: rotate(180deg);
+}
+
+.dropdownMenu {
+ position: absolute;
+ top: calc(100% + 4px);
+ left: 0;
+ right: 0;
+ margin: 0;
+ padding: var(--space-2x) 0;
+ list-style: none;
+ background: var(--color-background-primary, #ffffff);
+ border: 1.5px solid var(--border-color, #e5e7eb);
+ border-radius: 6px;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+ z-index: 100;
+ max-height: 300px;
+ overflow-y: auto;
+}
+
+.dropdownMenu li {
+ margin: 0;
+ padding: 0;
+}
+
+.dropdownItem {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2x);
+ width: 100%;
+ padding: var(--space-2x) var(--space-3x);
+ border: none;
+ background: transparent;
+ color: var(--color-text-primary);
+ font-size: 14px;
+ font-weight: 500;
+ text-align: left;
+ cursor: pointer;
+ transition: all 0.15s ease;
+}
+
+.dropdownItem:hover {
+ background: var(--color-background-secondary, #f9fafb);
+ padding-left: calc(var(--space-3x) + 2px);
+}
+
+.dropdownItem:focus-visible {
+ outline: 2px solid var(--chain-color);
+ outline-offset: -2px;
+ background: var(--color-background-secondary, #f9fafb);
+}
+
+.dropdownItemActive {
+ color: var(--color-blue-600, #2563eb);
+ font-weight: 600;
+ background: var(--color-blue-50, #eff6ff);
+}
+
+.icon {
+ width: 20px;
+ height: 20px;
+ flex-shrink: 0;
+ object-fit: contain;
+}
+
+.name {
+ white-space: nowrap;
+ flex: 1;
+}
+
+.checkmark {
+ margin-left: auto;
+ color: var(--color-blue-600, #2563eb);
+ flex-shrink: 0;
+}
+
+@media (max-width: 640px) {
+ .dropdown {
+ width: 100%;
+ min-width: 0;
+ }
+}
+
+@media (max-width: 480px) {
+ .dropdownMenu {
+ max-height: 240px;
+ }
+}
diff --git a/src/components/ChainSelector/ChainTypeSelector.tsx b/src/components/ChainSelector/ChainTypeSelector.tsx
new file mode 100644
index 00000000000..2ebf21e6cdd
--- /dev/null
+++ b/src/components/ChainSelector/ChainTypeSelector.tsx
@@ -0,0 +1,154 @@
+/** @jsxImportSource react */
+import { useStore } from "@nanostores/react"
+import { useState, useRef, useEffect } from "react"
+import { selectedChainType, setChainType } from "~/stores/chainType.js"
+import { CHAIN_TYPE_CONFIGS, CCIP_SUPPORTED_CHAINS } from "~/config/chainTypes.js"
+import { CCIP_SIDEBAR_CONTENT } from "~/config/sidebar/ccip-dynamic.js"
+import { findEquivalentPageUrlWithFallback } from "~/utils/chainNavigation.js"
+import type { ChainType } from "~/config/types.js"
+import styles from "./ChainTypeSelector.module.css"
+
+/**
+ * Chain Type Dropdown Selector Component
+ *
+ * Allows users to filter CCIP documentation by blockchain type (EVM, Solana, Aptos).
+ * Uses a dropdown design that scales well with many chain types.
+ *
+ * Features:
+ * - Scalable dropdown design (works with 10+ chains)
+ * - Smart navigation: automatically switches to equivalent page for selected chain
+ * - Sidebar-driven: uses sidebar config as source of truth for navigation
+ * - Reactive UI based on nanostore state
+ * - Google Analytics tracking
+ * - Keyboard accessible (ARIA compliant)
+ * - Click-outside to close
+ * - Mobile responsive
+ *
+ * Behavior:
+ * - If equivalent page exists for target chain → Navigate to it
+ * - If no equivalent page → Update filter state only (sidebar filters content)
+ */
+export function ChainTypeSelector() {
+ const activeChain = useStore(selectedChainType)
+ const [isOpen, setIsOpen] = useState(false)
+ const dropdownRef = useRef(null)
+
+ const activeConfig = CHAIN_TYPE_CONFIGS[activeChain]
+
+ const handleSelect = (chainType: ChainType) => {
+ setIsOpen(false)
+ setChainType(chainType)
+
+ // Find target URL with intelligent fallback: exact match → parent → section root
+ const targetUrl = findEquivalentPageUrlWithFallback(window.location.pathname, chainType, CCIP_SIDEBAR_CONTENT)
+
+ window.location.href = `/${targetUrl}`
+ }
+
+ const handleToggle = () => {
+ setIsOpen(!isOpen)
+ }
+
+ useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
+ setIsOpen(false)
+ }
+ }
+
+ const handleEscape = (event: KeyboardEvent) => {
+ if (event.key === "Escape") {
+ setIsOpen(false)
+ }
+ }
+
+ if (isOpen) {
+ document.addEventListener("mousedown", handleClickOutside)
+ document.addEventListener("keydown", handleEscape)
+ }
+
+ return () => {
+ document.removeEventListener("mousedown", handleClickOutside)
+ document.removeEventListener("keydown", handleEscape)
+ }
+ }, [isOpen])
+
+ return (
+
+
+
+
+ {isOpen && (
+
+ {CCIP_SUPPORTED_CHAINS.map((chainId) => {
+ const config = CHAIN_TYPE_CONFIGS[chainId]
+ const isActive = activeChain === chainId
+
+ return (
+ -
+
+
+ )
+ })}
+
+ )}
+
+
+ )
+}
diff --git a/src/components/ChainSelector/index.ts b/src/components/ChainSelector/index.ts
index 1cb164ba5dd..57b3f27bcc7 100644
--- a/src/components/ChainSelector/index.ts
+++ b/src/components/ChainSelector/index.ts
@@ -1 +1 @@
-export { ChainSelector } from "./ChainSelector.tsx"
+export { ChainTypeSelector } from "./ChainTypeSelector.js"
diff --git a/src/components/DocsNavigation/DocsNavigationMobile/DocsPickerMobile.tsx b/src/components/DocsNavigation/DocsNavigationMobile/DocsPickerMobile.tsx
index e5dc6e20dfe..e082a265aa1 100644
--- a/src/components/DocsNavigation/DocsNavigationMobile/DocsPickerMobile.tsx
+++ b/src/components/DocsNavigation/DocsNavigationMobile/DocsPickerMobile.tsx
@@ -53,15 +53,6 @@ export function ProductNavigation({ path }: Props) {
const label = subProductTrigger?.label || "Resources"
const icon = subProductTrigger?.label ? subProductTrigger.icon : defaultLogo.src
- // Helper function to recursively map pages and preserve all metadata
- const mapPageWithChildren = (page: any): any => ({
- label: page.label,
- href: page.href,
- sdkLang: page.sdkLang,
- highlightAsCurrent: page.highlightAsCurrent,
- children: page.children ? page.children.map(mapPageWithChildren) : [],
- })
-
useEffect(() => {
const foundSubProduct = productsNav.categories.find((category) =>
category.items.some((item) => item.subProducts && isMatchedPath(path, item.href))
@@ -74,7 +65,7 @@ export function ProductNavigation({ path }: Props) {
const items = subProduct.subProducts.map((subProductItem) => ({
label: subProductItem.label,
href: "#",
- pages: subProductItem.items.map(mapPageWithChildren),
+ pages: subProductItem.items,
}))
const safeSubProducts: SubProducts = {
diff --git a/src/components/DocsNavigation/DocsNavigationMobile/SubProductContent.tsx b/src/components/DocsNavigation/DocsNavigationMobile/SubProductContent.tsx
index 99f89956e95..64ec4f93fc5 100644
--- a/src/components/DocsNavigation/DocsNavigationMobile/SubProductContent.tsx
+++ b/src/components/DocsNavigation/DocsNavigationMobile/SubProductContent.tsx
@@ -1,6 +1,8 @@
import React, { useEffect, useRef } from "react"
import { useStore } from "@nanostores/react"
import { selectedLanguage } from "~/lib/languageStore.js"
+import { selectedChainType } from "~/stores/chainType.js"
+import { applyChainTypeFilter } from "~/utils/chainType.js"
import { BackArrowIcon } from "./BackArrowIcon.js"
import { Page } from "../../Header/Nav/config.js"
import styles from "./subProductContent.module.css"
@@ -42,8 +44,17 @@ const PageLink = ({ page, currentPath, level }: { page: Page; currentPath: strin
fontWeight: isActive ? "500" : "normal",
}
+ // Format chainTypes as data attribute (matching desktop sidebar)
+ const chainAttr = page.chainTypes ? page.chainTypes.join(",") : "universal"
+
return (
-
+
{page.label}
)
@@ -52,7 +63,7 @@ const PageLink = ({ page, currentPath, level }: { page: Page; currentPath: strin
const renderPages = (pages: Page[], currentPath: string, currentLang: string, level = 0): React.ReactNode[] => {
return pages
.filter((page) => {
- // If page has sdkLang, only show if it matches current language
+ // Filter by sdkLang (for CRE language switching)
if (page.sdkLang) {
return page.sdkLang === currentLang
}
@@ -71,6 +82,12 @@ const renderPages = (pages: Page[], currentPath: string, currentLang: string, le
export const SubProductContent = ({ subProducts, onSubproductClick, currentPath }: Props) => {
const currentLang = useStore(selectedLanguage)
+ const currentChain = useStore(selectedChainType)
+
+ // Apply chain type filtering using shared utility (same as desktop sidebar)
+ useEffect(() => {
+ applyChainTypeFilter(currentChain)
+ }, [currentChain])
if (!subProducts) {
return null
diff --git a/src/components/Header/Nav/config.tsx b/src/components/Header/Nav/config.tsx
index 57abd653415..bac5db35a47 100644
--- a/src/components/Header/Nav/config.tsx
+++ b/src/components/Header/Nav/config.tsx
@@ -1,3 +1,5 @@
+import type { ChainType } from "~/config/types.js"
+
type LinksConfig = {
docs?: boolean
githubUrl?: string
@@ -8,6 +10,7 @@ export type Page = {
label: string
href: string
sdkLang?: string
+ chainTypes?: ChainType[]
highlightAsCurrent?: string[]
children?: Page[]
}
diff --git a/src/components/Header/getNavigationProps.ts b/src/components/Header/getNavigationProps.ts
index 9e677b4a73d..0d1ae9a88ef 100644
--- a/src/components/Header/getNavigationProps.ts
+++ b/src/components/Header/getNavigationProps.ts
@@ -12,11 +12,14 @@ import generalLogo from "../../assets/product-logos/general-logo.svg"
import nodesLogo from "../../assets/product-logos/node-logo.svg"
import quickstartLogo from "../../assets/product-logos/quickstart-logo.svg"
import { SIDEBAR as sidebar } from "../../config/sidebar.ts"
+import type { ChainType } from "../../config/types.js"
+import { propagateChainTypes } from "../../utils/chainType.js"
interface Page {
label: string
href: string
sdkLang?: string
+ chainTypes?: ChainType[]
children?: Page[]
}
@@ -24,6 +27,7 @@ interface SidebarContent {
title?: string
url?: string
highlightAsCurrent?: string[]
+ chainTypes?: ChainType[]
children?: SidebarContent[]
}
@@ -37,6 +41,7 @@ const mapContents = (contents: SidebarContent[], pageSdkLangMap: Map) => {
- const structuredData = sectionData.map((item) => ({
- label: item.section,
- items: mapContents(item.contents, pageSdkLangMap),
- }))
+ const structuredData = sectionData.map((item) => {
+ // Propagate chainTypes from parent to children for consistent filtering
+ const contentsWithPropagatedChainTypes = propagateChainTypes(item.contents)
+ return {
+ label: item.section,
+ items: mapContents(contentsWithPropagatedChainTypes, pageSdkLangMap),
+ }
+ })
return structuredData
}
diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro
index 1af517d074d..22f952c9d10 100644
--- a/src/components/LeftSidebar/LeftSidebar.astro
+++ b/src/components/LeftSidebar/LeftSidebar.astro
@@ -4,6 +4,10 @@ import { SIDEBAR } from "../../config"
import type { SectionEntry, SectionContent } from "../../config"
import RecursiveSidebar from "./RecursiveSidebar.astro"
import { LanguageSwitcherDropdown } from "~/components/LanguageSwitcherDropdown"
+import { ChainTypeSelector } from "~/components/ChainSelector"
+import { isChainAwareSection } from "~/config/chainTypes"
+import { filterContentByChainType } from "~/utils/chainType"
+import type { ChainType } from "~/config/types"
import styles from "./leftSidebar.module.css"
type SectionEntryWithParent = SectionEntry & { parentSection?: string }
@@ -15,6 +19,9 @@ export type Props = {
const { currentPage, section } = Astro.props
+// Check if this section supports chain type filtering
+const showChainSelector = isChainAwareSection(section)
+
// Return whichever sections we need
function getSidebarSections(section?: Sections): SectionEntryWithParent[] {
if (!section) {
@@ -83,6 +90,7 @@ const sidebarSections = getSidebarSections(section)
)
}
+ {showChainSelector && }
{
sidebarSections.map((group) => (
@@ -116,6 +124,21 @@ const sidebarSections = getSidebarSections(section)
+
+
diff --git a/src/components/LeftSidebar/RecursiveSidebar.astro b/src/components/LeftSidebar/RecursiveSidebar.astro
index bddb45c8401..7baa4252c5b 100644
--- a/src/components/LeftSidebar/RecursiveSidebar.astro
+++ b/src/components/LeftSidebar/RecursiveSidebar.astro
@@ -115,8 +115,10 @@ function shouldExpandSection(item: SectionContent, currentPage: string): boolean
{
items.map((item) => {
const sdkLang = item.url ? pageSdkLangMap.get(item.url) : undefined
+ const chainTypes = item.chainTypes
+ const chainAttr = chainTypes ? chainTypes.join(",") : "universal"
return (
- -
+
-
{item.children ? (
= {
+ evm: {
+ id: "evm",
+ displayName: "EVM",
+ icon: "/assets/chains/ethereum.svg",
+ color: "#627EEA", // Ethereum blue
+ description: "Ethereum Virtual Machine compatible chains",
+ },
+ solana: {
+ id: "solana",
+ displayName: "Solana",
+ icon: "/assets/chains/solana.svg",
+ color: "#14F195", // Solana green
+ description: "Solana blockchain",
+ },
+ aptos: {
+ id: "aptos",
+ displayName: "Aptos",
+ icon: "/assets/chains/aptos.svg",
+ color: "#00D4AA", // Aptos teal
+ description: "Aptos Move blockchain",
+ },
+}
+
+/**
+ * Chain types supported in CCIP
+ * Currently: EVM, Solana, Aptos
+ */
+export const CCIP_SUPPORTED_CHAINS: ChainType[] = ["evm", "solana", "aptos"]
+
+/**
+ * Sections that support chain type filtering (OPT-IN)
+ * Add new products here when they support multiple chains
+ */
+const CHAIN_AWARE_SECTIONS = new Set(["ccip"])
+
+/**
+ * Check if a section supports chain filtering
+ * @param section - Section identifier (e.g., 'ccip', 'cre')
+ * @returns true if section has chain-aware navigation
+ */
+export function isChainAwareSection(section?: string): boolean {
+ return section ? CHAIN_AWARE_SECTIONS.has(section) : false
+}
+
+/**
+ * Default chain type for new users
+ */
+export const DEFAULT_CHAIN_TYPE: ChainType = "evm"
+
+/**
+ * LocalStorage key for persisting user selection
+ */
+export const CHAIN_TYPE_STORAGE_KEY = "chainlink-docs-chain-type"
+
+/**
+ * Google Analytics event names for tracking
+ */
+export const GA_EVENTS = {
+ CHAIN_SELECTOR_CLICK: "chain_selector_click",
+ CHAIN_AUTO_DETECTED: "chain_auto_detected",
+} as const
diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts
index 62108d8bf9b..f3525bc5f14 100644
--- a/src/config/sidebar.ts
+++ b/src/config/sidebar.ts
@@ -5,13 +5,8 @@
import { Sections } from "../content.config.ts"
import { SIDEBAR_SECTIONS } from "./sidebarSections.ts"
-import evmCcipV150Contents from "./sidebar/ccip/api-reference/evm/v1_5_0.json" with { type: "json" }
-import evmCcipV151Contents from "./sidebar/ccip/api-reference/evm/v1_5_1.json" with { type: "json" }
-import evmCcipV160Contents from "./sidebar/ccip/api-reference/evm/v1_6_0.json" with { type: "json" }
-import evmCcipV161Contents from "./sidebar/ccip/api-reference/evm/v1_6_1.json" with { type: "json" }
-import evmCcipV162Contents from "./sidebar/ccip/api-reference/evm/v1_6_2.json" with { type: "json" }
-import aptosCcipV160Contents from "./sidebar/ccip/api-reference/aptos/v1_6_0.json" with { type: "json" }
-import svmCcipV011Contents from "./sidebar/ccip/api-reference/svm/v0_1_1.json" with { type: "json" }
+import { CCIP_SIDEBAR_CONTENT } from "./sidebar/ccip-dynamic.ts"
+import type { ChainType } from "./types.js"
import chainlinkLocalV021Contents from "./sidebar/chainlink-local/api-reference/v0_2_1.json" with { type: "json" }
import chainlinkLocalV022Contents from "./sidebar/chainlink-local/api-reference/v0_2_2.json" with { type: "json" }
import chainlinkLocalV023Contents from "./sidebar/chainlink-local/api-reference/v0_2_3.json" with { type: "json" }
@@ -25,6 +20,7 @@ import chainlinkLocalV023Contents from "./sidebar/chainlink-local/api-reference/
* @property highlightAsCurrent - Optional array of URLs that should highlight this item as current
* @property children - Optional array of nested navigation items
* @property isCollapsible - Optional flag to control if a section can be collapsed
+ * @property chainTypes - Optional array of chain types this item belongs to (for chain-aware sections like CCIP)
*/
export type SectionContent = {
title: string
@@ -32,6 +28,7 @@ export type SectionContent = {
highlightAsCurrent?: string[]
children?: SectionContent[]
isCollapsible?: boolean
+ chainTypes?: ChainType[]
}
/**
@@ -1689,632 +1686,7 @@ export const SIDEBAR: Partial> = {
],
},
],
- [SIDEBAR_SECTIONS.CCIP]: [
- {
- section: "Chainlink CCIP",
- contents: [
- {
- title: "About CCIP",
- url: "ccip",
- },
- {
- title: "Getting Started",
- url: "ccip/getting-started",
- children: [
- {
- title: "EVM",
- url: "ccip/getting-started/evm",
- },
- {
- title: "Solana",
- url: "ccip/getting-started/svm",
- },
- ],
- },
- {
- title: "CCIP Directory",
- url: "ccip/directory",
- children: [
- {
- title: "Mainnet",
- url: "ccip/directory/mainnet",
- },
- {
- title: "Testnet",
- url: "ccip/directory/testnet",
- },
- ],
- },
- {
- title: "Service Limits",
- url: "ccip/service-limits",
- children: [
- {
- title: "EVM",
- url: "ccip/service-limits/evm",
- },
- {
- title: "Solana",
- url: "ccip/service-limits/svm",
- },
- {
- title: "Aptos",
- url: "ccip/service-limits/aptos",
- },
- {
- title: "Network Specific",
- url: "ccip/service-limits/network-specific-limits",
- },
- ],
- },
- {
- title: "Service Responsibility",
- url: "ccip/service-responsibility",
- },
- {
- title: "Execution Latency",
- url: "ccip/ccip-execution-latency",
- },
- {
- title: "Billing",
- url: "ccip/billing",
- },
- {
- title: "Release Notes",
- url: "https://dev.chain.link/changelog?product=CCIP",
- },
- ],
- },
- {
- section: "Concepts",
- contents: [
- {
- title: "Architecture",
- url: "ccip/concepts/architecture",
- children: [
- {
- title: "Overview",
- url: "ccip/concepts/architecture/overview",
- },
- {
- title: "Key Concepts",
- url: "ccip/concepts/architecture/key-concepts",
- },
- {
- title: "Onchain Architecture",
- url: "ccip/concepts/architecture/onchain",
- children: [
- {
- title: "EVM",
- url: "ccip/concepts/architecture/onchain/evm",
- children: [
- {
- title: "Overview",
- url: "ccip/concepts/architecture/onchain/evm/overview",
- },
- {
- title: "Components",
- url: "ccip/concepts/architecture/onchain/evm/components",
- },
- {
- title: "Upgradability",
- url: "ccip/concepts/architecture/onchain/evm/upgradability",
- },
- ],
- },
- {
- title: "Solana",
- url: "ccip/concepts/architecture/onchain/svm",
- children: [
- {
- title: "Overview",
- url: "ccip/concepts/architecture/onchain/svm/overview",
- },
- {
- title: "Components",
- url: "ccip/concepts/architecture/onchain/svm/components",
- },
- {
- title: "Upgradability",
- url: "ccip/concepts/architecture/onchain/svm/upgradability",
- },
- ],
- },
- {
- title: "Aptos",
- url: "ccip/concepts/architecture/onchain/aptos",
- children: [
- {
- title: "Overview",
- url: "ccip/concepts/architecture/onchain/aptos/overview",
- },
- {
- title: "Components",
- url: "ccip/concepts/architecture/onchain/aptos/components",
- },
- {
- title: "Upgradability",
- url: "ccip/concepts/architecture/onchain/aptos/upgradability",
- },
- ],
- },
- ],
- },
- {
- title: "Offchain Architecture",
- url: "ccip/concepts/architecture/offchain",
- children: [
- {
- title: "Overview",
- url: "ccip/concepts/architecture/offchain/overview",
- },
- {
- title: "Risk Management Network",
- url: "ccip/concepts/architecture/offchain/risk-management-network",
- },
- ],
- },
- ],
- },
- {
- title: "Cross-Chain Token (CCT) Standard",
- url: "ccip/concepts/cross-chain-token",
- children: [
- {
- title: "Overview",
- url: "ccip/concepts/cross-chain-token/overview",
- },
- {
- title: "EVM",
- url: "ccip/concepts/cross-chain-token/evm",
- children: [
- {
- title: "Tokens",
- url: "ccip/concepts/cross-chain-token/evm/tokens",
- },
- {
- title: "Token Pools",
- url: "ccip/concepts/cross-chain-token/evm/token-pools",
- },
- {
- title: "Architecture",
- url: "ccip/concepts/cross-chain-token/evm/architecture",
- },
- {
- title: "Registration and Administration",
- url: "ccip/concepts/cross-chain-token/evm/registration-administration",
- },
- {
- title: "Upgradability",
- url: "ccip/concepts/cross-chain-token/evm/upgradability",
- },
- ],
- },
- {
- title: "Solana",
- url: "ccip/concepts/cross-chain-token/svm",
- children: [
- {
- title: "Architecture",
- url: "ccip/concepts/cross-chain-token/svm/architecture",
- },
- {
- title: "Tokens",
- url: "ccip/concepts/cross-chain-token/svm/tokens",
- },
- {
- title: "Token Pools",
- url: "ccip/concepts/cross-chain-token/svm/token-pools",
- },
- {
- title: "Integration Guide",
- url: "ccip/concepts/cross-chain-token/svm/integration-guide",
- },
- {
- title: "Registration and Administration",
- url: "ccip/concepts/cross-chain-token/svm/registration-administration",
- },
- {
- title: "Upgradability",
- url: "ccip/concepts/cross-chain-token/svm/upgradability",
- },
- ],
- },
- ],
- },
- {
- title: "Manual execution",
- url: "ccip/concepts/manual-execution",
- },
- {
- title: "Best Practices",
- url: "ccip/concepts/best-practices",
- children: [
- {
- title: "EVM",
- url: "ccip/concepts/best-practices/evm",
- },
- {
- title: "Solana",
- url: "ccip/concepts/best-practices/svm",
- },
- {
- title: "Aptos",
- url: "ccip/concepts/best-practices/aptos",
- },
- ],
- },
- ],
- },
- {
- section: "Tutorials",
- contents: [
- {
- title: "Acquire Test Tokens",
- url: "ccip/test-tokens",
- },
- {
- title: "EVM",
- url: "ccip/tutorials/evm",
- children: [
- {
- title: "Transfer Tokens",
- url: "ccip/tutorials/evm/transfer-tokens-from-contract",
- },
- {
- title: "Transfer Tokens with Data",
- url: "ccip/tutorials/evm/programmable-token-transfers",
- },
- {
- title: "Transfer Tokens with Data - Defensive Example",
- url: "ccip/tutorials/evm/programmable-token-transfers-defensive",
- },
- {
- title: "Using the Token Manager",
- url: "ccip/tutorials/evm/token-manager",
- },
- {
- title: "Using the CCIP JavaScript SDK",
- url: "ccip/ccip-javascript-sdk",
- },
- {
- title: "Offchain",
- url: "ccip/tutorials/evm/offchain",
- children: [
- {
- title: "Transfer Tokens between EOAs",
- url: "ccip/tutorials/evm/offchain/transfer-tokens-from-eoa",
- },
- {
- title: "Checking CCIP Message Status",
- url: "ccip/tutorials/evm/offchain/get-status-offchain",
- },
- {
- title: "Using CCIP CLI",
- url: "ccip/tutorials/evm/offchain/ccip-tools",
- children: [
- {
- title: "Transfer Tokens between EOAs",
- url: "ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa",
- },
- {
- title: "Checking CCIP Message Status",
- url: "ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain",
- },
- {
- title: "Get Supported Tokens",
- url: "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens",
- },
- ],
- },
- ],
- },
- {
- title: "Cross-Chain Token (CCT) standard",
- url: "ccip/tutorials/evm/cross-chain-tokens",
- children: [
- {
- title: "Using Remix IDE",
- children: [
- {
- title: "Deploy and Register from an EOA",
- url: "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-remix",
- },
- ],
- },
- {
- title: "Using Hardhat / Foundry",
- children: [
- {
- title: "Register from an EOA (Burn & Mint)",
- url: "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-hardhat",
- highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-foundry"],
- },
- {
- title: "Register from an EOA (Lock & Mint)",
- url: "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-hardhat",
- highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-foundry"],
- },
- {
- title: "Set Token Pool rate limits",
- url: "ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-hardhat",
- highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-foundry"],
- },
- {
- title: "Register from a Safe Smart Account (Burn & Mint)",
- url: "ccip/tutorials/evm/cross-chain-tokens/register-from-safe-burn-mint-hardhat",
- },
- {
- title: "Configure Additional Networks",
- url: "ccip/tutorials/evm/cross-chain-tokens/configure-additional-networks-hardhat",
- highlightAsCurrent: [
- "ccip/tutorials/evm/cross-chain-tokens/configure-additional-networks-foundry",
- ],
- },
- ],
- },
- ],
- },
- {
- title: "Test CCIP Locally",
- url: "ccip/tutorials/evm/test-ccip-locally",
- },
- {
- title: "Transfer USDC with Data",
- url: "ccip/tutorials/evm/usdc",
- },
- {
- title: "Send Arbitrary Data",
- url: "ccip/tutorials/evm/send-arbitrary-data",
- },
- {
- title: "Send Arbitrary Data and Receive Transfer Confirmation: A -> B -> A",
- url: "ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment",
- },
- {
- title: "Manual Execution",
- url: "ccip/tutorials/evm/manual-execution",
- },
- {
- title: "Optimizing Gas Limit Settings in CCIP Messages",
- url: "ccip/tutorials/evm/ccipreceive-gaslimit",
- },
- ],
- },
- {
- title: "Solana",
- url: "ccip/tutorials/svm",
- children: [
- {
- title: "Implement CCIP Receiver",
- url: "ccip/tutorials/svm/receivers",
- },
- {
- title: "Solana as Source",
- url: "ccip/tutorials/svm/source",
- children: [
- {
- title: "Build CCIP Messages",
- url: "ccip/tutorials/svm/source/build-messages",
- },
- {
- title: "Prerequisites",
- url: "ccip/tutorials/svm/source/prerequisites",
- },
- {
- title: "Token Transfers",
- url: "ccip/tutorials/svm/source/token-transfers",
- },
- ],
- },
- {
- title: "Solana as Destination",
- url: "ccip/tutorials/svm/destination",
- children: [
- {
- title: "Build CCIP Messages",
- url: "ccip/tutorials/svm/destination/build-messages",
- },
- {
- title: "Token Transfers",
- url: "ccip/tutorials/svm/destination/token-transfers",
- },
- {
- title: "Arbitrary Messaging",
- url: "ccip/tutorials/svm/destination/arbitrary-messaging",
- },
- ],
- },
- {
- title: "Cross-Chain Token (CCT) standard",
- url: "ccip/tutorials/svm/cross-chain-tokens",
- children: [
- {
- title: "BurnMint: Direct Mint Authority Transfer",
- url: "ccip/tutorials/svm/cross-chain-tokens/direct-mint-authority",
- },
- {
- title: "BurnMint: SPL Token Multisig Tutorial",
- url: "ccip/tutorials/svm/cross-chain-tokens/spl-token-multisig-tutorial",
- },
- {
- title: "BurnMint: Production Multisig Governance",
- url: "ccip/tutorials/svm/cross-chain-tokens/production-multisig-tutorial",
- },
- {
- title: "LockRelease: Production Governance",
- url: "ccip/tutorials/svm/cross-chain-tokens/lock-release-multisig",
- },
- ],
- },
- ],
- },
- {
- title: "Aptos",
- url: "ccip/tutorials/aptos",
- children: [
- {
- title: "Implement CCIP Receiver",
- url: "ccip/tutorials/aptos/receivers",
- },
- {
- title: "Aptos as Source",
- url: "ccip/tutorials/aptos/source",
- children: [
- {
- title: "Build CCIP Messages",
- url: "ccip/tutorials/aptos/source/build-messages",
- },
- {
- title: "Prerequisites",
- url: "ccip/tutorials/aptos/source/prerequisites",
- },
- {
- title: "Token Transfers",
- url: "ccip/tutorials/aptos/source/token-transfers",
- },
- ],
- },
- {
- title: "Aptos as Destination",
- url: "ccip/tutorials/aptos/destination",
- children: [
- {
- title: "Build CCIP Messages",
- url: "ccip/tutorials/aptos/destination/build-messages",
- },
- {
- title: "Prerequisites",
- url: "ccip/tutorials/aptos/destination/prerequisites",
- },
- {
- title: "Token Transfers",
- url: "ccip/tutorials/aptos/destination/token-transfers",
- },
- {
- title: "Arbitrary Messaging",
- url: "ccip/tutorials/aptos/destination/arbitrary-messaging",
- },
- {
- title: "Programmatic Token Transfers",
- url: "ccip/tutorials/aptos/destination/programmatic-token-transfers",
- },
- ],
- },
- {
- title: "Cross-Chain Token (CCT) standard",
- url: "ccip/tutorials/aptos/cross-chain-tokens",
- },
- ],
- },
- ],
- },
- {
- section: "Tools and Resources",
- contents: [
- {
- title: "CCIP Explorer",
- url: "ccip/tools-resources/ccip-explorer",
- },
- {
- title: "Token Manager",
- url: "ccip/tools-resources/token-manager",
- },
- {
- title: "Network Specific",
- url: "ccip/tools-resources/network-specific",
- children: [
- {
- title: "Hyperliquid Integration Guide",
- url: "ccip/tools-resources/network-specific/hyperliquid-integration-guide",
- },
- {
- title: "HyperEVM Testnet RPC Guide",
- url: "ccip/tools-resources/network-specific/hyperevm-testnet-rpc",
- },
- ],
- },
- {
- title: "API Reference",
- url: "ccip/api-reference",
- children: [
- {
- title: "EVM",
- url: "ccip/api-reference/evm",
- children: [
- {
- title: "v1.6.2 (Latest)",
- url: "ccip/api-reference/evm/v1.6.2",
- isCollapsible: true,
- children: evmCcipV162Contents,
- },
- {
- title: "v1.6.1",
- url: "ccip/api-reference/evm/v1.6.1",
- isCollapsible: true,
- children: evmCcipV161Contents,
- },
- {
- title: "v1.6.0",
- url: "ccip/api-reference/evm/v1.6.0",
- isCollapsible: true,
- children: evmCcipV160Contents,
- },
- {
- title: "v1.5.1",
- url: "ccip/api-reference/evm/v1.5.1",
- isCollapsible: true,
- children: evmCcipV151Contents,
- },
- {
- title: "v1.5.0",
- url: "ccip/api-reference/evm/v1.5.0",
- isCollapsible: true,
- children: evmCcipV150Contents,
- },
- ],
- },
- {
- title: "Solana",
- url: "ccip/api-reference/svm",
- children: [
- {
- title: "v0.1.1 (Latest)",
- url: "ccip/api-reference/svm/v0.1.1",
- isCollapsible: true,
- children: svmCcipV011Contents,
- },
- ],
- },
- {
- title: "Aptos",
- url: "ccip/api-reference/aptos",
- children: [
- {
- title: "v1.6.0 (Latest)",
- url: "ccip/api-reference/aptos/v1.6.0",
- isCollapsible: true,
- children: aptosCcipV160Contents,
- },
- ],
- },
- ],
- },
- {
- title: "SDK",
- url: "ccip/tools-resources/sdk",
- },
- {
- title: "Tools",
- url: "ccip/tools-resources/tools",
- },
- {
- title: "Cross-chain Examples",
- url: "ccip/examples",
- },
- ],
- },
- ],
+ [SIDEBAR_SECTIONS.CCIP]: CCIP_SIDEBAR_CONTENT,
[SIDEBAR_SECTIONS.CHAINLINK_LOCAL]: [
{
section: "Chainlink Local",
diff --git a/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap b/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap
new file mode 100644
index 00000000000..66b21d02aa1
--- /dev/null
+++ b/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap
@@ -0,0 +1,1264 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`CCIP Sidebar Configuration Snapshot should match the expected sidebar structure snapshot 1`] = `
+[
+ {
+ "contents": [
+ {
+ "title": "Overview",
+ "url": "ccip",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Getting Started",
+ "url": "ccip/getting-started/evm",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Getting Started",
+ "url": "ccip/getting-started/svm",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Getting Started",
+ "url": "ccip/getting-started/aptos",
+ },
+ {
+ "children": [
+ {
+ "title": "Mainnet",
+ "url": "ccip/directory/mainnet",
+ },
+ {
+ "title": "Testnet",
+ "url": "ccip/directory/testnet",
+ },
+ ],
+ "title": "CCIP Directory",
+ "url": "ccip/directory",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Service Limits",
+ "url": "ccip/service-limits/evm",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Service Limits",
+ "url": "ccip/service-limits/svm",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Service Limits",
+ "url": "ccip/service-limits/aptos",
+ },
+ {
+ "title": "Service Responsibility",
+ "url": "ccip/service-responsibility",
+ },
+ {
+ "title": "Execution Latency",
+ "url": "ccip/ccip-execution-latency",
+ },
+ {
+ "title": "Billing",
+ "url": "ccip/billing",
+ },
+ {
+ "title": "Release Notes",
+ "url": "https://dev.chain.link/changelog?product=CCIP",
+ },
+ ],
+ "section": "CCIP",
+ },
+ {
+ "contents": [
+ {
+ "title": "Overview",
+ "url": "ccip/concepts/architecture/overview",
+ },
+ {
+ "title": "Key Concepts",
+ "url": "ccip/concepts/architecture/key-concepts",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Overview",
+ "url": "ccip/concepts/architecture/onchain/evm/overview",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Components",
+ "url": "ccip/concepts/architecture/onchain/evm/components",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Upgradability",
+ "url": "ccip/concepts/architecture/onchain/evm/upgradability",
+ },
+ ],
+ "title": "Onchain Architecture",
+ "url": "ccip/concepts/architecture/onchain/evm",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Overview",
+ "url": "ccip/concepts/architecture/onchain/svm/overview",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Components",
+ "url": "ccip/concepts/architecture/onchain/svm/components",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Upgradability",
+ "url": "ccip/concepts/architecture/onchain/svm/upgradability",
+ },
+ ],
+ "title": "Onchain Architecture",
+ "url": "ccip/concepts/architecture/onchain/svm",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Overview",
+ "url": "ccip/concepts/architecture/onchain/aptos/overview",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Components",
+ "url": "ccip/concepts/architecture/onchain/aptos/components",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Upgradability",
+ "url": "ccip/concepts/architecture/onchain/aptos/upgradability",
+ },
+ ],
+ "title": "Onchain Architecture",
+ "url": "ccip/concepts/architecture/onchain/aptos",
+ },
+ {
+ "children": [
+ {
+ "title": "Overview",
+ "url": "ccip/concepts/architecture/offchain/overview",
+ },
+ {
+ "title": "Risk Management Network",
+ "url": "ccip/concepts/architecture/offchain/risk-management-network",
+ },
+ ],
+ "title": "Offchain Architecture",
+ "url": "ccip/concepts/architecture/offchain",
+ },
+ {
+ "children": [
+ {
+ "title": "Overview",
+ "url": "ccip/concepts/cross-chain-token/overview",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Tokens",
+ "url": "ccip/concepts/cross-chain-token/evm/tokens",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Token Pools",
+ "url": "ccip/concepts/cross-chain-token/evm/token-pools",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Architecture",
+ "url": "ccip/concepts/cross-chain-token/evm/architecture",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Registration and Administration",
+ "url": "ccip/concepts/cross-chain-token/evm/registration-administration",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Upgradability",
+ "url": "ccip/concepts/cross-chain-token/evm/upgradability",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Architecture",
+ "url": "ccip/concepts/cross-chain-token/svm/architecture",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Tokens",
+ "url": "ccip/concepts/cross-chain-token/svm/tokens",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Token Pools",
+ "url": "ccip/concepts/cross-chain-token/svm/token-pools",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Integration Guide",
+ "url": "ccip/concepts/cross-chain-token/svm/integration-guide",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Registration and Administration",
+ "url": "ccip/concepts/cross-chain-token/svm/registration-administration",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Upgradability",
+ "url": "ccip/concepts/cross-chain-token/svm/upgradability",
+ },
+ ],
+ "title": "Cross-Chain Token (CCT)",
+ "url": "ccip/concepts/cross-chain-token",
+ },
+ {
+ "title": "Manual execution",
+ "url": "ccip/concepts/manual-execution",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Best Practices",
+ "url": "ccip/concepts/best-practices/evm",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Best Practices",
+ "url": "ccip/concepts/best-practices/svm",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Best Practices",
+ "url": "ccip/concepts/best-practices/aptos",
+ },
+ ],
+ "section": "Concepts",
+ },
+ {
+ "contents": [
+ {
+ "title": "Acquire Test Tokens",
+ "url": "ccip/test-tokens",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Transfer Tokens",
+ "url": "ccip/tutorials/evm/transfer-tokens-from-contract",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Transfer Tokens with Data",
+ "url": "ccip/tutorials/evm/programmable-token-transfers",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Transfer Tokens with Data - Defensive Example",
+ "url": "ccip/tutorials/evm/programmable-token-transfers-defensive",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Using the Token Manager",
+ "url": "ccip/tutorials/evm/token-manager",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Using the CCIP JavaScript SDK",
+ "url": "ccip/ccip-javascript-sdk",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Transfer Tokens between EOAs",
+ "url": "ccip/tutorials/evm/offchain/transfer-tokens-from-eoa",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Checking CCIP Message Status",
+ "url": "ccip/tutorials/evm/offchain/get-status-offchain",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Transfer Tokens between EOAs",
+ "url": "ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Checking CCIP Message Status",
+ "url": "ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Get Supported Tokens",
+ "url": "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens",
+ },
+ ],
+ "title": "Using CCIP CLI",
+ "url": "ccip/tutorials/evm/offchain/ccip-tools",
+ },
+ ],
+ "title": "Offchain",
+ "url": "ccip/tutorials/evm/offchain",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Deploy and Register from an EOA",
+ "url": "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-remix",
+ },
+ ],
+ "title": "Using Remix IDE",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "highlightAsCurrent": [
+ "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-foundry",
+ ],
+ "title": "Register from an EOA (Burn & Mint)",
+ "url": "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-hardhat",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "highlightAsCurrent": [
+ "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-foundry",
+ ],
+ "title": "Register from an EOA (Lock & Mint)",
+ "url": "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-hardhat",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "highlightAsCurrent": [
+ "ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-foundry",
+ ],
+ "title": "Set Token Pool rate limits",
+ "url": "ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-hardhat",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Register from a Safe Smart Account (Burn & Mint)",
+ "url": "ccip/tutorials/evm/cross-chain-tokens/register-from-safe-burn-mint-hardhat",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "highlightAsCurrent": [
+ "ccip/tutorials/evm/cross-chain-tokens/configure-additional-networks-foundry",
+ ],
+ "title": "Configure Additional Networks",
+ "url": "ccip/tutorials/evm/cross-chain-tokens/configure-additional-networks-hardhat",
+ },
+ ],
+ "title": "Using Hardhat / Foundry",
+ },
+ ],
+ "title": "Cross-Chain Token (CCT)",
+ "url": "ccip/tutorials/evm/cross-chain-tokens",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Test CCIP Locally",
+ "url": "ccip/tutorials/evm/test-ccip-locally",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Transfer USDC with Data",
+ "url": "ccip/tutorials/evm/usdc",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Send Arbitrary Data",
+ "url": "ccip/tutorials/evm/send-arbitrary-data",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Send Arbitrary Data and Receive Transfer Confirmation: A -> B -> A",
+ "url": "ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Manual Execution",
+ "url": "ccip/tutorials/evm/manual-execution",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Optimizing Gas Limit Settings in CCIP Messages",
+ "url": "ccip/tutorials/evm/ccipreceive-gaslimit",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Implement CCIP Receiver",
+ "url": "ccip/tutorials/svm/receivers",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Build CCIP Messages",
+ "url": "ccip/tutorials/svm/source/build-messages",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Prerequisites",
+ "url": "ccip/tutorials/svm/source/prerequisites",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Token Transfers",
+ "url": "ccip/tutorials/svm/source/token-transfers",
+ },
+ ],
+ "title": "Source",
+ "url": "ccip/tutorials/svm/source",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Build CCIP Messages",
+ "url": "ccip/tutorials/svm/destination/build-messages",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Token Transfers",
+ "url": "ccip/tutorials/svm/destination/token-transfers",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "Arbitrary Messaging",
+ "url": "ccip/tutorials/svm/destination/arbitrary-messaging",
+ },
+ ],
+ "title": "Destination",
+ "url": "ccip/tutorials/svm/destination",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "BurnMint: Direct Mint Authority Transfer",
+ "url": "ccip/tutorials/svm/cross-chain-tokens/direct-mint-authority",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "BurnMint: SPL Token Multisig Tutorial",
+ "url": "ccip/tutorials/svm/cross-chain-tokens/spl-token-multisig-tutorial",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "BurnMint: Production Multisig Governance",
+ "url": "ccip/tutorials/svm/cross-chain-tokens/production-multisig-tutorial",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "title": "LockRelease: Production Governance",
+ "url": "ccip/tutorials/svm/cross-chain-tokens/lock-release-multisig",
+ },
+ ],
+ "title": "Cross-Chain Token (CCT)",
+ "url": "ccip/tutorials/svm/cross-chain-tokens",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Implement CCIP Receiver",
+ "url": "ccip/tutorials/aptos/receivers",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Build CCIP Messages",
+ "url": "ccip/tutorials/aptos/source/build-messages",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Prerequisites",
+ "url": "ccip/tutorials/aptos/source/prerequisites",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Token Transfers",
+ "url": "ccip/tutorials/aptos/source/token-transfers",
+ },
+ ],
+ "title": "Source",
+ "url": "ccip/tutorials/aptos/source",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Build CCIP Messages",
+ "url": "ccip/tutorials/aptos/destination/build-messages",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Prerequisites",
+ "url": "ccip/tutorials/aptos/destination/prerequisites",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Token Transfers",
+ "url": "ccip/tutorials/aptos/destination/token-transfers",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Arbitrary Messaging",
+ "url": "ccip/tutorials/aptos/destination/arbitrary-messaging",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Programmable Token Transfers",
+ "url": "ccip/tutorials/aptos/destination/programmable-token-transfers",
+ },
+ ],
+ "title": "Destination",
+ "url": "ccip/tutorials/aptos/destination",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "title": "Cross-Chain Token (CCT)",
+ "url": "ccip/tutorials/aptos/cross-chain-tokens",
+ },
+ ],
+ "section": "Tutorials",
+ },
+ {
+ "contents": [
+ {
+ "title": "CCIP Explorer",
+ "url": "ccip/tools-resources/ccip-explorer",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Token Manager",
+ "url": "ccip/tools-resources/token-manager",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "Hyperliquid Integration Guide",
+ "url": "ccip/tools-resources/network-specific/hyperliquid-integration-guide",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "HyperEVM Testnet RPC Guide",
+ "url": "ccip/tools-resources/network-specific/hyperevm-testnet-rpc",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "HyperEVM Service Limits",
+ "url": "ccip/service-limits/evm/hyperevm",
+ },
+ ],
+ "title": "Network Specific",
+ "url": "ccip/tools-resources/network-specific",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "title": "Client Library",
+ "url": "ccip/api-reference/evm/v1.6.2/client",
+ },
+ {
+ "title": "ITypeAndVersion",
+ "url": "ccip/api-reference/evm/v1.6.2/i-type-and-version",
+ },
+ {
+ "title": "IRouterClient",
+ "url": "ccip/api-reference/evm/v1.6.2/i-router-client",
+ },
+ {
+ "title": "CCIPReceiver",
+ "url": "ccip/api-reference/evm/v1.6.2/ccip-receiver",
+ },
+ {
+ "title": "Pool Library",
+ "url": "ccip/api-reference/evm/v1.6.2/pool",
+ },
+ {
+ "title": "TokenPool",
+ "url": "ccip/api-reference/evm/v1.6.2/token-pool",
+ },
+ {
+ "title": "BurnMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.2/burn-mint-token-pool",
+ },
+ {
+ "title": "BurnMintTokenPoolAbstract",
+ "url": "ccip/api-reference/evm/v1.6.2/burn-mint-token-pool-abstract",
+ },
+ {
+ "title": "BurnFromMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.2/burn-from-mint-token-pool",
+ },
+ {
+ "title": "LockReleaseTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.2/lock-release-token-pool",
+ },
+ {
+ "title": "TokenAdminRegistry",
+ "url": "ccip/api-reference/evm/v1.6.2/token-admin-registry",
+ },
+ {
+ "title": "RegistryModuleOwnerCustom",
+ "url": "ccip/api-reference/evm/v1.6.2/registry-module-owner-custom",
+ },
+ {
+ "title": "BurnMintERC20",
+ "url": "ccip/api-reference/evm/v1.6.2/burn-mint-erc20",
+ },
+ {
+ "title": "RateLimiter Library",
+ "url": "ccip/api-reference/evm/v1.6.2/rate-limiter",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/evm/v1.6.2/errors",
+ },
+ {
+ "title": "Ownable2Step",
+ "url": "ccip/api-reference/evm/v1.6.2/ownable-2-step",
+ },
+ {
+ "title": "Ownable2StepMsgSender",
+ "url": "ccip/api-reference/evm/v1.6.2/ownable-2-step-msg-sender",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.6.2 (Latest)",
+ "url": "ccip/api-reference/evm/v1.6.2",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "title": "Client Library",
+ "url": "ccip/api-reference/evm/v1.6.1/client",
+ },
+ {
+ "title": "ITypeAndVersion",
+ "url": "ccip/api-reference/evm/v1.6.1/i-type-and-version",
+ },
+ {
+ "title": "IRouterClient",
+ "url": "ccip/api-reference/evm/v1.6.1/i-router-client",
+ },
+ {
+ "title": "CCIPReceiver",
+ "url": "ccip/api-reference/evm/v1.6.1/ccip-receiver",
+ },
+ {
+ "title": "Pool Library",
+ "url": "ccip/api-reference/evm/v1.6.1/pool",
+ },
+ {
+ "title": "TokenPool",
+ "url": "ccip/api-reference/evm/v1.6.1/token-pool",
+ },
+ {
+ "title": "BurnMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.1/burn-mint-token-pool",
+ },
+ {
+ "title": "BurnMintTokenPoolAbstract",
+ "url": "ccip/api-reference/evm/v1.6.1/burn-mint-token-pool-abstract",
+ },
+ {
+ "title": "BurnFromMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.1/burn-from-mint-token-pool",
+ },
+ {
+ "title": "LockReleaseTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.1/lock-release-token-pool",
+ },
+ {
+ "title": "TokenAdminRegistry",
+ "url": "ccip/api-reference/evm/v1.6.1/token-admin-registry",
+ },
+ {
+ "title": "RegistryModuleOwnerCustom",
+ "url": "ccip/api-reference/evm/v1.6.1/registry-module-owner-custom",
+ },
+ {
+ "title": "BurnMintERC20",
+ "url": "ccip/api-reference/evm/v1.6.1/burn-mint-erc20",
+ },
+ {
+ "title": "RateLimiter Library",
+ "url": "ccip/api-reference/evm/v1.6.1/rate-limiter",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/evm/v1.6.1/errors",
+ },
+ {
+ "title": "Ownable2Step",
+ "url": "ccip/api-reference/evm/v1.6.1/ownable-2-step",
+ },
+ {
+ "title": "Ownable2StepMsgSender",
+ "url": "ccip/api-reference/evm/v1.6.1/ownable-2-step-msg-sender",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.6.1",
+ "url": "ccip/api-reference/evm/v1.6.1",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "title": "Client Library",
+ "url": "ccip/api-reference/evm/v1.6.0/client",
+ },
+ {
+ "title": "ITypeAndVersion",
+ "url": "ccip/api-reference/evm/v1.6.0/i-type-and-version",
+ },
+ {
+ "title": "IRouterClient",
+ "url": "ccip/api-reference/evm/v1.6.0/i-router-client",
+ },
+ {
+ "title": "CCIPReceiver",
+ "url": "ccip/api-reference/evm/v1.6.0/ccip-receiver",
+ },
+ {
+ "title": "Pool Library",
+ "url": "ccip/api-reference/evm/v1.6.0/pool",
+ },
+ {
+ "title": "TokenPool",
+ "url": "ccip/api-reference/evm/v1.6.0/token-pool",
+ },
+ {
+ "title": "BurnMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.0/burn-mint-token-pool",
+ },
+ {
+ "title": "BurnMintTokenPoolAbstract",
+ "url": "ccip/api-reference/evm/v1.6.0/burn-mint-token-pool-abstract",
+ },
+ {
+ "title": "BurnFromMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.0/burn-from-mint-token-pool",
+ },
+ {
+ "title": "LockReleaseTokenPool",
+ "url": "ccip/api-reference/evm/v1.6.0/lock-release-token-pool",
+ },
+ {
+ "title": "TokenAdminRegistry",
+ "url": "ccip/api-reference/evm/v1.6.0/token-admin-registry",
+ },
+ {
+ "title": "RegistryModuleOwnerCustom",
+ "url": "ccip/api-reference/evm/v1.6.0/registry-module-owner-custom",
+ },
+ {
+ "title": "BurnMintERC20",
+ "url": "ccip/api-reference/evm/v1.6.0/burn-mint-erc20",
+ },
+ {
+ "title": "RateLimiter Library",
+ "url": "ccip/api-reference/evm/v1.6.0/rate-limiter",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/evm/v1.6.0/errors",
+ },
+ {
+ "title": "Ownable2Step",
+ "url": "ccip/api-reference/evm/v1.6.0/ownable-2-step",
+ },
+ {
+ "title": "Ownable2StepMsgSender",
+ "url": "ccip/api-reference/evm/v1.6.0/ownable-2-step-msg-sender",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.6.0",
+ "url": "ccip/api-reference/evm/v1.6.0",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "title": "Client Library",
+ "url": "ccip/api-reference/evm/v1.5.1/client",
+ },
+ {
+ "title": "ITypeAndVersion",
+ "url": "ccip/api-reference/evm/v1.5.1/i-type-and-version",
+ },
+ {
+ "title": "IRouterClient",
+ "url": "ccip/api-reference/evm/v1.5.1/i-router-client",
+ },
+ {
+ "title": "CCIPReceiver",
+ "url": "ccip/api-reference/evm/v1.5.1/ccip-receiver",
+ },
+ {
+ "title": "Pool Library",
+ "url": "ccip/api-reference/evm/v1.5.1/pool",
+ },
+ {
+ "title": "TokenPool",
+ "url": "ccip/api-reference/evm/v1.5.1/token-pool",
+ },
+ {
+ "title": "BurnMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.5.1/burn-mint-token-pool",
+ },
+ {
+ "title": "BurnMintTokenPoolAbstract",
+ "url": "ccip/api-reference/evm/v1.5.1/burn-mint-token-pool-abstract",
+ },
+ {
+ "title": "BurnFromMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.5.1/burn-from-mint-token-pool",
+ },
+ {
+ "title": "LockReleaseTokenPool",
+ "url": "ccip/api-reference/evm/v1.5.1/lock-release-token-pool",
+ },
+ {
+ "title": "TokenAdminRegistry",
+ "url": "ccip/api-reference/evm/v1.5.1/token-admin-registry",
+ },
+ {
+ "title": "RegistryModuleOwnerCustom",
+ "url": "ccip/api-reference/evm/v1.5.1/registry-module-owner-custom",
+ },
+ {
+ "title": "BurnMintERC20",
+ "url": "ccip/api-reference/evm/v1.5.1/burn-mint-erc20",
+ },
+ {
+ "title": "RateLimiter Library",
+ "url": "ccip/api-reference/evm/v1.5.1/rate-limiter",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/evm/v1.5.1/errors",
+ },
+ {
+ "title": "Ownable2Step",
+ "url": "ccip/api-reference/evm/v1.5.1/ownable-2-step",
+ },
+ {
+ "title": "Ownable2StepMsgSender",
+ "url": "ccip/api-reference/evm/v1.5.1/ownable-2-step-msg-sender",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.5.1",
+ "url": "ccip/api-reference/evm/v1.5.1",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "children": [
+ {
+ "title": "Client Library",
+ "url": "ccip/api-reference/evm/v1.5.0/client",
+ },
+ {
+ "title": "ITypeAndVersion",
+ "url": "ccip/api-reference/evm/v1.5.0/i-type-and-version",
+ },
+ {
+ "title": "IRouterClient",
+ "url": "ccip/api-reference/evm/v1.5.0/i-router-client",
+ },
+ {
+ "title": "CCIPReceiver",
+ "url": "ccip/api-reference/evm/v1.5.0/ccip-receiver",
+ },
+ {
+ "title": "Pool Library",
+ "url": "ccip/api-reference/evm/v1.5.0/pool",
+ },
+ {
+ "title": "TokenPool",
+ "url": "ccip/api-reference/evm/v1.5.0/token-pool",
+ },
+ {
+ "title": "BurnMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.5.0/burn-mint-token-pool",
+ },
+ {
+ "title": "BurnMintTokenPoolAbstract",
+ "url": "ccip/api-reference/evm/v1.5.0/burn-mint-token-pool-abstract",
+ },
+ {
+ "title": "BurnFromMintTokenPool",
+ "url": "ccip/api-reference/evm/v1.5.0/burn-from-mint-token-pool",
+ },
+ {
+ "title": "LockReleaseTokenPool",
+ "url": "ccip/api-reference/evm/v1.5.0/lock-release-token-pool",
+ },
+ {
+ "title": "TokenAdminRegistry",
+ "url": "ccip/api-reference/evm/v1.5.0/token-admin-registry",
+ },
+ {
+ "title": "RegistryModuleOwnerCustom",
+ "url": "ccip/api-reference/evm/v1.5.0/registry-module-owner-custom",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/evm/v1.5.0/errors",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.5.0",
+ "url": "ccip/api-reference/evm/v1.5.0",
+ },
+ ],
+ "title": "API Reference",
+ "url": "ccip/api-reference/evm",
+ },
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "solana",
+ ],
+ "children": [
+ {
+ "title": "Messages",
+ "url": "ccip/api-reference/svm/v1.6.0/messages",
+ },
+ {
+ "title": "Router",
+ "url": "ccip/api-reference/svm/v1.6.0/router",
+ },
+ {
+ "title": "Receiver",
+ "url": "ccip/api-reference/svm/v1.6.0/receiver",
+ },
+ {
+ "title": "Base Token Pool Library",
+ "url": "ccip/api-reference/svm/v1.6.0/base-token-pool",
+ },
+ {
+ "title": "BurnMint Token Pool",
+ "url": "ccip/api-reference/svm/v1.6.0/burn-mint-token-pool",
+ },
+ {
+ "title": "Lock-Release Token Pool",
+ "url": "ccip/api-reference/svm/v1.6.0/lock-release-token-pool",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/svm/v1.6.0/errors",
+ },
+ {
+ "title": "Events",
+ "url": "ccip/api-reference/svm/v1.6.0/events",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.6.0",
+ "url": "ccip/api-reference/svm/v1.6.0",
+ },
+ ],
+ "title": "API Reference",
+ "url": "ccip/api-reference/svm",
+ },
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "children": [
+ {
+ "chainTypes": [
+ "aptos",
+ ],
+ "children": [
+ {
+ "title": "Messages",
+ "url": "ccip/api-reference/aptos/v1.6.0/messages",
+ },
+ {
+ "title": "Router",
+ "url": "ccip/api-reference/aptos/v1.6.0/router",
+ },
+ {
+ "title": "Receiver",
+ "url": "ccip/api-reference/aptos/v1.6.0/receiver",
+ },
+ {
+ "title": "Client",
+ "url": "ccip/api-reference/aptos/v1.6.0/client",
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/aptos/v1.6.0/errors",
+ },
+ {
+ "title": "Events",
+ "url": "ccip/api-reference/aptos/v1.6.0/events",
+ },
+ ],
+ "isCollapsible": true,
+ "title": "v1.6.0",
+ "url": "ccip/api-reference/aptos/v1.6.0",
+ },
+ ],
+ "title": "API Reference",
+ "url": "ccip/api-reference/aptos",
+ },
+ {
+ "chainTypes": [
+ "evm",
+ ],
+ "title": "SDK",
+ "url": "ccip/tools-resources/sdk",
+ },
+ {
+ "title": "CLI",
+ "url": "ccip/tools-resources/cli",
+ },
+ {
+ "title": "Cross-chain Examples",
+ "url": "ccip/examples",
+ },
+ ],
+ "section": "Tools and Resources",
+ },
+]
+`;
diff --git a/src/config/sidebar/__tests__/ccip-dynamic.test.ts b/src/config/sidebar/__tests__/ccip-dynamic.test.ts
new file mode 100644
index 00000000000..75efd1c3f30
--- /dev/null
+++ b/src/config/sidebar/__tests__/ccip-dynamic.test.ts
@@ -0,0 +1,481 @@
+import { describe, it, expect } from "@jest/globals"
+import { CCIP_SIDEBAR_CONTENT } from "../ccip-dynamic.ts"
+import type { SectionEntry, SectionContent } from "../../sidebar.ts"
+import type { ChainType } from "../../types.ts"
+
+describe("CCIP Sidebar Configuration", () => {
+ describe("Structural Integrity", () => {
+ it("should export CCIP_SIDEBAR_CONTENT as an array", () => {
+ expect(Array.isArray(CCIP_SIDEBAR_CONTENT)).toBe(true)
+ expect(CCIP_SIDEBAR_CONTENT.length).toBeGreaterThan(0)
+ })
+
+ it("should have required fields for all sections", () => {
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ expect(section.section).toBeDefined()
+ expect(typeof section.section).toBe("string")
+ expect(section.contents).toBeDefined()
+ expect(Array.isArray(section.contents)).toBe(true)
+ })
+ })
+
+ it("should have required fields for all content items", () => {
+ const validateItem = (item: SectionContent, path: string) => {
+ // Every item must have a title
+ expect(item.title).toBeDefined()
+ expect(typeof item.title).toBe("string")
+ expect(item.title.length).toBeGreaterThan(0)
+
+ // If item has a URL, it should be a string
+ if (item.url !== undefined) {
+ expect(typeof item.url).toBe("string")
+ }
+
+ // If item has children, it should be an array
+ if (item.children !== undefined) {
+ expect(Array.isArray(item.children)).toBe(true)
+ item.children.forEach((child: SectionContent, index: number) => {
+ validateItem(child, `${path} > ${item.title} > [${index}]`)
+ })
+ }
+
+ // If item has chainTypes, it should be an array of valid chain types
+ if (item.chainTypes !== undefined) {
+ expect(Array.isArray(item.chainTypes)).toBe(true)
+ item.chainTypes.forEach((chainType: ChainType) => {
+ expect(["evm", "solana", "aptos"]).toContain(chainType)
+ })
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach((item: SectionContent, index: number) => {
+ validateItem(item, `${section.section} > [${index}]`)
+ })
+ })
+ })
+
+ it("should only contain valid chainTypes", () => {
+ const validChainTypes = ["evm", "solana", "aptos"]
+
+ const checkChainTypes = (item: SectionContent) => {
+ if (item.chainTypes) {
+ item.chainTypes.forEach((chainType) => {
+ expect(validChainTypes).toContain(chainType)
+ })
+ }
+ if (item.children) {
+ item.children.forEach(checkChainTypes)
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(checkChainTypes)
+ })
+ })
+ })
+
+ describe("URL Validation", () => {
+ const collectAllUrls = (items: SectionContent[]): string[] => {
+ const urls: string[] = []
+ const traverse = (item: SectionContent) => {
+ if (item.url) {
+ urls.push(item.url)
+ }
+ if (item.children) {
+ item.children.forEach(traverse)
+ }
+ }
+ items.forEach(traverse)
+ return urls
+ }
+
+ it("should have unique URLs across all sections", () => {
+ const allUrls: string[] = []
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ const sectionUrls = collectAllUrls(section.contents)
+ allUrls.push(...sectionUrls)
+ })
+
+ const duplicates = allUrls.filter((url, index) => allUrls.indexOf(url) !== index)
+ expect(duplicates).toEqual([])
+ })
+
+ it("should not have trailing slashes in URLs", () => {
+ const checkUrl = (item: SectionContent) => {
+ if (item.url) {
+ expect(item.url.endsWith("/")).toBe(false)
+ }
+ if (item.children) {
+ item.children.forEach(checkUrl)
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(checkUrl)
+ })
+ })
+
+ it("should not have leading slashes in URLs", () => {
+ const checkUrl = (item: SectionContent) => {
+ if (item.url) {
+ expect(item.url.startsWith("/")).toBe(false)
+ }
+ if (item.children) {
+ item.children.forEach(checkUrl)
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(checkUrl)
+ })
+ })
+
+ it("should have valid URL format (lowercase, hyphens, forward slashes) or be external URLs", () => {
+ const validInternalUrlPattern = /^[a-z0-9\-/.]+$/
+ const validExternalUrlPattern = /^https?:\/\//
+
+ const checkUrl = (item: SectionContent, path: string) => {
+ if (item.url) {
+ const isExternal = validExternalUrlPattern.test(item.url)
+ const isValidInternal = validInternalUrlPattern.test(item.url)
+ expect(isExternal || isValidInternal).toBe(true)
+ }
+ if (item.children) {
+ item.children.forEach((child: SectionContent, index: number) => {
+ checkUrl(child, `${path} > ${item.title} > [${index}]`)
+ })
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach((item: SectionContent, index: number) => {
+ checkUrl(item, `${section.section} > [${index}]`)
+ })
+ })
+ })
+
+ it("should start internal URLs with 'ccip' (external URLs allowed)", () => {
+ const checkUrl = (item: SectionContent) => {
+ if (item.url) {
+ // External URLs are allowed (starting with http:// or https://)
+ const isExternal = item.url.startsWith("http://") || item.url.startsWith("https://")
+ if (!isExternal) {
+ // Internal URLs should start with "ccip" or "ccip/"
+ expect(item.url === "ccip" || item.url.startsWith("ccip/")).toBe(true)
+ }
+ }
+ if (item.children) {
+ item.children.forEach(checkUrl)
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(checkUrl)
+ })
+ })
+ })
+
+ describe("Chain Type Logic", () => {
+ it("should correctly inherit chainTypes from parent to children when children don't specify", () => {
+ const checkInheritance = (parent: SectionContent | null, item: SectionContent) => {
+ // If item has no chainTypes but parent does, it should inherit
+ // This test documents the expected behavior for navigation logic
+ if (item.children) {
+ item.children.forEach((child) => {
+ if (child.chainTypes && item.chainTypes) {
+ // Child explicitly sets chainTypes - verify they're a subset or equal to parent
+ // (This is a logical constraint - children shouldn't be MORE general than parent)
+ // This is a soft recommendation - we document it but don't enforce strictly
+ // as there might be valid cases where child expands beyond parent
+ }
+ checkInheritance(item, child)
+ })
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach((item) => {
+ checkInheritance(null, item)
+ })
+ })
+ })
+
+ it("should have consistent chain type usage across sections", () => {
+ const chainTypeCounts = { evm: 0, solana: 0, aptos: 0 }
+
+ const countChainTypes = (item: SectionContent) => {
+ if (item.chainTypes) {
+ item.chainTypes.forEach((ct) => {
+ chainTypeCounts[ct as keyof typeof chainTypeCounts]++
+ })
+ }
+ if (item.children) {
+ item.children.forEach(countChainTypes)
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(countChainTypes)
+ })
+
+ // All chain types should be used at least once
+ expect(chainTypeCounts.evm).toBeGreaterThan(0)
+ expect(chainTypeCounts.solana).toBeGreaterThan(0)
+ expect(chainTypeCounts.aptos).toBeGreaterThan(0)
+ })
+
+ it("should have EVM-specific content marked correctly", () => {
+ // Known EVM-only items should be marked with chainTypes: ["evm"]
+ const evmOnlyItems = ["Token Manager", "SDK"]
+
+ const findItems = (title: string): SectionContent[] => {
+ const found: SectionContent[] = []
+ const search = (item: SectionContent) => {
+ if (item.title === title) {
+ found.push(item)
+ }
+ if (item.children) {
+ item.children.forEach(search)
+ }
+ }
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(search)
+ })
+ return found
+ }
+
+ evmOnlyItems.forEach((title) => {
+ const items = findItems(title)
+ items.forEach((item) => {
+ expect(item.chainTypes).toBeDefined()
+ expect(item.chainTypes).toEqual(["evm"])
+ })
+ })
+ })
+ })
+
+ describe("Hierarchy Validation", () => {
+ it("should not have circular references in children", () => {
+ const checkCircular = (item: SectionContent, ancestors: Set) => {
+ expect(ancestors.has(item)).toBe(false)
+
+ if (item.children) {
+ const newAncestors = new Set(ancestors)
+ newAncestors.add(item)
+ item.children.forEach((child) => {
+ checkCircular(child, newAncestors)
+ })
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach((item) => {
+ checkCircular(item, new Set())
+ })
+ })
+ })
+
+ it("should have reasonable nesting depth (max 3 levels)", () => {
+ const checkDepth = (item: SectionContent, depth: number) => {
+ expect(depth).toBeLessThanOrEqual(3)
+ if (item.children) {
+ item.children.forEach((child) => {
+ checkDepth(child, depth + 1)
+ })
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach((item) => {
+ checkDepth(item, 1)
+ })
+ })
+ })
+
+ it("should have URLs on leaf nodes (items without children)", () => {
+ const checkLeafNodes = (item: SectionContent) => {
+ if (!item.children || item.children.length === 0) {
+ // Leaf node - should have a URL
+ expect(item.url).toBeDefined()
+ expect(typeof item.url).toBe("string")
+ }
+ if (item.children) {
+ item.children.forEach(checkLeafNodes)
+ }
+ }
+
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ section.contents.forEach(checkLeafNodes)
+ })
+ })
+ })
+
+ describe("Content Consistency", () => {
+ it("should have well-known sections", () => {
+ const sectionNames = CCIP_SIDEBAR_CONTENT.map((s) => s.section)
+
+ // These are known major sections that should exist
+ const expectedSections = ["CCIP", "Concepts", "Tutorials", "Tools and Resources"]
+
+ expectedSections.forEach((expectedSection) => {
+ expect(sectionNames).toContain(expectedSection)
+ })
+ })
+
+ it("should have Tools and Resources section with expected items", () => {
+ const toolsSection = CCIP_SIDEBAR_CONTENT.find((s) => s.section === "Tools and Resources")
+ expect(toolsSection).toBeDefined()
+
+ if (toolsSection) {
+ const itemTitles = toolsSection.contents.map((item) => item.title)
+ expect(itemTitles).toContain("CLI")
+ expect(itemTitles).toContain("SDK")
+ expect(itemTitles).toContain("Token Manager")
+ }
+ })
+ })
+
+ describe("Regression Prevention", () => {
+ it("should maintain CLI redirect (formerly Tools)", () => {
+ // Verify that CLI item exists with correct URL
+ const findCLI = (items: SectionContent[]): SectionContent | null => {
+ for (const item of items) {
+ if (item.title === "CLI") {
+ return item
+ }
+ if (item.children) {
+ const found = findCLI(item.children)
+ if (found) return found
+ }
+ }
+ return null
+ }
+
+ let cliItem: SectionContent | null = null
+ for (const section of CCIP_SIDEBAR_CONTENT) {
+ cliItem = findCLI(section.contents)
+ if (cliItem) break
+ }
+
+ expect(cliItem).toBeDefined()
+ expect(cliItem?.url).toBe("ccip/tools-resources/cli")
+ // CLI should be universal (no chainTypes restriction)
+ expect(cliItem?.chainTypes).toBeUndefined()
+ })
+
+ it("should maintain HyperEVM as EVM-specific content", () => {
+ const findHyperEVM = (items: SectionContent[]): SectionContent | null => {
+ for (const item of items) {
+ if (item.title === "HyperEVM") {
+ return item
+ }
+ if (item.children) {
+ const found = findHyperEVM(item.children)
+ if (found) return found
+ }
+ }
+ return null
+ }
+
+ let hyperEvmItem: SectionContent | null = null
+ for (const section of CCIP_SIDEBAR_CONTENT) {
+ hyperEvmItem = findHyperEVM(section.contents)
+ if (hyperEvmItem) break
+ }
+
+ if (hyperEvmItem) {
+ expect(hyperEvmItem.chainTypes).toBeDefined()
+ expect(hyperEvmItem.chainTypes).toEqual(["evm"])
+ }
+ })
+
+ it("should maintain SDK as EVM-only", () => {
+ const findSDK = (items: SectionContent[]): SectionContent | null => {
+ for (const item of items) {
+ if (item.title === "SDK") {
+ return item
+ }
+ if (item.children) {
+ const found = findSDK(item.children)
+ if (found) return found
+ }
+ }
+ return null
+ }
+
+ let sdkItem: SectionContent | null = null
+ for (const section of CCIP_SIDEBAR_CONTENT) {
+ sdkItem = findSDK(section.contents)
+ if (sdkItem) break
+ }
+
+ expect(sdkItem).toBeDefined()
+ expect(sdkItem?.chainTypes).toBeDefined()
+ expect(sdkItem?.chainTypes).toEqual(["evm"])
+ })
+
+ it("should maintain Token Manager as EVM-only", () => {
+ const findTokenManager = (items: SectionContent[]): SectionContent | null => {
+ for (const item of items) {
+ if (item.title === "Token Manager") {
+ return item
+ }
+ if (item.children) {
+ const found = findTokenManager(item.children)
+ if (found) return found
+ }
+ }
+ return null
+ }
+
+ let tokenManagerItem: SectionContent | null = null
+ for (const section of CCIP_SIDEBAR_CONTENT) {
+ tokenManagerItem = findTokenManager(section.contents)
+ if (tokenManagerItem) break
+ }
+
+ expect(tokenManagerItem).toBeDefined()
+ expect(tokenManagerItem?.chainTypes).toBeDefined()
+ expect(tokenManagerItem?.chainTypes).toEqual(["evm"])
+ })
+ })
+
+ describe("Snapshot", () => {
+ it("should match the expected sidebar structure snapshot", () => {
+ // This test will fail if the structure changes significantly
+ // Update the snapshot when intentional changes are made
+ expect(CCIP_SIDEBAR_CONTENT).toMatchSnapshot()
+ })
+
+ it("should maintain expected number of top-level sections", () => {
+ // Document the expected count to catch unintended additions/removals
+ // Current sections: CCIP, Concepts, Tutorials, Tools and Resources
+ expect(CCIP_SIDEBAR_CONTENT.length).toBe(4)
+ })
+
+ it("should maintain expected URL count", () => {
+ const collectAllUrls = (items: SectionContent[]): string[] => {
+ const urls: string[] = []
+ const traverse = (item: SectionContent) => {
+ if (item.url) {
+ urls.push(item.url)
+ }
+ if (item.children) {
+ item.children.forEach(traverse)
+ }
+ }
+ items.forEach(traverse)
+ return urls
+ }
+
+ let totalUrls = 0
+ CCIP_SIDEBAR_CONTENT.forEach((section: SectionEntry) => {
+ totalUrls += collectAllUrls(section.contents).length
+ })
+
+ // This is a baseline - update when pages are intentionally added/removed
+ expect(totalUrls).toBeGreaterThan(50)
+ })
+ })
+})
diff --git a/src/config/sidebar/ccip-dynamic.ts b/src/config/sidebar/ccip-dynamic.ts
new file mode 100644
index 00000000000..258a29a894d
--- /dev/null
+++ b/src/config/sidebar/ccip-dynamic.ts
@@ -0,0 +1,701 @@
+/**
+ * CCIP Sidebar with Chain Type Metadata
+ *
+ * This sidebar configuration includes chainTypes annotations to enable
+ * dynamic filtering based on selected blockchain (EVM, Solana, Aptos).
+ *
+ * Rules:
+ * - No chainTypes = Universal content (shown for all chains)
+ * - chainTypes: ['evm'] = EVM-specific content
+ * - chainTypes: ['solana'] = Solana-specific content
+ * - chainTypes: ['aptos'] = Aptos-specific content
+ * - chainTypes: ['evm', 'solana'] = Shown for both EVM and Solana
+ */
+
+import type { SectionEntry } from "../sidebar.js"
+import evmCcipV150Contents from "./ccip/api-reference/evm/v1_5_0.json" with { type: "json" }
+import evmCcipV151Contents from "./ccip/api-reference/evm/v1_5_1.json" with { type: "json" }
+import evmCcipV160Contents from "./ccip/api-reference/evm/v1_6_0.json" with { type: "json" }
+import evmCcipV161Contents from "./ccip/api-reference/evm/v1_6_1.json" with { type: "json" }
+import evmCcipV162Contents from "./ccip/api-reference/evm/v1_6_2.json" with { type: "json" }
+import aptosCcipV160Contents from "./ccip/api-reference/aptos/v1_6_0.json" with { type: "json" }
+import svmCcipV160Contents from "./ccip/api-reference/svm/v1_6_0.json" with { type: "json" }
+
+/**
+ * CCIP Sidebar Content with Chain Type Annotations
+ * chainTypes properties are validated at compile-time via TypeScript
+ */
+export const CCIP_SIDEBAR_CONTENT: SectionEntry[] = [
+ {
+ section: "CCIP",
+ contents: [
+ {
+ title: "Overview",
+ url: "ccip",
+ // Universal - no chainTypes
+ },
+ {
+ title: "Getting Started",
+ url: "ccip/getting-started/evm",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Getting Started",
+ url: "ccip/getting-started/svm",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Getting Started",
+ url: "ccip/getting-started/aptos",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "CCIP Directory",
+ url: "ccip/directory",
+ // Universal
+ children: [
+ {
+ title: "Mainnet",
+ url: "ccip/directory/mainnet",
+ },
+ {
+ title: "Testnet",
+ url: "ccip/directory/testnet",
+ },
+ ],
+ },
+ {
+ title: "Service Limits",
+ url: "ccip/service-limits/evm",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Service Limits",
+ url: "ccip/service-limits/svm",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Service Limits",
+ url: "ccip/service-limits/aptos",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Service Responsibility",
+ url: "ccip/service-responsibility",
+ },
+ {
+ title: "Execution Latency",
+ url: "ccip/ccip-execution-latency",
+ },
+ {
+ title: "Billing",
+ url: "ccip/billing",
+ },
+ {
+ title: "Release Notes",
+ url: "https://dev.chain.link/changelog?product=CCIP",
+ },
+ ],
+ },
+ {
+ section: "Concepts",
+ contents: [
+ {
+ title: "Overview",
+ url: "ccip/concepts/architecture/overview",
+ // Universal
+ },
+ {
+ title: "Key Concepts",
+ url: "ccip/concepts/architecture/key-concepts",
+ // Universal
+ },
+ {
+ title: "Onchain Architecture",
+ url: "ccip/concepts/architecture/onchain/evm",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Overview",
+ url: "ccip/concepts/architecture/onchain/evm/overview",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Components",
+ url: "ccip/concepts/architecture/onchain/evm/components",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Upgradability",
+ url: "ccip/concepts/architecture/onchain/evm/upgradability",
+ chainTypes: ["evm"],
+ },
+ ],
+ },
+ {
+ title: "Onchain Architecture",
+ url: "ccip/concepts/architecture/onchain/svm",
+ chainTypes: ["solana"],
+ children: [
+ {
+ title: "Overview",
+ url: "ccip/concepts/architecture/onchain/svm/overview",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Components",
+ url: "ccip/concepts/architecture/onchain/svm/components",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Upgradability",
+ url: "ccip/concepts/architecture/onchain/svm/upgradability",
+ chainTypes: ["solana"],
+ },
+ ],
+ },
+ {
+ title: "Onchain Architecture",
+ url: "ccip/concepts/architecture/onchain/aptos",
+ chainTypes: ["aptos"],
+ children: [
+ {
+ title: "Overview",
+ url: "ccip/concepts/architecture/onchain/aptos/overview",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Components",
+ url: "ccip/concepts/architecture/onchain/aptos/components",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Upgradability",
+ url: "ccip/concepts/architecture/onchain/aptos/upgradability",
+ chainTypes: ["aptos"],
+ },
+ ],
+ },
+ {
+ title: "Offchain Architecture",
+ url: "ccip/concepts/architecture/offchain",
+ // Universal
+ children: [
+ {
+ title: "Overview",
+ url: "ccip/concepts/architecture/offchain/overview",
+ },
+ {
+ title: "Risk Management Network",
+ url: "ccip/concepts/architecture/offchain/risk-management-network",
+ },
+ ],
+ },
+ {
+ title: "Cross-Chain Token (CCT)",
+ url: "ccip/concepts/cross-chain-token",
+ children: [
+ {
+ title: "Overview",
+ url: "ccip/concepts/cross-chain-token/overview",
+ // Universal
+ },
+ {
+ title: "Tokens",
+ url: "ccip/concepts/cross-chain-token/evm/tokens",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Token Pools",
+ url: "ccip/concepts/cross-chain-token/evm/token-pools",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Architecture",
+ url: "ccip/concepts/cross-chain-token/evm/architecture",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Registration and Administration",
+ url: "ccip/concepts/cross-chain-token/evm/registration-administration",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Upgradability",
+ url: "ccip/concepts/cross-chain-token/evm/upgradability",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Architecture",
+ url: "ccip/concepts/cross-chain-token/svm/architecture",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Tokens",
+ url: "ccip/concepts/cross-chain-token/svm/tokens",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Token Pools",
+ url: "ccip/concepts/cross-chain-token/svm/token-pools",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Integration Guide",
+ url: "ccip/concepts/cross-chain-token/svm/integration-guide",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Registration and Administration",
+ url: "ccip/concepts/cross-chain-token/svm/registration-administration",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Upgradability",
+ url: "ccip/concepts/cross-chain-token/svm/upgradability",
+ chainTypes: ["solana"],
+ },
+ ],
+ },
+ {
+ title: "Manual execution",
+ url: "ccip/concepts/manual-execution",
+ // Universal
+ },
+ {
+ title: "Best Practices",
+ url: "ccip/concepts/best-practices/evm",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Best Practices",
+ url: "ccip/concepts/best-practices/svm",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Best Practices",
+ url: "ccip/concepts/best-practices/aptos",
+ chainTypes: ["aptos"],
+ },
+ ],
+ },
+ {
+ section: "Tutorials",
+ contents: [
+ {
+ title: "Acquire Test Tokens",
+ url: "ccip/test-tokens",
+ // Universal
+ },
+ {
+ title: "Transfer Tokens",
+ url: "ccip/tutorials/evm/transfer-tokens-from-contract",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Transfer Tokens with Data",
+ url: "ccip/tutorials/evm/programmable-token-transfers",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Transfer Tokens with Data - Defensive Example",
+ url: "ccip/tutorials/evm/programmable-token-transfers-defensive",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Using the Token Manager",
+ url: "ccip/tutorials/evm/token-manager",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Using the CCIP JavaScript SDK",
+ url: "ccip/ccip-javascript-sdk",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Offchain",
+ url: "ccip/tutorials/evm/offchain",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Transfer Tokens between EOAs",
+ url: "ccip/tutorials/evm/offchain/transfer-tokens-from-eoa",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Checking CCIP Message Status",
+ url: "ccip/tutorials/evm/offchain/get-status-offchain",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Using CCIP CLI",
+ url: "ccip/tutorials/evm/offchain/ccip-tools",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Transfer Tokens between EOAs",
+ url: "ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Checking CCIP Message Status",
+ url: "ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Get Supported Tokens",
+ url: "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens",
+ chainTypes: ["evm"],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: "Cross-Chain Token (CCT)",
+ url: "ccip/tutorials/evm/cross-chain-tokens",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Using Remix IDE",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Deploy and Register from an EOA",
+ url: "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-remix",
+ chainTypes: ["evm"],
+ },
+ ],
+ },
+ {
+ title: "Using Hardhat / Foundry",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Register from an EOA (Burn & Mint)",
+ url: "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-hardhat",
+ highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-foundry"],
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Register from an EOA (Lock & Mint)",
+ url: "ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-hardhat",
+ highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-foundry"],
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Set Token Pool rate limits",
+ url: "ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-hardhat",
+ highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-foundry"],
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Register from a Safe Smart Account (Burn & Mint)",
+ url: "ccip/tutorials/evm/cross-chain-tokens/register-from-safe-burn-mint-hardhat",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Configure Additional Networks",
+ url: "ccip/tutorials/evm/cross-chain-tokens/configure-additional-networks-hardhat",
+ highlightAsCurrent: ["ccip/tutorials/evm/cross-chain-tokens/configure-additional-networks-foundry"],
+ chainTypes: ["evm"],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: "Test CCIP Locally",
+ url: "ccip/tutorials/evm/test-ccip-locally",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Transfer USDC with Data",
+ url: "ccip/tutorials/evm/usdc",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Send Arbitrary Data",
+ url: "ccip/tutorials/evm/send-arbitrary-data",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Send Arbitrary Data and Receive Transfer Confirmation: A -> B -> A",
+ url: "ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Manual Execution",
+ url: "ccip/tutorials/evm/manual-execution",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Optimizing Gas Limit Settings in CCIP Messages",
+ url: "ccip/tutorials/evm/ccipreceive-gaslimit",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Implement CCIP Receiver",
+ url: "ccip/tutorials/svm/receivers",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Source",
+ url: "ccip/tutorials/svm/source",
+ chainTypes: ["solana"],
+ children: [
+ {
+ title: "Build CCIP Messages",
+ url: "ccip/tutorials/svm/source/build-messages",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Prerequisites",
+ url: "ccip/tutorials/svm/source/prerequisites",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Token Transfers",
+ url: "ccip/tutorials/svm/source/token-transfers",
+ chainTypes: ["solana"],
+ },
+ ],
+ },
+ {
+ title: "Destination",
+ url: "ccip/tutorials/svm/destination",
+ chainTypes: ["solana"],
+ children: [
+ {
+ title: "Build CCIP Messages",
+ url: "ccip/tutorials/svm/destination/build-messages",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Token Transfers",
+ url: "ccip/tutorials/svm/destination/token-transfers",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "Arbitrary Messaging",
+ url: "ccip/tutorials/svm/destination/arbitrary-messaging",
+ chainTypes: ["solana"],
+ },
+ ],
+ },
+ {
+ title: "Cross-Chain Token (CCT)",
+ url: "ccip/tutorials/svm/cross-chain-tokens",
+ chainTypes: ["solana"],
+ children: [
+ {
+ title: "BurnMint: Direct Mint Authority Transfer",
+ url: "ccip/tutorials/svm/cross-chain-tokens/direct-mint-authority",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "BurnMint: SPL Token Multisig Tutorial",
+ url: "ccip/tutorials/svm/cross-chain-tokens/spl-token-multisig-tutorial",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "BurnMint: Production Multisig Governance",
+ url: "ccip/tutorials/svm/cross-chain-tokens/production-multisig-tutorial",
+ chainTypes: ["solana"],
+ },
+ {
+ title: "LockRelease: Production Governance",
+ url: "ccip/tutorials/svm/cross-chain-tokens/lock-release-multisig",
+ chainTypes: ["solana"],
+ },
+ ],
+ },
+ {
+ title: "Implement CCIP Receiver",
+ url: "ccip/tutorials/aptos/receivers",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Source",
+ url: "ccip/tutorials/aptos/source",
+ chainTypes: ["aptos"],
+ children: [
+ {
+ title: "Build CCIP Messages",
+ url: "ccip/tutorials/aptos/source/build-messages",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Prerequisites",
+ url: "ccip/tutorials/aptos/source/prerequisites",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Token Transfers",
+ url: "ccip/tutorials/aptos/source/token-transfers",
+ chainTypes: ["aptos"],
+ },
+ ],
+ },
+ {
+ title: "Destination",
+ url: "ccip/tutorials/aptos/destination",
+ chainTypes: ["aptos"],
+ children: [
+ {
+ title: "Build CCIP Messages",
+ url: "ccip/tutorials/aptos/destination/build-messages",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Prerequisites",
+ url: "ccip/tutorials/aptos/destination/prerequisites",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Token Transfers",
+ url: "ccip/tutorials/aptos/destination/token-transfers",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Arbitrary Messaging",
+ url: "ccip/tutorials/aptos/destination/arbitrary-messaging",
+ chainTypes: ["aptos"],
+ },
+ {
+ title: "Programmable Token Transfers",
+ url: "ccip/tutorials/aptos/destination/programmable-token-transfers",
+ chainTypes: ["aptos"],
+ },
+ ],
+ },
+ {
+ title: "Cross-Chain Token (CCT)",
+ url: "ccip/tutorials/aptos/cross-chain-tokens",
+ chainTypes: ["aptos"],
+ },
+ ],
+ },
+ {
+ section: "Tools and Resources",
+ contents: [
+ {
+ title: "CCIP Explorer",
+ url: "ccip/tools-resources/ccip-explorer",
+ // Universal
+ },
+ {
+ title: "Token Manager",
+ url: "ccip/tools-resources/token-manager",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "Network Specific",
+ url: "ccip/tools-resources/network-specific",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "Hyperliquid Integration Guide",
+ url: "ccip/tools-resources/network-specific/hyperliquid-integration-guide",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "HyperEVM Testnet RPC Guide",
+ url: "ccip/tools-resources/network-specific/hyperevm-testnet-rpc",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "HyperEVM Service Limits",
+ url: "ccip/service-limits/evm/hyperevm",
+ chainTypes: ["evm"],
+ },
+ ],
+ },
+ {
+ title: "API Reference",
+ url: "ccip/api-reference/evm",
+ chainTypes: ["evm"],
+ children: [
+ {
+ title: "v1.6.2 (Latest)",
+ url: "ccip/api-reference/evm/v1.6.2",
+ isCollapsible: true,
+ chainTypes: ["evm"],
+ children: evmCcipV162Contents,
+ },
+ {
+ title: "v1.6.1",
+ url: "ccip/api-reference/evm/v1.6.1",
+ isCollapsible: true,
+ chainTypes: ["evm"],
+ children: evmCcipV161Contents,
+ },
+ {
+ title: "v1.6.0",
+ url: "ccip/api-reference/evm/v1.6.0",
+ isCollapsible: true,
+ chainTypes: ["evm"],
+ children: evmCcipV160Contents,
+ },
+ {
+ title: "v1.5.1",
+ url: "ccip/api-reference/evm/v1.5.1",
+ isCollapsible: true,
+ chainTypes: ["evm"],
+ children: evmCcipV151Contents,
+ },
+ {
+ title: "v1.5.0",
+ url: "ccip/api-reference/evm/v1.5.0",
+ isCollapsible: true,
+ chainTypes: ["evm"],
+ children: evmCcipV150Contents,
+ },
+ ],
+ },
+ {
+ title: "API Reference",
+ url: "ccip/api-reference/svm",
+ chainTypes: ["solana"],
+ children: [
+ {
+ title: "v1.6.0",
+ url: "ccip/api-reference/svm/v1.6.0",
+ isCollapsible: true,
+ chainTypes: ["solana"],
+ children: svmCcipV160Contents,
+ },
+ ],
+ },
+ {
+ title: "API Reference",
+ url: "ccip/api-reference/aptos",
+ chainTypes: ["aptos"],
+ children: [
+ {
+ title: "v1.6.0",
+ url: "ccip/api-reference/aptos/v1.6.0",
+ isCollapsible: true,
+ chainTypes: ["aptos"],
+ children: aptosCcipV160Contents,
+ },
+ ],
+ },
+ {
+ title: "SDK",
+ url: "ccip/tools-resources/sdk",
+ chainTypes: ["evm"],
+ },
+ {
+ title: "CLI",
+ url: "ccip/tools-resources/cli",
+ // Universal
+ },
+ {
+ title: "Cross-chain Examples",
+ url: "ccip/examples",
+ // Universal
+ },
+ ],
+ },
+]
diff --git a/src/config/sidebar/ccip/api-reference/svm/v0_1_1.json b/src/config/sidebar/ccip/api-reference/svm/v0_1_1.json
deleted file mode 100644
index f87184d2647..00000000000
--- a/src/config/sidebar/ccip/api-reference/svm/v0_1_1.json
+++ /dev/null
@@ -1,34 +0,0 @@
-[
- {
- "title": "Messages",
- "url": "ccip/api-reference/svm/v0.1.1/messages"
- },
- {
- "title": "Router",
- "url": "ccip/api-reference/svm/v0.1.1/router"
- },
- {
- "title": "Receiver",
- "url": "ccip/api-reference/svm/v0.1.1/receiver"
- },
- {
- "title": "Base Token Pool Library",
- "url": "ccip/api-reference/svm/v0.1.1/base-token-pool"
- },
- {
- "title": "BurnMint Token Pool",
- "url": "ccip/api-reference/svm/v0.1.1/burn-mint-token-pool"
- },
- {
- "title": "Lock-Release Token Pool",
- "url": "ccip/api-reference/svm/v0.1.1/lock-release-token-pool"
- },
- {
- "title": "Errors",
- "url": "ccip/api-reference/svm/v0.1.1/errors"
- },
- {
- "title": "Events",
- "url": "ccip/api-reference/svm/v0.1.1/events"
- }
-]
diff --git a/src/config/sidebar/ccip/api-reference/svm/v1_6_0.json b/src/config/sidebar/ccip/api-reference/svm/v1_6_0.json
new file mode 100644
index 00000000000..002a16dfddf
--- /dev/null
+++ b/src/config/sidebar/ccip/api-reference/svm/v1_6_0.json
@@ -0,0 +1,34 @@
+[
+ {
+ "title": "Messages",
+ "url": "ccip/api-reference/svm/v1.6.0/messages"
+ },
+ {
+ "title": "Router",
+ "url": "ccip/api-reference/svm/v1.6.0/router"
+ },
+ {
+ "title": "Receiver",
+ "url": "ccip/api-reference/svm/v1.6.0/receiver"
+ },
+ {
+ "title": "Base Token Pool Library",
+ "url": "ccip/api-reference/svm/v1.6.0/base-token-pool"
+ },
+ {
+ "title": "BurnMint Token Pool",
+ "url": "ccip/api-reference/svm/v1.6.0/burn-mint-token-pool"
+ },
+ {
+ "title": "Lock-Release Token Pool",
+ "url": "ccip/api-reference/svm/v1.6.0/lock-release-token-pool"
+ },
+ {
+ "title": "Errors",
+ "url": "ccip/api-reference/svm/v1.6.0/errors"
+ },
+ {
+ "title": "Events",
+ "url": "ccip/api-reference/svm/v1.6.0/events"
+ }
+]
diff --git a/src/config/types.ts b/src/config/types.ts
index 7f14b29a6e1..8def06a43ba 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -74,7 +74,7 @@ export type SupportedTechnology =
| "XDC"
| "BITTENSOR"
-export type ChainType = "evm" | "solana" | "aptos" | "sui"
+export type ChainType = "evm" | "solana" | "aptos"
export type ChainFamily = "evm" | "mvm" | "svm"
diff --git a/src/config/versions/index.ts b/src/config/versions/index.ts
index c9885a4f19f..dedb72e790d 100644
--- a/src/config/versions/index.ts
+++ b/src/config/versions/index.ts
@@ -34,10 +34,10 @@ export const VERSIONS = {
},
},
svm: {
- LATEST: "v0.1.1",
- ALL: ["v0.1.1"] as const,
+ LATEST: "v1.6.0",
+ ALL: ["v1.6.0"] as const,
RELEASE_DATES: {
- "v0.1.1": "2023-10-04T00:00:00Z", // Placeholder release date – update when known
+ "v1.6.0": "2025-05-19T00:00:00Z", // 19 May 2025
},
},
aptos: {
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/base-token-pool.mdx b/src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx
similarity index 98%
rename from src/content/ccip/api-reference/svm/v0.1.1/base-token-pool.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx
index 7ff5774dff8..c62adb2ece1 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/base-token-pool.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Base Token Pool Library Reference"
+title: "CCIP v1.6.0 SVM Base Token Pool Library Reference"
metadata:
description: "Complete API documentation for the Base Token Pool library that provides shared functionality and common components for CCIP token pool implementations on SVM-based blockchains like Solana. Covers data structures, rate limiting, validation functions, and core utilities for token pool development."
excerpt: "Base Token Pool, SVM token pool library, Solana token pools, shared token pool functionality, rate limiting, token pool validation, cross-chain token transfers, token pool development, anchor library"
@@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
## Base Token Pool Library
-[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs/base-token-pool)
+[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool)
The Base Token Pool library provides foundational components and shared functionality for CCIP token pool implementations on SVM-based blockchains. This library is not deployable as a standalone program but serves as a dependency for concrete token pool implementations like BurnMint and Lock-Release pools.
@@ -397,7 +397,7 @@ pub enum CcipTokenPoolError {
### Events
-The library defines events that are emitted by pool implementations. See the [Events API Reference](/ccip/api-reference/svm/v0.1.1/events) for detailed documentation of all events including:
+The library defines events that are emitted by pool implementations. See the [Events API Reference](/ccip/api-reference/svm/v1.6.0/events) for detailed documentation of all events including:
- Configuration events (`GlobalConfigUpdated`, `RemoteChainConfigured`, etc.)
- Token operation events (`Burned`, `Minted`, `Locked`, `Released`)
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/burn-mint-token-pool.mdx b/src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx
similarity index 99%
rename from src/content/ccip/api-reference/svm/v0.1.1/burn-mint-token-pool.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx
index 3c866177379..73d3230e020 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/burn-mint-token-pool.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM BurnMint Token Pool API Reference"
+title: "CCIP v1.6.0 SVM BurnMint Token Pool API Reference"
metadata:
description: "Comprehensive API documentation for the CCIP BurnMint Token Pool program on SVM-based blockchains like Solana. Complete guide covering burn and mint operations, token pool configuration, cross-chain token transfers, multisig management, and access control for seamless interoperability."
excerpt: "BurnMint Token Pool, SVM burn mint pool, Solana token pool, cross-chain token transfers, burn and mint operations, token pool configuration, multisig management, access control, CCIP token pools"
@@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
## BurnMint Token Pool
-[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs/burnmint-token-pool)
+[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool)
Below is a complete API reference for the CCIP BurnMint Token Pool program instructions. This pool implementation burns tokens on the source chain and mints them on the destination chain.
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/errors.mdx b/src/content/ccip/api-reference/svm/v1.6.0/errors.mdx
similarity index 99%
rename from src/content/ccip/api-reference/svm/v0.1.1/errors.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/errors.mdx
index 3af4d0d4bd9..e3f263f26f4 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/errors.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/errors.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Errors API Reference"
+title: "CCIP v1.6.0 SVM Errors API Reference"
metadata:
description: "Complete API documentation for CCIP error codes and handling on SVM-based blockchains like Solana. Comprehensive reference covering router errors, token pool errors, shared errors, error resolution strategies, and debugging guidance for cross-chain development."
excerpt: "CCIP errors, SVM error codes, Solana errors, cross-chain errors, router errors, token pool errors, error handling, debugging, error resolution, blockchain troubleshooting"
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/events.mdx b/src/content/ccip/api-reference/svm/v1.6.0/events.mdx
similarity index 99%
rename from src/content/ccip/api-reference/svm/v0.1.1/events.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/events.mdx
index d71b90f3f5b..84f7295b2be 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/events.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/events.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Events API Reference"
+title: "CCIP v1.6.0 SVM Events API Reference"
metadata:
description: "Comprehensive API documentation for CCIP events on SVM-based blockchains like Solana. Complete reference covering router events, token pool events, message events, configuration events, and execution events for cross-chain monitoring and debugging."
excerpt: "CCIP events, SVM events, Solana events, cross-chain events, router events, token pool events, message events, execution events, event monitoring, blockchain logging"
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/index.mdx b/src/content/ccip/api-reference/svm/v1.6.0/index.mdx
similarity index 67%
rename from src/content/ccip/api-reference/svm/v0.1.1/index.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/index.mdx
index 2493bbc25a8..6fa94b21009 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/index.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/index.mdx
@@ -1,9 +1,9 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM API Reference"
+title: "CCIP v1.6.0 SVM API Reference"
metadata:
- description: "Complete API reference documentation for Chainlink CCIP v0.1.1 on SVM-based blockchains including Solana. Comprehensive guide covering message structures, router functionality, token pools, receiver implementation, events, and error handling for cross-chain interoperability and token transfers."
+ description: "Complete API reference documentation for Chainlink CCIP v1.6.0 on SVM-based blockchains including Solana. Comprehensive guide covering message structures, router functionality, token pools, receiver implementation, events, and error handling for cross-chain interoperability and token transfers."
excerpt: "CCIP SVM API, Solana cross-chain, blockchain interoperability, token transfers, message routing, onchain programs, anchor framework, token pools, burn mint, lock release, receiver implementation"
isIndex: true
---
@@ -12,7 +12,7 @@ import { Aside } from "@components"
import CcipCommon from "@features/ccip/CcipCommon.astro"
@@ -20,17 +20,17 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
### Core Components
-- [Messages](/ccip/api-reference/svm/v0.1.1/messages) - Message structures and extra args for cross-chain messaging
-- [Router](/ccip/api-reference/svm/v0.1.1/router) - Instructions for sending messages and managing CCIP routing on Solana
-- [Receiver](/ccip/api-reference/svm/v0.1.1/receiver) - Implementation guide for CCIP message receivers on SVM blockchains
+- [Messages](/ccip/api-reference/svm/v1.6.0/messages) - Message structures and extra args for cross-chain messaging
+- [Router](/ccip/api-reference/svm/v1.6.0/router) - Instructions for sending messages and managing CCIP routing on Solana
+- [Receiver](/ccip/api-reference/svm/v1.6.0/receiver) - Implementation guide for CCIP message receivers on SVM blockchains
### Token Pool Components
-- [Base Token Pool Library](/ccip/api-reference/svm/v0.1.1/base-token-pool) - Shared library providing common functionality for all token pool implementations
-- [BurnMint Token Pool](/ccip/api-reference/svm/v0.1.1/burn-mint-token-pool) - Token pool implementation using burn and mint strategy for cross-chain transfers
-- [Lock-Release Token Pool](/ccip/api-reference/svm/v0.1.1/lock-release-token-pool) - Token pool implementation using lock and release strategy with liquidity management
+- [Base Token Pool Library](/ccip/api-reference/svm/v1.6.0/base-token-pool) - Shared library providing common functionality for all token pool implementations
+- [BurnMint Token Pool](/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool) - Token pool implementation using burn and mint strategy for cross-chain transfers
+- [Lock-Release Token Pool](/ccip/api-reference/svm/v1.6.0/lock-release-token-pool) - Token pool implementation using lock and release strategy with liquidity management
### Reference Materials
-- [Events](/ccip/api-reference/svm/v0.1.1/events) - Event emissions for tracking cross-chain messages and token operations
-- [Errors](/ccip/api-reference/svm/v0.1.1/errors) - Comprehensive list of CCIP error codes and troubleshooting guidance
+- [Events](/ccip/api-reference/svm/v1.6.0/events) - Event emissions for tracking cross-chain messages and token operations
+- [Errors](/ccip/api-reference/svm/v1.6.0/errors) - Comprehensive list of CCIP error codes and troubleshooting guidance
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/lock-release-token-pool.mdx b/src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx
similarity index 99%
rename from src/content/ccip/api-reference/svm/v0.1.1/lock-release-token-pool.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx
index 31306595cac..529553d1547 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/lock-release-token-pool.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Lock-Release Token Pool API Reference"
+title: "CCIP v1.6.0 SVM Lock-Release Token Pool API Reference"
metadata:
description: "Comprehensive API documentation for the Lock-Release Token Pool program on SVM-based blockchains like Solana. Complete guide covering lock and release operations, liquidity management, token pool configuration, cross-chain token transfers, and rebalancer functionality for seamless interoperability."
excerpt: "Lock-Release Token Pool, SVM lock release pool, Solana token pool, cross-chain token transfers, lock and release operations, liquidity management, token pool configuration, rebalancer, CCIP token pools"
@@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
## Lock-Release Token Pool
-[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs/lockrelease-token-pool)
+[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool)
The Lock-Release Token Pool program implements a token pool that uses a lock/release strategy for cross-chain transfers. When tokens are sent cross-chain, they are locked in the pool on the source chain and released from the pool on the destination chain.
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/messages.mdx b/src/content/ccip/api-reference/svm/v1.6.0/messages.mdx
similarity index 99%
rename from src/content/ccip/api-reference/svm/v0.1.1/messages.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/messages.mdx
index 7afcfff6bc0..fca299df202 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/messages.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/messages.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Messages API Reference"
+title: "CCIP v1.6.0 SVM Messages API Reference"
metadata:
description: "Complete API documentation for CCIP message structures and extra arguments on SVM-based blockchains like Solana. Includes detailed specifications for cross-chain message formatting, token transfer data, receiver arguments, and message construction for seamless blockchain interoperability."
excerpt: "CCIP messages, SVM message structure, cross-chain messaging, Solana messages, token transfer data, receiver arguments, message formatting, blockchain interoperability, extra args"
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/receiver.mdx b/src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx
similarity index 98%
rename from src/content/ccip/api-reference/svm/v0.1.1/receiver.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx
index d566100f2e5..538c5d0ccbe 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/receiver.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Receiver API Reference"
+title: "CCIP v1.6.0 SVM Receiver API Reference"
metadata:
description: "Complete API documentation for implementing CCIP receivers on SVM-based blockchains like Solana. Detailed guide covering receiver trait implementation, message handling, cross-chain message processing, and receiver program development for blockchain interoperability."
excerpt: "CCIP receiver, SVM receiver implementation, Solana receiver, cross-chain receiver, message handling, receiver trait, ccip receive, blockchain interoperability, message processing"
@@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
## Receiver
-[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs/example-ccip-receiver)
+[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/example-ccip-receiver)
Below is a complete API reference for the `ccip_receive` instruction that must be implemented by any Solana program wishing to receive CCIP messages.
@@ -31,7 +31,7 @@ pub fn ccip_receive(
| Name | Type | Description |
| --------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
-| `message` | `Any2SVMMessage` | The cross-chain message being delivered. See [Message Structure](/ccip/api-reference/svm/v0.1.1/messages#any2svmmessage) for details. |
+| `message` | `Any2SVMMessage` | The cross-chain message being delivered. See [Message Structure](/ccip/api-reference/svm/v1.6.0/messages#any2svmmessage) for details. |
#### Context (Accounts)
diff --git a/src/content/ccip/api-reference/svm/v0.1.1/router.mdx b/src/content/ccip/api-reference/svm/v1.6.0/router.mdx
similarity index 99%
rename from src/content/ccip/api-reference/svm/v0.1.1/router.mdx
rename to src/content/ccip/api-reference/svm/v1.6.0/router.mdx
index 35e6f951cc8..7ec9e046dbd 100644
--- a/src/content/ccip/api-reference/svm/v0.1.1/router.mdx
+++ b/src/content/ccip/api-reference/svm/v1.6.0/router.mdx
@@ -1,7 +1,7 @@
---
section: ccip
date: Last Modified
-title: "CCIP v0.1.1 SVM Router API Reference"
+title: "CCIP v1.6.0 SVM Router API Reference"
metadata:
description: "Comprehensive API documentation for the CCIP Router program on SVM-based blockchains like Solana. Complete guide covering message sending, token administration, fee calculation, destination chain configuration, and router management for cross-chain interoperability."
excerpt: "CCIP Router, SVM router program, Solana router, cross-chain routing, message sending, token administration, fee calculation, destination chains, router configuration, ccip_send"
@@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
## Router
-[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs/ccip-router)
+[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/ccip-router)
Below is a complete API reference for the CCIP Router program instructions.
@@ -36,7 +36,7 @@ fn ccip_send(
| Name | Type | Description |
| ---------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `dest_chain_selector` | `u64` | The unique CCIP blockchain identifier of the destination blockchain. |
-| `message` | `SVM2AnyMessage` | Read [Messages](/ccip/api-reference/svm/v0.1.1/messages#svm2anymessage) for more details. |
+| `message` | `SVM2AnyMessage` | Read [Messages](/ccip/api-reference/svm/v1.6.0/messages#svm2anymessage) for more details. |
| `token_indexes` | `Vec` | Index offsets slicing the remaining accounts so each token's subset can be grouped (see [Context](#context-accounts)). |
##### Context (Accounts)
@@ -173,7 +173,7 @@ fn get_fee(
| Name | Type | Description |
| ---------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `dest_chain_selector` | `u64` | The unique CCIP blockchain identifier of the destination blockchain. |
-| `message` | `SVM2AnyMessage` | The message for which to calculate fees. Read [Messages](/ccip/api-reference/svm/v0.1.1/messages#svm2anymessage) for more details. |
+| `message` | `SVM2AnyMessage` | The message for which to calculate fees. Read [Messages](/ccip/api-reference/svm/v1.6.0/messages#svm2anymessage) for more details. |
##### Return Value
diff --git a/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx b/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx
index 7a8e83b7fcb..56a6ade85af 100644
--- a/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx
+++ b/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx
@@ -162,7 +162,7 @@ The `ccip::receiver_dispatcher` is a security-focused module that ensures only t
## Receiver Registry
-The `ccip::receiver_registry` is a module where developers can register their custom Move modules to make them officially recognizable as valid CCIP message receivers. A module must be registered here before it can receive data or programmatic token transfers from the `OffRamp` via the `Receiver Dispatcher`.
+The `ccip::receiver_registry` is a module where developers can register their custom Move modules to make them officially recognizable as valid CCIP message receivers. A module must be registered here before it can receive data or programmable token transfers from the `OffRamp` via the `Receiver Dispatcher`.
## Tokens and Token Pools
diff --git a/src/content/ccip/concepts/architecture/onchain/index.mdx b/src/content/ccip/concepts/architecture/onchain/index.mdx
index 1a029ae9efb..0ad3540c6de 100644
--- a/src/content/ccip/concepts/architecture/onchain/index.mdx
+++ b/src/content/ccip/concepts/architecture/onchain/index.mdx
@@ -11,8 +11,4 @@ metadata:
isIndex: true
---
-This section details the onchain components of the CCIP architecture, covering both EVM-compatible chains and SVM-based chains such as Solana.
-
-- **[EVM Architecture](/ccip/concepts/architecture/onchain/evm)**: Learn about the onchain components specific to EVM environments.
-- **[SVM Architecture](/ccip/concepts/architecture/onchain/svm)**: Explore the onchain programs and components specific for SVM environments.
-- **[Aptos Architecture](/ccip/concepts/architecture/onchain/aptos)**: Understand the onchain components and message structures for Aptos environments.
+This section details the onchain components of the CCIP architecture, including routers, onramps, offramps, commit stores, token pools, and receiver contracts or programs. These components operate directly on blockchains to enable secure cross-chain communication. The implementation varies by blockchain family (EVM, Solana, Aptos), but the core architecture remains consistent across all supported chains.
diff --git a/src/content/ccip/concepts/architecture/onchain/svm/components.mdx b/src/content/ccip/concepts/architecture/onchain/svm/components.mdx
index 2960ed5b73a..239ae99cbb8 100644
--- a/src/content/ccip/concepts/architecture/onchain/svm/components.mdx
+++ b/src/content/ccip/concepts/architecture/onchain/svm/components.mdx
@@ -44,7 +44,7 @@ This section provides more detail on the Onchain components.
**Sender Responsibilities**:
- Prepare a structured CCIP Message.
-- Include all required accounts in the transaction context, due to the SVM account model. To learn more, read the `ccip_send` [API reference](/ccip/api-reference/svm/v0.1.1/router).
+- Include all required accounts in the transaction context, due to the SVM account model. To learn more, read the `ccip_send` [API reference](/ccip/api-reference/svm/v1.6.0/router).
- Retrieve a fee estimate from the Router.
- Call the Router to send the message, as described in the Message Lifecycle section.
- Authorization Mechanisms:
@@ -59,12 +59,12 @@ This section provides more detail on the Onchain components.
**Receiver Considerations**:
-- **Data Processing**: If the CCIP Message contains a bytes payload or a programmable token transfer, the receiver must be a program implementing the `ccip_receive` function with a specific discriminator. To learn more, read the `ccip_receive` [API reference](/ccip/api-reference/svm/v0.1.1/messages).
+- **Data Processing**: If the CCIP Message contains a bytes payload or a programmable token transfer, the receiver must be a program implementing the `ccip_receive` function with a specific discriminator. To learn more, read the `ccip_receive` [API reference](/ccip/api-reference/svm/v1.6.0/messages).
- **Security Validation**: The receiver program should validate that the caller is an authorized OffRamp by checking the `ALLOWED_OFFRAMP` PDA from the Router program.
**Additional Resources**:
-- CCIP provides program examples for a Sender/Receiver in the [Programs folder](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs).
+- CCIP provides program examples for a Sender/Receiver in the [Programs folder](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs).
## Router
@@ -188,7 +188,7 @@ The FeeQuoter is a central component in Chainlink CCIP that maintains token and
- Token Pools are deployed by token developers and exist independently of the core CCIP programs.
- Token Pools are programs that interact with SPL token programs.
-- Token pools follow standard models (Lock/Release and Burn/Mint), with audited code available in the [CCIP repository](https://github.com/smartcontractkit/chainlink-ccip/tree/v0.1.1-solana/chains/solana/contracts/programs).
+- Token pools follow standard models (Lock/Release and Burn/Mint), with audited code available in the [CCIP repository](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs).
- For tokens requiring bespoke logic before burn/mint/lock/release, custom pools can be built on top of the base pools. More details are available in the CCT documentation.
## Risk Management Network
diff --git a/src/content/ccip/concepts/best-practices/index.mdx b/src/content/ccip/concepts/best-practices/index.mdx
index 11ad0ab0c3d..6b982993140 100644
--- a/src/content/ccip/concepts/best-practices/index.mdx
+++ b/src/content/ccip/concepts/best-practices/index.mdx
@@ -11,8 +11,4 @@ metadata:
isIndex: true
---
-This section outlines recommended practices for using Chainlink CCIP effectively and securely.
-
-- **[EVM Best Practices](/ccip/concepts/best-practices/evm)**: Recommended guidelines for interacting with CCIP on EVM-compatible chains.
-- **[SVM Best Practices](/ccip/concepts/best-practices/svm)**: Recommended guidelines for interacting with CCIP on SVM-based chains like Solana.
-- **[Aptos Best Practices](/ccip/concepts/best-practices/aptos)**: Recommended guidelines for interacting with CCIP on Aptos chain.
+This section outlines recommended practices for using Chainlink CCIP effectively and securely across different blockchain families. Learn about security considerations, message verification, token administration, liquidity management, multi-signature patterns, and blockchain-specific guidelines to build robust cross-chain applications on EVM-compatible chains, Solana, and Aptos.
diff --git a/src/content/ccip/concepts/best-practices/svm.mdx b/src/content/ccip/concepts/best-practices/svm.mdx
index 140ca29a52b..8451aa4ab1a 100644
--- a/src/content/ccip/concepts/best-practices/svm.mdx
+++ b/src/content/ccip/concepts/best-practices/svm.mdx
@@ -28,7 +28,7 @@ Before you deploy your cross-chain dApps to mainnet, make sure that your dApps f
## Verify destination chain
-Before calling the router's `ccip_send` [instruction](/ccip/api-reference/svm/v0.1.1/router#ccip_send), ensure your code verifies that the destination chain is supported by the CCIP Router. Sending messages to unsupported chains will fail and potentially waste transaction fees.
+Before calling the router's `ccip_send` [instruction](/ccip/api-reference/svm/v1.6.0/router#ccip_send), ensure your code verifies that the destination chain is supported by the CCIP Router. Sending messages to unsupported chains will fail and potentially waste transaction fees.
You can programmatically verify destination chain support using Solana PDAs (Program Derived Addresses). Here below is a JavaScript example of how to verify destination chain support:
@@ -63,17 +63,17 @@ async function isDestinationChainSupported(connection, routerProgramId, destinat
## Verify source chain
-When implementing the `ccip_receive` [method](/ccip/api-reference/svm/v0.1.1/receiver#ccip_receive) in a program residing on the destination chain, ensure to verify the source chain of the incoming CCIP message. This verification ensures that CCIP messages can only be received from trusted source chains.
+When implementing the `ccip_receive` [method](/ccip/api-reference/svm/v1.6.0/receiver#ccip_receive) in a program residing on the destination chain, ensure to verify the source chain of the incoming CCIP message. This verification ensures that CCIP messages can only be received from trusted source chains.
## Verify sender
-When implementing the [`ccip_receive`](/ccip/api-reference/svm/v0.1.1/receiver#ccip_receive) instruction in a program residing on the destination chain, it's important to validate the sender of the incoming CCIP message. This check ensures that CCIP messages are received only from trusted sender addresses.
+When implementing the [`ccip_receive`](/ccip/api-reference/svm/v1.6.0/receiver#ccip_receive) instruction in a program residing on the destination chain, it's important to validate the sender of the incoming CCIP message. This check ensures that CCIP messages are received only from trusted sender addresses.
**Note**: Depending on your use case, this verification might not always be necessary.
## Verify authority and allowed offramp
-When you implement the [`ccip_receive`](/ccip/api-reference/svm/v0.1.1/receiver#ccip_receive) instruction in the program residing on the destination chain, validate that the `authority` account is the correct Offramp CPI signer PDA and that `allowed_offramp` is the correct PDA owned by the router program. This verification ensures that only the authorized CCIP Offramp program can call the `ccip_receive` function.
+When you implement the [`ccip_receive`](/ccip/api-reference/svm/v1.6.0/receiver#ccip_receive) instruction in the program residing on the destination chain, validate that the `authority` account is the correct Offramp CPI signer PDA and that `allowed_offramp` is the correct PDA owned by the router program. This verification ensures that only the authorized CCIP Offramp program can call the `ccip_receive` function.
**Example in Rust**:
@@ -136,7 +136,7 @@ When sending a CCIP message, you must select the appropriate `extra_args` struct
- `SVMExtraArgsV1`: For Solana and other SVM-based destinations
- `EVMExtraArgsV2`: For Ethereum and other EVM-based destinations
-For the full parameter specification, refer to the [CCIP API Reference](/ccip/api-reference/svm/v0.1.1/messages#extra-args).
+For the full parameter specification, refer to the [CCIP API Reference](/ccip/api-reference/svm/v1.6.0/messages#extra-args).
### Setting `compute_units` (SVM destinations)
diff --git a/src/content/ccip/concepts/cross-chain-token/index.mdx b/src/content/ccip/concepts/cross-chain-token/index.mdx
index 1a3b1013bae..511a67b6154 100644
--- a/src/content/ccip/concepts/cross-chain-token/index.mdx
+++ b/src/content/ccip/concepts/cross-chain-token/index.mdx
@@ -10,8 +10,6 @@ metadata:
isIndex: true
---
-This section explains the Cross-Chain Token (CCT) standard, a Chainlink CCIP feature enabling secure and reliable cross-chain token transfers. Learn how to make your tokens compatible with CCIP.
+This section explains the Cross-Chain Token (CCT) standard, a Chainlink CCIP feature enabling secure and reliable cross-chain token transfers. Learn about the architecture, token requirements, token pool types (Lock and Release, Burn and Mint), registration processes, administrative roles, and upgrade mechanisms needed to make your tokens compatible with CCIP across different blockchain families.
-- **[Overview](/ccip/concepts/cross-chain-token/overview)**: Get a high-level summary of the CCT standard and its benefits.
-- **[EVM Tokens](/ccip/concepts/cross-chain-token/evm)**: Guidance for integrating tokens on EVM-compatible blockchains.
-- **[SVM Tokens](/ccip/concepts/cross-chain-token/svm)**: Guidance for integrating tokens on SVM-based blockchains like Solana.
+For a high-level summary of the CCT standard and its benefits, see the [Overview](/ccip/concepts/cross-chain-token/overview) page.
diff --git a/src/content/ccip/concepts/cross-chain-token/overview.mdx b/src/content/ccip/concepts/cross-chain-token/overview.mdx
index 245b73051c7..9874aed4e05 100644
--- a/src/content/ccip/concepts/cross-chain-token/overview.mdx
+++ b/src/content/ccip/concepts/cross-chain-token/overview.mdx
@@ -10,6 +10,9 @@ metadata:
---
import { Aside, ClickToZoom } from "@components"
+import { AptosCCTCallout } from "~/components/CCIP/AptosCCTCallout.tsx"
+
+