UNPKG

@metamask/snaps-rpc-methods

Version:
61 lines 2.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPreinstalledSnapsMiddleware = void 0; const snaps_utils_1 = require("@metamask/snaps-utils"); const utils_1 = require("@metamask/utils"); const endowments_1 = require("../endowments/index.cjs"); const WILDCARD_SCOPE = 'wallet:eip155'; /** * Create a middleware that automatically grants account permissions to preinstalled Snaps * that want to use the Ethereum provider endowment. * * @param hooks - The hooks used by the middleware. * @param hooks.getAllEvmAccounts - Hook for retriveing all available EVM addresses. * @param hooks.getPermissions - Hook for retrieving the permissions of the requesting origin. * @param hooks.grantPermissions - Hook for granting permissions to the requesting origin. * @returns The middleware. */ function createPreinstalledSnapsMiddleware({ getAllEvmAccounts, getPermissions, grantPermissions, }) { return function methodMiddleware(request, _response, next, _end) { if (request.method.startsWith('snap')) { return next(); } const permissions = getPermissions(); if (!permissions || !(0, utils_1.hasProperty)(permissions, endowments_1.SnapEndowments.EthereumProvider)) { return next(); } const existingEndowment = permissions['endowment:caip25']; const existingCaveat = existingEndowment?.caveats?.find((caveat) => caveat.type === 'authorizedScopes')?.value; const existingRequiredScopes = existingCaveat?.requiredScopes ?? {}; const existingOptionalScopes = existingCaveat?.optionalScopes ?? {}; const existingEvmAccounts = existingOptionalScopes[WILDCARD_SCOPE]?.accounts.map((account) => account.slice(WILDCARD_SCOPE.length + 1)) ?? []; const evmAccounts = getAllEvmAccounts(); if ((0, snaps_utils_1.isEqual)(evmAccounts, existingEvmAccounts)) { return next(); } grantPermissions({ 'endowment:caip25': { caveats: [ { type: 'authorizedScopes', value: { requiredScopes: existingRequiredScopes, optionalScopes: { ...existingOptionalScopes, [WILDCARD_SCOPE]: { accounts: evmAccounts.map((account) => `${WILDCARD_SCOPE}:${account}`), }, }, sessionProperties: {}, isMultichainOrigin: false, }, }, ], }, }); return next(); }; } exports.createPreinstalledSnapsMiddleware = createPreinstalledSnapsMiddleware; //# sourceMappingURL=preinstalled-snaps.cjs.map