Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: use metamask sdk on mobile #399

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
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
4 changes: 2 additions & 2 deletions examples/cra/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-scripts": "5.0.1",
"viem": "^2.13.0",
"wagmi": "^2.10.2",
"viem": "^2.17.0",
"wagmi": "^2.11.0",
"web-vitals": "^2.1.4"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions examples/nextjs-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"next": "14.0.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"viem": "^2.13.0",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
},
"devDependencies": {
"@types/node": "^18.19.3",
Expand Down
4 changes: 2 additions & 2 deletions examples/nextjs-siwe/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"siwe": "^2.1.4",
"viem": "^2.13.0",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
},
"devDependencies": {
"@types/node": "18.7.18",
Expand Down
4 changes: 2 additions & 2 deletions examples/nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"next": "14.0.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"viem": "^2.13.0",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
},
"devDependencies": {
"@types/node": "^18.19.3",
Expand Down
4 changes: 2 additions & 2 deletions examples/testbench/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
"next": "14.1.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"viem": "^2.13.6",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
},
"devDependencies": {
"@types/node": "18.7.18",
Expand Down
4 changes: 2 additions & 2 deletions examples/vite/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
"connectkit": "workspace:packages/connectkit",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"viem": "^2.13.0",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
},
"devDependencies": {
"@types/react": "^18.0.17",
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@
"rollup-plugin-visualizer": "^5.5.4",
"tslib": "^1.9.3",
"typescript-plugin-styled-components": "^2.0.0",
"viem": "^2.13.0",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
},
"packageManager": "yarn@3.2.0",
"dependencies": {
Expand Down
2 changes: 1 addition & 1 deletion packages/connectkit-next-siwe/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
],
"dependencies": {
"iron-session": "^6.2.1",
"viem": "^2.13.0"
"viem": "^2.17.0"
},
"peerDependencies": {
"connectkit": ">=1.2.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/connectkit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
"resolutions": {
"react": "^18.0.0",
"react-dom": "^18.0.0",
"viem": "^2.13.0",
"wagmi": "^2.10.2"
"viem": "^2.17.0",
"wagmi": "^2.11.0"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { WalletProps, useWallets } from '../../../wallets/useWallets';
import {
detectBrowser,
isCoinbaseWalletConnector,
isMetaMaskConnector,
isWalletConnectConnector,
} from '../../../utils';
import { useLastConnector } from '../../../hooks/useLastConnector';
Expand Down Expand Up @@ -104,8 +105,11 @@ const ConnectorItem = ({
const redirectToMoreWallets = isMobile && isWalletConnectConnector(wallet.id);
// Safari requires opening popup on user gesture, so we connect immediately here
const shouldConnectImmediately =
(detectBrowser() === 'safari' || detectBrowser() === 'ios') &&
isCoinbaseWalletConnector(wallet.connector.id);
(wallet.isInstalled &&
(detectBrowser() === 'safari' || detectBrowser() === 'ios') &&
// TODO: convert this to a flag in the configs
isCoinbaseWalletConnector(wallet.connector.id)) ||
(isMobile && isMetaMaskConnector(wallet.connector.id));

if (redirectToMoreWallets || shouldConnectImmediately) deeplink = undefined; // mobile redirects to more wallets page

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useWalletConnectModal } from '../../hooks/useWalletConnectModal';
import {
detectBrowser,
isCoinbaseWalletConnector,
isMetaMaskConnector,
isWalletConnectConnector,
} from '../../utils';

Expand Down Expand Up @@ -37,7 +38,9 @@ const ConnectWithQRCode: React.FC<{
} = useWeb3();

const wcUri = getUri(id);
const uri = wcUri
const uri = isMetaMaskConnector(id)
? wcUri // TODO: Rename this, in this case it will actually be the MetaMask URI
: wcUri
? wallet?.getWalletConnectDeeplink?.(wcUri) ?? wcUri
: undefined;

Expand Down
7 changes: 7 additions & 0 deletions packages/connectkit/src/components/contexts/web3/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { useAccount } from 'wagmi';
import { useChains } from '../../../hooks/useChains';
import { useWalletConnectUri } from '../../../hooks/connectors/useWalletConnectUri';
import { useChainIsSupported } from '../../../hooks/useChainIsSupported';
import { useMetaMaskUri } from '../../../hooks/connectors/useMetaMaskUri';
import { isMetaMaskConnector } from '../../../utils';

type Web3Context = {
connect: {
Expand Down Expand Up @@ -45,6 +47,10 @@ export const Web3ContextProvider = ({
const { uri: walletConnectUri } = useWalletConnectUri({
enabled,
});
const { uri: metaMaskUri } = useMetaMaskUri({
enabled,
//enabled: enabled && !isMobile,
});

const { address: currentAddress, chain } = useAccount();
const chainIsSupported = useChainIsSupported(chain?.id);
Expand All @@ -53,6 +59,7 @@ export const Web3ContextProvider = ({
const value = {
connect: {
getUri: (id?: string) => {
if (isMetaMaskConnector(id)) return metaMaskUri;
return walletConnectUri;
},
},
Expand Down
17 changes: 15 additions & 2 deletions packages/connectkit/src/defaultConnectors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CreateConnectorFn } from 'wagmi';
import {
injected,
metaMask,
walletConnect,
coinbaseWallet,
CoinbaseWalletParameters,
Expand Down Expand Up @@ -40,7 +40,20 @@ const defaultConnectors = ({

// Add the rest of the connectors
connectors.push(
injected({ target: 'metaMask' }),
metaMask({
dappMetadata: {
name: app.name,
iconUrl: app.icon,
//source: "connectkit"
},
// disables metamask modal
extensionOnly: true,
modals: {
install: () => {
return {};
},
},
}),
coinbaseWallet({
appName: app.name,
appLogoUrl: app.icon,
Expand Down
89 changes: 89 additions & 0 deletions packages/connectkit/src/hooks/connectors/useMetaMaskUri.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { useState, useEffect } from 'react';

import { Connector, useAccount } from 'wagmi';
import { useConnect } from './../useConnect';
import { useContext } from '../../components/ConnectKit';
import { useMetaMaskConnector } from './../useConnectors';

type Props = {
enabled?: boolean;
};

export function useMetaMaskUri(
{ enabled }: Props = {
enabled: true,
}
) {
const { log } = useContext();

const [uri, setUri] = useState<string | undefined>(undefined);

const connector = useMetaMaskConnector();

const { isConnected } = useAccount();
const { connectAsync } = useConnect();

useEffect(() => {
if (typeof window !== 'undefined' && !window.mmsdk) return;
if (window.mmsdk?.isExtensionActive()) return;
if (!enabled) return;

async function handleMessage(message) {
const { type, data } = message;
log('MM Message', message);
if (type === 'display_uri') {
setUri(data);
}
}
async function handleDisconnect() {
log('MM Disconnect');

if (connector) connect(connector);
}

async function connect(connector: Connector) {
console.log('connect');
const result = await connectAsync({ connector });
if (result) return result;
return false;
}

async function tryConnect(connector: Connector) {
console.log('tryConnect');
try {
await connect(connector);
} catch (error: any) {
log('catch error');
log(error);
if (error.code) {
switch (error.code) {
case 4001:
log('error.code - User rejected');
break;
default:
log('error.code - Unknown Error');
break;
}
} else {
// Sometimes the error doesn't respond with a code
log('MetaMask Wallet cannot connect.', error);
}
}
}

if (!connector || uri) return;
if (connector && !isConnected) {
tryConnect(connector);
connector.emitter.on('message', handleMessage);
connector.emitter.on('disconnect', handleDisconnect);
return () => {
connector.emitter.off('message', handleMessage);
connector.emitter.off('disconnect', handleDisconnect);
};
}
}, [enabled, connector, isConnected]);

return {
uri,
};
}
2 changes: 1 addition & 1 deletion packages/connectkit/src/hooks/useConnectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,5 @@ export function useMetaMaskConnector() {
UNSTABLE_shimOnConnectSelectAccount: true,
}
*/
return useConnector('metaMask');
return useConnector('metaMaskSDK');
}
13 changes: 10 additions & 3 deletions packages/connectkit/src/wallets/useWallets.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import { Connector } from 'wagmi';
import { useConnectors } from '../hooks/useConnectors';
import { walletConfigs, WalletConfigProps } from './walletConfigs';
import { useContext } from '../components/ConnectKit';
import { isCoinbaseWalletConnector, isInjectedConnector } from '../utils';
import {
isCoinbaseWalletConnector,
isInjectedConnector,
isMetaMaskConnector,
isMobile,
} from '../utils';

export type WalletProps = {
id: string;
Expand Down Expand Up @@ -47,8 +52,10 @@ export const useWallets = (): WalletProps[] => {
iconShape: 'squircle',
isInstalled:
connector.type === 'mock' ||
(connector.type === 'injected' && connector.id !== 'metaMask') ||
isCoinbaseWalletConnector(connector.id), // always run coinbase wallet SDK
connector.type === 'injected' ||
// TODO: convert this to a flag in the configs
isCoinbaseWalletConnector(connector.id) || // always run coinbase wallet SDK ||
(isMobile() && isMetaMaskConnector(connector.id)), // always run metamask SDK
};

if (walletId) {
Expand Down
4 changes: 2 additions & 2 deletions packages/cra-template/template.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
"@types/react-dom": "^18.0.0",
"connectkit": "latest",
"typescript": "^5.0.4",
"viem": "^2.13.0",
"wagmi": "^2.10.2",
"viem": "^2.17.0",
"wagmi": "^2.11.0",
"web-vitals": "^2.1.0"
},
"eslintConfig": {
Expand Down
Loading
Loading