{"version":3,"file":"create-session.cjs","sourceRoot":"","sources":["../../../src/middleware/multichain/create-session.ts"],"names":[],"mappings":";;;AAAA,mFAI6C;AAE7C,qDAAiD;AACjD,uDAO+B;AAC/B,2CAMyB;AAEzB,uCAA2C;AAQ3C,MAAM,YAAY,GAAG,IAAA,oBAAM,EACzB,yBAAiB,EACjB,IAAA,oBAAM,EAAC;IACL,OAAO,EAAE,IAAA,mBAAK,EAAC,IAAA,oBAAM,GAAE,CAAC;IACxB,QAAQ,EAAE,IAAA,mBAAK,EAAC,2BAAmB,CAAC;IACpC,aAAa,EAAE,IAAA,mBAAK,EAAC,IAAA,oBAAM,GAAE,CAAC;CAC/B,CAAC,CACH,CAAC;AAEF,MAAM,yBAAyB,GAAG,IAAA,oBAAM,EAAC;IACvC,cAAc,EAAE,IAAA,sBAAQ,EAAC,YAAY,CAAC;IACtC,cAAc,EAAE,IAAA,sBAAQ,EAAC,YAAY,CAAC;IACtC,iBAAiB,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,EAAC,IAAA,oBAAM,GAAE,EAAE,kBAAU,CAAC,CAAC;CAC1D,CAAC,CAAC;AAEH;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAuB,EACvB,KAAgC;IAEhC,IAAI,CAAC,IAAA,gBAAE,EAAC,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAAE,CAAC;QACnD,MAAM,sBAAS,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG;QACb,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE;QACnD,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE;QACnD,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE;QACzD,kBAAkB,EAAE,IAAI;KACzB,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK;SACnB,WAAW,EAAE;SACb,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAC7D,CAAC;IAEJ,MAAM,kBAAkB,GAAG,IAAA,sEAA0C,EACnE,MAAM,EACN,QAA2B,CAC5B,CAAC;IAEF,MAAM,WAAW,GAAG;QAClB,CAAC,yDAA6B,CAAC,EAAE;YAC/B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,4CAAgB;oBACtB,KAAK,EAAE,kBAAkB;iBAC1B;aACF;SACF;KACsB,CAAC;IAE1B,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpC,MAAM,aAAa,GAAG,IAAA,wBAAgB,EAAC,kBAAkB,CAAC,CAAC;IAE3D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC;AACxE,CAAC;AA1CD,oDA0CC","sourcesContent":["import {\n  Caip25CaveatType,\n  Caip25EndowmentPermissionName,\n  setNonSCACaipAccountIdsInCaip25CaveatValue,\n} from '@metamask/chain-agnostic-permission';\nimport type { RequestedPermissions } from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport {\n  array,\n  is,\n  object,\n  string,\n  optional,\n  record,\n} from '@metamask/superstruct';\nimport {\n  type CaipAccountId,\n  CaipAccountIdStruct,\n  CaipChainIdStruct,\n  JsonStruct,\n  type JsonRpcRequest,\n} from '@metamask/utils';\n\nimport { getSessionScopes } from './utils';\nimport type { SimulationAccount } from '../../options';\n\nexport type CreateSessionHandlerHooks = {\n  grantPermissions: (permissions: RequestedPermissions) => void;\n  getAccounts: () => SimulationAccount[];\n};\n\nconst ScopesStruct = record(\n  CaipChainIdStruct,\n  object({\n    methods: array(string()),\n    accounts: array(CaipAccountIdStruct),\n    notifications: array(string()),\n  }),\n);\n\nconst CreateSessionParamsStruct = object({\n  requiredScopes: optional(ScopesStruct),\n  optionalScopes: optional(ScopesStruct),\n  sessionProperties: optional(record(string(), JsonStruct)),\n});\n\n/**\n * A handler that implements a simplified version of `wallet_createSession`.\n *\n * @param request - Incoming JSON-RPC request.\n * @param hooks - The method hooks.\n * @returns The JSON-RPC response.\n */\nexport async function createSessionHandler(\n  request: JsonRpcRequest,\n  hooks: CreateSessionHandlerHooks,\n) {\n  if (!is(request.params, CreateSessionParamsStruct)) {\n    throw rpcErrors.invalidParams({ data: { request } });\n  }\n\n  const caveat = {\n    requiredScopes: request.params.requiredScopes ?? {},\n    optionalScopes: request.params.optionalScopes ?? {},\n    sessionProperties: request.params.sessionProperties ?? {},\n    isMultichainOrigin: true,\n  };\n\n  const accounts = hooks\n    .getAccounts()\n    .flatMap((account) =>\n      account.scopes.map((scope) => `${scope}:${account.address}`),\n    );\n\n  const caveatWithAccounts = setNonSCACaipAccountIdsInCaip25CaveatValue(\n    caveat,\n    accounts as CaipAccountId[],\n  );\n\n  const permissions = {\n    [Caip25EndowmentPermissionName]: {\n      caveats: [\n        {\n          type: Caip25CaveatType,\n          value: caveatWithAccounts,\n        },\n      ],\n    },\n  } as RequestedPermissions;\n\n  hooks.grantPermissions(permissions);\n\n  const sessionScopes = getSessionScopes(caveatWithAccounts);\n\n  return { sessionScopes, sessionProperties: caveat.sessionProperties };\n}\n"]}