Skip to content

Aeternity snap for MetaMask

This guide explains basic interactions on getting access to accounts on Aeternity snap for MetaMask using JS SDK.

Prerequisite

Run the code from below you need:

  • a MetaMask extension 12.2.4 or above installed in Chrome or Firefox browser;
  • to setup an account in MetaMask (create a new one or restore by mnemonic phrase).

Usage

Firstly, you need to create a factory of MetaMask accounts

import { AccountMetamaskFactory } from '@aeternity/aepp-sdk';

const accountFactory = new AccountMetamaskFactory();

The next step is to install Aeternity snap to MetaMask. You can request installation by calling

await accountFactory.installSnap();

If succeed it means that MetaMask is ready to provide access to accounts. Alternatively, you can call ensureReady instead of installSnap. The latter won't trigger a snap installation, it would just fall with the exception if not installed.

Using the factory, you can create instances of specific accounts by providing an index

const account = await accountFactory.initialize(0);
console.log(account.address); // 'ak_2dA...'
console.log(await account.signTransaction('tx_...')); // 'tx_...' (with signature added)

The private key for the account would be derived in the MetaMask browser extension using the provided index and the mnemonic phrase it was initialized with. The private key won't leave the extension.

The complete examples of how to use it in browser can be found here.

Account persistence

Account can be persisted and restored by saving values of index, address properties

import { AccountMetamask } from '@aeternity/aepp-sdk';

const accountIndex = accountToPersist.index;
const accountAddress = accountToPersist.address;

const accountFactory = new AccountMetamaskFactory();
const restoredAccount = new AccountMetamask(accountFactory.provider, accountIndex, accountAddress);

It can be used to remember accounts between app restarts.

Account discovery

In addition to the above, it is possible to get access to a sequence of accounts that already have been used on chain. It is needed, for example, to restore the previously used accounts in case the user connects MetaMask to an app that doesn't aware of them.

import { Node } from '@aeternity/aepp-sdk';

const node = new Node('https://testnet.aeternity.io');
const accounts = await accountFactory.discover(node);
console.log(accounts[0].address); // 'ak_2dA...'

Error handling

If the user rejects a transaction/message signing or address retrieving you will get an exception as a plain object with property code equals 4001, and message equals "User rejected the request.".