{"version":3,"file":"wallet-getPermissions.cjs","sourceRoot":"","sources":["../src/wallet-getPermissions.ts"],"names":[],"mappings":";;;AACA,mFAI6C;AAK7C,2EAKyC;AAOzC,uCAAyE;AAE5D,QAAA,qBAAqB,GAAG;IACnC,WAAW,EAAE,CAAC,mCAAW,CAAC,cAAc,CAAC;IACzC,cAAc,EAAE,4BAA4B;IAC5C,SAAS,EAAE;QACT,uBAAuB,EAAE,IAAI;QAC7B,WAAW,EAAE,IAAI;KAClB;CACF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,4BAA4B,CACzC,IAA4B,EAC5B,GAAiC,EACjC,KAAqC,EACrC,GAA6B,EAC7B,EACE,uBAAuB,EACvB,WAAW,GASZ;IAED,MAAM,WAAW,GAAG,EAAE,GAAG,uBAAuB,EAAE,EAAE,CAAC;IACrD,MAAM,eAAe,GAAG,WAAW,CAAC,yDAA6B,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,CACtD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,4CAAgB,CACxC,EAAE,KAAsC,CAAC;IAC1C,OAAO,WAAW,CAAC,yDAA6B,CAAC,CAAC;IAElD,IAAI,iBAAiB,EAAE;QACrB,oEAAoE;QACpE,4DAA4D;QAC5D,MAAM,WAAW,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,WAAW,CAAC,yBAAiB,CAAC,WAAW,CAAC,GAAG;gBAC3C,GAAG,eAAe;gBAClB,gBAAgB,EAAE,yBAAiB,CAAC,WAAW;gBAC/C,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,mBAAW,CAAC,wBAAwB;wBAC1C,KAAK,EAAE,WAAW;qBACnB;iBACF;aACF,CAAC;SACH;QAED,MAAM,WAAW,GAAG,IAAA,mDAAuB,EAAC,iBAAiB,CAAC,CAAC;QAE/D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,WAAW,CAAC,sBAAc,CAAC,eAAe,CAAC,GAAG;gBAC5C,GAAG,eAAe;gBAClB,gBAAgB,EAAE,sBAAc,CAAC,eAAe;gBAChD,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,mBAAW,CAAC,wBAAwB;wBAC1C,KAAK,EAAE,WAAW;qBACnB;iBACF;aACF,CAAC;SACH;KACF;IAED,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC","sourcesContent":["import type { Caip25CaveatValue } from '@metamask/chain-agnostic-permission';\nimport {\n  Caip25CaveatType,\n  Caip25EndowmentPermissionName,\n  getPermittedEthChainIds,\n} from '@metamask/chain-agnostic-permission';\nimport type {\n  AsyncJsonRpcEngineNextCallback,\n  JsonRpcEngineEndCallback,\n} from '@metamask/json-rpc-engine';\nimport {\n  type CaveatSpecificationConstraint,\n  MethodNames,\n  type PermissionController,\n  type PermissionSpecificationConstraint,\n} from '@metamask/permission-controller';\nimport type {\n  Json,\n  JsonRpcRequest,\n  PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport { CaveatTypes, EndowmentTypes, RestrictedMethods } from './types';\n\nexport const getPermissionsHandler = {\n  methodNames: [MethodNames.GetPermissions],\n  implementation: getPermissionsImplementation,\n  hookNames: {\n    getPermissionsForOrigin: true,\n    getAccounts: true,\n  },\n};\n\n/**\n * Get Permissions implementation to be used in JsonRpcEngine middleware, specifically for `wallet_getPermissions` RPC method.\n * It makes use of a CAIP-25 endowment permission returned by `getPermissionsForOrigin` hook, if it exists.\n *\n * @param _req - The JsonRpcEngine request - unused\n * @param res - The JsonRpcEngine result object\n * @param _next - JsonRpcEngine next() callback - unused\n * @param end - JsonRpcEngine end() callback\n * @param options - Method hooks passed to the method implementation\n * @param options.getPermissionsForOrigin - The specific method hook needed for this method implementation\n * @param options.getAccounts - A hook that returns the permitted eth accounts for the origin sorted by lastSelected.\n * @returns A promise that resolves to nothing\n */\nasync function getPermissionsImplementation(\n  _req: JsonRpcRequest<Json[]>,\n  res: PendingJsonRpcResponse<Json>,\n  _next: AsyncJsonRpcEngineNextCallback,\n  end: JsonRpcEngineEndCallback,\n  {\n    getPermissionsForOrigin,\n    getAccounts,\n  }: {\n    getPermissionsForOrigin: () => ReturnType<\n      PermissionController<\n        PermissionSpecificationConstraint,\n        CaveatSpecificationConstraint\n      >['getPermissions']\n    >;\n    getAccounts: (options?: { ignoreLock?: boolean }) => string[];\n  },\n) {\n  const permissions = { ...getPermissionsForOrigin() };\n  const caip25Endowment = permissions[Caip25EndowmentPermissionName];\n  const caip25CaveatValue = caip25Endowment?.caveats?.find(\n    ({ type }) => type === Caip25CaveatType,\n  )?.value as Caip25CaveatValue | undefined;\n  delete permissions[Caip25EndowmentPermissionName];\n\n  if (caip25CaveatValue) {\n    // We cannot derive ethAccounts directly from the CAIP-25 permission\n    // because the accounts will not be in order of lastSelected\n    const ethAccounts = getAccounts({ ignoreLock: true });\n\n    if (ethAccounts.length > 0) {\n      permissions[RestrictedMethods.EthAccounts] = {\n        ...caip25Endowment,\n        parentCapability: RestrictedMethods.EthAccounts,\n        caveats: [\n          {\n            type: CaveatTypes.RestrictReturnedAccounts,\n            value: ethAccounts,\n          },\n        ],\n      };\n    }\n\n    const ethChainIds = getPermittedEthChainIds(caip25CaveatValue);\n\n    if (ethChainIds.length > 0) {\n      permissions[EndowmentTypes.PermittedChains] = {\n        ...caip25Endowment,\n        parentCapability: EndowmentTypes.PermittedChains,\n        caveats: [\n          {\n            type: CaveatTypes.RestrictNetworkSwitching,\n            value: ethChainIds,\n          },\n        ],\n      };\n    }\n  }\n\n  res.result = Object.values(permissions);\n  return end();\n}\n"]}