{"version":3,"file":"create-session.mjs","sourceRoot":"","sources":["../../../src/middleware/multichain/create-session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,0CAA0C,EAC3C,4CAA4C;AAE7C,OAAO,EAAE,SAAS,EAAE,6BAA6B;AACjD,OAAO,EACL,KAAK,EACL,EAAE,EACF,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACP,8BAA8B;AAC/B,OAAO,EAEL,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EAEX,wBAAwB;AAEzB,OAAO,EAAE,gBAAgB,EAAE,oBAAgB;AAQ3C,MAAM,YAAY,GAAG,MAAM,CACzB,iBAAiB,EACjB,MAAM,CAAC;IACL,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,mBAAmB,CAAC;IACpC,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CACH,CAAC;AAEF,MAAM,yBAAyB,GAAG,MAAM,CAAC;IACvC,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC;IACtC,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC;IACtC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;CAC1D,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAuB,EACvB,KAAgC;IAEhC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAAE,CAAC;QACnD,MAAM,SAAS,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,0CAA0C,CACnE,MAAM,EACN,QAA2B,CAC5B,CAAC;IAEF,MAAM,WAAW,GAAG;QAClB,CAAC,6BAA6B,CAAC,EAAE;YAC/B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,kBAAkB;iBAC1B;aACF;SACF;KACsB,CAAC;IAE1B,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpC,MAAM,aAAa,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAE3D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC;AACxE,CAAC","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"]}