@thirdweb-dev/wallets
Version:
<p align="center"> <br /> <a href="https://thirdweb.com"><img src="https://github.com/thirdweb-dev/js/blob/main/legacy_packages/sdk/logo.svg?raw=true" width="200" alt=""/></a> <br /> </p> <h1 align="center">thirdweb Wallet SDK</h1> <p align="center"> <a h
143 lines (131 loc) • 5.25 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var defineProperty = require('../../../../dist/defineProperty-9051a5d3.cjs.dev.js');
var errors = require('../../../../dist/errors-a8e8ea7b.cjs.dev.js');
var walletIds = require('../../../../dist/walletIds-a0be5020.cjs.dev.js');
var evm_connectors_injected_dist_thirdwebDevWalletsEvmConnectorsInjected = require('../../injected/dist/thirdweb-dev-wallets-evm-connectors-injected.cjs.dev.js');
var ethers = require('ethers');
var getInjectedMetamaskProvider = require('../../../../dist/getInjectedMetamaskProvider-ac276221.cjs.dev.js');
require('../../../../dist/WagmiConnector-6ff7d562.cjs.dev.js');
require('@thirdweb-dev/chains');
require('eventemitter3');
require('../../../../dist/assertWindowEthereum-0709ee9e.cjs.dev.js');
require('../../../../dist/url-4b641c31.cjs.dev.js');
require('../../../../dist/normalizeChainId-5da85f42.cjs.dev.js');
class MetaMaskConnector extends evm_connectors_injected_dist_thirdwebDevWalletsEvmConnectorsInjected.InjectedConnector {
constructor(arg) {
const defaultOptions = {
name: "MetaMask",
shimDisconnect: true,
shimChainChangedDisconnect: true,
getProvider: getInjectedMetamaskProvider.getInjectedMetamaskProvider
};
const options = {
...defaultOptions,
...arg.options
};
super({
chains: arg.chains,
options,
connectorStorage: arg.connectorStorage
});
defineProperty._defineProperty(this, "id", walletIds.walletIds.metamask);
this._UNSTABLE_shimOnConnectSelectAccount = options.UNSTABLE_shimOnConnectSelectAccount;
}
/**
* Connect to injected MetaMask provider
*/
async connect() {
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
try {
const provider = await this.getProvider();
if (!provider) {
throw new errors.ConnectorNotFoundError();
}
this.setupListeners();
// emit "connecting" event
this.emit("message", {
type: "connecting"
});
// Attempt to show wallet select prompt with `wallet_requestPermissions` when
// `shimDisconnect` is active and account is in disconnected state (flag in storage)
let account = null;
if (this._UNSTABLE_shimOnConnectSelectAccount && this.options?.shimDisconnect && !Boolean(this.connectorStorage.getItem(this.shimDisconnectKey))) {
account = await this.getAccount().catch(() => null);
const isConnected = !!account;
if (isConnected) {
// Attempt to show another prompt for selecting wallet if already connected
try {
await provider.request({
method: "wallet_requestPermissions",
params: [{
eth_accounts: {}
}]
});
} catch (error) {
// Not all MetaMask injected providers support `wallet_requestPermissions` (e.g. MetaMask iOS).
// Only bubble up error if user rejects request
if (this.isUserRejectedRequestError(error)) {
throw new errors.UserRejectedRequestError(error);
}
}
}
}
// if account is not already set, request accounts and use the first account
if (!account) {
const accounts = await provider.request({
method: "eth_requestAccounts"
});
account = ethers.utils.getAddress(accounts[0]);
}
// get currently connected chainId
let connectedChainId = await this.getChainId();
// check if connected chain is unsupported
let isUnsupported = this.isChainUnsupported(connectedChainId);
// if chainId is given, but does not match the currently connected chainId, switch to the given chainId
if (options.chainId && connectedChainId !== options.chainId) {
try {
await this.switchChain(options.chainId);
// recalculate the chainId and isUnsupported
connectedChainId = options.chainId;
isUnsupported = this.isChainUnsupported(options.chainId);
} catch (e) {
console.error(`Could not switch to chain id : ${options.chainId}`, e);
}
}
// if shimDisconnect is enabled
if (this.options?.shimDisconnect) {
// add shimDisconnectKey in storage - this signals that connector is "connected"
await this.connectorStorage.setItem(this.shimDisconnectKey, "true");
}
const connectionInfo = {
chain: {
id: connectedChainId,
unsupported: isUnsupported
},
provider: provider,
account
};
this.emit("connect", connectionInfo);
return connectionInfo;
} catch (error) {
if (this.isUserRejectedRequestError(error)) {
throw new errors.UserRejectedRequestError(error);
}
if (error.code === -32002) {
throw new errors.ResourceUnavailableError(error);
}
throw error;
}
}
async switchAccount() {
const provider = await this.getProvider();
await provider.request({
method: "wallet_requestPermissions",
params: [{
eth_accounts: {}
}]
});
}
}
exports.MetaMaskConnector = MetaMaskConnector;