Bug Description
@metamask/connect-evm v0.9.0 does not work on React Native because it resolves to the browser transport (windowPostMessageTransport) instead of the React Native WebSocket transport.
Root Cause
The package resolution chain breaks on React Native:
-
@metamask/connect-evm has no react-native export in package.json:
// connect-evm/package.json exports
".": {
"import": "...",
"require": "...",
"default": "..."
// ❌ No "react-native" condition
}
-
@metamask/multichain-api-client also has no react-native export:
// multichain-api-client/package.json exports
".": {
"import": "...",
"require": "..."
// ❌ No "react-native" condition
}
-
@metamask/connect-multichain does have a react-native export with WebSocketTransport (using wss://mm-sdk-relay.api.cx.metamask.io), but it's never reached because:
-
The DefaultTransport class in connect-multichain imports getDefaultTransport() from @metamask/multichain-api-client, which always returns windowPostMessageTransport — a browser-only transport using window.postMessage().
Result
On React Native:
client.connect() hangs indefinitely — window.postMessage() is a no-op
window.addEventListener('message', ...) never receives responses
- MetaMask deep link is never triggered (the SDK never reaches that code path)
- No error is thrown — the connection just silently hangs
Expected Behavior
createEVMClient() should use the WebSocketTransport (Centrifuge relay at wss://mm-sdk-relay.api.cx.metamask.io) when running on React Native, as shown in the React Native quickstart docs.
Environment
@metamask/connect-evm: 0.9.0
@metamask/connect-multichain: 0.11.0 (bundled)
@metamask/multichain-api-client: 0.3.0
@metamask/mobile-wallet-protocol-core: 0.4.0
- React Native: 0.81.5
- Expo: 54
- Metro bundler
- Android (Samsung Galaxy)
Suggested Fix
Add "react-native" condition to the exports field in both:
@metamask/connect-evm/package.json
@metamask/multichain-api-client/package.json
Or ensure DefaultTransport in connect-multichain checks the platform and uses WebSocketTransport when window.postMessage is not available (i.e., React Native environment).
Reproduction
npx expo init test-app
cd test-app
npm install @metamask/connect-evm react-native-get-random-values readable-stream
npx expo prebuild
import { createEVMClient } from '@metamask/connect-evm';
const client = await createEVMClient({
dapp: { name: 'Test', url: 'https://test.com' },
api: { supportedNetworks: { '0x1': 'https://eth.llamarpc.com' } },
mobile: { preferredOpenLink: (url) => Linking.openURL(url) },
});
// This hangs forever — never opens MetaMask
await client.connect({ chainIds: ['0x1'] });
Bug Description
@metamask/connect-evmv0.9.0 does not work on React Native because it resolves to the browser transport (windowPostMessageTransport) instead of the React Native WebSocket transport.Root Cause
The package resolution chain breaks on React Native:
@metamask/connect-evmhas noreact-nativeexport inpackage.json:@metamask/multichain-api-clientalso has noreact-nativeexport:@metamask/connect-multichaindoes have areact-nativeexport withWebSocketTransport(usingwss://mm-sdk-relay.api.cx.metamask.io), but it's never reached because:The
DefaultTransportclass inconnect-multichainimportsgetDefaultTransport()from@metamask/multichain-api-client, which always returnswindowPostMessageTransport— a browser-only transport usingwindow.postMessage().Result
On React Native:
client.connect()hangs indefinitely —window.postMessage()is a no-opwindow.addEventListener('message', ...)never receives responsesExpected Behavior
createEVMClient()should use theWebSocketTransport(Centrifuge relay atwss://mm-sdk-relay.api.cx.metamask.io) when running on React Native, as shown in the React Native quickstart docs.Environment
@metamask/connect-evm: 0.9.0@metamask/connect-multichain: 0.11.0 (bundled)@metamask/multichain-api-client: 0.3.0@metamask/mobile-wallet-protocol-core: 0.4.0Suggested Fix
Add
"react-native"condition to theexportsfield in both:@metamask/connect-evm/package.json@metamask/multichain-api-client/package.jsonOr ensure
DefaultTransportinconnect-multichainchecks the platform and usesWebSocketTransportwhenwindow.postMessageis not available (i.e., React Native environment).Reproduction
npx expo init test-app cd test-app npm install @metamask/connect-evm react-native-get-random-values readable-stream npx expo prebuild