diff --git a/packages/appkit/src/client.ts b/packages/appkit/src/client.ts index a6d9ef784f..3734fe95db 100644 --- a/packages/appkit/src/client.ts +++ b/packages/appkit/src/client.ts @@ -81,6 +81,7 @@ import UniversalProvider from '@walletconnect/universal-provider' import type { SessionTypes } from '@walletconnect/types' import type { UniversalProviderOpts } from '@walletconnect/universal-provider' import { W3mFrameProviderSingleton } from './auth-provider/W3MFrameProviderSingleton.js' +import { WcHelpersUtil } from './utils/HelpersUtil.js' declare global { interface Window { @@ -1294,6 +1295,20 @@ export class AppKit { this.setCaipNetwork(caipNetwork) } }) + + this.universalProvider.on('session_event', (callbackData: unknown) => { + if (WcHelpersUtil.isSessionEventData(callbackData)) { + const { name, data } = callbackData.params.event + + if (name === 'accountsChanged' && Array.isArray(data)) { + const caipAddress = CoreHelperUtil.parseCaipAddress(data[0]) + + if (caipAddress) { + this.syncAccount(caipAddress) + } + } + } + }) } } diff --git a/packages/appkit/src/tests/utils/HelpersUtil.test.ts b/packages/appkit/src/tests/utils/HelpersUtil.test.ts index b490a443fa..d6d31507cc 100644 --- a/packages/appkit/src/tests/utils/HelpersUtil.test.ts +++ b/packages/appkit/src/tests/utils/HelpersUtil.test.ts @@ -205,4 +205,27 @@ describe('WcHelpersUtil', () => { ]) }) }) + + describe('isSessionEventData', () => { + test.each([ + [undefined, false], + [{}, false], + [ + { + id: 1734112958243866, + topic: 'b2cb2748499532d9c307846c444b364dd881c959d9a080e30d63b6a76270a0f8', + params: { + event: { + name: 'accountsChanged', + data: ['eip155:1:0x53F31e8972Ebddac1553E37887C25C1b748485A6'] + }, + chainId: 'eip155:1' + } + }, + true + ] + ])('should validate session event data', (data, expected) => { + expect(WcHelpersUtil.isSessionEventData(data)).toBe(expected) + }) + }) }) diff --git a/packages/appkit/src/utils/HelpersUtil.ts b/packages/appkit/src/utils/HelpersUtil.ts index 601aea1a06..932f2336bb 100644 --- a/packages/appkit/src/utils/HelpersUtil.ts +++ b/packages/appkit/src/utils/HelpersUtil.ts @@ -101,5 +101,29 @@ export const WcHelpersUtil = { return Array.from(new Set([...chains, ...accountsChains])) }) + }, + + isSessionEventData(data: unknown): data is WcHelpersUtil.SessionEventData { + return ( + typeof data === 'object' && + data !== null && + 'id' in data && + 'topic' in data && + 'params' in data && + typeof data.params === 'object' && + data.params !== null && + 'chainId' in data.params && + 'event' in data.params && + typeof data.params.event === 'object' && + data.params.event !== null + ) + } +} + +export namespace WcHelpersUtil { + export type SessionEventData = { + id: string + topic: string + params: { chainId: string; event: { data: unknown; name: string } } } }