{"version":3,"file":"PreferencesController.cjs","sourceRoot":"","sources":["../src/PreferencesController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n  ControllerStateChangeEvent,\n  ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nimport { ETHERSCAN_SUPPORTED_CHAIN_IDS } from './constants';\nimport type { PreferencesControllerMethodActions } from './PreferencesController-method-action-types';\n\n/**\n * A type union of the name for each chain that is supported by Etherscan or\n * an Etherscan-compatible service.\n */\nexport type EtherscanSupportedChains =\n  keyof typeof ETHERSCAN_SUPPORTED_CHAIN_IDS;\n\n/**\n * A type union of the chain ID for each chain that is supported by Etherscan\n * or an Etherscan-compatible service.\n */\nexport type EtherscanSupportedHexChainId =\n  (typeof ETHERSCAN_SUPPORTED_CHAIN_IDS)[EtherscanSupportedChains];\n\ntype TokenSortConfig = {\n  key: string;\n  order: 'asc' | 'dsc';\n  sortCallback: string;\n};\n\n/**\n * Preferences controller state\n */\nexport type PreferencesState = {\n  /**\n   * Map of specific features to enable or disable\n   */\n  featureFlags: { [feature: string]: boolean };\n  /**\n   * The configured IPFS gateway\n   */\n  ipfsGateway: string;\n  /**\n   * Controls whether IPFS is enabled or not\n   */\n  isIpfsGatewayEnabled: boolean;\n  /**\n   * Controls whether multi-account balances are enabled or not\n   */\n  isMultiAccountBalancesEnabled: boolean;\n  /**\n   * Controls whether the OpenSea API is used\n   */\n  displayNftMedia: boolean;\n  /**\n   * Controls whether \"security alerts\" are enabled\n   */\n  securityAlertsEnabled: boolean;\n  /**\n   * Controls whether incoming transactions are enabled, per-chain (for Etherscan-supported chains)\n   */\n  showIncomingTransactions: {\n    [chainId in EtherscanSupportedHexChainId]: boolean;\n  };\n  /**\n   * Controls whether test networks are shown in the wallet\n   */\n  showTestNetworks: boolean;\n  /**\n   * Controls whether NFT detection is enabled\n   */\n  useNftDetection: boolean;\n  /**\n   * Controls whether token detection is enabled\n   */\n  useTokenDetection: boolean;\n  /**\n   * Controls whether smart transactions are opted into\n   */\n  smartTransactionsOptInStatus: boolean;\n  /**\n   * Controls whether transaction simulations are enabled\n   */\n  useTransactionSimulations: boolean;\n  /**\n   * Controls whether Multi rpc modal is displayed or not\n   */\n  showMultiRpcModal: boolean;\n  /**\n   * Controls whether to use the safe chains list validation\n   */\n  useSafeChainsListValidation: boolean;\n  /**\n   * Controls which order tokens are sorted in\n   */\n  tokenSortConfig: TokenSortConfig;\n  /**\n   * Controls whether balance and assets are hidden or not\n   */\n  privacyMode: boolean;\n  /**\n   * Allow user to stop being prompted for smart account upgrade\n   */\n  dismissSmartAccountSuggestionEnabled: boolean;\n  /**\n   * User to opt in for smart account upgrade for all user accounts.\n   */\n  smartAccountOptIn: boolean;\n  /**\n   * Controls token filtering controls\n   */\n  tokenNetworkFilter: Record<string, boolean>;\n};\n\nconst metadata = {\n  featureFlags: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  ipfsGateway: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  isIpfsGatewayEnabled: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  isMultiAccountBalancesEnabled: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  displayNftMedia: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  securityAlertsEnabled: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  showTestNetworks: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  showIncomingTransactions: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  useNftDetection: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  useTokenDetection: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  smartTransactionsOptInStatus: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n  useTransactionSimulations: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  showMultiRpcModal: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  useSafeChainsListValidation: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  tokenSortConfig: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  privacyMode: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  dismissSmartAccountSuggestionEnabled: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  smartAccountOptIn: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: true,\n    usedInUi: true,\n  },\n  tokenNetworkFilter: {\n    includeInStateLogs: true,\n    persist: true,\n    includeInDebugSnapshot: false,\n    usedInUi: true,\n  },\n};\n\nconst name = 'PreferencesController';\n\nconst MESSENGER_EXPOSED_METHODS = [\n  'setFeatureFlag',\n  'setIpfsGateway',\n  'setUseTokenDetection',\n  'setUseNftDetection',\n  'setDisplayNftMedia',\n  'setSecurityAlertsEnabled',\n  'setIsMultiAccountBalancesEnabled',\n  'setShowTestNetworks',\n  'setIsIpfsGatewayEnabled',\n  'setEnableNetworkIncomingTransactions',\n  'setShowMultiRpcModal',\n  'setSmartTransactionsOptInStatus',\n  'setUseTransactionSimulations',\n  'setTokenSortConfig',\n  'setUseSafeChainsListValidation',\n  'setPrivacyMode',\n  'setDismissSmartAccountSuggestionEnabled',\n  'setSmartAccountOptIn',\n  'setTokenNetworkFilter',\n] as const;\n\nexport type PreferencesControllerGetStateAction = ControllerGetStateAction<\n  typeof name,\n  PreferencesState\n>;\n\nexport type PreferencesControllerStateChangeEvent = ControllerStateChangeEvent<\n  typeof name,\n  PreferencesState\n>;\n\nexport type PreferencesControllerActions =\n  | PreferencesControllerGetStateAction\n  | PreferencesControllerMethodActions;\n\nexport type PreferencesControllerEvents = PreferencesControllerStateChangeEvent;\n\nexport type PreferencesControllerMessenger = Messenger<\n  typeof name,\n  PreferencesControllerActions,\n  PreferencesControllerEvents\n>;\n\n/**\n * Get the default PreferencesController state.\n *\n * @returns The default PreferencesController state.\n */\nexport function getDefaultPreferencesState(): PreferencesState {\n  return {\n    featureFlags: {},\n    ipfsGateway: 'https://ipfs.io/ipfs/',\n    isIpfsGatewayEnabled: true,\n    isMultiAccountBalancesEnabled: true,\n    displayNftMedia: false,\n    securityAlertsEnabled: false,\n    showIncomingTransactions: {\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.MAINNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.GOERLI]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.BSC]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.BSC_TESTNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.OPTIMISM]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.OPTIMISM_SEPOLIA]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.POLYGON]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.POLYGON_TESTNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.AVALANCHE]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.AVALANCHE_TESTNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.FANTOM]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.FANTOM_TESTNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.SEPOLIA]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.LINEA_GOERLI]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.LINEA_SEPOLIA]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.LINEA_MAINNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.MOONBEAM]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.MOONBEAM_TESTNET]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.MOONRIVER]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.GNOSIS]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.SEI]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.MONAD]: true,\n      [ETHERSCAN_SUPPORTED_CHAIN_IDS.HYPEREVM]: true,\n    },\n    showTestNetworks: false,\n    useNftDetection: false,\n    useTokenDetection: true,\n    showMultiRpcModal: false,\n    smartTransactionsOptInStatus: true,\n    useTransactionSimulations: true,\n    useSafeChainsListValidation: true,\n    tokenSortConfig: {\n      key: 'tokenFiatAmount',\n      order: 'dsc',\n      sortCallback: 'stringNumeric',\n    },\n    privacyMode: false,\n    dismissSmartAccountSuggestionEnabled: false,\n    smartAccountOptIn: true,\n    tokenNetworkFilter: {},\n  };\n}\n\n/**\n * Controller that stores shared settings and exposes convenience methods\n */\nexport class PreferencesController extends BaseController<\n  typeof name,\n  PreferencesState,\n  PreferencesControllerMessenger\n> {\n  /**\n   * Creates a PreferencesController instance.\n   *\n   * @param args - Arguments\n   * @param args.messenger - The preferences controller messenger.\n   * @param args.state - Preferences controller state.\n   */\n  constructor({\n    messenger,\n    state,\n  }: {\n    messenger: PreferencesControllerMessenger;\n    state?: Partial<PreferencesState>;\n  }) {\n    super({\n      name,\n      metadata,\n      messenger,\n      state: {\n        ...getDefaultPreferencesState(),\n        ...state,\n      },\n    });\n\n    this.messenger.registerMethodActionHandlers(\n      this,\n      MESSENGER_EXPOSED_METHODS,\n    );\n  }\n\n  /**\n   * Enable or disable a specific feature flag.\n   *\n   * @param feature - Feature to toggle.\n   * @param activated - Value to assign.\n   */\n  setFeatureFlag(feature: string, activated: boolean): void {\n    this.update((state) => {\n      state.featureFlags[feature] = activated;\n    });\n  }\n\n  /**\n   * Sets new IPFS gateway.\n   *\n   * @param ipfsGateway - IPFS gateway string.\n   */\n  setIpfsGateway(ipfsGateway: string): void {\n    this.update((state) => {\n      state.ipfsGateway = ipfsGateway;\n    });\n  }\n\n  /**\n   * Toggle the token detection setting.\n   *\n   * @param useTokenDetection - Boolean indicating user preference on token detection.\n   */\n  setUseTokenDetection(useTokenDetection: boolean): void {\n    this.update((state) => {\n      state.useTokenDetection = useTokenDetection;\n    });\n  }\n\n  /**\n   * Toggle the NFT detection setting.\n   *\n   * @param useNftDetection - Boolean indicating user preference on NFT detection.\n   */\n  setUseNftDetection(useNftDetection: boolean): void {\n    if (useNftDetection && !this.state.displayNftMedia) {\n      throw new Error(\n        'useNftDetection cannot be enabled if displayNftMedia is false',\n      );\n    }\n    this.update((state) => {\n      state.useNftDetection = useNftDetection;\n    });\n  }\n\n  /**\n   * Toggle the display nft media enabled setting.\n   *\n   * @param displayNftMedia - Boolean indicating user preference on using OpenSea's API.\n   */\n  setDisplayNftMedia(displayNftMedia: boolean): void {\n    this.update((state) => {\n      state.displayNftMedia = displayNftMedia;\n      if (!displayNftMedia) {\n        state.useNftDetection = false;\n      }\n    });\n  }\n\n  /**\n   * Toggle the security alert enabled setting.\n   *\n   * @param securityAlertsEnabled - Boolean indicating user preference on using security alerts.\n   */\n  setSecurityAlertsEnabled(securityAlertsEnabled: boolean): void {\n    this.update((state) => {\n      state.securityAlertsEnabled = securityAlertsEnabled;\n    });\n  }\n\n  /**\n   * A setter for the user preferences to enable/disable fetch of multiple accounts balance.\n   *\n   * @param isMultiAccountBalancesEnabled - true to enable multiple accounts balance fetch, false to fetch only selectedAddress.\n   */\n  setIsMultiAccountBalancesEnabled(\n    isMultiAccountBalancesEnabled: boolean,\n  ): void {\n    this.update((state) => {\n      state.isMultiAccountBalancesEnabled = isMultiAccountBalancesEnabled;\n    });\n  }\n\n  /**\n   * A setter for the user have the test networks visible/hidden.\n   *\n   * @param showTestNetworks - true to show test networks, false to hidden.\n   */\n  setShowTestNetworks(showTestNetworks: boolean): void {\n    this.update((state) => {\n      state.showTestNetworks = showTestNetworks;\n    });\n  }\n\n  /**\n   * A setter for the user allow to be fetched IPFS content\n   *\n   * @param isIpfsGatewayEnabled - true to enable ipfs source\n   */\n  setIsIpfsGatewayEnabled(isIpfsGatewayEnabled: boolean): void {\n    this.update((state) => {\n      state.isIpfsGatewayEnabled = isIpfsGatewayEnabled;\n    });\n  }\n\n  /**\n   * A setter for the user allow to be fetched IPFS content\n   *\n   * @param chainId - On hexadecimal format to enable the incoming transaction network\n   * @param isIncomingTransactionNetworkEnable - true to enable incoming transactions\n   */\n  setEnableNetworkIncomingTransactions(\n    chainId: EtherscanSupportedHexChainId,\n    isIncomingTransactionNetworkEnable: boolean,\n  ): void {\n    if (Object.values(ETHERSCAN_SUPPORTED_CHAIN_IDS).includes(chainId)) {\n      this.update((state) => {\n        state.showIncomingTransactions = {\n          ...this.state.showIncomingTransactions,\n          [chainId]: isIncomingTransactionNetworkEnable,\n        };\n      });\n    }\n  }\n\n  /**\n   * Toggle multi rpc migration modal.\n   *\n   * @param showMultiRpcModal - Boolean indicating if the multi rpc modal will be displayed or not.\n   */\n  setShowMultiRpcModal(showMultiRpcModal: boolean): void {\n    this.update((state) => {\n      state.showMultiRpcModal = showMultiRpcModal;\n      if (!showMultiRpcModal) {\n        state.showMultiRpcModal = false;\n      }\n    });\n  }\n\n  /**\n   * A setter for the user to opt into smart transactions\n   *\n   * @param smartTransactionsOptInStatus - true to opt into smart transactions\n   */\n  setSmartTransactionsOptInStatus(smartTransactionsOptInStatus: boolean): void {\n    this.update((state) => {\n      state.smartTransactionsOptInStatus = smartTransactionsOptInStatus;\n    });\n  }\n\n  /**\n   * A setter for the user preferences to enable/disable transaction simulations.\n   *\n   * @param useTransactionSimulations - true to enable transaction simulations, false to disable it.\n   */\n  setUseTransactionSimulations(useTransactionSimulations: boolean): void {\n    this.update((state) => {\n      state.useTransactionSimulations = useTransactionSimulations;\n    });\n  }\n\n  /**\n   * A setter to update the user's preferred token sorting order.\n   *\n   * @param tokenSortConfig - a configuration representing the sort order of tokens.\n   */\n  setTokenSortConfig(tokenSortConfig: TokenSortConfig): void {\n    this.update((state) => {\n      state.tokenSortConfig = tokenSortConfig;\n    });\n  }\n\n  /**\n   * A setter for the user preferences to enable/disable safe chains list validation.\n   *\n   * @param useSafeChainsListValidation - true to enable safe chains list validation, false to disable it.\n   */\n  setUseSafeChainsListValidation(useSafeChainsListValidation: boolean): void {\n    this.update((state) => {\n      state.useSafeChainsListValidation = useSafeChainsListValidation;\n    });\n  }\n\n  /**\n   * A setter for the user preferences to enable/disable privacy mode.\n   *\n   * @param privacyMode - true to enable privacy mode, false to disable it.\n   */\n  setPrivacyMode(privacyMode: boolean): void {\n    this.update((state) => {\n      state.privacyMode = privacyMode;\n    });\n  }\n\n  /**\n   * A setter for the user preferences dismiss smart account upgrade prompt.\n   *\n   * @param dismissSmartAccountSuggestionEnabled - true to dismiss smart account upgrade prompt, false to enable it.\n   */\n  setDismissSmartAccountSuggestionEnabled(\n    dismissSmartAccountSuggestionEnabled: boolean,\n  ): void {\n    this.update((state) => {\n      state.dismissSmartAccountSuggestionEnabled =\n        dismissSmartAccountSuggestionEnabled;\n    });\n  }\n\n  /**\n   * A setter for the user preferences smart account OptIn.\n   *\n   * @param smartAccountOptIn - true if user opts in for smart account update, false otherwise.\n   */\n  setSmartAccountOptIn(smartAccountOptIn: boolean): void {\n    this.update((state) => {\n      state.smartAccountOptIn = smartAccountOptIn;\n    });\n  }\n\n  /**\n   * Set the token network filter configuration setting.\n   *\n   * @param tokenNetworkFilter - Object describing token network filter configuration.\n   */\n  setTokenNetworkFilter(tokenNetworkFilter: Record<string, boolean>): void {\n    this.update((state) => {\n      state.tokenNetworkFilter = tokenNetworkFilter;\n    });\n  }\n}\n\nexport default PreferencesController;\n"]}