@onboard-dx/injected-wallets
Version:
Injected wallet module for connecting browser extension and mobile wallets to Web3-Onboard. Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported
92 lines (91 loc) • 4.17 kB
JavaScript
import uniqBy from 'lodash.uniqby';
import { ProviderLabel } from './types.js';
import standardWallets from './wallets.js';
import { validateWalletOptions } from './validation.js';
import { defaultWalletUnavailableMsg, isWalletAvailable } from './helpers.js';
export { ProviderIdentityFlag, ProviderLabel } from './types.js';
function injected(options) {
if (typeof window === 'undefined')
return () => null;
if (options) {
const result = validateWalletOptions(options);
if (result && result.error)
throw result.error;
}
return helpers => {
const { device } = helpers;
const { custom = [], filter = {}, displayUnavailable, sort, walletUnavailableMessage } = options || {};
// combine custom with standard wallets and dedupe
const allWallets = uniqBy([...custom, ...standardWallets], ({ label }) => label);
const wallets = allWallets.reduce((acc, wallet) => {
const { label, platforms, injectedNamespace, checkProviderIdentity } = wallet;
const walletFilters = filter[label];
const filteredWallet = walletFilters === false;
const provider = window[injectedNamespace];
const walletAvailable = isWalletAvailable(provider, checkProviderIdentity, device);
let excludedDevice = false;
// dev specified platform filters
if (Array.isArray(walletFilters) &&
(walletFilters.includes(device.type) ||
walletFilters.includes(device.os.name))) {
excludedDevice = true;
}
// unavailable filter
if (walletFilters === 'unavailable' && !walletAvailable) {
excludedDevice = true;
}
// wallet specified platform filters
const invalidPlatform = !platforms.includes('all') &&
!platforms.includes(device.type) &&
!platforms.includes(device.os.name);
const supportedWallet = !filteredWallet &&
!excludedDevice &&
!invalidPlatform &&
(walletAvailable ||
displayUnavailable === true ||
(Array.isArray(displayUnavailable) &&
displayUnavailable.length &&
displayUnavailable.includes(wallet.label)));
if (supportedWallet) {
acc.push(
// modify wallet to display error if unavailable but displayUnavailable is set
(displayUnavailable === true ||
(Array.isArray(displayUnavailable) &&
displayUnavailable.length &&
displayUnavailable.includes(wallet.label))) &&
!walletAvailable
? {
...wallet,
getInterface: async () => {
throw new Error(walletUnavailableMessage
? walletUnavailableMessage(wallet)
: defaultWalletUnavailableMsg(wallet));
}
}
: // otherwise add wallet to list as is
wallet);
}
return acc;
}, []);
if (wallets.length) {
const moreThanOneWallet = wallets.length > 1;
// if more than one wallet, then remove detected wallet
const formattedWallets = wallets
.filter((wallet) => {
const { label } = wallet;
return !(label === ProviderLabel.Detected && moreThanOneWallet);
})
// then map to the WalletModule interface
.map(({ label, getIcon, getInterface }) => ({
label,
getIcon,
getInterface
}))
// default sort by alphabetical
.sort((a, b) => a.label < b.label ? -1 : a.label > b.label ? 1 : 0);
return sort ? sort(formattedWallets) : formattedWallets;
}
return [];
};
}
export default injected;