Skip to content

Commit

Permalink
fix: universal provider accounts changed event (#3462)
Browse files Browse the repository at this point in the history
Co-authored-by: tomiir <rocchitomas@gmail.com>
  • Loading branch information
zoruka and tomiir authored Dec 16, 2024
1 parent 14af422 commit 69fcf27
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 1 deletion.
22 changes: 22 additions & 0 deletions .changeset/swift-melons-cover.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
'@reown/appkit': patch
'@reown/appkit-core': patch
'@reown/appkit-adapter-ethers': patch
'@reown/appkit-adapter-ethers5': patch
'@reown/appkit-adapter-solana': patch
'@reown/appkit-adapter-wagmi': patch
'@reown/appkit-utils': patch
'@reown/appkit-cdn': patch
'@reown/appkit-cli': patch
'@reown/appkit-common': patch
'@reown/appkit-experimental': patch
'@reown/appkit-polyfills': patch
'@reown/appkit-scaffold-ui': patch
'@reown/appkit-siwe': patch
'@reown/appkit-siwx': patch
'@reown/appkit-ui': patch
'@reown/appkit-wallet': patch
'@reown/appkit-wallet-button': patch
---

Adds parsing of Universal Provider session_event to get accountsChanged event
18 changes: 17 additions & 1 deletion packages/appkit/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ import {
type ChainNamespace,
type CaipAddress,
type CaipNetworkId,
NetworkUtil
NetworkUtil,
ParseUtil
} from '@reown/appkit-common'
import type { AppKitOptions } from './utils/TypesUtil.js'
import {
Expand All @@ -81,6 +82,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 {
Expand Down Expand Up @@ -1286,6 +1288,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) &&
CoreHelperUtil.isCaipAddress(data[0])
) {
this.syncAccount(ParseUtil.parseCaipAddress(data[0]))
}
}
})
}
}

Expand Down
23 changes: 23 additions & 0 deletions packages/appkit/src/tests/utils/HelpersUtil.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
})
})
24 changes: 24 additions & 0 deletions packages/appkit/src/utils/HelpersUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 } }
}
}
14 changes: 14 additions & 0 deletions packages/core/src/utils/CoreHelperUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -357,5 +357,19 @@ export const CoreHelperUtil = {
address,
type
} as AccountTypeMap[N]
},

isCaipAddress(address?: unknown): address is CaipAddress {
if (typeof address !== 'string') {
return false
}

const sections = address.split(':')
const namespace = sections[0]

return (
sections.filter(Boolean).length === 3 &&
(namespace as string) in CommonConstants.CHAIN_NAME_MAP
)
}
}
14 changes: 14 additions & 0 deletions packages/core/tests/utils/CoreHelperUtil.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,18 @@ describe('CoreHelperUtil', () => {
global.window.self = originalSelf
}
})

it.each([
[undefined, false],
[{}, false],
['0x0', false],
['eip155::mock_address', false],
['eip155:mock_chain_id:', false],
['invalid_namespace:mock_chain_id:address', false],
['eip155:mock_chain_id:mock_address', true],
['solana:mock_chain_id:mock_address', true],
['bip122:mock_chain_id:mock_address', true]
])('should validate the value $s is valid caip address $b', (caipAddress, expected) => {
expect(CoreHelperUtil.isCaipAddress(caipAddress)).toEqual(expected)
})
})

0 comments on commit 69fcf27

Please sign in to comment.