Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .changeset/fluffy-ducks-arrive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
'@reown/appkit-adapter-ethers5': patch
'@reown/appkit-adapter-ethers': patch
'@reown/appkit-adapter-wagmi': patch
'pay-test-exchange': patch
'@reown/appkit-adapter-bitcoin': patch
'@reown/appkit-adapter-solana': patch
'@reown/appkit': patch
'@reown/appkit-utils': patch
'@reown/appkit-cdn': patch
'@reown/appkit-cli': patch
'@reown/appkit-codemod': patch
'@reown/appkit-common': patch
'@reown/appkit-controllers': patch
'@reown/appkit-core': patch
'@reown/appkit-experimental': patch
'@reown/appkit-pay': patch
'@reown/appkit-polyfills': patch
'@reown/appkit-scaffold-ui': patch
'@reown/appkit-siwe': patch
'@reown/appkit-siwx': patch
'@reown/appkit-testing': patch
'@reown/appkit-ui': patch
'@reown/appkit-universal-connector': patch
'@reown/appkit-wallet': patch
'@reown/appkit-wallet-button': patch
---

Introduced checksum address conversion when connecting to wallets
22 changes: 15 additions & 7 deletions packages/adapters/ethers/src/client.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import UniversalProvider from '@walletconnect/universal-provider'
import { JsonRpcProvider, formatEther } from 'ethers'
import { JsonRpcProvider, formatEther, getAddress } from 'ethers'

import { type AppKitOptions, WcConstantsUtil, WcHelpersUtil } from '@reown/appkit'
import { ConstantsUtil as CommonConstantsUtil, ParseUtil } from '@reown/appkit-common'
Expand Down Expand Up @@ -257,7 +257,7 @@ export class EthersAdapter extends AdapterBlueprint {
}

return {
address: accounts[0],
address: this.toChecksummedAddress(accounts[0]),
chainId: Number(requestChainId) || Number(chainId),
provider: selectedProvider,
type: connector.type,
Expand Down Expand Up @@ -427,13 +427,13 @@ export class EthersAdapter extends AdapterBlueprint {

if (connection.account) {
this.emit('accountChanged', {
address: connection.account.address,
address: this.toChecksummedAddress(connection.account.address),
chainId: caipNetwork.id,
connector
})

return {
address: connection.account.address,
address: this.toChecksummedAddress(connection.account.address),
chainId: caipNetwork.id,
provider: connector.provider,
type: connector.type,
Expand Down Expand Up @@ -479,7 +479,7 @@ export class EthersAdapter extends AdapterBlueprint {
})

this.emit('accountChanged', {
address: accounts[0] as Address,
address: this.toChecksummedAddress(accounts[0] as Address),
chainId: Number(chainId),
connector
})
Expand Down Expand Up @@ -511,7 +511,7 @@ export class EthersAdapter extends AdapterBlueprint {
}

this.emit('accountChanged', {
address: accounts[0] as Address,
address: this.toChecksummedAddress(accounts[0] as Address),
chainId: Number(chainId),
connector
})
Expand All @@ -528,7 +528,7 @@ export class EthersAdapter extends AdapterBlueprint {
}

return {
address: accounts[0] as Address,
address: this.toChecksummedAddress(accounts[0] as Address),
chainId: Number(chainId),
provider: selectedProvider,
type: type as ConnectorType,
Expand Down Expand Up @@ -816,4 +816,12 @@ export class EthersAdapter extends AdapterBlueprint {
params: [params]
})
}

private toChecksummedAddress(address: string) {
try {
return getAddress(address.toLowerCase() as `0x${string}`)
} catch {
return address
}
}
}
37 changes: 36 additions & 1 deletion packages/adapters/ethers/src/tests/client.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import UniversalProvider from '@walletconnect/universal-provider'
import { JsonRpcProvider } from 'ethers'
import { JsonRpcProvider, getAddress } from 'ethers'
import { type Mock, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'

import { WcConstantsUtil, WcHelpersUtil } from '@reown/appkit'
Expand Down Expand Up @@ -1176,6 +1176,41 @@ describe('EthersAdapter', () => {
expect(disconnect).toHaveBeenCalled()
expect(mockProvider.removeListener).toHaveBeenCalledWith('disconnect', expect.any(Function))
})

it('should emit accountChanged event when connected', async () => {
const emitter = new Emitter()

const mockAddress = '0xdadb0d80178819f2319190d340ce9a924f783711'
const mockProvider = {
connect: vi.fn(),
request: vi.fn().mockResolvedValue([mockAddress]),
removeListener: vi.fn(),
on: emitter.on.bind(emitter),
off: emitter.off.bind(emitter),
emit: emitter.emit.bind(emitter)
} as unknown as Provider

Object.defineProperty(adapter, 'connectors', {
value: [{ id: 'test', provider: mockProvider }]
})

const accountChangedSpy = vi.fn()

adapter.on('accountChanged', accountChangedSpy)

await adapter.connect({
id: 'test',
type: 'EXTERNAL',
chainId: 1
})

expect(accountChangedSpy).toHaveBeenCalledWith(
expect.objectContaining({
address: getAddress(mockAddress),
chainId: 1
})
)
})
})

describe('EthersAdapter - createEthersConfig', () => {
Expand Down
20 changes: 14 additions & 6 deletions packages/adapters/ethers5/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ export class Ethers5Adapter extends AdapterBlueprint {
}

return {
address: accounts[0],
address: this.toChecksummedAddress(accounts[0]),
chainId: Number(requestChainId) || Number(chainId),
provider: selectedProvider,
type: connector.type,
Expand Down Expand Up @@ -430,13 +430,13 @@ export class Ethers5Adapter extends AdapterBlueprint {

if (connection.account) {
this.emit('accountChanged', {
address: connection.account.address,
address: this.toChecksummedAddress(connection.account.address),
chainId: caipNetwork.id,
connector
})

return {
address: connection.account.address,
address: this.toChecksummedAddress(connection.account.address),
chainId: caipNetwork.id,
provider: connector.provider,
type: connector.type,
Expand Down Expand Up @@ -482,7 +482,7 @@ export class Ethers5Adapter extends AdapterBlueprint {
})

this.emit('accountChanged', {
address: accounts[0] as Address,
address: this.toChecksummedAddress(accounts[0] as Address),
chainId: Number(chainId),
connector
})
Expand Down Expand Up @@ -514,7 +514,7 @@ export class Ethers5Adapter extends AdapterBlueprint {
}

this.emit('accountChanged', {
address: accounts[0] as Address,
address: this.toChecksummedAddress(accounts[0] as Address),
chainId: Number(chainId),
connector
})
Expand All @@ -531,7 +531,7 @@ export class Ethers5Adapter extends AdapterBlueprint {
}

return {
address: accounts[0] as Address,
address: this.toChecksummedAddress(accounts[0] as Address),
chainId: Number(chainId),
provider: selectedProvider,
type: type as ConnectorType,
Expand Down Expand Up @@ -823,4 +823,12 @@ export class Ethers5Adapter extends AdapterBlueprint {
params: [params]
})
}

private toChecksummedAddress(address: string) {
try {
return ethers.utils.getAddress(address.toLowerCase() as `0x${string}`)
} catch {
return address
}
}
}
37 changes: 36 additions & 1 deletion packages/adapters/ethers5/src/tests/client.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import UniversalProvider from '@walletconnect/universal-provider'
import { providers } from 'ethers'
import { providers, utils } from 'ethers'
import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'

import { WcHelpersUtil } from '@reown/appkit'
Expand Down Expand Up @@ -1057,5 +1057,40 @@ describe('Ethers5Adapter', () => {
expect(disconnect).toHaveBeenCalled()
expect(mockProvider.removeListener).toHaveBeenCalledWith('disconnect', expect.any(Function))
})

it('should emit accountChanged event when connected', async () => {
const emitter = new Emitter()

const mockAddress = '0xdadb0d80178819f2319190d340ce9a924f783711'
const mockProvider = {
connect: vi.fn(),
request: vi.fn().mockResolvedValue([mockAddress]),
removeListener: vi.fn(),
on: emitter.on.bind(emitter),
off: emitter.off.bind(emitter),
emit: emitter.emit.bind(emitter)
} as unknown as Provider

Object.defineProperty(adapter, 'connectors', {
value: [{ id: 'test', provider: mockProvider }]
})

const accountChangedSpy = vi.fn()

adapter.on('accountChanged', accountChangedSpy)

await adapter.connect({
id: 'test',
type: 'EXTERNAL',
chainId: 1
})

expect(accountChangedSpy).toHaveBeenCalledWith(
expect.objectContaining({
address: utils.getAddress(mockAddress),
chainId: 1
})
)
})
})
})
24 changes: 14 additions & 10 deletions packages/adapters/wagmi/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
} from '@wagmi/core'
import { type Chain } from '@wagmi/core/chains'
import type UniversalProvider from '@walletconnect/universal-provider'
import { type Address, type Hex, formatUnits, parseUnits } from 'viem'
import { type Address, type Hex, checksumAddress, formatUnits, parseUnits } from 'viem'

import { AppKit, type AppKitOptions } from '@reown/appkit'
import type {
Expand Down Expand Up @@ -231,7 +231,7 @@

return {
accounts: connection.accounts.map(account => ({
address: account
address: this.toChecksummedAddress(account)
})),
caipNetwork,
connectorId: connection.connector.id,
Expand Down Expand Up @@ -314,7 +314,7 @@
}

const isEmailEnabled = appKit?.remoteFeatures?.email ?? true
const socialsEnabled =

Check warning on line 317 in packages/adapters/wagmi/src/client.ts

View workflow job for this annotation

GitHub Actions / code_style (lint)

Variable name `socialsEnabled` must have one of the following prefixes: is, has, can, should, will, did
Array.isArray(appKit?.remoteFeatures?.socials) && appKit?.remoteFeatures?.socials?.length > 0

if (isEmailEnabled || socialsEnabled) {
Expand Down Expand Up @@ -348,7 +348,7 @@
const provider = (await connector.getProvider().catch(() => undefined)) as Provider | undefined

this.emit('accountChanged', {
address,
address: this.toChecksummedAddress(address),
chainId,
connector: {
id: connector.id,
Expand Down Expand Up @@ -545,7 +545,7 @@

return {
chainId: Number(chainId),
address: res.accounts[0] as string,
address: this.toChecksummedAddress(res.accounts[0] as string),
provider: safeProvider,
type: connection?.connector.type?.toUpperCase() as ConnectorType,
id: connection?.connector.id as string
Expand All @@ -555,7 +555,7 @@

return {
chainId: Number(connection?.chainId),
address: connection?.accounts[0] as string,
address: this.toChecksummedAddress(connection?.accounts[0] as string),
provider,
type: connection?.connector.type?.toUpperCase() as ConnectorType,
id: connection?.connector.id as string
Expand Down Expand Up @@ -629,7 +629,7 @@
}))

return {
address: sortedAccounts[0],
address: this.toChecksummedAddress(sortedAccounts[0]),
chainId: connection.chainId,
provider: provider as Provider,
type: type as ConnectorType,
Expand All @@ -645,7 +645,7 @@
})

return {
address: res.accounts[0],
address: this.toChecksummedAddress(res.accounts[0]),
chainId: res.chainId,
provider: provider as Provider,
type: type as ConnectorType,
Expand All @@ -656,7 +656,7 @@
public override get connections(): Connection[] {
return Array.from(this.wagmiConfig.state.connections.values()).map(connection => ({
accounts: connection.accounts.map(account => ({
address: account
address: this.toChecksummedAddress(account)
})),
connectorId: connection.connector.id
}))
Expand Down Expand Up @@ -755,7 +755,7 @@
connections: [
{
accounts: connection.accounts.map(account => ({
address: account
address: this.toChecksummedAddress(account)
})),
connectorId: connection.connector.id
}
Expand Down Expand Up @@ -792,7 +792,7 @@
.filter(connection => connection.status === 'fulfilled')
.map(({ value: connection }) => ({
accounts: connection.accounts.map(account => ({
address: account
address: this.toChecksummedAddress(account)
})),
connectorId: connection.connector.id
}))
Expand Down Expand Up @@ -976,4 +976,8 @@

return Promise.resolve()
}

private toChecksummedAddress(address: string) {
return checksumAddress(address.toLowerCase() as `0x${string}`)
}
}
5 changes: 3 additions & 2 deletions packages/adapters/wagmi/src/tests/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
import * as wagmiCore from '@wagmi/core'
import { mainnet } from '@wagmi/core/chains'
import type UniversalProvider from '@walletconnect/universal-provider'
import { checksumAddress } from 'viem'
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'

import { type AppKitNetwork, type CaipAddress, ConstantsUtil } from '@reown/appkit-common'
Expand Down Expand Up @@ -1138,7 +1139,7 @@ describe('WagmiAdapter', () => {
await vi.waitFor(() => {
expect(accountChangedSpy).toHaveBeenCalledWith(
expect.objectContaining({
address: currAccount.address,
address: checksumAddress(currAccount.address as `0x${string}`),
chainId: currAccount.chainId
})
)
Expand Down Expand Up @@ -1188,7 +1189,7 @@ describe('WagmiAdapter', () => {
await vi.waitFor(() => {
expect(accountChangedSpy).toHaveBeenCalledWith(
expect.objectContaining({
address: currAccount.address,
address: checksumAddress(currAccount.address as `0x${string}`),
chainId: currAccount.chainId
})
)
Expand Down
Loading