Skip to content

Commit

Permalink
:fix switch network improvements & wagmi to recognize wc session (#3299)
Browse files Browse the repository at this point in the history
  • Loading branch information
svenvoskamp authored Nov 22, 2024
1 parent 479fdb6 commit 093a1a6
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 14 deletions.
24 changes: 24 additions & 0 deletions .changeset/hungry-frogs-rhyme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
'@reown/appkit-adapter-wagmi': patch
'@reown/appkit-scaffold-ui': patch
'@apps/laboratory': patch
'@reown/appkit': patch
'@reown/appkit-core': patch
'@reown/appkit-siwe': patch
'@apps/demo': patch
'@apps/gallery': patch
'@reown/appkit-adapter-ethers': patch
'@reown/appkit-adapter-ethers5': patch
'@reown/appkit-adapter-polkadot': patch
'@reown/appkit-adapter-solana': patch
'@reown/appkit-utils': patch
'@reown/appkit-cdn': patch
'@reown/appkit-common': patch
'@reown/appkit-experimental': patch
'@reown/appkit-polyfills': patch
'@reown/appkit-siwx': patch
'@reown/appkit-ui': patch
'@reown/appkit-wallet': patch
---

Resolve cases where wagmi doesn't recognize wc session and unable to switch from unsupported network"
1 change: 1 addition & 0 deletions apps/laboratory/src/components/Siwe/SiweData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import type { SIWESession } from '@reown/appkit-siwe'

export function SiweData() {
const { data, status } = useSession()

const session = data as unknown as SIWESession

return (
Expand Down
9 changes: 5 additions & 4 deletions packages/adapters/wagmi/src/connectors/UniversalConnector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,14 +276,14 @@ export function walletConnect(
}

try {
if (chainToSwitch?.caipNetworkId) {
provider.setDefaultChain(chainToSwitch?.caipNetworkId as string)
}

await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: numberToHex(chainId) }]
})

if (chainToSwitch?.caipNetworkId) {
provider.setDefaultChain(chainToSwitch?.caipNetworkId as string)
}
config.emitter.emit('change', { chainId: Number(chainId) })

const requestedChains = await this.getRequestedChainsIds()
Expand Down Expand Up @@ -418,6 +418,7 @@ export function walletConnect(
}

const connectorChains = config.chains.map(x => x.id)

const namespaceChains = this.getNamespaceChainsIds()

if (namespaceChains.length && !namespaceChains.some(id => connectorChains.includes(id))) {
Expand Down
15 changes: 11 additions & 4 deletions packages/appkit/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -934,6 +934,7 @@ export class AppKit {
>(ChainController.state.activeChain as ChainNamespace)
const providerType =
ProviderUtil.state.providerIds[ChainController.state.activeChain as ChainNamespace]

await adapter?.switchNetwork({ caipNetwork, provider, providerType })
this.setCaipNetwork(caipNetwork)
await this.syncAccount({
Expand Down Expand Up @@ -1282,10 +1283,16 @@ export class AppKit {
chainId: ChainController.state.activeCaipNetwork?.id as string | number
})
} catch (error) {
adapter?.switchNetwork({
provider: this.universalProvider,
caipNetwork: ChainController.state.activeCaipNetwork as CaipNetwork
})
/**
* Handle edge case where wagmi detects existing connection but lacks to complete UniversalProvider instance.
* Connection attempt fails due to already connected state - reconnect to restore provider state.
*/
if (adapter?.reconnect) {
adapter?.reconnect({
id: 'walletConnect',
type: 'WALLET_CONNECT'
})
}
}
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/utils/SIWXUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export const SIWXUtil = {

try {
const sessions = await siwx.getSessions(`${network}:${chainId}` as CaipNetworkId, address)

if (sessions.length) {
return
}
Expand Down
7 changes: 6 additions & 1 deletion packages/scaffold-ui/src/modal/w3m-modal/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,12 @@ export class W3mModal extends LitElement {
const prevCaipNetworkId = this.caipNetwork?.caipNetworkId?.toString()
const nextNetworkId = nextCaipNetwork?.caipNetworkId?.toString()

if (prevCaipNetworkId && nextNetworkId && prevCaipNetworkId !== nextNetworkId) {
if (
prevCaipNetworkId &&
nextNetworkId &&
prevCaipNetworkId !== nextNetworkId &&
this.caipNetwork?.name !== 'Unknown Network'
) {
RouterController.goBack()
}
this.caipNetwork = nextCaipNetwork
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,16 @@ export class W3mUnsupportedChainView extends LitElement {
'supportsAllNetworks',
network.chainNamespace
)
const caipNetwork = ChainController.state.activeCaipNetwork

const routerData = RouterController.state.data

if (caipAddress && caipNetwork?.caipNetworkId !== network.caipNetworkId) {
if (caipAddress) {
if (approvedCaipNetworkIds?.includes(network.caipNetworkId)) {
await ChainController.switchActiveNetwork(network)
} else if (supportsAllNetworks) {
RouterController.push('SwitchNetwork', { ...routerData, network })
} else {
RouterController.push('SwitchNetwork', { ...routerData, network })
}
} else if (!caipAddress) {
ChainController.setActiveCaipNetwork(network)
Expand Down
17 changes: 14 additions & 3 deletions packages/siwe/src/mapToSIWX.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,11 @@ export function mapToSIWX(siwe: AppKitSIWEClient): SIWXConfig {
}

const session = await getSession()
const isDifferentAddress =
session && session.address !== CoreHelperUtil.getPlainAddress(activeCaipAddress)

const compareSessionAddress = session?.address.toLowerCase()
const compareCaipAddress = CoreHelperUtil?.getPlainAddress(activeCaipAddress)?.toLowerCase()

const isDifferentAddress = session && compareSessionAddress !== compareCaipAddress

if (isDifferentAddress) {
await siwe.methods.signOut()
Expand Down Expand Up @@ -146,7 +149,15 @@ export function mapToSIWX(siwe: AppKitSIWEClient): SIWXConfig {
const siweSession = await getSession()

const siweCaipNetworkId = `eip155:${siweSession?.chainId}`
if (!siweSession || siweSession.address !== address || siweCaipNetworkId !== chainId) {

const compareSessionAddress = siweSession?.address.toLowerCase()
const compareCaipAddress = address?.toLowerCase()

if (
!siweSession ||
compareSessionAddress !== compareCaipAddress ||
siweCaipNetworkId !== chainId
) {
return []
}

Expand Down

0 comments on commit 093a1a6

Please sign in to comment.