Skip to content
Open
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
30 changes: 30 additions & 0 deletions .changeset/wide-plums-yell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
'@reown/appkit-adapter-ethers5': patch
'@reown/appkit-adapter-ethers': patch
'@reown/appkit': patch
'@reown/appkit-adapter-bitcoin': patch
'@reown/appkit-adapter-solana': patch
'@reown/appkit-adapter-ton': patch
'@reown/appkit-adapter-tron': patch
'@reown/appkit-adapter-wagmi': 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
---

Fix Coinbase Wallet and Base Account not reconnecting on page reload with ethers and ethers5 adapters
15 changes: 15 additions & 0 deletions packages/adapters/ethers/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,17 @@ export class EthersAdapter extends AdapterBlueprint {
if (enableBaseAccount !== false) {
// Do not initialize provider to prevent unnecessary api calls - lazy load
this.ethersProviders.baseAccount = new BaseProvider()
if (this.hasStoredConnection(CommonConstantsUtil.CONNECTOR_ID.BASE_ACCOUNT)) {
await this.ethersProviders.baseAccount.initialize()
}
}

if (enableCoinbase !== false) {
// Do not initialize provider to prevent unnecessary api calls - lazy load
this.ethersProviders.coinbaseWallet = new CoinbaseWalletProvider()
if (this.hasStoredConnection(CommonConstantsUtil.CONNECTOR_ID.COINBASE)) {
await this.ethersProviders.coinbaseWallet.initialize()
}
}

if (CoreHelperUtil.isSafeApp()) {
Expand All @@ -101,6 +107,15 @@ export class EthersAdapter extends AdapterBlueprint {
}
}

private hasStoredConnection(connectorId: string) {
const { hasConnected, hasDisconnected } = HelpersUtil.getConnectorStorageInfo(
connectorId,
this.namespace as ChainNamespace
)

return hasConnected && !hasDisconnected
}

public async signMessage(
params: AdapterBlueprint.SignMessageParams
): Promise<AdapterBlueprint.SignMessageResult> {
Expand Down
72 changes: 72 additions & 0 deletions packages/adapters/ethers/src/tests/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1431,5 +1431,77 @@ describe('EthersAdapter', () => {

expect(providers?.safe).toBeDefined()
})

it('should initialize coinbase wallet provider if the user was previously connected with it', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: mockEthersConfig.metadata
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockImplementation(connectorId => ({
hasConnected: connectorId === CommonConstantsUtil.CONNECTOR_ID.COINBASE,
hasDisconnected: false
}))

const providers = await adapter['createEthersConfig']()

expect(providers?.coinbaseWallet?.initialize).toHaveBeenCalledTimes(1)
expect(providers?.baseAccount?.initialize).not.toHaveBeenCalled()
})

it('should initialize base account provider if the user was previously connected with it', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: mockEthersConfig.metadata
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockImplementation(connectorId => ({
hasConnected: connectorId === CommonConstantsUtil.CONNECTOR_ID.BASE_ACCOUNT,
hasDisconnected: false
}))

const providers = await adapter['createEthersConfig']()

expect(providers?.baseAccount?.initialize).toHaveBeenCalledTimes(1)
expect(providers?.coinbaseWallet?.initialize).not.toHaveBeenCalled()
})

it('should not initialize coinbase wallet and base account providers if the user was never connected with them', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: mockEthersConfig.metadata
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockReturnValue({
hasConnected: false,
hasDisconnected: false
})

const providers = await adapter['createEthersConfig']()

expect(providers?.coinbaseWallet?.initialize).not.toHaveBeenCalled()
expect(providers?.baseAccount?.initialize).not.toHaveBeenCalled()
})

it('should not initialize coinbase wallet and base account providers if the user explicitly disconnected them', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: mockEthersConfig.metadata
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockReturnValue({
hasConnected: true,
hasDisconnected: true
})

const providers = await adapter['createEthersConfig']()

expect(providers?.coinbaseWallet?.initialize).not.toHaveBeenCalled()
expect(providers?.baseAccount?.initialize).not.toHaveBeenCalled()
})
})
})
15 changes: 15 additions & 0 deletions packages/adapters/ethers5/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,17 @@ export class Ethers5Adapter extends AdapterBlueprint {
if (enableBaseAccount !== false) {
// Do not initialize provider to prevent unnecessary api calls - lazy load
this.ethersProviders.baseAccount = new BaseProvider()
if (this.hasStoredConnection(CommonConstantsUtil.CONNECTOR_ID.BASE_ACCOUNT)) {
await this.ethersProviders.baseAccount.initialize()
}
}

if (enableCoinbase !== false) {
// Do not initialize provider to prevent unnecessary api calls - lazy load
this.ethersProviders.coinbaseWallet = new CoinbaseWalletProvider()
if (this.hasStoredConnection(CommonConstantsUtil.CONNECTOR_ID.COINBASE)) {
await this.ethersProviders.coinbaseWallet.initialize()
}
}

if (CoreHelperUtil.isSafeApp()) {
Expand All @@ -98,6 +104,15 @@ export class Ethers5Adapter extends AdapterBlueprint {
}
}

private hasStoredConnection(connectorId: string) {
const { hasConnected, hasDisconnected } = HelpersUtil.getConnectorStorageInfo(
connectorId,
this.namespace as ChainNamespace
)

return hasConnected && !hasDisconnected
}

public async signMessage(
params: AdapterBlueprint.SignMessageParams
): Promise<AdapterBlueprint.SignMessageResult> {
Expand Down
92 changes: 92 additions & 0 deletions packages/adapters/ethers5/src/tests/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1247,5 +1247,97 @@ describe('Ethers5Adapter', () => {

expect(providers?.safe).toBeDefined()
})

it('should initialize coinbase wallet provider if the user was previously connected with it', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: {
name: 'Test App',
description: 'Test Description',
url: 'https://test.com',
icons: ['https://test.com/icon.png']
}
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockImplementation(connectorId => ({
hasConnected: connectorId === CommonConstantsUtil.CONNECTOR_ID.COINBASE,
hasDisconnected: false
}))

const providers = await adapter['createEthersConfig']()

expect(providers?.coinbaseWallet?.initialize).toHaveBeenCalledTimes(1)
expect(providers?.baseAccount?.initialize).not.toHaveBeenCalled()
})

it('should initialize base account provider if the user was previously connected with it', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: {
name: 'Test App',
description: 'Test Description',
url: 'https://test.com',
icons: ['https://test.com/icon.png']
}
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockImplementation(connectorId => ({
hasConnected: connectorId === CommonConstantsUtil.CONNECTOR_ID.BASE_ACCOUNT,
hasDisconnected: false
}))

const providers = await adapter['createEthersConfig']()

expect(providers?.baseAccount?.initialize).toHaveBeenCalledTimes(1)
expect(providers?.coinbaseWallet?.initialize).not.toHaveBeenCalled()
})

it('should not initialize coinbase wallet and base account providers if the user was never connected with them', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: {
name: 'Test App',
description: 'Test Description',
url: 'https://test.com',
icons: ['https://test.com/icon.png']
}
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockReturnValue({
hasConnected: false,
hasDisconnected: false
})

const providers = await adapter['createEthersConfig']()

expect(providers?.coinbaseWallet?.initialize).not.toHaveBeenCalled()
expect(providers?.baseAccount?.initialize).not.toHaveBeenCalled()
})

it('should not initialize coinbase wallet and base account providers if the user explicitly disconnected them', async () => {
vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({
...OptionsController.state,
enableCoinbase: true,
enableBaseAccount: true,
metadata: {
name: 'Test App',
description: 'Test Description',
url: 'https://test.com',
icons: ['https://test.com/icon.png']
}
})
vi.spyOn(HelpersUtil, 'getConnectorStorageInfo').mockReturnValue({
hasConnected: true,
hasDisconnected: true
})

const providers = await adapter['createEthersConfig']()

expect(providers?.coinbaseWallet?.initialize).not.toHaveBeenCalled()
expect(providers?.baseAccount?.initialize).not.toHaveBeenCalled()
})
})
})
Loading