{"version":3,"file":"wallet_getAccountUpgradeStatus.cjs","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport {\n  type JsonRpcRequest,\n  type PendingJsonRpcResponse,\n  type Hex,\n  getErrorMessage,\n} from '@metamask/utils';\n\nimport { DELEGATION_INDICATOR_PREFIX } from './constants';\nimport type { GetAccountUpgradeStatusParams } from './types';\nimport { GetAccountUpgradeStatusParamsStruct } from './types';\nimport { validateParams, validateAndNormalizeAddress } from './utils';\n\nexport type WalletGetAccountUpgradeStatusHooks = {\n  getCurrentChainIdForDomain: (origin: string) => Hex | null;\n  getCode: (address: string, networkClientId: string) => Promise<string | null>;\n  getSelectedNetworkClientIdForChain: (chainId: string) => string | null;\n  getPermittedAccountsForOrigin: (origin: string) => Promise<string[]>;\n  isEip7702Supported: (request: { address: string; chainId: Hex }) => Promise<{\n    isSupported: boolean;\n    upgradeContractAddress?: string;\n  }>;\n};\n\nconst isAccountUpgraded = async (\n  address: string,\n  networkClientId: string,\n  getCode: (address: string, networkClientId: string) => Promise<string | null>,\n): Promise<{ isUpgraded: boolean; upgradedAddress: Hex | null }> => {\n  const code = await getCode(address, networkClientId);\n  if (!code || code === '0x' || code.length <= 2) {\n    return { isUpgraded: false, upgradedAddress: null };\n  }\n\n  if (!code.startsWith(DELEGATION_INDICATOR_PREFIX)) {\n    return { isUpgraded: false, upgradedAddress: null };\n  }\n\n  const expectedLength = DELEGATION_INDICATOR_PREFIX.length + 40; // 0xef0100 + 40 hex chars\n  if (code.length !== expectedLength) {\n    return { isUpgraded: false, upgradedAddress: null };\n  }\n\n  // Extract the 20-byte address (40 hex characters after the prefix)\n  const upgradedAddress = `0x${code.slice(8, 48)}` as Hex;\n\n  return { isUpgraded: true, upgradedAddress };\n};\n\n/**\n * The RPC method handler middleware for `wallet_getAccountUpgradeStatus`\n *\n * @param req - The JSON RPC request's end callback.\n * @param res - The JSON RPC request's pending response object.\n * @param hooks - The hooks required for account upgrade status checking.\n */\nexport async function walletGetAccountUpgradeStatus(\n  req: JsonRpcRequest<GetAccountUpgradeStatusParams> & { origin: string },\n  res: PendingJsonRpcResponse,\n  hooks: WalletGetAccountUpgradeStatusHooks,\n): Promise<void> {\n  const { params, origin } = req;\n\n  // Validate parameters using Superstruct\n  validateParams(params, GetAccountUpgradeStatusParamsStruct);\n\n  const { account, chainId } = params;\n\n  // Validate and normalize the account address with authorization check\n  const normalizedAccount = await validateAndNormalizeAddress(\n    account,\n    origin,\n    hooks.getPermittedAccountsForOrigin,\n  );\n\n  // Use current chain ID if not provided\n  let targetChainId: Hex;\n  if (chainId !== undefined) {\n    targetChainId = chainId;\n  } else {\n    const currentChainIdForDomain = hooks.getCurrentChainIdForDomain(origin);\n    if (!currentChainIdForDomain) {\n      throw rpcErrors.invalidParams({\n        message: `Could not determine current chain ID for origin: ${origin}`,\n      });\n    }\n    targetChainId = currentChainIdForDomain;\n  }\n\n  const { isSupported } = await hooks.isEip7702Supported({\n    address: normalizedAccount,\n    chainId: targetChainId,\n  });\n\n  if (!isSupported) {\n    res.result = {\n      isSupported,\n      account: normalizedAccount,\n      isUpgraded: false,\n      upgradedAddress: null,\n      chainId: targetChainId,\n    };\n    return;\n  }\n\n  try {\n    // Get the network configuration for the target chain\n    const hexChainId = targetChainId;\n    const networkClientId =\n      hooks.getSelectedNetworkClientIdForChain(hexChainId);\n\n    if (!networkClientId) {\n      throw rpcErrors.invalidParams({\n        message: `Network client ID not found for chain ID ${targetChainId}`,\n      });\n    }\n\n    // Check if the account is upgraded using the EIP7702 utils\n    const { isUpgraded, upgradedAddress } = await isAccountUpgraded(\n      normalizedAccount,\n      networkClientId,\n      hooks.getCode,\n    );\n\n    res.result = {\n      isSupported,\n      account: normalizedAccount,\n      isUpgraded,\n      upgradedAddress,\n      chainId: targetChainId,\n    };\n  } catch (error) {\n    // Re-throw RPC errors as-is\n    if (error instanceof JsonRpcError) {\n      throw error;\n    }\n    throw rpcErrors.internal({\n      message: `Failed to get account upgrade status: ${getErrorMessage(error)}`,\n    });\n  }\n}\n"]}