{"version":3,"file":"legacy.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/legacy.ts"],"names":[],"mappings":";;;AAAA,uDAAoE;AACpE,uEAAkF;AAElF,6CAAmD;AACnD,sDAA2D;AAG3D,4DAAkE;AAClE,8CAA0D;AAC1D,uCAA6D;AAE7D;;;;;;;;;;GAUG;AACI,MAAM,2BAA2B,GAAG,KAAK,EAC9C,OAA6B,EAC7B,eAAuB,EACvB,SAAoB,EACL,EAAE;IACjB,qCAAqC;IACrC,MAAM,6BAA6B,GAAG,MAAM,IAAA,8CAA+B,EACzE,OAAO,EACP,eAAe,CAChB,CAAC;IACF,IAAI,6BAA6B,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAA,4BAAmB,EAAC,qDAAqD,CAAC,CAAC;QAE3E,OAAO,CAAC,oBAAoB,CAAC;YAC3B,MAAM,EAAE,uCAA2B,CAAC,iBAAiB;YACrD,SAAS;SACV,CAAC,CAAC;QAEH,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC,MAAM,CAAC;IAE3E,IAAA,4BAAmB,EACjB,YAAY,6BAA6B,qCAAqC,CAC/E,CAAC;IAEF,IAAI,6BAA6B,GAAG,CAAC,EAAE,CAAC;QACtC,oEAAoE;QACpE,0CAA0C;QAC1C,6CAA6C;QAC7C,MAAM,aAAa,GAAG,6BAA6B,GAAG,CAAC,CAAC,CAAC,6BAA6B;QACtF,MAAM,IAAA,0CAAkC,EACtC,OAAO,EACP,eAAe,EACf,aAAa,EACb,SAAS,EACT,uCAA2B,CAAC,2BAA2B,CACxD,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,kBAAkB,GAAG,IAAA,sCAA8B,EACvD,OAAO,EACP,IAAA,yCAA2B,EAAC,eAAe,CAAC,CAC7C,CAAC;IACF,KAAK,MAAM,aAAa,IAAI,6BAA6B,EAAE,CAAC;QAC1D,UAAU;QACV,iBAAiB;QACjB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACb,IAAA,4BAAmB,EACjB,qEAAqE,IAAI,CAAC,SAAS,CACjF,aAAa,CACd,EAAE,CACJ,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,MAAM,cAAc,GAAG,IAAA,uDAAiC,EAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CACxC,CAAC;YACF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAE/D,OAAO,CAAC,oBAAoB,CAAC;oBAC3B,MAAM,EAAE,uCAA2B,CAAC,kBAAkB;oBACtD,SAAS;oBACT,qBAAqB,EAAE,wBAAwB,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE;iBACvE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,oBAAoB,CAAC;QAC3B,MAAM,EAAE,uCAA2B,CAAC,iBAAiB;QACrD,SAAS;KACV,CAAC,CAAC;AACL,CAAC,CAAC;AAlFW,QAAA,2BAA2B,+BAkFtC","sourcesContent":["import { toMultichainAccountWalletId } from '@metamask/account-api';\nimport { getUUIDFromAddressOfNormalAccount } from '@metamask/accounts-controller';\n\nimport { backupAndSyncLogger } from '../../logger';\nimport { BackupAndSyncAnalyticsEvent } from '../analytics';\nimport type { ProfileId } from '../authentication';\nimport type { BackupAndSyncContext } from '../types';\nimport { getAllLegacyUserStorageAccounts } from '../user-storage';\nimport { getLocalGroupsForEntropyWallet } from '../utils';\nimport { createMultichainAccountGroupsBatch } from './group';\n\n/**\n * Performs a stripped down version of legacy account syncing, replacing the current\n * UserStorageController:syncInternalAccountsWithUserStorage call.\n * This ensures legacy (V1) account syncing data is correctly migrated to\n * the new AccountTreeController data structure. It should only happen\n * once per wallet.\n *\n * @param context - The sync context containing controller and messenger.\n * @param entropySourceId - The entropy source ID.\n * @param profileId - The profile ID for analytics.\n */\nexport const performLegacyAccountSyncing = async (\n  context: BackupAndSyncContext,\n  entropySourceId: string,\n  profileId: ProfileId,\n): Promise<void> => {\n  // 1. Get legacy account syncing data\n  const legacyAccountsFromUserStorage = await getAllLegacyUserStorageAccounts(\n    context,\n    entropySourceId,\n  );\n  if (legacyAccountsFromUserStorage.length === 0) {\n    backupAndSyncLogger('No legacy accounts, skipping legacy account syncing');\n\n    context.emitAnalyticsEventFn({\n      action: BackupAndSyncAnalyticsEvent.LegacySyncingDone,\n      profileId,\n    });\n\n    return;\n  }\n\n  // 2. Create account groups accordingly\n  const numberOfAccountGroupsToCreate = legacyAccountsFromUserStorage.length;\n\n  backupAndSyncLogger(\n    `Creating ${numberOfAccountGroupsToCreate} account groups for legacy accounts`,\n  );\n\n  if (numberOfAccountGroupsToCreate > 0) {\n    // Creating multichain account group is idempotent, so we can safely\n    // re-create every groups starting from 0.\n    // Use batch creation for better performance.\n    const maxGroupIndex = numberOfAccountGroupsToCreate - 1; // Group index is zero-based.\n    await createMultichainAccountGroupsBatch(\n      context,\n      entropySourceId,\n      maxGroupIndex,\n      profileId,\n      BackupAndSyncAnalyticsEvent.LegacyGroupAddedFromAccount,\n    );\n  }\n\n  // 3. Rename account groups if needed\n  const localAccountGroups = getLocalGroupsForEntropyWallet(\n    context,\n    toMultichainAccountWalletId(entropySourceId),\n  );\n  for (const legacyAccount of legacyAccountsFromUserStorage) {\n    // n: name\n    // a: EVM address\n    const { n, a } = legacyAccount;\n    if (!a || !n) {\n      backupAndSyncLogger(\n        `Legacy account data is missing name or address, skipping account: ${JSON.stringify(\n          legacyAccount,\n        )}`,\n      );\n      continue;\n    }\n\n    if (n) {\n      // Find the local group that corresponds to this EVM address\n      const localAccountId = getUUIDFromAddressOfNormalAccount(a);\n      const localGroup = localAccountGroups.find((group) =>\n        group.accounts.includes(localAccountId),\n      );\n      if (localGroup) {\n        context.controller.setAccountGroupName(localGroup.id, n, true);\n\n        context.emitAnalyticsEventFn({\n          action: BackupAndSyncAnalyticsEvent.LegacyGroupRenamed,\n          profileId,\n          additionalDescription: `Renamed legacy group ${localGroup.id} to ${n}`,\n        });\n      }\n    }\n  }\n\n  context.emitAnalyticsEventFn({\n    action: BackupAndSyncAnalyticsEvent.LegacySyncingDone,\n    profileId,\n  });\n};\n"]}