{"version":3,"file":"wallet_upgradeAccount.cjs","sourceRoot":"","sources":["../src/wallet_upgradeAccount.ts"],"names":[],"mappings":";;;AAAA,qDAA+D;AAQ/D,uCAAqD;AACrD,uCAAsE;AAgBtE;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,GAA8D,EAC9D,GAA2B,EAC3B,KAAgC;IAEhC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE/B,wCAAwC;IACxC,IAAA,sBAAc,EAAC,MAAM,EAAE,kCAA0B,CAAC,CAAC;IAEnD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAEpC,sEAAsE;IACtE,MAAM,iBAAiB,GAAG,MAAM,IAAA,mCAA2B,EACzD,OAAO,EACP,MAAM,EACN,KAAK,CAAC,6BAA6B,CACpC,CAAC;IAEF,6DAA6D;IAC7D,IAAI,aAAkB,CAAC;IACvB,IAAI,OAAO,KAAK,SAAS,EAAE;QACzB,aAAa,GAAG,OAAO,CAAC;KACzB;SAAM;QACL,MAAM,uBAAuB,GAAG,KAAK,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,uBAAuB,EAAE;YAC5B,MAAM,sBAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,8CAA8C,MAAM,EAAE;aAChE,CAAC,CAAC;SACJ;QACD,aAAa,GAAG,uBAAuB,CAAC;KACzC;IAED,IAAI;QACF,6DAA6D;QAC7D,MAAM,UAAU,GAAG,aAAa,CAAC;QACjC,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,GAC3C,MAAM,KAAK,CAAC,kBAAkB,CAAC;YAC7B,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QAEL,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,sBAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,6CAA6C,aAAa,EAAE;aACtE,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,sBAAsB,EAAE;YAC3B,MAAM,sBAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,sDAAsD,aAAa,EAAE;aAC/E,CAAC,CAAC;SACJ;QAED,4DAA4D;QAC5D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CACvC,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,CACd,CAAC;QAEF,GAAG,CAAC,MAAM,GAAG;YACX,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,eAAe,EAAE,iBAAiB;YAClC,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;KACH;IAAC,OAAO,KAAK,EAAE;QACd,4BAA4B;QAC5B,IAAI,KAAK,YAAY,yBAAY,EAAE;YACjC,MAAM,KAAK,CAAC;SACb;QACD,MAAM,sBAAS,CAAC,QAAQ,CAAC;YACvB,OAAO,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAChG,CAAC,CAAC;KACJ;AACH,CAAC;AA3ED,oDA2EC","sourcesContent":["import { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type {\n  JsonRpcRequest,\n  PendingJsonRpcResponse,\n  Hex,\n} from '@metamask/utils';\n\nimport type { UpgradeAccountParams } from './types';\nimport { UpgradeAccountParamsStruct } from './types';\nimport { validateParams, validateAndNormalizeAddress } from './utils';\n\nexport type WalletUpgradeAccountHooks = {\n  upgradeAccount: (\n    address: string,\n    upgradeContractAddress: string,\n    chainId?: Hex,\n  ) => Promise<{ transactionHash: string; delegatedTo: string }>;\n  getCurrentChainIdForDomain: (origin: string) => Hex | null;\n  isEip7702Supported: (request: { address: string; chainId: Hex }) => Promise<{\n    isSupported: boolean;\n    upgradeContractAddress?: string;\n  }>;\n  getPermittedAccountsForOrigin: (origin: string) => Promise<string[]>;\n};\n\n/**\n * The RPC method handler middleware for `wallet_upgradeAccount`\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 functionality.\n */\nexport async function walletUpgradeAccount(\n  req: JsonRpcRequest<UpgradeAccountParams> & { origin: string },\n  res: PendingJsonRpcResponse,\n  hooks: WalletUpgradeAccountHooks,\n): Promise<void> {\n  const { params, origin } = req;\n\n  // Validate parameters using Superstruct\n  validateParams(params, UpgradeAccountParamsStruct);\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 app selected chain ID if not passed as a param\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: `No network configuration found for origin: ${origin}`,\n      });\n    }\n    targetChainId = currentChainIdForDomain;\n  }\n\n  try {\n    // Get the EIP7702 network configuration for the target chain\n    const hexChainId = targetChainId;\n    const { isSupported, upgradeContractAddress } =\n      await hooks.isEip7702Supported({\n        address: normalizedAccount,\n        chainId: hexChainId,\n      });\n\n    if (!isSupported) {\n      throw rpcErrors.invalidParams({\n        message: `Account upgrade not supported on chain ID ${targetChainId}`,\n      });\n    }\n\n    if (!upgradeContractAddress) {\n      throw rpcErrors.invalidParams({\n        message: `No upgrade contract address available for chain ID ${targetChainId}`,\n      });\n    }\n\n    // Perform the upgrade using existing EIP-7702 functionality\n    const result = await hooks.upgradeAccount(\n      normalizedAccount,\n      upgradeContractAddress,\n      targetChainId,\n    );\n\n    res.result = {\n      transactionHash: result.transactionHash,\n      upgradedAccount: normalizedAccount,\n      delegatedTo: result.delegatedTo,\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 upgrade account: ${error instanceof Error ? error.message : String(error)}`,\n    });\n  }\n}\n"]}