{"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sigUtil from '@metamask/eth-sig-util';\nimport type {\n  JsonRpcMiddleware,\n  MiddlewareContext,\n  MiddlewareParams,\n} from '@metamask/json-rpc-engine/v2';\nimport { createScaffoldMiddleware } from '@metamask/json-rpc-engine/v2';\nimport type { MessageRequest } from '@metamask/message-manager';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isValidHexAddress } from '@metamask/utils';\nimport type { JsonRpcRequest, Json, Hex } from '@metamask/utils';\n\nimport { createWalletGetGrantedExecutionPermissionsHandler } from './methods/wallet-get-granted-execution-permissions';\nimport type { ProcessGetGrantedExecutionPermissionsHook } from './methods/wallet-get-granted-execution-permissions';\nimport { createWalletGetSupportedExecutionPermissionsHandler } from './methods/wallet-get-supported-execution-permissions';\nimport type { ProcessGetSupportedExecutionPermissionsHook } from './methods/wallet-get-supported-execution-permissions';\nimport { createWalletRequestExecutionPermissionsHandler } from './methods/wallet-request-execution-permissions';\nimport type { ProcessRequestExecutionPermissionsHook } from './methods/wallet-request-execution-permissions';\nimport { createWalletRevokeExecutionPermissionHandler } from './methods/wallet-revoke-execution-permission';\nimport type { ProcessRevokeExecutionPermissionHook } from './methods/wallet-revoke-execution-permission';\nimport { stripArrayTypeIfPresent } from './utils/common';\nimport { normalizeTypedMessage, parseTypedMessage } from './utils/normalize';\nimport {\n  resemblesAddress,\n  validateAndNormalizeKeyholder as validateKeyholder,\n  validateTypedDataForPrototypePollution,\n  validateTypedDataV1ForPrototypePollution,\n} from './utils/validation';\n\nexport type TransactionParams = {\n  from: string;\n};\n\nexport type MessageParams = TransactionParams & {\n  data: string;\n  signatureMethod?: string;\n};\n\nexport type TypedMessageParams = MessageParams & {\n  version: string;\n};\n\nexport type TypedMessageV1Params = Omit<TypedMessageParams, 'data'> & {\n  data: Record<string, unknown>[];\n};\n\nexport type WalletMiddlewareOptions = {\n  getAccounts: (origin: string) => Promise<string[]>;\n  processDecryptMessage?: (\n    msgParams: MessageParams,\n    req: MessageRequest,\n  ) => Promise<string>;\n  processEncryptionPublicKey?: (\n    address: string,\n    req: MessageRequest,\n  ) => Promise<string>;\n  processPersonalMessage?: (\n    msgParams: MessageParams,\n    req: JsonRpcRequest,\n    context: WalletMiddlewareContext,\n  ) => Promise<string>;\n  processTransaction?: (\n    txParams: TransactionParams,\n    req: JsonRpcRequest,\n    context: WalletMiddlewareContext,\n  ) => Promise<string>;\n  processSignTransaction?: (\n    txParams: TransactionParams,\n    req: JsonRpcRequest,\n    context: WalletMiddlewareContext,\n  ) => Promise<string>;\n  processTypedMessage?: (\n    msgParams: TypedMessageV1Params,\n    req: JsonRpcRequest,\n    context: WalletMiddlewareContext,\n    version: string,\n  ) => Promise<string>;\n  processTypedMessageV3?: (\n    msgParams: TypedMessageParams,\n    req: JsonRpcRequest,\n    context: WalletMiddlewareContext,\n    version: string,\n  ) => Promise<string>;\n  processTypedMessageV4?: (\n    msgParams: TypedMessageParams,\n    req: JsonRpcRequest,\n    context: WalletMiddlewareContext,\n    version: string,\n  ) => Promise<string>;\n  processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n  processRevokeExecutionPermission?: ProcessRevokeExecutionPermissionHook;\n  processGetGrantedExecutionPermissions?: ProcessGetGrantedExecutionPermissionsHook;\n  processGetSupportedExecutionPermissions?: ProcessGetSupportedExecutionPermissionsHook;\n};\n\nexport type WalletMiddlewareKeyValues = {\n  networkClientId: string;\n  origin: string;\n  securityAlertResponse?: Record<string, Json>;\n  traceContext?: unknown;\n};\n\nexport type WalletMiddlewareContext =\n  MiddlewareContext<WalletMiddlewareKeyValues>;\n\nexport type WalletMiddlewareParams = MiddlewareParams<\n  JsonRpcRequest,\n  WalletMiddlewareContext\n>;\n\n/**\n * Creates a JSON-RPC middleware that handles \"wallet\"-related JSON-RPC methods.\n * \"Wallet\" may have had a specific meaning at some point in the distant past,\n * but at this point it's just an arbitrary label.\n *\n * @param options - The options for the middleware.\n * @param options.getAccounts - The function to get the accounts for the origin.\n * @param options.processDecryptMessage - The function to process the decrypt message request.\n * @param options.processEncryptionPublicKey - The function to process the encryption public key request.\n * @param options.processPersonalMessage - The function to process the personal message request.\n * @param options.processTransaction - The function to process the transaction request.\n * @param options.processSignTransaction - The function to process the sign transaction request.\n * @param options.processTypedMessage - The function to process the typed message request.\n * @param options.processTypedMessageV3 - The function to process the typed message v3 request.\n * @param options.processTypedMessageV4 - The function to process the typed message v4 request.\n * @param options.processRequestExecutionPermissions - The function to process the request execution permissions request.\n * @param options.processRevokeExecutionPermission - The function to process the revoke execution permission request.\n * @param options.processGetGrantedExecutionPermissions - The function to process the get granted execution permissions request.\n * @param options.processGetSupportedExecutionPermissions - The function to process the get supported execution permissions request.\n * @returns A JSON-RPC middleware that handles wallet-related JSON-RPC methods.\n */\nexport function createWalletMiddleware({\n  getAccounts,\n  processDecryptMessage,\n  processEncryptionPublicKey,\n  processPersonalMessage,\n  processTransaction,\n  processSignTransaction,\n  processTypedMessage,\n  processTypedMessageV3,\n  processTypedMessageV4,\n  processRequestExecutionPermissions,\n  processRevokeExecutionPermission,\n  processGetGrantedExecutionPermissions,\n  processGetSupportedExecutionPermissions,\n}: WalletMiddlewareOptions): JsonRpcMiddleware<\n  JsonRpcRequest,\n  Json,\n  WalletMiddlewareContext\n> {\n  if (!getAccounts) {\n    throw new Error('opts.getAccounts is required');\n  }\n\n  return createScaffoldMiddleware<WalletMiddlewareContext>({\n    // account lookups\n    eth_accounts: lookupAccounts,\n    eth_coinbase: lookupDefaultAccount,\n\n    // tx signatures\n    eth_sendTransaction: sendTransaction,\n    eth_signTransaction: signTransaction,\n\n    // message signatures\n    eth_signTypedData: signTypedData,\n    eth_signTypedData_v3: signTypedDataV3,\n    eth_signTypedData_v4: signTypedDataV4,\n    personal_sign: personalSign,\n    eth_getEncryptionPublicKey: encryptionPublicKey,\n    eth_decrypt: decryptMessage,\n    personal_ecRecover: personalRecover,\n\n    // EIP-7715\n    wallet_requestExecutionPermissions:\n      createWalletRequestExecutionPermissionsHandler({\n        processRequestExecutionPermissions,\n      }),\n    wallet_revokeExecutionPermission:\n      createWalletRevokeExecutionPermissionHandler({\n        processRevokeExecutionPermission,\n      }),\n    wallet_getGrantedExecutionPermissions:\n      createWalletGetGrantedExecutionPermissionsHandler({\n        processGetGrantedExecutionPermissions,\n      }),\n    wallet_getSupportedExecutionPermissions:\n      createWalletGetSupportedExecutionPermissionsHandler({\n        processGetSupportedExecutionPermissions,\n      }),\n  });\n\n  //\n  // account lookups\n  //\n\n  /**\n   * Gets the accounts for the origin.\n   *\n   * @param options - Options bag.\n   * @param options.context - The context of the request.\n   * @returns The accounts for the origin.\n   */\n  async function lookupAccounts({\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    return await getAccounts(context.assertGet('origin'));\n  }\n\n  /**\n   * Gets the default account (i.e. first in the list) for the origin.\n   *\n   * @param options - Options bag.\n   * @param options.context - The context of the request.\n   * @returns The default account for the origin.\n   */\n  async function lookupDefaultAccount({\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    const accounts = await getAccounts(context.assertGet('origin'));\n    return accounts[0] || null;\n  }\n\n  //\n  // transaction signatures\n  //\n\n  /**\n   * Sends a transaction.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The transaction hash.\n   */\n  async function sendTransaction({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processTransaction) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 1)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params[0] as TransactionParams | undefined;\n    const txParams: TransactionParams = {\n      ...params,\n      // Not using nullish coalescing, since `params` may be `null`.\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      from: await validateAndNormalizeKeyholder(params?.from || '', context),\n    };\n    return await processTransaction(txParams, request, context);\n  }\n\n  /**\n   * Signs a transaction.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The signed transaction.\n   */\n  async function signTransaction({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processSignTransaction) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 1)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params[0] as TransactionParams | undefined;\n    const txParams: TransactionParams = {\n      ...params,\n      // Not using nullish coalescing, since `params` may be `null`.\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      from: await validateAndNormalizeKeyholder(params?.from || '', context),\n    };\n    return await processSignTransaction(txParams, request, context);\n  }\n\n  //\n  // message signatures\n  //\n\n  /**\n   * Signs a `eth_signTypedData` message.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The signed message.\n   */\n  async function signTypedData({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processTypedMessage) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 2)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params as [\n      Record<string, unknown>[],\n      string,\n      Record<string, string>?,\n    ];\n    const message = params[0];\n    const address = await validateAndNormalizeKeyholder(params[1], context);\n    const version = 'V1';\n    validateTypedDataV1ForPrototypePollution(message);\n    // Not using nullish coalescing, since `params` may be `null`.\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const extraParams = params[2] || {};\n    const msgParams: TypedMessageV1Params = {\n      ...extraParams,\n      from: address,\n      data: message,\n      signatureMethod: 'eth_signTypedData',\n      version,\n    };\n\n    return await processTypedMessage(msgParams, request, context, version);\n  }\n\n  /**\n   * Signs a `eth_signTypedData_v3` message.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The signed message.\n   */\n  async function signTypedDataV3({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processTypedMessageV3) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 2)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params as [string, string];\n\n    const address = await validateAndNormalizeKeyholder(params[0], context);\n    const message = normalizeTypedMessage(params[1]);\n    validatePrimaryType(message);\n    validateVerifyingContract(message);\n    validateTypedDataForPrototypePollution(message);\n    const version = 'V3';\n    const msgParams: TypedMessageParams = {\n      data: message,\n      from: address,\n      version,\n      signatureMethod: 'eth_signTypedData_v3',\n    };\n\n    return await processTypedMessageV3(msgParams, request, context, version);\n  }\n\n  /**\n   * Signs a `eth_signTypedData_v4` message.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The signed message.\n   */\n  async function signTypedDataV4({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processTypedMessageV4) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 2)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params as [string, string];\n\n    const address = await validateAndNormalizeKeyholder(params[0], context);\n    const message = normalizeTypedMessage(params[1]);\n    validatePrimaryType(message);\n    validateVerifyingContract(message);\n    validateTypedDataForPrototypePollution(message);\n    const version = 'V4';\n    const msgParams: TypedMessageParams = {\n      data: message,\n      from: address,\n      version,\n      signatureMethod: 'eth_signTypedData_v4',\n    };\n\n    return await processTypedMessageV4(msgParams, request, context, version);\n  }\n\n  /**\n   * Signs a `personal_sign` message.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The signed message.\n   */\n  async function personalSign({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processPersonalMessage) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 2)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params as [string, string, TransactionParams?];\n\n    // process normally\n    const firstParam = params[0];\n    const secondParam = params[1];\n    // non-standard \"extraParams\" to be appended to our \"msgParams\" obj\n    // Not using nullish coalescing, since `params` may be `null`.\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const extraParams = params[2] || {};\n\n    // We initially incorrectly ordered these parameters.\n    // To gracefully respect users who adopted this API early,\n    // we are currently gracefully recovering from the wrong param order\n    // when it is clearly identifiable.\n    //\n    // That means when the first param is definitely an address,\n    // and the second param is definitely not, but is hex.\n    let address: string, message: string;\n    if (resemblesAddress(firstParam) && !resemblesAddress(secondParam)) {\n      address = firstParam;\n      message = secondParam;\n    } else {\n      message = firstParam;\n      address = secondParam;\n    }\n    address = await validateAndNormalizeKeyholder(address, context);\n\n    const msgParams: MessageParams = {\n      ...extraParams,\n      from: address,\n      data: message,\n      signatureMethod: 'personal_sign',\n    };\n\n    return await processPersonalMessage(msgParams, request, context);\n  }\n\n  /**\n   * Recovers the signer address from a `personal_sign` message.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @returns The recovered signer address.\n   */\n  async function personalRecover({\n    request,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 2)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params as [string, string];\n    const message = params[0];\n    const signature = params[1];\n    const signerAddress = sigUtil.recoverPersonalSignature({\n      data: message,\n      signature,\n    });\n\n    return signerAddress;\n  }\n\n  /**\n   * Gets the encryption public key for an address.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The encryption public key.\n   */\n  async function encryptionPublicKey({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processEncryptionPublicKey) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 1)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n\n    const params = request.params as [string];\n\n    const address = await validateAndNormalizeKeyholder(params[0], context);\n\n    return await processEncryptionPublicKey(address, {\n      id: request.id as string | number,\n      origin: context.assertGet('origin'),\n      securityAlertResponse: context.get('securityAlertResponse'),\n    });\n  }\n\n  /**\n   * Decrypts a message.\n   *\n   * @param options - Options bag.\n   * @param options.request - The request.\n   * @param options.context - The context of the request.\n   * @returns The decrypted message.\n   */\n  async function decryptMessage({\n    request,\n    context,\n  }: WalletMiddlewareParams): Promise<Json> {\n    if (!processDecryptMessage) {\n      throw rpcErrors.methodNotSupported();\n    }\n    if (\n      !request.params ||\n      !Array.isArray(request.params) ||\n      !(request.params.length >= 1)\n    ) {\n      throw rpcErrors.invalidInput();\n    }\n    const params = request.params as [string, string, Record<string, Json>?];\n\n    const ciphertext: string = params[0];\n    const address: string = await validateAndNormalizeKeyholder(\n      params[1],\n      context,\n    );\n    // Not using nullish coalescing, since `params` may be `null`.\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const extraParams = params[2] || {};\n    const msgParams: MessageParams = {\n      ...extraParams,\n      from: address,\n      data: ciphertext,\n    };\n\n    return await processDecryptMessage(msgParams, {\n      id: request.id as string | number,\n      origin: context.assertGet('origin'),\n      securityAlertResponse: context.get('securityAlertResponse'),\n    });\n  }\n\n  //\n  // utility\n  //\n\n  /**\n   * Validates the keyholder address, and returns a normalized (i.e. lowercase)\n   * copy of it.\n   *\n   * @param address - The address to validate and normalize.\n   * @param context - The context of the request.\n   * @returns The normalized address, if valid. Otherwise, throws\n   * an error\n   */\n  async function validateAndNormalizeKeyholder(\n    address: string,\n    context: WalletMiddlewareContext,\n  ): Promise<string> {\n    return validateKeyholder(address as Hex, context, { getAccounts });\n  }\n}\n\n/**\n * Validates primary of typedSignMessage, to ensure that it's type definition is present in message.\n *\n * @param data - The data passed in typedSign request.\n */\nfunction validatePrimaryType(data: string): void {\n  const { primaryType, types } = parseTypedMessage(data);\n  if (!types) {\n    throw rpcErrors.invalidInput();\n  }\n\n  // Primary type can be an array.\n  const baseType = stripArrayTypeIfPresent(primaryType);\n\n  // Return if the base type is not defined in the types\n  const baseTypeDefinitions = types[baseType];\n  if (!baseTypeDefinitions) {\n    throw rpcErrors.invalidInput();\n  }\n}\n\n/**\n * Validates verifyingContract of typedSignMessage.\n *\n * @param data - The data passed in typedSign request.\n * This function allows the verifyingContract to be either:\n * - A valid hex address\n * - The string \"cosmos\" (as it is hard-coded in some Cosmos ecosystem's EVM adapters)\n * - An empty string\n */\nfunction validateVerifyingContract(data: string): void {\n  const { domain: { verifyingContract } = {} } = parseTypedMessage(data);\n  // Explicit check for cosmos here has been added to address this issue\n  // https://github.com/MetaMask/eth-json-rpc-middleware/issues/337\n  if (\n    verifyingContract &&\n    (verifyingContract as string) !== 'cosmos' &&\n    !isValidHexAddress(verifyingContract)\n  ) {\n    throw rpcErrors.invalidInput();\n  }\n}\n"]}