@massalabs/wallet-provider
Version:
massa's wallet provider
70 lines • 2.37 kB
JavaScript
import { getInstalledSnaps } from './snap';
const PROVIDER_DETECTION_TIMEOUT = 500;
/**
* Check if a provider supports snaps by calling `wallet_getSnaps`.
*
* @param provider - The provider to test for snaps support
* @returns A promise that resolves to true if snaps are supported
*/
export async function hasSnapsSupport(provider) {
try {
await getInstalledSnaps(provider);
return true;
}
catch {
return false;
}
}
function isMetaMaskProvider(obj) {
return (obj !== null &&
typeof obj === 'object' &&
// eslint-disable-next-line no-prototype-builtins
obj.hasOwnProperty('isMetaMask') &&
// eslint-disable-next-line no-prototype-builtins
obj.hasOwnProperty('request'));
}
/**
* Get a MetaMask provider using EIP6963 specification.
*
* @returns Promise resolving to MetaMask provider or null if not found within timeout
*/
export async function getMetaMaskEIP6963Provider() {
return new Promise((resolve) => {
const timeout = setTimeout(() => {
cleanup();
resolve(null);
}, PROVIDER_DETECTION_TIMEOUT);
function cleanup() {
if (typeof window.removeEventListener === 'function') {
window.removeEventListener('eip6963:announceProvider', handleAnnouncement);
}
clearTimeout(timeout);
}
function handleAnnouncement({ detail }) {
if (['io.metamask', 'io.metamask.flask'].includes(detail.info.rdns) &&
isMetaMaskProvider(detail.provider)) {
cleanup();
resolve(detail.provider);
}
}
if (typeof window.addEventListener === 'function') {
window.addEventListener('eip6963:announceProvider', handleAnnouncement);
}
if (typeof window.dispatchEvent === 'function') {
window.dispatchEvent(new Event('eip6963:requestProvider'));
}
});
}
/**
* Get a MetaMask provider that supports snaps.
*
* @returns Promise resolving to a compatible provider or null
*/
export async function getMetamaskProvider() {
const eip6963Provider = await getMetaMaskEIP6963Provider();
if (eip6963Provider && (await hasSnapsSupport(eip6963Provider))) {
return eip6963Provider;
}
return null;
}
//# sourceMappingURL=metamask.js.map