@metamask/snaps-rpc-methods
Version:
MetaMask Snaps JSON-RPC method implementations
61 lines • 2.91 kB
JavaScript
;
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