{"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":";;;AAEA,oDAG6B;AAE7B,2DAAwD;AACxD,iDAA4D;AAErD,MAAM,kBAAkB,GAAG,CAChC,kBAA8C,EAC9C,EAAE;IACF,MAAM,YAAY,GAAG,CAAC,MAA0C,EAAE,EAAE,CAClE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,GAAG,GAAG;QACN,CAAC,IAAA,qCAAmB,EAAC,OAAO,CAAC,CAAC,EAAE,KAAK;KACtC,CAAC,EACF,EAAE,CACH,CAAC;IAEJ,OAAO;QACL,GAAG,kBAAkB;QACrB,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,kBAAkB,sBAgB7B;AAEK,MAAM,mBAAmB,GAAG,CACjC,kBAA2B,EACC,EAAE;IAC9B,IAAI,IAAA,yCAA4B,EAAC,kBAAkB,CAAC,EAAE,CAAC;QACrD,MAAM,cAAc,GAAG,IAAA,0BAAkB,EAAC,kBAAkB,CAAC,CAAC;QAC9D,sEAAsE;QACtE,IACE,CAAC,cAAc,CAAC,YAAY;YAC5B,cAAc,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EACxC,CAAC;YACD,OAAO;gBACL,GAAG,cAAc;gBACjB,YAAY,EAAE,CAAC,GAAG,8BAAqB,CAAC;aACzC,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,oCAA2B,CAAC;AACrC,CAAC,CAAC;AAlBW,QAAA,mBAAmB,uBAkB9B;AAEF;;;;;GAKG;AACH,SAAgB,qBAAqB,CAMnC,SAAY;IACZ,kGAAkG;IAClG,MAAM,gCAAgC,GAAG,SAAS,CAAC,IAAI,CACrD,sCAAsC,CACvC,CAAC;IAEF,wDAAwD;IACxD,2GAA2G;IAC3G,0FAA0F;IAC1F,2HAA2H;IAC3H,uHAAuH;IACvH,MAAM,cAAc,GAClB,gCAAgC,EAAE,kBAAkB,EAAE,cAAc,CAAC;IAEvE,uGAAuG;IACvG,MAAM,eAAe,GACnB,gCAAgC,EAAE,kBAAkB,EAAE,YAAY,CAAC;IAErE,OAAO,IAAA,2BAAmB,EAAC,cAAc,IAAI,eAAe,CAAC,CAAC;AAChE,CAAC;AAzBD,sDAyBC;AAED;;;;;;GAMG;AACI,MAAM,yBAAyB,GAAG,CACvC,aAAqB,EACrB,kBAA0B,EAC1B,EAAE;IACF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,aAAa;SAC1D,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAC1D,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,KAAK,gBAAgB,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,WAAW,KAAK,gBAAgB;QAChC,WAAW,KAAK,gBAAgB;QAChC,WAAW,IAAI,gBAAgB,CAChC,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,yBAAyB,6BAqBpC","sourcesContent":["import type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';\n\nimport {\n  DEFAULT_CHAIN_RANKING,\n  DEFAULT_FEATURE_FLAG_CONFIG,\n} from '../constants/bridge';\nimport type { FeatureFlagsPlatformConfig, ChainConfiguration } from '../types';\nimport { formatChainIdToCaip } from './caip-formatters';\nimport { validateFeatureFlagsResponse } from './validators';\n\nexport const formatFeatureFlags = (\n  bridgeFeatureFlags: FeatureFlagsPlatformConfig,\n) => {\n  const getChainsObj = (chains: Record<string, ChainConfiguration>) =>\n    Object.entries(chains).reduce(\n      (acc, [chainId, value]) => ({\n        ...acc,\n        [formatChainIdToCaip(chainId)]: value,\n      }),\n      {},\n    );\n\n  return {\n    ...bridgeFeatureFlags,\n    chains: getChainsObj(bridgeFeatureFlags.chains),\n  };\n};\n\nexport const processFeatureFlags = (\n  bridgeFeatureFlags: unknown,\n): FeatureFlagsPlatformConfig => {\n  if (validateFeatureFlagsResponse(bridgeFeatureFlags)) {\n    const formattedFlags = formatFeatureFlags(bridgeFeatureFlags);\n    // If chainRanking is undefined or empty, use the default chainRanking\n    if (\n      !formattedFlags.chainRanking ||\n      formattedFlags.chainRanking.length === 0\n    ) {\n      return {\n        ...formattedFlags,\n        chainRanking: [...DEFAULT_CHAIN_RANKING],\n      };\n    }\n    return formattedFlags;\n  }\n  return DEFAULT_FEATURE_FLAG_CONFIG;\n};\n\n/**\n * Gets the bridge feature flags from the remote feature flag controller\n *\n * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState\n * @returns The bridge feature flags\n */\nexport function getBridgeFeatureFlags<\n  T extends {\n    call(\n      action: 'RemoteFeatureFlagController:getState',\n    ): RemoteFeatureFlagControllerState;\n  },\n>(messenger: T): FeatureFlagsPlatformConfig {\n  // This will return the bridgeConfig for the current platform even without specifying the platform\n  const remoteFeatureFlagControllerState = messenger.call(\n    'RemoteFeatureFlagController:getState',\n  );\n\n  // bridgeConfigV2 is the feature flag for the mobile app\n  // bridgeConfig for Mobile has been deprecated since release of bridge and Solana in 7.46.0 was pushed back\n  // and there's no way to turn on bridgeConfig for 7.47.0 without affecting 7.46.0 as well.\n  // You will still get bridgeConfig returned from remoteFeatureFlagControllerState but you should use bridgeConfigV2 instead\n  // Mobile's bridgeConfig will be permanently serving the disabled variation, so falling back to it in Mobile will be ok\n  const rawMobileFlags =\n    remoteFeatureFlagControllerState?.remoteFeatureFlags?.bridgeConfigV2;\n\n  // Extension LaunchDarkly will not have the bridgeConfigV2 field, so we'll continue to use bridgeConfig\n  const rawBridgeConfig =\n    remoteFeatureFlagControllerState?.remoteFeatureFlags?.bridgeConfig;\n\n  return processFeatureFlags(rawMobileFlags || rawBridgeConfig);\n}\n\n/**\n * Checks if the client version is greater than or equal to the minimum required version\n *\n * @param clientVersion - The client version\n * @param minRequiredVersion - The minimum required version\n * @returns True if the client version is greater than or equal to the minimum required version, false otherwise\n */\nexport const hasMinimumRequiredVersion = (\n  clientVersion: string,\n  minRequiredVersion: string,\n) => {\n  const [clientMajor, clientMinor, clientPatch] = clientVersion\n    .split('.')\n    .map(Number);\n  const [minRequiredMajor, minRequiredMinor, minRequiredPatch] =\n    minRequiredVersion.split('.').map(Number);\n\n  if (clientMajor > minRequiredMajor) {\n    return true;\n  }\n  if (clientMajor === minRequiredMajor && clientMinor > minRequiredMinor) {\n    return true;\n  }\n  return (\n    clientMajor === minRequiredMajor &&\n    clientMinor === minRequiredMinor &&\n    clientPatch >= minRequiredPatch\n  );\n};\n"]}