From 120593869020d9973483ba4ca03433b7ef4c8d70 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=CF=87=C2=B2?=
<88190723+ChiTimesChi@users.noreply.github.com>
Date: Wed, 6 May 2026 22:35:41 +0100
Subject: [PATCH 1/2] fix(synapse-interface): bridge pauses (#4049)
* feat: support destination module pauses
* chore: pause synapse bridge routes
* refactor: share bridge module pause matching
* feat: warn on paused bridge module routes
* fix: split destination bridge module pauses
* chore: simplify bridge pause warning copy
* fix: use explicit bridge module sort
---
packages/synapse-interface/README.md | 13 ++++--
.../components/Maintenance/Maintenance.tsx | 3 +-
.../Maintenance/hooks/useSynapsePauseData.ts | 20 +++++++-
.../BridgeModulePausedWarning.tsx | 38 +++++++++++++++
packages/synapse-interface/messages/ar.json | 1 +
.../synapse-interface/messages/en-US.json | 1 +
packages/synapse-interface/messages/es.json | 1 +
packages/synapse-interface/messages/fr.json | 1 +
packages/synapse-interface/messages/jp.json | 1 +
packages/synapse-interface/messages/tr.json | 1 +
.../synapse-interface/messages/zh-CN.json | 1 +
.../pages/state-managed-bridge/index.tsx | 25 +++++++++-
.../v1/paused-bridge-modules-to-chain.json | 46 +++++++++++++++++++
.../pauses/v1/paused-bridge-modules.json | 15 +++++-
.../slices/bridgeQuote/thunks.ts | 12 ++---
.../getPausedBridgeModuleNamesForRoute.ts | 29 ++++++++++++
.../components/Maintenance/Maintenance.tsx | 1 +
packages/widget/src/hooks/useNativeSafeMax.ts | 2 +
.../state/slices/bridgeQuote/hooks.test.ts | 26 +++++++++++
.../src/state/slices/bridgeQuote/hooks.ts | 1 +
.../src/utils/selectBridgeQuote.test.ts | 30 ++++++++++++
.../widget/src/utils/selectBridgeQuote.ts | 9 +++-
22 files changed, 259 insertions(+), 18 deletions(-)
create mode 100644 packages/synapse-interface/components/StateManagedBridge/BridgeModulePausedWarning.tsx
create mode 100644 packages/synapse-interface/public/pauses/v1/paused-bridge-modules-to-chain.json
create mode 100644 packages/synapse-interface/utils/getPausedBridgeModuleNamesForRoute.ts
diff --git a/packages/synapse-interface/README.md b/packages/synapse-interface/README.md
index 54524e4f1b..d933d8205c 100644
--- a/packages/synapse-interface/README.md
+++ b/packages/synapse-interface/README.md
@@ -69,17 +69,19 @@ The interface renders maintenance UI from shared pause artifacts:
2. Countdown Progress Bar at the top of Bridge / Swap cards.
3. Warning Message below the input UI in Bridge / Swap cards.
-The widget still depends on these same pause artifact files and repository paths for its maintenance state, even though it fetches them through different remote URLs. Keep both files present at their current paths even when they are empty, because the widget is coupled to those artifact locations.
+The widget still depends on these same pause artifact files and repository paths for its maintenance state, even though it fetches them through different remote URLs. Keep shared artifact files present at their current paths even when they are empty, because consumers may be coupled to those artifact locations.
The shared artifacts are:
- [Pause Chains JSON](https://github.com/synapsecns/sanguine/blob/master/packages/synapse-interface/public/pauses/v1/paused-chains.json)
- [Pause Bridge Modules JSON](https://github.com/synapsecns/sanguine/blob/master/packages/synapse-interface/public/pauses/v1/paused-bridge-modules.json)
+- [Pause Bridge Modules To Chain JSON](https://github.com/synapsecns/sanguine/blob/master/packages/synapse-interface/public/pauses/v1/paused-bridge-modules-to-chain.json)
Current repository state:
- `paused-chains.json` is intentionally shipped as an empty array. This repository no longer maintains chain-specific pause records in the shared artifacts.
-- `paused-bridge-modules.json` remains the maintained pause artifact for bridge module filtering. Records must stay chain-scoped; do not add a global `ALL` pause record.
+- `paused-bridge-modules.json` remains the maintained pause artifact for origin chain bridge module filtering. Records must stay chain-scoped with `chainId`; do not add a global `ALL` pause record.
+- `paused-bridge-modules-to-chain.json` remains the maintained pause artifact for destination chain bridge module filtering. Records must stay chain-scoped with `toChainId`; do not add a global `ALL` pause record.
- Example files under `public/pauses/v1/examples/` are intentionally empty arrays so they do not advertise removed chain-specific or global configs.
When a shared pause artifact changes, the production webapp picks it up after:
@@ -91,7 +93,7 @@ This deployment flow applies to the interface only. After Step 1, the [Github Pa
## Bridge Module Pause
-Use `paused-bridge-modules.json` to pause a specific bridge module on a specific chain. Supported bridge modules are:
+Use `paused-bridge-modules.json` to pause a specific bridge module from a specific chain. Use `paused-bridge-modules-to-chain.json` to pause a specific bridge module to a specific chain. Supported bridge modules are:
- `SynapseRFQ`
- `SynapseCCTP`
@@ -100,7 +102,10 @@ Use `paused-bridge-modules.json` to pause a specific bridge module on a specific
### Bridge Module Pause Props
`chainId`
-Chain ID of the chain where the bridge module should be paused.
+Origin chain ID where the bridge module should be paused. Use only in `paused-bridge-modules.json`.
+
+`toChainId`
+Destination chain ID where the bridge module should be paused. Use only in `paused-bridge-modules-to-chain.json`.
`bridgeModuleName`
Accepts `SynapseRFQ`, `SynapseBridge`, or `SynapseCCTP`.
diff --git a/packages/synapse-interface/components/Maintenance/Maintenance.tsx b/packages/synapse-interface/components/Maintenance/Maintenance.tsx
index 8103c2b77a..e53d68314e 100644
--- a/packages/synapse-interface/components/Maintenance/Maintenance.tsx
+++ b/packages/synapse-interface/components/Maintenance/Maintenance.tsx
@@ -28,7 +28,8 @@ interface ChainPause {
}
export interface BridgeModulePause {
- chainId?: number // If undefined, pause bridge module for all chains.
+ chainId?: number // Origin chain ID. If undefined, match any origin chain.
+ toChainId?: number // Destination chain ID. If undefined, match any destination chain.
bridgeModuleName: 'SynapseBridge' | 'SynapseRFQ' | 'SynapseCCTP' | 'ALL'
}
diff --git a/packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts b/packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts
index 4c2a0693fb..08cbac3254 100644
--- a/packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts
+++ b/packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts
@@ -8,11 +8,14 @@ import {
import { fetchJsonData } from '../functions/fetchJsonData'
import pausedChains from '@/public/pauses/v1/paused-chains.json'
import pausedBridgeModules from '@/public/pauses/v1/paused-bridge-modules.json'
+import pausedBridgeModulesToChain from '@/public/pauses/v1/paused-bridge-modules-to-chain.json'
const PAUSED_CHAINS_URL =
'https://synapsecns.github.io/sanguine/packages/synapse-interface/public/pauses/v1/paused-chains.json'
const PAUSED_MODULES_URL =
'https://synapsecns.github.io/sanguine/packages/synapse-interface/public/pauses/v1/paused-bridge-modules.json'
+const PAUSED_MODULES_TO_CHAIN_URL =
+ 'https://synapsecns.github.io/sanguine/packages/synapse-interface/public/pauses/v1/paused-bridge-modules-to-chain.json'
export const useSynapsePauseData = () => {
const dispatch = useAppDispatch()
@@ -25,9 +28,17 @@ export const useSynapsePauseData = () => {
try {
const pausedChainsData = await fetchJsonData(PAUSED_CHAINS_URL)
const pausedModulesData = await fetchJsonData(PAUSED_MODULES_URL)
+ const pausedModulesToChainData = await fetchJsonData(
+ PAUSED_MODULES_TO_CHAIN_URL
+ )
dispatch(setPausedChainsData(pausedChainsData))
- dispatch(setPausedModulesData(pausedModulesData))
+ dispatch(
+ setPausedModulesData([
+ ...pausedModulesData,
+ ...pausedModulesToChainData,
+ ])
+ )
} catch (error) {
console.error(
'Using local source, failed to fetch paused chains/modules: ',
@@ -36,7 +47,12 @@ export const useSynapsePauseData = () => {
/** Read local source if fetch fails as backup */
dispatch(setPausedChainsData(pausedChains))
- dispatch(setPausedModulesData(pausedBridgeModules))
+ dispatch(
+ setPausedModulesData([
+ ...pausedBridgeModules,
+ ...pausedBridgeModulesToChain,
+ ])
+ )
} finally {
setTimeout(() => {
setIsFetching(false)
diff --git a/packages/synapse-interface/components/StateManagedBridge/BridgeModulePausedWarning.tsx b/packages/synapse-interface/components/StateManagedBridge/BridgeModulePausedWarning.tsx
new file mode 100644
index 0000000000..09b29b735e
--- /dev/null
+++ b/packages/synapse-interface/components/StateManagedBridge/BridgeModulePausedWarning.tsx
@@ -0,0 +1,38 @@
+import { useMemo } from 'react'
+import { useTranslations } from 'next-intl'
+
+import type { BridgeModulePause } from '@/components/Maintenance/Maintenance'
+import { WarningMessage } from '@/components/Warning'
+import { getPausedBridgeModuleNamesForRoute } from '@/utils/getPausedBridgeModuleNamesForRoute'
+
+export const BridgeModulePausedWarning = ({
+ fromChainId,
+ toChainId,
+ pausedModulesList,
+}: {
+ fromChainId: number
+ toChainId: number
+ pausedModulesList: BridgeModulePause[]
+}) => {
+ const t = useTranslations('Bridge')
+ const pausedModuleNames = useMemo(
+ () =>
+ getPausedBridgeModuleNamesForRoute({
+ pausedModules: pausedModulesList,
+ fromChainId,
+ toChainId,
+ }),
+ [fromChainId, toChainId, pausedModulesList]
+ )
+
+ if (!fromChainId || !toChainId || pausedModuleNames.length === 0) {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/packages/synapse-interface/messages/ar.json b/packages/synapse-interface/messages/ar.json
index b34b63a214..cc734c218e 100644
--- a/packages/synapse-interface/messages/ar.json
+++ b/packages/synapse-interface/messages/ar.json
@@ -14,6 +14,7 @@
"Bridge": "الجسر",
"Send your assets across chains": "أرسل أصولك عبر السلاسل.",
"Bridge paused": "الجسر متوقف مؤقتًا",
+ "BridgeModulePauseWarningMessage": "الجسر متوقف مؤقتًا لهذا المسار. قد تكون عروض الأسعار أقل ملاءمة.",
"Please select Origin Network": "يرجى اختيار شبكة المصدر",
"Please select Destination network": "يرجى اختيار شبكة الوجهة",
"Please select an Origin token": "يرجى اختيار رمز المصدر",
diff --git a/packages/synapse-interface/messages/en-US.json b/packages/synapse-interface/messages/en-US.json
index b0c2a8f094..78f7d7fa5c 100644
--- a/packages/synapse-interface/messages/en-US.json
+++ b/packages/synapse-interface/messages/en-US.json
@@ -14,6 +14,7 @@
"Bridge": "Bridge",
"Send your assets across chains": "Send your assets across chains.",
"Bridge paused": "Bridge paused",
+ "BridgeModulePauseWarningMessage": "Bridge is paused for this route. Quotes may be less favorable.",
"Please select Origin Network": "Please select Origin Network",
"Please select Destination network": "Please select Destination network",
"Please select an Origin token": "Please select an Origin token",
diff --git a/packages/synapse-interface/messages/es.json b/packages/synapse-interface/messages/es.json
index 5224c8e6e6..76ae4d3c61 100644
--- a/packages/synapse-interface/messages/es.json
+++ b/packages/synapse-interface/messages/es.json
@@ -14,6 +14,7 @@
"Bridge": "Puente",
"Send your assets across chains": "Envía tus activos entre cadenas.",
"Bridge paused": "Puente en pausa",
+ "BridgeModulePauseWarningMessage": "El puente está en pausa para esta ruta. Las cotizaciones pueden ser menos favorables.",
"Please select Origin Network": "Por favor, selecciona la Red de Origen",
"Please select Destination network": "Por favor, selecciona la red de Destino",
"Please select an Origin token": "Por favor, selecciona un token de Origen",
diff --git a/packages/synapse-interface/messages/fr.json b/packages/synapse-interface/messages/fr.json
index c7193d5120..4dca637779 100644
--- a/packages/synapse-interface/messages/fr.json
+++ b/packages/synapse-interface/messages/fr.json
@@ -14,6 +14,7 @@
"Bridge": "Bridge",
"Send your assets across chains": "Envoyez vos actifs à travers les chaînes.",
"Bridge paused": "Bridge en pause",
+ "BridgeModulePauseWarningMessage": "Le bridge est en pause pour cette route. Les offres peuvent être moins favorables.",
"Please select Origin Network": "Veuillez sélectionner le réseau d'origine",
"Please select Destination network": "Veuillez sélectionner le réseau de destination",
"Please select an Origin token": "Veuillez sélectionner un jeton d'origine",
diff --git a/packages/synapse-interface/messages/jp.json b/packages/synapse-interface/messages/jp.json
index d6e9b32bc7..fe873e41a9 100644
--- a/packages/synapse-interface/messages/jp.json
+++ b/packages/synapse-interface/messages/jp.json
@@ -14,6 +14,7 @@
"Bridge": "ブリッジ",
"Send your assets across chains": "チェーン間でアセットを送信します。",
"Bridge paused": "ブリッジ一時停止中",
+ "BridgeModulePauseWarningMessage": "このルートではブリッジが一時停止中です。見積もりが不利になる場合があります。",
"Please select Origin Network": "オリジンネットワークを選択してください",
"Please select Destination network": "宛先ネットワークを選択してください",
"Please select an Origin token": "オリジントークンを選択してください",
diff --git a/packages/synapse-interface/messages/tr.json b/packages/synapse-interface/messages/tr.json
index f2993b41f1..1f5ca2d42c 100644
--- a/packages/synapse-interface/messages/tr.json
+++ b/packages/synapse-interface/messages/tr.json
@@ -14,6 +14,7 @@
"Bridge": "Köprü",
"Send your assets across chains": "Varlıklarınızı zincirler arasında gönderin.",
"Bridge paused": "Köprü duraklatıldı",
+ "BridgeModulePauseWarningMessage": "Köprü bu rota için duraklatıldı. Teklifler daha az avantajlı olabilir.",
"Please select Origin Network": "Lütfen Kaynak Ağı seçin",
"Please select Destination network": "Lütfen Hedef ağı seçin",
"Please select an Origin token": "Lütfen bir Kaynak token seçin",
diff --git a/packages/synapse-interface/messages/zh-CN.json b/packages/synapse-interface/messages/zh-CN.json
index 2fe67960fe..47bc3160bf 100644
--- a/packages/synapse-interface/messages/zh-CN.json
+++ b/packages/synapse-interface/messages/zh-CN.json
@@ -14,6 +14,7 @@
"Bridge": "桥接",
"Send your assets across chains": "跨链发送您的资产。",
"Bridge paused": "桥接已暂停",
+ "BridgeModulePauseWarningMessage": "此路线的桥接已暂停。报价可能不够优惠。",
"Please select Origin Network": "请选择来源网络",
"Please select Destination network": "请选择目标网络",
"Please select an Origin token": "请选择来源代币",
diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx
index 8a8067d48c..4ebc04b817 100644
--- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx
+++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx
@@ -1,5 +1,5 @@
import toast from 'react-hot-toast'
-import { useEffect, useRef, useState } from 'react'
+import { useEffect, useMemo, useRef, useState } from 'react'
import { Address, zeroAddress, isAddress } from 'viem'
import { polygon } from 'viem/chains'
import { useAccount } from 'wagmi'
@@ -17,6 +17,7 @@ import { InputContainer } from '@/components/StateManagedBridge/InputContainer'
import { OutputContainer } from '@/components/StateManagedBridge/OutputContainer'
import { BridgeExchangeRateInfo } from '@/components/StateManagedBridge/BridgeExchangeRateInfo'
import { BridgeTransactionButton } from '@/components/StateManagedBridge/BridgeTransactionButton'
+import { BridgeModulePausedWarning } from '@/components/StateManagedBridge/BridgeModulePausedWarning'
import ExplorerToastLink from '@/components/ExplorerToastLink'
import { SwitchButton } from '@/components/buttons/SwitchButton'
import { PageHeader } from '@/components/PageHeader'
@@ -126,6 +127,10 @@ const StateManagedBridge = () => {
BridgeMaintenanceProgressBar,
BridgeMaintenanceWarningMessage,
} = useMaintenance()
+ const pausedModulesKey = useMemo(
+ () => JSON.stringify(pausedModulesList),
+ [pausedModulesList]
+ )
useEffect(() => {
segmentAnalyticsEvent(
@@ -151,7 +156,16 @@ const StateManagedBridge = () => {
} else {
dispatch(resetBridgeQuote())
}
- }, [fromChainId, toChainId, fromToken, toToken, debouncedFromValue, address, destinationAddress])
+ }, [
+ fromChainId,
+ toChainId,
+ fromToken,
+ toToken,
+ debouncedFromValue,
+ address,
+ destinationAddress,
+ pausedModulesKey,
+ ])
const getAndSetBridgeQuote = async () => {
currentSDKRequestID.current += 1
@@ -507,6 +521,13 @@ const StateManagedBridge = () => {
{!(
fromChainId === ARBITRUM.id && toChainId === HYPERLIQUID.id
) && }
+
{toChainId === HYPERLIQUID.id && (
- module.chainId ? module.chainId === fromChainId : true
- )
- .flatMap(getBridgeModuleNames)
+ getPausedBridgeModuleNamesForRoute({
+ pausedModules: pausedModulesList,
+ fromChainId,
+ toChainId,
+ })
)
const activeQuotes = allQuotes.filter(
(quote) => !quote.moduleNames.some((m) => pausedBridgeModules.has(m))
diff --git a/packages/synapse-interface/utils/getPausedBridgeModuleNamesForRoute.ts b/packages/synapse-interface/utils/getPausedBridgeModuleNamesForRoute.ts
new file mode 100644
index 0000000000..16b25b965a
--- /dev/null
+++ b/packages/synapse-interface/utils/getPausedBridgeModuleNamesForRoute.ts
@@ -0,0 +1,29 @@
+import { getBridgeModuleNames } from '@/utils/getBridgeModuleNames'
+
+type BridgeModulePauseLike = {
+ chainId?: number
+ toChainId?: number
+ bridgeModuleName: string
+}
+
+export const getPausedBridgeModuleNamesForRoute = ({
+ pausedModules,
+ fromChainId,
+ toChainId,
+}: {
+ pausedModules: BridgeModulePauseLike[]
+ fromChainId: number
+ toChainId: number
+}) => {
+ return Array.from(
+ new Set(
+ pausedModules
+ .filter(
+ (module) =>
+ (module.chainId ? module.chainId === fromChainId : true) &&
+ (module.toChainId ? module.toChainId === toChainId : true)
+ )
+ .flatMap(getBridgeModuleNames)
+ )
+ ).sort((a, b) => a.localeCompare(b))
+}
diff --git a/packages/widget/src/components/Maintenance/Maintenance.tsx b/packages/widget/src/components/Maintenance/Maintenance.tsx
index b46ff35656..349d12d136 100644
--- a/packages/widget/src/components/Maintenance/Maintenance.tsx
+++ b/packages/widget/src/components/Maintenance/Maintenance.tsx
@@ -20,6 +20,7 @@ interface ChainPause {
interface BridgeModulePause {
chainId: number | undefined
+ toChainId?: number
bridgeModuleName: 'SynapseBridge' | 'SynapseRFQ' | 'SynapseCCTP' | 'ALL'
}
diff --git a/packages/widget/src/hooks/useNativeSafeMax.ts b/packages/widget/src/hooks/useNativeSafeMax.ts
index 52bf1cf78e..71b639c822 100644
--- a/packages/widget/src/hooks/useNativeSafeMax.ts
+++ b/packages/widget/src/hooks/useNativeSafeMax.ts
@@ -11,6 +11,7 @@ type BigIntLike = bigint | { toString(): string }
type BridgeModulePauseLike = {
chainId?: number
+ toChainId?: number
bridgeModuleName: string
}
@@ -381,6 +382,7 @@ export const useNativeSafeMax = ({
const selectedQuote = selectBridgeQuote({
quotes,
originChainId,
+ destinationChainId,
pausedModules: stablePausedModules,
})
diff --git a/packages/widget/src/state/slices/bridgeQuote/hooks.test.ts b/packages/widget/src/state/slices/bridgeQuote/hooks.test.ts
index 1c0bd7c54e..a5dbd35eeb 100644
--- a/packages/widget/src/state/slices/bridgeQuote/hooks.test.ts
+++ b/packages/widget/src/state/slices/bridgeQuote/hooks.test.ts
@@ -198,4 +198,30 @@ describe('fetchBridgeQuote quote filtering', () => {
expect(state.bridgeQuote.bridgeModuleName).toBe('SynapseBridge')
expect(state.bridgeQuote.nativeFee).toBe(12n)
})
+
+ it('filters destination chain-specific paused bridge modules', async () => {
+ const { action, state } = await runFetchBridgeQuote({
+ nativeFee: '12',
+ pausedModules: [
+ {
+ bridgeModuleName: 'SynapseRFQ',
+ toChainId: 2,
+ },
+ ],
+ quotes: [
+ createSdkQuote({
+ moduleNames: ['SynapseRFQ'],
+ nativeFee: '77',
+ }),
+ createSdkQuote({
+ moduleNames: ['SynapseBridge'],
+ nativeFee: '12',
+ }),
+ ],
+ })
+
+ expect(fetchBridgeQuote.fulfilled.match(action)).toBe(true)
+ expect(state.bridgeQuote.bridgeModuleName).toBe('SynapseBridge')
+ expect(state.bridgeQuote.nativeFee).toBe(12n)
+ })
})
diff --git a/packages/widget/src/state/slices/bridgeQuote/hooks.ts b/packages/widget/src/state/slices/bridgeQuote/hooks.ts
index 56cf5c7723..c97bc5b599 100644
--- a/packages/widget/src/state/slices/bridgeQuote/hooks.ts
+++ b/packages/widget/src/state/slices/bridgeQuote/hooks.ts
@@ -98,6 +98,7 @@ export const fetchBridgeQuote = createAsyncThunk(
const quote = selectBridgeQuote({
quotes: validQuotes,
originChainId,
+ destinationChainId,
pausedModules,
})
diff --git a/packages/widget/src/utils/selectBridgeQuote.test.ts b/packages/widget/src/utils/selectBridgeQuote.test.ts
index 017ce8a4d5..92b306f5bf 100644
--- a/packages/widget/src/utils/selectBridgeQuote.test.ts
+++ b/packages/widget/src/utils/selectBridgeQuote.test.ts
@@ -13,6 +13,7 @@ describe('selectBridgeQuote', () => {
createQuote('rfq', ['SynapseRFQ']),
],
originChainId: 1,
+ destinationChainId: 10,
pausedModules: [],
})
@@ -26,6 +27,7 @@ describe('selectBridgeQuote', () => {
createQuote('rfq', ['SynapseRFQ']),
],
originChainId: 1,
+ destinationChainId: 10,
pausedModules: [
{ bridgeModuleName: 'SynapseBridge', chainId: 1 },
{ bridgeModuleName: 'ALL' },
@@ -34,4 +36,32 @@ describe('selectBridgeQuote', () => {
expect(quote).toBeNull()
})
+
+ it('respects destination chain-specific paused-module entries', () => {
+ const quote = selectBridgeQuote({
+ quotes: [
+ createQuote('bridge', ['SynapseBridge']),
+ createQuote('rfq', ['SynapseRFQ']),
+ ],
+ originChainId: 1,
+ destinationChainId: 10,
+ pausedModules: [{ bridgeModuleName: 'SynapseRFQ', toChainId: 10 }],
+ })
+
+ expect(quote?.id).toBe('bridge')
+ })
+
+ it('does not apply destination chain-specific entries to other destinations', () => {
+ const quote = selectBridgeQuote({
+ quotes: [
+ createQuote('bridge', ['SynapseBridge']),
+ createQuote('rfq', ['SynapseRFQ']),
+ ],
+ originChainId: 1,
+ destinationChainId: 42161,
+ pausedModules: [{ bridgeModuleName: 'SynapseRFQ', toChainId: 10 }],
+ })
+
+ expect(quote?.id).toBe('rfq')
+ })
})
diff --git a/packages/widget/src/utils/selectBridgeQuote.ts b/packages/widget/src/utils/selectBridgeQuote.ts
index 96e61dc022..f10872cecf 100644
--- a/packages/widget/src/utils/selectBridgeQuote.ts
+++ b/packages/widget/src/utils/selectBridgeQuote.ts
@@ -2,6 +2,7 @@ import { getBridgeModuleNames } from '@/utils/getBridgeModuleNames'
type BridgeModulePauseLike = {
chainId?: number
+ toChainId?: number
bridgeModuleName: string
}
@@ -12,16 +13,20 @@ type BridgeQuoteLike = {
export const selectBridgeQuote = ({
quotes,
originChainId,
+ destinationChainId,
pausedModules,
}: {
quotes: T[]
originChainId: number
+ destinationChainId: number
pausedModules: BridgeModulePauseLike[]
}): T | null => {
const pausedBridgeModules = new Set(
pausedModules
- .filter((module) =>
- module.chainId ? module.chainId === originChainId : true
+ .filter(
+ (module) =>
+ (module.chainId ? module.chainId === originChainId : true) &&
+ (module.toChainId ? module.toChainId === destinationChainId : true)
)
.flatMap(getBridgeModuleNames)
)
From f34c91245633f7fbf49ad95d6c70bf667ce53c23 Mon Sep 17 00:00:00 2001
From: ChiTimesChi
Date: Wed, 6 May 2026 21:40:24 +0000
Subject: [PATCH 2/2] Publish
- @synapsecns/synapse-interface@0.44.3
- @synapsecns/widget-example@0.2.4
- @synapsecns/widget@0.11.4
---
packages/synapse-interface/CHANGELOG.md | 11 +++++++++++
packages/synapse-interface/package.json | 2 +-
packages/widget-example/CHANGELOG.md | 8 ++++++++
packages/widget-example/package.json | 4 ++--
packages/widget/CHANGELOG.md | 11 +++++++++++
packages/widget/package.json | 2 +-
6 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/packages/synapse-interface/CHANGELOG.md b/packages/synapse-interface/CHANGELOG.md
index 1c073687e1..4b9429fe8f 100644
--- a/packages/synapse-interface/CHANGELOG.md
+++ b/packages/synapse-interface/CHANGELOG.md
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.44.3](https://github.com/synapsecns/sanguine/compare/@synapsecns/synapse-interface@0.44.2...@synapsecns/synapse-interface@0.44.3) (2026-05-06)
+
+
+### Bug Fixes
+
+* **synapse-interface:** bridge pauses ([#4049](https://github.com/synapsecns/sanguine/issues/4049)) ([1205938](https://github.com/synapsecns/sanguine/commit/120593869020d9973483ba4ca03433b7ef4c8d70))
+
+
+
+
+
## [0.44.2](https://github.com/synapsecns/sanguine/compare/@synapsecns/synapse-interface@0.44.1...@synapsecns/synapse-interface@0.44.2) (2026-05-05)
diff --git a/packages/synapse-interface/package.json b/packages/synapse-interface/package.json
index b708663f67..9d96a15286 100644
--- a/packages/synapse-interface/package.json
+++ b/packages/synapse-interface/package.json
@@ -1,6 +1,6 @@
{
"name": "@synapsecns/synapse-interface",
- "version": "0.44.2",
+ "version": "0.44.3",
"private": true,
"engines": {
"node": ">=18"
diff --git a/packages/widget-example/CHANGELOG.md b/packages/widget-example/CHANGELOG.md
index 6568b67b67..ebff316cf9 100644
--- a/packages/widget-example/CHANGELOG.md
+++ b/packages/widget-example/CHANGELOG.md
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.2.4](https://github.com/synapsecns/sanguine/compare/@synapsecns/widget-example@0.2.3...@synapsecns/widget-example@0.2.4) (2026-05-06)
+
+**Note:** Version bump only for package @synapsecns/widget-example
+
+
+
+
+
## [0.2.3](https://github.com/synapsecns/sanguine/compare/@synapsecns/widget-example@0.2.2...@synapsecns/widget-example@0.2.3) (2026-05-04)
**Note:** Version bump only for package @synapsecns/widget-example
diff --git a/packages/widget-example/package.json b/packages/widget-example/package.json
index 1069e30612..53cc9ac169 100644
--- a/packages/widget-example/package.json
+++ b/packages/widget-example/package.json
@@ -1,6 +1,6 @@
{
"name": "@synapsecns/widget-example",
- "version": "0.2.3",
+ "version": "0.2.4",
"private": true,
"description": "Minimal Next.js consumer app for the Synapse widget",
"engines": {
@@ -18,7 +18,7 @@
"build:slither": " "
},
"dependencies": {
- "@synapsecns/widget": "^0.11.3",
+ "@synapsecns/widget": "^0.11.4",
"ethers": "^6.9.1",
"next": "^14.2.35",
"react": "^18.2.0",
diff --git a/packages/widget/CHANGELOG.md b/packages/widget/CHANGELOG.md
index 520b76e1de..2605a8d75e 100644
--- a/packages/widget/CHANGELOG.md
+++ b/packages/widget/CHANGELOG.md
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.11.4](https://github.com/synapsecns/sanguine/compare/@synapsecns/widget@0.11.3...@synapsecns/widget@0.11.4) (2026-05-06)
+
+
+### Bug Fixes
+
+* **synapse-interface:** bridge pauses ([#4049](https://github.com/synapsecns/sanguine/issues/4049)) ([1205938](https://github.com/synapsecns/sanguine/commit/120593869020d9973483ba4ca03433b7ef4c8d70))
+
+
+
+
+
## [0.11.3](https://github.com/synapsecns/sanguine/compare/@synapsecns/widget@0.11.2...@synapsecns/widget@0.11.3) (2026-05-04)
**Note:** Version bump only for package @synapsecns/widget
diff --git a/packages/widget/package.json b/packages/widget/package.json
index ce14f9c43b..b6a7b43237 100644
--- a/packages/widget/package.json
+++ b/packages/widget/package.json
@@ -1,7 +1,7 @@
{
"name": "@synapsecns/widget",
"description": "Widget library for interacting with the Synapse Protocol",
- "version": "0.11.3",
+ "version": "0.11.4",
"license": "MIT",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",