Skip to content
Draft
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
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ module.exports = {
{
files: ['src/**/*.js'],
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
},
},
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ node_modules
dist
.eslintcache
.DS_Store
.worktrees
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v18
v20.19.1
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ It can be used by navigating to `/request.html?method=${METHOD}&params=${PARAMS}

### Setup

- Install [Node.js](https://nodejs.org) version 16
- Install [Node.js](https://nodejs.org) version 20.19.0 or later
- If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you.
- Install [Yarn v1](https://yarnpkg.com/en/docs/install)
- Run `yarn setup` to install dependencies and run any required post-install scripts
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "9.9.0",
"description": "A simple dapp used in MetaMask e2e tests.",
"engines": {
"node": ">= 18.0.0"
"node": ">=20.19.0"
},
"scripts": {
"setup": "yarn install && yarn allow-scripts",
Expand Down Expand Up @@ -42,6 +42,7 @@
"@lavamoat/allow-scripts": "^2.5.1",
"@lavamoat/preinstall-always-fail": "^2.0.0",
"@metamask/auto-changelog": "^2.5.0",
"@metamask/connect-evm": "^1.4.0",
"@metamask/eslint-config": "^6.0.0",
"@metamask/eslint-config-nodejs": "^6.0.0",
"@metamask/eth-sig-util": "^7.0.1",
Expand Down
5 changes: 5 additions & 0 deletions src/components/connections/connections.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ export function connectionsComponent(parentContainer) {
>
SDK Connect
</button>
<button
class="btn btn-primary btn-lg btn-block mb-3"
id="connectEvm"
>MetaMask Connect</button>
<hr />
<button
class="btn btn-primary btn-lg btn-block mb-3"
Expand All @@ -51,6 +55,7 @@ export function connectionsComponent(parentContainer) {
const onboardButton = document.getElementById('connectButton');
const walletConnectBtn = document.getElementById('walletConnect');
const sdkConnectBtn = document.getElementById('sdkConnect');
const connectEvmBtn = document.getElementById('connectEvm');
*/
const getAccounts = document.getElementById('getAccounts');
const getAccountsResult = document.getElementById('getAccountsResult');
Expand Down
130 changes: 130 additions & 0 deletions src/connect-evm.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import { createEVMClient } from '@metamask/connect-evm';
import dappMetadata from './dapp-metadata';
import globalContext, {
handleNewAccounts,
handleNewProviderDetail,
removeProviderDetail,
setActiveProviderDetail,
updateFormElements,
} from '.';

export const CONNECT_EVM_PROVIDER_NAME = 'connect-evm';
export const CONNECT_EVM_PROVIDER_UUID = 'connect-evm';

export const CONNECT_EVM_SUPPORTED_NETWORKS = {
'0x1': 'https://ethereum.publicnode.com',
'0xaa36a7': 'https://ethereum-sepolia.publicnode.com',
'0xa': 'https://optimism.publicnode.com',
'0x89': 'https://polygon-bor-rpc.publicnode.com',
'0x2105': 'https://base.publicnode.com',
'0xa4b1': 'https://arbitrum-one.publicnode.com',
'0xa86a': 'https://avalanche-c-chain-rpc.publicnode.com',
'0x38': 'https://bsc-dataseed.binance.org',
'0x539': 'http://127.0.0.1:8545',
'0x53a': 'http://127.0.0.1:8546',
};

export const CONNECT_EVM_CHAIN_IDS = Object.keys(
CONNECT_EVM_SUPPORTED_NETWORKS,
);

let connectEvmClientPromise;
let connectEvmClient;
let connectEvmProvider;

const noop = () => undefined;

async function getConnectEvmClient() {
if (!connectEvmClientPromise) {
connectEvmClientPromise = createEVMClient({
dapp: dappMetadata,
api: {
supportedNetworks: CONNECT_EVM_SUPPORTED_NETWORKS,
},
});
}

try {
connectEvmClient = await connectEvmClientPromise;
return connectEvmClient;
} catch (err) {
connectEvmClientPromise = undefined;
throw err;
}
}

function getConnectEvmProviderDetail(provider, name) {
return {
info: {
uuid: CONNECT_EVM_PROVIDER_UUID,
name,
icon: './sdk-connect.svg',
rdns: 'io.metamask',
},
provider,
};
}

function setConnectedButtonState(button) {
button.innerText = 'MetaMask Connect - Disconnect';
button.classList.remove('btn-primary');
button.classList.add('btn-danger');
}

function setDisconnectedButtonState(button) {
button.innerText = 'MetaMask Connect';
button.classList.add('btn-primary');
button.classList.remove('btn-danger');
}

export function isConnectEvmProvider(provider) {
return Boolean(provider && provider === connectEvmProvider);
}

export async function handleConnectEvm(
name,
button,
isConnected,
updateConnectionState = noop,
) {
button.disabled = true;

try {
const client = await getConnectEvmClient();

if (isConnected) {
await client.disconnect();
updateConnectionState(false);
const activeProviderRemoved = removeProviderDetail(name);
setDisconnectedButtonState(button);
if (activeProviderRemoved) {
updateFormElements();
}
return;
}

const { accounts } = await client.connect({
chainIds: CONNECT_EVM_CHAIN_IDS,
});
const provider = client.getProvider();
connectEvmProvider = provider;

const providerDetail = getConnectEvmProviderDetail(provider, name);
await setActiveProviderDetail(providerDetail);
handleNewProviderDetail(providerDetail);
updateConnectionState(true);
setConnectedButtonState(button);
updateFormElements();
handleNewAccounts(accounts);
globalContext.connected = true;
} catch (err) {
console.error('Error connecting with MetaMask Connect EVM', err);
if (isConnected) {
setConnectedButtonState(button);
} else {
setDisconnectedButtonState(button);
}
} finally {
button.disabled = false;
}
}
24 changes: 10 additions & 14 deletions src/connections.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { MetaMaskSDK } from '@metamask/sdk';
import dappMetadata from './dapp-metadata';
import globalContext, {
handleNewAccounts,
handleNewProviderDetail,
Expand All @@ -9,12 +10,6 @@ import globalContext, {
updateWalletConnectState,
} from '.';

const dappMetadata = {
name: 'E2e Test Dapp',
description: 'This is the E2e Test Dapp',
url: 'https://metamask.github.io/test-dapp/',
};

const sdk = new MetaMaskSDK({ dappMetadata });

export const initializeWeb3Modal = () => {
Expand Down Expand Up @@ -52,14 +47,15 @@ function _setProviderDetail(provider, name, uuid) {

export async function handleSdkConnect(name, button, isConnected) {
if (isConnected) {
handleNewAccounts([]);
updateFormElements();
updateSdkConnectionState(false);
removeProviderDetail(name);
const activeProviderRemoved = removeProviderDetail(name);
await sdk.terminate();
button.innerText = 'Sdk Connect';
button.classList.add('btn-primary');
button.classList.remove('btn-danger');
if (activeProviderRemoved) {
updateFormElements();
}
} else {
await sdk.connect();
const provider = sdk.getProvider();
Expand Down Expand Up @@ -87,14 +83,14 @@ export async function handleSdkConnect(name, button, isConnected) {

export async function handleWalletConnect(name, button, isConnected) {
if (isConnected) {
handleNewAccounts([]);
updateFormElements();
updateWalletConnectState(false);
removeProviderDetail(name);
const activeProviderRemoved = removeProviderDetail(name);
button.innerText = 'Wallet Connect';
button.classList.add('btn-primary');
button.classList.remove('btn-danger');
globalContext.connected = false;
if (activeProviderRemoved) {
updateFormElements();
}
} else {
const { provider } = walletConnect.getWalletProvider();
const uuid = provider.signer.uri;
Expand All @@ -116,6 +112,6 @@ export async function handleWalletConnect(name, button, isConnected) {
} catch (err) {
console.error('Error on init when getting accounts', err);
}
globalContext.connected = true;
}
globalContext.connected = true;
}
7 changes: 7 additions & 0 deletions src/dapp-metadata.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const dappMetadata = {
name: 'E2e Test Dapp',
description: 'This is the E2e Test Dapp',
url: 'https://metamask.github.io/test-dapp/',
};

export default dappMetadata;
Loading
Loading