diff --git a/docs/bridge/docs/01-About/01-DAO.md b/docs/bridge/docs/01-About/01-DAO.md
new file mode 100644
index 0000000000..1f34cedf7c
--- /dev/null
+++ b/docs/bridge/docs/01-About/01-DAO.md
@@ -0,0 +1,19 @@
+---
+title: Synapse DAO
+---
+
+# Synapse DAO
+
+Since launch of the Synapse Protocol, a number of governance initiatives have been put forward and voted on by the Synapse DAO.
+
+## Governance Model
+
+SYN holders with more than 100,000 SYN tokens can put forward proposals to be voted on by the DAO. SYN holders can vote using SYN on multiple chains, or delegate their votes to other token holders.
+
+In order to be adopted by the DAO, a proposal must gather at least `50% + 1` of all votes and reach the minimum quorum of 5 million SYN tokens.
+
+## Governance Components
+
+* **[Forum](https://forum.synapseprotocol.com/)**: A Platform to post proposals for discussion before an official vote
+* **[Snapshot](https://snapshot.org/#/synapseprotocol.eth)**: A decentralized governance platform for conducting official votes.
+* **[Discord](https://discord.gg/synapseprotocol)**: Discussion channel for general Synapse matters
\ No newline at end of file
diff --git a/docs/bridge/docs/01-About/02-Brand-Assets.md b/docs/bridge/docs/01-About/02-Brand-Assets.md
new file mode 100644
index 0000000000..6ea765f2ca
--- /dev/null
+++ b/docs/bridge/docs/01-About/02-Brand-Assets.md
@@ -0,0 +1,21 @@
+# Brand Assets
+
+### [synapse-brand-assets.zip](/brand-assets/synapse-brand-assets.zip)
+
+## Logo
+
+| Name | Image |
+|----------------------------------------------------------------------|-
+| [`synapse-logo-onLight.svg`](/brand-assets/synapse-logo-onLight.svg) | ![Synapse logo](/brand-assets/synapse-logo-onLight.svg)
+| [`synapse-logo-onDark.svg`](/brand-assets/synapse-logo-onDark.svg) | ![Synapse logo](/brand-assets/synapse-logo-onDark.svg)
+| [`synapse-logo-black.svg`](/brand-assets/synapse-logo-black.svg) | ![Synapse logo](/brand-assets/synapse-logo-black.svg)
+| [`synapse-logo-white.svg`](/brand-assets/synapse-logo-white.svg) | ![Synapse logo](/brand-assets/synapse-logo-white.svg)
+
+## Mark
+
+| Name | Image |
+|--------------------------------------------------------------------|-
+| [`synapse-mark.svg`](/brand-assets/synapse-mark.svg) | ![Synapse logo](/brand-assets/synapse-mark.svg)
+| [`synapse-mark-white.svg`](/brand-assets/synapse-mark-white.svg) | ![Synapse logo](/brand-assets/synapse-mark-white.svg)
+| [`synapse-mark-black.svg`](/brand-assets/synapse-mark-black.svg) | ![Synapse logo](/brand-assets/synapse-mark-black.svg)
+| [`synapse-border-mark.svg`](/brand-assets/synapse-border-mark.svg) | ![Synapse logo](/brand-assets/synapse-border-mark.svg)
diff --git a/docs/bridge/docs/01-About/03-Routes.md b/docs/bridge/docs/01-About/03-Routes.md
new file mode 100644
index 0000000000..5a6f844eb6
--- /dev/null
+++ b/docs/bridge/docs/01-About/03-Routes.md
@@ -0,0 +1,7 @@
+import Routes from '@site/src/components/Routes'
+
+# Chains & Tokens
+
+This page contains a list of supported tokens, listed per-chain. For a given pair, use the [Synapse Bridge](https://synapseprotocol.com) to see if a route between them exists.
+
+
diff --git a/docs/bridge/docs/01-About/index.md b/docs/bridge/docs/01-About/index.md
new file mode 100644
index 0000000000..a70db958b6
--- /dev/null
+++ b/docs/bridge/docs/01-About/index.md
@@ -0,0 +1,75 @@
+---
+title: About
+---
+
+import AnimatedLogo from '@site/src/components/AnimatedLogo'
+import SVGBridge from '@site/src/components/SVGBridge'
+import { BridgeFlow } from '@site/src/components/BridgeFlow'
+import { CCTPFlow } from '@site/src/components/CCTPFlow'
+import { RFQFlow } from '@site/src/components/RFQFlow'
+
+
+
+# Use Synapse
+
+Synapse is an Interchain Programming Interface. Developers read and write interchain data with Synapse, which has settled $50B in transactions between 2M+ users, and generated $30M+ in fees.
+
+Source: [Synapse Explorer analytics](https://explorer.synapseprotocol.com).
+
+## Interchain Bridge
+
+
+
+* [Overview](/docs/Bridge)
+* [Bridge guide](/docs/Bridge#how-to-bridge)
+
+
+## Developers
+
+Embed or build a custom Bridge application.
+
+* **[SDK](/docs/Bridge/SDK)** – Call Synapse Router functions from your frontend or backend application.
+* **[REST API](/docs/Bridge/REST-API)** – Endpoints and example code
+* **[Widget](/docs/Bridge/Widget)** – Embed a customized Synapse Bridge in your application.
+
+## Synapse Routers
+
+Synapse Router automatically determines the appropriate router for each Bridge transaction.
+
+* **[Synapse Router](/docs/Routers/Synapse-Router)** – Returns and executes quotes for supported interchain transactions.
+* **[CCTP](/docs/Routers/CCTP)** – Native router for USDC transactions.
+* **[RFQ](/docs/Routers/RFQ)** – Relayers bid for the right to provide immediate delivery.
+
+
+
+## Community & Support
+
+Connect with other developers and the Synapse team
+
+* **[Discord](https://discord.gg/synapseprotocol)**
+* **[Twitter](https://twitter.com/SynapseProtocol)**
+* **[Telegram](https://t.me/synapseprotocol)**
+* **[Forum](https://forum.synapseprotocol.com/)**
+
+## Additional Links
+
+Synapse transactions can be observed confirmed via the following methods:
+
+* **[Synapse Bridge](https://synapseprotocol.com)** – Bridge, Swap, and Stake via Synapse's cross-chain pools.
+* **[Synapse Explorer](https://explorer.synapseprotocol.com)** – Public explorer for Synapse Bridge transactions.
diff --git a/docs/bridge/docs/02-Bridge/01-SDK.md b/docs/bridge/docs/02-Bridge/01-SDK.md
new file mode 100644
index 0000000000..c58d7e3f51
--- /dev/null
+++ b/docs/bridge/docs/02-Bridge/01-SDK.md
@@ -0,0 +1,222 @@
+---
+title: Bridge SDK
+---
+
+# Bridge SDK
+
+The Synapse Bridge SDK is the easiest way to integrate cross-chain token & liquidity transfers into your application. It is fully isomorphic and can be used on both client and server sides.
+
+The Synapse Bridge SDK is built on top of the [Synapse Router](/docs/Routers/Synapse-Router) contract.
+
+### Use cases
+
+* Integrate your front-end application with the Synapse Bridge.
+* Provide bridge liquidity.
+* Perform cross-chain arbitrage.
+* Integrate the Synapse Javascript SDK with your non-Javascript application.
+
+## Install
+
+:::note requires Node v16+
+
+The SDK has only been fully tested on Node 16+ or greater. Earlier versions are not guaranteed to work.
+
+:::
+
+Requires either the `npx` or `yarn` package manager.
+
+| Options
+|-
+| `npx install @synapsecns/sdk-router`
+| `yarn install @synapsecns/sdk-router`
+
+## Configure Ethers
+
+The SDK package relies on the `@ethersproject` and `ethers` dependencies, installed from `npm`.
+
+To begin constructing bridge-related transactions, first set up your environment wiht your providers, and format them, along with the `chainIds` you will be using, to set up a `SynapseSDK` instance.
+
+#### Ethers v5
+
+```js
+//Set up providers (RPCs) for each chain desired
+const arbitrumProvider: Provider = new ethers.providers.JsonRpcProvider(
+ 'https://arb1.arbitrum.io/rpc'
+)
+const avalancheProvider: Provider = new ethers.providers.JsonRpcProvider(
+ 'https://api.avax.network/ext/bc/C/rpc'
+)
+
+//Structure arguments properly
+const chainIds = [42161, 43114]
+const providers = [arbitrumProvider, avalancheProvider]
+
+//Set up a SynapseSDK instance
+const Synapse = new SynapseSDK(chainIds, providers)
+```
+
+#### Ethers v6
+
+:::tip Ethers v6
+
+Use of Ethers v6 requires the `@ethersproject/providers` dependency to be installed via `npm` or `yarn`:
+* `npm install @ethersproject/providers@^5.7.2`
+* `yarn add @ethersproject/providers@^5.7.2`
+
+:::
+
+```js
+import { JsonRpcProvider } from '@ethersproject/providers'
+
+//Set up providers (RPCs) for each chain desired
+const arbitrumProvider: Provider = new JsonRpcProvider(
+ 'https://arb1.arbitrum.io/rpc'
+)
+const avalancheProvider: Provider = new JsonRpcProvider(
+ 'https://api.avax.network/ext/bc/C/rpc'
+)
+
+//Structure arguments properly
+const chainIds = [42161, 43114]
+const providers = [arbitrumProvider, avalancheProvider]
+
+//Set up a SynapseSDK instance
+const Synapse = new SynapseSDK(chainIds, providers)
+```
+
+## Functions
+
+:::tip Query Data Type
+
+`originQuery` and `destQuery`, returned by `bridgeQuote()` and required for `bridge()`, are [`Query`](https://synapserouter.gitbook.io/untitled/) objects, which contain:
+
+* `swapAdapter`: (string): 0x address of the swap adapter.
+* `tokenOut`: (string): 0x address of the outputted token on that chain.
+* `minAmountOut`: (Ethers BigNumber): The min amount of value exiting the transaction.
+* `deadline`: (Ethers BigNumber): The deadline for the potential transaction.
+* `rawParams`: (string): 0x params for the potential transaction.
+
+:::
+
+### `bridgeQuote()`
+
+Get all relevant information regarding a possible transaction.
+
+#### Parameters
+
+`bridgeQuote()` requires the following arguments:
+
+* `fromChain` (number): Origin chain id.
+* `toChain` (number): Destination chain id.
+* `fromToken` (string): 0x token address on the origin chain.
+* `toToken` (string): 0x token address on the destination chain.
+* `amount` (Ethers BigNumber): The amount (with the correct amount of decimals specified by the token on the origin chain)
+* `object` (three seperate args):
+* `deadline` (Ethers BigNumber): Deadline for the transaction to be initiated on the origin chain, in seconds (optional)
+* `originUserAddress` (string): Address of the user on the origin chain, optional, mandatory if a smart contract is going to initiate the bridge operation
+* `excludedModules` (array): (optional) List of bridge modules to exclude from the result
+
+#### Return value
+
+`bridgeQuote` returns the following information
+
+* `feeAmount` (Ethers BigNumber): The calculated amount of fee to be taken.
+* `bridgeFee` (number): The percentage of fee to be taken.
+* `maxAmountOut` (Ethers BigNumber): The maximum output amount resulting from the bridge transaction.
+* `originQuery` (`Query`): The query to be executed on the origin chain.
+* `destQuery` (`Query`): The query to be executed on the destination chain.
+
+### `bridge()`
+
+Use `bridgeQuote` to request a Bridge transaction
+
+#### Parameters
+
+* `toAddress` (number): The 0x wallet address on the destination chain.
+* `routerAddress` (string): The 0x contract address on the origin chain of the bridge router contract.
+* `fromChain` (number): The origin chain id.
+* `toChain` (number): The destination chain id.
+* `fromToken` (string): The 0x token address on the origin chain.
+* `amount` (Ethers BigNumber): The amount (with the correct amount of decimals specified by the token on the origin chain)
+* `originQuery` (`Query`): The query to be executed on the origin chain.
+* `destQuery` (`Query`): The query to be executed on the destination chain.
+
+#### Return value
+
+* `to` (string): 0x wallet address on the destination chain.
+* `data` (string): Output data in 0x hex format
+
+### `allBridgeQuotes()`
+
+#### Return value
+
+Returns an array all possible bridge quotes, with the first item in the array being the cheapest route.
+
+Quotes are returned from various Bridge "types" such as [CCTP](/docs/Routers/CCTP) or [RFQ](/docs/Routers/RFQ). More information is available on the [Synapse Router](/docs/Routers/Synapse-Router) page, or [SynapseCNS](https://github.com/synapsecns/sdk-router) Github repository.
+
+## Examples
+
+### Get a quote
+
+```js
+const quotes = await Synapse.bridgeQuote(
+ routerAddress
+ 42161, // Origin Chain
+ 43114, // Destination Chain
+ '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', // Origin Token Address
+ '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664', // Destination Token Address
+ BigNumber.from('20000000') // Amount in
+ {
+ // Deadline for the transaction to be initiated on the origin chain, in seconds (optional)
+ deadline: 1234567890,
+ // List of bridge modules to exclude from the result, optional.
+ // Empty list means that all modules are included.
+ excludedModules: ['SynapseBridge', 'SynapseCCTP', 'SynapseRFQ'],
+ // Address of the user on the origin chain, optional.
+ // MANDATORY if a smart contract is going to initiate the bridge operation on behalf of the user.
+ originUserAddress: '0x1234567890abcdef1234567890abcdef12345678',
+ }
+)
+```
+
+### Request a transaction
+
+```js
+await Synapse.bridge(
+ '0x0AF91FA049A7e1894F480bFE5bBa20142C6c29a9', // To Address
+ bridgeQuote.routerAddress, // address of the contract to route the txn
+ 42161, // Origin Chain
+ 43114, // Destination Chain
+ '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', // Origin Token Address
+ BigNumber.from('20000000'), // Amount
+ quote.originQuery, // Origin query from bridgeQuote()
+ quote.destQuery // Destination query from bridgeQuote()
+)
+```
+
+## Version 0.10.0 breaking changes
+
+### Options object
+
+* `deadline`, `excludeCCTP` (now `excludedModules`), and `originUserAddress` parameters are now found in an (optional) options object at the end of the arguments list for `bridgeQuote()`, and `allBridgeQuotes()`.
+* `excludedModules` excludes one or more modules with an array of the module names. Supported names are `SynapseBridge`, `SynapseCCTP`, and `SynapseRFQ`.
+* `originUserAddress` is required as part of the options object to initiate a bridge transaction on behalf of a user.
+
+### Examples
+```js
+bridgeQuote(...arguments, {
+ deadline: 1234567890,
+ excludedModules: ["SynapseCCTP"],
+ originUserAddress: "0x1234...",
+})
+
+allBridgeQuotes({
+ deadline: 1234567890,
+ excludedModules: ["SynapseCCTP"],
+ originUserAddress: "0x1234...",
+})
+```
+
+### `FastBridgeRouter`
+
+The previous `FastBridgeRouter` deployment is deprecated, if your integration is using the hardcoded address, please see the router deployments/deprecated deployments table [here](https://github.com/synapsecns/sanguine/tree/master/packages/sdk-router#router-deployments)
diff --git a/docs/bridge/docs/02-Bridge/02-REST-API.md b/docs/bridge/docs/02-Bridge/02-REST-API.md
new file mode 100644
index 0000000000..8b46ddad60
--- /dev/null
+++ b/docs/bridge/docs/02-Bridge/02-REST-API.md
@@ -0,0 +1,205 @@
+---
+title: REST API
+---
+
+# REST API
+
+Get read-only data from on-chain Synapse contracts, and generate Bridge and Swap quotes, plus additional transaction information.
+
+## API-docs
+
+[`api.synapseprotocol.com/api-docs`](https://api.synapseprotocol.com/api-docs)
+
+## Previous versions
+
+| Date | Description
+|------------------------|-
+| 2024‑10‑01 | [https://synapse-rest-api-v2.herokuapp.com/](https://synapse-rest-api-v2.herokuapp.com/) is no longer maintained and has been fully deprecated as of October 2024.
+
+## Support
+
+Please read the documentation and examples carefully before reaching out on [Discord](https://discord.gg/synapseprotocol) for questions.
+
+
+
diff --git a/docs/bridge/docs/02-Bridge/03-Widget.md b/docs/bridge/docs/02-Bridge/03-Widget.md
new file mode 100644
index 0000000000..eed13ea07e
--- /dev/null
+++ b/docs/bridge/docs/02-Bridge/03-Widget.md
@@ -0,0 +1,196 @@
+---
+title: Widget
+---
+
+import SVGWidget from '@site/src/components/SVGWidget'
+
+# Bridge Widget
+
+The Synapse Widget lets you quickly and easily add bridging to their DeFi application, access specific tokens supported by the Synapse protocol, or even custom-build your own Synapse frontend.
+
+
+
+ Synapse Widget
+
+
+## Install
+
+Requires `React`, and the `npm` or `yarn` package manager.
+
+| Options |
+|-|
+| `npm install @synapsecns/widget`
+| `yarn add @synapsecns/widget`
+
+## Quick start
+
+`import { Bridge } from @synapsecns/widget` into your app, and initialize it with your `web3Provider`.
+
+```jsx
+import { Bridge } from '@synapsecns/widget'
+
+const MyApp = () => {
+ const web3Provider = new ethers.BrowserProvider(window.ethereum)
+
+ return
+}
+```
+
+This will result in a fully operational Bridge integrating the routes and tokens supported by the Synapse protocol.
+
+## Properties
+
+While the widget works out-of-the-box without any setup beyond `web3Provider`, configuration is recommended for reliability and performance.
+
+* `web3Provider` (required): Handles wallet connections.
+* `customRpcs` (recommended): JSON-RPC endpoints.
+* `targetChainIds`: List of destination chain IDs. Defaults to *all*.
+* `targetTokens`: List of tokens to display. These tokens are imported from the widget package. Defaults to *all*.
+* `customTheme`: Custom theme for the widget. Defaults to light mode. see [Theme](#theme) section for details.
+* `container`: Includes a solid-background container if `true`. Defaults to `false`.
+* `protocolName`: Short name by which to identify the protocol. Defaults to `"Target"`.
+* `hideConsoleErrors`: Hide SDK and Widget `console.error` messages. Defaults to `false`.
+
+## web3Provider
+
+While the demo landing page uses the `ethers` library, any similar provider can be used.
+
+```jsx
+// Ethers v5
+const web3Provider = new ethers.providers.Web3Provider(window.ethereum, 'any')
+
+// Ethers v6
+const web3Provider = new ethers.BrowserProvider(window.ethereum)
+```
+
+## customRpcs
+
+Set preferred RPC endpoints for each `chainId`. Defaults to Synapse fallback values for undefined chains.
+
+```jsx
+import { Bridge, CustomRpcs } from '@synapsecns/widget'
+
+const customRpcs: CustomRpcs = {
+ 1: 'https://ethereum.my-custom-rpc.com',
+ 10: 'https://optimism.my-custom-rpc.com',
+ 42161: 'https://arbitrum.my-custom-rpc.com',
+}
+
+const MyApp = () => {
+ const web3Provider = new ethers.BrowserProvider(window.ethereum)
+
+ return
+}
+```
+
+## targetChainIds & targetTokens
+
+Shows only the chains and tokens your project supports for onboarding, while still allowing users to onboard from, or bridge back to, any preferred chain or token.
+
+```jsx
+import { Bridge, CustomRpcs, ETH, USDC, USDT } from '@synapsecns/widget'
+
+const MyApp = () => {
+ const web3Provider = new ethers.BrowserProvider(window.ethereum)
+
+ return (
+
+ )
+}
+```
+
+:::tip Token names
+
+Token names must match the definitions in `src/constants/bridgeable.ts`. Metis USDC, for example, is `"METISUSDC"`.
+
+For chains, see `src/constants/chains.ts` as well.
+
+:::
+
+## Theme
+
+The widget will automatically generate a color palette from `bgColor` in the `customTheme` object, which you can also use to override individual color variables.
+
+:::tip Color modes
+
+If your application has multiple color modes, such as light and dark, reload the widget with the appropriate theme colors when your application’s theme changes.
+
+:::
+
+```jsx
+const customTheme = {
+ // Generate from base color, 'dark', or 'light'
+ bgColor: '#08153a',
+
+ // Basic customization
+ '--synapse-text': 'white',
+ '--synapse-secondary': '#ffffffb3',
+ '--synapse-root': '#16182e',
+ '--synapse-surface': 'linear-gradient(90deg, #1e223de6, #262b47e6)',
+ '--synapse-border': 'transparent',
+
+ // Full customization (Uses 'basic' colors by default)
+ '--synapse-focus': 'var(--synapse-secondary)',
+ '--synapse-select-bg': 'var(--synapse-root)',
+ '--synapse-select-text': 'var(--synapse-text)',
+ '--synapse-select-border': 'var(--synapse-border)',
+ '--synapse-button-bg': 'var(--synapse-surface)',
+ '--synapse-button-text': 'var(--synapse-text)',
+ '--synapse-button-border': 'var(--synapse-border)',
+
+ // Transaction progress colors (set bgColor to auto-generate)
+ '--synapse-progress': 'hsl(265deg 100% 65%)',
+ '--synapse-progress-flash': 'hsl(215deg 100% 65%)',
+ '--synapse-progress-success': 'hsl(120deg 100% 30%)',
+ '--synapse-progress-error': 'hsl(15deg 100% 65%)',
+}
+
+
+```
+
+## Container
+
+The widget is full-width with a transparent background by default, but can supply its own solid background container.
+
+```jsx
+
+```
+
+## useBridgeSelections hook
+
+An active list of dropdown selections are available from the `useBridgeSelections` React hook.
+
+```jsx
+const {
+ originChain,
+ originToken,
+ destinationChain,
+ destinationToken,
+} = useBridgeSelections()
+```
+
+### Structure
+
+* `Chain: { id: number, name: string }`
+* `Token: { symbol: string, address: string }`
+
+## Example Apps
+
+For reference, you can find three example apps in the repository’s `/examples` folder.
+
+| `examples/` | Description
+|-----------------|-
+| `landing-page` | Functional demo with basic customization
+| `with-react` | Simple React implementation
+| `with-next` | Simple Next.js implementation
+
+## Support
+
+If you have questions or need help implementing the widget, reach out to the team on [Discord](https://discord.gg/synapseprotocol).
diff --git a/docs/bridge/docs/02-Bridge/04-Code-Examples.md b/docs/bridge/docs/02-Bridge/04-Code-Examples.md
new file mode 100644
index 0000000000..1816550110
--- /dev/null
+++ b/docs/bridge/docs/02-Bridge/04-Code-Examples.md
@@ -0,0 +1,350 @@
+---
+sidebar_label: Examples
+---
+
+# Example Code
+
+Example SDK & API implementations
+
+## Basic Implementation
+
+```js
+// app.js
+
+import { JsonRpcProvider } from '@ethersproject/providers'
+import { Provider } from '@ethersproject/abstract-provider'
+import { SynapseSDK } from '@synapsecns/sdk-router'
+import { BigNumber } from '@ethersproject/bignumber'
+
+//Set up providers (RPCs) for each chain desired**
+const arbitrumProvider: Provider = new JsonRpcProvider('https://arb1.arbitrum.io/rpc')
+const avalancheProvider: Provider = new JsonRpcProvider('https://api.avax.network/ext/bc/C/rpc')
+
+//Structure arguments properly
+const chainIds = [42161, 43114]
+const providers = [arbitrumProvider, avalancheProvider]
+
+//Set up a SynapseSDK instance
+const Synapse = new SynapseSDK(chainIds, providers)
+
+// quote
+const quote = await Synapse.bridgeQuote(
+ 42161, // From Chain
+ 43114, // To Chain
+ '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', // From Token
+ '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664', // To Token
+ BigNumber.from('20000000'), // Amount
+ {
+ deadline: 1234567890,
+ excludedModules: ['SynapseRFQ'],
+ originUserAddress: '0x1234567890abcdef1234567890abcdef12345678',
+ }
+)
+
+// bridge
+await Synapse.bridge(
+ '0x0AF91FA049A7e1894F480bFE5bBa20142C6c29a9', // To Address
+ quote.routerAddress, // bridge router contract address
+ 42161, // Origin Chain
+ 43114, // Destination Chain
+ '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', // Origin Token Address
+ BigNumber.from('20000000'), // Amount
+ quote.originQuery, // Origin query from bridgeQuote()
+ quote.destQuery // Destination query from bridgeQuote()
+)
+```
+
+## NextJS Implementation
+
+:::note Dependencies
+
+Wagmi, RainbowKit
+
+:::
+
+### App
+
+```tsx
+// app.tsx
+
+import '@styles/global.css'
+import '@rainbow-me/rainbowkit/styles.css'
+import { SynapseProvider } from '@/utils/SynapseProvider'
+import type { AppProps } from 'next/app'
+import { Provider as EthersProvider } from '@ethersproject/abstract-provider'
+import { JsonRpcProvider } from '@ethersproject/providers'
+import { configureChains, createClient, WagmiConfig } from 'wagmi'
+import {
+ mainnet,
+ arbitrum,
+ aurora,
+ avalanche,
+ bsc,
+ canto,
+ fantom,
+ harmonyOne,
+ metis,
+ moonbeam,
+ moonriver,
+ optimism,
+ polygon,
+} from 'wagmi/chains'
+
+import {
+ getDefaultWallets,
+ RainbowKitProvider,
+ darkTheme,
+} from '@rainbow-me/rainbowkit'
+import { alchemyProvider } from 'wagmi/providers/alchemy'
+import { publicProvider } from 'wagmi/providers/public'
+
+export default function App({ Component, pageProps }: AppProps) {
+ const { chains, provider } = configureChains([mainnet,
+ arbitrum,
+ aurora,
+ avalanche,
+ bsc,
+ canto,
+ fantom,
+ harmonyOne,
+ metis,
+ moonbeam,
+ moonriver,
+ optimism,
+ polygon], [
+ alchemyProvider({ apiKey: 'API_KEY' }),
+ publicProvider(),
+ ])
+
+ const { connectors } = getDefaultWallets({
+ appName: 'ExampleApp',
+ chains,
+ })
+
+ const wagmiClient = createClient({
+ autoConnect: true,
+ connectors,
+ provider,
+ })
+
+ // Synapse client params setup example
+ let synapseProviders: EthersProvider[] = []
+ chains.map((chain) => {
+ let rpc: EthersProvider = new JsonRpcProvider(chain.rpcUrls.default.http[0])
+ synapseProviders.push(rpc)
+ })
+
+ return (
+
+
+ chain.id)}
+ providers={synapseProviders}
+ >
+
+
+
+
+ )
+}
+```
+
+### Provider
+
+```tsx
+// `@/utils/SynapseProvider.tsx`
+
+import { createContext, useContext } from 'react'
+import { SynapseSDK } from '@synapsecns/sdk-router'
+import { Provider } from '@ethersproject/abstract-provider'
+
+export const SynapseContext = createContext(null)
+
+export const SynapseProvider = ({
+ children,
+ chainIds,
+ providers,
+}: {
+ children: React.ReactNode
+ chainIds: number[]
+ providers: Provider[]
+}) => {
+ const sdk = new SynapseSDK(chainIds, providers)
+ return (
+ {children}
+ )
+}
+
+export const useSynapseContext = () => useContext(SynapseContext)
+```
+
+### Homepage
+
+```tsx
+// `/homepage/index.tsx`
+
+import { useSynapseContext } from '@/utils/SynapseProvider'
+import { Zero } from '@ethersproject/constants'
+import { useState, useEffect } from 'react'
+import { getNetwork } from '@wagmi/core'
+import {
+ DEFAULT_FROM_CHAIN,
+ DEFAULT_TO_CHAIN,
+ DEFAULT_FROM_TOKEN,
+ DEFAULT_TO_TOKEN,
+} from '@/constants/bridge'
+
+export default function HomePage({ address }: { address: `0x${string}` }) {
+ // Get the synapse sdk
+ const SynapseSDK = useSynapseContext()
+
+ // Get the current time
+ const time = // add logic to get the current unix timestamp
+ // Example state hooks
+ const [fromToken, setFromToken] = useState(DEFAULT_FROM_TOKEN)
+ const [toToken, setToToken] = useState(DEFAULT_TO_TOKEN)
+ const [fromChainId, setFromChainId] = useState(DEFAULT_FROM_CHAIN)
+ const [toChainId, setToChainId] = useState(DEFAULT_TO_CHAIN)
+ const [amount, setAmount] = useState(Zero)
+ const [bridgeQuote, setBridgeQuote] = useState({
+ outputAmountString: '',
+ quotes: { originQuery: null, destQuery: null },
+ })
+
+ // Set connected network when component is mounted
+ useEffect(() => {
+ const { chain: fromChainIdRaw } = getNetwork()
+ setFromChainId(fromChainIdRaw ? fromChainIdRaw?.id : DEFAULT_FROM_CHAIN)
+ }, [])
+
+ // Get Quote function
+ // Suggestion: this function should be triggered from an useEffect when amount or to/from token/chain is altered
+ const getQuote = async () = {
+ SynapseSDK.bridgeQuote(
+ fromChainId,
+ toChainId,
+ fromToken,
+ toToken,
+ amount,
+ {
+ deadline: time + 10000,
+ excludedModules: [],
+ originUserAddress: address,
+ }
+ )
+ .then(
+ ({ feeAmount, bridgeFee, maxAmountOut, originQuery, destQuery }) => {
+ let toValueBigNum = maxAmountOut ?? Zero
+ let toValueBase = toValueBigNum.div(toDecimals).toString()
+ let toValueMantissa = toValueBigNum.mod(toDecimals).toString()
+
+ setBridgeQuote({
+ outputAmountString: toValueBase + '.' + toValueMantissa,
+ quotes: {
+ originQuery,
+ destQuery,
+ },
+ })
+ // do something
+ }
+ )
+ .catch((err) => {
+ alert('error getting quote', err)
+ // do something
+ })
+
+ }
+
+ // Execute bridge function
+ const executeBridge = async () = {
+ await Synapse.bridge(
+ toAddress, // To Address
+ bridgeQuote.routerAddress, // bridge router contract address
+ fromChainId, // Origin Chain
+ toChainId, // Destination Chain
+ fromToken, // Origin Token Address
+ amount, // Amount
+ bridgeQuote.quotes.originQuery, // Origin query from bridgeQuote()
+ bridgeQuote.quotes.destQuery // Destination query from bridgeQuote()
+ ).then(({to, data}) => {
+ // do something
+ }
+ )
+ .catch((err) => {
+ alert('error bridging', err)
+ // do something
+ })
+ }
+
+// ...
+
+}
+```
+
+## API Functions
+
+### Estimate bridge output
+
+```js
+async function estimateBridgeOutput(
+ fromChain,
+ toChain,
+ fromToken,
+ toToken,
+ amountFrom
+) {
+ const query_string = `fromChain=${fromChain}&toChain=${toChain}&fromToken=${fromToken}&toToken=${toToken}&amountFrom=${amountFrom}`;
+ const response = await fetch(
+ `https://api.synapseprotocol.com/bridge?${query_string}`
+ );
+
+ const response_json = await response.json();
+ // Check if the response is an array and has at least one item
+ if (Array.isArray(response_json) && response_json.length > 0) {
+ return response_json[0]; // Return the first item
+ } else {
+ throw new Error('No bridge quotes available');
+ }
+}
+
+estimateBridgeOutput(
+ 1, // Ethereum
+ 42161, // Arbitrum
+ "USDC",
+ "USDC",
+ "1000"
+).then(firstQuote => {
+ console.log('First bridge quote:', firstQuote);
+}).catch(error => {
+ console.error('Error:', error.message);
+});
+```
+
+### Generate unsigned bridge transaction
+
+```js
+async function generateUnsignedBridgeTxn(
+ fromChain,
+ toChain,
+ fromToken,
+ toToken,
+ amountFrom,
+ destAddress
+) {
+ const query_string = `fromChain=${fromChain}&toChain=${toChain}&fromToken=${fromToken}&toToken=${toToken}&amount=${amountFrom}&destAddress=${addressTo}`;
+ const response = await fetch(
+ `https://api.synapseprotocol.com/bridgeTxInfo?${query_string}`
+ );
+ const response_json = await response.json();
+ return await response_json;
+}
+
+generateUnsignedBridgeTxn(
+ 1, // Ethereum
+ 42161, // Arbitrum
+ "USDC",
+ "USDC",
+ "1000"
+ "0x2D2c027E0d1A899a1965910Dd272bcaE1cD03c22"
+);
+```
diff --git a/docs/bridge/docs/02-Bridge/index.md b/docs/bridge/docs/02-Bridge/index.md
new file mode 100644
index 0000000000..dfa2ba2519
--- /dev/null
+++ b/docs/bridge/docs/02-Bridge/index.md
@@ -0,0 +1,58 @@
+---
+title: Bridge
+---
+
+import { BridgeFlow } from '@site/src/components/BridgeFlow'
+import SVGBridge from '@site/src/components/SVGBridge'
+
+# Synapse Bridge
+
+The [Synapse Bridge](https://synapseprotocol.com) and [Solana Bridge](https://solana.synapseprotocol.com/) seamlessly swap on-chain assets between [20+ EVM and non-EVM blockchains](/docs/About/Routes) in a safe and secure manner.
+
+
+
+
+
+ User assets are sent to a bridge contract, moved to the `destChain`, and returned to the user.
+
+
+## Developers
+
+Add the [Custom Widget](#) to your DeFi application, or build your own DeFi applications using the [Synapse SDK](#).
+
+## Bridge Functions
+
+The [Synapse Router](#) will return an appropriate bridge function based on the chains and tokens involved.
+
+* **Canonical** – Assets are wrapped and then bridged.
+* **[Liquidity Pools](#)** – Assets are swapped via Synapse liquidity pools.
+* **[CCTP](#)** – Native router for USDC
+
+## Pool Liquidity
+
+![liquidity pool tokens](lp-tokens.svg)\
+Synapse liquidity pools use the nexus USD (nUSD) and nexus ETH (nETH) interchain stablecoins. nUSD and nETH are fully backed by the nexus USD and nexus ETH liquidity pools on Ethereum.
+
+When a token is bridged using a Synapse Liquidity Pool, it is converted to a nexus token on the source chain, which is then bridged to the destination chain, before being converted back into a native token.
+
+## How to Bridge
+
+
+
+ Synapse Bridge
+
+
+### Instructions
+
+1. Connect your wallet
+2. Select your origin and destination chains from the dropdown menus
+3. Select your origin token from the portfolio view, or dropdown menu
+4. Enter the amount you wish to send
+5. If you wish to send assets to a different wallet address, enable `Show withdrawal address` from the Settings menu (optional).
+5. Connect your wallet to the origin chain, if necessary
+6. Click `Bridge` to send a quote to your wallet for confirmation
+7. Sign and Confirm the Bridge action from your wallet
+
+## Bridge Contracts
+
+Synapse Bridge contracts are available [here](https://docs.synapseprotocol.com/synapse-bridge/contract-addresses).
diff --git a/docs/bridge/docs/02-Bridge/lp-tokens.svg b/docs/bridge/docs/02-Bridge/lp-tokens.svg
new file mode 100644
index 0000000000..eec827e9ba
--- /dev/null
+++ b/docs/bridge/docs/02-Bridge/lp-tokens.svg
@@ -0,0 +1,61 @@
+
diff --git a/docs/bridge/docs/04-Routers/01-Synapse-Router/index.md b/docs/bridge/docs/04-Routers/01-Synapse-Router/index.md
new file mode 100644
index 0000000000..7cf859b217
--- /dev/null
+++ b/docs/bridge/docs/04-Routers/01-Synapse-Router/index.md
@@ -0,0 +1,299 @@
+import { BridgeFlow } from '@site/src/components/BridgeFlow'
+
+# Synapse Router
+
+The Synapse Router abstracts much of the complexity around liquidity based bridging and Synapse Bridge contracts into a single [`bridge()`](/docs/Bridge/SDK/#bridge) function.
+
+
+
+
+
+
+
+ User assets are sent to a Bridge contract, moved to the `destChain`, and returned to the user.
+
+
+## Queries
+
+:::note Intermediate tokens
+
+Some Bridge transactions utilize an [intermediary token](/docs/Bridge/#pool-liquidity) (nETH, nUSD) the protocol has mint/burn permissions over.
+
+Swaps to/from an intermediate token return an empty query.
+
+:::
+
+Determining an optimal route with minimal slippage and maximum output is not trivial. Synapse Router condenses this complexity into a [`Query`](https://github.com/synapsecns/synapse-contracts/blob/7bc3a579c08838d7f4c3e62954135901abb16183/contracts/bridge/libraries/BridgeStructs.sol#L12-L18), or data structure of generic swap instructions that return a `token`, and an `amountReceived`.
+
+
+
+Given a bridgable token, a `Query` identifies on-chain “swaps” which allow the Bridge to identify the route(s) for an origin and intermediate token swap on the origin chain, and subsequent token swap on the destination chain.
+
+Origin and destination queries are taken from the `getOriginAmountOut()` and `getDestinationAmountOut()` supporting functions, which are called for each transaction, from which your application can decide its preferred route.
+
+
+
+
+## Constructing a Bridge transaction
+
+:::tip Avoid manual construction
+
+Attempting to manually construct queries may result in transactions being reverted for misconfigured parameters. Always use the Router functions below to construct your Bridge transactions.
+
+:::
+
+**1. Get output `tokenSymbols`**
+
+Call `getConnectedBridgeTokens()` with your output token to receive a formatted `tokenSymbols` list.
+
+**2. Get `originQuery` list**
+
+Call `getOriginAmountOut()` with your input token, `tokenSymbols` list, and `amountIn`, to receive a `Query` list for the origin chain.
+
+**3. Get `destRequest` list**
+
+Convert each origin `Query` to a `destRequest` as seen in this example:
+
+```js
+let requests = symbols.map((value, index) => {
+ let request: DestRequest = {
+ symbol: value,
+ amountIn: originQueries[index].minAmountOut,
+ };
+ return request;
+});
+```
+
+**4. Get `destQuery` list**
+
+Call `getDestinationAmoutOut()` with your `destRequest` list and output token to receive a `Query` list for the destination chain.
+
+**5. select `originQuery` and `destQuery`**
+
+Determine which `originQuery` and `destQuery` to use. This simple example selects the origin and destination pair with the highest output:
+
+```js
+let destQuery = maxBy(destQueries, (query) => query.minAmountOut);
+let selectedIndex = destQueries.indexOf(destQuery)
+let originQuery = originQueries[selectedIndex]
+```
+
+**6. Format queries and apply user settings**
+
+Add any user settings such as `slippage`, and `deadline` to your queries, and specify a [`swapAdapter`](#swap-adapter) for the swap to use.
+
+**7. `bridge()`**
+
+Call `bridge()` with your selected `originQuery` and `destQuery` pair.
+
+## Swap Adapter
+
+:::note
+
+SynapseRouterV1's swap adapter supports Synapse hosted pools. Future versions will allow additional adapters to support aggregators on different chains, allowing any-to-any Bridge transactions.
+
+:::
+
+The Synapse Adapter is a configurable wrapper that facilitates the "swap" action on the origin and destination chains, and exposes useful methods to get `Quote` and `Query` structs, supported pools, tokens, and more.
+
+## Example
+
+### Direct contract integration
+
+```js
+/**
+ * Struct representing a bridge token.
+ * @param symbol Bridge token symbol: unique token ID consistent among all chains
+ * @param token Bridge token address
+ */
+type BridgeToken = {
+ symbol: String;
+ token: Address;
+};
+
+/**
+ * Struct representing a request for a swap quote from a bridge token.
+ * @param symbol Bridge token symbol: unique token ID consistent among all chains
+ * @param amountIn Amount of bridge token to start with, before the bridge fee is applied
+ */
+type DestRequest = {
+ symbol: String;
+ amountIn: BigInt;
+};
+
+/**
+ * Struct representing a request swap (list of instructions) for SynapseRouter.
+ * @param swapAdapter Adapter address that will perform the swap. Address(0) specifies a "no swap" query.
+ * @param tokenOut Token address to swap to.
+ * @param minAmountOut Minimum amount of tokens to receive after the swap, or tx will be reverted.
+ * @param deadline Latest timestamp for when the transaction needs to be executed, or tx will be reverted.
+ * @param rawBytes ABI-encoded params for the swap that will be passed to `swapAdapter`.
+ */
+type SwapQuery = {
+ swapAdapter: Address;
+ tokenOut: Address;
+ minAmountOut: BigInt;
+ deadline: BigInt;
+ rawParams: BytesLike;
+};
+
+type UserSettings = {
+ maxSlippage: BigInt;
+ deadlineOrigin: BigInt;
+ deadlineDest: BigInt;
+};
+
+interface SynapseRouter {
+ /**
+ * Initiate a bridge transaction with an optional swap on both origin and destination chains
+ * @param to Address to receive tokens on destination chain
+ * @param chainId Destination chain id
+ * @param token Initial token for the bridge transaction to be pulled from the user
+ * @param amount Amount of the initial tokens for the bridge transaction
+ * @param originQuery Origin swap query. Empty struct indicates no swap is required
+ * @param destQuery Destination swap query. Empty struct indicates no swap is required
+ */
+ bridge(
+ to: Address,
+ chainId: Number,
+ token: Address,
+ amount: BigInt,
+ originQuery: SwapQuery,
+ destQuery: SwapQuery
+ ): null;
+
+ /**
+ * Gets the list of all bridge tokens (and their symbols), such that destination swap
+ * from a bridge token to `tokenOut` is possible.
+ * @param tokenOut Token address to swap to on destination chain
+ */
+ getConnectedBridgeTokens(tokenOut: Address): BridgeToken[];
+
+ /**
+ * Finds the best path between `tokenIn` and every supported bridge token from the given list,
+ * treating the swap as "origin swap", without putting any restrictions on the swap.
+ * @param tokenIn Initial token that user wants to bridge/swap
+ * @param tokenSymbols List of symbols representing bridge tokens
+ * @param amountIn Amount of tokens user wants to bridge/swap
+ */
+ getOriginAmountOut(
+ tokenIn: Address,
+ tokenSymbols: String[],
+ amountIn: BigInt
+ ): SwapQuery[];
+
+ /**
+ * Finds the best path between every supported bridge token from the given list and `tokenOut`,
+ * treating the swap as "destination swap", limiting possible actions to those available for every bridge token.
+ * Will take the bridge fee into account, when returning a quote for every bridge token.
+ * @param requests List of structs with following information:
+ * - symbol: unique token ID consistent among all chains
+ * - amountIn: amount of bridge token to start with, before the bridge fee is applied
+ * @param tokenOut Token user wants to receive on destination chain
+ */
+ getDestinationAmountOut(
+ requests: DestRequest[],
+ tokenOut: Address
+ ): SwapQuery[];
+}
+
+/// Perform a cross-chain swap using Synapse:Bridge
+/// Start from `amountIn` worth of `tokenIn` on origin chain
+/// Receive `tokenOut` on destination chain
+function synapseBridge(
+ originChainId: Number,
+ destChainId: Number,
+ tokenIn: Address,
+ tokenOut: Address,
+ amountIn: BigInt,
+ userOrigin: Address,
+ userDest: Address,
+ userSettings: UserSettings
+) {
+ // Every cross-chain swap via Synapse:Bridge is fueled by using one of the
+ // supported "bridge tokens" as the intermediary token.
+ // A following set of actions will be initiated by a single SynapseRouter.bridge() call:
+ // - Origin chain: tokenIn -> bToken swap is performed
+ // - Synapse: bridge bToken from origin chain to destination
+ // - Destination chain: bToken -> tokenOut is performed
+
+ // Here we describe a list of actions to perform such a cross-chain swap, knowing only
+ // - tokenIn, tokenOut, amountIn
+ // - SynapseRouter deployments
+ // - User settings for maximum slippage and deadline
+ // - User address on origin and destinaion chain (might be equal or different)
+
+ // Beware: below is a TypeScript pseudocode.
+
+ // 0. Fetch deployments of SynapseRouter on origin and destiantion chains
+ let routerOrigin = getSynapseRouter(originChainId);
+ let routerDest = getSynapseRouter(destChainId);
+
+ // 1. Determine the set of bridge tokens that could enable "receive tokenOut on destination chain"
+ // For that we pefrorm a static call to SynapseRouter on destination chain
+ let bridgeTokens = routerDest.getConnectedBridgeTokens(tokenOut);
+ // Then we get the list of bridge token symbols
+ let symbols = bridgeTokens.map((token) => token.symbol);
+
+ // 2. Get the list of Queries with possible swap instructions for origin chain
+ // For that we pefrorm a static call to SynapseRouter on origin chain
+ // This gets us the quotes from tokenIn to every bridge token (one quote per bridge token in the list)
+ let originQueries = routerOrigin.getOriginAmountOut(
+ tokenIn,
+ symbols,
+ amountIn
+ );
+
+ // 3. Get the list of Queries with possible swap instructions for destination chain
+ // First, we form a list of "destiantion requests" by merging
+ // list of token symbols with list of quotes obtained in step 2.
+ let requests = symbols.map((value, index) => {
+ let request: DestRequest = {
+ symbol: value,
+ amountIn: originQueries[index].minAmountOut,
+ };
+ return request;
+ });
+ // Then we perform a static call to SynapseRouter on destination chain
+ // This gets us the quotes from every bridge token to tokenOut (one quote per bridge token in the list)
+ // These quotes will take into account the fee for bridging the token to destination chain
+ let destQueries = routerDest.getDestinationAmountOut(requests, tokenOut);
+
+ // 4. Pick a pair of originQueries[i], destQueries[i] to pefrom the cross-chain swap
+ // In this example we are picking the pair that yeilds the best overall quote
+ let destQuery = maxBy(destQueries, (query) => query.minAmountOut);
+ let selectedIndex = destQueries.indexOf(destQuery)
+ let originQuery = originQueries[selectedIndex]
+
+ // Now we apply user slippage and deadline settings
+ originQuery = applyUserSettings(originQuery, userSettings)
+ destQuery = applyUserSettings(destQuery, userSettings)
+
+ // 5. Call SynapseRouter on origin chain to perform a swap
+ let amountETH: BigInt;
+ // 0xEeee address is used to represent native ETH
+ if (tokenIn == "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE") {
+ // If user selected "native ETH" as tokenIn, we would need to modify msg.value for the call
+ amountETH = amountIn;
+ } else {
+ // If user selected an ERC-20 token as tokenIn, we would need to use msg.value=0
+ amountETH = 0
+ // We also need to check if user approved routerOrigin to spend `tokenIn`
+ if (allowance(tokenIn, userOrigin, routerOrigin) < amountIn) {
+ // Users needs to issue a token approval
+ // tokenIn.approve(routerOrigin, amountIn)
+ }
+ }
+ // Perform a call to Synapse Router with all the derevied parameters
+ // Use previously determined msg.value for this call
+ // (WETH wrapping is done by the Synapse Router)
+ routerOrigin.bridge{value: amountETH}(
+ userDest,
+ destChainId,
+ tokenIn,
+ amountIn,
+ originQuery,
+ destQuery
+ );
+}
+```
diff --git a/docs/bridge/docs/04-Routers/CCTP/index.md b/docs/bridge/docs/04-Routers/CCTP/index.md
new file mode 100644
index 0000000000..0f26283f2f
--- /dev/null
+++ b/docs/bridge/docs/04-Routers/CCTP/index.md
@@ -0,0 +1,132 @@
+---
+sidebar_label: CCTP
+---
+
+import { CCTPFlow } from '@site/src/components/CCTPFlow'
+
+# CCTP Router
+
+A [Synapse Router](../Synapse-Router) bridge module which uses Circle's [Cross-Chain Transfer Protocol](https://www.circle.com/en/cross-chain-transfer-protocol) to natively mint & burn USDC.
+
+
+
+ User assets are sent to a Circle contract, moved to the `destChain`, and returned to the user.
+
+
+## Architecture
+
+### Contracts
+
+[Synapse CCTP contracts](/docs/Contracts/CCTP) overlay Circle CCTP contracts to mint and burn USDC and fulfill CCTP transactions.
+
+### Configuration
+CCTP can be configured to bridge through any supported liquidity source, such as [Uniswap](https://github.com/synapsecns/synapse-contracts/blob/master/contracts/router/modules/pool/uniswap/UniswapV3Module.sol), [Curve](https://github.com/synapsecns/synapse-contracts/blob/master/contracts/router/modules/pool/curve/CurveV1Module.sol), [Algebra](https://github.com/synapsecns/synapse-contracts/blob/master/contracts/router/modules/pool/algebra/AlgebraModule.sol), [DAI PSM](https://github.com/synapsecns/synapse-contracts/blob/master/contracts/router/modules/pool/dss/DssPsmModule.sol), and others.
+
+### Relayer
+
+CCTP Relayers allow anyone to coordinate on-chain events and stored message states to send native USDC through SynapseCCTP and Circle's CCTP contracts.
+
+:::tip
+
+While the Synapse CCTP Golang relayer can be run by anyone, and is easily observable, you can also build and run your own relayer permissionlessly in any programming language.
+
+:::
+
+## Behavior
+
+CCTP Relayers poll for new transactions and state updates from CCTP contracts on-chain, to store in an off-chain database.
+
+Attestations from the [Circle API](https://developers.circle.com/stablecoin/reference) are submitted to the destination contract, and marked `Complete` when a transaction receipt is received.
+
+| State | Description |
+|-------------|-------------|
+| `Pending` | Initiated on origin chain, and pending attestation |
+| `Attested` | Waiting for submission on destination chain |
+| `Submitted` | Confirmed on destination chain |
+| `Complete` | Completed on destination chain |
+
+
+
+
+## Configure
+
+CCTP Relayers require a YAML configuration file path to be provided at run time.
+
+:::note cctp_type
+
+* **`synapse`** (recommended): Uses events & metadata from [Synapse CCTP contracts](/docs/Contracts/CCTP), and `synapse_cctp_address` when configuring `chains`.
+
+* **`circle`** (USDC to USDC only): Uses raw [TokenMessenger](https://github.com/circlefin/evm-cctp-contracts/blob/817397db0a12963accc08ff86065491577bbc0e5/src/TokenMessenger.sol) events, and `token_messenger_address` when configuring `chains`.
+
+:::
+
+### Parameters
+
+* `cctp_type`: Determines which event types and contracts are used.
+* `chains`: `chain_id` list
+* `base_omnirpc_url`: [OmniRPC service](/docs/Services/Omnirpc) base URL
+* `unbonded_signer`: [Signer service](/docs/Services/Signer) — *should be a mounted secret*
+* `port`: Relayer port (e.g. 8080)
+* `host`: Relayer host (e.g. localhost) — *do not publicly expose*.
+* `http_backoff_initial_interval_ms`: Initial backoff interval in milliseconds.
+* `retry_interval_ms`: Retry interval between attestation requests in milliseconds — *[CCTP API Rate Limit](https://developers.circle.com/stablecoins/docs/limits)*.
+
+ ### Example
+
+```yaml
+cctp_type: "synapse"
+# prod contract addresses
+chains:
+ - chain_id: 1
+ synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
+ - chain_id: 42161
+ synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
+base_omnirpc_url: "http://omnrpc-url/"
+unbonded_signer:
+ type: "AWS"
+ # should be a mounted secret
+ file: "/config/aws.txt"
+http_backoff_initial_interval_ms: 1000
+http_backoff_max_elapsed_time_ms: 300000
+# submitter config for cctp
+submitter_config:
+ chains:
+ 1:
+ supports_eip_1559: true
+ gas_estimate: 1000000
+ 42161:
+ gas_estimate: 30000000
+ max_gas_price: 10000000000
+ supports_eip_1559: true
+```
+
+
+## Run
+
+### From Docker
+
+Run the Docker [image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Fcctp-relayer) along with the path to your [YAML configuration file](#configure).
+
+1. `docker run ghcr.io/synapsecns/sanguine/cctp-relayer:latest --config /path/to/config.yaml`
+
+### From Source
+
+:::note Requires Go 1.21 or higher
+
+Not generally recommended for end-users.
+
+:::
+
+Clone the Sanguine repository, then run the main.go file along with the path to your [YAML configuration file](#configure).
+
+1. `git clone https://github.com/synapsecns/sanguine --recursive`
+2. `cd sanguine/services/cctp-relayer`
+3. `go run main.go --config /path/to/config.yaml`
+
+### With Helm
+
+There is a helm chart available for the CCTP Relayer [here](https://artifacthub.io/packages/helm/synapse/cctp/0.2.0), but it is recommended you create your own.
+
+### Recommended services
+
+CCTP Relayer uses open telemetry for tracing and metrics. See the [Observability](/docs/Services/Observability) page for details. We highly recommend setting up the [Submitter Dashboard](/docs/Services/Submitter) as well.
diff --git a/docs/bridge/docs/04-Routers/RFQ/01-Relayer.md b/docs/bridge/docs/04-Routers/RFQ/01-Relayer.md
new file mode 100644
index 0000000000..e2f87823b5
--- /dev/null
+++ b/docs/bridge/docs/04-Routers/RFQ/01-Relayer.md
@@ -0,0 +1,311 @@
+---
+sidebar_position: 0
+sidebar_label: Relayer
+---
+
+# RFQ Relayer
+
+:::note
+
+Relayers must be whitelisted in order to fulfill bridge requests.
+
+:::
+
+A Go application which coordinates on-chain events and stored message states to relay user funds. Relayers are easily observable.
+
+The canonical RFQ Relayer handles **three event loops**: quoting routes, approving relays, and rebalancing funds.
+
+## Quote
+
+Continuously track and update route quotes based on changes to available and in-flight balances via [API](API). The quote should update each time the available balance or other parameters change.
+
+| Param | Description
+|---------|-
+| Balance | Maximum amount the relayer can fill
+| Offset | Token price percentage, used to ensure the relayer is profitable.
+| Fee | `fixed_fee_multiplier` (from [config](#configure)) multiplied by `origin_gas_estimate + destination_gas_estimate`
+
+
+
+## Relay
+
+Listen to on-chain events and database updates to move [`BridgeRequest`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgeparams) objects through the following states:
+
+| State | Description
+|----------------------|-
+| `Seen` | [`BridgeRequested`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested) event stored in the db.
+| `WillNotProcess` | [`BridgeRequested`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested) event is invalid
+| `NotEnoughInventory` | Retry later
+| `CommittedPending` | All checks pass, waiting for transaction to finalize
+| `CommittedConfirmed` | Transaction is finalized on-chain
+| `RelayPending` | Called [`relay`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#relay)
+| `RelayComplete` | Relay completed on-chain
+| `ProvePosting` | Called [`prove`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove)
+| `ClaimPending` | Called [`claim`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#claim)
+| `ClaimComplete` | Dispute period expired, funds received.
+
+## Rebalance
+
+For cases where flows are mono-directional, the Relayer provides an interface for rebalancing funds.
+
+Automated rebalancing is configurable by token and currently supports CCTP routes as well as native bridging on Scroll. Rebalancing evaluation follows this logic every `rebalance_interval`:
+
+For each supported rebalance method, calculate the `total_balance` of each token across the chains that support that rebalance method, and which tokens have a balance below `total_balance * maintenance_balance_pct`.
+
+:::note
+
+To limit in-flight inventory, only one rebalance can be pending at a time for each token. We select the 'best' rebalance candidate as the rebalance with the largest delta between origin and destination balance.
+
+:::
+
+The rebalance amount is the smaller of the maximum rebalance amount on origin, and minimum rebalance amount on destination, clamped to the `min` and `max` values in the configuration file.
+
+#### Example
+
+| # | CCTP | USDC | `maintenence_pct` | `initial_pct`
+|---|------|------|-------------------|-
+| 1 | Yes | 20% | 40% | 100 USDC
+| 2 | Yes | 20% | 40% | 900 USDC
+| 3 | No | 20% | 40% | 2000 USDC
+
+The total balance of CCTP-supported chains is `1000 USDC`. Since chain 1, with 10% of the total inventory, is below the 20% maintenance threshold, the system triggers a rebalance from Chain 2 to Chain 1.
+
+Chain 3 does not support CCTP, and is not considered for rebalance.
+
+The maximum rebalance amount is `600 USDC` which takes chain 2 to its 40% initial threshold
+
+`300 USDC` is sent from chain 2 to chain 1 is, which is the minimum required to reach chain 1's initial 40% threshold.
+
+:::note Scroll
+
+Rebalancing for certain native bridges (e.g Scroll) is supported. It works slightly differently as flows are only supported between Scroll and Mainnet.
+
+At a high level, the rebalancer checks inventory on Scroll versus other chains, and if imbalanced, initiates a bridge to mainnet, allowing the CCTP relayer to rebalance funds where needed.
+
+:::
+
+## Configure
+
+RFQ Relayer requires a YAML configuration file path to be provided at run time.
+
+
+
+:::note rebalance_method
+
+`synapse` collects a fee, but does not spend user gas. Use `synapse_cctp_address` when configuring `chains`.
+
+`cctp` has no fees, but spends user gas. Use `token_messenger_address` when configuring `chains`.
+
+:::
+
+* `submitter_config`: Covered [here](/docs/Services/Submitter#observability). Controls gas parameters for on-chain transactions.
+* `database`: Database settings for API backend. Required to store quotes and other information. SQLite with `DSN` set to a `/tmp/` directory is recommended for development.
+ * `type`: Database driver to use, can be `mysql` or `sqlite`.
+ * `dsn`: 'Data Source Name'. If using SQLite, this can be a path. For MySQL see [here](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration.html) for more information.
+* `screener_api_url` (optional): [Screener API](https://github.com/synapsecns/sanguine/tree/master/contrib/screener-api#screening-api)
+* `rfq_url`: [Mainnet & Testnet addresses](API/#api-urls)
+* `omnirpc_url`: [Running an OmniRPC instance](/docs/Services/Omnirpc)
+* `rebalance_interval`: How often to rebalance. Can use `s` (seconds), `m` (minutes), or `h` (hours)
+* `relayer_api_port`: Controls the relayer. Should be private or secured.
+* `base_chain_config`: Default chain configuration. Overridden by individual chain configurations. See `chains` for details.
+* `enable_guard`: Run a guard in the same instance.
+* `submit_single_quotes`: Whether to use the batch endpoint to post quotes to the API. Useful for debugging.
+* `chains`: Individual configurations to override `base_chain_config`.
+ * `rfq_address`: [RFQ contract address](/docs/Contracts/RFQ) for this chain.
+ * `confirmations`: how many confirmations to wait before acting on an event. This will vary per-chain.
+ * `tokens`: this is a map of token symbol→token info for this chain. For example, token may be USDC, ETH, etc
+ * `address`: address of the token on this chain id
+ * `decimals`: number of decimals this token uses. Please verify this against the token contract itself.
+ * `min_quote_amount`: smallest amount to quote for a given chain. This should be balanced against expected gas spend for a relayer to be profitable. `min_quote_amount` is to be given in decimal units (so 1000.00 is 1000)
+ * `rebalance_method`: Some tokens may not have a rebalance method. Uses `synapse` or `cctp`.
+ * `maintenance_balance_pct`: Portion of liquidity to maintain for this token on this chain. A balance under this amount triggers a rebalance.
+ * `initial_balance_pct`: Portion of liquidity to maintain after a rebalance. Should total 100% across all chains.
+ * `min_rebalance_amount`: Minimum amount of this token to try to rebalance.
+ * `max_rebalance_amount`: Maximum amount of this token to rebalance at one time.
+
+ * `synapse_cctp_address` (optional): Used with `rebalance_method: synapse`. Uses a [Synapse CCTP address](/docs/Contracts/CCTP).
+ * `token_messenger_address` (optional): Used with `rebalance_method: cctp`. Tells the relayer to use the token messenger instead of Synapse.
+* `quotable_tokens`: list of `[chain-id]-[token_address]: [chain-id]-[token_address]`. For example 1-0x00… could be paired with 10-0x01
+ ```yaml
+ "1-0x00":
+ - "1-0x01"
+ ```
+* `cctp_relayer_config`: See [CCTP](/docs/Routers/CCTP).
+
+### Example
+
+
+ `config.yml`
+ ```yaml
+submitter_config: # please see the more detailed submitter documentation
+ chains:
+ 1:
+ supports_eip_1559: true
+ gas_estimate: 1000000
+database:
+ type: sqlite # can be other mysql or sqlite
+ dsn: /tmp/db # should be the dsn of your database. If using sqlite, this can be a path
+
+signer: # please see more detailed signer config #can be text, gcp, or aws
+ type: GCP
+ file: /config/signer.txt
+
+screener_api_url: 'http://screener-url' # can be left blank
+rfq_url: 'http://rfq-api' # url of the rfq api backend.
+omnirpc_url: 'http://omnirpc' # url of the omnirpc instance, please reference the Omnirpc section under Services for proper configuration
+rebalance_interval: 2m # how often to rebalance
+relayer_api_port: '8081' # api port for the relayer api
+volume_limit: 10000 # USD price cap for a bridge under block confirmation minimum (configurable under `chains`)
+
+base_chain_config: # this is hte base chain config, other chains override it
+ confirmations: 0
+ # Claim (72.5k) + Prove (57.5k) gas limits, rounded up
+ origin_gas_estimate: 130_000
+ # Relay gas limit, rounded up
+ dest_gas_estimate: 110_000
+ quote_offset_bps: 2
+ native_token: ETH
+ quote_pct: 90
+ min_gas_token: 1000000000000000000
+ fixed_fee_multiplier: 1.25
+
+chains:
+ 1:
+ rfq_address: "0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E" # rfq contract address on eth
+ synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E" # ccctp contract address on eth
+ token_messenger_address: "0xbd3fa81b58ba92a82136038b25adec7066af3155" # token messenger address on eth, note: only one of token_messenger_address or synapse_cctp_address actually needs to be present
+ cctp_start_block: 19341000
+ confirmations: 2
+ tokens:
+ USDC:
+ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
+ decimals: 6
+ price_usd: 1.0
+ min_quote_amount: 10000
+ rebalance_method: "circlecctp"
+ maintenance_balance_pct: 20
+ initial_balance_pct: 50
+ max_rebalance_amount: 500000
+ ETH:
+ address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
+ decimals: 18
+ price_usd: 2600
+ 10:
+ rfq_address: "0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E"
+ synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
+ token_messenger_address: "0x2B4069517957735bE00ceE0fadAE88a26365528f"
+ cctp_start_block: 116855000
+ l1_fee_chain_id: 1
+ # Prove + Claim L1 gas estimate
+ l1_fee_origin_gas_estimate: 20
+ # Relay L1 gas estimate
+ l1_fee_dest_gas_estimate: 10
+ tokens:
+ USDC:
+ address: "0x0b2c639c533813f4aa9d7837caf62653d097ff85"
+ decimals: 6
+ price_usd: 1.0
+ min_quote_amount: 10000
+ rebalance_method: "circlecctp"
+ maintenance_balance_pct: 20
+ initial_balance_pct: 50
+ max_rebalance_amount: 500000
+ ETH:
+ address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
+ decimals: 18
+ price_usd: 2600
+
+quotable_tokens:
+ 10-0x0b2c639c533813f4aa9d7837caf62653d097ff85:
+ - "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
+ 1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48:
+ - "10-0x0b2c639c533813f4aa9d7837caf62653d097ff85"
+ 1-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
+ - "10-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
+ 10-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
+ - "1-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
+
+fee_pricer:
+ gas_price_cache_ttl: 60
+ token_price_cache_ttl: 60
+
+cctp_relayer_config:
+ cctp_type: "circle"
+ circle_api_url: "https://iris-api.circle.com/v1/attestations"
+ chains:
+ - chain_id: 1
+ synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
+ token_messenger_address: "0xbd3fa81b58ba92a82136038b25adec7066af3155"
+ - chain_id: 10
+ synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
+ token_messenger_address: "0x2B4069517957735bE00ceE0fadAE88a26365528f"
+ base_omnirpc_url: "http://omnirpc" # Make sure this is configured properly
+ unbonded_signer:
+ type: GCP
+ file: /config/signer.txt
+ http_backoff_initial_interval_ms: 1000
+ http_backoff_max_elapsed_time_ms: 300000
+ ```
+
+
+## Run
+
+### From Docker
+
+Run the Docker [image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Frfq-relayer) along with the path to your [YAML configuration file](#configure).
+
+1. `docker run ghcr.io/synapsecns/sanguine/rfq-relayer:latest --config /path/to/config`
+
+### From Source
+
+:::note Requires Go 1.21 or higher
+
+Not generally recommended for end-users.
+
+:::
+
+Clone the Sanguine repository, then run the main.go file along with the path to your [YAML configuration file](#configure).
+
+1. `git clone https://github.com/synapsecns/sanguine --recursive`
+2. `cd sanguine/services/rfq/relayer`
+3. `go run main.go --config /path/to/config.yaml`
+
+## sendChainGas
+
+Boolean flag available to Bridge users. When `sendChainGas` is `true`, the amount to send is specified as `chainGasAmount` in the FastBridge contract on the destination chain.
+
+:::note
+
+`chainGasAmount` is currently set to `0` on all contracts. You can ignore `sendChainGas` by only providing quotes where `sendChainGas` is not set, or `chainGasAmount` is `0`.
+
+:::
+
+## Withdrawals
+
+The `POST /withdraw` endpoint is exposed to allow withdrawals from the relayer wallet without needing to deal with the private key directly. This can be used for manual rebalancing. To use this feature, set the following config values:
+
+```yaml
+enable_api_withdrawals: true
+withdrawal_whitelist:
+ -
+```
+
+The relayer CLI (at `services/rfq/relayer/main.go`) exposes a withdrawal command for convenience:
+
+```bash
+go run main.go withdraw --relayer-url https://localhost:8081 --chain-id 1 --amount 1000000000000000000 --token-address 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE --to 0x0000000000000000000000000000000000000000
+```
+
+Be sure to sub in your respective `to` address!
+
+## Observability
+
+The RFQ relayer implements open telemetry for both tracing and metrics. Please see the [Observability](/docs/Services/Observability) page for more info. There is also a custom [grafana dashboard](https://github.com/synapsecns/sanguine/tree/master/services/rfq/relayer/dashboards/dashboard.json) available for the relayer. We'd also highly recommend setting up the [submitter dashboard](/docs/Services/Submitter) as well.
+
+![Relayer Grafana Dashboard](dashboard.png)
+
+The metrics exposed by the relayer are:
+
+- `inventory_balance`: The balance of the inventory on the chain for a given `token_name` and `relayer`.
+- `quote_amount`: The amount quoted for a given `token_name` and `relayer`.
+- `status_count`: The distribution of non-terminal `QuoteRequestStatus` values over time.
diff --git a/docs/bridge/docs/rfq/API/get-contract-addresses.api.mdx b/docs/bridge/docs/04-Routers/RFQ/API/get-contract-addresses.api.mdx
similarity index 100%
rename from docs/bridge/docs/rfq/API/get-contract-addresses.api.mdx
rename to docs/bridge/docs/04-Routers/RFQ/API/get-contract-addresses.api.mdx
diff --git a/docs/bridge/docs/rfq/API/get-quotes.api.mdx b/docs/bridge/docs/04-Routers/RFQ/API/get-quotes.api.mdx
similarity index 100%
rename from docs/bridge/docs/rfq/API/get-quotes.api.mdx
rename to docs/bridge/docs/04-Routers/RFQ/API/get-quotes.api.mdx
diff --git a/docs/bridge/docs/rfq/API/API.md b/docs/bridge/docs/04-Routers/RFQ/API/index.md
similarity index 98%
rename from docs/bridge/docs/rfq/API/API.md
rename to docs/bridge/docs/04-Routers/RFQ/API/index.md
index dfbc77ffe3..6946022d02 100644
--- a/docs/bridge/docs/rfq/API/API.md
+++ b/docs/bridge/docs/04-Routers/RFQ/API/index.md
@@ -3,6 +3,8 @@ sidebar_position: 0
sidebar_label: API
---
+# RFQ API
+
:::note
This guide is mostly meant for developers who are working on building their own quoter or frontend for rfq. If you are just looking to run a relayer, please see [Relayer](../Relayer). If you are looking to integrate rfq, please see the API docs below the dropdown.
@@ -48,8 +50,8 @@ The RFQ API expects the signatures to have V values as 0/1 rather than 27/28. Th
### API Urls
- - mainnet: rfq-api.omnirpc.io
- - testnet: rfq-api-testnet.omnirpc.io
+ - Mainnet: `rfq-api.omnirpc.io`
+ - Testnet: `rfq-api-testnet.omnirpc.io`
## Running the API:
@@ -72,7 +74,7 @@ Yaml settings:
- `database` - The database settings for the API backend. A database is required to store quotes and other information. Using SQLite with a dsn set to a `/tmp/` directory is recommended for development.
- `type` - the database driver to use, can be `mysql` or `sqlite`.
- `dsn` - the dsn of your database. If using sqlite, this can be a path, if using mysql please see [here](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration.html) for more information.
- - `omnirpc_url` - The omnirpc url to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](../../Services/Omnirpc.md).
+ - `omnirpc_url` - The omnirpc url to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](/docs/Services/Omnirpc).
- `bridges` - A key value map of chain id to FastBridge contract address. The API will only allow quotes to be posted on these chains.
- `port` - The port to run the http server on.
diff --git a/docs/bridge/docs/rfq/API/relay-ack.api.mdx b/docs/bridge/docs/04-Routers/RFQ/API/relay-ack.api.mdx
similarity index 100%
rename from docs/bridge/docs/rfq/API/relay-ack.api.mdx
rename to docs/bridge/docs/04-Routers/RFQ/API/relay-ack.api.mdx
diff --git a/docs/bridge/docs/rfq/API/upsert-quote.api.mdx b/docs/bridge/docs/04-Routers/RFQ/API/upsert-quote.api.mdx
similarity index 100%
rename from docs/bridge/docs/rfq/API/upsert-quote.api.mdx
rename to docs/bridge/docs/04-Routers/RFQ/API/upsert-quote.api.mdx
diff --git a/docs/bridge/docs/rfq/API/upsert-quotes.api.mdx b/docs/bridge/docs/04-Routers/RFQ/API/upsert-quotes.api.mdx
similarity index 100%
rename from docs/bridge/docs/rfq/API/upsert-quotes.api.mdx
rename to docs/bridge/docs/04-Routers/RFQ/API/upsert-quotes.api.mdx
diff --git a/docs/bridge/docs/rfq/Relayer/dashboard.png b/docs/bridge/docs/04-Routers/RFQ/dashboard.png
similarity index 100%
rename from docs/bridge/docs/rfq/Relayer/dashboard.png
rename to docs/bridge/docs/04-Routers/RFQ/dashboard.png
diff --git a/docs/bridge/docs/04-Routers/RFQ/index.md b/docs/bridge/docs/04-Routers/RFQ/index.md
new file mode 100644
index 0000000000..b44418cde1
--- /dev/null
+++ b/docs/bridge/docs/04-Routers/RFQ/index.md
@@ -0,0 +1,77 @@
+---
+sidebar_label: RFQ
+---
+
+import { RFQFlow } from '@site/src/components/RFQFlow'
+
+# RFQ Router
+
+A [Synapse Router](../Synapse-Router) bridge module which matches on-chain user requests against bridge quotes posted by decentralized [Relayers](Relayer).
+
+
+
+ User assets are sent to a Bridge contract, and held until a Solver executes their quote on the `destChain`.
+
+
+## Architecture
+
+[Synapse Fast Bridge contracts](/docs/Contracts/RFQ) coordinate decentralized Solvers to match user requests against the best quote for a given route, and secure user funds while their transaction is fulfilled.
+
+
+
+| Agents | Description
+|---------|-
+| Quoters | Quote distribution services run through traditional [APIs](API), or protocols like libp2p, irc, or dht.
+| Solvers | Posts, then fulfills, route quotes through a [Relayer](Relayer), when matched by the Fast Bridge contract against a user request.
+| Users | Uses a route quote to form a bridge request which is matched on-chain by the solver who posted the quote.
+| Guards | Raises a dispute if errors or fraudulent activity are detected.
+
+## Behavior
+
+After receiving a [`BridgeRequest`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgeparams) (broadcast as a [`BridgeRequested`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested) event), a Solver executes the transaction by calling [`relay`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#relay) on the Bridge contract.
+
+The Bridge relays the requested funds ([`msg.value`](https://ethereum.stackexchange.com/questions/43362/what-is-msg-value) in the case of ETH) from Solver to User, allowing the Solver that accepted the bridge to call [`prove`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove) on the Bridge contract, and receive their funds at the end of the optimistic period
+
+| `#` | State | Description
+|-----|-------------|-
+| `0` | `Null` | Bridge transaction does not exist yet on origin chain
+| `1` | `Requested` | [`BridgeRequested`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested) event broadcast. Waiting for Relayer
+| `2` | `Proved` | Relayer called [`relay`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#relay), and [`prove`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove), and is waiting for the optimistic period to end.
+| `3` | `Claimed` | Relayer called [`claim`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#claim) and received their funds.
+| `4` | `Refunded` | Relayer did not claim within the optimistic period, or a dispute was decided in favor of the user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Dispute Period and Guards
+
+The RFQ system includes an optimistic dispute window in which Guard contracts may initiate a dispute if they detect errors or fraudulent activity, such as incorrect fill amounts or proofs submitted by the wrong relayer.
+
+In a successful dispute, the relayer loses their claimable funds. This design is intended to enforce honest behavior while also protecting honest relayers in cases of blockchain reorgs.
+
+## Unfulfilled requests
+
+If a request is not fulfilled, users can reclaim their funds by using the [`claim`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#claim) function once the optimistic window has passed.
diff --git a/docs/bridge/docs/05-Contracts/01-Synapse-Token.md b/docs/bridge/docs/05-Contracts/01-Synapse-Token.md
new file mode 100644
index 0000000000..e839a6f865
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/01-Synapse-Token.md
@@ -0,0 +1,33 @@
+---
+title: Synapse Token
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# Synapse Token
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x080f6aed32fc474dd5717105dba5ea57268f46eb` [↗](https://arbiscan.io/token/0x080f6aed32fc474dd5717105dba5ea57268f46eb)|
+| Aurora | `0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445` [↗](https://explorer.mainnet.aurora.dev/address/0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445/transactions)|
+| Avalanche | `0x1f1E7c893855525b303f99bDF5c3c05Be09ca251` [↗](https://snowtrace.io/address/0x1f1E7c893855525b303f99bDF5c3c05Be09ca251)|
+| Base | `0x432036208d2717394d2614d6697c46DF3Ed69540` [↗](https://basescan.org/address/0x432036208d2717394d2614d6697c46DF3Ed69540)|
+| Blast | `0x9592f08387134e218327E6E8423400eb845EdE0E` [↗](https://blastscan.io/address/0x9592f08387134e218327E6E8423400eb845EdE0E)|
+| Boba | `0xb554A55358fF0382Fb21F0a478C3546d1106Be8c` [↗](https://blockexplorer.boba.network/tokens/0xb554A55358fF0382Fb21F0a478C3546d1106Be8c/token-transfers)|
+| BSC | `0xa4080f1778e69467e905b8d6f72f6e441f9e9484` [↗](https://bscscan.com/token/0xa4080f1778e69467e905b8d6f72f6e441f9e9484)|
+| Canto | `0x555982d2E211745b96736665e19D9308B615F78e` [↗](https://canto.dex.guru/address/0x555982d2e211745b96736665e19d9308b615f78e)|
+| Cronos | `0xFD0F80899983b8D46152aa1717D76cba71a31616` [↗](https://cronoscan.com/address/0xFD0F80899983b8D46152aa1717D76cba71a31616)|
+| DFK | `0xB6b5C854a8f71939556d4f3a2e5829F7FcC1bf2A` [↗](https://subnets.avax.network/defi-kingdoms/dfk-chain/explorer/address/0xB6b5C854a8f71939556d4f3a2e5829F7FcC1bf2A)|
+| Dogechain | `0xDfA53EeBA61D69E1D2b56b36d78449368F0265c1` [↗](https://explorer.dogechain.dog/address/0xDfA53EeBA61D69E1D2b56b36d78449368F0265c1)|
+| Ethereum | `0x0f2D719407FdBeFF09D87557AbB7232601FD9F29` [↗](https://etherscan.io/token/0x0f2D719407FdBeFF09D87557AbB7232601FD9F29)|
+| Fantom | `0xE55e19Fb4F2D85af758950957714292DAC1e25B2` [↗](https://ftmscan.com/address/0xe55e19fb4f2d85af758950957714292dac1e25b2)|
+| Harmony | `0xE55e19Fb4F2D85af758950957714292DAC1e25B2` [↗](https://explorer.harmony.one/address/0xe55e19fb4f2d85af758950957714292dac1e25b2)|
+| Moonbeam | `0xF44938b0125A6662f9536281aD2CD6c499F22004` [↗](https://moonscan.io/address/0xF44938b0125A6662f9536281aD2CD6c499F22004)|
+| Moonriver | `0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445` [↗](https://moonriver.moonscan.io/address/0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445)|
+| Optimism | `0x5A5fFf6F753d7C11A56A52FE47a177a87e431655` [↗](https://optimistic.etherscan.io/address/0x5A5fFf6F753d7C11A56A52FE47a177a87e431655)|
+| Polygon | `0xf8f9efc0db77d8881500bb06ff5d6abc3070e695` [↗](https://polygonscan.com/token/0xf8f9efc0db77d8881500bb06ff5d6abc3070e695)|
+| Metis | `0x67c10c397dd0ba417329543c1a40eb48aaa7cd00` [↗](https://andromeda-explorer.metis.io/address/0x67C10C397dD0Ba417329543c1a40eb48AAa7cd00)|
\ No newline at end of file
diff --git a/docs/bridge/docs/05-Contracts/02-Synapse-Router.md b/docs/bridge/docs/05-Contracts/02-Synapse-Router.md
new file mode 100644
index 0000000000..2b0a9bc21e
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/02-Synapse-Router.md
@@ -0,0 +1,44 @@
+---
+title: Synapse Router
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# Synapse Router
+
+Synapse Router contracts route through the [SynapseBridge](https://github.com/synapsecns/synapse-contracts/blob/ed93453430635e2d43704d5599d3318c43a23033/contracts/bridge/SynapseBridge.sol#L63-L118) contract, which is used for event indexing.
+
+:::tip Events
+
+Contracts in the `deployments` folder of each chain's `SynapseBridge.json` file emit `TokenMint` or `TokenWithdraw` events when a transaction completes on the destination chain.
+
+:::
+
+**Router address**: `0x7E7A0e201FD38d3ADAA9523Da6C109a07118C96a`
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x6F4e8eBa4D337f874Ab57478AcC2Cb5BACdc19c9` [↗](https://arbiscan.io/address/0x6F4e8eBa4D337f874Ab57478AcC2Cb5BACdc19c9) |
+| Aurora | `0xaeD5b25BE1c3163c907a471082640450F928DDFE` [↗](https://explorer.mainnet.aurora.dev/address/0xaeD5b25BE1c3163c907a471082640450F928DDFE/transactions) |
+| Avalanche | `0xC05e61d0E7a63D27546389B7aD62FdFf5A91aACE` [↗](https://snowtrace.io/address/0xC05e61d0E7a63D27546389B7aD62FdFf5A91aACE) |
+| Base | `0xf07d1C752fAb503E47FEF309bf14fbDD3E867089` [↗](https://basescan.org/address/0xf07d1C752fAb503E47FEF309bf14fbDD3E867089) |
+| Blast | `0x55769baf6ec39b3bf4aae948eb890ea33307ef3c` [↗](https://blastscan.io/address/0x55769baf6ec39b3bf4aae948eb890ea33307ef3c) |
+| Boba | `0x432036208d2717394d2614d6697c46DF3Ed69540` [↗](https://blockexplorer.boba.network/address/0x432036208d2717394d2614d6697c46DF3Ed69540/transactions) |
+| BSC | `0xd123f70AE324d34A9E76b67a27bf77593bA8749f` [↗](https://bscscan.com/address/0xd123f70AE324d34A9E76b67a27bf77593bA8749f) |
+| Canto | `0xDde5BEC4815E1CeCf336fb973Ca578e8D83606E0` [↗](https://evm.explorer.canto.io/address/0xDde5BEC4815E1CeCf336fb973Ca578e8D83606E0) |
+| Cronos | `0xE27BFf97CE92C3e1Ff7AA9f86781FDd6D48F5eE9` [↗](https://cronoscan.com/address/0xE27BFf97CE92C3e1Ff7AA9f86781FDd6D48F5eE9) |
+| DFK | `0xE05c976d3f045D0E6E7A6f61083d98A15603cF6A` [↗](https://subnets.avax.network/defi-kingdoms/dfk-chain/explorer/address/0xE05c976d3f045D0E6E7A6f61083d98A15603cF6A) |
+| Dogechain | `0x9508BF380c1e6f751D97604732eF1Bae6673f299` [↗](https://explorer.dogechain.dog/address/0x9508BF380c1e6f751D97604732eF1Bae6673f299) |
+| Ethereum | `0x2796317b0fF8538F253012862c06787Adfb8cEb6` [↗](https://etherscan.io/address/0x2796317b0fF8538F253012862c06787Adfb8cEb6) |
+| Fantom | `0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b` [↗](https://ftmscan.com/address/0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b) |
+| Harmony | `0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b` [↗](https://explorer.harmony.one/address/0xaf41a65f786339e7911f4acdad6bd49426f2dc6b) |
+| Klaytn | `0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b` [↗](https://scope.klaytn.com/account/0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b?tabId=txList) |
+| Metis | `0x06Fea8513FF03a0d3f61324da709D4cf06F42A5c` [↗](https://andromeda-explorer.metis.io/address/0x06Fea8513FF03a0d3f61324da709D4cf06F42A5c) |
+| Moonbeam | `0x84A420459cd31C3c34583F67E0f0fB191067D32f` [↗](https://moonscan.io/address/0x84A420459cd31C3c34583F67E0f0fB191067D32f) |
+| Moonriver | `0xaeD5b25BE1c3163c907a471082640450F928DDFE` [↗](https://moonriver.moonscan.io/address/0xaeD5b25BE1c3163c907a471082640450F928DDFE) |
+| Optimism | `0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b` [↗](https://optimistic.etherscan.io/address/0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b) |
+| Polygon | `0x8F5BBB2BB8c2Ee94639E55d5F41de9b4839C1280` [↗](https://polygonscan.com/address/0x8F5BBB2BB8c2Ee94639E55d5F41de9b4839C1280) |
diff --git a/docs/bridge/docs/05-Contracts/03-Intermediate-Tokens.md b/docs/bridge/docs/05-Contracts/03-Intermediate-Tokens.md
new file mode 100644
index 0000000000..5b493cf9ca
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/03-Intermediate-Tokens.md
@@ -0,0 +1,41 @@
+---
+title: Intermediate Tokens
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# Intermediate Tokens
+
+## nETH
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x3ea9B0ab55F34Fb188824Ee288CeaEfC63cf908e` [↗](https://arbiscan.io/address/0x3ea9B0ab55F34Fb188824Ee288CeaEfC63cf908e) |
+| Base | `0xb554A55358fF0382Fb21F0a478C3546d1106Be8c` [↗](https://basescan.org/address/0xb554A55358fF0382Fb21F0a478C3546d1106Be8c) |
+| Blast | `0xce971282faac9fabcf121944956da7142cccc855` [↗](https://blastscan.io/token/0xce971282faac9fabcf121944956da7142cccc855) |
+| Boba | `0x96419929d7949D6A801A6909c145C8EEf6A40431` [↗](https://blockexplorer.boba.network/address/0x96419929d7949D6A801A6909c145C8EEf6A40431/transactions) |
+| Optimism | `0x809DC529f07651bD43A172e8dB6f4a7a0d771036` [↗](https://optimistic.etherscan.io/address/0x809DC529f07651bD43A172e8dB6f4a7a0d771036) |
+| Metis | `0x931b8f17764362a3325d30681009f0edd6211231` [↗](https://andromeda-explorer.metis.io/address/0x931B8f17764362A3325D30681009f0eDd6211231) |
+
+## nUSD
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x2913e812cf0dcca30fb28e6cac3d2dcff4497688` [↗](https://arbiscan.io/token/0x2913e812cf0dcca30fb28e6cac3d2dcff4497688) |
+| Aurora | `0x07379565cD8B0CaE7c60Dc78e7f601b34AF2A21c` [↗](https://explorer.mainnet.aurora.dev/address/0x07379565cD8B0CaE7c60Dc78e7f601b34AF2A21c/transactions) |
+| Avalanche | `0xCFc37A6AB183dd4aED08C204D1c2773c0b1BDf46` [↗](https://snowtrace.io/address/0xCFc37A6AB183dd4aED08C204D1c2773c0b1BDf46) |
+| Blast | `0x3194B0A295D87fDAA54DF852c248F7a6BAF6c6e0` [↗](https://blastscan.io/address/0x3194B0A295D87fDAA54DF852c248F7a6BAF6c6e0) |
+| Boba | `0x6B4712AE9797C199edd44F897cA09BC57628a1CF` [↗](https://blockexplorer.boba.network/tokens/0x6B4712AE9797C199edd44F897cA09BC57628a1CF/token-transfers) |
+| BSC | `0x23b891e5c62e0955ae2bd185990103928ab817b3` [↗](https://bscscan.com/token/0x23b891e5c62e0955ae2bd185990103928ab817b3) |
+| Cronos | `0x396c9c192dd323995346632581BEF92a31AC623b` [↗](https://cronoscan.com/address/0x396c9c192dd323995346632581BEF92a31AC623b) |
+| DFK | `0x52285D426120aB91F378b3dF4A15a036a62200aE` [↗](https://subnets.avax.network/defi-kingdoms/dfk-chain/explorer/address/0x52285D426120aB91F378b3dF4A15a036a62200aE) |
+| Ethereum | `0x1B84765dE8B7566e4cEAF4D0fD3c5aF52D3DdE4F` [↗](https://etherscan.io/token/0x1B84765dE8B7566e4cEAF4D0fD3c5aF52D3DdE4F) |
+| Fantom | `0xed2a7edd7413021d440b09d654f3b87712abab66` [↗](https://ftmscan.com/token/0xed2a7edd7413021d440b09d654f3b87712abab66) |
+| Harmony | `0xed2a7edd7413021d440b09d654f3b87712abab66` [↗](https://explorer.harmony.one/address/0xed2a7edd7413021d440b09d654f3b87712abab66) |
+| Optimism | `0x67C10C397dD0Ba417329543c1a40eb48AAa7cd00` [↗](https://optimistic.etherscan.io/address/0x67C10C397dD0Ba417329543c1a40eb48AAa7cd00) |
+| Polygon | `0xb6c473756050de474286bed418b77aeac39b02af` [↗](https://polygonscan.com/token/0xb6c473756050de474286bed418b77aeac39b02af) |
+| Metis | `0x961318fc85475e125b99cc9215f62679ae5200ab` [↗](https://andromeda-explorer.metis.io/address/0x961318Fc85475E125B99Cc9215f62679aE5200aB) |
diff --git a/docs/bridge/docs/05-Contracts/04-Liquidity-Pools.md b/docs/bridge/docs/05-Contracts/04-Liquidity-Pools.md
new file mode 100644
index 0000000000..5f3b5a887e
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/04-Liquidity-Pools.md
@@ -0,0 +1,41 @@
+---
+title: Liquidity Pools
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# Liquidity Pools
+
+Liquidity pools are available at [https://synapseprotocol.com/pools](https://synapseprotocol.com/pools)
+
+## ETH Pools
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0xa067668661C84476aFcDc6fA5D758C4c01C34352` [↗](https://arbiscan.io/address/0x6f4e8eba4d337f874ab57478acc2cb5bacdc19c9) |
+| Avalanche | `0x77a7e60555bC18B4Be44C181b2575eee46212d44` [↗](https://snowtrace.io/address/0x77a7e60555bC18B4Be44C181b2575eee46212d44) |
+| Base | `0x6223bD82010E2fB69F329933De20897e7a4C225f` [↗](https://basescan.org/address/0x6223bd82010e2fb69f329933de20897e7a4c225f) |
+| Blast | `0x999fcd13C54B26E02a6Ccd185f71550b3a4641c0` [↗](https://blastscan.io/address/0x999fcd13C54B26E02a6Ccd185f71550b3a4641c0) |
+| Metis | `0x09fEC30669d63A13c666d2129230dD5588E2e240` [↗](https://andromeda-explorer.metis.io/address/0x09fEC30669d63A13c666d2129230dD5588E2e240) |
+| Optimism | `0xE27BFf97CE92C3e1Ff7AA9f86781FDd6D48F5eE9` [↗](https://optimistic.etherscan.io/address/0xE27BFf97CE92C3e1Ff7AA9f86781FDd6D48F5eE9) |
+
+## Stableswap Pools
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x9Dd329F5411466d9e0C488fF72519CA9fEf0cb40` [↗](https://arbiscan.io/address/0x9Dd329F5411466d9e0C488fF72519CA9fEf0cb40) |
+| Aurora | `0x3CE7AAD78B9eb47Fd2b487c463A17AAeD038B7EC` [↗](https://explorer.aurora.dev/address/0x3CE7AAD78B9eb47Fd2b487c463A17AAeD038B7EC) |
+| Avalanche | `0xED2a7edd7413021d440b09D654f3b87712abAB66` [↗](https://snowtrace.io/address/0xED2a7edd7413021d440b09D654f3b87712abAB66) |
+| Blast | `0xa4bd1AAD7cF04567c10f38FC4355E91bba32aC9c` [↗](https://blastscan.io/address/0xa4bd1AAD7cF04567c10f38FC4355E91bba32aC9c) |
+| BNB Chain | `0x28ec0B36F0819ecB5005cAB836F4ED5a2eCa4D13` [↗](https://bscscan.com/address/0x28ec0B36F0819ecB5005cAB836F4ED5a2eCa4D13) |
+| Boba | `0x75FF037256b36F15919369AC58695550bE72fead` [↗](https://bobascan.com/address/0x75FF037256b36F15919369AC58695550bE72fead) |
+| Canto | `0x07379565cD8B0CaE7c60Dc78e7f601b34AF2A21c` [↗](https://evm.explorer.canto.io/address/0x07379565cD8B0CaE7c60Dc78e7f601b34AF2A21c) |
+| Ethereum | `0x1116898DdA4015eD8dDefb84b6e8Bc24528Af2d8` [↗](https://etherscan.io/address/0x1116898DdA4015eD8dDefb84b6e8Bc24528Af2d8) |
+| Fantom | `0x85662fd123280827e11C59973Ac9fcBE838dC3B4` [↗](https://ftmscan.com/address/0x85662fd123280827e11C59973Ac9fcBE838dC3B4) |
+| Metis | `0x555982d2E211745b96736665e19D9308B615F78e` [↗](https://andromeda-explorer.metis.io/address/0x555982d2E211745b96736665e19D9308B615F78e) |
+| Optimism | `0xF44938b0125A6662f9536281aD2CD6c499F22004` [↗](https://optimistic.etherscan.io/address/0xf44938b0125a6662f9536281ad2cd6c499f22004) |
+| Polygon | `0x85fCD7Dd0a1e1A9FCD5FD886ED522dE8221C3EE5` [↗](https://polygonscan.com/address/0x85fCD7Dd0a1e1A9FCD5FD886ED522dE8221C3EE5) |
diff --git a/docs/bridge/docs/05-Contracts/05-CCTP.md b/docs/bridge/docs/05-Contracts/05-CCTP.md
new file mode 100644
index 0000000000..44a96c48c9
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/05-CCTP.md
@@ -0,0 +1,21 @@
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# CCTP
+
+Synapse CCTP contracts route through the [SynapseBridge](https://github.com/synapsecns/synapse-contracts/blob/ed93453430635e2d43704d5599d3318c43a23033/contracts/bridge/SynapseBridge.sol#L63-L118) contract to interact with [Circle CCTP contracts](https://developers.circle.com/stablecoins/docs/evm-smart-contracts) which mint and burn USDC across supported chains.
+
+**Address**: `0xd5a597d6e7ddf373a92c8f477daaa673b0902f48`\
+**Contract**: [SynapseCCTP.sol](https://github.com/synapsecns/synapse-contracts/blob/master/contracts/cctp/SynapseCCTP.sol)
+
+| Chain | Address |
+| --------- | ---------------------------------------------|
+| Arbitrum | `0x12715a66773bd9c54534a01abf01d05f6b4bd35e` [↗](https://arbiscan.io/address/0x12715a66773bd9c54534a01abf01d05f6b4bd35e) |
+| Avalanche | `0x12715a66773bd9c54534a01abf01d05f6b4bd35e` [↗](https://snowtrace.io/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
+| Base | `0x12715a66773bd9c54534a01abf01d05f6b4bd35e` [↗](https://basescan.org/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
+| Ethereum | `0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E` [↗](https://etherscan.io/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
+| Optimism | `0x12715a66773bd9c54534a01abf01d05f6b4bd35e` [↗](https://optimistic.etherscan.io/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
+| Polygon | `0x12715a66773bd9c54534a01abf01d05f6b4bd35e` [↗](https://polygonscan.com/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
diff --git a/docs/bridge/docs/05-Contracts/06-RFQ.md b/docs/bridge/docs/05-Contracts/06-RFQ.md
new file mode 100644
index 0000000000..8f76cb9468
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/06-RFQ.md
@@ -0,0 +1,28 @@
+---
+title: RFQ
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# RFQ
+
+RFQ contracts route through the [SynapseBridge](https://github.com/synapsecns/synapse-contracts/blob/ed93453430635e2d43704d5599d3318c43a23033/contracts/bridge/SynapseBridge.sol#L63-L118) contract.
+
+**Source code**: [SynapseCNS (Github)](https://github.com/synapsecns/sanguine/tree/master/packages/contracts-rfq)\
+**Generated docs**: [RFQ docs](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html)\
+**Address**: `0x00cD000000003f7F682BE4813200893d4e690000`
+
+| Chain | Address |
+| -------- | ------- |
+| Arbitrum | `0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E` [↗](https://arbiscan.io/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
+| Base | `0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E` [↗](https://basescan.org/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
+| Ethereum | `0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E` [↗](https://etherscan.io/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
+| Optimism | `0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E` [↗](https://optimistic.etherscan.io/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
+| Scroll | `0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E` [↗](https://scrollscan.com/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
+| Linea | `0x34F52752975222d5994C206cE08C1d5B329f24dD` [↗](https://lineascan.build/address/0x34F52752975222d5994C206cE08C1d5B329f24dD) |
+| BNB Chain| `0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E` [↗](https://bscscan.com/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
+| Blast | `0x34F52752975222d5994C206cE08C1d5B329f24dD` [↗](https://blastscan.io/address/0x34F52752975222d5994C206cE08C1d5B329f24dD) |
diff --git a/docs/bridge/docs/05-Contracts/07-Bridge-Zaps.md b/docs/bridge/docs/05-Contracts/07-Bridge-Zaps.md
new file mode 100644
index 0000000000..e5e0bcc6d6
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/07-Bridge-Zaps.md
@@ -0,0 +1,30 @@
+---
+title: Bridge Zaps
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# Bridge Zaps
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x37f9aE2e0Ea6742b9CAD5AbCfB6bBC3475b3862B` [↗](https://arbiscan.io/address/0x37f9aE2e0Ea6742b9CAD5AbCfB6bBC3475b3862B) |
+| Aurora | `0x2D8Ee8d6951cB4Eecfe4a79eb9C2F973C02596Ed` [↗](https://aurorascan.dev/address/0x2D8Ee8d6951cB4Eecfe4a79eb9C2F973C02596Ed) |
+| Avalanche | `0x0EF812f4c68DC84c22A4821EF30ba2ffAB9C2f3A` [↗](https://snowtrace.io/address/0x0EF812f4c68DC84c22A4821EF30ba2ffAB9C2f3A) |
+| Boba | `0x64B4097bCCD27D49BC2A081984C39C3EeC427a2d` [↗](https://blockexplorer.boba.network/address/0x64B4097bCCD27D49BC2A081984C39C3EeC427a2d/transactions) |
+| BSC | `0x749F37Df06A99D6A8E065dd065f8cF947ca23697` [↗](https://bscscan.com/address/0x749F37Df06A99D6A8E065dd065f8cF947ca23697) |
+| Canto | `0x8671A0465844a15eb7230C5dd8d6032c26c655B7` [↗](https://evm.explorer.canto.io/address/0x8671A0465844a15eb7230C5dd8d6032c26c655B7) |
+| Cronos | `0x991adb00eF4c4a6D1eA6036811138Db4379377C2` [↗](https://cronoscan.com/address/0x991adb00eF4c4a6D1eA6036811138Db4379377C2) |
+| DFK | `0x75224b0f245Fe51d5bf47A898DbB6720D4150BA7` [↗](https://subnets.avax.network/defi-kingdoms/dfk-chain/explorer/address/0x75224b0f245Fe51d5bf47A898DbB6720D4150BA7) |
+| Dogechain | `0x544450Ffdfa5EA20528F21918E8aAC7B2C733381` [↗](https://explorer.dogechain.dog/address/0x544450Ffdfa5EA20528F21918E8aAC7B2C733381) |
+| Ethereum | `0x6571d6be3d8460CF5F7d6711Cd9961860029D85F` [↗](https://etherscan.io/address/0x6571d6be3d8460CF5F7d6711Cd9961860029D85F) |
+| Fantom | `0xB003e75f7E0B5365e814302192E99b4EE08c0DEd` [↗](https://ftmscan.com/address/0xB003e75f7E0B5365e814302192E99b4EE08c0DEd) |
+| Harmony | `0xB003e75f7E0B5365e814302192E99b4EE08c0DEd` [↗](https://explorer.harmony.one/address/0xb003e75f7e0b5365e814302192e99b4ee08c0ded) |
+| Optimism | `0x470f9522ff620eE45DF86C58E54E6A645fE3b4A7` [↗](https://optimistic.etherscan.io/address/0x470f9522ff620eE45DF86C58E54E6A645fE3b4A7) |
+| Moonbeam | `0x73783F028c60D463bc604cc53852C37C31dEC5e9` [↗](https://moonscan.io/address/0x73783F028c60D463bc604cc53852C37C31dEC5e9) |
+| Moonriver | `0x06Fea8513FF03a0d3f61324da709D4cf06F42A5c` [↗](https://moonriver.moonscan.io/address/0x06Fea8513FF03a0d3f61324da709D4cf06F42A5c) |
+| Polygon | `0x1c6aE197fF4BF7BA96c66C5FD64Cb22450aF9cC8` [↗](https://polygonscan.com/address/0x1c6aE197fF4BF7BA96c66C5FD64Cb22450aF9cC8) |
diff --git a/docs/bridge/docs/05-Contracts/08-MiniChef.md b/docs/bridge/docs/05-Contracts/08-MiniChef.md
new file mode 100644
index 0000000000..9484a68f79
--- /dev/null
+++ b/docs/bridge/docs/05-Contracts/08-MiniChef.md
@@ -0,0 +1,29 @@
+---
+title: MiniChef
+---
+
+:::note This list may be incomplete
+
+The canonical list is hosted within the SynapseCNS on [Github](https://github.com/synapsecns/synapse-contracts).
+
+:::
+
+# MiniChef
+
+| Chain | Address |
+|-----------|----------------------------------------------|
+| Arbitrum | `0x73186f2Cf2493f20836b17b21ae79fc12934E207` [↗](https://arbiscan.io/address/0x73186f2Cf2493f20836b17b21ae79fc12934E207) |
+| Aurora | `0x809DC529f07651bD43A172e8dB6f4a7a0d771036` [↗](https://explorer.mainnet.aurora.dev/address/0x809DC529f07651bD43A172e8dB6f4a7a0d771036/transactions) |
+| Avalanche | `0x3a01521F8E7F012eB37eAAf1cb9490a5d9e18249` [↗](https://snowtrace.io/address/0x3a01521F8E7F012eB37eAAf1cb9490a5d9e18249) |
+| Base | `0xfFC2d603fde1F99ad94026c00B6204Bb9b8c36E9` [↗](https://basescan.org/address/0xfFC2d603fde1F99ad94026c00B6204Bb9b8c36E9) |
+| Blast | `0x3100dC8464A8523306c3C5034de24a8927d6E590` [↗](https://blastscan.io/address/0x3100dC8464A8523306c3C5034de24a8927d6E590) |
+| Boba | `0xd5609cD0e1675331E4Fb1d43207C8d9D83AAb17C` [↗](https://blockexplorer.boba.network/address/0xd5609cD0e1675331E4Fb1d43207C8d9D83AAb17C/transactions) |
+| BSC | `0x8F5BBB2BB8c2Ee94639E55d5F41de9b4839C1280` [↗](https://bscscan.com/address/0x8F5BBB2BB8c2Ee94639E55d5F41de9b4839C1280) |
+| Canto | `0x93124c923dA389Bc0f13840fB822Ce715ca67ED6` [↗](https://canto.dex.guru/address/0x93124c923dA389Bc0f13840fB822Ce715ca67ED6) |
+| Ethereum | `0xd10eF2A513cEE0Db54E959eF16cAc711470B62cF` [↗](https://etherscan.io/address/0xd10eF2A513cEE0Db54E959eF16cAc711470B62cF) |
+| Fantom | `0xaeD5b25BE1c3163c907a471082640450F928DDFE` [↗](https://ftmscan.com/address/0xaed5b25be1c3163c907a471082640450f928ddfe) |
+| Harmony | `0xaeD5b25BE1c3163c907a471082640450F928DDFE` [↗](https://explorer.harmony.one/address/0xaed5b25be1c3163c907a471082640450f928ddfe) |
+| Metis | `0xaB0D8Fc46249DaAcd5cB36c5F0bC4f0DAF34EBf5` [↗](https://andromeda-explorer.metis.io/address/0xaB0D8Fc46249DaAcd5cB36c5F0bC4f0DAF34EBf5) |
+| Moonriver | `0x432036208d2717394d2614d6697c46DF3Ed69540` [↗](https://moonriver.moonscan.io/address/0x432036208d2717394d2614d6697c46DF3Ed69540) |
+| Optimism | `0xe8c610fcb63A4974F02Da52f0B4523937012Aaa0` [↗](https://optimistic.etherscan.io/address/0xe8c610fcb63A4974F02Da52f0B4523937012Aaa0) |
+| Polygon | `0x7875Af1a6878bdA1C129a4e2356A3fD040418Be5` [↗](https://polygonscan.com/address/0x7875Af1a6878bdA1C129a4e2356A3fD040418Be5) |
diff --git a/docs/bridge/docs/Services/Scribe.md b/docs/bridge/docs/06-Services/01-Scribe.md
similarity index 95%
rename from docs/bridge/docs/Services/Scribe.md
rename to docs/bridge/docs/06-Services/01-Scribe.md
index 0b58a1edab..6af5fd2de8 100644
--- a/docs/bridge/docs/Services/Scribe.md
+++ b/docs/bridge/docs/06-Services/01-Scribe.md
@@ -1,8 +1,3 @@
----
-sidebar_position: 0
-sidebar_label: Scribe
----
-
# Scribe
Scribe is a multi-chain indexing service designed to store logs, receipts, and transactions for every event from specified contracts across multiple blockchains. It provides a powerful tool for analytics, event streaming, and monitoring on-chain activities.
@@ -89,7 +84,7 @@ chains:
Key configuration parameters include:
-- `rpc_url`: The omnirpc url to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](Services//Omnirpc.md).
+- `rpc_url`: The omnirpc url to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](Omnirpc).
- `chains`: List of chains to index, including chain-specific parameters:
- `chain_id`: The ID of the chain.
- `get_logs_range`: The number of blocks to request in a single `getLogs` request.
@@ -117,4 +112,4 @@ For a full list of available queries, refer to the GraphQL schema.
## Observability
-Scribe implements open telemetry for both tracing and metrics. Please see the [Observability](../Observability) page for more info.
+Scribe implements open telemetry for both tracing and metrics. Please see the [Observability](Observability) page for more info.
diff --git a/docs/bridge/docs/Services/Omnirpc.md b/docs/bridge/docs/06-Services/02-Omnirpc.md
similarity index 89%
rename from docs/bridge/docs/Services/Omnirpc.md
rename to docs/bridge/docs/06-Services/02-Omnirpc.md
index e719fc0278..f0b804f104 100644
--- a/docs/bridge/docs/Services/Omnirpc.md
+++ b/docs/bridge/docs/06-Services/02-Omnirpc.md
@@ -1,10 +1,12 @@
-Omnirpc is an rpc load balancer and verifier that allows users to query chain data from multiple chains. It is a service that should be run by Quoters and interfaces that allow Solvers to post quotes. Omnirpc takes in a yaml config that allows the user to specify which chains it should run on.
+# OmniRPC
-### Running OmniRPC
+OmniRPC is an RPC load balancer and verifier that allows users to query chain data from multiple chains. It is a service that should be run by Quoters and interfaces that allow Solvers to post quotes. OmniRPC takes in a yaml config that allows the user to specify which chains it should run on.
+
+## Running OmniRPC
### Building From Source
-To build omnirpc from source, you will need to have Go installed. You can install Go by following the instructions [here](https://golang.org/doc/install). Once you have Go installed, you can build the relayer by running the following commands:
+To build OmniRPC from source, you will need to have Go installed. You can install Go by following the instructions [here](https://golang.org/doc/install). Once you have Go installed, you can build the relayer by running the following commands:
1. `git clone https://github.com/synapsecns/sanguine --recursive`
2. `cd sanguine/services/omnirpc`
@@ -18,11 +20,11 @@ The relayer can also be run with docker. To do this, you will need to pull the [
docker run ghcr.io/synapsecns/sanguine/omnirpc:latest --config /path/to/config
```
-There is also a helm chart available for omnirpc [here](https://artifacthub.io/packages/helm/synapse/omnirpc).
+There is also a helm chart available for OmniRPC [here](https://artifacthub.io/packages/helm/synapse/omnirpc).
### Configuration
-Omnirpc is configured with a yaml file. The following is an example configuration:
+OmniRPC is configured with a yaml file. The following is an example configuration:
```yaml
chains:
diff --git a/docs/bridge/docs/Services/Signer.md b/docs/bridge/docs/06-Services/03-Signer.md
similarity index 100%
rename from docs/bridge/docs/Services/Signer.md
rename to docs/bridge/docs/06-Services/03-Signer.md
diff --git a/docs/bridge/docs/Services/Submitter.md b/docs/bridge/docs/06-Services/04-Submitter.md
similarity index 98%
rename from docs/bridge/docs/Services/Submitter.md
rename to docs/bridge/docs/06-Services/04-Submitter.md
index 379145a999..afa6435d42 100644
--- a/docs/bridge/docs/Services/Submitter.md
+++ b/docs/bridge/docs/06-Services/04-Submitter.md
@@ -1,6 +1,8 @@
-# Submitter
+:::note In-progress
-This section is still in progress, please see [here](https://pkg.go.dev/github.com/synapsecns/sanguine/ethergo/submitter#section-readme) for details.
+Please see the [Go Submitter documentation page](https://pkg.go.dev/github.com/synapsecns/sanguine/ethergo/submitter#section-readme) for more details.
+
+:::
# Ethergo Submitter
diff --git a/docs/bridge/docs/Observability.md b/docs/bridge/docs/06-Services/05-Observability.md
similarity index 99%
rename from docs/bridge/docs/Observability.md
rename to docs/bridge/docs/06-Services/05-Observability.md
index 3a9fb2fadd..69466e087f 100644
--- a/docs/bridge/docs/Observability.md
+++ b/docs/bridge/docs/06-Services/05-Observability.md
@@ -1,3 +1,5 @@
+# Observability
+
All off-chain systems are by default observable and configured through the [metrics](https://pkg.go.dev/github.com/synapsecns/sanguine/core/metrics#section-readme) package. The observability stack is built around [open telemetry](https://opentelemetry.io/) with metrics also being exported using this standard.
"Metrics" themselves are divided into 3 different types of metrics:
diff --git a/docs/bridge/docs/Services/img/signer/aws/create-acces-key.png b/docs/bridge/docs/06-Services/img/signer/aws/create-acces-key.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/create-acces-key.png
rename to docs/bridge/docs/06-Services/img/signer/aws/create-acces-key.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/create-access-key.png b/docs/bridge/docs/06-Services/img/signer/aws/create-access-key.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/create-access-key.png
rename to docs/bridge/docs/06-Services/img/signer/aws/create-access-key.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/iam-dash.png b/docs/bridge/docs/06-Services/img/signer/aws/iam-dash.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/iam-dash.png
rename to docs/bridge/docs/06-Services/img/signer/aws/iam-dash.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/iam-preview-user.png b/docs/bridge/docs/06-Services/img/signer/aws/iam-preview-user.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/iam-preview-user.png
rename to docs/bridge/docs/06-Services/img/signer/aws/iam-preview-user.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/key-details.png b/docs/bridge/docs/06-Services/img/signer/aws/key-details.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/key-details.png
rename to docs/bridge/docs/06-Services/img/signer/aws/key-details.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-1.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-1.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-1.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-1.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-2.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-2.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-2.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-2.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-advanced.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-advanced.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-advanced.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-advanced.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-labels.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-labels.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-labels.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-labels.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-permissons.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-permissons.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-permissons.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-permissons.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-user-permissions.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-user-permissions.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-user-permissions.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-user-permissions.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/kms-user.png b/docs/bridge/docs/06-Services/img/signer/aws/kms-user.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/kms-user.png
rename to docs/bridge/docs/06-Services/img/signer/aws/kms-user.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/perms.png b/docs/bridge/docs/06-Services/img/signer/aws/perms.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/perms.png
rename to docs/bridge/docs/06-Services/img/signer/aws/perms.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/review.png b/docs/bridge/docs/06-Services/img/signer/aws/review.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/review.png
rename to docs/bridge/docs/06-Services/img/signer/aws/review.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/user-list.png b/docs/bridge/docs/06-Services/img/signer/aws/user-list.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/user-list.png
rename to docs/bridge/docs/06-Services/img/signer/aws/user-list.png
diff --git a/docs/bridge/docs/Services/img/signer/aws/user-perms.png b/docs/bridge/docs/06-Services/img/signer/aws/user-perms.png
similarity index 100%
rename from docs/bridge/docs/Services/img/signer/aws/user-perms.png
rename to docs/bridge/docs/06-Services/img/signer/aws/user-perms.png
diff --git a/docs/bridge/docs/Services/img/submitter/metrics.png b/docs/bridge/docs/06-Services/img/submitter/metrics.png
similarity index 100%
rename from docs/bridge/docs/Services/img/submitter/metrics.png
rename to docs/bridge/docs/06-Services/img/submitter/metrics.png
diff --git a/docs/bridge/docs/07-Support/Transaction-Support.md b/docs/bridge/docs/07-Support/Transaction-Support.md
new file mode 100644
index 0000000000..5ebf4ccbb9
--- /dev/null
+++ b/docs/bridge/docs/07-Support/Transaction-Support.md
@@ -0,0 +1,51 @@
+# Transaction Support FAQ
+
+## What does a Bridge transaction look like?
+
+After submitting and signing a transaction from your wallet, gas fees are collected, and the transaction is sent to the origin chain router. Once accepted, the bridged asset is removed from your portfolio, and a progress bar shows the estimated confirmation time.
+
+Once confirmed on the destination chain, the asset is added to your portfolio, and destination hash is available from the progress menu dropdown. The transaction appears as part of your history in the Activity tab once it is index by the Synapse Explorer.
+
+Gas token airdrops and rebates are delivered to your wallet automatically. However, only bridgeable assets are shown in your Synapse portfolio.
+
+## Did my transaction initiate?
+
+Transactions that do not initiate on the origin chain return an error message. Your assets will remain in your portfolio, under your control.
+
+In the event that your transaction does not initiate, double check that you have sufficient funds to send, and to cover gas fees, and you can safely try again.
+
+## My transaction failed to initiate after several tries
+
+Occasionally, technical issues or a high volume of activity on the origin chain may prevent new transactions from being accepted.
+
+In most cases, these issues safely resolve within 30-60 minutes. Activity levels can be found on native block explorers (e.g the [Etherscan gas tracker](https://etherscan.io/gastracker)).
+
+You can also adjust your wallet’s gas settings to make transactions more likely to be accepted during times of peak activity.
+
+## Why is my transaction taking so long?
+Synapse time estimates are based on destination block times. Occasionally, a transaction may post to a later block than expected.
+
+Block explorer links in the progress dropdown menu can confirm whether a confirmation on-chain but not yet received by Synapse.
+
+## My transaction failed to complete
+
+Transactions that fail to complete are not lost, and are manually addressed by the Synapse support team. You can reach Support via the [Synapse Discord channel](https://discord.com/invite/synapseprotocol) at any time.
+
+:::note For DeFi Kingdoms
+
+NFT transactions can take twice as long as tokens. Contact Support if your transaction has been pending for two hours or more.
+
+:::
+
+## I received a different asset than expected
+In the event of an sudden increase in slippage, Synapse will deliver the intermediate asset sent to the destination chain instead of swapping it for an unexpected loss.
+
+This asset appears in your portfolio and can be safely [swapped](https://synapseprotocol.com/swap) for the asset of your choice on the destination chain.
+
+## Did I receive my rebate or gas airdrop?
+While rebates and airdrops appear in your wallet automatically, only bridgeable assets are shown in your Synapse portfolio.
+
+If you don’t see an asset you should have received, first check your wallet while connected to the destination chain for your bridge transaction.
+
+## Help!
+Don’t panic! Contact Synapse Support on Discord to answer any other questions you might have.
diff --git a/docs/bridge/docs/07-Support/index.md b/docs/bridge/docs/07-Support/index.md
new file mode 100644
index 0000000000..12ad2e4940
--- /dev/null
+++ b/docs/bridge/docs/07-Support/index.md
@@ -0,0 +1,12 @@
+# Support
+
+Connect with other developers and the Synapse team
+
+* **[Discord](https://discord.gg/synapseprotocol)**
+* **[Twitter](https://twitter.com/SynapseProtocol)**
+* **[Telegram](https://t.me/synapseprotocol)**
+* **[Forum](https://forum.synapseprotocol.com/)**
+
+## Frequently Asked Questions
+
+* [Transaction Support FAQ](Transaction-Support)
diff --git a/docs/bridge/docs/CCTP/Contracts.md b/docs/bridge/docs/CCTP/Contracts.md
deleted file mode 100644
index 5707af69a6..0000000000
--- a/docs/bridge/docs/CCTP/Contracts.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# Contracts
-
-Synapse CCTP contracts deployed on several chains and are documented inline. Synapse CCTP routes tokens through the CCTP module and [SynapseCCTP](https://github.com/synapsecns/synapse-contracts/blob/master/contracts/cctp/SynapseCCTP.sol) interacts with the Circle contracts to mint/burn USDC. These contracts sit on top of the Circle CCTP contracts and are responsible for minting and burning USDC on supported chains.
-
-### Synapse CCTP
-
-| Chain | Address |
-| --------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| Arbitrum | [0x12715a66773bd9c54534a01abf01d05f6b4bd35e](https://arbiscan.io/address/0x12715a66773bd9c54534a01abf01d05f6b4bd35e) |
-| Avalanche | [0x12715a66773bd9c54534a01abf01d05f6b4bd35e](https://snowtrace.io/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
-| Base | [0x12715a66773bd9c54534a01abf01d05f6b4bd35e](https://basescan.org/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
-| Ethereum | [0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E](https://etherscan.io/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
-| Optimism | [0x12715a66773bd9c54534a01abf01d05f6b4bd35e](https://optimistic.etherscan.io/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
-| Polygon | [0x12715a66773bd9c54534a01abf01d05f6b4bd35e](https://polygonscan.com/address/0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E) |
-
-## Circle Contracts
-
-Please refer to [this page](https://developers.circle.com/stablecoins/docs/evm-smart-contracts) for Circle contract addresses.
diff --git a/docs/bridge/docs/CCTP/Overview.md b/docs/bridge/docs/CCTP/Overview.md
deleted file mode 100644
index cc6f4b1fc8..0000000000
--- a/docs/bridge/docs/CCTP/Overview.md
+++ /dev/null
@@ -1,8 +0,0 @@
-Synapse CCTP is a custom module built on top of Circle's [Cross-Chain Transfer Protocol](https://www.circle.com/en/cross-chain-transfer-protocol) that allows for bridge requests to natively mint & burn USDC on [supported chains](https://developers.circle.com/stablecoins/docs/cctp-getting-started#supported-blockchains).
-
-Synapse's CCTP implementation consists of two main components:
-
-- [CCTP Relayer](./Relayer.md): An off-chain service that fulfills transactions requested through the CCTP contracts. The relayer is responsible for fetching attestations from the [Circle API](https://developers.circle.com/stablecoin/reference) and submitting them to the CCTP contracts. Anyone can run a relayer.
-- [CCTP Contracts](./Contracts.md): A set of smart contracts that allow for the minting and burning of USDC on supported chains, and instant swaps to/from any supported asset. These contracts are deployed on each supported chain and are responsible for minting and burning USDC.
-
-As a modular component of Synapse's router system, CCTP can be configured to bridge through any supported liquidity source, such as [Curve](https://github.com/synapsecns/synapse-contracts/blob/885cbe06a960591b1bdef330f3d3d57c49dba8e2/contracts/router/modules/pool/curve/CurveV1Module.sol), [Algebra](https://github.com/synapsecns/synapse-contracts/blob/885cbe06a960591b1bdef330f3d3d57c49dba8e2/contracts/router/modules/pool/algebra/AlgebraModule.sol), [DAI PSM](https://github.com/synapsecns/synapse-contracts/blob/885cbe06a960591b1bdef330f3d3d57c49dba8e2/contracts/router/modules/pool/dss/DssPsmModule.sol), and others.
diff --git a/docs/bridge/docs/CCTP/Relayer.md b/docs/bridge/docs/CCTP/Relayer.md
deleted file mode 100644
index 35a309cbfc..0000000000
--- a/docs/bridge/docs/CCTP/Relayer.md
+++ /dev/null
@@ -1,107 +0,0 @@
-# CCTP Relayer
-
-The CCTP relayer is an off-chain service aimed at fulfilling transactions requested through the [CCTP Contracts](./Contracts.md). The relayer is responsible for fetching attestations from the [Circle API](https://developers.circle.com/stablecoin/reference) and submitting them to the CCTP contracts. Anyone can run a relayer.
-
-### Architecture
-
-The relayer is a Golang application that polls for events on chain and uses a combo state (db status) and event (on-chain logs) driven [architecture](https://medium.com/@matt.denobrega/state-vs-event-based-web-architectures-59ab1f47656b) to process transactions. The relayer is designed to be run by anyone and be easily observable.
-
-At a high level, the relayer works like this:
-
-1. Poll for new transactions from the CCTP contracts and add them to the database as [Pending](https://pkg.go.dev/github.com/synapsecns/sanguine/services/cctp-relayer@v0.10.0/types#MessageState)
-2. Fetch the attestation from the Circle API. Once successful add attestation to the database and update status to be [Attested](https://pkg.go.dev/github.com/synapsecns/sanguine/services/cctp-relayer@v0.10.0/types#MessageState)
-3. Submit the attestation to the CCTP contracts. Once the transaction has been added to [Submitter](../Services/Submitter#Observability), mark as [Submitted](https://pkg.go.dev/github.com/synapsecns/sanguine/services/cctp-relayer@v0.10.0/types#MessageState)
-4. Poll for the transaction receipt and mark as [Confirmed](https://pkg.go.dev/github.com/synapsecns/sanguine/services/cctp-relayer@v0.10.0/types#MessageState)
-
-### Modes
-
-As specified by the [cctp_type](#Configuration), the CCTP relayer can be run in one of two modes. In [Synapse mode](https://pkg.go.dev/github.com/synapsecns/sanguine/services/cctp-relayer@v0.10.0/types#MessageType), the [Synapse CCTP](./Contracts.md)contracts are listened to and events relayed through there (including metadata). In [Circle Mode](https://pkg.go.dev/github.com/synapsecns/sanguine/services/cctp-relayer@v0.10.0/types#MessageType), raw [TokenMessenger](https://github.com/circlefin/evm-cctp-contracts/blob/817397db0a12963accc08ff86065491577bbc0e5/src/TokenMessenger.sol) events are relayed. This mode can only be used for USDC to USDC bridges and is not commonly used.
-
-## Running the Relayer
-
-### Building From Source
-
-To build the CCTP Relayer from source, you will need to clone the repository and run the main.go file with the config file. Building from source requires go 1.21 or higher and is generally not recommended for end-users.
-
-1. `git clone https://github.com/synapsecns/sanguine --recursive`
-2. `cd sanguine/services/cctp-relayer`
-3. `go run main.go --config /path/to/config.yaml`
-
-### Running the Docker Image
-
-The CCTP Relayer can also be run with docker. To do this, you will need to pull the [docker image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Fcctp-relayer) and run it with the config file:
-
-```bash
-docker run ghcr.io/synapsecns/sanguine/cctp-relayer:latest --config /path/to/config
-```
-
-There is also a helm chart available for the CCTP Relayer [here](https://artifacthub.io/packages/helm/synapse/cctp/0.2.0), but it is recommended you create your own.
-
-### Configuration
-
-The CCTP Relayer is configured with a yaml file. The following is an example configuration:
-
-
- example config
-```yaml
- cctp_type: "synapse"
- # prod contract addresses
- chains:
- - chain_id: 1
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- - chain_id: 43114
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- - chain_id: 42161
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- - chain_id: 10
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- - chain_id: 8453
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- - chain_id: 137
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- base_omnirpc_url: "http://omnrpc-url/"
- unbonded_signer:
- type: "AWS"
- # should be a mounted secret
- file: "/config/aws.txt"
- http_backoff_initial_interval_ms: 1000
- http_backoff_max_elapsed_time_ms: 300000
- # submitter config for cctp
- submitter_config:
- chains:
- 1:
- supports_eip_1559: true
- gas_estimate: 1000000
- 42161:
- gas_estimate: 30000000
- max_gas_price: 10000000000
- supports_eip_1559: true
- 43114:
- gas_estimate: 5000000
- max_gas_price: 1000000000000
- supports_eip_1559: true
- 10:
- gas_estimate: 5000000
- max_gas_price: 2000000000
- supports_eip_1559: true
- 8453:
- gas_estimate: 5000000
- 137:
- gas_estimate: 5000000
- max_gas_price: 10000000000000
- supports_eip_1559: true
-```
-
-
- - `cctp_type`: The type of CCTP to listen to. Can be either `synapse` or `circle`.
- - `chains`: A list of chain ids and their corresponding CCTP contract addresses. If synapse mode, this should be `synapse_cctp_address` and if circle mode, this should be `token_messenger_address`. Both modes cannot be used at once and the other will be ignored if both are set.
- - `base_omnirpc_url`: The base URL for the OmniRPC service.
- - `unbonded_signer`: The signer to use for transactions. Can be either `AWS`, `File` or `GCP`. The file should be a mounted secret. More details can be found [here](../Services/Signer).
- - `port`: The port to run the relayer on (e.g. 8080)
- - `host`: The host to run the relayer on (e.g. localhost). Note: this should not be publicly exposed
- - `http_backoff_initial_interval_ms`: The initial interval for the backoff in milliseconds.
- - `retry_interval_ms`: The interval to wait between attestation request retries in milliseconds. The [CCTP API Rate Limit](https://developers.circle.com/stablecoins/docs/limits) should be kept in mind.
-
-### Observability
-
-The CCTP relayer implements open telemetry for both tracing and metrics. Please see the [Observability](../Observability) page for more info. We'd also highly recommend setting up the [submitter dashboard](../Services/Submitter) as well.
diff --git a/docs/bridge/docs/CCTP/_category_.json b/docs/bridge/docs/CCTP/_category_.json
deleted file mode 100644
index eda3422018..0000000000
--- a/docs/bridge/docs/CCTP/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "label": "CCTP",
- "position": 3,
- "link": {
- "type": "doc",
- "id": "CCTP/Overview"
- }
-}
diff --git a/docs/bridge/docs/rfq/API/sidebar.ts b/docs/bridge/docs/rfq/API/sidebar.ts
deleted file mode 100644
index 3c0e12fc63..0000000000
--- a/docs/bridge/docs/rfq/API/sidebar.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";
-
-const sidebar: SidebarsConfig = {
- apisidebar: [
- {
- type: "category",
- label: "quotes",
- items: [
- {
- type: "doc",
- id: "rfq/API/get-quotes",
- label: "Get quotes",
- className: "api-method get",
- },
- {
- type: "doc",
- id: "rfq/API/upsert-quote",
- label: "Upsert quote",
- className: "api-method put",
- },
- ],
- },
- ],
-};
-
-export default sidebar.apisidebar;
diff --git a/docs/bridge/docs/rfq/Contracts.md b/docs/bridge/docs/rfq/Contracts.md
deleted file mode 100644
index a5b0947942..0000000000
--- a/docs/bridge/docs/rfq/Contracts.md
+++ /dev/null
@@ -1,51 +0,0 @@
-### Synapse RFQ
-
-The Synapse RFQ contract source code can be found [here](https://github.com/synapsecns/sanguine/tree/master/packages/contracts-rfq) along with generated documentation [here](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html)
-
-| Chain | Address |
-| -------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| Arbitrum | [0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E](https://arbiscan.io/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
-| Base | [0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E](https://basescan.org/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
-| Ethereum | [0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E](https://etherscan.io/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
-| Optimism | [0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E](https://optimistic.etherscan.io/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
-| Scroll | [0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E](https://scrollscan.com/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
-| Linea | [0x34F52752975222d5994C206cE08C1d5B329f24dD](https://lineascan.build/address/0x34F52752975222d5994C206cE08C1d5B329f24dD) |
-| BNB Chain| [0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E](https://bscscan.com/address/0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E) |
-| Blast | [0x34F52752975222d5994C206cE08C1d5B329f24dD](https://blastscan.io/address/0x34F52752975222d5994C206cE08C1d5B329f24dD) |
-
-### On-Chain Architecture & Transaction Flow
-
-The RFQ contract allows users to post bridge requests based on quotes they have received from the solvers. At a high level, the contract works as follows:
-
-1. **User calls bridge**: The user calls the bridge contract with the quote they have received from the RFQ API and passing in origin, destination and other paramaters as a [BridgeParam](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgeparams).
-2. **Bridge emits event**: The bridge contract emits a [`BridgeRequested`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested) event.
-3. **Solver relays request**: The solver relays the request by calling the [`relay`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#relay) function on the RFQ contract. The contract then pulls the tokens from the solvers wallet (or [msg.value](https://ethereum.stackexchange.com/questions/43362/what-is-msg-value) in the case of eth) and sends them to the user filling their order.
-4. **Solver Calls Prove**: The solver then calls the [`prove`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove) function on the RFQ contract to prove they have filled the order. In the current implementation, the function must be called from the solver address.
-5. **User Claims**: If the solver does not call prove within the optimistic window, the user can call the [`claim`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#claim) function to claim their funds back.
-
-### On-Chain Statuses
-
-Like the relayer, each transaction in the RFQ contract has a status. The statuses are as follows:
-
-| Status | Int | Meaning |
-|-----------------|-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Null | 0 | Bridge transaction doesn't exist yet on the origin chain. |
-| Requested | 1 | A bridge has been requested, but the [`prove`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove) has not yet been called |
-| Relayer Proved | 2 | The relayer has tried to [`prove`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove) the transaction, but cannot claim yet. |
-| Relayer Claimed | 3 | The relayer has called [`claim`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#claim) and gotten the funds. |
-| Refunded | 4 | The relayer has not called `claim` within the optimistic period or a dispute has been decided in favor of the user and the users been refunded. |
-
-
-### Dispute Period and Guards
-
-The RFQ system includes a dispute period and guards to ensure the integrity of bridge transactions. Here's how it works:
-
-After a relayer submits a proof for a bridge transaction, there's a set period during which the transaction can be disputed. This period allows for detection and correction of any errors or fraudulent activities. Guards are responsible for monitoring bridge transactions and initiating disputes if they detect issues such as incorrect fill amounts and proofs submitted by the wrong relayer. A successful dispute would end up with the relayer losing their claimable funds.
-
-The current implementation is architectured to enforce honest behavior and also protect honest relayers in cases of blockchain reorgs.
-
-### Other Functionalities
-
-**ChainGas**
-
-`sendChainGas` is a field that is populated by the bridge user, and it's a simple bool flag. If `sendChainGas=true` the amount is specified in the FastBridge contract on the destination chain as `chainGasAmount`. This is currently set to zero in all the contracts, and can thus be ignored by filling orders with either no `sendChainGas` option (or to chains with `chainGasAmount==0`)
diff --git a/docs/bridge/docs/rfq/RFQ.md b/docs/bridge/docs/rfq/RFQ.md
deleted file mode 100644
index d2d9aaf7bd..0000000000
--- a/docs/bridge/docs/rfq/RFQ.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# RFQ
-
-RFQ is a bridge module supported by the Synapse Router that allows different market makers to post quotes on different bridge routes. Users can take these quotes by submitting an on-chain bridge request. In the event these requests are not fulfilled, users can request a refund after a set period of time.
-
-### Actors
-
-With the exception of the smart contract itself, RFQ is agnostic to how users receive quotes and where Solvers choose to post quotes. Below, we explain who the general actors interacting with the contract are and then explain the canonical RFQ implementation.
-
-- **Solvers -** Solvers (also known as fillers) are market makers that provide liquidity & post quotes to the API. They are then in charge of fulfilling requests on-chain.
-- **Users** - End users observe quotes from solvers and post requests on chain. In the event these requests cannot be fulfilled, the user can reclaim their funds after the optimistic window has passed.
-- **Quoter -** The quoter runs a service ran by different interfaces to the Synapse Bridge that allows market makers to post quotes and users to read them. The spec of RFQ does not require this to be an “API” in the traditional sense. Interfaces can use protocols like libp2p, irc and dht’s to communicate quotes.
-
-Right now, RFQ consists of three-different components, with each of the two off-chain components being ran by different actors:
-
-- **[API](./API) -** The RFQ api is an off-chain service ran by Quoters. user-interfaces that allows market makers/solvers to post quotes on different bridge routes. Solvers that have registered with the FastBridge contract can sign messages that post quotes signifying at what price they are willing to bridge tokens on a certain route.
-
- In the canonical implementation, users Solvers authenticated by signing requests with their private key in accordance with [EIP-191](https://eips.ethereum.org/EIPS/eip-191). The canonical implementation can be found [here](https://github.com/synapsecns/sanguine/tree/master/services/rfq).
-- **Fast Bridge Contract -** The fast bridge contract is the core of the RFQ protocol and what allows solvers to fulfill requests from users. A user deposits their funds into the FastBridge contract along with the lowest price they are willing to accept for a given route (a price they get by reading quotes from the Quoter).
-
- In the unlikely event no Solver is available to fulfill a users request, a user can permissionlessly claim their funds back after waiting an optimistic period.
-
- Contract code level documentation can be found [here](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html).
-- **Relayer** - The relayer is a service ran by the solvers. The relayer is responsible for posting quotes & fulfilling requests. While the relayer can be implemented in any way, the canonical implementation is a golang based relayer that provides a way to decide what chains/routes to quote on, how much to quote and which addresses not to relay for.
-
diff --git a/docs/bridge/docs/rfq/Relayer/Relayer.md b/docs/bridge/docs/rfq/Relayer/Relayer.md
deleted file mode 100644
index b47e066ea6..0000000000
--- a/docs/bridge/docs/rfq/Relayer/Relayer.md
+++ /dev/null
@@ -1,282 +0,0 @@
----
-sidebar_position: 0
-sidebar_label: Relayer
----
-:::note
-
-Relayers must be whitelisted in order to fill bridgeRequests.
-
-:::
-
-At a high level, the canonical implementation of the relayer has 3 different responsibilities.
-
-- **Quoting** - Keep track of balances on each chain as well as in-flight funds and continuously post-quotes with these balances using the config to adjust quotes to the solvers specifications and posting to the API.
-- **Relaying -** Fulfill users [BridgeRequests](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested) by relaying their funds on-chain. Once eligible, claim the users funds on the origin chain.
-- **Rebalancing -** In order to handle the complexity of user flows, the Relayer provides an interface that allows funds to be rebalanced. This allows RFQ to be reflexive to cases where flows are mono-directional.
-
-## Architecture
-
-The relayer is a Golang application that polls for events on chain and uses a combo state (db status) and event (on-chain logs) driven architecture to process transactions. The relayer has 3 different event loops going at any given time, specified above and elaborated on below:
-
-### Quoting
-The quoting loop is comparitively simple and updates the api on each route it supports. Quotes are posted using the following formula:
-
- - **Do not quote above available balance**: Available balance is determined by `balance on chain - in-flight funds`. If the token is the gas token, then the minimum gas token amount is subtracted. The relayer will also not post quotes below the `min_quote_amount` specified in the config.
- - **Quote offset**: The quote offset is a percentage of the price of the token. This is used to ensure that the relayer is profitable. The quote offset is added to the price of the token to determine the quote price.
- - **Fee**: The fee is determined by the `fixed_fee_multiplier` in the config. This is multiplied by the `origin_gas_estimate` and `destination_gas_estimate` to determine the fee. This fee is added to the quote price.
-
-### Rebalancing
-
-Automated rebalancing is configurable by token and currently supports CCTP routes as well as native bridging in the case of Scroll. Rebalancing evaluation follows this logic on every `rebalance_interval`:
-
-- For every supported rebalance method, compute the 'total balance' of each token as the sum of all balances across chains that support the given rebalance method.
-- For every supported token, compute the 'maintenance threshold' as the product of the `maintenance_balance_pct` and the 'total balance'. A token is eligible for rebalancing if the current balance is below the 'maintenance threshold'.
-
-To limit the amount of inventory that is inflight, only one rebalance can be pending at a time for each token. As such, we select the 'best' rebalance candidate as the rebalance with the largest delta between origin balance and destination balance.
-
-The final step in evaluating a rebalance is determining the rebalance amount:
-
-- Arrive at an initial rebalance amount by computing the delta between current balance and the initial threshold on origin.
-- Check if this rebalance amount is too much, i.e. it would take the destination balance above its initial threshold. If so, clip the rebalance amount to target the destination initial threshold.
-- Filter the rebalance amount by the configured min and max.
-
-An example of this process is given below:
-
-We are dealing with chains 1, 2, and 3. Chains 1 and 2 support USDC with CCTP, and chain 3 supports USDC but does not support CCTP. Each chain has a `maintenance_pct` of 20%, while chains 1 and 2 have `initial_pct` of 40% and chain 3 has 20%. Assume chain 1 has a balance of 100 USDC, chain 2 has 900 USDC, and chain 3 has 2000 USDC.
-
-The system would trigger a rebalance from chain 2 to chain 1, since the total balance of CCTP-supported chains is 1000 USDC, and chain 1 is below the 20% maintenance threshold. Chain 3 is not considered for rebalance since it does not support CCTP.
-
-The rebalance amount would be initially be targeted as 600 since this would take chain 2 to its 40% initial threshold. However, since chain 1 only needs 300 to reach its initial 40% threshold, the rebalance amount is clipped at 300.
-
-So, the final result is a rebalance of 300 USDC from chain 2 to chain 1, leading to chain 1 having 400 USDC, chain 2 having 600 USDC, and chain 3 having 2000 USDC.
-
-
-1. At `rebalance_interval`, check the `maintenance_balance_pct` of each token on each chain and compare it to the current balance. If the balance is below the `maintenance_balance_pct`, continue
-2. Calculate the amount to rebalance by taking the difference between the maintenance balance and the current balance and multiplying it by the `initial_balance_pct`.
-3. If the amount to rebalance is greater than the `max_rebalance_amount`, set the amount to rebalance to the `max_rebalance_amount`. If the amount to rebalance is less than the `min_rebalance_amount`, do not rebalance.
-4. Repeat after `rebalance_interval`
-
-The implementation for certain native bridges (e.g Scroll) is also supported. It works slightly differently as flows are only supported between Scroll and Mainnet. At a high level, the rebalancer checks inventory on Scroll versus other chains, and if imbalanced, initiates a bridge to mainnet, allowing the CCTP relayer to rebalance funds where needed.
-
-
-### Relaying
-
-The relaying loop is the most complex and is responsible for relaying funds on-chain. The relayer listens to events on-chain and status updates in the database to take move transactions through the states. The states are as follows:
-
-1. An on-chain transaction emits the event [`BridgeRequested`](https://vercel-rfq-docs.vercel.app/contracts/interfaces/IFastBridge.sol/interface.IFastBridge.html#bridgerequested). We store this event in the db with the status [`Seen`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#Seen).
-1. Check if the request is valid, If not, it is marked as [`WillNotProcess`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#WillNotProcess)
-1. Check if there's enough inventory, if not mark as [`NotEnoughInventory`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#NotEnoughInventory) and try again later.
-1. If these checks pass, it's stored as [`CommittedPending`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#CommittedPending). This will automatically reduce the next quote amount posted to the api since the relayers liquidity has been committed.
-1. Check the chain to see if transaction is finalized yet, if not wait until it is.
-1. Once the transaction is finalized on chain, update the status to [`CommitedConfirmed`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#CommitedConfirmed). This means the transaction is finalized on chain and we can now relay it to the destination chain.
-1. Call [`relay`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#relay) on the contract to relay the transaction and update the status to [`RelayPending`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#RelayPending)
-1. Listen for the relay in the logs. Once we get it we mark the transaction as [`RelayComplete`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#RelayComplete)
-1. Call [`Prove()`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#prove) on the contract to prove that we relayed the transaction. Once this is done, we mark the transaction as [`ProvePosting`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#ProvePosting)
-1. Wait for the dispute period to expire. Once it does call [`claim`](https://vercel-rfq-docs.vercel.app/contracts/FastBridge.sol/contract.FastBridge.html#claim) mark the transaction as [`ClaimPending`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#ClaimPending)
-1. Wait for the dispute period to expire. Once it does mark the transaction as [`ClaimComplete`](https://pkg.go.dev/github.com/synapsecns/sanguine/services/rfq/relayer/reldb#ClaimComplete)
-
-## Running a Relayer
-
-### Building From Source
-
-To build the relayer from source, you will need to have Go installed. You can install Go by following the instructions [here](https://golang.org/doc/install). Once you have Go installed, you can build the relayer by running the following commands:
-
-1. `git clone https://github.com/synapsecns/sanguine --recursive`
-2. `cd sanguine/services/rfq/relayer`
-3. `go run main.go --config /path/to/config.yaml`
-
-### Running the Docker Image
-
-The relayer can also be run with docker. To do this, you will need to pull the [docker image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Frfq-relayer) and run it with the config file:
-
-```bash
-docker run ghcr.io/synapsecns/sanguine/rfq-relayer:latest --config /path/to/config
-```
-
-### Withdrawals
-
-The `POST /withdraw` endpoint is exposed to allow for withdrawing from the relayer wallet without having to deal with the private key directly. This can be used for manual rebalancing, if desired. To use this feature, the following config values must be set:
-
-```yaml
-enable_api_withdrawals: true
-withdrawal_whitelist:
- -
-```
-
-The relayer CLI (at `services/rfq/relayer/main.go`) exposes a withdrawal command for convenience:
-
-```bash
-go run main.go withdraw --relayer-url https://localhost:8081 --chain-id 1 --amount 1000000000000000000 --token-address 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE --to 0x0000000000000000000000000000000000000000
-```
-
-Be sure to sub in your respective `to` address!
-
-### Configuration
-
-The relayer is configured with a yaml file. The following is an example configuration:
-
-
- example config
- ```yaml
- submitter_config: # please see the more detailed submitter documentation
- chains:
- 1:
- supports_eip_1559: true
- gas_estimate: 1000000
- database:
- type: sqlite # can be other mysql or sqlite
- dsn: /tmp/db # should be the dsn of your database. If using sqlite, this can be a path
-
- signer: # please see more detailed signer config #can be text, gcp, or aws
- type: GCP
- file: /config/signer.txt
-
- screener_api_url: 'http://screener-url' # can be left blank
- rfq_url: 'http://rfq-api' # url of the rfq api backend.
- omnirpc_url: 'http://omnirpc' # url of the omnirpc instance, please reference the Omnirpc section under Services for proper configuration
- rebalance_interval: 2m # how often to rebalance
- relayer_api_port: '8081' # api port for the relayer api
- volume_limit: 10000 # USD price cap for a bridge under block confirmation minimum (configurable under `chains`)
-
- base_chain_config: # this is hte base chain config, other chains override it
- confirmations: 0
- # Claim (72.5k) + Prove (57.5k) gas limits, rounded up
- origin_gas_estimate: 130_000
- # Relay gas limit, rounded up
- dest_gas_estimate: 110_000
- quote_offset_bps: 2
- native_token: ETH
- quote_pct: 90
- min_gas_token: 1000000000000000000
- fixed_fee_multiplier: 1.25
-
- chains:
- 1:
- rfq_address: "0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E" # rfq contract address on eth
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E" # ccctp contract address on eth
- token_messenger_address: "0xbd3fa81b58ba92a82136038b25adec7066af3155" # token messenger address on eth, note: only one of token_messenger_address or synapse_cctp_address actually needs to be present
- cctp_start_block: 19341000
- confirmations: 2
- tokens:
- USDC:
- address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
- decimals: 6
- price_usd: 1.0
- min_quote_amount: 10000
- rebalance_method: "circlecctp"
- maintenance_balance_pct: 20
- initial_balance_pct: 50
- max_rebalance_amount: 500000
- ETH:
- address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
- decimals: 18
- price_usd: 2600
- 10:
- rfq_address: "0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E"
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- token_messenger_address: "0x2B4069517957735bE00ceE0fadAE88a26365528f"
- cctp_start_block: 116855000
- l1_fee_chain_id: 1
- # Prove + Claim L1 gas estimate
- l1_fee_origin_gas_estimate: 20
- # Relay L1 gas estimate
- l1_fee_dest_gas_estimate: 10
- tokens:
- USDC:
- address: "0x0b2c639c533813f4aa9d7837caf62653d097ff85"
- decimals: 6
- price_usd: 1.0
- min_quote_amount: 10000
- rebalance_method: "circlecctp"
- maintenance_balance_pct: 20
- initial_balance_pct: 50
- max_rebalance_amount: 500000
- ETH:
- address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
- decimals: 18
- price_usd: 2600
-
- quotable_tokens:
- 10-0x0b2c639c533813f4aa9d7837caf62653d097ff85:
- - "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
- 1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48:
- - "10-0x0b2c639c533813f4aa9d7837caf62653d097ff85"
- 1-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
- - "10-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
- 10-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
- - "1-0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
-
- fee_pricer:
- gas_price_cache_ttl: 60
- token_price_cache_ttl: 60
-
- cctp_relayer_config:
- cctp_type: "circle"
- circle_api_url: "https://iris-api.circle.com/v1/attestations"
- chains:
- - chain_id: 1
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- token_messenger_address: "0xbd3fa81b58ba92a82136038b25adec7066af3155"
- - chain_id: 10
- synapse_cctp_address: "0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E"
- token_messenger_address: "0x2B4069517957735bE00ceE0fadAE88a26365528f"
- base_omnirpc_url: "http://omnirpc" # Make sure this is configured properly
- unbonded_signer:
- type: GCP
- file: /config/signer.txt
- http_backoff_initial_interval_ms: 1000
- http_backoff_max_elapsed_time_ms: 300000
- ```
-
-
-
-
- - `submitter_config` - This is covered [here](../../Services/Submitter#Observability). At a high level this controls gas parameters used for on-chain transactions.
- - `database` - The database settings for the API backend. A database is required to store quotes and other information. Using SQLite with a dsn set to a `/tmp/` directory is recommended for development.
- - `type` - the database driver to use, can be `mysql` or `sqlite`.
- - `dsn` - the dsn of your database. If using sqlite, this can be a path, if using mysql please see [here](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration.html) for more information.
- - `screener_api_url` (optional) - Please see [here](https://github.com/synapsecns/sanguine/tree/master/contrib/screener-api#screening-api) for an api spec, this is used descision on wether to bridge to given addresses.
- - `rfq_url` - URL of the rfq api, please see the [API](../API#api-urls) page for details and the mainnet/testnet urls.
- - `omnirpc_url` - URL of omnirpc to use, Please see [here](../../Services/Omnirpc) for details on running an omnirpc instance.
- - `rebalance_interval` - How often to rebalance, formatted as (s = seconds, m = minutes, h = hours)
- - `relayer_api_port` - the relayer api is used to control the relayer. This api should be secured/not public.
- - `base_chain_config`: Base chain config is the default config applied for each chain if the other chains do not override it. This is covered in the chains section.
- - `enable_guard` - Run a guard on the same instance.
- - `submit_single_quotes` - Wether to use the batch endpoint for posting quotes to the api. This can be useful for debugging.
- - `chains` - each chain has a different config that overrides base_chain_config. Here are the parameters for each chain
- - `rfq_address` - the address of the rfq contract on this chain. These addresses are available [here](../Contracts.md).
-
- - `synapse_cctp_address` (optional) - this is only applicable if **rebalance_method** is set to synapse. This is the address of the CCTP contract available [here](../../CCTP/Contracts).
- - `token_messenger_address` (optional) - this is only applicable if **rebalance_method** is set to cctp. Tells the relayer to use the token messenger instead of synapse.
-
- - `confirmations` - how many confirmations to wait before acting on an event. This will vary per-chain.
- - `tokens` - this is a map of token symbol→token info for this chain. For example, token may be USDC, ETH, etc
- - `address` - address of the token on this chain id
- - `decimals` - number of decimals this token uses. Please verify this against the token contract itself.
- - `min_quote_amount` - smallest amount to quote for a given chain. This should be balanced against expected gas spend for a relayer to be profitable. `min_quote_amount` is to be given in decimal units (so 1000.00 is 1000)
- - `rebalance_method` - rebalance method for this particular kind of token. Some tokens may not have a rebalance method. This is either cctp or token messenger.
- - `maintenance_balance_pct` - percent of liquidity that should be maintained on the given chain for this token. If the balance is under this amount a rebalance is triggered.
- - `initial_balance_pct` - percent of liquidity to maintain after a rebalance. The total of these on all-chains should be 100.
- - `min_rebalance_amount` - amount of this token to try to rebalance
- - `max_rebalance_amount` - maximum amount of this token to try to rebalance at once
- - `quotable_tokens`:
-- `quotable_tokens`: - list of [chain-id]_[token_address]: [chain-id]_[token_address]. For example 1-0x00…. could be paired with 10-0x01
- ```yaml
- "1-0x00":
- - "1-0x01"
- ```
-- `cctp_relayer_config`: See the [CCTP page](../../CCTP/Relayer)
-
-### Observability
-
-The RFQ relayer implements open telemetry for both tracing and metrics. Please see the [Observability](../../Observability) page for more info. There is also a custom [grafana dashboard](https://github.com/synapsecns/sanguine/tree/master/services/rfq/relayer/dashboards/dashboard.json) available for the relayer. We'd also highly recommend setting up the [submitter dashboard](../../Services/Submitter) as well.
-
-![Relayer Grafana Dashboard](dashboard.png)
-
-The metrics exposed by the relayer are:
-
-- `inventory_balance`: The balance of the inventory on the chain for a given `token_name` and `relayer`.
-- `quote_amount`: The amount quoted for a given `token_name` and `relayer`.
-- `status_count`: The distribution of non-terminal `QuoteRequestStatus` values over time.
diff --git a/docs/bridge/docs/rfq/_category_.json b/docs/bridge/docs/rfq/_category_.json
deleted file mode 100644
index 8097372c06..0000000000
--- a/docs/bridge/docs/rfq/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "label": "RFQ",
- "position": 3,
- "link": {
- "type": "doc",
- "id": "rfq/RFQ"
- }
-}
diff --git a/docs/bridge/docusaurus.config.ts b/docs/bridge/docusaurus.config.ts
index d7ed74fca7..9e7b597094 100644
--- a/docs/bridge/docusaurus.config.ts
+++ b/docs/bridge/docusaurus.config.ts
@@ -1,13 +1,32 @@
-import {themes as prismThemes} from 'prism-react-renderer';
-import type {Config} from '@docusaurus/types';
-import type * as Preset from '@docusaurus/preset-classic';
-import * as path from "path";
-import {codecovWebpackPlugin} from "@codecov/webpack-plugin";
+/* eslint-disable prefer-arrow/prefer-arrow-functions */
+import * as path from 'path'
+
+import { themes as prismThemes } from 'prism-react-renderer'
+import type { Config } from '@docusaurus/types'
+import type * as Preset from '@docusaurus/preset-classic'
+import { codecovWebpackPlugin } from '@codecov/webpack-plugin'
+
+const options = {
+ id: 'api', // plugin id
+ docsPluginId: 'classic', // id of plugin-content-docs or preset for rendering docs
+ config: {
+ rfqapi: {
+ // the referenced when running CLI commands
+ specPath: '../../services/rfq/api/docs/swagger.yaml', // path to OpenAPI spec, URLs supported
+ baseUrl: 'https://rfq-api.omnirpc.io/',
+ outputDir: 'docs/rfq/API', // output directory for generated files
+ sidebarOptions: {
+ // optional, instructs plugin to generate sidebar.js
+ groupPathsBy: 'tag', // group sidebar items by operation "tag"
+ },
+ },
+ },
+}
const config: Config = {
title: 'Synapse Bridge Docs',
tagline: 'The future is cross-chain.',
- favicon: 'img/favicon.ico',
+ favicon: 'brand-assets/synapse-mark.svg',
// Set the production url of your site here
url: 'https://docs.bridge.synapseprotocol.com',
@@ -41,8 +60,9 @@ const config: Config = {
// Remove this to remove the "edit this page" links.
editUrl:
'https://github.com/synapsecns/sanguine/tree/master/docs/bridge/',
- // docLayoutComponent: "@theme/DocPage",
- docItemComponent: "@theme/ApiItem" // derived from docusaurus-theme-openapi-docs
+ docRootComponent: '@theme/DocRoot',
+ docItemComponent: '@theme/ApiItem', // derived from docusaurus-theme-openapi-docs
+ // docItemComponent: '@theme/ApiItem', // derived from docusaurus-theme-openapi-docs
},
theme: {
customCss: './src/css/custom.css',
@@ -58,13 +78,13 @@ const config: Config = {
announcementBar: {
id: 'announcementBar-v3.2', // Increment on change
// content: `⭐️ If you like Docusaurus, give it a star on GitHub and follow us on Twitter ${TwitterSvg}`,
- content: `⚠️️ Caution! These docs are a work in progress. Informaton may be incorrect or incomplete. For the current docs, please see here`,
+ content: `⚠️️ Caution! These docs are a work in progress. Information may be incorrect or incomplete. For the current docs, please see here`,
},
navbar: {
title: 'Synapse Bridge Docs',
logo: {
- alt: 'My Site Logo',
- src: 'img/logo.svg',
+ alt: 'Synapse logo mark',
+ src: 'brand-assets/synapse-mark.svg',
},
items: [
{
@@ -75,7 +95,7 @@ const config: Config = {
],
},
footer: {
- style: 'dark',
+ // style: 'dark',
links: [
// {
// title: 'Docs',
@@ -120,54 +140,42 @@ const config: Config = {
darkTheme: prismThemes.dracula,
},
} satisfies Preset.ThemeConfig,
- themes: ["docusaurus-theme-openapi-docs"], // export theme components
+ themes: ['docusaurus-theme-openapi-docs'], // export theme components
plugins: [
- [
- 'docusaurus-plugin-openapi-docs',
- {
- id: "api", // plugin id
- docsPluginId: "classic", // id of plugin-content-docs or preset for rendering docs
- config: {
- rfqapi: { // the referenced when running CLI commands
- specPath: "../../services/rfq/api/docs/swagger.yaml", // path to OpenAPI spec, URLs supported
- baseUrl: "https://rfq-api.omnirpc.io/",
- outputDir: "docs/rfq/API", // output directory for generated files
- sidebarOptions: { // optional, instructs plugin to generate sidebar.js
- groupPathsBy: "tag", // group sidebar items by operation "tag"
- },
- },
- }
- },
- ],
+ ['docusaurus-plugin-openapi-docs', options],
// please see: https://github.com/facebook/docusaurus/issues/8091#issuecomment-1269112001 for an explanation.
- () => ({
- name: 'resolve-react',
- configureWebpack() {
- return {
- resolve: {
- alias: {
- // assuming root node_modules is up from "./packages/
- react: path.resolve('../../node_modules/react'),
+ function () {
+ return {
+ name: 'resolve-react',
+ configureWebpack() {
+ return {
+ resolve: {
+ alias: {
+ // assuming root node_modules is up from "./packages/
+ react: path.resolve('../../node_modules/react'),
+ },
},
- },
- };
- },
- }),
- () => ({
- name: 'bundle-analyzer',
- configureWebpack() {
- return {
- plugins: [
- codecovWebpackPlugin({
- enableBundleAnalysis: process.env.CODECOV_TOKEN !== undefined,
- bundleName: "docs-bridge",
- uploadToken: process.env.CODECOV_TOKEN,
- }),
- ]
- };
+ }
+ },
}
- }),
+ },
+ function () {
+ return {
+ name: 'bundle-analyzer',
+ configureWebpack() {
+ return {
+ plugins: [
+ codecovWebpackPlugin({
+ enableBundleAnalysis: process.env.CODECOV_TOKEN !== undefined,
+ bundleName: 'docs-bridge',
+ uploadToken: process.env.CODECOV_TOKEN,
+ }),
+ ],
+ }
+ },
+ }
+ },
],
-};
+}
-export default config;
+export default config satisfies Config
diff --git a/docs/bridge/package.json b/docs/bridge/package.json
index 078ad6c137..80dca5e89d 100644
--- a/docs/bridge/package.json
+++ b/docs/bridge/package.json
@@ -20,26 +20,27 @@
},
"dependencies": {
"@codecov/webpack-plugin": "^0.0.1-beta.10",
- "@docusaurus/core": "3.1.1",
- "@docusaurus/logger": "3.1.1",
- "@docusaurus/plugin-content-docs": "3.1.1",
- "@docusaurus/preset-classic": "3.1.1",
- "@docusaurus/theme-common": "3.1.1",
- "@docusaurus/utils": "3.1.1",
- "@docusaurus/utils-common": "3.1.1",
- "@docusaurus/utils-validation": "3.1.1",
+ "@docusaurus/core": "3.5.2",
+ "@docusaurus/logger": "3.5.2",
+ "@docusaurus/module-type-aliases": "3.5.2",
+ "@docusaurus/plugin-content-docs": "3.5.2",
+ "@docusaurus/preset-classic": "3.5.2",
+ "@docusaurus/theme-common": "3.5.2",
+ "@docusaurus/tsconfig": "3.5.2",
+ "@docusaurus/types": "3.5.2",
+ "@docusaurus/utils": "3.5.2",
+ "@docusaurus/utils-common": "3.5.2",
+ "@docusaurus/utils-validation": "3.5.2",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
- "docusaurus-plugin-openapi-docs": "3.0.0-beta.10",
- "docusaurus-theme-openapi-docs": "3.0.0-beta.10",
+ "docusaurus-plugin-openapi-docs": "^4.0.1",
+ "docusaurus-theme-openapi-docs": "^4.0.1",
"prism-react-renderer": "^2.3.0",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "synapse-constants": "1.3.22"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "3.2.1",
- "@docusaurus/tsconfig": "3.2.1",
- "@docusaurus/types": "3.2.1",
"typescript": "~5.2.2"
},
"browserslist": {
diff --git a/docs/bridge/sidebars.ts b/docs/bridge/sidebars.ts
index acc7685acd..cf181d50cd 100644
--- a/docs/bridge/sidebars.ts
+++ b/docs/bridge/sidebars.ts
@@ -1,18 +1,18 @@
-import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
+import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
-
+
The sidebars can be generated from the filesystem, or explicitly defined here.
-
+
Create as many sidebars as you want.
*/
const sidebars: SidebarsConfig = {
// By default, Docusaurus generates a sidebar from the docs folder structure
- tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
+ tutorialSidebar: [{ type: 'autogenerated', dirName: '.' }],
// But you can create a sidebar manually
/*
@@ -26,6 +26,6 @@ const sidebars: SidebarsConfig = {
},
],
*/
-};
+}
-export default sidebars;
+export default sidebars
diff --git a/docs/bridge/src/components/AnimatedLogo.tsx b/docs/bridge/src/components/AnimatedLogo.tsx
new file mode 100644
index 0000000000..61bf5dd39e
--- /dev/null
+++ b/docs/bridge/src/components/AnimatedLogo.tsx
@@ -0,0 +1,143 @@
+export default () => {
+ return (
+
+ )
+}
diff --git a/docs/bridge/src/components/BridgeFlow.tsx b/docs/bridge/src/components/BridgeFlow.tsx
new file mode 100644
index 0000000000..f5e2378587
--- /dev/null
+++ b/docs/bridge/src/components/BridgeFlow.tsx
@@ -0,0 +1,228 @@
+export const BridgeFlow = () => {
+ return (
+
+ )
+}
diff --git a/docs/bridge/src/components/CCTPFlow.tsx b/docs/bridge/src/components/CCTPFlow.tsx
new file mode 100644
index 0000000000..4b3daad2fb
--- /dev/null
+++ b/docs/bridge/src/components/CCTPFlow.tsx
@@ -0,0 +1,191 @@
+export const CCTPFlow = () => {
+ return (
+
+ )
+}
diff --git a/docs/bridge/src/components/HomepageFeatures/index.tsx b/docs/bridge/src/components/HomepageFeatures/index.tsx
index 50a9e6f4c7..de3376181d 100644
--- a/docs/bridge/src/components/HomepageFeatures/index.tsx
+++ b/docs/bridge/src/components/HomepageFeatures/index.tsx
@@ -1,12 +1,14 @@
-import clsx from 'clsx';
-import Heading from '@theme/Heading';
-import styles from './styles.module.css';
+/* eslint-disable @typescript-eslint/no-var-requires */
+import clsx from 'clsx'
+import Heading from '@theme/Heading'
+
+import styles from './styles.module.css'
type FeatureItem = {
- title: string;
- Svg: React.ComponentType>;
- description: JSX.Element;
-};
+ title: string
+ Svg: React.ComponentType>
+ description: JSX.Element
+}
const FeatureList: FeatureItem[] = [
{
@@ -39,9 +41,9 @@ const FeatureList: FeatureItem[] = [
>
),
},
-];
+]
-function Feature({title, Svg, description}: FeatureItem) {
+const Feature = ({ title, Svg, description }: FeatureItem) => {
return (
@@ -52,10 +54,10 @@ function Feature({title, Svg, description}: FeatureItem) {