UNPKG

@metamask/providers

Version:

A JavaScript Ethereum provider that connects to the wallet over a stream

134 lines 5.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CAIP294EventNames = void 0; exports.announceWallet = announceWallet; exports.requestWallet = requestWallet; const utils_1 = require("@metamask/utils"); const utils_2 = require("./utils.cjs"); /** * Describes the possible CAIP-294 event names */ var CAIP294EventNames; (function (CAIP294EventNames) { CAIP294EventNames["Announce"] = "caip294:wallet_announce"; CAIP294EventNames["Prompt"] = "caip294:wallet_prompt"; })(CAIP294EventNames || (exports.CAIP294EventNames = CAIP294EventNames = {})); /** * Validates an {@link CAIP294RequestWalletEvent} object. * * @param event - The {@link CAIP294RequestWalletEvent} to validate. * @returns Whether the {@link CAIP294RequestWalletEvent} is valid. */ function isValidRequestWalletEvent(event) { return (event instanceof CustomEvent && event.type === CAIP294EventNames.Prompt && (0, utils_1.isObject)(event.detail) && event.detail.method === 'wallet_prompt' && isValidWalletPromptParams(event.detail.params)); } /** * Validates a {@link CAIP294RequestWalletEvent} params field. * * @param params - The parameters to validate. * @returns Whether the parameters are valid. */ function isValidWalletPromptParams(params) { const isValidChains = params.chains === undefined || (Array.isArray(params.chains) && params.chains.every((chain) => typeof chain === 'string')); const isValidAuthName = params.authName === undefined || typeof params.authName === 'string'; return isValidChains && isValidAuthName; } /** * Validates an {@link CAIP294AnnounceWalletEvent} object. * * @param event - The {@link CAIP294AnnounceWalletEvent} to validate. * @returns Whether the {@link CAIP294AnnounceWalletEvent} is valid. */ function isValidAnnounceWalletEvent(event) { return (event instanceof CustomEvent && event.type === CAIP294EventNames.Announce && (0, utils_1.isObject)(event.detail) && event.detail.method === 'wallet_announce' && isValidWalletData(event.detail.params)); } /** * Validates an {@link CAIP294WalletData} object. * * @param data - The {@link CAIP294WalletData} to validate. * @returns Whether the {@link CAIP294WalletData} is valid. */ function isValidWalletData(data) { return ((0, utils_1.isObject)(data) && typeof data.uuid === 'string' && utils_2.UUID_V4_REGEX.test(data.uuid) && typeof data.name === 'string' && Boolean(data.name) && typeof data.icon === 'string' && data.icon.startsWith('data:image') && typeof data.rdns === 'string' && utils_2.FQDN_REGEX.test(data.rdns) && (data.extensionId === undefined || (typeof data.extensionId === 'string' && data.extensionId.length > 0))); } /** * Intended to be used by a wallet. Announces a wallet by dispatching * an {@link CAIP294AnnounceWalletEvent}, and listening for * {@link CAIP294RequestWalletEvent} to re-announce. * * @throws If the {@link CAIP294WalletData} is invalid. * @param walletData - The {@link CAIP294WalletData} to announce. */ function announceWallet(walletData) { if (!isValidWalletData(walletData)) { throwErrorCAIP294(`Invalid CAIP-294 WalletData object received from ${CAIP294EventNames.Prompt}.`); } const _announceWallet = () => window.dispatchEvent(new CustomEvent(CAIP294EventNames.Announce, { detail: { id: 1, jsonrpc: '2.0', method: 'wallet_announce', params: walletData, }, })); _announceWallet(); window.addEventListener(CAIP294EventNames.Prompt, (event) => { if (!isValidRequestWalletEvent(event)) { throwErrorCAIP294(`Invalid CAIP-294 RequestWalletEvent object received from ${CAIP294EventNames.Prompt}.`); } _announceWallet(); }); } /** * Intended to be used by a dapp. Forwards announced wallet to the * provided handler by listening for * {@link CAIP294AnnounceWalletEvent}, * and dispatches an {@link CAIP294RequestWalletEvent}. * * @param handleWallet - A function that handles an announced wallet. */ function requestWallet(handleWallet) { window.addEventListener(CAIP294EventNames.Announce, (event) => { if (!isValidAnnounceWalletEvent(event)) { throwErrorCAIP294(`Invalid CAIP-294 WalletData object received from ${CAIP294EventNames.Announce}.`); } handleWallet(event.detail); }); window.dispatchEvent(new CustomEvent(CAIP294EventNames.Prompt, { detail: { id: 1, jsonrpc: '2.0', method: 'wallet_prompt', params: {}, }, })); } /** * Throws an error with link to CAIP-294 specifications. * * @param message - The message to include. * @throws a friendly error with a link to CAIP-294. */ function throwErrorCAIP294(message) { throw new Error(`${message} See https://github.com/ChainAgnostic/CAIPs/blob/bc4942857a8e04593ed92f7dc66653577a1c4435/CAIPs/caip-294.md for requirements.`); } //# sourceMappingURL=CAIP294.cjs.map