Skip to content

Migrate MetaMask Connector to use new SDK (MMConnect)#2326

Open
adonesky1 wants to merge 25 commits intoWeb3Auth:masterfrom
adonesky1:ad/migrate-metamask-connector
Open

Migrate MetaMask Connector to use new SDK (MMConnect)#2326
adonesky1 wants to merge 25 commits intoWeb3Auth:masterfrom
adonesky1:ad/migrate-metamask-connector

Conversation

@adonesky1
Copy link

@adonesky1 adonesky1 commented Jan 7, 2026

Summary

  • Migrate MetaMask integration from @metamask/sdk to @metamask/connect-evm for improved connection handling
  • Refactor MetaMaskConnector to use the new SDK's createEVMClient() API with built-in event handlers and automatic chain management
  • Remove manual chain addition logic as the new SDK handles this internally during switchChain()
  • Update connector settings interface to align with the new SDK's configuration options

Videos

Extension:
https://drive.google.com/file/d/1r_lDBvwHWQhP-J4yFfqVHsqRR7bIS6Z1/view?usp=sharing

Mobile (native browser):
https://drive.google.com/file/d/1XECLgCOqa9VEeIK4gp1nUf0cs6RRg2V1/view?usp=sharing


Note

Medium Risk
Mostly dependency/lockfile churn, but it changes wallet-connection plumbing (MetaMask SDK dependency swap) and alters Solana wsTarget handling, which can affect runtime connectivity.

Overview
Updates the demo apps to newer @web3auth/* package versions (notably bumping @web3auth/no-modal and @web3auth/modal) and refreshes the associated dependency graph in package-lock.json, including replacing @metamask/sdk with @metamask/connect-evm and bumping several wallet/chain libs.

In the Vue demo, rpcUrlToWsUrl no longer converts HTTPS RPC URLs to WSS (it now returns the provided URL as-is), and the Vite dev server is configured with host: true to allow external network access.

Written by Cursor Bugbot for commit 36479eb. This will update automatically on new commits. Configure here.

@vercel
Copy link

vercel bot commented Jan 7, 2026

@adonesky1 is attempting to deploy a commit to the Consensys Team on Vercel.

A member of the Team first needs to authorize it.

@adonesky1 adonesky1 marked this pull request as draft January 7, 2026 23:03
this.metamaskInstance = await this.metamaskPromise;
// TODO: Remove this hack
// Hack to ensure the ConnectEvm instance has fully resumed the connection
await new Promise((resolve) => setTimeout(resolve, 2000));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note this awful delay to ensure that this async call in the ConnectEvm constructor has fully resolved. We need to fix this on the connect-monorepo side

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is your understanding of how we resolve this on the connect-evm side of things?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we need to release connect-evm again, bump the version in web3auth, and then remove this setTimeout

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment on lines +226 to +229
// if (options.autoConnect) {
// this.rehydrated = false;
// this.emit(CONNECTOR_EVENTS.REHYDRATION_ERROR, new Error("Failed to resume existing MetaMask Connect session.") as Web3AuthError);
// } else {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think this commented code can be dropped?.. Not sure if it's more appropriate to throw an error if we fail to resume a previous session OR if we just say the connector is ready for new connections

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would think it makes more sense to just say the connector is ready for new connections. But perhaps we should speak with @chaitanyapotti to see what patterns they recommend for their connectors

@jiexi
Copy link

jiexi commented Jan 20, 2026

Need: MetaMask/connect-monorepo#124

@adonesky1 adonesky1 changed the title Update metamask connector WIP Migrate MetaMask Connector to use new SDK (MMConnect) Jan 23, 2026
@adonesky1 adonesky1 marked this pull request as ready for review January 23, 2026 22:34
Comment on lines +34 to +48
/**
* Configuration options for the MetaMask connector using @metamask/connect-evm
*/
export interface MetaMaskConnectorSettings {
/** Dapp identification and branding settings */
dapp?: {
name?: string;
url?: string;
};
/** Enable debug logging for the MetaMask SDK */
debug?: boolean;
}

export interface MetaMaskConnectorOptions extends BaseConnectorSettings {
connectorSettings?: Partial<MetaMaskSDKOptions>;
connectorSettings?: MetaMaskConnectorSettings;
Copy link

@jiexi jiexi Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reminder to document this breaking change and include migration instructions where appropriate

for (const chain of this.coreOptions.chains) {
// Convert hex chainId (0x1) to number for CAIP-2 format (eip155:1)
const numericChainId = parseInt(chain.chainId, 16);
const caipChainId = `eip155:${numericChainId}`;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can use this ready made getCaipChainId util for getting caipChainId similar to

// only set headless to true if modal SDK is used, otherwise just use the modal from native Metamask SDK
connectorFns.push(metaMaskConnector(modalMode ? { headless: true } : undefined));
// Note: The new @metamask/connect-evm SDK handles its own UI internally
connectorFns.push(metaMaskConnector());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we ideally can't use the metamask sdk ui since the ux would be very different. is there no option for headless mode?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point. thank you for the call out efd18ff

const appUrl = this.connectorSettings?.dapp?.url || window.location.origin || "https://web3auth.io";

// Initialize the MetaMask Connect EVM SDK
this.metamaskPromise = createEVMClient({
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how do we support solana?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should switch the client based on active chain / use multi-chain client and switch chain in this connector based on active chain in sdk

const supportedNetworks: Record<string, string> = {};
for (const chain of this.coreOptions.chains) {
supportedNetworks[chain.chainId] = chain.rpcTarget;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Supported networks use hex IDs instead of CAIP-2 format

Medium Severity

The comment states the supportedNetworks map uses CAIP-2 format keys (eip155:chainId), but the code uses chain.chainId directly (hex format like 0x1). The imported getCaipChainId utility — used correctly elsewhere in this file for analytics — is not applied here. If @metamask/connect-evm expects CAIP-2 keys, the SDK won't recognize any of the configured networks.

Fix in Cursor Fix in Web

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

return rpcUrl.replace("https://", "wss://");
// if (!rpcUrl) throw new Error("Please configure https endpoint for solana rpc");
// return rpcUrl.replace("https://", "wss://");
return rpcUrl;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WebSocket URL conversion commented out, wsTarget gets wrong protocol

Medium Severity

The rpcUrlToWsUrl function has had its validation and URL conversion logic commented out and now just returns the input URL unchanged. This means the wsTarget fields in all three Solana network configurations (mainnet, testnet, devnet) will contain https:// URLs instead of wss:// WebSocket URLs. The function name still implies a protocol conversion that no longer happens. This looks like a temporary debugging change that was accidentally included in the commit.

Fix in Cursor Fix in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants