Skip to content

Commit 1c9816e

Browse files
fix(bridge): improve Safe wallet + WalletConnect connection stability and transfer UX
1 parent 3fe75c7 commit 1c9816e

9 files changed

Lines changed: 343 additions & 21 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"resolutions": {
2626
"node-forge": "1.4.0",
2727
"@types/node-forge": "1.3.14",
28-
"**/@walletconnect/ethereum-provider": "2.13.1",
28+
"**/@walletconnect/ethereum-provider": "2.23.9",
2929
"@octokit/core/@octokit/request-error": "5.1.1",
3030
"@octokit/core/@octokit/request": "8.4.1",
3131
"@octokit/graphql/@octokit/request": "8.4.1",

packages/app/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"private": true,
66
"dependencies": {
77
"@arbitrum/sdk": "^4.0.4",
8-
"@rainbow-me/rainbowkit": "^2.2.4",
8+
"@rainbow-me/rainbowkit": "^2.2.10",
99
"@tippyjs/react": "^4.2.6",
1010
"@uidotdev/usehooks": "^2.4.1",
1111
"dayjs": "^1.11.13",
@@ -20,7 +20,7 @@
2020
"axios": "^1.12.0",
2121
"recharts": "^3.3.0",
2222
"swr": "^2.3.3",
23-
"viem": "^2.38.5",
23+
"viem": "^2.47.12",
2424
"wagmi": "^2.19.1",
2525
"zod": "^3.24.3",
2626
"zustand": "^4.3.9"

packages/app/src/components/AppShell/providers/AppProviders.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,10 @@ const integratorId =
5454

5555
const wagmiConfig = getProps(targetChainKey);
5656

57-
// Clear cache for everything related to WalletConnect v2.
58-
//
59-
// TODO: Remove this once the fix for the infinite loop / memory leak is identified.
57+
// Only clear stale wagmi metadata on load — preserve WalletConnect session data
58+
// so that Safe and other WC-connected wallets don't lose their sessions on navigation.
6059
Object.keys(localStorage).forEach((key) => {
61-
if (key === 'wagmi.requestedChains' || key === 'wagmi.store' || key.startsWith('wc@2')) {
60+
if (key === 'wagmi.requestedChains') {
6261
localStorage.removeItem(key);
6362
}
6463
});

packages/arb-token-bridge-ui/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
"@moonpay/moonpay-node": "^0.2.12",
1414
"@moonpay/moonpay-react": "^1.10.5",
1515
"@offchainlabs/cobalt": "^0.5.1",
16-
"@rainbow-me/rainbowkit": "^2.2.4",
16+
"@rainbow-me/rainbowkit": "^2.2.10",
1717
"@rehooks/local-storage": "^2.4.5",
1818
"@sentry/react": "^9.13.0",
19-
"@tanstack/react-query": "^5.63.0",
19+
"@tanstack/react-query": "^5.99.0",
2020
"@uidotdev/usehooks": "^2.4.1",
2121
"@uniswap/token-lists": "^1.0.0-beta.34",
2222
"@unstoppabledomains/resolution": "^8.3.3",
@@ -47,7 +47,7 @@
4747
"swr": "^2.3.3",
4848
"tailwind-merge": "^3.2.0",
4949
"use-query-params": "^2.2.1",
50-
"viem": "^2.38.5",
50+
"viem": "^2.47.12",
5151
"wagmi": "^2.19.1",
5252
"zod": "^3.24.3",
5353
"zustand": "^4.3.9"

packages/arb-token-bridge-ui/src/components/App/useSyncConnectedChainToQueryParams.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function useSyncConnectedChainToQueryParams() {
5858
setSourceChainToConnectedChain();
5959

6060
window.alert(
61-
`You're connected to the app with a smart contract wallet on ${chainName}. In order to properly enable transfers, the app will now reload.\n\nPlease reconnect after the reload.`,
61+
`You're connected to the app with a smart contract wallet on ${chainName}. In order to properly enable transfers, you will be disconnected.\n\nPlease reconnect to continue.`,
6262
);
6363
disconnect();
6464
}

packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,15 +1267,15 @@ export function TransferPanel() {
12671267
await switchChainAsync({ chainId: sourceChainId });
12681268
}
12691269
} catch (error) {
1270+
setTransferring(false);
12701271
if (isUserRejectedError(error)) {
12711272
return;
12721273
}
12731274
return networkConnectionWarningToast();
1274-
} finally {
1275-
setTransferring(false);
12761275
}
12771276

12781277
if (!isTransferAllowed) {
1278+
setTransferring(false);
12791279
return networkConnectionWarningToast();
12801280
}
12811281

packages/arb-token-bridge-ui/src/components/common/Button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
4747
<button
4848
ref={ref}
4949
type="button"
50-
disabled={disabled}
50+
disabled={disabled || loading}
5151
className={twMerge(
5252
'arb-hover relative w-max rounded border bg-dark p-2 text-sm',
5353
'text-white disabled:cursor-not-allowed disabled:border disabled:border-white/10 disabled:bg-white/10 disabled:text-white/50',
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
export function onDisconnectHandler() {
2-
if (typeof indexedDB === 'undefined') {
3-
return;
4-
}
5-
62
if (typeof localStorage === 'undefined') {
73
return;
84
}
@@ -13,7 +9,12 @@ export function onDisconnectHandler() {
139
return;
1410
}
1511

16-
indexedDB.deleteDatabase('WALLET_CONNECT_V2_INDEXED_DB');
17-
18-
setTimeout(() => window.location.reload(), 100);
12+
// Clear WalletConnect session keys from localStorage so reconnection starts fresh.
13+
// Avoid deleting the entire IndexedDB and force-reloading — that was too aggressive
14+
// and caused Safe wallet sessions to break on minor disconnects.
15+
Object.keys(localStorage).forEach((key) => {
16+
if (key.startsWith('wc@2')) {
17+
localStorage.removeItem(key);
18+
}
19+
});
1920
}

safe-walletconnect-audit-report.md

Lines changed: 322 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)